123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import { DataSourceSettings, PluginType, PluginInclude, NavModel, NavModelItem } from '@grafana/data';
- import { featureEnabled } from '@grafana/runtime';
- import { ProBadge } from 'app/core/components/Upgrade/ProBadge';
- import config from 'app/core/config';
- import { contextSrv } from 'app/core/core';
- import { AccessControlAction } from 'app/types';
- import { highlightTrial } from '../../admin/utils';
- import { GenericDataSourcePlugin } from '../settings/PluginSettings';
- const loadingDSType = 'Loading';
- export function buildNavModel(dataSource: DataSourceSettings, plugin: GenericDataSourcePlugin): NavModelItem {
- const pluginMeta = plugin.meta;
- const highlightsEnabled = config.featureToggles.featureHighlights;
- const navModel: NavModelItem = {
- img: pluginMeta.info.logos.large,
- id: 'datasource-' + dataSource.uid,
- subTitle: `Type: ${pluginMeta.name}`,
- url: '',
- text: dataSource.name,
- breadcrumbs: [{ title: 'Data Sources', url: 'datasources' }],
- children: [
- {
- active: false,
- icon: 'sliders-v-alt',
- id: `datasource-settings-${dataSource.uid}`,
- text: 'Settings',
- url: `datasources/edit/${dataSource.uid}/`,
- },
- ],
- };
- if (plugin.configPages) {
- for (const page of plugin.configPages) {
- navModel.children!.push({
- active: false,
- text: page.title,
- icon: page.icon,
- url: `datasources/edit/${dataSource.uid}/?page=${page.id}`,
- id: `datasource-page-${page.id}`,
- });
- }
- }
- if (pluginMeta.includes && hasDashboards(pluginMeta.includes) && contextSrv.hasRole('Admin')) {
- navModel.children!.push({
- active: false,
- icon: 'apps',
- id: `datasource-dashboards-${dataSource.uid}`,
- text: 'Dashboards',
- url: `datasources/edit/${dataSource.uid}/dashboards`,
- });
- }
- const isLoadingNav = dataSource.type === loadingDSType;
- const permissionsExperimentId = 'feature-highlights-data-source-permissions-badge';
- const dsPermissions: NavModelItem = {
- active: false,
- icon: 'lock',
- id: `datasource-permissions-${dataSource.uid}`,
- text: 'Permissions',
- url: `datasources/edit/${dataSource.uid}/permissions`,
- };
- if (highlightTrial() && !isLoadingNav) {
- dsPermissions.tabSuffix = () => ProBadge({ experimentId: permissionsExperimentId, eventVariant: 'trial' });
- }
- if (featureEnabled('dspermissions')) {
- if (contextSrv.hasPermission(AccessControlAction.DataSourcesPermissionsRead)) {
- navModel.children!.push(dsPermissions);
- }
- } else if (highlightsEnabled && !isLoadingNav) {
- navModel.children!.push({
- ...dsPermissions,
- url: dsPermissions.url + '/upgrade',
- tabSuffix: () => ProBadge({ experimentId: permissionsExperimentId }),
- });
- }
- const analyticsExperimentId = 'feature-highlights-data-source-insights-badge';
- const analytics: NavModelItem = {
- active: false,
- icon: 'info-circle',
- id: `datasource-insights-${dataSource.uid}`,
- text: 'Insights',
- url: `datasources/edit/${dataSource.uid}/insights`,
- };
- if (highlightTrial() && !isLoadingNav) {
- analytics.tabSuffix = () => ProBadge({ experimentId: analyticsExperimentId, eventVariant: 'trial' });
- }
- if (featureEnabled('analytics')) {
- navModel.children!.push(analytics);
- } else if (highlightsEnabled && !isLoadingNav) {
- navModel.children!.push({
- ...analytics,
- url: analytics.url + '/upgrade',
- tabSuffix: () => ProBadge({ experimentId: analyticsExperimentId }),
- });
- }
- const cachingExperimentId = 'feature-highlights-query-caching-badge';
- const caching: NavModelItem = {
- active: false,
- icon: 'database',
- id: `datasource-cache-${dataSource.uid}`,
- text: 'Cache',
- url: `datasources/edit/${dataSource.uid}/cache`,
- hideFromTabs: !pluginMeta.isBackend || !config.caching.enabled,
- };
- if (highlightTrial() && !isLoadingNav) {
- caching.tabSuffix = () => ProBadge({ experimentId: cachingExperimentId, eventVariant: 'trial' });
- }
- if (featureEnabled('caching')) {
- navModel.children!.push(caching);
- } else if (highlightsEnabled && !isLoadingNav) {
- navModel.children!.push({
- ...caching,
- url: caching.url + '/upgrade',
- tabSuffix: () => ProBadge({ experimentId: cachingExperimentId }),
- });
- }
- return navModel;
- }
- export function getDataSourceNav(main: NavModelItem, pageName: string): NavModel {
- let node: NavModelItem = { text: '' };
- // find active page
- for (const child of main.children!) {
- if (child.id!.indexOf(pageName) > 0) {
- child.active = true;
- node = child;
- break;
- }
- }
- return {
- main: main,
- node: node!,
- };
- }
- export function getDataSourceLoadingNav(pageName: string): NavModel {
- const main = buildNavModel(
- {
- access: '',
- basicAuth: false,
- basicAuthUser: '',
- withCredentials: false,
- database: '',
- id: 1,
- uid: 'x',
- isDefault: false,
- jsonData: { authType: 'credentials', defaultRegion: 'eu-west-2' },
- name: 'Loading',
- orgId: 1,
- readOnly: false,
- type: loadingDSType,
- typeName: loadingDSType,
- typeLogoUrl: 'public/img/icn-datasource.svg',
- url: '',
- user: '',
- secureJsonFields: {},
- },
- {
- meta: {
- id: '1',
- type: PluginType.datasource,
- name: '',
- info: {
- author: {
- name: '',
- url: '',
- },
- description: '',
- links: [{ name: '', url: '' }],
- logos: {
- large: '',
- small: '',
- },
- screenshots: [],
- updated: '',
- version: '',
- },
- includes: [],
- module: '',
- baseUrl: '',
- },
- } as any
- );
- return getDataSourceNav(main, pageName);
- }
- function hasDashboards(includes: PluginInclude[]): boolean {
- return (
- includes.find((include) => {
- return include.type === 'dashboard';
- }) !== undefined
- );
- }
|