diff --git a/public/app/features/panel/query_editor.ts b/public/app/features/panel/query_editor.ts
index 100cb7510ae..b360ad2aa79 100644
--- a/public/app/features/panel/query_editor.ts
+++ b/public/app/features/panel/query_editor.ts
@@ -11,6 +11,10 @@ function metricsQueryEditor(dynamicDirectiveSrv, datasourceSrv) {
return datasourceSrv.get(datasource).then(ds => {
scope.datasource = ds;
+ if (!scope.target.refId) {
+ scope.target.refId = 'A';
+ }
+
return System.import(ds.meta.module).then(dsModule => {
return {
name: 'metrics-query-editor-' + ds.meta.id,
diff --git a/public/app/partials/dashboard.html b/public/app/partials/dashboard.html
index df8e1f5f82b..3234903ff8c 100644
--- a/public/app/partials/dashboard.html
+++ b/public/app/partials/dashboard.html
@@ -10,8 +10,6 @@
-
-
diff --git a/public/app/plugins/panel/singlestat/controller.js b/public/app/plugins/panel/singlestat/controller.js
index 357bffb8fa2..62ae13d0f5f 100644
--- a/public/app/plugins/panel/singlestat/controller.js
+++ b/public/app/plugins/panel/singlestat/controller.js
@@ -11,7 +11,6 @@ function (angular, app, _, kbn, TimeSeries, PanelMeta) {
/** @ngInject */
function SingleStatCtrl($scope, panelSrv, panelHelper) {
- console.log('controller');
$scope.panelMeta = new PanelMeta({
panelName: 'Singlestat',
diff --git a/public/app/plugins/panel/table/controller.ts b/public/app/plugins/panel/table/controller.ts
index 64e5123b0f6..f05a36c4cdf 100644
--- a/public/app/plugins/panel/table/controller.ts
+++ b/public/app/plugins/panel/table/controller.ts
@@ -20,7 +20,7 @@ export class TablePanelCtrl {
metricsEditor: true,
});
- $scope.panelMeta.addEditorTab('Options', 'app/plugins/panels/table/options.html');
+ $scope.panelMeta.addEditorTab('Options', 'app/plugins/panel/table/options.html');
$scope.panelMeta.addEditorTab('Time range', 'app/features/panel/partials/panelTime.html');
var panelDefaults = {
diff --git a/public/app/plugins/panel/table/editor.ts b/public/app/plugins/panel/table/editor.ts
index d16805ecb07..42536642d4a 100644
--- a/public/app/plugins/panel/table/editor.ts
+++ b/public/app/plugins/panel/table/editor.ts
@@ -118,7 +118,7 @@ export function tablePanelEditor($q, uiSegmentSrv) {
return {
restrict: 'E',
scope: true,
- templateUrl: 'app/plugins/panels/table/editor.html',
+ templateUrl: 'app/plugins/panel/table/editor.html',
controller: TablePanelEditorCtrl,
};
}
diff --git a/public/app/plugins/panel/table/module.ts b/public/app/plugins/panel/table/module.ts
index 4344eb41229..834bea42ba5 100644
--- a/public/app/plugins/panel/table/module.ts
+++ b/public/app/plugins/panel/table/module.ts
@@ -10,7 +10,9 @@ import {TablePanelCtrl} from './controller';
import {TableRenderer} from './renderer';
import {tablePanelEditor} from './editor';
-export function tablePanel() {
+angular.module('grafana.directives').directive('grafanaPanelTableEditor', tablePanelEditor);
+
+function tablePanel() {
'use strict';
return {
restrict: 'E',
@@ -102,5 +104,4 @@ export function tablePanel() {
};
}
-angular.module('grafana.directives').directive('grafanaPanelTable', tablePanel);
-angular.module('grafana.directives').directive('grafanaPanelTableEditor', tablePanelEditor);
+export {tablePanel as panel};
diff --git a/public/app/plugins/panel/text/module.js b/public/app/plugins/panel/text/module.js
index d3add3a15b8..e940f3b7d21 100644
--- a/public/app/plugins/panel/text/module.js
+++ b/public/app/plugins/panel/text/module.js
@@ -10,17 +10,7 @@ function (angular, app, _, require, PanelMeta) {
var converter;
- var module = angular.module('grafana.panels.text', []);
- app.useModule(module);
-
- module.directive('grafanaPanelText', function() {
- return {
- controller: 'TextPanelCtrl',
- templateUrl: 'app/plugins/panel/text/module.html',
- };
- });
-
- module.controller('TextPanelCtrl', function($scope, templateSrv, $sce, panelSrv) {
+ function TextPanelCtrl($scope, templateSrv, $sce, panelSrv) {
$scope.panelMeta = new PanelMeta({
panelName: 'Text',
@@ -107,5 +97,16 @@ function (angular, app, _, require, PanelMeta) {
};
$scope.init();
- });
+ }
+
+ function textPanel() {
+ return {
+ controller: TextPanelCtrl,
+ templateUrl: 'app/plugins/panel/text/module.html',
+ };
+ }
+
+ return {
+ panel: textPanel,
+ };
});
diff --git a/public/app/plugins/plugin_api.md b/public/app/plugins/plugin_api.md
index 138dab09931..707838ba8fd 100644
--- a/public/app/plugins/plugin_api.md
+++ b/public/app/plugins/plugin_api.md
@@ -1,8 +1,52 @@
# Plugin API
-## Changelog
+### 3.0 changes to plugin api changes
-2.5.1
+There has been big changes to both data source and plugin schema (plugin.json) and how
+you write the plugin main module.
+
+#### Datasource plugin
+
+Now data source plugins AMD/SystemJS module should return:
+
+```javascript
+return {
+ Datasource: ElasticDatasource,
+ configView: editView.default,
+ annotationsQueryEditor: annotationsQueryEditor,
+ metricsQueryEditor: metricsQueryEditor,
+ metricsQueryOptions: metricsQueryOptions,
+};
+```
+
+Where ElasticDatasource is a constructor function to a javascript. The constructor
+function can take angular services and `instanceSettings` as parameters.
+
+Example:
+
+```javascript
+function ElasticDatasource(instanceSettings, templateSrv) {
+ this.instanceSettings = this.instanceSettings;
+ ///...
+};
+```
+
+A datasource module can optionally return a configView directive function, metricsQueryEditor directive function, etc.
+
+Example:
+
+```javascript
+function metricsQueryEditor() {
+ return {controller: 'ElasticQueryCtrl', templateUrl: 'app/plugins/datasource/elasticsearch/partials/query.editor.html'};
+}
+```
+
+#### Panel plugin
+
+The panel plugin AMD/SystemJS module should return an object with a property named `panel`. This needs to be
+a directive function.
+
+### 2.5.1 changes
datasource annotationQuery changed. now single options parameter with:
- range
- rangeRaw