diff --git a/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx b/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx
index c53e92ecfaf..65f8d6e3a4c 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/CloudMonitoringCheatSheet.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { QueryEditorHelpProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/ConfigEditor/ConfigEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/ConfigEditor/ConfigEditor.tsx
index 19baaac47dd..02943e876ef 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/ConfigEditor/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/ConfigEditor/ConfigEditor.tsx
@@ -1,4 +1,4 @@
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { DataSourcePluginOptionsEditorProps } from '@grafana/data';
import { ConfigSection, DataSourceDescription } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/Fields.tsx b/public/app/plugins/datasource/cloud-monitoring/components/Fields.tsx
index f6cc8bb34ab..8036ae966f6 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/Fields.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/Fields.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { Field, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.test.tsx
index 0c5307889cc..7080338a93b 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { select } from 'react-select-event';
import { GraphPeriod, Props } from './GraphPeriod';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.tsx b/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.tsx
index 754fb5cb99a..13dd8e3d201 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/GraphPeriod.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { EditorField, EditorRow } from '@grafana/experimental';
import { HorizontalGroup, Switch } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.test.tsx
index 7d3bfe885aa..7342a9b0388 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { openMenu, select } from 'react-select-event';
import { createMockTimeSeriesList } from '../__mocks__/cloudMonitoringQuery';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.tsx b/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.tsx
index 70dc93a0a43..d9fd0e4c70c 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/GroupBy.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField, EditorFieldGroup } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.test.tsx
index 786f8fc6c5e..1171790342b 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { openMenu, select } from 'react-select-event';
import { LabelFilter } from './LabelFilter';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.tsx b/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.tsx
index 414f29cb62b..102bc22ef2f 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import { AccessoryButton, EditorField, EditorList, EditorRow } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/LookbackPeriodSelect.tsx b/public/app/plugins/datasource/cloud-monitoring/components/LookbackPeriodSelect.tsx
index fcdfaaf2f07..0e7d991327a 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/LookbackPeriodSelect.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/LookbackPeriodSelect.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
import { Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/MQLQueryEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/MQLQueryEditor.tsx
index 6c2c635bb1e..d150565c7d5 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/MQLQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/MQLQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { TextArea } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.test.tsx
index b3975ad9438..187481ca913 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { openMenu } from 'react-select-event';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.tsx
index 846ee57fb08..8a245c46503 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.tsx
@@ -1,4 +1,5 @@
-import React, { useCallback, useEffect } from 'react';
+import { useCallback, useEffect } from 'react';
+import * as React from 'react';
import { SelectableValue, TimeRange } from '@grafana/data';
import { EditorRows, Stack } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/PeriodSelect.tsx b/public/app/plugins/datasource/cloud-monitoring/components/PeriodSelect.tsx
index 73a2fedb4f2..20860afe3d0 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/PeriodSelect.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/PeriodSelect.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { SelectableValue } from '@grafana/data';
import { Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.test.tsx
index 037a375b323..aa6b89d4228 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { CustomVariableModel } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.tsx
index a572bff024a..c7f6c66d355 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/Project.tsx b/public/app/plugins/datasource/cloud-monitoring/components/Project.tsx
index a36b41f2cd2..de42fbdd788 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/Project.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/Project.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/PromQLEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/PromQLEditor.tsx
index 79e81617e25..8e54fbe372c 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/PromQLEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/PromQLEditor.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField, EditorRow } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.test.tsx
index 91380a13173..cd3bb5d9668 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, waitFor, screen } from '@testing-library/react';
-import React from 'react';
import { select } from 'react-select-event';
import { createMockDatasource } from '../__mocks__/cloudMonitoringDatasource';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.tsx
index a6104921f34..9464e273ea2 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.tsx
@@ -1,6 +1,6 @@
import deepEqual from 'fast-deep-equal';
import { isEqual } from 'lodash';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { QueryEditorProps, getDefaultTimeRange, toOption } from '@grafana/data';
import { EditorRows } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.test.tsx
index e7853a0cca3..3dfbe2c2bab 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { openMenu, select } from 'react-select-event';
import { createMockQuery } from '../__mocks__/cloudMonitoringQuery';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.tsx b/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.tsx
index ca4f36d6844..150bb3c1f1f 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/QueryHeader.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { EditorHeader, FlexItem, InlineSelect } from '@grafana/experimental';
import { QUERY_TYPES } from '../constants';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/SLO.tsx b/public/app/plugins/datasource/cloud-monitoring/components/SLO.tsx
index ccb4696bee2..2e0117cfe70 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/SLO.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/SLO.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/SLOQueryEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/SLOQueryEditor.tsx
index af753ae72df..0d62b1cff1e 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/SLOQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/SLOQueryEditor.tsx
@@ -1,4 +1,5 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
+import * as React from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField, EditorFieldGroup, EditorRow } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/Selector.tsx b/public/app/plugins/datasource/cloud-monitoring/components/Selector.tsx
index 9790fb6480e..5c59741acd4 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/Selector.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/Selector.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
import { Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/Service.tsx b/public/app/plugins/datasource/cloud-monitoring/components/Service.tsx
index ad86d792776..35093b92a7b 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/Service.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/Service.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.test.tsx
index 814c30f689e..2290e4e9417 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.test.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-// @ts-ignore
import renderer from 'react-test-renderer';
import { VariableModel } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.tsx
index d8614ae7b26..0b7169ae2fd 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/VariableQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { QueryEditorProps } from '@grafana/data';
import { getTemplateSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx b/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx
index be768bad8e2..9a5ebfb76f1 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { act, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { openMenu, select } from 'react-select-event';
import { CustomVariableModel, getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.tsx b/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.tsx
index a5d57040047..0c420bbc547 100644
--- a/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.tsx
@@ -1,7 +1,8 @@
import { css } from '@emotion/css';
import debounce from 'debounce-promise';
import { startCase, uniqBy } from 'lodash';
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
+import * as React from 'react';
import { GrafanaTheme2, SelectableValue, TimeRange } from '@grafana/data';
import { EditorField, EditorFieldGroup, EditorRow } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloud-monitoring/tsconfig.json b/public/app/plugins/datasource/cloud-monitoring/tsconfig.json
index 7daf2ee8aba..baaaea04185 100644
--- a/public/app/plugins/datasource/cloud-monitoring/tsconfig.json
+++ b/public/app/plugins/datasource/cloud-monitoring/tsconfig.json
@@ -1,4 +1,7 @@
{
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ },
"extends": "@grafana/plugin-configs/tsconfig.json",
"include": ["."]
}
diff --git a/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.test.tsx
index e5b62bac9b0..e9bd97a82f9 100644
--- a/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import '@testing-library/jest-dom';
import { QueryEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.tsx
index cd8c3517e52..b3ef2901dae 100644
--- a/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor/AnnotationQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { ChangeEvent } from 'react';
+import { ChangeEvent } from 'react';
import { QueryEditorProps } from '@grafana/data';
import { EditorField, EditorHeader, EditorRow, EditorSwitch, InlineSelect } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/CheatSheet/LogsCheatSheet.tsx b/public/app/plugins/datasource/cloudwatch/components/CheatSheet/LogsCheatSheet.tsx
index f3f3155059a..91929e6bc6f 100644
--- a/public/app/plugins/datasource/cloudwatch/components/CheatSheet/LogsCheatSheet.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/CheatSheet/LogsCheatSheet.tsx
@@ -1,7 +1,7 @@
import { css, cx } from '@emotion/css';
import { stripIndent, stripIndents } from 'common-tags';
import Prism from 'prismjs';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Collapse, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.test.tsx
index a83e5d70d5d..6f31669098f 100644
--- a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { AwsAuthType } from '@grafana/aws-sdk';
import { PluginContextProvider, PluginMeta, PluginMetaInfo, PluginType } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.tsx
index f6b551955da..2722ce628fa 100644
--- a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/ConfigEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { useDebounce } from 'react-use';
import { ConnectionConfig } from '@grafana/aws-sdk';
diff --git a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/SecureSocksProxySettingsNewStyling.tsx b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/SecureSocksProxySettingsNewStyling.tsx
index 0b034afc2bb..a70e01acd23 100644
--- a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/SecureSocksProxySettingsNewStyling.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/SecureSocksProxySettingsNewStyling.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { DataSourceJsonData, DataSourcePluginOptionsEditorProps } from '@grafana/data';
import { ConfigSection } from '@grafana/experimental';
import { Field, Switch } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/XrayLinkConfig.tsx b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/XrayLinkConfig.tsx
index f963a0547e3..c3c8bd677ea 100644
--- a/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/XrayLinkConfig.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/ConfigEditor/XrayLinkConfig.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2, DataSourceInstanceSettings } from '@grafana/data';
import { ConfigSection } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/Errors/ThrottlingErrorMessage.tsx b/public/app/plugins/datasource/cloudwatch/components/Errors/ThrottlingErrorMessage.tsx
index 1e03ad21c90..7446472de2d 100644
--- a/public/app/plugins/datasource/cloudwatch/components/Errors/ThrottlingErrorMessage.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/Errors/ThrottlingErrorMessage.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
export interface Props {
region: string;
}
diff --git a/public/app/plugins/datasource/cloudwatch/components/MetaInspector/MetaInspector.tsx b/public/app/plugins/datasource/cloudwatch/components/MetaInspector/MetaInspector.tsx
index 12ca89d98a2..7f837452ccf 100644
--- a/public/app/plugins/datasource/cloudwatch/components/MetaInspector/MetaInspector.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/MetaInspector/MetaInspector.tsx
@@ -1,5 +1,5 @@
import { groupBy } from 'lodash';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { MetadataInspectorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.test.tsx
index d19f98a6e68..b070fb69a0e 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.test.tsx
@@ -1,5 +1,4 @@
import { act, render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import { LoadingState } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.tsx
index f7087e70654..5d07b54aed5 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/CloudWatchLink.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { usePrevious } from 'react-use';
import { PanelData } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx
index fd57a6f4587..2ed46ebd85e 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { memo } from 'react';
+import { memo } from 'react';
import { QueryEditorProps } from '@grafana/data';
import { InlineFormLabel } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryField.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryField.tsx
index 9a9865b49b6..2527565821e 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryField.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/LogsQueryEditor/LogsQueryField.tsx
@@ -1,5 +1,5 @@
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
-import React, { ReactNode, useCallback, useRef } from 'react';
+import { ReactNode, useCallback, useRef } from 'react';
import { QueryEditorProps } from '@grafana/data';
import { CodeEditor, Monaco, Themeable2, withTheme2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/DynamicLabelsField.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/DynamicLabelsField.tsx
index 7c5f9198825..b7f62593057 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/DynamicLabelsField.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/DynamicLabelsField.tsx
@@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css';
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
-import React, { useCallback, useRef } from 'react';
+import { useCallback, useRef } from 'react';
import { CodeEditor, getInputStyles, Monaco, useTheme2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MathExpressionQueryField.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MathExpressionQueryField.tsx
index 5ac7ca8e226..6005caba145 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MathExpressionQueryField.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MathExpressionQueryField.tsx
@@ -1,5 +1,6 @@
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
-import React, { useCallback, useRef } from 'react';
+import { useCallback, useRef } from 'react';
+import * as React from 'react';
import { CodeEditor, Monaco } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.test.tsx
index 0be9d041cf2..4b9d5cc4cd1 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import selectEvent from 'react-select-event';
import { CustomVariableModel, DataSourceInstanceSettings } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.tsx
index e4a7404989f..6798f650186 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/MetricsQueryEditor.tsx
@@ -1,4 +1,5 @@
-import React, { ChangeEvent, useCallback, useEffect, useState } from 'react';
+import { ChangeEvent, useCallback, useEffect, useState } from 'react';
+import * as React from 'react';
import { QueryEditorProps, SelectableValue } from '@grafana/data';
import { EditorField, EditorRow, InlineSelect } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.test.tsx
index bfd11f2bc85..93292e51212 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import { setupMockedDataSource } from '../../../../__mocks__/CloudWatchDataSource';
import { QueryEditorExpressionType, QueryEditorPropertyType } from '../../../../expressions';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.tsx
index 9191fbe0abf..beefe48b358 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderEditor.tsx
@@ -1,4 +1,5 @@
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
+import * as React from 'react';
import { EditorField, EditorRow, EditorRows } from '@grafana/experimental';
import { Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.test.tsx
index 8c2c7f74366..fc8178311b0 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.test.tsx
@@ -1,5 +1,4 @@
import { act, render, screen } from '@testing-library/react';
-import React from 'react';
import { selectOptionInTest } from 'test/helpers/selectOptionInTest';
import { setupMockedDataSource } from '../../../../__mocks__/CloudWatchDataSource';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx
index d22070a9279..859031eec9a 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo } from 'react';
+import { useEffect, useMemo } from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import { EditorField, EditorFieldGroup, EditorSwitch } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLFilter.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLFilter.tsx
index 6c4cfc48706..5d6794e62fd 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLFilter.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLFilter.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { useAsyncFn } from 'react-use';
import { SelectableValue, toOption } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.test.tsx
index dcd2bd57f82..388fe8722c6 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import selectEvent from 'react-select-event';
import { setupMockedDataSource } from '../../../../__mocks__/CloudWatchDataSource';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.tsx
index 72fa72a2316..359b896ad88 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLGroupBy.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import { AccessoryButton, EditorList, InputGroup } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLOrderByGroup.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLOrderByGroup.tsx
index 62891e19caf..2afeb342179 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLOrderByGroup.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLOrderByGroup.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue, toOption } from '@grafana/data';
import { AccessoryButton, EditorField, EditorFieldGroup, InputGroup } from '@grafana/experimental';
import { Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLCodeEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLCodeEditor.tsx
index 6fb14be0da3..ef09a74f47c 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLCodeEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLCodeEditor.tsx
@@ -1,5 +1,5 @@
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
-import React, { useCallback, useEffect } from 'react';
+import { useCallback, useEffect } from 'react';
import { CodeEditor, Monaco } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.test.tsx
index 0027ecbb75d..7e5f2bbe9e5 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { QueryEditorProps } from '@grafana/data';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.tsx
index 7810e357a5b..90c4ff21a43 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
import { QueryEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.test.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.test.tsx
index 3b5c309d13a..6c35f4d49dd 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.test.tsx
@@ -1,5 +1,4 @@
import { render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import selectEvent from 'react-select-event';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx
index 4e0dff5e540..7e77f93b4a5 100644
--- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/QueryHeader.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { CoreApp, LoadingState, QueryEditorProps, SelectableValue } from '@grafana/data';
import { EditorHeader, InlineSelect, FlexItem } from '@grafana/experimental';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx
index 9f93308e595..b14051880fc 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx
@@ -1,6 +1,5 @@
import { fireEvent, render, screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { setupMockedDataSource } from '../../__mocks__/CloudWatchDataSource';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx
index 94668e1f9cf..00525820fd8 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx
@@ -1,5 +1,5 @@
import { isEqual } from 'lodash';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { EditorList } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx
index f9480b4802c..ed73928d4ee 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { AccessoryButton, InputGroup } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx
index d91dca40a29..9f5c19be7b6 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { act, fireEvent, render, screen, waitFor, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { select } from 'react-select-event';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx
index 7d4eb75a70a..e554875ba23 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { QueryEditorProps, SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx
index 6ab887cefba..eb1399ce9c9 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableTextField.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableTextField.tsx
index d01ebb82a6b..4313f440275 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableTextField.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableTextField.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { EditorField } from '@grafana/experimental';
import { InlineField, Input, PopoverContent } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/Account.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/Account.test.tsx
index e2803524fd1..c2e420e21b1 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/Account.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/Account.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import selectEvent from 'react-select-event';
import { Account } from './Account';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/Account.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/Account.tsx
index 57cde6ac83a..8078e752db1 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/Account.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/Account.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.test.tsx
index 846d7209a58..ee39afba589 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.test.tsx
@@ -1,6 +1,5 @@
import { fireEvent, render, screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { setupMockedDataSource } from '../../../__mocks__/CloudWatchDataSource';
import { CloudWatchMetricsQuery } from '../../../types';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.tsx
index 3909df54d84..b182714c4d8 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/Dimensions.tsx
@@ -1,5 +1,5 @@
import { isEqual } from 'lodash';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { EditorList } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.test.tsx
index 1ab3a166774..9ea8123bd2b 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { setupMockedDataSource } from '../../../__mocks__/CloudWatchDataSource';
import { CloudWatchMetricsQuery } from '../../../types';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.tsx
index 0610240aef8..f264c93cbcd 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/Dimensions/FilterItem.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { useAsyncFn } from 'react-use';
import { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupNamesSelection.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupNamesSelection.tsx
index 020e123b9dd..e4ee31d6c50 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupNamesSelection.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupNamesSelection.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { CloudWatchDatasource } from '../../../datasource';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupSelector.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupSelector.tsx
index 8204ef25ca1..5b66c048f61 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupSelector.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LegacyLogGroupSelector.tsx
@@ -1,5 +1,6 @@
import { debounce, unionBy } from 'lodash';
-import React, { useCallback, useEffect, useMemo, useState } from 'react';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import * as React from 'react';
import { AppEvents, SelectableValue, toOption } from '@grafana/data';
import { getAppEvents } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.test.tsx
index b3cf4e2a489..6bf4154d9ac 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.test.tsx
@@ -1,7 +1,6 @@
import { render, screen, waitFor } from '@testing-library/react';
// eslint-disable-next-line lodash/import-scope
import lodash from 'lodash';
-import React from 'react';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.tsx
index 6d97836822b..d904873cd0b 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsField.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx
index 4f69b4dc33e..80d82444cfa 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.test.tsx
@@ -2,7 +2,6 @@ import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
// eslint-disable-next-line lodash/import-scope
import lodash from 'lodash';
-import React from 'react';
import selectEvent from 'react-select-event';
import { ResourceResponse, LogGroupResponse } from '../../../resources/types';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.tsx
index d1720065ddd..63365a150b1 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/LogGroupsSelector.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.test.tsx
index 43443dfaa90..1a14e5f0092 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.test.tsx
@@ -2,7 +2,6 @@ import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
// eslint-disable-next-line lodash/import-scope
import lodash from 'lodash';
-import React from 'react';
import Search from './Search';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.tsx
index a7af3070bf3..25dc5bd762a 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/Search.tsx
@@ -1,5 +1,5 @@
import { debounce } from 'lodash';
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { Icon, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.test.tsx
index 540a6545c9f..7ad0fea4ec4 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { LogGroup } from '../../../types';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.tsx
index 83a5a3c63ab..e1c20db7f50 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/LogGroups/SelectedLogGroups.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { Button, ConfirmModal, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.test.tsx
index 0dee6c581aa..a88b4f4fd61 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.test.tsx
@@ -1,6 +1,5 @@
import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import selectEvent from 'react-select-event';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.tsx
index 237d83fccd2..9f9ecd45fdf 100644
--- a/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/shared/MetricStatEditor/MetricStatEditor.tsx
@@ -1,4 +1,5 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
+import * as React from 'react';
import { SelectableValue } from '@grafana/data';
import { EditorField, EditorFieldGroup, EditorRow, EditorRows, EditorSwitch } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts
index 44088ce2868..3fc10803226 100644
--- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts
+++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts
@@ -1,5 +1,5 @@
import { isEmpty } from 'lodash';
-import React from 'react';
+import { createElement } from 'react';
import { catchError, map, Observable, of } from 'rxjs';
import {
@@ -34,7 +34,7 @@ const displayAlert = (datasourceName: string, region: string) =>
`CloudWatch request limit reached in ${region} for data source ${datasourceName}`,
'',
undefined,
- React.createElement(ThrottlingErrorMessage, { region }, null),
+ createElement(ThrottlingErrorMessage, { region }, null),
],
});
diff --git a/public/app/plugins/datasource/dashboard/DashboardQueryEditor.test.tsx b/public/app/plugins/datasource/dashboard/DashboardQueryEditor.test.tsx
index ca9d18c71c1..1798a6c1ae4 100644
--- a/public/app/plugins/datasource/dashboard/DashboardQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/dashboard/DashboardQueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { getDefaultTimeRange, LoadingState } from '@grafana/data';
import { setDataSourceSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/dashboard/DashboardQueryEditor.tsx b/public/app/plugins/datasource/dashboard/DashboardQueryEditor.tsx
index fca4811b291..073cb173dd8 100644
--- a/public/app/plugins/datasource/dashboard/DashboardQueryEditor.tsx
+++ b/public/app/plugins/datasource/dashboard/DashboardQueryEditor.tsx
@@ -1,7 +1,7 @@
import { css } from '@emotion/css';
import { useId } from '@react-aria/utils';
import pluralize from 'pluralize';
-import React, { useCallback, useMemo } from 'react';
+import { useCallback, useMemo } from 'react';
import { useAsync } from 'react-use';
import { DataQuery, GrafanaTheme2, SelectableValue, DataTopic, QueryEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/AddRemove.test.tsx b/public/app/plugins/datasource/elasticsearch/components/AddRemove.test.tsx
index d968f58eb72..156cd81c904 100644
--- a/public/app/plugins/datasource/elasticsearch/components/AddRemove.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/AddRemove.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { AddRemove } from './AddRemove';
diff --git a/public/app/plugins/datasource/elasticsearch/components/AddRemove.tsx b/public/app/plugins/datasource/elasticsearch/components/AddRemove.tsx
index 288ef03c1f1..a353e3e4edb 100644
--- a/public/app/plugins/datasource/elasticsearch/components/AddRemove.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/AddRemove.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { Button } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/MetricPicker.tsx b/public/app/plugins/datasource/elasticsearch/components/MetricPicker.tsx
index edd720f764a..b8a175408d7 100644
--- a/public/app/plugins/datasource/elasticsearch/components/MetricPicker.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/MetricPicker.tsx
@@ -1,5 +1,4 @@
import { css, cx } from '@emotion/css';
-import React from 'react';
import { SelectableValue } from '@grafana/data';
import { Segment } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/AnnotationQueryEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/AnnotationQueryEditor.tsx
index 3411b611647..6743f8bb62c 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/AnnotationQueryEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/AnnotationQueryEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { AnnotationQuery } from '@grafana/data';
import { EditorField, EditorRow } from '@grafana/experimental';
import { Input, Stack } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/BucketAggregationEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/BucketAggregationEditor.tsx
index ae1963dd9f8..4b9910e2c7a 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/BucketAggregationEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/BucketAggregationEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { InlineSegmentGroup, Segment, SegmentAsync } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.test.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.test.tsx
index 52b45832fbf..76cd65f3880 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { select } from 'react-select-event';
import { useDispatch } from '../../../../hooks/useStatelessReducer';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.tsx
index 52a3081ac19..5ea427c3984 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/DateHistogramSettingsEditor.tsx
@@ -1,5 +1,5 @@
import { uniqueId } from 'lodash';
-import React, { useCallback, useRef } from 'react';
+import { useCallback, useRef } from 'react';
import { GroupBase, OptionsOrGroups } from 'react-select';
import { InternalTimeZones, SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/FiltersSettingsEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/FiltersSettingsEditor/index.tsx
index ef6a38bda57..de91aadb3f7 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/FiltersSettingsEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/FiltersSettingsEditor/index.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { uniqueId } from 'lodash';
-import React, { useEffect, useRef } from 'react';
+import { useEffect, useRef } from 'react';
import { InlineField, Input, QueryField } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.test.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.test.tsx
index 97442a66f35..bbc46703aaa 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.test.tsx
@@ -1,5 +1,4 @@
import { screen } from '@testing-library/react';
-import React from 'react';
import selectEvent from 'react-select-event';
import { renderWithESProvider } from '../../../../test-helpers/render';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.tsx
index 7b005941ab8..e6292c75396 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/TermsSettingsEditor.tsx
@@ -1,5 +1,5 @@
import { uniqueId } from 'lodash';
-import React, { useRef } from 'react';
+import { useRef } from 'react';
import { SelectableValue } from '@grafana/data';
import { InlineField, Select, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/index.tsx
index eb3e650d73f..b46778d39d9 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/SettingsEditor/index.tsx
@@ -1,5 +1,5 @@
import { uniqueId } from 'lodash';
-import React, { ComponentProps, useRef } from 'react';
+import { ComponentProps, useRef } from 'react';
import { InlineField, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/index.tsx
index dfd631f3c59..83578fc33b4 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/BucketAggregationsEditor/index.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { Button } from '@grafana/ui';
import { useDispatch } from '../../../hooks/useStatelessReducer';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.test.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.test.tsx
index 1ba546ccac2..15bdaf6a53d 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.test.tsx
@@ -1,6 +1,6 @@
import { render } from '@testing-library/react';
import { renderHook } from '@testing-library/react-hooks';
-import React, { PropsWithChildren } from 'react';
+import { PropsWithChildren } from 'react';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.tsx
index 6c41d99a18f..b2fd49cde44 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/ElasticsearchQueryContext.tsx
@@ -1,4 +1,4 @@
-import React, { Context, createContext, PropsWithChildren, useCallback, useContext, useEffect, useState } from 'react';
+import { Context, createContext, PropsWithChildren, useCallback, useContext, useEffect, useState } from 'react';
import { TimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.test.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.test.tsx
index 81a21af4652..64130e3ff26 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.test.tsx
@@ -1,6 +1,6 @@
import { act, fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { PropsWithChildren } from 'react';
+import { PropsWithChildren } from 'react';
import { from } from 'rxjs';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.tsx
index a520ae0fbbe..52a9c01617f 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/MetricEditor.tsx
@@ -1,5 +1,5 @@
import { cx } from '@emotion/css';
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { satisfies, SemVer } from 'semver';
import { SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/BucketScriptSettingsEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/BucketScriptSettingsEditor/index.tsx
index 4f8a9ebfdf8..91b148b6f67 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/BucketScriptSettingsEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/BucketScriptSettingsEditor/index.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { uniqueId } from 'lodash';
-import React, { Fragment, useEffect } from 'react';
+import { Fragment, useEffect } from 'react';
import { Input, InlineLabel } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/MovingAverageSettingsEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/MovingAverageSettingsEditor.tsx
index b8f5a94cdda..ac4aa676fd5 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/MovingAverageSettingsEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/MovingAverageSettingsEditor.tsx
@@ -1,5 +1,6 @@
import { uniqueId } from 'lodash';
-import React, { useRef } from 'react';
+import { useRef } from 'react';
+import * as React from 'react';
import { Input, InlineField, Select, InlineSwitch } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/SettingField.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/SettingField.tsx
index 5a0d48924c1..cefb32fd682 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/SettingField.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/SettingField.tsx
@@ -1,5 +1,5 @@
import { uniqueId } from 'lodash';
-import React, { ComponentProps, useState } from 'react';
+import { ComponentProps, useState } from 'react';
import { InlineField, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/TopMetricsSettingsEditor.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/TopMetricsSettingsEditor.tsx
index 3c5bdba15d1..51da99bac0a 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/TopMetricsSettingsEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/TopMetricsSettingsEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { SelectableValue } from '@grafana/data';
import { AsyncMultiSelect, InlineField, SegmentAsync, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.test.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.test.tsx
index f3753a70540..f8b18d13388 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.tsx
index 83f8338903f..be8246fc0cc 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/SettingsEditor/index.tsx
@@ -1,5 +1,6 @@
import { uniqueId } from 'lodash';
-import React, { ComponentProps, useId, useRef, useState } from 'react';
+import { ComponentProps, useId, useRef, useState } from 'react';
+import * as React from 'react';
import { InlineField, Input, InlineSwitch, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/index.tsx
index 982202be9f1..cc4901eb1d1 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/MetricAggregationsEditor/index.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { Alert, Button } from '@grafana/ui';
import { useDispatch } from '../../../hooks/useStatelessReducer';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorRow.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorRow.tsx
index 297c8372625..76ba289ae4d 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorRow.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorRow.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { noop } from 'lodash';
-import React, { PropsWithChildren } from 'react';
+import { PropsWithChildren } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { IconButton, InlineFieldRow, InlineLabel, InlineSegmentGroup, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorSpecialMetricRow.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorSpecialMetricRow.tsx
index 6820e012391..ccd8ba1ffe4 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorSpecialMetricRow.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryEditorSpecialMetricRow.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { InlineFieldRow, InlineLabel, InlineSegmentGroup } from '@grafana/ui';
import { MetricAggregation } from '../../types';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryTypeSelector.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryTypeSelector.tsx
index 7dfa3fd2ec6..695237f706f 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryTypeSelector.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/QueryTypeSelector.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { RadioButtonGroup } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/SettingsEditorContainer.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/SettingsEditorContainer.tsx
index f9ec8a44278..47994ccd111 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/SettingsEditorContainer.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/SettingsEditorContainer.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { PropsWithChildren, useState } from 'react';
+import { PropsWithChildren, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Icon, InlineSegmentGroup, useTheme2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.test.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.test.tsx
index 67c19e51607..0a5f34abba5 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { ElasticDatasource } from '../../datasource';
import { ElasticsearchQuery } from '../../types';
diff --git a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.tsx b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.tsx
index d9e8ab5f80f..135734cb4f2 100644
--- a/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/QueryEditor/index.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useId, useState } from 'react';
+import { useEffect, useId, useState } from 'react';
import { SemVer } from 'semver';
import { getDefaultTimeRange, GrafanaTheme2, QueryEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/components/hooks/useCreatableSelectPersistedBehaviour.test.tsx b/public/app/plugins/datasource/elasticsearch/components/hooks/useCreatableSelectPersistedBehaviour.test.tsx
index bd4d1acd91c..a95a1b5eb0e 100644
--- a/public/app/plugins/datasource/elasticsearch/components/hooks/useCreatableSelectPersistedBehaviour.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/components/hooks/useCreatableSelectPersistedBehaviour.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { selectors } from '@grafana/e2e-selectors';
import { Select, InlineField } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx
index 8438017aa40..b6183ea3a16 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { ConfigEditor } from './ConfigEditor';
import { createDefaultConfigOptions } from './__mocks__/configOptions';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx
index 1dc4aa84780..64342c5b6f6 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ConfigEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import { SIGV4ConnectionConfig } from '@grafana/aws-sdk';
import { DataSourcePluginOptionsEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/DataLink.tsx b/public/app/plugins/datasource/elasticsearch/configuration/DataLink.tsx
index da2c231ad13..f3ddb9f8e87 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/DataLink.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/DataLink.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { Dispatch, SetStateAction, useEffect, useState } from 'react';
+import { Dispatch, SetStateAction, useEffect, useState } from 'react';
+import * as React from 'react';
import { usePrevious } from 'react-use';
import { DataSourceInstanceSettings, VariableSuggestion } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.test.tsx b/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.test.tsx
index a623d68e822..57656fc51ba 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { DataLinkConfig } from '../types';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.tsx b/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.tsx
index ed340f5c044..ce1740bc8f6 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/DataLinks.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2, VariableOrigin, DataLinkBuiltInVars } from '@grafana/data';
import { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.test.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.test.tsx
index 0b7af77201d..23d2d8def31 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import selectEvent from 'react-select-event';
import { ElasticDetails } from './ElasticDetails';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx
index 4b8707e465e..2a99429238b 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/ElasticDetails.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { DataSourceSettings, SelectableValue } from '@grafana/data';
import { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.test.tsx b/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.test.tsx
index 97d3d130398..40e707b7ad4 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.test.tsx
@@ -1,5 +1,4 @@
import { render, screen, fireEvent } from '@testing-library/react';
-import React from 'react';
import { LogsConfig } from './LogsConfig';
import { createDefaultConfigOptions } from './__mocks__/configOptions';
diff --git a/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.tsx b/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.tsx
index 3289d2fd90a..b5b5ab3006f 100644
--- a/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.tsx
+++ b/public/app/plugins/datasource/elasticsearch/configuration/LogsConfig.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';
import { Input, InlineField } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/elasticsearch/hooks/useFields.test.tsx b/public/app/plugins/datasource/elasticsearch/hooks/useFields.test.tsx
index d977e5f4dec..5751aa51acd 100644
--- a/public/app/plugins/datasource/elasticsearch/hooks/useFields.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/hooks/useFields.test.tsx
@@ -1,5 +1,5 @@
import { renderHook } from '@testing-library/react';
-import React, { PropsWithChildren } from 'react';
+import { PropsWithChildren } from 'react';
import { from } from 'rxjs';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/hooks/useNextId.test.tsx b/public/app/plugins/datasource/elasticsearch/hooks/useNextId.test.tsx
index 881d1030d73..e37c4d1e2bc 100644
--- a/public/app/plugins/datasource/elasticsearch/hooks/useNextId.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/hooks/useNextId.test.tsx
@@ -1,5 +1,5 @@
import { renderHook } from '@testing-library/react';
-import React, { PropsWithChildren } from 'react';
+import { PropsWithChildren } from 'react';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/elasticsearch/hooks/useStatelessReducer.test.tsx b/public/app/plugins/datasource/elasticsearch/hooks/useStatelessReducer.test.tsx
index 509f027d696..80d4c73e093 100644
--- a/public/app/plugins/datasource/elasticsearch/hooks/useStatelessReducer.test.tsx
+++ b/public/app/plugins/datasource/elasticsearch/hooks/useStatelessReducer.test.tsx
@@ -1,5 +1,5 @@
import { renderHook } from '@testing-library/react-hooks';
-import React, { PropsWithChildren } from 'react';
+import { PropsWithChildren } from 'react';
import { useStatelessReducer, useDispatch, DispatchContext, combineReducers } from './useStatelessReducer';
diff --git a/public/app/plugins/datasource/elasticsearch/test-helpers/render.tsx b/public/app/plugins/datasource/elasticsearch/test-helpers/render.tsx
index 236f8e65c11..85daa974d9e 100644
--- a/public/app/plugins/datasource/elasticsearch/test-helpers/render.tsx
+++ b/public/app/plugins/datasource/elasticsearch/test-helpers/render.tsx
@@ -1,5 +1,5 @@
import { render } from '@testing-library/react';
-import React, { ComponentProps, ReactNode } from 'react';
+import { ComponentProps, ReactNode } from 'react';
import { getDefaultTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx b/public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx
index 8608b33cd81..c3ade177b74 100644
--- a/public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx
+++ b/public/app/plugins/datasource/grafana-postgresql-datasource/CheatSheet.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-postgresql-datasource/PostgresQueryEditor.tsx b/public/app/plugins/datasource/grafana-postgresql-datasource/PostgresQueryEditor.tsx
index f1fa982ae93..22bcc5f041c 100644
--- a/public/app/plugins/datasource/grafana-postgresql-datasource/PostgresQueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana-postgresql-datasource/PostgresQueryEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { QueryEditorProps } from '@grafana/data';
import { SqlQueryEditor, SQLOptions, SQLQuery, QueryHeaderProps } from '@grafana/sql';
diff --git a/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx
index 8acacf21633..3c1d5da4e40 100644
--- a/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx
+++ b/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx
@@ -1,4 +1,4 @@
-import React, { SyntheticEvent, useState } from 'react';
+import { SyntheticEvent, useState } from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/grafana-postgresql-datasource/tsconfig.json b/public/app/plugins/datasource/grafana-postgresql-datasource/tsconfig.json
index 7daf2ee8aba..1690bc6f49f 100644
--- a/public/app/plugins/datasource/grafana-postgresql-datasource/tsconfig.json
+++ b/public/app/plugins/datasource/grafana-postgresql-datasource/tsconfig.json
@@ -1,4 +1,5 @@
{
+ "jsx": "react-jsx",
"extends": "@grafana/plugin-configs/tsconfig.json",
"include": ["."]
}
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/ConfigEditor.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/ConfigEditor.tsx
index 1ecbab4d42b..af6467d7896 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/ConfigEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorField.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorField.tsx
index 56007cac05b..dd5b27f56c1 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorField.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorField.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Field, Icon, PopoverContent, ReactUtils, Tooltip, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRow.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRow.tsx
index 5fe10a24999..a45add59216 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRow.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRow.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRows.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRows.tsx
index ce7e38c112a..de79a2b079c 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRows.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/EditorRows.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { Stack } from './Stack';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/LabelsEditor.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/LabelsEditor.tsx
index 6c7cee86081..e8e99208811 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/LabelsEditor.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/LabelsEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useRef } from 'react';
+import { useEffect, useRef } from 'react';
import { useAsync, useLatest } from 'react-use';
import { CodeEditor, Monaco, useStyles2, monacoTypes } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/ProfileTypesCascader.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/ProfileTypesCascader.tsx
index fd21bb71585..f207d6eb4eb 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/ProfileTypesCascader.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/ProfileTypesCascader.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { TimeRange } from '@grafana/data';
import { Cascader, CascaderOption } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx
index 1f1b89830ec..1c5b2b273cf 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { CoreApp, PluginType } from '@grafana/data';
import { setPluginExtensionsHook } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.tsx
index c62defc81ce..9d50180d538 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.tsx
@@ -1,6 +1,6 @@
import deepEqual from 'fast-deep-equal';
import { debounce } from 'lodash';
-import React, { useCallback, useEffect, useRef, useState } from 'react';
+import { useCallback, useEffect, useRef, useState } from 'react';
import { CoreApp, QueryEditorProps, TimeRange } from '@grafana/data';
import { LoadingPlaceholder } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptionGroup.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptionGroup.tsx
index dfd42c81bf5..c6c3dad3719 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptionGroup.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptionGroup.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { useToggle } from 'react-use';
import { GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx
index 7db169674b8..0aea051512f 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryOptions.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { CoreApp, GrafanaTheme2, SelectableValue } from '@grafana/data';
import { useStyles2, RadioButtonGroup, MultiSelect, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/Stack.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/Stack.tsx
index 51ba00444c9..483af932c05 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/Stack.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/Stack.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { CSSProperties } from 'react';
+import { CSSProperties } from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.test.tsx
index 4442512e00c..d11bbde8bbd 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { DataSourceInstanceSettings } from '@grafana/data';
import { getTemplateSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.tsx
index 27f4b2d085c..bf25fa7cda0 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/VariableQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { QueryEditorProps, SelectableValue, TimeRange } from '@grafana/data';
import { InlineField, InlineFieldRow, LoadingPlaceholder, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/tsconfig.json b/public/app/plugins/datasource/grafana-pyroscope-datasource/tsconfig.json
index 7daf2ee8aba..baaaea04185 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/tsconfig.json
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/tsconfig.json
@@ -1,4 +1,7 @@
{
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ },
"extends": "@grafana/plugin-configs/tsconfig.json",
"include": ["."]
}
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/ConfigEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/ConfigEditor.tsx
index 9c78b849d9b..bfc85938fd9 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/ConfigEditor.tsx
@@ -1,5 +1,5 @@
// Libraries
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { DataSourcePluginOptionsEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/MetaDataInspector.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/MetaDataInspector.tsx
index 3ebf7248ef6..e9bc66cd777 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/MetaDataInspector.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/MetaDataInspector.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { MetadataInspectorProps } from '@grafana/data';
import { Stack } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.test.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.test.tsx
index b4b0e8e8b8d..6c78486696b 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.test.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { selectors } from '@grafana/e2e-selectors';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.tsx
index eb684d5abac..8c4e6599073 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/QueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { FormEvent, useMemo } from 'react';
+import { FormEvent, useMemo } from 'react';
import { useAsync } from 'react-use';
import { QueryEditorProps, SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/TestInfoTab.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/TestInfoTab.tsx
index 5ab58f4f621..1472eed8615 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/TestInfoTab.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/TestInfoTab.tsx
@@ -1,5 +1,5 @@
// Libraries
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { PluginConfigPageProps, DataSourcePluginMeta, DataSourceJsonData } from '@grafana/data';
import { LinkButton } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVContentEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVContentEditor.tsx
index aa6c2f85c72..1ad102b9dc3 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVContentEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVContentEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { CodeEditor } from '@grafana/ui';
import { EditorProps } from '../QueryEditor';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVFileEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVFileEditor.tsx
index 0ae69bd7b0c..c386602010f 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVFileEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVFileEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { InlineField, InlineFieldRow, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVWaveEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVWaveEditor.tsx
index 5635dd77007..20dcb00bdd8 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVWaveEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/CSVWaveEditor.tsx
@@ -1,4 +1,5 @@
-import React, { PureComponent, useState } from 'react';
+import { PureComponent, useState } from 'react';
+import * as React from 'react';
import { Button, InlineField, InlineFieldRow, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/ErrorEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/ErrorEditor.tsx
index bdf61946809..921a6e952c7 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/ErrorEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/ErrorEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { InlineField, InlineFieldRow, Select } from '@grafana/ui';
import { EditorProps } from '../QueryEditor';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/GrafanaLiveEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/GrafanaLiveEditor.tsx
index ab4c6bff3f1..b76607cf711 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/GrafanaLiveEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/GrafanaLiveEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { InlineField, InlineFieldRow, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/NodeGraphEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/NodeGraphEditor.tsx
index 6c09214a47f..5a6f7a11b60 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/NodeGraphEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/NodeGraphEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { Input, InlineFieldRow, InlineField, Select } from '@grafana/ui';
import { NodesQuery, TestDataDataQuery } from '../dataquery';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/PredictablePulseEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/PredictablePulseEditor.tsx
index 1cfab8b3a68..661dc5b3bc9 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/PredictablePulseEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/PredictablePulseEditor.tsx
@@ -1,4 +1,4 @@
-import React, { ChangeEvent } from 'react';
+import { ChangeEvent } from 'react';
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/RandomWalkEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/RandomWalkEditor.tsx
index 364b326b38a..0bdcc29f0c1 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/RandomWalkEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/RandomWalkEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { selectors } from '@grafana/e2e-selectors';
import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/RawFrameEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/RawFrameEditor.tsx
index 7eea237857c..faa2fb766e6 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/RawFrameEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/RawFrameEditor.tsx
@@ -1,5 +1,5 @@
import { isArray } from 'lodash';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { dataFrameToJSON, toDataFrame, toDataFrameDTO } from '@grafana/data';
import { toDataQueryResponse } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationQueryEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationQueryEditor.tsx
index e7e889af97d..e808ceb6178 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationQueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { FormEvent, useMemo, useState } from 'react';
+import { FormEvent, useMemo, useState } from 'react';
import { useAsync } from 'react-use';
import { DataFrameJSON, SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationSchemaForm.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationSchemaForm.tsx
index 7e33eb61eeb..fc9a9cec505 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationSchemaForm.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/SimulationSchemaForm.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { FormEvent, useState, ChangeEvent } from 'react';
+import { FormEvent, useState, ChangeEvent } from 'react';
import { DataFrameSchema, FieldSchema, GrafanaTheme2 } from '@grafana/data';
import { useStyles2, TextArea, InlineField, Input, FieldSet, InlineSwitch } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/StreamingClientEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/StreamingClientEditor.tsx
index 67474d9515b..bd0abd4912e 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/StreamingClientEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/StreamingClientEditor.tsx
@@ -1,4 +1,4 @@
-import React, { ChangeEvent } from 'react';
+import { ChangeEvent } from 'react';
import { SelectableValue } from '@grafana/data';
import { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/components/USAQueryEditor.tsx b/public/app/plugins/datasource/grafana-testdata-datasource/components/USAQueryEditor.tsx
index 8f4866bf8ce..6a8aa544efe 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/components/USAQueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/components/USAQueryEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { InlineFieldRow, InlineField, Select, MultiSelect, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/tsconfig.json b/public/app/plugins/datasource/grafana-testdata-datasource/tsconfig.json
index 7daf2ee8aba..baaaea04185 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/tsconfig.json
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/tsconfig.json
@@ -1,4 +1,7 @@
{
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ },
"extends": "@grafana/plugin-configs/tsconfig.json",
"include": ["."]
}
diff --git a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx
index 63312c98faf..44daef9a607 100644
--- a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQueryType } from '../types';
diff --git a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx
index 0894f13ab2b..2314ae6a2be 100644
--- a/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
+import * as React from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { Field, FieldSet, Select, Switch, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana/components/QueryEditor.tsx b/public/app/plugins/datasource/grafana/components/QueryEditor.tsx
index bd52ddabeaa..16707526820 100644
--- a/public/app/plugins/datasource/grafana/components/QueryEditor.tsx
+++ b/public/app/plugins/datasource/grafana/components/QueryEditor.tsx
@@ -1,6 +1,7 @@
import { css } from '@emotion/css';
import pluralize from 'pluralize';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
+import * as React from 'react';
import { DropEvent, FileRejection } from 'react-dropzone';
import {
diff --git a/public/app/plugins/datasource/grafana/components/SearchEditor.tsx b/public/app/plugins/datasource/grafana/components/SearchEditor.tsx
index dea22b8b22e..e5d102c8be4 100644
--- a/public/app/plugins/datasource/grafana/components/SearchEditor.tsx
+++ b/public/app/plugins/datasource/grafana/components/SearchEditor.tsx
@@ -1,4 +1,5 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
+import * as React from 'react';
import { InlineField, Input, InlineFieldRow, CodeEditor } from '@grafana/ui';
import { SearchQuery } from 'app/features/search/service';
diff --git a/public/app/plugins/datasource/grafana/components/TimePickerInput.tsx b/public/app/plugins/datasource/grafana/components/TimePickerInput.tsx
index 6c735c45604..dbe88c64dd9 100644
--- a/public/app/plugins/datasource/grafana/components/TimePickerInput.tsx
+++ b/public/app/plugins/datasource/grafana/components/TimePickerInput.tsx
@@ -1,7 +1,6 @@
import { css, cx } from '@emotion/css';
import { Moment } from 'moment';
import TimePicker from 'rc-time-picker';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { FormInputSize, Icon, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/grafana/components/TimeRegionEditor.tsx b/public/app/plugins/datasource/grafana/components/TimeRegionEditor.tsx
index 41a106cc77d..2a7e10588ba 100644
--- a/public/app/plugins/datasource/grafana/components/TimeRegionEditor.tsx
+++ b/public/app/plugins/datasource/grafana/components/TimeRegionEditor.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import moment, { Moment } from 'moment/moment';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { getTimeZoneInfo, GrafanaTheme2, SelectableValue } from '@grafana/data';
import { Button, Field, FieldSet, Select, Stack, TimeZonePicker, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/AddGraphiteFunction.tsx b/public/app/plugins/datasource/graphite/components/AddGraphiteFunction.tsx
index 406d130e946..48477adfbba 100644
--- a/public/app/plugins/datasource/graphite/components/AddGraphiteFunction.tsx
+++ b/public/app/plugins/datasource/graphite/components/AddGraphiteFunction.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { Button, Segment, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/AnnotationsEditor.tsx b/public/app/plugins/datasource/graphite/components/AnnotationsEditor.tsx
index e27c5afce7a..abe52b5b0de 100644
--- a/public/app/plugins/datasource/graphite/components/AnnotationsEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/AnnotationsEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { GrafanaTheme2, QueryEditorProps } from '@grafana/data';
import { Box, InlineField, Input, TagsInput, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/FunctionEditor.test.tsx b/public/app/plugins/datasource/graphite/components/FunctionEditor.test.tsx
index b9a6d609919..25685df4fde 100644
--- a/public/app/plugins/datasource/graphite/components/FunctionEditor.test.tsx
+++ b/public/app/plugins/datasource/graphite/components/FunctionEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { FuncInstance } from '../gfunc';
diff --git a/public/app/plugins/datasource/graphite/components/FunctionEditor.tsx b/public/app/plugins/datasource/graphite/components/FunctionEditor.tsx
index 44ced255c2d..19212b9f304 100644
--- a/public/app/plugins/datasource/graphite/components/FunctionEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/FunctionEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import { memo } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Icon, Tooltip, useStyles2, type PopoverContent } from '@grafana/ui';
@@ -58,7 +58,7 @@ const FunctionEditor = ({ onMoveLeft, onMoveRight, func, ...props }: FunctionEdi
);
};
-const TooltipContent = React.memo(() => {
+const TooltipContent = memo(() => {
return (
This function is not supported. Check your function for typos and{' '}
diff --git a/public/app/plugins/datasource/graphite/components/FunctionEditorControls.tsx b/public/app/plugins/datasource/graphite/components/FunctionEditorControls.tsx
index d4d41da7206..18c4ba93c52 100644
--- a/public/app/plugins/datasource/graphite/components/FunctionEditorControls.tsx
+++ b/public/app/plugins/datasource/graphite/components/FunctionEditorControls.tsx
@@ -1,4 +1,4 @@
-import React, { Suspense } from 'react';
+import { lazy, Suspense } from 'react';
import { Icon, Tooltip } from '@grafana/ui';
@@ -10,7 +10,7 @@ export interface FunctionEditorControlsProps {
onRemove: (func: FuncInstance) => void;
}
-const FunctionDescription = React.lazy(async () => {
+const FunctionDescription = lazy(async () => {
return {
default(props: { description?: string }) {
return {props.description}
;
diff --git a/public/app/plugins/datasource/graphite/components/FunctionParamEditor.tsx b/public/app/plugins/datasource/graphite/components/FunctionParamEditor.tsx
index d3306f4aab9..dfaffe8fe93 100644
--- a/public/app/plugins/datasource/graphite/components/FunctionParamEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/FunctionParamEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { Segment, SegmentInput, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/FunctionsSection.tsx b/public/app/plugins/datasource/graphite/components/FunctionsSection.tsx
index 0cbf5fb67a9..1db2a1471a2 100644
--- a/public/app/plugins/datasource/graphite/components/FunctionsSection.tsx
+++ b/public/app/plugins/datasource/graphite/components/FunctionsSection.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SegmentSection } from '@grafana/ui';
import { FuncDefs, FuncInstance } from '../gfunc';
diff --git a/public/app/plugins/datasource/graphite/components/GraphiteFunctionEditor.tsx b/public/app/plugins/datasource/graphite/components/GraphiteFunctionEditor.tsx
index 4e1d09ddc13..78599d8bfc7 100644
--- a/public/app/plugins/datasource/graphite/components/GraphiteFunctionEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/GraphiteFunctionEditor.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useState } from 'react';
+import { Fragment, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Stack, InlineLabel, useStyles2 } from '@grafana/ui';
@@ -60,7 +60,7 @@ export function GraphiteFunctionEditor({ func }: FunctionEditorProps) {
{params.map((editableParam: EditableParam, index: number) => {
return (
-
+
{index !== params.length - 1 ? ',' : ''}
-
+
);
})}
diff --git a/public/app/plugins/datasource/graphite/components/GraphiteQueryEditor.tsx b/public/app/plugins/datasource/graphite/components/GraphiteQueryEditor.tsx
index 2e0947bb503..0b9ca32a13d 100644
--- a/public/app/plugins/datasource/graphite/components/GraphiteQueryEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/GraphiteQueryEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Button, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/GraphiteTextEditor.tsx b/public/app/plugins/datasource/graphite/components/GraphiteTextEditor.tsx
index 849b2477936..896f41c9668 100644
--- a/public/app/plugins/datasource/graphite/components/GraphiteTextEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/GraphiteTextEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { QueryField } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/GraphiteVariableEditor.tsx b/public/app/plugins/datasource/graphite/components/GraphiteVariableEditor.tsx
index fdf421e27ca..ae240af2b90 100644
--- a/public/app/plugins/datasource/graphite/components/GraphiteVariableEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/GraphiteVariableEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { InlineField, Input, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/MetricSegment.tsx b/public/app/plugins/datasource/graphite/components/MetricSegment.tsx
index af66dbfb5bf..92382d1b260 100644
--- a/public/app/plugins/datasource/graphite/components/MetricSegment.tsx
+++ b/public/app/plugins/datasource/graphite/components/MetricSegment.tsx
@@ -1,5 +1,5 @@
import { debounce } from 'lodash';
-import React, { useCallback, useMemo } from 'react';
+import { useCallback, useMemo } from 'react';
import { SelectableValue } from '@grafana/data';
import { SegmentAsync } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/MetricTankMetaInspector.tsx b/public/app/plugins/datasource/graphite/components/MetricTankMetaInspector.tsx
index d0fd82f1e53..1b45fc14593 100644
--- a/public/app/plugins/datasource/graphite/components/MetricTankMetaInspector.tsx
+++ b/public/app/plugins/datasource/graphite/components/MetricTankMetaInspector.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { MetadataInspectorProps, rangeUtil } from '@grafana/data';
import { stylesFactory } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/MetricsSection.tsx b/public/app/plugins/datasource/graphite/components/MetricsSection.tsx
index b4075036cdf..d6340c17a7b 100644
--- a/public/app/plugins/datasource/graphite/components/MetricsSection.tsx
+++ b/public/app/plugins/datasource/graphite/components/MetricsSection.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { GraphiteQueryEditorState } from '../state/store';
import { GraphiteSegment } from '../types';
diff --git a/public/app/plugins/datasource/graphite/components/PlayButton.tsx b/public/app/plugins/datasource/graphite/components/PlayButton.tsx
index 18d76fefe7b..6530acb445b 100644
--- a/public/app/plugins/datasource/graphite/components/PlayButton.tsx
+++ b/public/app/plugins/datasource/graphite/components/PlayButton.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { Button } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/SeriesSection.tsx b/public/app/plugins/datasource/graphite/components/SeriesSection.tsx
index 5b76e2d897c..0ea93363cb2 100644
--- a/public/app/plugins/datasource/graphite/components/SeriesSection.tsx
+++ b/public/app/plugins/datasource/graphite/components/SeriesSection.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SegmentSection } from '@grafana/ui';
import { GraphiteQueryEditorState } from '../state/store';
diff --git a/public/app/plugins/datasource/graphite/components/TagEditor.tsx b/public/app/plugins/datasource/graphite/components/TagEditor.tsx
index fe69a1bbad6..4e5d7d1d8df 100644
--- a/public/app/plugins/datasource/graphite/components/TagEditor.tsx
+++ b/public/app/plugins/datasource/graphite/components/TagEditor.tsx
@@ -1,5 +1,5 @@
import { debounce } from 'lodash';
-import React, { useCallback, useMemo } from 'react';
+import { useCallback, useMemo } from 'react';
import { Segment, SegmentAsync } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/components/TagsSection.tsx b/public/app/plugins/datasource/graphite/components/TagsSection.tsx
index 3e1160b07e5..c5646c4f08f 100644
--- a/public/app/plugins/datasource/graphite/components/TagsSection.tsx
+++ b/public/app/plugins/datasource/graphite/components/TagsSection.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { debounce } from 'lodash';
-import React, { useCallback, useMemo } from 'react';
+import { useCallback, useMemo } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Button, SegmentAsync, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/graphite/configuration/ConfigEditor.tsx
index 7cfb530ab0b..9106c32eb60 100644
--- a/public/app/plugins/datasource/graphite/configuration/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/graphite/configuration/ConfigEditor.tsx
@@ -1,4 +1,4 @@
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/graphite/configuration/MappingsConfiguration.tsx b/public/app/plugins/datasource/graphite/configuration/MappingsConfiguration.tsx
index 10de5f75ddd..0df6363a7ce 100644
--- a/public/app/plugins/datasource/graphite/configuration/MappingsConfiguration.tsx
+++ b/public/app/plugins/datasource/graphite/configuration/MappingsConfiguration.tsx
@@ -1,4 +1,4 @@
-import React, { ChangeEvent, useState } from 'react';
+import { ChangeEvent, useState } from 'react';
import { Box, Button, Icon, InlineField, InlineFieldRow, Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/graphite/configuration/MappingsHelp.tsx b/public/app/plugins/datasource/graphite/configuration/MappingsHelp.tsx
index a3b7b4f0dac..37a93580ca1 100644
--- a/public/app/plugins/datasource/graphite/configuration/MappingsHelp.tsx
+++ b/public/app/plugins/datasource/graphite/configuration/MappingsHelp.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { Alert } from '@grafana/ui';
type Props = {
diff --git a/public/app/plugins/datasource/graphite/state/context.tsx b/public/app/plugins/datasource/graphite/state/context.tsx
index ba48d3a759d..a15853875a7 100644
--- a/public/app/plugins/datasource/graphite/state/context.tsx
+++ b/public/app/plugins/datasource/graphite/state/context.tsx
@@ -1,5 +1,5 @@
import { AnyAction } from '@reduxjs/toolkit';
-import React, { createContext, Dispatch, PropsWithChildren, useContext, useEffect, useMemo, useState } from 'react';
+import { createContext, Dispatch, PropsWithChildren, useContext, useEffect, useMemo, useState } from 'react';
import { usePrevious } from 'react-use';
import { QueryEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx
index 91d289c1755..e77183eac0a 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/annotation/AnnotationEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { QueryEditorProps } from '@grafana/data/src';
import { InlineFormLabel, Input, Stack } from '@grafana/ui/src';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.test.tsx b/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.test.tsx
index ccf2646b950..5964465b0c9 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.test.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { InfluxVersion } from '../../../types';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.tsx
index f93f5c8e2af..db1296ae12c 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/config/ConfigEditor.tsx
@@ -1,5 +1,5 @@
import { uniqueId } from 'lodash';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/influxdb/components/editor/config/InfluxFluxConfig.tsx b/public/app/plugins/datasource/influxdb/components/editor/config/InfluxFluxConfig.tsx
index 442e6f85f81..61a009e0798 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/config/InfluxFluxConfig.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/config/InfluxFluxConfig.tsx
@@ -1,5 +1,4 @@
import { uniqueId } from 'lodash';
-import React from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/influxdb/components/editor/config/InfluxInfluxQLConfig.tsx b/public/app/plugins/datasource/influxdb/components/editor/config/InfluxInfluxQLConfig.tsx
index e811a69fc9b..bdde3be2533 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/config/InfluxInfluxQLConfig.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/config/InfluxInfluxQLConfig.tsx
@@ -1,6 +1,5 @@
import { css } from '@emotion/css';
import { uniqueId } from 'lodash';
-import React from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/influxdb/components/editor/config/InfluxSQLConfig.tsx b/public/app/plugins/datasource/influxdb/components/editor/config/InfluxSQLConfig.tsx
index defdb0b0eab..fb0b5edf8e0 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/config/InfluxSQLConfig.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/config/InfluxSQLConfig.tsx
@@ -1,6 +1,5 @@
import { css } from '@emotion/css';
import { uniqueId } from 'lodash';
-import React from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx
index 7976e9edf9c..acb8d949f4c 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/QueryEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { QueryEditorProps } from '@grafana/data/src';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx
index 56102fdac15..1ad454e7b86 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/flux/FluxQueryEditor.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data/src';
import { getTemplateSrv } from '@grafana/runtime/src';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx
index 90c08ff26ab..f63b3778dd2 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/fsql/FSQLEditor.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { GrafanaTheme2 } from '@grafana/data/src';
import { SQLQuery, SqlQueryEditor, applyQueryDefaults } from '@grafana/sql';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx
index 40f5731691f..d1ad573f92d 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx
index 10f35190d08..ccb6596b6b9 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { InfluxCheatSheet } from './InfluxCheatSheet';
export function InfluxStartPage() {
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/QueryEditorModeSwitcher.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/QueryEditorModeSwitcher.tsx
index 539ee63f4d5..7bc5dcf6a6e 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/QueryEditorModeSwitcher.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/QueryEditorModeSwitcher.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { Button, ConfirmModal } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.test.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.test.tsx
index c704a7e9946..91faafbf260 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.test.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { selectOptionInTest } from 'test/helpers/selectOptionInTest';
import { InfluxQuery } from '../../../../../types';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx
index e8da5a7572f..0098e8eb0af 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useId } from 'react';
+import { useId } from 'react';
import { Stack, InlineField, Input, Select, TextArea } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/AddButton.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/AddButton.tsx
index 8175891393d..7123f816f22 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/AddButton.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/AddButton.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { unwrap } from '../utils/unwrap';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FormatAsSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FormatAsSection.tsx
index 521681fac21..6bf005185f4 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FormatAsSection.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FormatAsSection.tsx
@@ -1,5 +1,4 @@
import { cx } from '@emotion/css';
-import React from 'react';
import { Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FromSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FromSection.tsx
index b0c8f42a432..458f2eb9176 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FromSection.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/FromSection.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { AccessoryButton } from '@grafana/experimental';
import { DEFAULT_POLICY } from '../../../../../types';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx
index 71b9fad90d3..bb197aedd2d 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx
@@ -1,5 +1,4 @@
import { cx } from '@emotion/css';
-import React from 'react';
import { Input } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/OrderByTimeSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/OrderByTimeSection.tsx
index f7c594130bb..eab1943a4ea 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/OrderByTimeSection.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/OrderByTimeSection.tsx
@@ -1,5 +1,4 @@
import { cx } from '@emotion/css';
-import React from 'react';
import { SelectableValue } from '@grafana/data';
import { Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/PartListSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/PartListSection.tsx
index a86df9df784..3bb380ee126 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/PartListSection.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/PartListSection.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { Fragment, useMemo } from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { AccessoryButton } from '@grafana/experimental';
@@ -77,7 +77,7 @@ const Part = ({ name, params, onChange }: PartProps): JSX.Element => {
const loadOptions =
options !== null ? () => options().then((items) => items.map(toSelectableValue)) : undefined;
return (
-
+
{
}}
/>
{!isLast && ','}
-
+
);
})}
)
@@ -106,7 +106,7 @@ export const PartListSection = ({
return (
<>
{parts.map((part, index) => (
-
+
-
+
))}
>
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx
index 28b679fd5e3..47b24fcecf6 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx
@@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css';
import debouncePromise from 'debounce-promise';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { useAsyncFn } from 'react-use';
import { SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.test.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.test.tsx
index fe6b0e57c5e..e65968073ce 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.test.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.test.tsx
@@ -1,5 +1,4 @@
import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import { InfluxQueryTag } from '../../../../../types';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.tsx
index b290a231bb2..9079bc056c7 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/TagsSection.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { AccessoryButton } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tags.test.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tags.test.tsx
index 7a89362d515..7d6b19d637f 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tags.test.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tags.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import InfluxDatasource from '../../../../../datasource';
import * as mockedMeta from '../../../../../influxql_metadata_query';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.test.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.test.tsx
index 90c6d9723cb..7f6f4c13306 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.test.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, waitFor } from '@testing-library/react';
-import React from 'react';
import { getMockInfluxDS, getMockDSInstanceSettings } from '../../../../../__mocks__/datasource';
import InfluxDatasource from '../../../../../datasource';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx
index 374da6b752a..4a1b879242d 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useId, useMemo } from 'react';
+import { useId, useMemo } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { InlineLabel, SegmentSection, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/influxdb/components/editor/variable/VariableQueryEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/variable/VariableQueryEditor.tsx
index 5cab87fe886..e7381c5a399 100644
--- a/public/app/plugins/datasource/influxdb/components/editor/variable/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/influxdb/components/editor/variable/VariableQueryEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { QueryEditorProps } from '@grafana/data';
import { InlineFieldRow, Input, TextArea } from '@grafana/ui';
import { InlineField } from '@grafana/ui/';
diff --git a/public/app/plugins/datasource/jaeger/CheatSheet.tsx b/public/app/plugins/datasource/jaeger/CheatSheet.tsx
index 89329d94e66..db27736458b 100644
--- a/public/app/plugins/datasource/jaeger/CheatSheet.tsx
+++ b/public/app/plugins/datasource/jaeger/CheatSheet.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/jaeger/components/QueryEditor.tsx b/public/app/plugins/datasource/jaeger/components/QueryEditor.tsx
index 22c98352296..53f7e351f95 100644
--- a/public/app/plugins/datasource/jaeger/components/QueryEditor.tsx
+++ b/public/app/plugins/datasource/jaeger/components/QueryEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { QueryEditorProps } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/jaeger/components/SearchForm.test.tsx b/public/app/plugins/datasource/jaeger/components/SearchForm.test.tsx
index bc1bae92086..533f5b900eb 100644
--- a/public/app/plugins/datasource/jaeger/components/SearchForm.test.tsx
+++ b/public/app/plugins/datasource/jaeger/components/SearchForm.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { of } from 'rxjs';
import { DataQueryRequest, DataSourceInstanceSettings, dateTime, PluginMetaInfo, PluginType } from '@grafana/data';
diff --git a/public/app/plugins/datasource/jaeger/components/SearchForm.tsx b/public/app/plugins/datasource/jaeger/components/SearchForm.tsx
index 229a709e4d7..f0eee728f38 100644
--- a/public/app/plugins/datasource/jaeger/components/SearchForm.tsx
+++ b/public/app/plugins/datasource/jaeger/components/SearchForm.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import { TemporaryAlert } from '@grafana/o11y-ds-frontend';
diff --git a/public/app/plugins/datasource/jaeger/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/jaeger/configuration/ConfigEditor.tsx
index 5517e272c3c..c032084fbb2 100644
--- a/public/app/plugins/datasource/jaeger/configuration/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/jaeger/configuration/ConfigEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/jaeger/configuration/TraceIdTimeParams.tsx b/public/app/plugins/datasource/jaeger/configuration/TraceIdTimeParams.tsx
index 52b2888045f..94dc28005ba 100644
--- a/public/app/plugins/datasource/jaeger/configuration/TraceIdTimeParams.tsx
+++ b/public/app/plugins/datasource/jaeger/configuration/TraceIdTimeParams.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import {
DataSourceJsonData,
diff --git a/public/app/plugins/datasource/jaeger/tsconfig.json b/public/app/plugins/datasource/jaeger/tsconfig.json
index a7a33a2fc32..d05071dbf1d 100644
--- a/public/app/plugins/datasource/jaeger/tsconfig.json
+++ b/public/app/plugins/datasource/jaeger/tsconfig.json
@@ -1,5 +1,6 @@
{
"compilerOptions": {
+ "jsx": "react-jsx",
"types": ["jest", "@testing-library/jest-dom"]
},
"extends": "@grafana/plugin-configs/tsconfig.json",
diff --git a/public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx b/public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx
index 670288224aa..907c1f48177 100644
--- a/public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx
+++ b/public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx
@@ -1,5 +1,5 @@
// Libraries
-import React, { memo } from 'react';
+import { memo } from 'react';
import { AnnotationQuery } from '@grafana/data';
import { EditorField, EditorRow } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx
index c7074790d1e..37014c16664 100644
--- a/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.test.tsx
@@ -1,5 +1,5 @@
import { render, screen } from '@testing-library/react';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
import { LokiDatasource } from '../datasource';
import { LokiQuery } from '../types';
diff --git a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx
index 412d876658e..dce5bc0221c 100644
--- a/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiCheatSheet.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { shuffle } from 'lodash';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { GrafanaTheme2, QueryEditorHelpProps } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/loki/components/LokiContextUi.test.tsx b/public/app/plugins/datasource/loki/components/LokiContextUi.test.tsx
index 7d9d7220877..b9b53f65dc1 100644
--- a/public/app/plugins/datasource/loki/components/LokiContextUi.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiContextUi.test.tsx
@@ -1,6 +1,5 @@
import { act, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { select } from 'react-select-event';
import { LogRowModel, dateTime } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiContextUi.tsx b/public/app/plugins/datasource/loki/components/LokiContextUi.tsx
index fe181e08ea8..a44f6c37a7e 100644
--- a/public/app/plugins/datasource/loki/components/LokiContextUi.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiContextUi.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useCallback, useEffect, useMemo, useState } from 'react';
+import { useRef, useCallback, useEffect, useMemo, useState } from 'react';
import { useAsync } from 'react-use';
import { dateTime, GrafanaTheme2, LogRowModel, renderMarkdown, SelectableValue } from '@grafana/data';
@@ -126,9 +126,9 @@ export function LokiContextUi(props: LokiContextUiProps) {
window.localStorage.getItem(SHOULD_INCLUDE_PIPELINE_OPERATIONS) === 'true'
);
- const timerHandle = React.useRef();
- const previousInitialized = React.useRef(false);
- const previousContextFilters = React.useRef([]);
+ const timerHandle = useRef();
+ const previousInitialized = useRef(false);
+ const previousContextFilters = useRef([]);
const isInitialState = useMemo(() => {
// Initial query has all regular labels enabled and all parsed labels disabled
diff --git a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx
index 5090172f64e..58b37c46664 100644
--- a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { createTheme } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx
index cbc8930bfa5..c11bf73054d 100644
--- a/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx
@@ -1,6 +1,7 @@
import { css, cx } from '@emotion/css';
import { sortBy } from 'lodash';
-import React, { ChangeEvent } from 'react';
+import { ChangeEvent } from 'react';
+import * as React from 'react';
import { FixedSizeList } from 'react-window';
import { CoreApp, GrafanaTheme2, TimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiOptionFields.test.tsx b/public/app/plugins/datasource/loki/components/LokiOptionFields.test.tsx
index 3ebb0adb02f..e82312af944 100644
--- a/public/app/plugins/datasource/loki/components/LokiOptionFields.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiOptionFields.test.tsx
@@ -1,5 +1,4 @@
import { render, screen, waitFor, fireEvent } from '@testing-library/react';
-import React from 'react';
import { LokiOptionFieldsProps, LokiOptionFields, preprocessMaxLines } from './LokiOptionFields';
diff --git a/public/app/plugins/datasource/loki/components/LokiOptionFields.tsx b/public/app/plugins/datasource/loki/components/LokiOptionFields.tsx
index 8bada9ae24e..c90c05eb7b7 100644
--- a/public/app/plugins/datasource/loki/components/LokiOptionFields.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiOptionFields.tsx
@@ -1,6 +1,7 @@
// Libraries
import { map } from 'lodash';
-import React, { memo } from 'react';
+import { memo } from 'react';
+import * as React from 'react';
// Types
import { SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditor.test.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditor.test.tsx
index c2720a046bf..bb41f4cdf47 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryEditor.test.tsx
@@ -1,7 +1,6 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { cloneDeep, defaultsDeep } from 'lodash';
-import React from 'react';
import { CoreApp } from '@grafana/data';
import { QueryEditorMode } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx
index d0c9f84529a..eba24c05762 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx
@@ -1,5 +1,5 @@
import { isEqual } from 'lodash';
-import React, { SyntheticEvent, useCallback, useEffect, useId, useState } from 'react';
+import { memo, SyntheticEvent, useCallback, useEffect, useId, useState } from 'react';
import { usePrevious } from 'react-use';
import { CoreApp, LoadingState } from '@grafana/data';
@@ -33,7 +33,7 @@ export const testIds = {
export const lokiQueryEditorExplainKey = 'LokiQueryEditorExplainDefault';
-export const LokiQueryEditor = React.memo((props) => {
+export const LokiQueryEditor = memo((props) => {
const id = useId();
const { onChange, onRunQuery, onAddQuery, data, app, queries, datasource, range: timeRange } = props;
const [parseModalOpen, setParseModalOpen] = useState(false);
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.test.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.test.tsx
index 171644d2802..c36399ea7dc 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.test.tsx
@@ -1,6 +1,5 @@
import { render, RenderResult, screen } from '@testing-library/react';
import { noop } from 'lodash';
-import React from 'react';
import { CoreApp } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.tsx
index 0306583a312..770ca087577 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.tsx
@@ -1,4 +1,4 @@
-import React, { memo } from 'react';
+import { memo } from 'react';
import { CoreApp } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditorForAlerting.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditorForAlerting.tsx
index 7e31f9fb175..4336cdbc03a 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryEditorForAlerting.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryEditorForAlerting.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { LokiQueryField } from './LokiQueryField';
import { LokiQueryEditorProps } from './types';
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryField.test.tsx b/public/app/plugins/datasource/loki/components/LokiQueryField.test.tsx
index 17b2fd47e6f..c9412197892 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryField.test.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryField.test.tsx
@@ -1,5 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
import { dateTime } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/LokiQueryField.tsx b/public/app/plugins/datasource/loki/components/LokiQueryField.tsx
index 237e2bff418..11006e99993 100644
--- a/public/app/plugins/datasource/loki/components/LokiQueryField.tsx
+++ b/public/app/plugins/datasource/loki/components/LokiQueryField.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode } from 'react';
+import { PureComponent, ReactNode } from 'react';
import { QueryEditorProps } from '@grafana/data';
@@ -18,7 +18,7 @@ interface LokiQueryFieldState {
labelsLoaded: boolean;
}
-export class LokiQueryField extends React.PureComponent {
+export class LokiQueryField extends PureComponent {
_isMounted = false;
constructor(props: LokiQueryFieldProps) {
diff --git a/public/app/plugins/datasource/loki/components/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/loki/components/VariableQueryEditor.test.tsx
index 758dfc7055c..7644c76bb79 100644
--- a/public/app/plugins/datasource/loki/components/VariableQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/loki/components/VariableQueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { select } from 'react-select-event';
import { TimeRange, dateTime } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/components/VariableQueryEditor.tsx b/public/app/plugins/datasource/loki/components/VariableQueryEditor.tsx
index 63246b73657..fcafcc01ae6 100644
--- a/public/app/plugins/datasource/loki/components/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/loki/components/VariableQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { FormEvent, useState, useEffect } from 'react';
+import { FormEvent, useState, useEffect } from 'react';
import { usePrevious } from 'react-use';
import { QueryEditorProps, SelectableValue } from '@grafana/data';
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 e98e694f093..dadb297a1a4 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,5 +1,4 @@
import { render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import { selectors } from '@grafana/e2e-selectors';
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 6d003381237..71b59d08bb1 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,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { selectors } from '@grafana/e2e-selectors';
diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx
index 96bb9c4fbae..c74b66ba42a 100644
--- a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx
+++ b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { debounce } from 'lodash';
-import React, { useRef, useEffect } from 'react';
+import { useRef, useEffect } from 'react';
import { useLatest } from 'react-use';
import { v4 as uuidv4 } from 'uuid';
diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldLazy.tsx b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldLazy.tsx
index aeb6c14c904..594bd2a11eb 100644
--- a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldLazy.tsx
+++ b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldLazy.tsx
@@ -1,8 +1,8 @@
-import React, { Suspense } from 'react';
+import { lazy, Suspense } from 'react';
import { Props } from './MonacoQueryFieldProps';
-const Field = React.lazy(() => import(/* webpackChunkName: "loki-query-field" */ './MonacoQueryField'));
+const Field = lazy(() => import(/* webpackChunkName: "loki-query-field" */ './MonacoQueryField'));
export const MonacoQueryFieldLazy = (props: Props) => {
return (
diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldWrapper.tsx b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldWrapper.tsx
index 0ca7d70f018..418ab68d51a 100644
--- a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldWrapper.tsx
+++ b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryFieldWrapper.tsx
@@ -1,4 +1,4 @@
-import React, { useRef } from 'react';
+import { useRef } from 'react';
import { MonacoQueryFieldLazy } from './MonacoQueryFieldLazy';
import { Props as MonacoProps } from './MonacoQueryFieldProps';
diff --git a/public/app/plugins/datasource/loki/configuration/AlertingSettings.test.tsx b/public/app/plugins/datasource/loki/configuration/AlertingSettings.test.tsx
index 73686c4b3af..d5bf01737f8 100644
--- a/public/app/plugins/datasource/loki/configuration/AlertingSettings.test.tsx
+++ b/public/app/plugins/datasource/loki/configuration/AlertingSettings.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { createDefaultConfigOptions } from '../__mocks__/datasource';
diff --git a/public/app/plugins/datasource/loki/configuration/AlertingSettings.tsx b/public/app/plugins/datasource/loki/configuration/AlertingSettings.tsx
index d9c4c439ed2..7e3bcc24d54 100644
--- a/public/app/plugins/datasource/loki/configuration/AlertingSettings.tsx
+++ b/public/app/plugins/datasource/loki/configuration/AlertingSettings.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { DataSourcePluginOptionsEditorProps } from '@grafana/data';
import { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';
import { InlineField, InlineSwitch } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/loki/configuration/ConfigEditor.test.tsx b/public/app/plugins/datasource/loki/configuration/ConfigEditor.test.tsx
index 8afc34bc0b1..214c68854c0 100644
--- a/public/app/plugins/datasource/loki/configuration/ConfigEditor.test.tsx
+++ b/public/app/plugins/datasource/loki/configuration/ConfigEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { createDefaultConfigOptions } from '../__mocks__/datasource';
diff --git a/public/app/plugins/datasource/loki/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/loki/configuration/ConfigEditor.tsx
index fe57f47d35c..2908238f7b6 100644
--- a/public/app/plugins/datasource/loki/configuration/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/loki/configuration/ConfigEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { DataSourcePluginOptionsEditorProps, DataSourceSettings } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/loki/configuration/DebugSection.test.tsx b/public/app/plugins/datasource/loki/configuration/DebugSection.test.tsx
index 8600c84362c..ce7b093f42e 100644
--- a/public/app/plugins/datasource/loki/configuration/DebugSection.test.tsx
+++ b/public/app/plugins/datasource/loki/configuration/DebugSection.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { DebugSection } from './DebugSection';
diff --git a/public/app/plugins/datasource/loki/configuration/DebugSection.tsx b/public/app/plugins/datasource/loki/configuration/DebugSection.tsx
index 15bb53aa3cb..bb1c87f44d9 100644
--- a/public/app/plugins/datasource/loki/configuration/DebugSection.tsx
+++ b/public/app/plugins/datasource/loki/configuration/DebugSection.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode, useState } from 'react';
+import { ReactNode, useState } from 'react';
import { getTemplateSrv } from '@grafana/runtime';
import { InlineField, TextArea } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/loki/configuration/DerivedField.test.tsx b/public/app/plugins/datasource/loki/configuration/DerivedField.test.tsx
index c708e74bc10..c8ab5d5eb0a 100644
--- a/public/app/plugins/datasource/loki/configuration/DerivedField.test.tsx
+++ b/public/app/plugins/datasource/loki/configuration/DerivedField.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { DataSourceInstanceSettings, DataSourcePluginMeta } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
diff --git a/public/app/plugins/datasource/loki/configuration/DerivedField.tsx b/public/app/plugins/datasource/loki/configuration/DerivedField.tsx
index c135c1458fe..15ec011f9db 100644
--- a/public/app/plugins/datasource/loki/configuration/DerivedField.tsx
+++ b/public/app/plugins/datasource/loki/configuration/DerivedField.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { ChangeEvent, useEffect, useState } from 'react';
+import { ChangeEvent, useEffect, useState } from 'react';
+import * as React from 'react';
import { usePrevious } from 'react-use';
import { GrafanaTheme2, DataSourceInstanceSettings, VariableSuggestion } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/configuration/DerivedFields.test.tsx b/public/app/plugins/datasource/loki/configuration/DerivedFields.test.tsx
index f8e5bc24d4f..ee13dc4174c 100644
--- a/public/app/plugins/datasource/loki/configuration/DerivedFields.test.tsx
+++ b/public/app/plugins/datasource/loki/configuration/DerivedFields.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { DerivedFields } from './DerivedFields';
diff --git a/public/app/plugins/datasource/loki/configuration/DerivedFields.tsx b/public/app/plugins/datasource/loki/configuration/DerivedFields.tsx
index a8c28adb780..2d6bbaf7d2b 100644
--- a/public/app/plugins/datasource/loki/configuration/DerivedFields.tsx
+++ b/public/app/plugins/datasource/loki/configuration/DerivedFields.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import { GrafanaTheme2, VariableOrigin, DataLinkBuiltInVars } from '@grafana/data';
import { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/loki/configuration/QuerySettings.tsx b/public/app/plugins/datasource/loki/configuration/QuerySettings.tsx
index 7cdbc8a2777..c5f956bf472 100644
--- a/public/app/plugins/datasource/loki/configuration/QuerySettings.tsx
+++ b/public/app/plugins/datasource/loki/configuration/QuerySettings.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.test.tsx
index 16ef915193a..6d298cc267e 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.test.tsx
@@ -1,5 +1,4 @@
import { render, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import { createLokiDatasource } from '../../__mocks__/datasource';
import { LokiDatasource } from '../../datasource';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.tsx
index c1bf43f385c..b1cc1d41ece 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LabelBrowserModal.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useState, useEffect } from 'react';
+import { useState, useEffect } from 'react';
import { CoreApp, GrafanaTheme2, LocalStorageValueProvider, TimeRange } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.test.tsx
index d6745f0ba89..853039fdd64 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.test.tsx
@@ -1,6 +1,6 @@
import { screen, render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
import { DataSourceApi } from '@grafana/data';
import { QueryBuilderOperation, QueryBuilderOperationParamDef } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.tsx
index b92c3bec3b2..f691a652e72 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { DataSourceApi, SelectableValue } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.test.tsx
index d7a5b3318b3..2fa9d9f1801 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, getAllByRole, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { dateTime } from '@grafana/data';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.tsx
index 1e0fee2efed..d364ae12dce 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilder.tsx
@@ -1,5 +1,5 @@
import { isEqual } from 'lodash';
-import React, { useEffect, useMemo, useState } from 'react';
+import { memo, useEffect, useMemo, useState } from 'react';
import { usePrevious } from 'react-use';
import { DataSourceApi, getDefaultTimeRange, LoadingState, PanelData, SelectableValue, TimeRange } from '@grafana/data';
@@ -39,172 +39,170 @@ export interface Props {
onChange: (update: LokiVisualQuery) => void;
onRunQuery: () => void;
}
-export const LokiQueryBuilder = React.memo(
- ({ datasource, query, onChange, onRunQuery, showExplain, timeRange }) => {
- const [sampleData, setSampleData] = useState();
- const [highlightedOp, setHighlightedOp] = useState(undefined);
- const prevQuery = usePrevious(query);
- const prevTimeRange = usePrevious(timeRange);
+export const LokiQueryBuilder = memo(({ datasource, query, onChange, onRunQuery, showExplain, timeRange }) => {
+ const [sampleData, setSampleData] = useState();
+ const [highlightedOp, setHighlightedOp] = useState(undefined);
+ const prevQuery = usePrevious(query);
+ const prevTimeRange = usePrevious(timeRange);
- const onChangeLabels = (labels: QueryBuilderLabelFilter[]) => {
- onChange({ ...query, labels });
- };
+ const onChangeLabels = (labels: QueryBuilderLabelFilter[]) => {
+ onChange({ ...query, labels });
+ };
- const withTemplateVariableOptions = async (optionsPromise: Promise): Promise => {
- const options = await optionsPromise;
- return [...datasource.getVariables(), ...options].map((value) => ({ label: value, value }));
- };
+ const withTemplateVariableOptions = async (optionsPromise: Promise): Promise => {
+ const options = await optionsPromise;
+ return [...datasource.getVariables(), ...options].map((value) => ({ label: value, value }));
+ };
- const onGetLabelNames = async (forLabel: Partial): Promise => {
- const labelsToConsider = query.labels.filter((x) => x !== forLabel);
+ const onGetLabelNames = async (forLabel: Partial): Promise => {
+ const labelsToConsider = query.labels.filter((x) => x !== forLabel);
- const hasEqualityOperation = labelsToConsider.find(
- (filter) => filter.op === '=' || (filter.op === '=~' && new RegExp(filter.value).test('') === false)
- );
- if (labelsToConsider.length === 0 || !hasEqualityOperation) {
- return await datasource.languageProvider.fetchLabels({ timeRange });
- }
+ const hasEqualityOperation = labelsToConsider.find(
+ (filter) => filter.op === '=' || (filter.op === '=~' && new RegExp(filter.value).test('') === false)
+ );
+ if (labelsToConsider.length === 0 || !hasEqualityOperation) {
+ return await datasource.languageProvider.fetchLabels({ timeRange });
+ }
+ const streamSelector = lokiQueryModeller.renderLabels(labelsToConsider);
+ const possibleLabelNames = await datasource.languageProvider.fetchLabels({
+ streamSelector,
+ timeRange,
+ });
+ const labelsNamesToConsider = labelsToConsider.map((l) => l.label);
+
+ // Filter out label names that are already selected
+ return possibleLabelNames.filter((label) => !labelsNamesToConsider.includes(label)).sort();
+ };
+
+ const onGetLabelValues = async (forLabel: Partial) => {
+ if (!forLabel.label) {
+ return [];
+ }
+
+ let values;
+ const labelsToConsider = query.labels.filter((x) => x !== forLabel);
+ // If we have no equality/regex operation with .*, we can't fetch series as it will throw an error, so we fetch label values
+ const hasEqualityOperation = labelsToConsider.find(
+ (filter) => filter.op === '=' || (filter.op === '=~' && new RegExp(filter.value).test('') === false)
+ );
+ if (labelsToConsider.length === 0 || !hasEqualityOperation) {
+ values = await datasource.languageProvider.fetchLabelValues(forLabel.label, { timeRange });
+ } else {
const streamSelector = lokiQueryModeller.renderLabels(labelsToConsider);
- const possibleLabelNames = await datasource.languageProvider.fetchLabels({
+ values = await datasource.languageProvider.fetchLabelValues(forLabel.label, {
streamSelector,
timeRange,
});
- const labelsNamesToConsider = labelsToConsider.map((l) => l.label);
+ }
- // Filter out label names that are already selected
- return possibleLabelNames.filter((label) => !labelsNamesToConsider.includes(label)).sort();
+ return values ? values.map((v) => escapeLabelValueInSelector(v, forLabel.op)) : []; // Escape values in return
+ };
+
+ const labelFilterRequired: boolean = useMemo(() => {
+ const { labels, operations: op } = query;
+ if (!labels.length && op.length) {
+ // Filter is required when operations are present (empty line contains operation is exception)
+ if (op.length === 1 && op[0].id === LokiOperationId.LineContains && op[0].params[0] === '') {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }, [query]);
+
+ useEffect(() => {
+ const onGetSampleData = async () => {
+ const lokiQuery = { expr: lokiQueryModeller.renderQuery(query), refId: 'data-samples' };
+ const range = timeRange ?? getDefaultTimeRange();
+ const series = await datasource.getDataSamples(lokiQuery, range);
+ const sampleData = { series, state: LoadingState.Done, timeRange: range };
+ setSampleData(sampleData);
};
- const onGetLabelValues = async (forLabel: Partial) => {
- if (!forLabel.label) {
- return [];
- }
+ const updateBasedOnChangedTimeRange =
+ prevTimeRange &&
+ timeRange &&
+ (Math.abs(timeRange.to.valueOf() - prevTimeRange.to.valueOf()) > TIME_SPAN_TO_TRIGGER_SAMPLES ||
+ Math.abs(timeRange.from.valueOf() - prevTimeRange.from.valueOf()) > TIME_SPAN_TO_TRIGGER_SAMPLES);
+ const updateBasedOnChangedQuery = !isEqual(prevQuery, query);
+ if (config.featureToggles.lokiQueryHints && (updateBasedOnChangedTimeRange || updateBasedOnChangedQuery)) {
+ onGetSampleData().catch(console.error);
+ }
+ }, [datasource, query, timeRange, prevQuery, prevTimeRange]);
- let values;
- const labelsToConsider = query.labels.filter((x) => x !== forLabel);
- // If we have no equality/regex operation with .*, we can't fetch series as it will throw an error, so we fetch label values
- const hasEqualityOperation = labelsToConsider.find(
- (filter) => filter.op === '=' || (filter.op === '=~' && new RegExp(filter.value).test('') === false)
- );
- if (labelsToConsider.length === 0 || !hasEqualityOperation) {
- values = await datasource.languageProvider.fetchLabelValues(forLabel.label, { timeRange });
- } else {
- const streamSelector = lokiQueryModeller.renderLabels(labelsToConsider);
- values = await datasource.languageProvider.fetchLabelValues(forLabel.label, {
- streamSelector,
- timeRange,
- });
- }
-
- return values ? values.map((v) => escapeLabelValueInSelector(v, forLabel.op)) : []; // Escape values in return
- };
-
- const labelFilterRequired: boolean = useMemo(() => {
- const { labels, operations: op } = query;
- if (!labels.length && op.length) {
- // Filter is required when operations are present (empty line contains operation is exception)
- if (op.length === 1 && op[0].id === LokiOperationId.LineContains && op[0].params[0] === '') {
- return false;
- }
- return true;
- }
- return false;
- }, [query]);
-
- useEffect(() => {
- const onGetSampleData = async () => {
- const lokiQuery = { expr: lokiQueryModeller.renderQuery(query), refId: 'data-samples' };
- const range = timeRange ?? getDefaultTimeRange();
- const series = await datasource.getDataSamples(lokiQuery, range);
- const sampleData = { series, state: LoadingState.Done, timeRange: range };
- setSampleData(sampleData);
- };
-
- const updateBasedOnChangedTimeRange =
- prevTimeRange &&
- timeRange &&
- (Math.abs(timeRange.to.valueOf() - prevTimeRange.to.valueOf()) > TIME_SPAN_TO_TRIGGER_SAMPLES ||
- Math.abs(timeRange.from.valueOf() - prevTimeRange.from.valueOf()) > TIME_SPAN_TO_TRIGGER_SAMPLES);
- const updateBasedOnChangedQuery = !isEqual(prevQuery, query);
- if (config.featureToggles.lokiQueryHints && (updateBasedOnChangedTimeRange || updateBasedOnChangedQuery)) {
- onGetSampleData().catch(console.error);
- }
- }, [datasource, query, timeRange, prevQuery, prevTimeRange]);
-
- const lang = { grammar: logqlGrammar, name: 'logql' };
- return (
-
-
- ) =>
- withTemplateVariableOptions(onGetLabelNames(forLabel))
- }
- onGetLabelValues={(forLabel: Partial) =>
- withTemplateVariableOptions(onGetLabelValues(forLabel))
- }
- labelsFilters={query.labels}
- onChange={onChangeLabels}
- labelFilterRequired={labelFilterRequired}
- />
-
- {showExplain && (
- }
- >
- {EXPLAIN_LABEL_FILTER_CONTENT}
-
- )}
-
-
- operation.id === LokiOperationId.LabelFilter && isConflictingFilter(operation, otherOperations)
- }
- />
-
- datasource={datasource}
- query={query}
- onChange={onChange}
- data={sampleData}
- queryModeller={lokiQueryModeller}
- buildVisualQueryFromString={buildVisualQueryFromString}
- buildDataQueryFromQueryString={(queryString) => ({ expr: queryString, refId: 'hints' })}
- buildQueryStringFromDataQuery={(query) => query.expr}
- />
-
- {showExplain && (
-
- stepNumber={2}
- queryModeller={lokiQueryModeller}
- query={query}
- language={lang}
- onMouseEnter={(op) => {
- setHighlightedOp(op);
- }}
- onMouseLeave={() => {
- setHighlightedOp(undefined);
- }}
- />
- )}
- {query.binaryQueries && query.binaryQueries.length > 0 && (
-
- )}
-
- );
- }
-);
+ const lang = { grammar: logqlGrammar, name: 'logql' };
+ return (
+
+
+ ) =>
+ withTemplateVariableOptions(onGetLabelNames(forLabel))
+ }
+ onGetLabelValues={(forLabel: Partial) =>
+ withTemplateVariableOptions(onGetLabelValues(forLabel))
+ }
+ labelsFilters={query.labels}
+ onChange={onChangeLabels}
+ labelFilterRequired={labelFilterRequired}
+ />
+
+ {showExplain && (
+ }
+ >
+ {EXPLAIN_LABEL_FILTER_CONTENT}
+
+ )}
+
+
+ operation.id === LokiOperationId.LabelFilter && isConflictingFilter(operation, otherOperations)
+ }
+ />
+
+ datasource={datasource}
+ query={query}
+ onChange={onChange}
+ data={sampleData}
+ queryModeller={lokiQueryModeller}
+ buildVisualQueryFromString={buildVisualQueryFromString}
+ buildDataQueryFromQueryString={(queryString) => ({ expr: queryString, refId: 'hints' })}
+ buildQueryStringFromDataQuery={(query) => query.expr}
+ />
+
+ {showExplain && (
+
+ stepNumber={2}
+ queryModeller={lokiQueryModeller}
+ query={query}
+ language={lang}
+ onMouseEnter={(op) => {
+ setHighlightedOp(op);
+ }}
+ onMouseLeave={() => {
+ setHighlightedOp(undefined);
+ }}
+ />
+ )}
+ {query.binaryQueries && query.binaryQueries.length > 0 && (
+
+ )}
+
+ );
+});
LokiQueryBuilder.displayName = 'LokiQueryBuilder';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.test.tsx
index 783155fdab8..29425688459 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor, findAllByRole } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { createLokiDatasource } from '../../__mocks__/datasource';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx
index b4715fee0a4..8063cb6d0bb 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderContainer.tsx
@@ -1,5 +1,5 @@
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
-import React, { useEffect, useReducer } from 'react';
+import { useEffect, useReducer } from 'react';
import { TimeRange } from '@grafana/data';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderExplained.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderExplained.tsx
index 68430e8c2cb..5af777c20e7 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderExplained.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderExplained.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { memo } from 'react';
import { OperationExplainedBox, OperationListExplained, RawQuery } from '@grafana/experimental';
import { Stack } from '@grafana/ui';
@@ -14,7 +14,7 @@ export interface Props {
query: string;
}
-export const LokiQueryBuilderExplained = React.memo(({ query }) => {
+export const LokiQueryBuilderExplained = memo(({ query }) => {
const visQuery = buildVisualQueryFromString(query || '').query;
const lang = { grammar: lokiGrammar, name: 'lokiql' };
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.test.tsx
index cdc80221e9f..fff5a79e352 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { LokiQuery, LokiQueryType } from '../../types';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx
index ad9b7ae80f1..ec5ed3a8569 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx
@@ -1,5 +1,6 @@
import { trim } from 'lodash';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
+import * as React from 'react';
import { CoreApp, isValidDuration, isValidGrafanaDuration, SelectableValue } from '@grafana/data';
import { EditorField, EditorRow, QueryOptionGroup } from '@grafana/experimental';
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 efa2c070d1f..c1ceab32eea 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { selectors } from '@grafana/e2e-selectors';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx
index fba03b1185a..05877c529b9 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.test.tsx
index 2c3a586fb00..768560002e3 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { createLokiDatasource } from '../../__mocks__/datasource';
import { LokiVisualQueryBinary } from '../types';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx b/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx
index dd08f32be0b..7ab95dcb781 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/NestedQuery.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import { memo } from 'react';
import { GrafanaTheme2, toOption } from '@grafana/data';
import { EditorRows, FlexItem } from '@grafana/experimental';
@@ -21,7 +21,7 @@ export interface Props {
onRunQuery: () => void;
}
-export const NestedQuery = React.memo(
+export const NestedQuery = memo(
({ nestedQuery, index, datasource, onChange, onRemove, onRunQuery, showExplain }) => {
const styles = useStyles2(getStyles);
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.test.tsx
index 623a44cbea8..ce281f06b43 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { createLokiDatasource } from '../../__mocks__/datasource';
import { LokiDatasource } from '../../datasource';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.tsx b/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.tsx
index 4bf7af82923..d5986c2aff3 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/NestedQueryList.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { Stack } from '@grafana/ui';
import { LokiDatasource } from '../../datasource';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/QueryPattern.tsx b/public/app/plugins/datasource/loki/querybuilder/components/QueryPattern.tsx
index 3407c447345..27fe4fe9831 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/QueryPattern.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/QueryPattern.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { RawQuery } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.test.tsx
index b6e986c1079..8a65ba2ac29 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { lokiQueryModeller } from '../LokiQueryModeller';
import { LokiQueryPatternType } from '../types';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.tsx b/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.tsx
index a8e0748cf22..7453341218f 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/QueryPatternsModal.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { capitalize } from 'lodash';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { CoreApp, GrafanaTheme2, getNextRefId } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/QueryPreview.tsx b/public/app/plugins/datasource/loki/querybuilder/components/QueryPreview.tsx
index 04fffba21ae..e5f5b51a482 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/QueryPreview.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/QueryPreview.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { EditorRow, EditorFieldGroup, RawQuery } from '@grafana/experimental';
import { lokiGrammar } from '../../syntax';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.test.tsx b/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.test.tsx
index 3c5f98e2cbe..467808c92a1 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.test.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.test.tsx
@@ -1,6 +1,6 @@
import { screen, render } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
import { DataFrame, DataSourceApi, FieldType, toDataFrame } from '@grafana/data';
import { QueryBuilderOperation, QueryBuilderOperationParamDef } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.tsx b/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.tsx
index 030b3235666..c50b8b5ae54 100644
--- a/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.tsx
+++ b/public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { SelectableValue, getDefaultTimeRange, toOption } from '@grafana/data';
import { QueryBuilderOperationParamEditorProps, VisualQueryModeller } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/mssql/CheatSheet.tsx b/public/app/plugins/datasource/mssql/CheatSheet.tsx
index 73849ec7a31..8ca5aeeed24 100644
--- a/public/app/plugins/datasource/mssql/CheatSheet.tsx
+++ b/public/app/plugins/datasource/mssql/CheatSheet.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/mssql/azureauth/AzureAuthSettings.tsx b/public/app/plugins/datasource/mssql/azureauth/AzureAuthSettings.tsx
index a47198c7548..9e2271e720c 100644
--- a/public/app/plugins/datasource/mssql/azureauth/AzureAuthSettings.tsx
+++ b/public/app/plugins/datasource/mssql/azureauth/AzureAuthSettings.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { useEffectOnce } from 'react-use';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx b/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx
index 5c6e31af1b3..86d28a6c825 100644
--- a/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx
+++ b/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx
@@ -1,4 +1,4 @@
-import React, { ChangeEvent } from 'react';
+import { ChangeEvent } from 'react';
import { SelectableValue } from '@grafana/data';
import { Button, Field, Select, Input } from '@grafana/ui/src/components';
diff --git a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx
index be0ed607137..1fc0152f8e7 100644
--- a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx
+++ b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { SyntheticEvent } from 'react';
+import { SyntheticEvent } from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx b/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx
index a73b6eb1a19..f5dfc8759c3 100644
--- a/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx
+++ b/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx
@@ -1,4 +1,4 @@
-import React, { SyntheticEvent } from 'react';
+import { SyntheticEvent } from 'react';
import { DataSourcePluginOptionsEditorProps, updateDatasourcePluginJsonDataOption } from '@grafana/data';
import { ConfigSubSection } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/mysql/CheatSheet.tsx b/public/app/plugins/datasource/mysql/CheatSheet.tsx
index febfdbdad2a..daa76e45685 100644
--- a/public/app/plugins/datasource/mysql/CheatSheet.tsx
+++ b/public/app/plugins/datasource/mysql/CheatSheet.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/mysql/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/mysql/configuration/ConfigurationEditor.tsx
index c0feed4629b..95dabda1c76 100644
--- a/public/app/plugins/datasource/mysql/configuration/ConfigurationEditor.tsx
+++ b/public/app/plugins/datasource/mysql/configuration/ConfigurationEditor.tsx
@@ -1,4 +1,4 @@
-import React, { SyntheticEvent, useState } from 'react';
+import { SyntheticEvent, useState } from 'react';
import {
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/mysql/tsconfig.json b/public/app/plugins/datasource/mysql/tsconfig.json
index 7daf2ee8aba..baaaea04185 100644
--- a/public/app/plugins/datasource/mysql/tsconfig.json
+++ b/public/app/plugins/datasource/mysql/tsconfig.json
@@ -1,4 +1,7 @@
{
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ },
"extends": "@grafana/plugin-configs/tsconfig.json",
"include": ["."]
}
diff --git a/public/app/plugins/datasource/opentsdb/components/AnnotationEditor.tsx b/public/app/plugins/datasource/opentsdb/components/AnnotationEditor.tsx
index 80c69846b8a..d6fbfd8b8c4 100644
--- a/public/app/plugins/datasource/opentsdb/components/AnnotationEditor.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/AnnotationEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { QueryEditorProps } from '@grafana/data';
import { InlineFormLabel, Input, InlineSwitch } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/opentsdb/components/ConfigEditor.tsx b/public/app/plugins/datasource/opentsdb/components/ConfigEditor.tsx
index aa0feefac35..70e2e870ed4 100644
--- a/public/app/plugins/datasource/opentsdb/components/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/ConfigEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { DataSourcePluginOptionsEditorProps } from '@grafana/data';
import { config } from '@grafana/runtime';
import { DataSourceHttpSettings } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/opentsdb/components/DownSample.test.tsx b/public/app/plugins/datasource/opentsdb/components/DownSample.test.tsx
index 3f903d10ec4..1a3a12c063b 100644
--- a/public/app/plugins/datasource/opentsdb/components/DownSample.test.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/DownSample.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/DownSample.tsx b/public/app/plugins/datasource/opentsdb/components/DownSample.tsx
index 74911259d50..b4058908832 100644
--- a/public/app/plugins/datasource/opentsdb/components/DownSample.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/DownSample.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { toOption } from '@grafana/data';
import { InlineLabel, Select, Input, InlineFormLabel, InlineSwitch, Stack } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/opentsdb/components/FilterSection.test.tsx b/public/app/plugins/datasource/opentsdb/components/FilterSection.test.tsx
index 09a45fb9ec3..607145fe338 100644
--- a/public/app/plugins/datasource/opentsdb/components/FilterSection.test.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/FilterSection.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/FilterSection.tsx b/public/app/plugins/datasource/opentsdb/components/FilterSection.tsx
index 86c1d0a917f..9fbe719a366 100644
--- a/public/app/plugins/datasource/opentsdb/components/FilterSection.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/FilterSection.tsx
@@ -1,6 +1,6 @@
import debounce from 'debounce-promise';
import { size } from 'lodash';
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/opentsdb/components/MetricSection.test.tsx b/public/app/plugins/datasource/opentsdb/components/MetricSection.test.tsx
index f95c5b9860f..93f1f3c84e6 100644
--- a/public/app/plugins/datasource/opentsdb/components/MetricSection.test.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/MetricSection.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx b/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx
index a76ff1b4422..5c62f2ecf06 100644
--- a/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/MetricSection.tsx
@@ -1,5 +1,4 @@
import debounce from 'debounce-promise';
-import React from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import { Select, Input, InlineFormLabel, AsyncSelect, Stack, InlineLabel } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/opentsdb/components/OpenTsdbDetails.tsx b/public/app/plugins/datasource/opentsdb/components/OpenTsdbDetails.tsx
index fa7c5955d25..ba45bde7b29 100644
--- a/public/app/plugins/datasource/opentsdb/components/OpenTsdbDetails.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/OpenTsdbDetails.tsx
@@ -1,4 +1,4 @@
-import React, { SyntheticEvent, useId } from 'react';
+import { SyntheticEvent, useId } from 'react';
import { DataSourceSettings, SelectableValue } from '@grafana/data';
import { Select, Input, Field, FieldSet } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.test.tsx b/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.test.tsx
index ca0e6107130..9e12e1ab69e 100644
--- a/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import OpenTsDatasource from '../datasource';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.tsx b/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.tsx
index bdf57dbfbb4..742701d9feb 100644
--- a/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/OpenTsdbQueryEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { GrafanaTheme2, QueryEditorProps, textUtil } from '@grafana/data';
import { useStyles2, Stack } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/opentsdb/components/RateSection.test.tsx b/public/app/plugins/datasource/opentsdb/components/RateSection.test.tsx
index a5b8bf07ee0..1c4e05e5d2c 100644
--- a/public/app/plugins/datasource/opentsdb/components/RateSection.test.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/RateSection.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/RateSection.tsx b/public/app/plugins/datasource/opentsdb/components/RateSection.tsx
index e2f9e221eeb..e9e2c54dda1 100644
--- a/public/app/plugins/datasource/opentsdb/components/RateSection.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/RateSection.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { InlineLabel, Input, InlineFormLabel, InlineSwitch, Stack } from '@grafana/ui';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/TagSection.test.tsx b/public/app/plugins/datasource/opentsdb/components/TagSection.test.tsx
index 65d181d3a9d..56c438bb841 100644
--- a/public/app/plugins/datasource/opentsdb/components/TagSection.test.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/TagSection.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react';
-import React from 'react';
import { OpenTsdbQuery } from '../types';
diff --git a/public/app/plugins/datasource/opentsdb/components/TagSection.tsx b/public/app/plugins/datasource/opentsdb/components/TagSection.tsx
index 6ffe4b0fc61..0675056a498 100644
--- a/public/app/plugins/datasource/opentsdb/components/TagSection.tsx
+++ b/public/app/plugins/datasource/opentsdb/components/TagSection.tsx
@@ -1,6 +1,6 @@
import debounce from 'debounce-promise';
import { has, size } from 'lodash';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { SelectableValue, toOption } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/parca/ConfigEditor.tsx b/public/app/plugins/datasource/parca/ConfigEditor.tsx
index 9332d4cea4d..32d61acd0b7 100644
--- a/public/app/plugins/datasource/parca/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/parca/ConfigEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/parca/QueryEditor/EditorRow.tsx b/public/app/plugins/datasource/parca/QueryEditor/EditorRow.tsx
index 5fe10a24999..a45add59216 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/EditorRow.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/EditorRow.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/parca/QueryEditor/EditorRows.tsx b/public/app/plugins/datasource/parca/QueryEditor/EditorRows.tsx
index ce7e38c112a..de79a2b079c 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/EditorRows.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/EditorRows.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { Stack } from './Stack';
diff --git a/public/app/plugins/datasource/parca/QueryEditor/LabelsEditor.tsx b/public/app/plugins/datasource/parca/QueryEditor/LabelsEditor.tsx
index d9e0c34c833..3f97efc01a0 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/LabelsEditor.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/LabelsEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useRef } from 'react';
+import { useEffect, useRef } from 'react';
import { useLatest } from 'react-use';
import { CodeEditor, Monaco, useStyles2, monacoTypes } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.test.tsx b/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.test.tsx
index d9bcac8a2f1..fce58dec7fd 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.test.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { of } from 'rxjs';
import { CoreApp, DataSourcePluginMeta, PluginType } from '@grafana/data';
diff --git a/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.tsx b/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.tsx
index d470a5d5e0d..cab66185f53 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/QueryEditor.tsx
@@ -1,5 +1,5 @@
import { defaults } from 'lodash';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { useMount } from 'react-use';
import { CoreApp, QueryEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/datasource/parca/QueryEditor/QueryOptions.tsx b/public/app/plugins/datasource/parca/QueryEditor/QueryOptions.tsx
index e6cecc4a43a..ab8b50c69cf 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/QueryOptions.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/QueryOptions.tsx
@@ -1,5 +1,4 @@
import { css, cx } from '@emotion/css';
-import React from 'react';
import { useToggle } from 'react-use';
import { CoreApp, GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/parca/QueryEditor/Stack.tsx b/public/app/plugins/datasource/parca/QueryEditor/Stack.tsx
index 51ba00444c9..483af932c05 100644
--- a/public/app/plugins/datasource/parca/QueryEditor/Stack.tsx
+++ b/public/app/plugins/datasource/parca/QueryEditor/Stack.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { CSSProperties } from 'react';
+import { CSSProperties } from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/parca/tsconfig.json b/public/app/plugins/datasource/parca/tsconfig.json
index 7daf2ee8aba..baaaea04185 100644
--- a/public/app/plugins/datasource/parca/tsconfig.json
+++ b/public/app/plugins/datasource/parca/tsconfig.json
@@ -1,4 +1,7 @@
{
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ },
"extends": "@grafana/plugin-configs/tsconfig.json",
"include": ["."]
}
diff --git a/public/app/plugins/datasource/prometheus/configuration/AzureAuthSettings.tsx b/public/app/plugins/datasource/prometheus/configuration/AzureAuthSettings.tsx
index a0bc389ac23..95df6d3eaf5 100644
--- a/public/app/plugins/datasource/prometheus/configuration/AzureAuthSettings.tsx
+++ b/public/app/plugins/datasource/prometheus/configuration/AzureAuthSettings.tsx
@@ -1,5 +1,5 @@
import { cx } from '@emotion/css';
-import React, { FormEvent, useMemo, useState } from 'react';
+import { FormEvent, useMemo, useState } from 'react';
import { useEffectOnce } from 'react-use';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.test.tsx b/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.test.tsx
index ee4b0e3f6ec..30ead47840b 100644
--- a/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.test.tsx
+++ b/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import AzureCredentialsForm, { Props } from './AzureCredentialsForm';
diff --git a/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.tsx b/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.tsx
index 7140dc34b62..9bd461a8311 100644
--- a/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.tsx
+++ b/public/app/plugins/datasource/prometheus/configuration/AzureCredentialsForm.tsx
@@ -1,5 +1,5 @@
import { cx } from '@emotion/css';
-import React, { ChangeEvent, useEffect, useMemo, useReducer, useState } from 'react';
+import { ChangeEvent, useEffect, useMemo, useReducer, useState } from 'react';
import { SelectableValue } from '@grafana/data';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/prometheus/configuration/ConfigEditorPackage.tsx b/public/app/plugins/datasource/prometheus/configuration/ConfigEditorPackage.tsx
index 1353f033e38..1625122eb24 100644
--- a/public/app/plugins/datasource/prometheus/configuration/ConfigEditorPackage.tsx
+++ b/public/app/plugins/datasource/prometheus/configuration/ConfigEditorPackage.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { SIGV4ConnectionConfig } from '@grafana/aws-sdk';
import { DataSourcePluginOptionsEditorProps, DataSourceSettings, GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/prometheus/configuration/DataSourceHttpSettingsOverhaulPackage.tsx b/public/app/plugins/datasource/prometheus/configuration/DataSourceHttpSettingsOverhaulPackage.tsx
index 5054e96de51..3f32a9c6035 100644
--- a/public/app/plugins/datasource/prometheus/configuration/DataSourceHttpSettingsOverhaulPackage.tsx
+++ b/public/app/plugins/datasource/prometheus/configuration/DataSourceHttpSettingsOverhaulPackage.tsx
@@ -1,4 +1,5 @@
-import React, { ReactElement, useState } from 'react';
+import { ReactElement, useState } from 'react';
+import * as React from 'react';
import { DataSourceSettings } from '@grafana/data';
import { Auth, ConnectionSettings, convertLegacyAuthProps, AuthMethod } from '@grafana/experimental';
diff --git a/public/app/plugins/datasource/tempo/CheatSheet.tsx b/public/app/plugins/datasource/tempo/CheatSheet.tsx
index a8d98f51f10..01d54075b54 100644
--- a/public/app/plugins/datasource/tempo/CheatSheet.tsx
+++ b/public/app/plugins/datasource/tempo/CheatSheet.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { config, reportInteraction } from '@grafana/runtime';
import { TextLink } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/QueryField.tsx b/public/app/plugins/datasource/tempo/QueryField.tsx
index 0884e297bd9..a2b89b415bb 100644
--- a/public/app/plugins/datasource/tempo/QueryField.tsx
+++ b/public/app/plugins/datasource/tempo/QueryField.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import { PureComponent } from 'react';
import { QueryEditorProps, SelectableValue } from '@grafana/data';
import { config, reportInteraction } from '@grafana/runtime';
@@ -35,7 +35,7 @@ interface State {
// data link should open the traceql tab and run a search based on the configured query.
const DEFAULT_QUERY_TYPE: TempoQueryType = 'traceql';
-class TempoQueryFieldComponent extends React.PureComponent {
+class TempoQueryFieldComponent extends PureComponent {
constructor(props: Props) {
super(props);
this.state = {
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx
index deea6014dab..9e4463d35c4 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/DurationInput.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { Select, HorizontalGroup, Input, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.test.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.test.tsx
index 914289d63f9..02e8b7190fc 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.test.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.test.tsx
@@ -1,6 +1,6 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { TraceqlSearchScope } from '../dataquery.gen';
import { TempoDatasource } from '../datasource';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.tsx
index 4f93c941b18..dc1c3565d4f 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/GroupByField.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import { v4 as uuidv4 } from 'uuid';
import { GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/InlineSearchField.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/InlineSearchField.tsx
index abe948dddcd..d4b0678069f 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/InlineSearchField.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/InlineSearchField.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { InlineFieldRow, InlineField } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.test.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.test.tsx
index 6870c0533e0..65bfe28381f 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.test.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.test.tsx
@@ -1,6 +1,5 @@
import { act, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { LanguageProvider } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx
index fc558e0c581..049ab7a41b8 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/SearchField.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { uniq } from 'lodash';
-import React, { useState, useEffect, useMemo } from 'react';
+import { useState, useEffect, useMemo } from 'react';
import useAsync from 'react-use/lib/useAsync';
import { SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx
index 1552be76f29..bc896a39a89 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen';
import { TempoDatasource } from '../datasource';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.tsx
index 5b4541960dc..31afd82f7c6 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useCallback, useEffect } from 'react';
+import { useCallback, useEffect } from 'react';
import { v4 as uuidv4 } from 'uuid';
import { GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.test.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.test.tsx
index 698009d24f2..696529261a6 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.test.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.test.tsx
@@ -1,6 +1,6 @@
import { act, render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx
index 5494ca18b99..6a94b728784 100644
--- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx
+++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TraceQLSearch.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
import { CoreApp, GrafanaTheme2 } from '@grafana/data';
import { TemporaryAlert } from '@grafana/o11y-ds-frontend';
diff --git a/public/app/plugins/datasource/tempo/ServiceGraphSection.tsx b/public/app/plugins/datasource/tempo/ServiceGraphSection.tsx
index 6b770fb5c19..0879eaadc28 100644
--- a/public/app/plugins/datasource/tempo/ServiceGraphSection.tsx
+++ b/public/app/plugins/datasource/tempo/ServiceGraphSection.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import useAsync from 'react-use/lib/useAsync';
import { GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/tempo/VariableQueryEditor.test.tsx
index 3d5554775a5..700c2defc36 100644
--- a/public/app/plugins/datasource/tempo/VariableQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/tempo/VariableQueryEditor.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { TemplateSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/tempo/VariableQueryEditor.tsx b/public/app/plugins/datasource/tempo/VariableQueryEditor.tsx
index b150c7e3381..5681134baed 100644
--- a/public/app/plugins/datasource/tempo/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/tempo/VariableQueryEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { DataQuery, SelectableValue } from '@grafana/data';
import { InlineField, InlineFieldRow, Select } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilter.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilter.tsx
index 8e3a34183cc..06f5757872c 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilter.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilter.tsx
@@ -1,4 +1,4 @@
-import React, { PureComponent, ReactNode } from 'react';
+import { Fragment, PureComponent, ReactNode } from 'react';
import { AdHocVariableFilter, DataSourceRef, SelectableValue } from '@grafana/data';
import { Segment } from '@grafana/ui';
@@ -88,7 +88,7 @@ export class AdHocFilter extends PureComponent {
renderFilterSegments(filter: AdHocVariableFilter, index: number, disabled?: boolean) {
return (
-
+
{
onValueChange={this.onChange(index, 'value')}
allFilters={this.getAllFilters()}
/>
-
+
);
}
}
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterBuilder.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterBuilder.tsx
index 956b2568201..816f09b8d69 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterBuilder.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterBuilder.tsx
@@ -1,5 +1,6 @@
import i18n from 'i18next';
-import React, { useCallback, useState } from 'react';
+import { useCallback, useState } from 'react';
+import * as React from 'react';
import { AdHocVariableFilter, DataSourceRef, SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterKey.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterKey.tsx
index fb57eb9d7f8..8acc4ae685e 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterKey.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterKey.tsx
@@ -1,4 +1,4 @@
-import React, { ReactElement } from 'react';
+import { ReactElement } from 'react';
import { AdHocVariableFilter, DataSourceRef, SelectableValue } from '@grafana/data';
import { getDataSourceSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterRenderer.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterRenderer.tsx
index 1a5c8fd0054..6c658f5d18a 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterRenderer.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterRenderer.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { AdHocVariableFilter, DataSourceRef, SelectableValue } from '@grafana/data';
import { AdHocFilterKey } from './AdHocFilterKey';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterValue.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterValue.tsx
index 3c2e23dbd7c..09a44d50e5d 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterValue.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/AdHocFilterValue.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { AdHocVariableFilter, DataSourceRef, SelectableValue, getDefaultTimeRange } from '@grafana/data';
// import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';
import { getDataSourceSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/ConditionSegment.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/ConditionSegment.tsx
index 4c47fd73433..c4db252ad26 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/ConditionSegment.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/ConditionSegment.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
interface Props {
label: string;
}
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/OperatorSegment.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/OperatorSegment.tsx
index b8646b466e6..20cbd6e29ff 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/OperatorSegment.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/components/AdHocFilter/OperatorSegment.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { Segment } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/QueryOptionGroup.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/QueryOptionGroup.tsx
index d2187f26dde..f8b6a4273a3 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/QueryOptionGroup.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/QueryOptionGroup.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { useToggle } from 'react-use';
import { getValueFormat, GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx
index 4d1f727e9f3..60b0d6fd765 100644
--- a/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx
+++ b/public/app/plugins/datasource/tempo/_importedDependencies/datasources/prometheus/RawQuery.tsx
@@ -1,6 +1,5 @@
import { css, cx } from '@emotion/css';
import Prism, { Grammar } from 'prismjs';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data/src';
import { useTheme2 } from '@grafana/ui/src';
diff --git a/public/app/plugins/datasource/tempo/configuration/ConfigEditor.tsx b/public/app/plugins/datasource/tempo/configuration/ConfigEditor.tsx
index 324627f5875..6dcca3cea3d 100644
--- a/public/app/plugins/datasource/tempo/configuration/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/tempo/configuration/ConfigEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/tempo/configuration/QuerySettings.tsx b/public/app/plugins/datasource/tempo/configuration/QuerySettings.tsx
index 85adf08d72d..c2e8ed53964 100644
--- a/public/app/plugins/datasource/tempo/configuration/QuerySettings.tsx
+++ b/public/app/plugins/datasource/tempo/configuration/QuerySettings.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { DataSourcePluginOptionsEditorProps, GrafanaTheme2, updateDatasourcePluginJsonDataOption } from '@grafana/data';
import { IntervalInput, invalidTimeShiftError } from '@grafana/o11y-ds-frontend';
diff --git a/public/app/plugins/datasource/tempo/configuration/SearchSettings.tsx b/public/app/plugins/datasource/tempo/configuration/SearchSettings.tsx
index e8cb9280859..620ec9bd1e2 100644
--- a/public/app/plugins/datasource/tempo/configuration/SearchSettings.tsx
+++ b/public/app/plugins/datasource/tempo/configuration/SearchSettings.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { DataSourcePluginOptionsEditorProps, updateDatasourcePluginJsonDataOption } from '@grafana/data';
import { InlineField, InlineFieldRow, InlineSwitch, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/configuration/ServiceGraphSettings.tsx b/public/app/plugins/datasource/tempo/configuration/ServiceGraphSettings.tsx
index b19515e9fc6..31016057bd4 100644
--- a/public/app/plugins/datasource/tempo/configuration/ServiceGraphSettings.tsx
+++ b/public/app/plugins/datasource/tempo/configuration/ServiceGraphSettings.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import {
DataSourceInstanceSettings,
DataSourcePluginOptionsEditorProps,
diff --git a/public/app/plugins/datasource/tempo/configuration/TraceQLSearchSettings.tsx b/public/app/plugins/datasource/tempo/configuration/TraceQLSearchSettings.tsx
index 3cc7390b501..929dc92a4ac 100644
--- a/public/app/plugins/datasource/tempo/configuration/TraceQLSearchSettings.tsx
+++ b/public/app/plugins/datasource/tempo/configuration/TraceQLSearchSettings.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import useAsync from 'react-use/lib/useAsync';
import { DataSourcePluginOptionsEditorProps, updateDatasourcePluginJsonDataOption } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/configuration/TraceQLSearchTags.tsx b/public/app/plugins/datasource/tempo/configuration/TraceQLSearchTags.tsx
index aa8ce1924bc..3df13d4e565 100644
--- a/public/app/plugins/datasource/tempo/configuration/TraceQLSearchTags.tsx
+++ b/public/app/plugins/datasource/tempo/configuration/TraceQLSearchTags.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect } from 'react';
+import { useCallback, useEffect } from 'react';
import useAsync from 'react-use/lib/useAsync';
import { DataSourcePluginOptionsEditorProps, updateDatasourcePluginJsonDataOption } from '@grafana/data';
diff --git a/public/app/plugins/datasource/tempo/traceql/QueryEditor.tsx b/public/app/plugins/datasource/tempo/traceql/QueryEditor.tsx
index 7e5f7e024e8..1259a9becc0 100644
--- a/public/app/plugins/datasource/tempo/traceql/QueryEditor.tsx
+++ b/public/app/plugins/datasource/tempo/traceql/QueryEditor.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { defaults } from 'lodash';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { GrafanaTheme2, QueryEditorProps } from '@grafana/data';
import { config, reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx b/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx
index d4e40701ffb..5723032aae2 100644
--- a/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx
+++ b/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { EditorField, EditorRow } from '@grafana/experimental';
import { AutoSizeInput, RadioButtonGroup } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx b/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx
index 3f40bc006ac..18ccc82b0dc 100644
--- a/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx
+++ b/public/app/plugins/datasource/tempo/traceql/TraceQLEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useRef, useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { TemporaryAlert } from '@grafana/o11y-ds-frontend';
diff --git a/public/app/plugins/datasource/tempo/tsconfig.json b/public/app/plugins/datasource/tempo/tsconfig.json
index 6dc8a770cba..40352099203 100644
--- a/public/app/plugins/datasource/tempo/tsconfig.json
+++ b/public/app/plugins/datasource/tempo/tsconfig.json
@@ -1,5 +1,6 @@
{
"compilerOptions": {
+ "jsx": "react-jsx",
"types": ["node", "jest", "@testing-library/jest-dom"]
},
"extends": "@grafana/plugin-configs/tsconfig.json",
diff --git a/public/app/plugins/datasource/zipkin/ConfigEditor.tsx b/public/app/plugins/datasource/zipkin/ConfigEditor.tsx
index bb9c440aafe..f66965bd452 100644
--- a/public/app/plugins/datasource/zipkin/ConfigEditor.tsx
+++ b/public/app/plugins/datasource/zipkin/ConfigEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';
import {
diff --git a/public/app/plugins/datasource/zipkin/QueryField.test.tsx b/public/app/plugins/datasource/zipkin/QueryField.test.tsx
index ee8c90b6a56..04f638e3688 100644
--- a/public/app/plugins/datasource/zipkin/QueryField.test.tsx
+++ b/public/app/plugins/datasource/zipkin/QueryField.test.tsx
@@ -1,5 +1,4 @@
import { act, render, renderHook, screen, waitFor } from '@testing-library/react';
-import React from 'react';
import { CascaderOption } from '@grafana/ui';
diff --git a/public/app/plugins/datasource/zipkin/QueryField.tsx b/public/app/plugins/datasource/zipkin/QueryField.tsx
index 40e04968c60..c79ee92307b 100644
--- a/public/app/plugins/datasource/zipkin/QueryField.tsx
+++ b/public/app/plugins/datasource/zipkin/QueryField.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { fromPairs } from 'lodash';
-import React, { useCallback, useEffect, useMemo, useState } from 'react';
+import { useCallback, useEffect, useMemo, useState } from 'react';
import { useAsyncFn, useMount, useMountedState } from 'react-use';
import { AsyncState } from 'react-use/lib/useAsyncFn';
diff --git a/public/app/plugins/datasource/zipkin/tsconfig.json b/public/app/plugins/datasource/zipkin/tsconfig.json
index 6dc8a770cba..40352099203 100644
--- a/public/app/plugins/datasource/zipkin/tsconfig.json
+++ b/public/app/plugins/datasource/zipkin/tsconfig.json
@@ -1,5 +1,6 @@
{
"compilerOptions": {
+ "jsx": "react-jsx",
"types": ["node", "jest", "@testing-library/jest-dom"]
},
"extends": "@grafana/plugin-configs/tsconfig.json",
diff --git a/public/app/plugins/panel/alertlist/AlertInstances.tsx b/public/app/plugins/panel/alertlist/AlertInstances.tsx
index c7b289690c6..be32a39d5ef 100644
--- a/public/app/plugins/panel/alertlist/AlertInstances.tsx
+++ b/public/app/plugins/panel/alertlist/AlertInstances.tsx
@@ -1,7 +1,7 @@
import { css, cx } from '@emotion/css';
import { noop } from 'lodash';
import pluralize from 'pluralize';
-import React, { useCallback, useEffect, useMemo, useState } from 'react';
+import { useCallback, useEffect, useMemo, useState } from 'react';
import { GrafanaTheme2, PanelProps } from '@grafana/data';
import { Button, clearButtonStyles, Icon, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx b/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx
index dcf90a7f5b0..30b54432538 100644
--- a/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx
+++ b/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx
@@ -1,5 +1,5 @@
import { isEmpty, uniq } from 'lodash';
-import React, { useEffect, useMemo } from 'react';
+import { useEffect, useMemo } from 'react';
import { SelectableValue } from '@grafana/data';
import { Icon, MultiSelect } from '@grafana/ui';
diff --git a/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx b/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx
index c6676c6ad42..0e0b3ce4fc6 100644
--- a/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx
+++ b/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { sortBy } from 'lodash';
-import React, { useEffect, useMemo } from 'react';
+import { useEffect, useMemo } from 'react';
import { useEffectOnce, useToggle } from 'react-use';
import { GrafanaTheme2, PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/alertlist/UnifiedalertList.test.tsx b/public/app/plugins/panel/alertlist/UnifiedalertList.test.tsx
index bc8430d453a..203dfa5ae20 100644
--- a/public/app/plugins/panel/alertlist/UnifiedalertList.test.tsx
+++ b/public/app/plugins/panel/alertlist/UnifiedalertList.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { Provider } from 'react-redux';
import { byRole, byText } from 'testing-library-selector';
diff --git a/public/app/plugins/panel/alertlist/module.tsx b/public/app/plugins/panel/alertlist/module.tsx
index 23b2f000b5a..9ec66e40984 100644
--- a/public/app/plugins/panel/alertlist/module.tsx
+++ b/public/app/plugins/panel/alertlist/module.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { DataSourceInstanceSettings, PanelPlugin } from '@grafana/data';
import { Button, Stack } from '@grafana/ui';
import { OldFolderPicker } from 'app/core/components/Select/OldFolderPicker';
diff --git a/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.test.tsx b/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.test.tsx
index 148c0c9f485..c7d2cb17d6b 100644
--- a/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.test.tsx
+++ b/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { CombinedRuleWithLocation } from 'app/types/unified-alerting';
import { PromRuleType } from 'app/types/unified-alerting-dto';
diff --git a/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.tsx b/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.tsx
index fbdb1b71db6..9af4dc430b8 100644
--- a/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.tsx
+++ b/public/app/plugins/panel/alertlist/unified-alerting/GroupedView.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { useStyles2 } from '@grafana/ui';
import { AlertLabel } from 'app/features/alerting/unified/components/AlertLabel';
diff --git a/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx b/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx
index bfa92a15ec0..0790e77cd07 100644
--- a/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx
+++ b/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx
@@ -1,5 +1,4 @@
import { css, cx } from '@emotion/css';
-import React from 'react';
import { useLocation } from 'react-use';
import { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';
diff --git a/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx b/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx
index a96e2c1fe03..1c9dbd45abc 100644
--- a/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx
+++ b/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { AnnotationEvent, FieldConfigSource, getDefaultTimeRange, LoadingState } from '@grafana/data';
import { locationService } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/annolist/AnnoListPanel.tsx b/public/app/plugins/panel/annolist/AnnoListPanel.tsx
index b43aae06250..b188cb5e228 100644
--- a/public/app/plugins/panel/annolist/AnnoListPanel.tsx
+++ b/public/app/plugins/panel/annolist/AnnoListPanel.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { PureComponent } from 'react';
+import { createRef, PureComponent } from 'react';
import { Subscription } from 'rxjs';
import {
@@ -38,7 +38,7 @@ interface State {
export class AnnoListPanel extends PureComponent {
style = getStyles(config.theme2);
subs = new Subscription();
- tagListRef = React.createRef();
+ tagListRef = createRef();
constructor(props: Props) {
super(props);
diff --git a/public/app/plugins/panel/annolist/AnnotationListItem.tsx b/public/app/plugins/panel/annolist/AnnotationListItem.tsx
index a90fc53ce03..4731081b03a 100644
--- a/public/app/plugins/panel/annolist/AnnotationListItem.tsx
+++ b/public/app/plugins/panel/annolist/AnnotationListItem.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { MouseEvent } from 'react';
+import { MouseEvent } from 'react';
import { AnnotationEvent, DateTimeInput, GrafanaTheme2, PanelProps } from '@grafana/data';
import { Card, TagList, Tooltip, RenderUserContentAsHTML, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/annolist/module.tsx b/public/app/plugins/panel/annolist/module.tsx
index e914b3fad98..2c402b7da94 100644
--- a/public/app/plugins/panel/annolist/module.tsx
+++ b/public/app/plugins/panel/annolist/module.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { PanelModel, PanelPlugin } from '@grafana/data';
import { TagsInput } from '@grafana/ui';
diff --git a/public/app/plugins/panel/barchart/BarChartLegend.tsx b/public/app/plugins/panel/barchart/BarChartLegend.tsx
index a5230e096d0..dd13d2301ba 100644
--- a/public/app/plugins/panel/barchart/BarChartLegend.tsx
+++ b/public/app/plugins/panel/barchart/BarChartLegend.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import { memo } from 'react';
import { DataFrame, Field, getFieldSeriesColor } from '@grafana/data';
import { VizLegendOptions, AxisPlacement } from '@grafana/schema';
@@ -28,7 +28,7 @@ export function hasVisibleLegendSeries(config: UPlotConfigBuilder, data: DataFra
// });
}
-export const BarChartLegend = React.memo(
+export const BarChartLegend = memo(
({ data, placement, calcs, displayMode, colorField, ...vizLayoutLegendProps }: BarChartLegend2Props) => {
const theme = useTheme2();
diff --git a/public/app/plugins/panel/barchart/BarChartPanel.tsx b/public/app/plugins/panel/barchart/BarChartPanel.tsx
index 4088029f4f4..ec7296fcb73 100644
--- a/public/app/plugins/panel/barchart/BarChartPanel.tsx
+++ b/public/app/plugins/panel/barchart/BarChartPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { PanelProps, VizOrientation } from '@grafana/data';
import { PanelDataErrorView } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/barchart/TickSpacingEditor.tsx b/public/app/plugins/panel/barchart/TickSpacingEditor.tsx
index 8f30cb8ff40..123e058e956 100644
--- a/public/app/plugins/panel/barchart/TickSpacingEditor.tsx
+++ b/public/app/plugins/panel/barchart/TickSpacingEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue, StandardEditorProps } from '@grafana/data';
import { Checkbox, HorizontalGroup, RadioButtonGroup, Tooltip } from '@grafana/ui';
diff --git a/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx b/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx
index af4c44203b3..35df060a347 100644
--- a/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx
+++ b/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx
@@ -1,6 +1,5 @@
import { render, screen } from '@testing-library/react';
import { uniqueId } from 'lodash';
-import React from 'react';
import { dateMath, dateTime, EventBus, LoadingState, TimeRange, toDataFrame, VizOrientation } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
diff --git a/public/app/plugins/panel/bargauge/BarGaugePanel.tsx b/public/app/plugins/panel/bargauge/BarGaugePanel.tsx
index a76285a0799..035f9f9b69a 100644
--- a/public/app/plugins/panel/bargauge/BarGaugePanel.tsx
+++ b/public/app/plugins/panel/bargauge/BarGaugePanel.tsx
@@ -1,5 +1,5 @@
import { isNumber } from 'lodash';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import {
DisplayValueAlignmentFactors,
diff --git a/public/app/plugins/panel/candlestick/CandlestickPanel.tsx b/public/app/plugins/panel/candlestick/CandlestickPanel.tsx
index cd2f5de2387..319b127b227 100644
--- a/public/app/plugins/panel/candlestick/CandlestickPanel.tsx
+++ b/public/app/plugins/panel/candlestick/CandlestickPanel.tsx
@@ -1,7 +1,7 @@
// this file is pretty much a copy-paste of TimeSeriesPanel.tsx :(
// with some extra renderers passed to the component
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import uPlot from 'uplot';
import { Field, getDisplayProcessor, PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/canvas/CanvasPanel.tsx b/public/app/plugins/panel/canvas/CanvasPanel.tsx
index 0a30af8d86c..cd48d2ed8dd 100644
--- a/public/app/plugins/panel/canvas/CanvasPanel.tsx
+++ b/public/app/plugins/panel/canvas/CanvasPanel.tsx
@@ -1,4 +1,5 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
+import * as React from 'react';
import { ReplaySubject, Subscription } from 'rxjs';
import { PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx b/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx
index b2b3d55833f..ea0dffe4c2a 100644
--- a/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx
+++ b/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState } from 'react';
+import * as React from 'react';
import { first } from 'rxjs/operators';
import { SelectableValue } from '@grafana/data';
diff --git a/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx b/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx
index 13cd8169daa..aba956850fd 100644
--- a/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx
+++ b/public/app/plugins/panel/canvas/components/CanvasTooltip.tsx
@@ -1,7 +1,7 @@
import { css } from '@emotion/css';
import { useDialog } from '@react-aria/dialog';
import { useOverlay } from '@react-aria/overlays';
-import React, { createRef } from 'react';
+import { createRef } from 'react';
import { GrafanaTheme2, LinkModel } from '@grafana/data/src';
import { LinkButton, Portal, Stack, useStyles2, VizTooltipContainer } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/components/SetBackground.tsx b/public/app/plugins/panel/canvas/components/SetBackground.tsx
index 60284cfefee..7d33b53df2a 100644
--- a/public/app/plugins/panel/canvas/components/SetBackground.tsx
+++ b/public/app/plugins/panel/canvas/components/SetBackground.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { ResourceDimensionMode } from '@grafana/schema';
diff --git a/public/app/plugins/panel/canvas/components/connections/ConnectionAnchors.tsx b/public/app/plugins/panel/canvas/components/connections/ConnectionAnchors.tsx
index f8c0535e893..ddf67e154f0 100644
--- a/public/app/plugins/panel/canvas/components/connections/ConnectionAnchors.tsx
+++ b/public/app/plugins/panel/canvas/components/connections/ConnectionAnchors.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { useRef } from 'react';
+import { useRef } from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/components/connections/ConnectionSVG.tsx b/public/app/plugins/panel/canvas/components/connections/ConnectionSVG.tsx
index e1c2dc37a00..ae0d934b73d 100644
--- a/public/app/plugins/panel/canvas/components/connections/ConnectionSVG.tsx
+++ b/public/app/plugins/panel/canvas/components/connections/ConnectionSVG.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useMemo, useRef, useState } from 'react';
+import { useEffect, useMemo, useRef, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/components/connections/Connections.tsx b/public/app/plugins/panel/canvas/components/connections/Connections.tsx
index f1ed0042875..d2e9a76fba9 100644
--- a/public/app/plugins/panel/canvas/components/connections/Connections.tsx
+++ b/public/app/plugins/panel/canvas/components/connections/Connections.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { BehaviorSubject } from 'rxjs';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx b/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx
index 75af1e03fd5..53251621d57 100644
--- a/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { SelectableValue, StandardEditorProps } from '@grafana/data';
import { Field, RadioButtonGroup, Switch } from '@grafana/ui/src';
diff --git a/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx b/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx
index 537122ed659..2aaba7bf09f 100644
--- a/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import {
StandardEditorProps,
diff --git a/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx b/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx
index b3b345cf195..e2a7fe599ed 100644
--- a/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { SelectableValue, StandardEditorProps } from '@grafana/data';
import { ButtonVariant, InlineField, InlineFieldRow, Select } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/editor/element/ConstraintSelectionBox.tsx b/public/app/plugins/panel/canvas/editor/element/ConstraintSelectionBox.tsx
index 7a534bf7d53..3e124cae0be 100644
--- a/public/app/plugins/panel/canvas/editor/element/ConstraintSelectionBox.tsx
+++ b/public/app/plugins/panel/canvas/editor/element/ConstraintSelectionBox.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx b/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx
index 7d4bafd85b1..c23df5f2348 100644
--- a/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx
@@ -1,4 +1,5 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
+import * as React from 'react';
import { IconButton, Input, Stack } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx b/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx
index 568eeb41fcf..51668f7c4bd 100644
--- a/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { useObservable } from 'react-use';
import { Subject } from 'rxjs';
diff --git a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx
index 52a14a1ef26..9333b64d60d 100644
--- a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx
+++ b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data/src';
import { IconButton, useStyles2 } from '@grafana/ui/src';
diff --git a/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx b/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx
index 636d9403178..49ff4fe511b 100644
--- a/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx
+++ b/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { SyntheticEvent, useEffect, useRef, useState } from 'react';
+import { SyntheticEvent, useEffect, useRef, useState } from 'react';
import Draggable, { DraggableEventHandler } from 'react-draggable';
import { Resizable, ResizeCallbackData } from 'react-resizable';
diff --git a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx
index e45303e75dd..07f71b7b3d5 100644
--- a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx
+++ b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { get as lodashGet } from 'lodash';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { useObservable } from 'react-use';
import { DataFrame, GrafanaTheme2, PanelOptionsEditorBuilder, StandardEditorContext } from '@grafana/data';
diff --git a/public/app/plugins/panel/canvas/editor/inline/TabsEditor.tsx b/public/app/plugins/panel/canvas/editor/inline/TabsEditor.tsx
index 620646518b2..ce6b5da4932 100644
--- a/public/app/plugins/panel/canvas/editor/inline/TabsEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/inline/TabsEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
import { Tab, TabsBar } from '@grafana/ui/src';
diff --git a/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx b/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx
index 8f1a75617b8..b78c1ab9fe6 100644
--- a/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx
+++ b/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx
@@ -1,7 +1,7 @@
import { css } from '@emotion/css';
import { Global } from '@emotion/react';
import Tree, { TreeNodeProps } from 'rc-tree';
-import React, { Key, useEffect, useMemo, useState } from 'react';
+import { Key, useEffect, useMemo, useState } from 'react';
import { GrafanaTheme2, StandardEditorProps } from '@grafana/data';
import { config } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx b/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx
index dd983f1cfc0..4995f960fcc 100644
--- a/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx
+++ b/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { IconButton, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx b/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx
index e36131f12ce..a6e22d1d4e4 100644
--- a/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx
+++ b/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { StandardEditorProps, GrafanaTheme2 } from '@grafana/data';
import { Alert, Icon, Stack, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/dashlist/DashList.tsx b/public/app/plugins/panel/dashlist/DashList.tsx
index 66db02bf561..ad97d09a57a 100644
--- a/public/app/plugins/panel/dashlist/DashList.tsx
+++ b/public/app/plugins/panel/dashlist/DashList.tsx
@@ -1,5 +1,6 @@
import { take } from 'lodash';
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
+import * as React from 'react';
import {
DataLinkBuiltInVars,
diff --git a/public/app/plugins/panel/dashlist/module.tsx b/public/app/plugins/panel/dashlist/module.tsx
index a7169752418..8cb3c286e16 100644
--- a/public/app/plugins/panel/dashlist/module.tsx
+++ b/public/app/plugins/panel/dashlist/module.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { PanelPlugin } from '@grafana/data';
import { TagsInput } from '@grafana/ui';
import { FolderPicker } from 'app/core/components/Select/FolderPicker';
diff --git a/public/app/plugins/panel/datagrid/DataGridPanel.tsx b/public/app/plugins/panel/datagrid/DataGridPanel.tsx
index ebed01c9ab0..36153080e80 100644
--- a/public/app/plugins/panel/datagrid/DataGridPanel.tsx
+++ b/public/app/plugins/panel/datagrid/DataGridPanel.tsx
@@ -8,7 +8,7 @@ import DataEditor, {
Rectangle,
HeaderClickedEventArgs,
} from '@glideapps/glide-data-grid';
-import React, { useEffect, useReducer } from 'react';
+import { useEffect, useReducer } from 'react';
import { Field, PanelProps, FieldType, DataFrame } from '@grafana/data';
import { PanelDataErrorView, reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/datagrid/components/AddColumn.tsx b/public/app/plugins/panel/datagrid/components/AddColumn.tsx
index 215b902cbb1..96353fc430e 100644
--- a/public/app/plugins/panel/datagrid/components/AddColumn.tsx
+++ b/public/app/plugins/panel/datagrid/components/AddColumn.tsx
@@ -1,4 +1,5 @@
-import React, { useState } from 'react';
+import { useState } from 'react';
+import * as React from 'react';
import { SimpleInput } from './SimpleInput';
diff --git a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx
index 3dfcdc30bb8..f750c71d4a7 100644
--- a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx
+++ b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx
@@ -1,6 +1,6 @@
import { GridSelection } from '@glideapps/glide-data-grid';
import { capitalize } from 'lodash';
-import React from 'react';
+import * as React from 'react';
import { DataFrame, FieldType } from '@grafana/data';
import { convertFieldType } from '@grafana/data/src/transformations/transformers/convertFieldType';
diff --git a/public/app/plugins/panel/datagrid/components/RenameColumnCell.tsx b/public/app/plugins/panel/datagrid/components/RenameColumnCell.tsx
index 27ea203ee0f..9b2c046fb63 100644
--- a/public/app/plugins/panel/datagrid/components/RenameColumnCell.tsx
+++ b/public/app/plugins/panel/datagrid/components/RenameColumnCell.tsx
@@ -1,4 +1,5 @@
-import React, { useLayoutEffect, useRef, useState } from 'react';
+import { useLayoutEffect, useRef, useState } from 'react';
+import * as React from 'react';
import { Portal } from '@grafana/ui';
diff --git a/public/app/plugins/panel/datagrid/components/SimpleInput.tsx b/public/app/plugins/panel/datagrid/components/SimpleInput.tsx
index 8d8e4e77a7d..c8094556965 100644
--- a/public/app/plugins/panel/datagrid/components/SimpleInput.tsx
+++ b/public/app/plugins/panel/datagrid/components/SimpleInput.tsx
@@ -1,4 +1,5 @@
-import React, { useRef, useEffect } from 'react';
+import { useRef, useEffect } from 'react';
+import * as React from 'react';
interface InputProps {
onBlur: (e: React.FocusEvent) => void;
diff --git a/public/app/plugins/panel/debug/CursorView.tsx b/public/app/plugins/panel/debug/CursorView.tsx
index 3b8dac26732..92e2c429d3a 100644
--- a/public/app/plugins/panel/debug/CursorView.tsx
+++ b/public/app/plugins/panel/debug/CursorView.tsx
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
import { Subscription } from 'rxjs';
import {
diff --git a/public/app/plugins/panel/debug/DebugPanel.tsx b/public/app/plugins/panel/debug/DebugPanel.tsx
index de966b146ab..9efe9f6211b 100644
--- a/public/app/plugins/panel/debug/DebugPanel.tsx
+++ b/public/app/plugins/panel/debug/DebugPanel.tsx
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
import { PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/debug/EventBusLogger.tsx b/public/app/plugins/panel/debug/EventBusLogger.tsx
index 32bedcf6bd9..60db004e48a 100644
--- a/public/app/plugins/panel/debug/EventBusLogger.tsx
+++ b/public/app/plugins/panel/debug/EventBusLogger.tsx
@@ -1,4 +1,4 @@
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { PartialObserver, Unsubscribable } from 'rxjs';
import {
diff --git a/public/app/plugins/panel/debug/RenderInfoViewer.tsx b/public/app/plugins/panel/debug/RenderInfoViewer.tsx
index a18fe4231f8..663a7dd7c98 100644
--- a/public/app/plugins/panel/debug/RenderInfoViewer.tsx
+++ b/public/app/plugins/panel/debug/RenderInfoViewer.tsx
@@ -1,4 +1,4 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
import {
compareArrayValues,
diff --git a/public/app/plugins/panel/debug/StateView.tsx b/public/app/plugins/panel/debug/StateView.tsx
index 2dc4529c029..1b7309d00fe 100644
--- a/public/app/plugins/panel/debug/StateView.tsx
+++ b/public/app/plugins/panel/debug/StateView.tsx
@@ -1,4 +1,4 @@
-import React, { FormEvent } from 'react';
+import { FormEvent } from 'react';
import { PanelOptionsEditorProps, PanelProps } from '@grafana/data';
import { Field, Input, usePanelContext } from '@grafana/ui';
diff --git a/public/app/plugins/panel/flamegraph/FlameGraphPanel.tsx b/public/app/plugins/panel/flamegraph/FlameGraphPanel.tsx
index a284ee92d82..de45d52375f 100644
--- a/public/app/plugins/panel/flamegraph/FlameGraphPanel.tsx
+++ b/public/app/plugins/panel/flamegraph/FlameGraphPanel.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { CoreApp, PanelProps } from '@grafana/data';
import { FlameGraph, checkFields, getMessageCheckFieldsResult } from '@grafana/flamegraph';
import { PanelDataErrorView, reportInteraction, config } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/gauge/GaugePanel.tsx b/public/app/plugins/panel/gauge/GaugePanel.tsx
index 7b798f63402..cb64ba49844 100644
--- a/public/app/plugins/panel/gauge/GaugePanel.tsx
+++ b/public/app/plugins/panel/gauge/GaugePanel.tsx
@@ -1,4 +1,4 @@
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { FieldDisplay, getDisplayProcessor, getFieldDisplayValues, PanelProps } from '@grafana/data';
import { BarGaugeSizing, VizOrientation } from '@grafana/schema';
diff --git a/public/app/plugins/panel/geomap/GeomapOverlay.tsx b/public/app/plugins/panel/geomap/GeomapOverlay.tsx
index d7135e00682..c0cf49e1745 100644
--- a/public/app/plugins/panel/geomap/GeomapOverlay.tsx
+++ b/public/app/plugins/panel/geomap/GeomapOverlay.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { CSSProperties } from 'react';
+import { CSSProperties } from 'react';
+import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/geomap/GeomapPanel.tsx b/public/app/plugins/panel/geomap/GeomapPanel.tsx
index a7729d8a754..bbbb0eb3510 100644
--- a/public/app/plugins/panel/geomap/GeomapPanel.tsx
+++ b/public/app/plugins/panel/geomap/GeomapPanel.tsx
@@ -8,7 +8,8 @@ import { Coordinate } from 'ol/coordinate';
import { isEmpty } from 'ol/extent';
import MouseWheelZoom from 'ol/interaction/MouseWheelZoom';
import { fromLonLat } from 'ol/proj';
-import React, { Component, ReactNode } from 'react';
+import { Component, ReactNode } from 'react';
+import * as React from 'react';
import { Subscription } from 'rxjs';
import { DataHoverEvent, PanelData, PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/geomap/GeomapTooltip.tsx b/public/app/plugins/panel/geomap/GeomapTooltip.tsx
index a3ee8782b95..6c5991b8727 100644
--- a/public/app/plugins/panel/geomap/GeomapTooltip.tsx
+++ b/public/app/plugins/panel/geomap/GeomapTooltip.tsx
@@ -1,6 +1,6 @@
import { useDialog } from '@react-aria/dialog';
import { useOverlay } from '@react-aria/overlays';
-import React, { createRef } from 'react';
+import { createRef } from 'react';
import { Portal, VizTooltipContainer } from '@grafana/ui';
import { ComplexDataHoverView } from 'app/features/visualization/data-hover/ComplexDataHoverView';
diff --git a/public/app/plugins/panel/geomap/components/DebugOverlay.tsx b/public/app/plugins/panel/geomap/components/DebugOverlay.tsx
index c30b7a66832..8122f87680e 100644
--- a/public/app/plugins/panel/geomap/components/DebugOverlay.tsx
+++ b/public/app/plugins/panel/geomap/components/DebugOverlay.tsx
@@ -2,7 +2,7 @@ import { css } from '@emotion/css';
import { Map } from 'ol';
import { Coordinate } from 'ol/coordinate';
import { transform } from 'ol/proj';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import tinycolor from 'tinycolor2';
import { GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx
index a322627b7fb..2d6cdabfc5d 100644
--- a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx
+++ b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx
@@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css';
import BaseLayer from 'ol/layer/Base';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { useObservable } from 'react-use';
import { of } from 'rxjs';
diff --git a/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx b/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx
index 600b813e8a7..2502a4786ef 100644
--- a/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx
+++ b/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import Map from 'ol/Map';
-import React, { useMemo, useRef, useState } from 'react';
+import { useMemo, useRef, useState } from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { Button, IconButton, RadioButtonGroup, Select } from '@grafana/ui';
diff --git a/public/app/plugins/panel/geomap/components/ObservablePropsWrapper.tsx b/public/app/plugins/panel/geomap/components/ObservablePropsWrapper.tsx
index 9d34e202c05..7b110841872 100644
--- a/public/app/plugins/panel/geomap/components/ObservablePropsWrapper.tsx
+++ b/public/app/plugins/panel/geomap/components/ObservablePropsWrapper.tsx
@@ -1,4 +1,5 @@
-import React, { Component } from 'react';
+import { Component } from 'react';
+import * as React from 'react';
import { Observable, Unsubscribable } from 'rxjs';
interface Props {
diff --git a/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx
index ea83b7f72a1..0774d472a9f 100644
--- a/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { InlineFieldRow, InlineField } from '@grafana/ui';
import { NumberInput } from 'app/core/components/OptionsUI/NumberInput';
diff --git a/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx
index a88529a45ea..51817507c8a 100644
--- a/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useMemo } from 'react';
+import { useCallback, useMemo } from 'react';
import { SelectableValue, StandardEditorContext } from '@grafana/data';
import { InlineFieldRow, InlineField, RadioButtonGroup, Select } from '@grafana/ui';
diff --git a/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx b/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx
index 8f19c7f2f03..88eabf2ed1b 100644
--- a/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { FrameMatcherID, MatcherConfig, StandardEditorProps } from '@grafana/data';
import { RefIDPicker } from '@grafana/ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher';
diff --git a/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx b/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx
index 3d3e32e6430..336077d8b47 100644
--- a/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data';
import { Button, useTheme2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/geomap/editor/LayersEditor.tsx b/public/app/plugins/panel/geomap/editor/LayersEditor.tsx
index 63753e24d76..9a1c0f48504 100644
--- a/public/app/plugins/panel/geomap/editor/LayersEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/LayersEditor.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { DropResult } from 'react-beautiful-dnd';
import { StandardEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx
index fa45d02e69c..52d5140c304 100644
--- a/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx
@@ -1,5 +1,5 @@
import { toLonLat } from 'ol/proj';
-import React, { useMemo, useCallback } from 'react';
+import { useMemo, useCallback } from 'react';
import { StandardEditorProps, SelectableValue } from '@grafana/data';
import { Button, InlineField, InlineFieldRow, Select, VerticalGroup } from '@grafana/ui';
diff --git a/public/app/plugins/panel/geomap/editor/StyleEditor.tsx b/public/app/plugins/panel/geomap/editor/StyleEditor.tsx
index e11b5d895e6..5ac29dfe977 100644
--- a/public/app/plugins/panel/geomap/editor/StyleEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/StyleEditor.tsx
@@ -1,5 +1,5 @@
import { capitalize } from 'lodash';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { useObservable } from 'react-use';
import { Observable, of } from 'rxjs';
diff --git a/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx b/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx
index 728c20295fe..840a91413fc 100644
--- a/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx
+++ b/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { FeatureLike } from 'ol/Feature';
-import React, { useCallback, useMemo } from 'react';
+import { useCallback, useMemo } from 'react';
import { useObservable } from 'react-use';
import { Observable } from 'rxjs';
diff --git a/public/app/plugins/panel/geomap/layers/data/markersLayer.tsx b/public/app/plugins/panel/geomap/layers/data/markersLayer.tsx
index 90581083596..9e4ef519d24 100644
--- a/public/app/plugins/panel/geomap/layers/data/markersLayer.tsx
+++ b/public/app/plugins/panel/geomap/layers/data/markersLayer.tsx
@@ -2,7 +2,7 @@ import { isNumber } from 'lodash';
import { FeatureLike } from 'ol/Feature';
import Map from 'ol/Map';
import VectorImage from 'ol/layer/VectorImage';
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { ReplaySubject } from 'rxjs';
import {
diff --git a/public/app/plugins/panel/geomap/layers/data/networkLayer.tsx b/public/app/plugins/panel/geomap/layers/data/networkLayer.tsx
index 1ec70a41b70..733c938fd95 100644
--- a/public/app/plugins/panel/geomap/layers/data/networkLayer.tsx
+++ b/public/app/plugins/panel/geomap/layers/data/networkLayer.tsx
@@ -6,7 +6,7 @@ import { Geometry, LineString, Point, SimpleGeometry } from 'ol/geom';
import VectorImage from 'ol/layer/VectorImage';
import { Fill, Stroke, Style, Text } from 'ol/style';
import FlowLine from 'ol-ext/style/FlowLine';
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { ReplaySubject } from 'rxjs';
import tinycolor from 'tinycolor2';
diff --git a/public/app/plugins/panel/geomap/module.tsx b/public/app/plugins/panel/geomap/module.tsx
index b2a37446b46..993fda575ba 100644
--- a/public/app/plugins/panel/geomap/module.tsx
+++ b/public/app/plugins/panel/geomap/module.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { PanelPlugin } from '@grafana/data';
import { config } from '@grafana/runtime';
import { commonOptionsBuilder } from '@grafana/ui';
diff --git a/public/app/plugins/panel/geomap/utils/uiUtils.tsx b/public/app/plugins/panel/geomap/utils/uiUtils.tsx
index 97b9e965b64..ad0a86abe62 100644
--- a/public/app/plugins/panel/geomap/utils/uiUtils.tsx
+++ b/public/app/plugins/panel/geomap/utils/uiUtils.tsx
@@ -1,5 +1,5 @@
import { cx } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { isUrl } from './utils';
diff --git a/public/app/plugins/panel/gettingstarted/GettingStarted.tsx b/public/app/plugins/panel/gettingstarted/GettingStarted.tsx
index 88e16179335..33c27cc9e77 100644
--- a/public/app/plugins/panel/gettingstarted/GettingStarted.tsx
+++ b/public/app/plugins/panel/gettingstarted/GettingStarted.tsx
@@ -1,6 +1,6 @@
// Libraries
import { css, cx } from '@emotion/css';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { PanelProps } from '@grafana/data';
import { config, reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx b/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx
index 39871c408e7..ac35ab82388 100644
--- a/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx
+++ b/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/gettingstarted/components/Step.tsx b/public/app/plugins/panel/gettingstarted/components/Step.tsx
index e76a73e36fa..e796fbb0b93 100644
--- a/public/app/plugins/panel/gettingstarted/components/Step.tsx
+++ b/public/app/plugins/panel/gettingstarted/components/Step.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx b/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx
index 029f8844a64..f55a7aa4bc4 100644
--- a/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx
+++ b/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { MouseEvent } from 'react';
+import { MouseEvent } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/graph/Legend/Legend.tsx b/public/app/plugins/panel/graph/Legend/Legend.tsx
index 984d2af5b8b..6c527552eb6 100644
--- a/public/app/plugins/panel/graph/Legend/Legend.tsx
+++ b/public/app/plugins/panel/graph/Legend/Legend.tsx
@@ -1,5 +1,6 @@
import { sortBy as _sortBy } from 'lodash';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
+import * as React from 'react';
import { CustomScrollbar, Icon } from '@grafana/ui';
import { TimeSeries } from 'app/core/core';
diff --git a/public/app/plugins/panel/graph/Legend/LegendSeriesItem.tsx b/public/app/plugins/panel/graph/Legend/LegendSeriesItem.tsx
index 62a597d4515..6d568168f2c 100644
--- a/public/app/plugins/panel/graph/Legend/LegendSeriesItem.tsx
+++ b/public/app/plugins/panel/graph/Legend/LegendSeriesItem.tsx
@@ -1,5 +1,5 @@
import classNames from 'classnames';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { selectors } from '@grafana/e2e-selectors';
import { SeriesColorPicker, SeriesIcon } from '@grafana/ui';
diff --git a/public/app/plugins/panel/graph/graph.ts b/public/app/plugins/panel/graph/graph.ts
index ec4d93dfe5c..5ebc2fe8c52 100644
--- a/public/app/plugins/panel/graph/graph.ts
+++ b/public/app/plugins/panel/graph/graph.ts
@@ -10,7 +10,7 @@ import './jquery.flot.events';
import $ from 'jquery';
import { clone, find, flatten, isUndefined, map, max as _max, min as _min, sortBy as _sortBy, toNumber } from 'lodash';
-import React from 'react';
+import { createElement } from 'react';
import { createRoot, Root } from 'react-dom/client';
import {
@@ -162,7 +162,7 @@ class GraphElement {
renderCallback: this.renderPanel.bind(this),
};
- const legendReactElem = React.createElement(LegendWithThemeProvider, legendProps);
+ const legendReactElem = createElement(LegendWithThemeProvider, legendProps);
// render callback isn't supported in react 18+, see: https://github.com/reactwg/react-18/discussions/5
this.legendElemRoot.render(legendReactElem);
diff --git a/public/app/plugins/panel/heatmap/ExemplarModalHeader.tsx b/public/app/plugins/panel/heatmap/ExemplarModalHeader.tsx
index e2110122ab3..4d66229d940 100644
--- a/public/app/plugins/panel/heatmap/ExemplarModalHeader.tsx
+++ b/public/app/plugins/panel/heatmap/ExemplarModalHeader.tsx
@@ -1,4 +1,5 @@
-import React, { CSSProperties } from 'react';
+import { CSSProperties } from 'react';
+import * as React from 'react';
import { CloseButton } from 'app/core/components/CloseButton/CloseButton';
diff --git a/public/app/plugins/panel/heatmap/HeatmapPanel.tsx b/public/app/plugins/panel/heatmap/HeatmapPanel.tsx
index b7ce5ab2be9..a3a9896b251 100644
--- a/public/app/plugins/panel/heatmap/HeatmapPanel.tsx
+++ b/public/app/plugins/panel/heatmap/HeatmapPanel.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useMemo, useRef, useState } from 'react';
+import { useMemo, useRef, useState } from 'react';
import { DashboardCursorSync, PanelProps, TimeRange } from '@grafana/data';
import { PanelDataErrorView } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/heatmap/HeatmapTooltip.tsx b/public/app/plugins/panel/heatmap/HeatmapTooltip.tsx
index 63cd3374997..ebb3a860587 100644
--- a/public/app/plugins/panel/heatmap/HeatmapTooltip.tsx
+++ b/public/app/plugins/panel/heatmap/HeatmapTooltip.tsx
@@ -1,4 +1,5 @@
-import React, { ReactElement, useEffect, useRef, useState, ReactNode } from 'react';
+import { ReactElement, useEffect, useRef, useState, ReactNode } from 'react';
+import * as React from 'react';
import uPlot from 'uplot';
import {
diff --git a/public/app/plugins/panel/heatmap/module.tsx b/public/app/plugins/panel/heatmap/module.tsx
index 660e71e7261..f01bc07e514 100644
--- a/public/app/plugins/panel/heatmap/module.tsx
+++ b/public/app/plugins/panel/heatmap/module.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { FieldConfigProperty, FieldType, identityOverrideProcessor, PanelPlugin } from '@grafana/data';
import { config } from '@grafana/runtime';
import {
diff --git a/public/app/plugins/panel/histogram/Histogram.tsx b/public/app/plugins/panel/histogram/Histogram.tsx
index 517069b2d94..794fb6a7212 100644
--- a/public/app/plugins/panel/histogram/Histogram.tsx
+++ b/public/app/plugins/panel/histogram/Histogram.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import uPlot, { AlignedData } from 'uplot';
import {
diff --git a/public/app/plugins/panel/histogram/HistogramPanel.tsx b/public/app/plugins/panel/histogram/HistogramPanel.tsx
index d0355b5524b..9786531c552 100644
--- a/public/app/plugins/panel/histogram/HistogramPanel.tsx
+++ b/public/app/plugins/panel/histogram/HistogramPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { PanelProps, buildHistogram, getHistogramFields } from '@grafana/data';
import { histogramFieldsToFrame } from '@grafana/data/src/transformations/transformers/histogram';
diff --git a/public/app/plugins/panel/histogram/HistogramTooltip.tsx b/public/app/plugins/panel/histogram/HistogramTooltip.tsx
index e61b243d395..0a8f5979cc6 100644
--- a/public/app/plugins/panel/histogram/HistogramTooltip.tsx
+++ b/public/app/plugins/panel/histogram/HistogramTooltip.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { ReactNode, useMemo } from 'react';
+import { ReactNode, useMemo } from 'react';
import { DataFrame, formattedValueToString } from '@grafana/data';
import { SortOrder, TooltipDisplayMode } from '@grafana/schema/dist/esm/common/common.gen';
diff --git a/public/app/plugins/panel/live/LiveChannelEditor.tsx b/public/app/plugins/panel/live/LiveChannelEditor.tsx
index 1252d48debd..08bb3d63766 100644
--- a/public/app/plugins/panel/live/LiveChannelEditor.tsx
+++ b/public/app/plugins/panel/live/LiveChannelEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo, useState } from 'react';
import {
LiveChannelScope,
diff --git a/public/app/plugins/panel/live/LivePanel.tsx b/public/app/plugins/panel/live/LivePanel.tsx
index 7bb237d0a11..c2f2a54b6d9 100644
--- a/public/app/plugins/panel/live/LivePanel.tsx
+++ b/public/app/plugins/panel/live/LivePanel.tsx
@@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css';
import { isEqual } from 'lodash';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import { Unsubscribable, PartialObserver } from 'rxjs';
import {
diff --git a/public/app/plugins/panel/live/LivePublish.tsx b/public/app/plugins/panel/live/LivePublish.tsx
index 6d7e8b148ff..dcc3073843e 100644
--- a/public/app/plugins/panel/live/LivePublish.tsx
+++ b/public/app/plugins/panel/live/LivePublish.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { LiveChannelAddress, isValidLiveChannelAddress } from '@grafana/data';
import { getBackendSrv, getGrafanaLiveSrv } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/logs/LogsPanel.test.tsx b/public/app/plugins/panel/logs/LogsPanel.test.tsx
index 7cb4124fe43..88e875ae0ed 100644
--- a/public/app/plugins/panel/logs/LogsPanel.test.tsx
+++ b/public/app/plugins/panel/logs/LogsPanel.test.tsx
@@ -1,6 +1,6 @@
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
import { DatasourceSrvMock, MockDataSourceApi } from 'test/mocks/datasource_srv';
import {
diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx
index d2cefdae7ce..a03c2719210 100644
--- a/public/app/plugins/panel/logs/LogsPanel.tsx
+++ b/public/app/plugins/panel/logs/LogsPanel.tsx
@@ -1,5 +1,6 @@
import { css, cx } from '@emotion/css';
-import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
+import { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';
+import * as React from 'react';
import {
CoreApp,
diff --git a/public/app/plugins/panel/news/NewsPanel.tsx b/public/app/plugins/panel/news/NewsPanel.tsx
index 127db56465c..68599b2cead 100644
--- a/public/app/plugins/panel/news/NewsPanel.tsx
+++ b/public/app/plugins/panel/news/NewsPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect } from 'react';
+import { useEffect } from 'react';
import { PanelProps } from '@grafana/data';
import { RefreshEvent } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/news/component/News.tsx b/public/app/plugins/panel/news/component/News.tsx
index c47f1d1ade7..09cce50f314 100644
--- a/public/app/plugins/panel/news/component/News.tsx
+++ b/public/app/plugins/panel/news/component/News.tsx
@@ -1,5 +1,4 @@
import { css, cx } from '@emotion/css';
-import React from 'react';
import Skeleton from 'react-loading-skeleton';
import { DataFrameView, GrafanaTheme2, textUtil, dateTimeFormat } from '@grafana/data';
diff --git a/public/app/plugins/panel/nodeGraph/Edge.tsx b/public/app/plugins/panel/nodeGraph/Edge.tsx
index f7ecf818e86..405d07f1a9e 100644
--- a/public/app/plugins/panel/nodeGraph/Edge.tsx
+++ b/public/app/plugins/panel/nodeGraph/Edge.tsx
@@ -1,4 +1,4 @@
-import React, { MouseEvent, memo } from 'react';
+import { MouseEvent, memo } from 'react';
import { EdgeArrowMarker } from './EdgeArrowMarker';
import { computeNodeCircumferenceStrokeWidth, nodeR } from './Node';
diff --git a/public/app/plugins/panel/nodeGraph/EdgeArrowMarker.tsx b/public/app/plugins/panel/nodeGraph/EdgeArrowMarker.tsx
index ac53e42a78b..67e07935e9c 100644
--- a/public/app/plugins/panel/nodeGraph/EdgeArrowMarker.tsx
+++ b/public/app/plugins/panel/nodeGraph/EdgeArrowMarker.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { defaultEdgeColor } from './Edge';
/**
diff --git a/public/app/plugins/panel/nodeGraph/EdgeLabel.tsx b/public/app/plugins/panel/nodeGraph/EdgeLabel.tsx
index 3c2bb5fc381..e2f29d8689e 100644
--- a/public/app/plugins/panel/nodeGraph/EdgeLabel.tsx
+++ b/public/app/plugins/panel/nodeGraph/EdgeLabel.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { memo } from 'react';
+import { memo } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/nodeGraph/Legend.test.tsx b/public/app/plugins/panel/nodeGraph/Legend.test.tsx
index d0e3e6699ed..3fc1a1c0513 100644
--- a/public/app/plugins/panel/nodeGraph/Legend.test.tsx
+++ b/public/app/plugins/panel/nodeGraph/Legend.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { FieldColorModeId } from '@grafana/data';
diff --git a/public/app/plugins/panel/nodeGraph/Legend.tsx b/public/app/plugins/panel/nodeGraph/Legend.tsx
index 75984b1c102..a899a0fb383 100644
--- a/public/app/plugins/panel/nodeGraph/Legend.tsx
+++ b/public/app/plugins/panel/nodeGraph/Legend.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { Field, FieldColorModeId, GrafanaTheme2 } from '@grafana/data';
import { LegendDisplayMode } from '@grafana/schema';
diff --git a/public/app/plugins/panel/nodeGraph/Marker.tsx b/public/app/plugins/panel/nodeGraph/Marker.tsx
index 2a427b43eea..c08967bb6a9 100644
--- a/public/app/plugins/panel/nodeGraph/Marker.tsx
+++ b/public/app/plugins/panel/nodeGraph/Marker.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { MouseEvent, memo } from 'react';
+import { MouseEvent, memo } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/nodeGraph/Node.test.tsx b/public/app/plugins/panel/nodeGraph/Node.test.tsx
index c6fe4e91750..a73f0b8334e 100644
--- a/public/app/plugins/panel/nodeGraph/Node.test.tsx
+++ b/public/app/plugins/panel/nodeGraph/Node.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { FieldType } from '@grafana/data/src';
diff --git a/public/app/plugins/panel/nodeGraph/Node.tsx b/public/app/plugins/panel/nodeGraph/Node.tsx
index f87da31b7ac..42c6bd6485a 100644
--- a/public/app/plugins/panel/nodeGraph/Node.tsx
+++ b/public/app/plugins/panel/nodeGraph/Node.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import cx from 'classnames';
-import React, { MouseEvent, memo } from 'react';
+import { MouseEvent, memo } from 'react';
import tinycolor from 'tinycolor2';
import { Field, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx b/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx
index 6b1f3939bc0..4acfcb9edb4 100644
--- a/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx
+++ b/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx
@@ -1,6 +1,5 @@
import { render, screen, fireEvent, waitFor, getByText } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React from 'react';
import { NodeGraph } from './NodeGraph';
import { makeEdgesDataFrame, makeNodesDataFrame } from './utils';
diff --git a/public/app/plugins/panel/nodeGraph/NodeGraph.tsx b/public/app/plugins/panel/nodeGraph/NodeGraph.tsx
index e9fe37dda65..b2fca164129 100644
--- a/public/app/plugins/panel/nodeGraph/NodeGraph.tsx
+++ b/public/app/plugins/panel/nodeGraph/NodeGraph.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import cx from 'classnames';
-import React, { memo, MouseEvent, useCallback, useEffect, useMemo, useState } from 'react';
+import { memo, MouseEvent, useCallback, useEffect, useMemo, useState } from 'react';
import useMeasure from 'react-use/lib/useMeasure';
import { DataFrame, GrafanaTheme2, LinkModel } from '@grafana/data';
diff --git a/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx b/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx
index feb7e18e160..9ee64616c17 100644
--- a/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx
+++ b/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx
@@ -1,5 +1,5 @@
import memoizeOne from 'memoize-one';
-import React, { useId } from 'react';
+import { useId } from 'react';
import { PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/nodeGraph/ViewControls.tsx b/public/app/plugins/panel/nodeGraph/ViewControls.tsx
index a6f7f435999..b80b09af624 100644
--- a/public/app/plugins/panel/nodeGraph/ViewControls.tsx
+++ b/public/app/plugins/panel/nodeGraph/ViewControls.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { Button, HorizontalGroup, useStyles2, VerticalGroup } from '@grafana/ui';
diff --git a/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx b/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx
index 1e4427cc398..e13773bdf9b 100644
--- a/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx
+++ b/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { Field, StandardEditorProps } from '@grafana/data';
import { Button, ColorPicker, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/nodeGraph/useContextMenu.tsx b/public/app/plugins/panel/nodeGraph/useContextMenu.tsx
index 31ec9c96d67..2aeb57981aa 100644
--- a/public/app/plugins/panel/nodeGraph/useContextMenu.tsx
+++ b/public/app/plugins/panel/nodeGraph/useContextMenu.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { MouseEvent, useCallback, useState } from 'react';
+import { MouseEvent, useCallback, useState } from 'react';
+import * as React from 'react';
import { DataFrame, Field, GrafanaTheme2, LinkModel } from '@grafana/data';
import { ContextMenu, MenuGroup, MenuItem, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/piechart/PieChart.tsx b/public/app/plugins/panel/piechart/PieChart.tsx
index 674af3e1cf9..3b980dd9543 100644
--- a/public/app/plugins/panel/piechart/PieChart.tsx
+++ b/public/app/plugins/panel/piechart/PieChart.tsx
@@ -5,7 +5,8 @@ import { Group } from '@visx/group';
import Pie, { PieArcDatum, ProvidedProps } from '@visx/shape/lib/shapes/Pie';
import { useTooltip, useTooltipInPortal } from '@visx/tooltip';
import { UseTooltipParams } from '@visx/tooltip/lib/hooks/useTooltip';
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
+import * as React from 'react';
import tinycolor from 'tinycolor2';
import {
diff --git a/public/app/plugins/panel/piechart/PieChartPanel.test.tsx b/public/app/plugins/panel/piechart/PieChartPanel.test.tsx
index 99b3d73e1c1..059877f28bb 100644
--- a/public/app/plugins/panel/piechart/PieChartPanel.test.tsx
+++ b/public/app/plugins/panel/piechart/PieChartPanel.test.tsx
@@ -1,6 +1,6 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import React, { ComponentProps } from 'react';
+import { ComponentProps } from 'react';
import {
FieldConfigSource,
diff --git a/public/app/plugins/panel/piechart/PieChartPanel.tsx b/public/app/plugins/panel/piechart/PieChartPanel.tsx
index a9126a492ca..5d2ab75b69d 100644
--- a/public/app/plugins/panel/piechart/PieChartPanel.tsx
+++ b/public/app/plugins/panel/piechart/PieChartPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import { useEffect, useState } from 'react';
import { Subscription } from 'rxjs';
import {
diff --git a/public/app/plugins/panel/stat/StatPanel.tsx b/public/app/plugins/panel/stat/StatPanel.tsx
index 2092b8d2989..0dc6a22124b 100644
--- a/public/app/plugins/panel/stat/StatPanel.tsx
+++ b/public/app/plugins/panel/stat/StatPanel.tsx
@@ -1,5 +1,5 @@
import { isNumber } from 'lodash';
-import React, { PureComponent } from 'react';
+import { PureComponent } from 'react';
import {
DisplayValueAlignmentFactors,
diff --git a/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx b/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx
index 10175fb0999..8739b3790bb 100644
--- a/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx
+++ b/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { DashboardCursorSync, PanelProps } from '@grafana/data';
import { getLastStreamingDataFramePacket } from '@grafana/data/src/dataframe/StreamingDataFrame';
diff --git a/public/app/plugins/panel/state-timeline/StateTimelineTooltip2.tsx b/public/app/plugins/panel/state-timeline/StateTimelineTooltip2.tsx
index c46f6298e18..d60aad35d23 100644
--- a/public/app/plugins/panel/state-timeline/StateTimelineTooltip2.tsx
+++ b/public/app/plugins/panel/state-timeline/StateTimelineTooltip2.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { FieldType, TimeRange } from '@grafana/data';
import { SortOrder } from '@grafana/schema/dist/esm/common/common.gen';
diff --git a/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx b/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx
index 716445e784b..475ad75556f 100644
--- a/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx
+++ b/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { DashboardCursorSync, PanelProps } from '@grafana/data';
import { EventBusPlugin, TooltipDisplayMode, TooltipPlugin2, usePanelContext, useTheme2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/table/PaginationEditor.tsx b/public/app/plugins/panel/table/PaginationEditor.tsx
index 5d25249d845..0bfa20b565b 100644
--- a/public/app/plugins/panel/table/PaginationEditor.tsx
+++ b/public/app/plugins/panel/table/PaginationEditor.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { StandardEditorProps } from '@grafana/data';
import { Switch } from '@grafana/ui';
diff --git a/public/app/plugins/panel/table/TableCellOptionEditor.tsx b/public/app/plugins/panel/table/TableCellOptionEditor.tsx
index c4b90e9812a..a2822246832 100644
--- a/public/app/plugins/panel/table/TableCellOptionEditor.tsx
+++ b/public/app/plugins/panel/table/TableCellOptionEditor.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { merge } from 'lodash';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
import { TableCellOptions } from '@grafana/schema';
diff --git a/public/app/plugins/panel/table/TablePanel.tsx b/public/app/plugins/panel/table/TablePanel.tsx
index e3d9d9f774d..4b0a386e6a9 100644
--- a/public/app/plugins/panel/table/TablePanel.tsx
+++ b/public/app/plugins/panel/table/TablePanel.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import {
DashboardCursorSync,
diff --git a/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx
index f760709adb6..5603832de95 100644
--- a/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { TableAutoCellOptions, TableColorTextCellOptions } from '@grafana/schema';
import { Field, Switch, Badge, Label } from '@grafana/ui';
diff --git a/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx
index 59bf1e617a7..57e6b9703ee 100644
--- a/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { BarGaugeDisplayMode, BarGaugeValueMode, TableBarGaugeCellOptions } from '@grafana/schema';
import { Field, RadioButtonGroup, Stack } from '@grafana/ui';
diff --git a/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx
index 99069cd8c75..0cd943b5cf6 100644
--- a/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { SelectableValue } from '@grafana/data';
import { TableCellBackgroundDisplayMode, TableColoredBackgroundCellOptions } from '@grafana/schema';
import { Field, RadioButtonGroup, Switch, Label, Badge } from '@grafana/ui';
diff --git a/public/app/plugins/panel/table/cells/SparklineCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/SparklineCellOptionsEditor.tsx
index 61799c51c18..6a5a41d4189 100644
--- a/public/app/plugins/panel/table/cells/SparklineCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/cells/SparklineCellOptionsEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { createFieldConfigRegistry, SetFieldConfigOptionsArgs } from '@grafana/data';
import { GraphFieldConfig, TableSparklineCellOptions } from '@grafana/schema';
diff --git a/public/app/plugins/panel/text/TextPanel.test.tsx b/public/app/plugins/panel/text/TextPanel.test.tsx
index ccebf02f1bc..08f034dc3df 100644
--- a/public/app/plugins/panel/text/TextPanel.test.tsx
+++ b/public/app/plugins/panel/text/TextPanel.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { dateTime, LoadingState, EventBusSrv } from '@grafana/data';
diff --git a/public/app/plugins/panel/text/TextPanel.tsx b/public/app/plugins/panel/text/TextPanel.tsx
index 1d040905cdb..98762f4a106 100644
--- a/public/app/plugins/panel/text/TextPanel.tsx
+++ b/public/app/plugins/panel/text/TextPanel.tsx
@@ -1,6 +1,6 @@
import { css, cx } from '@emotion/css';
import DangerouslySetHtmlContent from 'dangerously-set-html-content';
-import React, { useState } from 'react';
+import { useState } from 'react';
import { useDebounce } from 'react-use';
import { GrafanaTheme2, PanelProps, renderTextPanelMarkdown, textUtil, InterpolateFunction } from '@grafana/data';
diff --git a/public/app/plugins/panel/text/TextPanelEditor.tsx b/public/app/plugins/panel/text/TextPanelEditor.tsx
index 5c8f3718dd9..29fb1d3687f 100644
--- a/public/app/plugins/panel/text/TextPanelEditor.tsx
+++ b/public/app/plugins/panel/text/TextPanelEditor.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import AutoSizer from 'react-virtualized-auto-sizer';
import { GrafanaTheme2, StandardEditorProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/timeseries/InsertNullsEditor.tsx b/public/app/plugins/panel/timeseries/InsertNullsEditor.tsx
index a9c11c28a01..868393ca497 100644
--- a/public/app/plugins/panel/timeseries/InsertNullsEditor.tsx
+++ b/public/app/plugins/panel/timeseries/InsertNullsEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { StandardEditorProps, SelectableValue } from '@grafana/data';
import { HorizontalGroup, RadioButtonGroup } from '@grafana/ui';
diff --git a/public/app/plugins/panel/timeseries/LineStyleEditor.tsx b/public/app/plugins/panel/timeseries/LineStyleEditor.tsx
index cd90f9bdcc9..f5f3d14bc5e 100644
--- a/public/app/plugins/panel/timeseries/LineStyleEditor.tsx
+++ b/public/app/plugins/panel/timeseries/LineStyleEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { StandardEditorProps, SelectableValue } from '@grafana/data';
import { LineStyle } from '@grafana/schema';
diff --git a/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx b/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx
index 8d9df298714..3e83be1cb25 100644
--- a/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx
+++ b/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx
@@ -1,4 +1,4 @@
-import React from 'react';
+import * as React from 'react';
import { rangeUtil } from '@grafana/data';
import { Input } from '@grafana/ui';
diff --git a/public/app/plugins/panel/timeseries/SpanNullsEditor.tsx b/public/app/plugins/panel/timeseries/SpanNullsEditor.tsx
index 5344dc8a528..f7ac5d4ebc2 100644
--- a/public/app/plugins/panel/timeseries/SpanNullsEditor.tsx
+++ b/public/app/plugins/panel/timeseries/SpanNullsEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { StandardEditorProps, SelectableValue } from '@grafana/data';
import { HorizontalGroup, RadioButtonGroup } from '@grafana/ui';
diff --git a/public/app/plugins/panel/timeseries/ThresholdsStyleEditor.tsx b/public/app/plugins/panel/timeseries/ThresholdsStyleEditor.tsx
index bd67c199106..af4048c9c6a 100644
--- a/public/app/plugins/panel/timeseries/ThresholdsStyleEditor.tsx
+++ b/public/app/plugins/panel/timeseries/ThresholdsStyleEditor.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback } from 'react';
+import { useCallback } from 'react';
import { StandardEditorProps, SelectableValue } from '@grafana/data';
import { GraphThresholdsStyleMode } from '@grafana/schema';
diff --git a/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx b/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx
index 22fae4f81ff..32ec1c7b62a 100644
--- a/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx
+++ b/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import { PanelProps, DataFrameType, DashboardCursorSync } from '@grafana/data';
import { PanelDataErrorView } from '@grafana/runtime';
diff --git a/public/app/plugins/panel/timeseries/TimeSeriesTooltip.tsx b/public/app/plugins/panel/timeseries/TimeSeriesTooltip.tsx
index f9982d9898c..49f8a3262bb 100644
--- a/public/app/plugins/panel/timeseries/TimeSeriesTooltip.tsx
+++ b/public/app/plugins/panel/timeseries/TimeSeriesTooltip.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { DataFrame, Field, FieldType, formattedValueToString } from '@grafana/data';
import { SortOrder, TooltipDisplayMode } from '@grafana/schema/dist/esm/common/common.gen';
diff --git a/public/app/plugins/panel/timeseries/TimezonesEditor.tsx b/public/app/plugins/panel/timeseries/TimezonesEditor.tsx
index 4e47a88b30d..d62a538aebf 100644
--- a/public/app/plugins/panel/timeseries/TimezonesEditor.tsx
+++ b/public/app/plugins/panel/timeseries/TimezonesEditor.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2, InternalTimeZones, StandardEditorProps } from '@grafana/data';
import { OptionsWithTimezones } from '@grafana/schema';
diff --git a/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin2.tsx b/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin2.tsx
index 945af93ca6c..6e915bd3671 100644
--- a/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin2.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin2.tsx
@@ -1,5 +1,6 @@
import { css } from '@emotion/css';
-import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useReducer } from 'react';
+import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useReducer } from 'react';
+import * as React from 'react';
import { createPortal } from 'react-dom';
import tinycolor from 'tinycolor2';
import uPlot from 'uplot';
diff --git a/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx b/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx
index 04c1c95b574..fec87618709 100644
--- a/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx
@@ -9,7 +9,8 @@ import {
useHover,
useInteractions,
} from '@floating-ui/react';
-import React, { CSSProperties, useCallback, useEffect, useState } from 'react';
+import { CSSProperties, useCallback, useEffect, useState } from 'react';
+import * as React from 'react';
import { DataFrame, DataFrameFieldIndex, Field, formattedValueToString, GrafanaTheme2, LinkModel } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
diff --git a/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx
index 754e052c7b9..c741f821f88 100644
--- a/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useLayoutEffect, useRef, useState } from 'react';
+import { useCallback, useLayoutEffect, useRef, useState } from 'react';
import uPlot from 'uplot';
import {
diff --git a/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx b/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx
index d802f85def4..5dea52b23f8 100644
--- a/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx
@@ -1,4 +1,4 @@
-import React, { useLayoutEffect, useRef, useState } from 'react';
+import { useLayoutEffect, useRef, useState } from 'react';
import uPlot, { TypedArray, Scale } from 'uplot';
import { AbsoluteTimeRange } from '@grafana/data';
diff --git a/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx
index a286ce7612f..76ff1c3b3eb 100644
--- a/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx
@@ -1,4 +1,4 @@
-import React, { useState, useLayoutEffect, useMemo, useRef } from 'react';
+import { useState, useLayoutEffect, useMemo, useRef } from 'react';
import uPlot from 'uplot';
import { FieldConfigSource, ThresholdsConfig, getValueFormat, FieldType } from '@grafana/data';
diff --git a/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx b/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx
index 133e10415e2..d7da47bd24d 100644
--- a/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx
@@ -1,6 +1,6 @@
import { css } from '@emotion/css';
import { noop } from 'lodash';
-import React, { useMemo, useState } from 'react';
+import { useMemo, useState } from 'react';
import Draggable, { DraggableBounds } from 'react-draggable';
import { Threshold, GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx
index 21f998ce696..dde832c1fe1 100644
--- a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useRef } from 'react';
+import { useRef } from 'react';
import { Controller } from 'react-hook-form';
import { useAsyncFn, useClickAway } from 'react-use';
diff --git a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationMarker2.tsx b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationMarker2.tsx
index 2353971f734..513a620c985 100644
--- a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationMarker2.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationMarker2.tsx
@@ -1,7 +1,8 @@
import { css } from '@emotion/css';
import { flip, shift, autoUpdate } from '@floating-ui/dom';
import { useFloating } from '@floating-ui/react';
-import React, { useState } from 'react';
+import { useState } from 'react';
+import * as React from 'react';
import { createPortal } from 'react-dom';
import { GrafanaTheme2 } from '@grafana/data';
diff --git a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx
index b7c7f5290eb..d6994245f4e 100644
--- a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx
+++ b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import * as React from 'react';
import { GrafanaTheme2, dateTimeFormat, systemDateFormats, textUtil } from '@grafana/data';
import { HorizontalGroup, IconButton, Tag, usePanelContext, useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/traces/TracesPanel.test.tsx b/public/app/plugins/panel/traces/TracesPanel.test.tsx
index 8eb3a49094f..a94cc637936 100644
--- a/public/app/plugins/panel/traces/TracesPanel.test.tsx
+++ b/public/app/plugins/panel/traces/TracesPanel.test.tsx
@@ -1,5 +1,4 @@
import { render, screen } from '@testing-library/react';
-import React from 'react';
import { LoadingState, PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/traces/TracesPanel.tsx b/public/app/plugins/panel/traces/TracesPanel.tsx
index f33e04f64eb..3053413e053 100644
--- a/public/app/plugins/panel/traces/TracesPanel.tsx
+++ b/public/app/plugins/panel/traces/TracesPanel.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useMemo, createRef } from 'react';
+import { useMemo, createRef } from 'react';
import { useAsync } from 'react-use';
import { Field, LinkModel, PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/trend/TrendPanel.tsx b/public/app/plugins/panel/trend/TrendPanel.tsx
index 522c231eb08..757789d7e87 100644
--- a/public/app/plugins/panel/trend/TrendPanel.tsx
+++ b/public/app/plugins/panel/trend/TrendPanel.tsx
@@ -1,4 +1,4 @@
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { DataFrame, FieldMatcherID, fieldMatchers, FieldType, PanelProps, TimeRange } from '@grafana/data';
import { isLikelyAscendingVector } from '@grafana/data/src/transformations/transformers/joinDataFrames';
diff --git a/public/app/plugins/panel/welcome/Welcome.tsx b/public/app/plugins/panel/welcome/Welcome.tsx
index b427770b63b..708678032c0 100644
--- a/public/app/plugins/panel/welcome/Welcome.tsx
+++ b/public/app/plugins/panel/welcome/Welcome.tsx
@@ -1,5 +1,4 @@
import { css } from '@emotion/css';
-import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
diff --git a/public/app/plugins/panel/xychart/AutoEditor.tsx b/public/app/plugins/panel/xychart/AutoEditor.tsx
index 82a346fd3f0..3ceb607b321 100644
--- a/public/app/plugins/panel/xychart/AutoEditor.tsx
+++ b/public/app/plugins/panel/xychart/AutoEditor.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import {
SelectableValue,
diff --git a/public/app/plugins/panel/xychart/ManualEditor.tsx b/public/app/plugins/panel/xychart/ManualEditor.tsx
index f86ff255393..6459e778fe9 100644
--- a/public/app/plugins/panel/xychart/ManualEditor.tsx
+++ b/public/app/plugins/panel/xychart/ManualEditor.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { useState, useEffect, useMemo } from 'react';
+import { useState, useEffect, useMemo } from 'react';
import {
GrafanaTheme2,
diff --git a/public/app/plugins/panel/xychart/ScatterSeriesEditor.tsx b/public/app/plugins/panel/xychart/ScatterSeriesEditor.tsx
index a100d919807..f1283135229 100644
--- a/public/app/plugins/panel/xychart/ScatterSeriesEditor.tsx
+++ b/public/app/plugins/panel/xychart/ScatterSeriesEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { StandardEditorProps, FieldNamePickerBaseNameMode } from '@grafana/data';
import { Field } from '@grafana/ui';
import { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';
diff --git a/public/app/plugins/panel/xychart/SymbolEditor.tsx b/public/app/plugins/panel/xychart/SymbolEditor.tsx
index b7112613385..b0f176054cf 100644
--- a/public/app/plugins/panel/xychart/SymbolEditor.tsx
+++ b/public/app/plugins/panel/xychart/SymbolEditor.tsx
@@ -1,5 +1,3 @@
-import React from 'react';
-
import { StandardEditorProps } from '@grafana/data';
import { ResourceDimensionConfig, ResourceDimensionMode } from '@grafana/schema';
import { RadioButtonGroup } from '@grafana/ui';
diff --git a/public/app/plugins/panel/xychart/XYChartPanel.tsx b/public/app/plugins/panel/xychart/XYChartPanel.tsx
index a15e8a77f8d..7fc3ca9d7c1 100644
--- a/public/app/plugins/panel/xychart/XYChartPanel.tsx
+++ b/public/app/plugins/panel/xychart/XYChartPanel.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useState, useEffect, useCallback } from 'react';
+import { useState, useEffect, useCallback } from 'react';
import { usePrevious } from 'react-use';
import { PanelProps } from '@grafana/data';
diff --git a/public/app/plugins/panel/xychart/XYChartTooltip.test.tsx b/public/app/plugins/panel/xychart/XYChartTooltip.test.tsx
index b8999620597..5ea82819990 100644
--- a/public/app/plugins/panel/xychart/XYChartTooltip.test.tsx
+++ b/public/app/plugins/panel/xychart/XYChartTooltip.test.tsx
@@ -1,5 +1,4 @@
import { render } from '@testing-library/react';
-import React from 'react';
import { DataFrame, FieldType, ValueLinkConfig, LinkTarget } from '@grafana/data';
import { SortOrder, VisibilityMode } from '@grafana/schema';
diff --git a/public/app/plugins/panel/xychart/XYChartTooltip.tsx b/public/app/plugins/panel/xychart/XYChartTooltip.tsx
index 9012ccca99c..06f40f45228 100644
--- a/public/app/plugins/panel/xychart/XYChartTooltip.tsx
+++ b/public/app/plugins/panel/xychart/XYChartTooltip.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { DataFrame, Field, getFieldDisplayName } from '@grafana/data';
import { alpha } from '@grafana/data/src/themes/colorManipulator';
diff --git a/public/app/plugins/panel/xychart/v2/SeriesEditor.tsx b/public/app/plugins/panel/xychart/v2/SeriesEditor.tsx
index b76b0d16b66..7fe1f777b45 100644
--- a/public/app/plugins/panel/xychart/v2/SeriesEditor.tsx
+++ b/public/app/plugins/panel/xychart/v2/SeriesEditor.tsx
@@ -1,5 +1,5 @@
import { css, cx } from '@emotion/css';
-import React, { Fragment, useState } from 'react';
+import { Fragment, useState } from 'react';
import { usePrevious } from 'react-use';
import {
diff --git a/public/app/plugins/panel/xychart/v2/XYChartPanel.tsx b/public/app/plugins/panel/xychart/v2/XYChartPanel.tsx
index 8ee5098ac9c..cbc2c80c656 100644
--- a/public/app/plugins/panel/xychart/v2/XYChartPanel.tsx
+++ b/public/app/plugins/panel/xychart/v2/XYChartPanel.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React, { useMemo } from 'react';
+import { useMemo } from 'react';
import { FALLBACK_COLOR, PanelProps } from '@grafana/data';
import { alpha } from '@grafana/data/src/themes/colorManipulator';
diff --git a/public/app/plugins/panel/xychart/v2/XYChartTooltip.tsx b/public/app/plugins/panel/xychart/v2/XYChartTooltip.tsx
index 932fc21a0b3..c35a964f832 100644
--- a/public/app/plugins/panel/xychart/v2/XYChartTooltip.tsx
+++ b/public/app/plugins/panel/xychart/v2/XYChartTooltip.tsx
@@ -1,4 +1,4 @@
-import React, { ReactNode } from 'react';
+import { ReactNode } from 'react';
import { DataFrame } from '@grafana/data';
import { alpha } from '@grafana/data/src/themes/colorManipulator';
diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx
index 34d3ade4622..397958a2107 100644
--- a/public/app/routes/routes.tsx
+++ b/public/app/routes/routes.tsx
@@ -1,4 +1,3 @@
-import React from 'react';
import { Redirect, RouteComponentProps } from 'react-router-dom';
import { isTruthy } from '@grafana/data';
diff --git a/public/test/helpers/TestProvider.tsx b/public/test/helpers/TestProvider.tsx
index bd29e06b3bc..7fc3861693c 100644
--- a/public/test/helpers/TestProvider.tsx
+++ b/public/test/helpers/TestProvider.tsx
@@ -1,5 +1,5 @@
import { Store } from '@reduxjs/toolkit';
-import React from 'react';
+import * as React from 'react';
import { Provider } from 'react-redux';
import { Router } from 'react-router-dom';
import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock';
diff --git a/public/test/helpers/alertingRuleEditor.tsx b/public/test/helpers/alertingRuleEditor.tsx
index 272e3fb4868..adf840775bd 100644
--- a/public/test/helpers/alertingRuleEditor.tsx
+++ b/public/test/helpers/alertingRuleEditor.tsx
@@ -1,5 +1,4 @@
import { render } from '@testing-library/react';
-import React from 'react';
import { Route } from 'react-router-dom';
import { byRole, byTestId, byText } from 'testing-library-selector';
diff --git a/public/test/mocks/react-inlinesvg.tsx b/public/test/mocks/react-inlinesvg.tsx
index f05d3cfa8c1..79bcf2c6cb9 100644
--- a/public/test/mocks/react-inlinesvg.tsx
+++ b/public/test/mocks/react-inlinesvg.tsx
@@ -1,4 +1,4 @@
-import React, { Ref } from 'react';
+import { Ref } from 'react';
export default function ReactInlineSVG({
src,
diff --git a/public/test/test-utils.tsx b/public/test/test-utils.tsx
index 102bcfa2569..8083093c7a4 100644
--- a/public/test/test-utils.tsx
+++ b/public/test/test-utils.tsx
@@ -2,7 +2,8 @@ import { Store } from '@reduxjs/toolkit';
import { render, RenderOptions } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { createMemoryHistory, MemoryHistoryBuildOptions } from 'history';
-import React, { Fragment, PropsWithChildren } from 'react';
+import { Fragment, PropsWithChildren } from 'react';
+import * as React from 'react';
import { Provider } from 'react-redux';
import { Router } from 'react-router-dom';
import { getGrafanaContextMock } from 'test/mocks/getGrafanaContextMock';
diff --git a/scripts/webpack/webpack.dev.js b/scripts/webpack/webpack.dev.js
index eca2fd0c9d6..aea468e7959 100644
--- a/scripts/webpack/webpack.dev.js
+++ b/scripts/webpack/webpack.dev.js
@@ -18,6 +18,7 @@ const esbuildTargets = resolveToEsbuildTarget(browserslist(), { printUnknownTarg
const esbuildOptions = {
target: esbuildTargets,
format: undefined,
+ jsx: 'automatic',
};
// To speed up webpack and prevent unnecessary rebuilds we ignore decoupled packages
@@ -45,7 +46,7 @@ module.exports = (env = {}) => {
resolve: {
alias: {
// Packages linked for development need react to be resolved from the same location
- react: require.resolve('react'),
+ react: path.resolve('./node_modules/react'),
// Also Grafana packages need to be resolved from the same location so they share
// the same singletons
diff --git a/scripts/webpack/webpack.prod.js b/scripts/webpack/webpack.prod.js
index a94550fd0a5..c275250cf72 100644
--- a/scripts/webpack/webpack.prod.js
+++ b/scripts/webpack/webpack.prod.js
@@ -18,6 +18,7 @@ const esbuildTargets = resolveToEsbuildTarget(browserslist(), { printUnknownTarg
const esbuildOptions = {
target: esbuildTargets,
format: undefined,
+ jsx: 'automatic',
};
module.exports = (env = {}) =>
diff --git a/tsconfig.json b/tsconfig.json
index 40bee96229b..3a26dd6e12d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
{
"compilerOptions": {
- "jsx": "react",
+ "jsx": "react-jsx",
"baseUrl": "public/",
"outDir": "public/dist",
"rootDirs": ["public/"],
From 0759c98504fba882928d53137491abf06e608619 Mon Sep 17 00:00:00 2001
From: Chris Hodges
Date: Tue, 25 Jun 2024 06:45:16 -0500
Subject: [PATCH 19/54] Tempo: Fix user facing typo in pipeline operator error
message (#89638)
Tempo: Fix user facing typo in TraceQL pipeline operator error message
---
.../plugins/datasource/tempo/traceql/highlighting.test.ts | 8 ++++----
.../app/plugins/datasource/tempo/traceql/highlighting.ts | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/public/app/plugins/datasource/tempo/traceql/highlighting.test.ts b/public/app/plugins/datasource/tempo/traceql/highlighting.test.ts
index e9b1d2a80ed..335983a824b 100644
--- a/public/app/plugins/datasource/tempo/traceql/highlighting.test.ts
+++ b/public/app/plugins/datasource/tempo/traceql/highlighting.test.ts
@@ -102,7 +102,7 @@ describe('Highlighting', () => {
['{span.http.status_code = 200} &&', 'Invalid spanset expression after spanset combining operator.'],
[
'{span.http.status_code = 200} && {span.http.status_code = 200} | foo() > 3',
- 'Invalid aggregation operator after pipepile operator.',
+ 'Invalid aggregation operator after pipeline operator.',
],
[
'{span.http.status_code = 200} && {span.http.status_code = 200} | avg() > 3',
@@ -134,9 +134,9 @@ describe('Highlighting', () => {
['{ span. }', 'Invalid expression for spanset.'],
['{.foo=}', 'Invalid value after comparison or arithmetic operator.'],
['{.foo="}', 'Invalid value after comparison or arithmetic operator.'],
- ['{.foo=300} |', 'Invalid aggregation operator after pipepile operator.'],
- ['{.foo=300} && {.bar=200} |', 'Invalid aggregation operator after pipepile operator.'],
- ['{.foo=300} && {.bar=300} && {.foo=300} |', 'Invalid aggregation operator after pipepile operator.'],
+ ['{.foo=300} |', 'Invalid aggregation operator after pipeline operator.'],
+ ['{.foo=300} && {.bar=200} |', 'Invalid aggregation operator after pipeline operator.'],
+ ['{.foo=300} && {.bar=300} && {.foo=300} |', 'Invalid aggregation operator after pipeline operator.'],
['{.foo=300} | avg(.value)', 'Invalid comparison operator after aggregator operator.'],
['{.foo=300} && {.foo=300} | avg(.value)', 'Invalid comparison operator after aggregator operator.'],
['{.foo=300} | avg(.value) =', 'Invalid value after comparison operator.'],
diff --git a/public/app/plugins/datasource/tempo/traceql/highlighting.ts b/public/app/plugins/datasource/tempo/traceql/highlighting.ts
index a8fbefc23ce..21e17c9aba8 100644
--- a/public/app/plugins/datasource/tempo/traceql/highlighting.ts
+++ b/public/app/plugins/datasource/tempo/traceql/highlighting.ts
@@ -52,7 +52,7 @@ export const computeErrorMessage = (errorNode: SyntaxNode) => {
case SpansetPipelineExpression:
return 'Invalid spanset combining operator after spanset expression.';
case Pipe:
- return 'Invalid aggregation operator after pipepile operator.';
+ return 'Invalid aggregation operator after pipeline operator.';
default:
return 'Invalid spanset expression after spanset combining operator.';
}
From df4b280134d5f43c15e6c378db365a5596c532cb Mon Sep 17 00:00:00 2001
From: Javier Ruiz
Date: Tue, 25 Jun 2024 13:48:06 +0200
Subject: [PATCH 20/54] Trace View: Add Session for this span button (#89656)
* Add ability to show Session for this span button in trace view
* Add session link when fe o11y ids are available
* Add tests for creating session links
* Also check for session id written following otel semantic convention
---
.../TraceTimelineViewer/SpanDetail/index.tsx | 22 +++++++-
.../TraceView/components/types/links.ts | 1 +
.../explore/TraceView/createSpanLink.test.ts | 51 +++++++++++++++++++
.../explore/TraceView/createSpanLink.tsx | 22 ++++++++
4 files changed, 94 insertions(+), 2 deletions(-)
diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx
index b544c9b4f81..2b12605abd0 100644
--- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx
+++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx
@@ -114,6 +114,11 @@ const getStyles = (theme: GrafanaTheme2) => {
LinkIcon: css`
font-size: 1.5em;
`,
+ linkList: css({
+ display: 'flex',
+ flexWrap: 'wrap',
+ gap: '10px',
+ }),
};
};
@@ -303,6 +308,7 @@ export default function SpanDetail(props: SpanDetailProps) {
let logLinkButton: JSX.Element | null = null;
let profileLinkButton: JSX.Element | null = null;
+ let sessionLinkButton: JSX.Element | null = null;
if (createSpanLink) {
const links = createSpanLink(span);
const logsLink = links?.filter((link) => link.type === SpanLinkType.Logs);
@@ -315,6 +321,15 @@ export default function SpanDetail(props: SpanDetailProps) {
if (links && profilesLink && profilesLink.length > 0) {
profileLinkButton = createLinkButton(profilesLink[0], SpanLinkType.Profiles, 'Profiles for this span', 'link');
}
+ const sessionLink = links?.filter((link) => link.type === SpanLinkType.Session);
+ if (links && sessionLink && sessionLink.length > 0) {
+ sessionLinkButton = createLinkButton(
+ sessionLink[0],
+ SpanLinkType.Session,
+ 'Session for this span',
+ 'frontend-observability'
+ );
+ }
}
const focusSpanLink = createFocusSpanLink(traceID, spanID);
@@ -326,8 +341,11 @@ export default function SpanDetail(props: SpanDetailProps) {