diff --git a/build/webpack.base.conf.js b/build/webpack.base.conf.js index be066de..7fa57e0 100644 --- a/build/webpack.base.conf.js +++ b/build/webpack.base.conf.js @@ -50,6 +50,10 @@ module.exports = { ], exclude: /node_modules/, }, + { + test: /\.html$/, + use: 'raw-loader' + }, { test: /jquery\.flot\.(?!events)/, loaders: [ diff --git a/package.json b/package.json index 69eb69e..a70f380 100644 --- a/package.json +++ b/package.json @@ -33,16 +33,16 @@ "jquery": "^3.3.1", "loader-utils": "^1.1.0", "md5": "^2.2.1", + "perfect-scrollbar": "^1.3.0", + "raw-loader": "^1.0.0", + "tether-drop": "^1.4.2", "tinycolor": "0.0.1", + "tinycolor2": "^1.4.1", "ts-jest": "^22.4.6", "ts-loader": "^4.2.0", "typescript": "^2.8.3", "webpack": "4.7.0", "webpack-cli": "^2.1.2" }, - "dependencies": { - "perfect-scrollbar": "^1.3.0", - "tether-drop": "^1.4.2", - "tinycolor2": "^1.4.1" - } + "dependencies": {} } diff --git a/src/config/config_ctrl.ts b/src/config/config_ctrl.ts new file mode 100644 index 0000000..85e2c38 --- /dev/null +++ b/src/config/config_ctrl.ts @@ -0,0 +1,14 @@ +import template from './template.html'; + + +class ConfigCtrl { + static template = template; + appModel: any; + constructor() { + if(this.appModel.jsonData === undefined) { + this.appModel.jsonData = {}; + } + } +} + +export { ConfigCtrl }; diff --git a/src/config/template.html b/src/config/template.html new file mode 100644 index 0000000..2312aa4 --- /dev/null +++ b/src/config/template.html @@ -0,0 +1,7 @@ +

Enter your Hastic config

