mirror of https://github.com/grafana/grafana.git
95 lines
2.7 KiB
TypeScript
95 lines
2.7 KiB
TypeScript
import { lastValueFrom } from 'rxjs';
|
|
|
|
import { DataQueryRequest, DataFrameView } from '@grafana/data';
|
|
import { config } from '@grafana/runtime';
|
|
import { getGrafanaDatasource } from 'app/plugins/datasource/grafana/datasource';
|
|
import { GrafanaQuery, GrafanaQueryType } from 'app/plugins/datasource/grafana/types';
|
|
|
|
import { Playlist } from '../../api/clients/playlist/v0alpha1';
|
|
import { getGrafanaSearcher } from '../search/service/searcher';
|
|
import { DashboardQueryResult, SearchQuery } from '../search/service/types';
|
|
|
|
import { PlaylistItemUI } from './types';
|
|
|
|
/** Returns a copy with the dashboards loaded */
|
|
export async function loadDashboards(items: PlaylistItemUI[]): Promise<PlaylistItemUI[]> {
|
|
let idx = 0;
|
|
if (!items?.length) {
|
|
return [];
|
|
}
|
|
|
|
const targets: GrafanaQuery[] = [];
|
|
for (const item of items) {
|
|
const query: SearchQuery = {
|
|
query: '*',
|
|
kind: ['dashboard'],
|
|
limit: 1000,
|
|
};
|
|
|
|
switch (item.type) {
|
|
case 'dashboard_by_id':
|
|
throw new Error('invalid item (with id)');
|
|
|
|
case 'dashboard_by_uid':
|
|
query.uid = [item.value];
|
|
break;
|
|
|
|
case 'dashboard_by_tag':
|
|
query.tags = [item.value];
|
|
break;
|
|
}
|
|
targets.push({
|
|
refId: `${idx++}`,
|
|
queryType: GrafanaQueryType.Search,
|
|
search: query,
|
|
});
|
|
}
|
|
|
|
// The SQL based store can only execute individual queries
|
|
if (!config.featureToggles.panelTitleSearch) {
|
|
const searcher = getGrafanaSearcher();
|
|
const res: PlaylistItemUI[] = [];
|
|
for (let i = 0; i < targets.length; i++) {
|
|
const view = (await searcher.search(targets[i].search!)).view;
|
|
res.push({ ...items[i], dashboards: view.map((v) => ({ ...v })) });
|
|
}
|
|
return res;
|
|
}
|
|
|
|
// The bluge backend can execute multiple queries in a single request
|
|
const ds = await getGrafanaDatasource();
|
|
// eslint-disable-next-line
|
|
const rsp = await lastValueFrom(ds.query({ targets } as unknown as DataQueryRequest<GrafanaQuery>));
|
|
if (rsp.data.length !== items.length) {
|
|
throw new Error('unexpected result size');
|
|
}
|
|
return items.map((item, idx) => {
|
|
const view = new DataFrameView<DashboardQueryResult>(rsp.data[idx]);
|
|
return { ...item, dashboards: view.map((v) => ({ ...v })) };
|
|
});
|
|
}
|
|
|
|
export function getDefaultPlaylist(): Playlist {
|
|
return {
|
|
apiVersion: 'playlist.grafana.app/v0alpha1',
|
|
kind: 'Playlist',
|
|
spec: {
|
|
items: [],
|
|
interval: '5m',
|
|
title: '',
|
|
},
|
|
metadata: {
|
|
name: '',
|
|
},
|
|
status: {},
|
|
};
|
|
}
|
|
|
|
export function searchPlaylists(playlists: Playlist[], query?: string): Playlist[] {
|
|
if (!query?.length) {
|
|
return playlists;
|
|
}
|
|
query = query.toLowerCase();
|
|
return playlists.filter((v) => v.spec?.title.toLowerCase().includes(query!));
|
|
}
|