diff --git a/.betterer.results b/.betterer.results
index 5b994c6eb51..90befadff48 100644
--- a/.betterer.results
+++ b/.betterer.results
@@ -3771,9 +3771,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "7"],
[0, 0, 0, "Do not use any type assertions.", "8"]
],
- "public/app/features/explore/Wrapper.test.tsx:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
- ],
"public/app/features/explore/spec/helper/setup.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
diff --git a/public/app/features/dashboard/containers/NewDashboardPage.tsx b/public/app/features/dashboard/containers/NewDashboardPage.tsx
index 2e1575d8e3b..934728a73e9 100644
--- a/public/app/features/dashboard/containers/NewDashboardPage.tsx
+++ b/public/app/features/dashboard/containers/NewDashboardPage.tsx
@@ -2,12 +2,13 @@ import React, { useState } from 'react';
import { useEffectOnce } from 'react-use';
import { config } from '@grafana/runtime';
+import { t } from 'app/core/internationalization';
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
+import { EmptyStateNoDatasource } from 'app/features/datasources/components/EmptyStateNoDatasource';
import { loadDataSources } from 'app/features/datasources/state';
import { useDispatch, useSelector } from 'app/types';
import DashboardPage from './DashboardPage';
-import { DatasourceOnboarding } from './DatasourceOnboarding';
export default function NewDashboardPage(props: GrafanaRouteComponentProps) {
const dispatch = useDispatch();
@@ -25,6 +26,13 @@ export default function NewDashboardPage(props: GrafanaRouteComponentProps) {
return showDashboardPage ? (
) : (
- setCreateDashboard(true)} loading={loading} />
+ setCreateDashboard(true)}
+ loading={loading}
+ title={t('datasource-onboarding.welcome', 'Welcome to Grafana dashboards!')}
+ CTAText={t('datasource-onboarding.sampleData', 'Or set up a new dashboard with sample data')}
+ navId="dashboards/browse"
+ pageNav={{ text: t('dashboard', 'New dashboard'), url: '/dashboard/new' }}
+ />
);
}
diff --git a/public/app/features/dashboard/containers/DatasourceOnboarding.tsx b/public/app/features/datasources/components/EmptyStateNoDatasource.tsx
similarity index 90%
rename from public/app/features/dashboard/containers/DatasourceOnboarding.tsx
rename to public/app/features/datasources/components/EmptyStateNoDatasource.tsx
index 36abb698e6c..b0a53fdcab4 100644
--- a/public/app/features/dashboard/containers/DatasourceOnboarding.tsx
+++ b/public/app/features/datasources/components/EmptyStateNoDatasource.tsx
@@ -1,5 +1,5 @@
import { css } from '@emotion/css';
-import React from 'react';
+import React, { ComponentProps } from 'react';
import { useAsync } from 'react-use';
import { DataSourcePluginMeta, GrafanaTheme2, PageLayoutType } from '@grafana/data';
@@ -21,13 +21,14 @@ const topDatasources = [
'grafana-azure-monitor-datasource',
];
-export function DatasourceOnboarding({
- onNewDashboard,
- loading = false,
-}: {
- onNewDashboard?: () => void;
+interface Props extends Pick, 'navId' | 'pageNav'> {
+ title: string;
+ CTAText: string;
+ onCTAClick?: () => void;
loading?: boolean;
-}) {
+}
+
+export function EmptyStateNoDatasource({ onCTAClick, loading = false, title, CTAText, navId, pageNav }: Props) {
const styles = useStyles2(getStyles);
const { value: datasources, loading: loadingDatasources } = useAsync(async () => {
const datasourceMeta: DataSourcePluginMeta[] = await getBackendSrv().get('/api/plugins', {
@@ -50,13 +51,9 @@ export function DatasourceOnboarding({
}
return (
-
+
-
{t('datasource-onboarding.welcome', 'Welcome to Grafana dashboards!')}
+
{title}
{t('datasource-onboarding.explanation', "To visualize your data, you'll need to connect it first.")}
@@ -100,8 +97,8 @@ export function DatasourceOnboarding({
{t('datasource-onboarding.contact-admin', 'Please contact your administrator to configure data sources.')}