+
+
+ + +
+
diff --git a/src/module.ts b/src/module.ts index 8aa0747..07b631c 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1 +1,3 @@ -export { }; +import { ConfigCtrl } from './config/config_ctrl' + +export { ConfigCtrl }; diff --git a/src/module_raw.d.ts b/src/module_raw.d.ts new file mode 100644 index 0000000..26c322a --- /dev/null +++ b/src/module_raw.d.ts @@ -0,0 +1,4 @@ +declare module '*.html' { + const contents: string + export = contents +} \ No newline at end of file diff --git a/src/panel/graph_panel/graph_ctrl.ts b/src/panel/graph_panel/graph_ctrl.ts index 9d64a62..7284d04 100644 --- a/src/panel/graph_panel/graph_ctrl.ts +++ b/src/panel/graph_panel/graph_ctrl.ts @@ -1,6 +1,6 @@ import './series_overrides_ctrl'; -import template from './template'; +import template from './template.html'; import { GraphRenderer } from './graph_renderer'; import { GraphLegend } from './graph_legend'; @@ -31,6 +31,8 @@ class GraphCtrl extends MetricsPanelCtrl { hiddenSeries: any = {}; seriesList: any = []; dataList: any = []; + + _backendUrl: string = undefined; // annotations: any = []; private _datasourceRequest: DatasourceRequest; @@ -140,7 +142,7 @@ class GraphCtrl extends MetricsPanelCtrl { /** @ngInject */ constructor( - $scope, $injector, $http, + $scope, $injector, private $http, private annotationsSrv, private keybindingSrv, private backendSrv: BackendSrv, @@ -154,52 +156,7 @@ class GraphCtrl extends MetricsPanelCtrl { _.defaults(this.panel.legend, this.panelDefaults.legend); _.defaults(this.panel.xaxis, this.panelDefaults.xaxis); - this.processor = new DataProcessor(this.panel); - - this.analyticService = new AnalyticService(this.backendURL, $http); - - this.runBackendConnectivityCheck(); - - this.analyticsController = new AnalyticController(this.panel, this.analyticService, this.events); - - this.bindDKey(); - - this.events.on('render', this.onRender.bind(this)); - this.events.on('data-received', this.onDataReceived.bind(this)); - this.events.on('data-error', this.onDataError.bind(this)); - this.events.on('data-snapshot-load', this.onDataSnapshotLoad.bind(this)); - this.events.on('init-edit-mode', this.onInitEditMode.bind(this)); - this.events.on('init-panel-actions', this.onInitPanelActions.bind(this)); - - this.events.on('analytic-unit-status-change', async (analyticUnit: AnalyticUnit) => { - if(analyticUnit === undefined) { - throw new Error('analyticUnit is undefined'); - } - if(analyticUnit.status === '404') { - await this.analyticsController.removeAnalyticUnit(analyticUnit.id, true); - } - if(analyticUnit.status === 'READY') { - await this.analyticsController.fetchSegments(analyticUnit, +this.range.from, +this.range.to); - } - this.render(this.seriesList); - this.$scope.$digest(); - }); - - this._datasources = {}; - - appEvents.on('ds-request-response', data => { - let requestConfig = data.config; - - this._datasourceRequest = { - url: requestConfig.url, - method: requestConfig.method, - data: requestConfig.data, - params: requestConfig.params, - type: undefined - }; - }); - this.analyticsController.fetchAnalyticUnitsStatuses(); } @@ -212,11 +169,18 @@ class GraphCtrl extends MetricsPanelCtrl { this.bindDKey(); } - get backendURL(): string { - if(this.templateSrv.index[BACKEND_VARIABLE_NAME] === undefined) { + async getBackendURL(): Promise { + if(this._backendUrl !== undefined) { + return this._backendUrl; + } + var data = await this.backendSrv.get('/api/plugins/hastic-app/settings'); + if(data.jsonData === undefined) { + return undefined; + } + let val = data.jsonData.hasticServerUrl; + if(val === undefined) { return undefined; } - let val = this.templateSrv.index[BACKEND_VARIABLE_NAME].current.value; val = val.replace(/\/+$/, ""); return val; } @@ -235,12 +199,13 @@ class GraphCtrl extends MetricsPanelCtrl { } async runBackendConnectivityCheck() { - if(this.backendURL === '' || this.backendURL === undefined) { + let backendURL = await this.getBackendURL(); + if(backendURL === '' || backendURL === undefined) { appEvents.emit( 'alert-warning', [ - `Dashboard variable $${BACKEND_VARIABLE_NAME} is missing`, - `Please set $${BACKEND_VARIABLE_NAME}` + `hasticServerUrl is missing`, + `Please set it in config` ] ); return; @@ -253,17 +218,67 @@ class GraphCtrl extends MetricsPanelCtrl { 'alert-success', [ 'Connected to Hastic server', - `Hastic server: "${this.backendURL}"` + `Hastic server: "${backendURL}"` ] ); } } - link(scope, elem, attrs, ctrl) { + async link(scope, elem, attrs, ctrl) { + + this.processor = new DataProcessor(this.panel); + + let backendURL = await this.getBackendURL(); + this.analyticService = new AnalyticService(backendURL, this.$http); + + this.runBackendConnectivityCheck(); + + this.analyticsController = new AnalyticController(this.panel, this.analyticService, this.events); + + this.bindDKey(); + + this.events.on('render', this.onRender.bind(this)); + this.events.on('data-received', this.onDataReceived.bind(this)); + this.events.on('data-error', this.onDataError.bind(this)); + this.events.on('data-snapshot-load', this.onDataSnapshotLoad.bind(this)); + this.events.on('init-edit-mode', this.onInitEditMode.bind(this)); + this.events.on('init-panel-actions', this.onInitPanelActions.bind(this)); + + this.events.on('analytic-unit-status-change', async (analyticUnit: AnalyticUnit) => { + if(analyticUnit === undefined) { + throw new Error('analyticUnit is undefined'); + } + if(analyticUnit.status === '404') { + await this.analyticsController.removeAnalyticUnit(analyticUnit.id, true); + } + if(analyticUnit.status === 'READY') { + await this.analyticsController.fetchSegments(analyticUnit, +this.range.from, +this.range.to); + } + this.render(this.seriesList); + this.$scope.$digest(); + }); + + this._datasources = {}; + + appEvents.on('ds-request-response', data => { + let requestConfig = data.config; + + this._datasourceRequest = { + url: requestConfig.url, + method: requestConfig.method, + data: requestConfig.data, + params: requestConfig.params, + type: undefined + }; + }); + + this.analyticsController.fetchAnalyticUnitsStatuses(); + + var $graphElem = $(elem[0]).find('#graphPanel'); var $legendElem = $(elem[0]).find('#graphLegend'); this._graphRenderer = new GraphRenderer( - $graphElem, this.timeSrv, this.popoverSrv, this.contextSrv,this.$scope + $graphElem, this.timeSrv, this.popoverSrv, this.contextSrv, this.$scope ); this._graphLegend = new GraphLegend($legendElem, this.popoverSrv, this.$scope); } @@ -607,12 +622,13 @@ class GraphCtrl extends MetricsPanelCtrl { private async _updatePanelInfo() { const datasource = await this._getDatasourceByName(this.panel.datasource); + const backendUrl = await this.getBackendURL(); this._panelInfo = { grafanaVersion: this.contextSrv.version, grafanaUrl: window.location.host, datasourceType: datasource.type, - hasticServerUrl: this.backendURL + hasticServerUrl: backendUrl }; } diff --git a/src/panel/graph_panel/template.ts b/src/panel/graph_panel/template.html similarity index 83% rename from src/panel/graph_panel/template.ts rename to src/panel/graph_panel/template.html index 8a2137d..a91686f 100644 --- a/src/panel/graph_panel/template.ts +++ b/src/panel/graph_panel/template.html @@ -1,8 +1,4 @@ -var template = `
-`; - -export default template;