123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- import { Action, Priority } from 'kbar';
- import { flatMapDeep } from 'lodash';
- import { NavModelItem } from '@grafana/data';
- import { locationService } from '@grafana/runtime';
- import { alertingCommandPaletteStaticActions } from './alerting.static.actions';
- export interface NavBarActions {
- url: string;
- actions: Action[];
- }
- export default (navBarTree: NavModelItem[]) => {
- const globalActions: Action[] = [
- {
- id: 'go/search',
- name: 'Go to dashboard search',
- keywords: 'navigate',
- perform: () => locationService.push('?search=open'),
- section: 'Navigation',
- shortcut: ['s', 'o'],
- },
- {
- id: 'go/dashboard',
- name: 'Go to dashboard...',
- keywords: 'navigate',
- section: 'Navigation',
- priority: Priority.NORMAL,
- },
- {
- id: 'preferences/theme',
- name: 'Change theme...',
- keywords: 'interface color dark light',
- section: 'Preferences',
- },
- {
- id: 'preferences/dark-theme',
- name: 'Dark',
- keywords: 'dark theme',
- section: '',
- perform: () => {
- locationService.push({ search: '?theme=dark' });
- location.reload();
- },
- parent: 'preferences/theme',
- },
- {
- id: 'preferences/light-theme',
- name: 'Light',
- keywords: 'light theme',
- section: '',
- perform: () => {
- locationService.push({ search: '?theme=light' });
- location.reload();
- },
- parent: 'preferences/theme',
- },
- ];
- // this maps actions to navbar by URL items for showing/hiding
- // actions is an array for multiple child actions that would be under one navbar item
- const navBarActionMap: NavBarActions[] = [
- {
- url: '/dashboard/new',
- actions: [
- {
- id: 'management/create-folder',
- name: 'Create folder',
- keywords: 'new add',
- perform: () => locationService.push('/dashboards/folder/new'),
- section: 'Management',
- },
- {
- id: 'management/create-dashboard',
- name: 'Create dashboard',
- keywords: 'new add',
- perform: () => locationService.push('/dashboard/new'),
- section: 'Management',
- },
- ],
- },
- {
- url: '/',
- actions: [
- {
- id: 'go/home',
- name: 'Go to home',
- keywords: 'navigate',
- perform: () => locationService.push('/'),
- section: 'Navigation',
- shortcut: ['g', 'h'],
- priority: Priority.HIGH,
- },
- ],
- },
- {
- url: '/explore',
- actions: [
- {
- id: 'go/explore',
- name: 'Go to explore',
- keywords: 'navigate',
- perform: () => locationService.push('/explore'),
- section: 'Navigation',
- priority: Priority.NORMAL,
- },
- ],
- },
- ...alertingCommandPaletteStaticActions,
- {
- url: '/profile',
- actions: [
- {
- id: 'go/profile',
- name: 'Go to profile',
- keywords: 'navigate preferences',
- perform: () => locationService.push('/profile'),
- section: 'Navigation',
- shortcut: ['g', 'p'],
- priority: Priority.LOW,
- },
- ],
- },
- {
- url: '/datasources',
- actions: [
- {
- id: 'go/configuration',
- name: 'Go to data sources configuration',
- keywords: 'navigate settings ds',
- perform: () => locationService.push('/datasources'),
- section: 'Navigation',
- },
- ],
- },
- ];
- const navBarActions: Action[] = [];
- const navBarFlatUrls = flatMapDeep(navBarTree, (nbt) => nbt.children)
- .map((nbf) => nbf?.url)
- .filter((url) => url !== undefined);
- navBarActionMap.forEach((navBarAction) => {
- const navBarItem = navBarFlatUrls.find((url) => navBarAction.url === url);
- if (navBarItem) {
- navBarActions.push(...navBarAction.actions);
- }
- });
- return [...globalActions, ...navBarActions];
- };
|