mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 16:45:43 -06:00
* Initial pass to move panel state to it's own, and make it by key not panel.id * Progress * Not making much progress, having panel.key be mutable is causing a lot of issues * Think this is starting to work * Began fixing tests * Add selector * Bug fixes and changes to cleanup, and fixing all flicking when switching library panels * Removed console.log * fixes after merge * fixing tests * fixing tests * Added new test for changePlugin thunk
54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import config from 'app/core/config';
|
|
import * as grafanaData from '@grafana/data';
|
|
import { getPanelPluginLoadError } from '../panel/components/PanelPluginError';
|
|
import { importPluginModule } from './plugin_loader';
|
|
|
|
interface PanelCache {
|
|
[key: string]: Promise<grafanaData.PanelPlugin>;
|
|
}
|
|
const panelCache: PanelCache = {};
|
|
|
|
export function importPanelPlugin(id: string): Promise<grafanaData.PanelPlugin> {
|
|
const loaded = panelCache[id];
|
|
if (loaded) {
|
|
return loaded;
|
|
}
|
|
|
|
const meta = config.panels[id];
|
|
|
|
if (!meta) {
|
|
throw new Error(`Plugin ${id} not found`);
|
|
}
|
|
|
|
panelCache[id] = getPanelPlugin(meta);
|
|
|
|
return panelCache[id];
|
|
}
|
|
|
|
export function importPanelPluginFromMeta(meta: grafanaData.PanelPluginMeta): Promise<grafanaData.PanelPlugin> {
|
|
return getPanelPlugin(meta);
|
|
}
|
|
|
|
function getPanelPlugin(meta: grafanaData.PanelPluginMeta): Promise<grafanaData.PanelPlugin> {
|
|
return importPluginModule(meta.module)
|
|
.then((pluginExports) => {
|
|
if (pluginExports.plugin) {
|
|
return pluginExports.plugin as grafanaData.PanelPlugin;
|
|
} else if (pluginExports.PanelCtrl) {
|
|
const plugin = new grafanaData.PanelPlugin(null);
|
|
plugin.angularPanelCtrl = pluginExports.PanelCtrl;
|
|
return plugin;
|
|
}
|
|
throw new Error('missing export: plugin or PanelCtrl');
|
|
})
|
|
.then((plugin) => {
|
|
plugin.meta = meta;
|
|
return plugin;
|
|
})
|
|
.catch((err) => {
|
|
// TODO, maybe a different error plugin
|
|
console.warn('Error loading panel plugin: ' + meta.id, err);
|
|
return getPanelPluginLoadError(meta, err);
|
|
});
|
|
}
|