Connections: Show the Dashboards tab under DataSource settings (#61841)
* fix: use the correct URL for editing datasource dashboards * feat: show the Datasource/Dashboards page under Connections as well * refactor: remove unnecessary `useNavModel()` utility * feat: add a utility for creating the nav-model for DS settings tabs * refactor: use nav-model crating utility in Edit Datasource
This commit is contained in:
@@ -8,6 +8,7 @@ import { StoreState, useSelector } from 'app/types';
|
|||||||
import { ROUTES } from './constants';
|
import { ROUTES } from './constants';
|
||||||
import {
|
import {
|
||||||
ConnectDataPage,
|
ConnectDataPage,
|
||||||
|
DataSourceDashboardsPage,
|
||||||
DataSourceDetailsPage,
|
DataSourceDetailsPage,
|
||||||
DataSourcesListPage,
|
DataSourcesListPage,
|
||||||
EditDataSourcePage,
|
EditDataSourcePage,
|
||||||
@@ -38,6 +39,7 @@ export default function Connections() {
|
|||||||
<Route exact path={ROUTES.DataSourcesDetails} component={DataSourceDetailsPage} />
|
<Route exact path={ROUTES.DataSourcesDetails} component={DataSourceDetailsPage} />
|
||||||
<Route exact path={ROUTES.DataSourcesNew} component={NewDataSourcePage} />
|
<Route exact path={ROUTES.DataSourcesNew} component={NewDataSourcePage} />
|
||||||
<Route exact path={ROUTES.DataSourcesEdit} component={EditDataSourcePage} />
|
<Route exact path={ROUTES.DataSourcesEdit} component={EditDataSourcePage} />
|
||||||
|
<Route exact path={ROUTES.DataSourcesDashboards} component={DataSourceDashboardsPage} />
|
||||||
{!isConnectDataPageOverriden && <Route path={ROUTES.ConnectData} component={ConnectDataPage} />}
|
{!isConnectDataPageOverriden && <Route path={ROUTES.ConnectData} component={ConnectDataPage} />}
|
||||||
|
|
||||||
{/* Default page */}
|
{/* Default page */}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export const ROUTES = {
|
|||||||
DataSources: `/${ROUTE_BASE_ID}/your-connections/datasources`,
|
DataSources: `/${ROUTE_BASE_ID}/your-connections/datasources`,
|
||||||
DataSourcesNew: `/${ROUTE_BASE_ID}/your-connections/datasources/new`,
|
DataSourcesNew: `/${ROUTE_BASE_ID}/your-connections/datasources/new`,
|
||||||
DataSourcesEdit: `/${ROUTE_BASE_ID}/your-connections/datasources/edit/:uid`,
|
DataSourcesEdit: `/${ROUTE_BASE_ID}/your-connections/datasources/edit/:uid`,
|
||||||
DataSourcesDashboards: `/${ROUTE_BASE_ID}/datasources/edit/:uid/dashboards`,
|
DataSourcesDashboards: `/${ROUTE_BASE_ID}/your-connections/datasources/edit/:uid/dashboards`,
|
||||||
|
|
||||||
// Connect Data
|
// Connect Data
|
||||||
ConnectData: `/${ROUTE_BASE_ID}/connect-data`,
|
ConnectData: `/${ROUTE_BASE_ID}/connect-data`,
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import { useLocation, useParams } from 'react-router-dom';
|
||||||
|
|
||||||
|
import {
|
||||||
|
useDataSource,
|
||||||
|
useDataSourceSettingsNav as useDataSourceSettingsNavOriginal,
|
||||||
|
} from 'app/features/datasources/state/hooks';
|
||||||
|
import { useGetSingle } from 'app/features/plugins/admin/state/hooks';
|
||||||
|
|
||||||
|
// We are extending the original useDataSourceSettingsNav in the following ways:
|
||||||
|
// - changing the URL of the nav items to point to Connections
|
||||||
|
// - setting the parent nav item
|
||||||
|
export function useDataSourceSettingsNav(pageId?: string) {
|
||||||
|
const { uid } = useParams<{ uid: string }>();
|
||||||
|
const location = useLocation();
|
||||||
|
const datasource = useDataSource(uid);
|
||||||
|
const datasourcePlugin = useGetSingle(datasource.type);
|
||||||
|
const params = new URLSearchParams(location.search);
|
||||||
|
const nav = useDataSourceSettingsNavOriginal(uid, pageId || params.get('page'));
|
||||||
|
const pageNav = {
|
||||||
|
...nav.main,
|
||||||
|
text: datasource.name,
|
||||||
|
subTitle: `Type: ${datasourcePlugin?.name}`,
|
||||||
|
active: true,
|
||||||
|
children: (nav.main.children || []).map((navModelItem) => ({
|
||||||
|
...navModelItem,
|
||||||
|
url: navModelItem.url?.replace('datasources/edit/', '/connections/your-connections/datasources/edit/'),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
navId: 'connections-your-connections-datasources',
|
||||||
|
pageNav,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import { useLocation } from 'react-router-dom';
|
|
||||||
|
|
||||||
import { NavModelItem } from '@grafana/data';
|
|
||||||
import { useSelector } from 'app/types';
|
|
||||||
|
|
||||||
import { ROUTE_BASE_ID } from '../constants';
|
|
||||||
|
|
||||||
// We need this utility logic to make sure that the tab with the current URL is marked as active.
|
|
||||||
// (In case we were using `getNavModel()` from app/core/selectors/navModel, then we would need to set
|
|
||||||
// the child nav-model-item's ID on the call-site.)
|
|
||||||
export const useNavModel = () => {
|
|
||||||
const { pathname: currentPath } = useLocation();
|
|
||||||
const navIndex = useSelector((state) => state.navIndex);
|
|
||||||
const node = navIndex[ROUTE_BASE_ID];
|
|
||||||
const main = node;
|
|
||||||
const isDefaultRoute = (item: NavModelItem) =>
|
|
||||||
currentPath === `/${ROUTE_BASE_ID}` && item.id === 'connections-datasources';
|
|
||||||
const isItemActive = (item: NavModelItem) => currentPath.startsWith(item.url || '');
|
|
||||||
|
|
||||||
main.children = main.children?.map((item) => ({
|
|
||||||
...item,
|
|
||||||
active: isItemActive(item) || isDefaultRoute(item),
|
|
||||||
}));
|
|
||||||
|
|
||||||
return {
|
|
||||||
node,
|
|
||||||
main,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import * as React from 'react';
|
||||||
|
import { useParams } from 'react-router-dom';
|
||||||
|
|
||||||
|
import { Page } from 'app/core/components/Page/Page';
|
||||||
|
import { DataSourceDashboards } from 'app/features/datasources/components/DataSourceDashboards';
|
||||||
|
|
||||||
|
import { useDataSourceSettingsNav } from '../hooks/useDataSourceSettingsNav';
|
||||||
|
|
||||||
|
export function DataSourceDashboardsPage() {
|
||||||
|
const { uid } = useParams<{ uid: string }>();
|
||||||
|
const { navId, pageNav } = useDataSourceSettingsNav('dashboards');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Page navId={navId} pageNav={pageNav}>
|
||||||
|
<Page.Contents>
|
||||||
|
<DataSourceDashboards uid={uid} />
|
||||||
|
</Page.Contents>
|
||||||
|
</Page>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -3,22 +3,18 @@ import { useLocation, useParams } from 'react-router-dom';
|
|||||||
|
|
||||||
import { Page } from 'app/core/components/Page/Page';
|
import { Page } from 'app/core/components/Page/Page';
|
||||||
import { EditDataSource } from 'app/features/datasources/components/EditDataSource';
|
import { EditDataSource } from 'app/features/datasources/components/EditDataSource';
|
||||||
import { useDataSource } from 'app/features/datasources/state/hooks';
|
|
||||||
import { useGetSingle } from 'app/features/plugins/admin/state/hooks';
|
import { useDataSourceSettingsNav } from '../hooks/useDataSourceSettingsNav';
|
||||||
|
|
||||||
export function EditDataSourcePage() {
|
export function EditDataSourcePage() {
|
||||||
const { uid } = useParams<{ uid: string }>();
|
const { uid } = useParams<{ uid: string }>();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const datasource = useDataSource(uid);
|
|
||||||
const datasourcePlugin = useGetSingle(datasource.type);
|
|
||||||
const params = new URLSearchParams(location.search);
|
const params = new URLSearchParams(location.search);
|
||||||
const pageId = params.get('page');
|
const pageId = params.get('page');
|
||||||
|
const { navId, pageNav } = useDataSourceSettingsNav();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Page
|
<Page navId={navId} pageNav={pageNav}>
|
||||||
navId={'connections-your-connections-datasources'}
|
|
||||||
pageNav={{ text: datasource.name, subTitle: `Type: ${datasourcePlugin?.name}`, active: true }}
|
|
||||||
>
|
|
||||||
<Page.Contents>
|
<Page.Contents>
|
||||||
<EditDataSource uid={uid} pageId={pageId} />
|
<EditDataSource uid={uid} pageId={pageId} />
|
||||||
</Page.Contents>
|
</Page.Contents>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
export { ConnectDataPage } from './ConnectDataPage';
|
export { ConnectDataPage } from './ConnectDataPage';
|
||||||
export { DataSourceDetailsPage } from './DataSourceDetailsPage';
|
export { DataSourceDetailsPage } from './DataSourceDetailsPage';
|
||||||
export { DataSourcesListPage } from './DataSourcesListPage';
|
export { DataSourcesListPage } from './DataSourcesListPage';
|
||||||
|
export { DataSourceDashboardsPage } from './DataSourceDashboardsPage';
|
||||||
export { EditDataSourcePage } from './EditDataSourcePage';
|
export { EditDataSourcePage } from './EditDataSourcePage';
|
||||||
export { NewDataSourcePage } from './NewDataSourcePage';
|
export { NewDataSourcePage } from './NewDataSourcePage';
|
||||||
|
|||||||
Reference in New Issue
Block a user