| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import { Observable } from 'rxjs';
- import { DataQuery, PanelData, DataSourceApi } from '@grafana/ui';
- import { QueryRunnerOptions } from 'app/features/dashboard/state/PanelQueryRunner';
- import { DashboardQuery } from './types';
- import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';
- import { LoadingState } from '@grafana/data';
- import { SHARED_DASHBODARD_QUERY } from './types';
- export function isSharedDashboardQuery(datasource: string | DataSourceApi) {
- if (!datasource) {
- // default datasource
- return false;
- }
- if (datasource === SHARED_DASHBODARD_QUERY) {
- return true;
- }
- const ds = datasource as DataSourceApi;
- return ds.meta && ds.meta.name === SHARED_DASHBODARD_QUERY;
- }
- export function runSharedRequest(options: QueryRunnerOptions): Observable<PanelData> {
- return new Observable<PanelData>(subscriber => {
- const dashboard = getDashboardSrv().getCurrent();
- const listenToPanelId = getPanelIdFromQuery(options.queries);
- if (!listenToPanelId) {
- subscriber.next(getQueryError('Missing panel reference ID'));
- return null;
- }
- const currentPanel = dashboard.getPanelById(options.panelId);
- const listenToPanel = dashboard.getPanelById(listenToPanelId);
- if (!listenToPanel) {
- subscriber.next(getQueryError('Unknown Panel: ' + listenToPanelId));
- return null;
- }
- const listenToRunner = listenToPanel.getQueryRunner();
- const subscription = listenToRunner.getData(false).subscribe({
- next: (data: PanelData) => {
- console.log('got data from other panel', data);
- subscriber.next(data);
- },
- });
- // If we are in fullscreen the other panel will not execute any queries
- // So we have to trigger it from here
- if (currentPanel.fullscreen) {
- const { datasource, targets } = listenToPanel;
- const modified = {
- ...options,
- datasource,
- panelId: listenToPanelId,
- queries: targets,
- };
- listenToRunner.run(modified);
- }
- return () => {
- console.log('runSharedRequest unsubscribe');
- subscription.unsubscribe();
- };
- });
- }
- function getPanelIdFromQuery(queries: DataQuery[]): number | undefined {
- if (!queries || !queries.length) {
- return undefined;
- }
- return (queries[0] as DashboardQuery).panelId;
- }
- function getQueryError(msg: string): PanelData {
- return {
- state: LoadingState.Error,
- series: [],
- error: { message: msg },
- };
- }
|