diff --git a/dist/css/statusmap.dark.css b/dist/css/statusmap.dark.css index bbc2b61..635409f 100644 --- a/dist/css/statusmap.dark.css +++ b/dist/css/statusmap.dark.css @@ -69,6 +69,15 @@ .width-c-70 { width: 70rem !important; } +.statusmap-pagination { + margin-top: 5px; } + .statusmap-pagination label { + margin-right: 0px; } + .statusmap-pagination input { + margin-right: 0px; } + .statusmap-pagination .last-in-group { + margin-right: 4px; } + .pagination-buttons { text-align: right; } diff --git a/dist/css/statusmap.dark.css.map b/dist/css/statusmap.dark.css.map index e740b9c..1c48e4b 100644 --- a/dist/css/statusmap.dark.css.map +++ b/dist/css/statusmap.dark.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EAGjB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,IAAI;EAGb,WAAW,EAAE,MAAM;EACnB,SAAS,EEzDI,IAAI;EF0DjB,gBAAgB,ECvDC,OAAO;EDwDxB,KAAK,EC1DM,OAAO;ED4DlB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;;AAGZ,yBAA0B;EACxB,IAAI,ECzEY,OAAO;;AD6EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,mBAAmB;EAAC,UAAU,EAAE,KAAK;;AAErC,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC7HG,OAAO;ID8Hd,KAAK,EC9HE,OAAO;ID+Hd,SAAS,EE/HE,IAAI;EFkIjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECnIM,OAAO;EDsIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECxIM,OAAO", +"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EAGjB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,IAAI;EAGb,WAAW,EAAE,MAAM;EACnB,SAAS,EEzDI,IAAI;EF0DjB,gBAAgB,ECvDC,OAAO;EDwDxB,KAAK,EC1DM,OAAO;ED4DlB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;;AAGZ,yBAA0B;EACxB,IAAI,ECzEY,OAAO;;AD6EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,qBAAsB;EAEpB,UAAU,EAAE,GAAG;EACf,2BAAM;IACJ,YAAY,EAAC,GAAG;EAElB,2BAAM;IACJ,YAAY,EAAE,GAAG;EAEnB,oCAAe;IACb,YAAY,EAAE,GAAG;;AAIrB,mBAAmB;EAAC,UAAU,EAAE,KAAK;;AAErC,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC3IG,OAAO;ID4Id,KAAK,EC5IE,OAAO;ID6Id,SAAS,EE7IE,IAAI;EFgJjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECjJM,OAAO;EDoJrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECtJM,OAAO", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.dark.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.dark.css" diff --git a/dist/css/statusmap.light.css b/dist/css/statusmap.light.css index 201f225..5babdba 100644 --- a/dist/css/statusmap.light.css +++ b/dist/css/statusmap.light.css @@ -69,6 +69,15 @@ .width-c-70 { width: 70rem !important; } +.statusmap-pagination { + margin-top: 5px; } + .statusmap-pagination label { + margin-right: 0px; } + .statusmap-pagination input { + margin-right: 0px; } + .statusmap-pagination .last-in-group { + margin-right: 4px; } + .pagination-buttons { text-align: right; } diff --git a/dist/css/statusmap.light.css.map b/dist/css/statusmap.light.css.map index 89e107d..e3f79c1 100644 --- a/dist/css/statusmap.light.css.map +++ b/dist/css/statusmap.light.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EAGjB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,IAAI;EAGb,WAAW,EAAE,MAAM;EACnB,SAAS,EEzDI,IAAI;EF0DjB,gBAAgB,ECvDC,OAAO;EDwDxB,KAAK,EC1DM,OAAO;ED4DlB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;;AAGZ,yBAA0B;EACxB,IAAI,ECzEY,OAAO;;AD6EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,mBAAmB;EAAC,UAAU,EAAE,KAAK;;AAErC,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC7HG,OAAO;ID8Hd,KAAK,EC9HE,OAAO;ID+Hd,SAAS,EE/HE,IAAI;EFkIjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECnIM,OAAO;EDsIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECxIM,OAAO", +"mappings": "AAAA,8BAA+B;EAE7B,MAAM,EAAE,SAAS;EAGjB,kDAAoB;IAClB,cAAc,EAAE,IAAI;EAGtB,uDAAyB;IACzB,gBAAgB,ECNL,OAAO;IDOlB,KAAK,ECVM,OAAO;IDWlB,OAAO,EAAE,GAAG;;AAId,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAGhB,iCAAK;IACH,IAAI,ECpBG,OAAO;IDqBd,KAAK,ECrBE,OAAO;IDsBd,SAAS,EEtBE,IAAI;EFyBjB,iCAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,EC1BM,OAAO;ED+BvB,oBAAI;IACF,cAAc,EAAE,IAAI;IAEpB,yBAAK;MACH,cAAc,EAAE,cAAc;;AAKpC,kBAAmB;EAGjB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG;EAClB,SAAS,EAAE,KAAK;EAChB,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,MAAM;EAChB,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,IAAI;EAGb,WAAW,EAAE,MAAM;EACnB,SAAS,EEzDI,IAAI;EF0DjB,gBAAgB,ECvDC,OAAO;EDwDxB,KAAK,EC1DM,OAAO;ED4DlB,iCAAe;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,GAAG;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,uDAAuD;;AAIxE,yBAA0B;EACxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;;AAGZ,yBAA0B;EACxB,IAAI,ECzEY,OAAO;;AD6EvB,8BAAK;EACH,MAAM,EAAE,OAAgB;EACxB,YAAY,EAAE,CAAC;;AAInB,yBAA0B;EACxB,YAAY,EAAE,CAAC;EACf,IAAI,EAAE,wBAAwB;EAC9B,MAAM,EAAE,wBAAwB;;AAGlC,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AACA,WAAY;EACV,KAAK,EAAE,gBACT;;AAEA,qBAAsB;EAEpB,UAAU,EAAE,GAAG;EACf,2BAAM;IACJ,YAAY,EAAC,GAAG;EAElB,2BAAM;IACJ,YAAY,EAAE,GAAG;EAEnB,oCAAe;IACb,YAAY,EAAE,GAAG;;AAIrB,mBAAmB;EAAC,UAAU,EAAE,KAAK;;AAErC,8BAA+B;EAC7B,MAAM,EAAE,MAAM;EAEd,kCAAI;IACF,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,WAAW,EAAE,MAAM;EAIrB,2DAA6B;IAC3B,UAAU,EAAE,GAAG;EAGjB,4DAA8B;IAC5B,OAAO,EAAE,YAAY;EAIrB,+CAAK;IACH,IAAI,EC3IG,OAAO;ID4Id,KAAK,EC5IE,OAAO;ID6Id,SAAS,EE7IE,IAAI;EFgJjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECjJM,OAAO;EDoJrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECtJM,OAAO", "sources": ["../../src/css/_statusmap.scss","../../src/css/_variables.light.scss","../../src/css/_variables.scss"], "names": [], "file": "statusmap.light.css" diff --git a/dist/extra_series_format.js b/dist/extra_series_format.js deleted file mode 100644 index 6680ce7..0000000 --- a/dist/extra_series_format.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; - -System.register([], function (_export, _context) { - "use strict"; - - var ExtraSeriesFormat, ExtraSeriesFormatValue; - - _export({ - ExtraSeriesFormat: void 0, - ExtraSeriesFormatValue: void 0 - }); - - return { - setters: [], - execute: function () { - (function (ExtraSeriesFormat) { - ExtraSeriesFormat["Date"] = "Date"; - ExtraSeriesFormat["Raw"] = "Raw"; - })(ExtraSeriesFormat || _export("ExtraSeriesFormat", ExtraSeriesFormat = {})); - - (function (ExtraSeriesFormatValue) { - ExtraSeriesFormatValue["Date"] = "YYYY/MM/DD/HH_mm_ss"; - ExtraSeriesFormatValue["Raw"] = ""; - })(ExtraSeriesFormatValue || _export("ExtraSeriesFormatValue", ExtraSeriesFormatValue = {})); - } - }; -}); -//# sourceMappingURL=extra_series_format.js.map diff --git a/dist/extra_series_format.js.map b/dist/extra_series_format.js.map deleted file mode 100644 index 15a0176..0000000 --- a/dist/extra_series_format.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/extra_series_format.ts"],"names":["ExtraSeriesFormat","ExtraSeriesFormatValue"],"mappings":";;;;;;;;;;;;;;;iBAAYA,iB;AAAAA,QAAAA,iB;AAAAA,QAAAA,iB;SAAAA,iB,iCAAAA,iB;;iBAKAC,sB;AAAAA,QAAAA,sB;AAAAA,QAAAA,sB;SAAAA,sB,sCAAAA,sB","sourcesContent":["export enum ExtraSeriesFormat {\n Date = 'Date',\n Raw = 'Raw',\n}\n\nexport enum ExtraSeriesFormatValue {\n Date = 'YYYY/MM/DD/HH_mm_ss',\n Raw = '',\n}"],"file":"extra_series_format.js"} \ No newline at end of file diff --git a/dist/img/tooltip-editor.png b/dist/img/tooltip-editor.png index b4410a8..97a26d8 100644 Binary files a/dist/img/tooltip-editor.png and b/dist/img/tooltip-editor.png differ diff --git a/dist/img/tooltip-url.png b/dist/img/tooltip-url.png index 6966228..cb65c49 100644 Binary files a/dist/img/tooltip-url.png and b/dist/img/tooltip-url.png differ diff --git a/dist/module.html b/dist/module.html index 1ceaddb..2863c19 100644 --- a/dist/module.html +++ b/dist/module.html @@ -1,37 +1,37 @@
-
-
-
- - -
-
-
{{ctrl.dataWarnings.multipleValues.title}} {{ctrl.dataWarnings.noColorDefined.title}} {{ctrl.dataWarnings.noDatapoints.title}}
+
+
-
+
+
- -
- + +
+ + +
+
diff --git a/dist/module.js b/dist/module.js index 2b801de..774c9a6 100644 --- a/dist/module.js +++ b/dist/module.js @@ -3,7 +3,7 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_editor", "./panel_config_migration", "app/core/utils/kbn", "app/plugins/sdk", "./libs/grafana/events/index", "./statusmap_data", "./rendering", "./libs/polygrafill/index", "./color_mode_discrete"], function (_export, _context) { "use strict"; - var _, optionsEditorCtrl, tooltipEditorCtrl, migratePanelConfig, kbn, loadPluginCss, MetricsPanelCtrl, CoreEvents, PanelEvents, Bucket, BucketMatrix, rendering, Polygrafill, ColorModeDiscrete, VALUE_INDEX, TIME_INDEX, colorSchemes, colorModes, opacityScales, renderComplete, StatusHeatmapCtrl; + var _, optionsEditorCtrl, tooltipEditorCtrl, migratePanelConfig, kbn, loadPluginCss, MetricsPanelCtrl, CoreEvents, PanelEvents, Bucket, BucketMatrix, BucketMatrixPager, rendering, Polygrafill, ColorModeDiscrete, VALUE_INDEX, TIME_INDEX, colorSchemes, colorModes, opacityScales, renderComplete, StatusHeatmapCtrl; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } @@ -49,6 +49,7 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit }, function (_statusmap_data) { Bucket = _statusmap_data.Bucket; BucketMatrix = _statusmap_data.BucketMatrix; + BucketMatrixPager = _statusmap_data.BucketMatrixPager; }, function (_rendering) { rendering = _rendering.default; }, function (_libsPolygrafillIndex) { @@ -166,6 +167,8 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _inherits(StatusHeatmapCtrl, _MetricsPanelCtrl); + // TODO remove this transient variable: use ng-model-options="{ getterSetter: true }" + /** @ngInject */ function StatusHeatmapCtrl($scope, $injector, timeSrv, annotationsSrv, $window, datasourceSrv, variableSrv, templateSrv) { var _this; @@ -180,6 +183,8 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _defineProperty(_assertThisInitialized(_this), "bucketMatrix", void 0); + _defineProperty(_assertThisInitialized(_this), "bucketMatrixPager", void 0); + _defineProperty(_assertThisInitialized(_this), "graph", void 0); _defineProperty(_assertThisInitialized(_this), "discreteHelper", void 0); @@ -192,12 +197,6 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _defineProperty(_assertThisInitialized(_this), "unitFormats", void 0); - _defineProperty(_assertThisInitialized(_this), "cardsDataComplete", void 0); - - _defineProperty(_assertThisInitialized(_this), "cardsDataLabelsComplete", void 0); - - _defineProperty(_assertThisInitialized(_this), "ticksWhenPaginating", void 0); - _defineProperty(_assertThisInitialized(_this), "dataWarnings", {}); _defineProperty(_assertThisInitialized(_this), "multipleValues", void 0); @@ -214,16 +213,6 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _defineProperty(_assertThisInitialized(_this), "pageSizeViewer", 15); - _defineProperty(_assertThisInitialized(_this), "currentPage", 0); - - _defineProperty(_assertThisInitialized(_this), "numberOfPages", 1); - - _defineProperty(_assertThisInitialized(_this), "totalElements", 0); - - _defineProperty(_assertThisInitialized(_this), "firstPageElement", 1); - - _defineProperty(_assertThisInitialized(_this), "lastPageElement", 5); - _defineProperty(_assertThisInitialized(_this), "panelDefaults", { // datasource name, null = default datasource datasource: null, @@ -270,10 +259,9 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit highlightCards: true, useMax: true, seriesFilterIndex: -1, + // Pagination options usingPagination: false, - pageSize: 15, - allowAllElements: false, - availableValues: [] + pageSize: 15 }); if (!Polygrafill.hasAppEventCompatibleEmitter(_this.events)) { @@ -287,12 +275,17 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _.defaultsDeep(_this.panel, _this.panelDefaults); - if (_this.panel.usingPagination) { - _this.setPaginationSize(_this.panel.pageSize); + _this.bucketMatrix = new BucketMatrix(); // Create pager for bucketMatrix and restore page size. - _this.setCurrentPage(0); - } + _this.bucketMatrixPager = new BucketMatrixPager(); + _this.bucketMatrixPager.setEnable(_this.panel.usingPagination); + + _this.bucketMatrixPager.setDefaultPageSize(_this.panel.pageSize); + + _this.bucketMatrixPager.setPageSize(_this.panel.pageSize); + + $scope.pager = _this.bucketMatrixPager; _this.opacityScales = opacityScales; _this.colorModes = colorModes; _this.colorSchemes = colorSchemes; // default graph width for discrete card width calculation @@ -349,75 +342,35 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit }, { key: "changeDefaultPaginationSize", value: function changeDefaultPaginationSize(defaultPageSize) { + this.bucketMatrixPager.setDefaultPageSize(defaultPageSize); + this.bucketMatrixPager.setPageSize(defaultPageSize); this.pageSizeViewer = defaultPageSize; this.render(); this.refresh(); } }, { - key: "changePaginationSize", - value: function changePaginationSize() { + key: "onChangePageSize", + value: function onChangePageSize() { if (this.pageSizeViewer <= 0) { - this.pageSizeViewer = 1; + this.pageSizeViewer = this.bucketMatrixPager.defaultPageSize; } - this.currentPage = 0; + this.bucketMatrixPager.setPageSize(this.pageSizeViewer); + this.bucketMatrixPager.setCurrent(0); this.render(); this.refresh(); } }, { - key: "getPaginationSize", - value: function getPaginationSize() { - return this.pageSizeViewer; - } - }, { - key: "setPaginationSize", - value: function setPaginationSize(pageSize) { - this.pageSizeViewer = pageSize; - } - }, { - key: "getCurrentPage", - value: function getCurrentPage() { - return this.currentPage; - } - }, { - key: "setCurrentPage", - value: function setCurrentPage(currentPage) { - this.currentPage = currentPage; - } - }, { - key: "getNumberOfPages", - value: function getNumberOfPages() { - return this.numberOfPages; - } - }, { - key: "getTotalElements", - value: function getTotalElements() { - return this.totalElements; - } - }, { - key: "setTotalElements", - value: function setTotalElements(totalElements) { - this.totalElements = totalElements; - } - }, { - key: "getFirstPageElement", - value: function getFirstPageElement() { - return this.firstPageElement; - } - }, { - key: "setFirstPageElement", - value: function setFirstPageElement(firstPageElement) { - this.firstPageElement = firstPageElement; - } - }, { - key: "getLastPageElement", - value: function getLastPageElement() { - return this.lastPageElement; + key: "onPrevPage", + value: function onPrevPage() { + this.bucketMatrixPager.switchToPrev(); + this.render(); } }, { - key: "setLastPageElement", - value: function setLastPageElement(lastPageElement) { - this.lastPageElement = lastPageElement; + key: "onNextPage", + value: function onNextPage() { + this.bucketMatrixPager.switchToNext(); + this.render(); } // getChartWidth returns an approximation of chart canvas width or // a saved value calculated during a render. @@ -546,16 +499,16 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit this.calculateInterval(); } - this.bucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true); - this.noDatapoints = this.bucketMatrix.noDatapoints; + var newBucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true); + this.bucketMatrix = newBucketMatrix; + this.bucketMatrixPager.bucketMatrix = newBucketMatrix; - if (this.panel.usingPagination && this.cardsData.targets) { - this.numberOfPages = Math.ceil(this.cardsData.targets.length / this.pageSizeViewer); - this.totalElements = this.cardsData.targets.length; - } else { - this.setPaginationSize(this.cardsData.targets.length); + if (newBucketMatrix.targets.length !== this.bucketMatrix.targets.length) { + this.bucketMatrixPager.setCurrent(0); } + this.noDatapoints = this.bucketMatrix.noDatapoints; + if (this.annotationsPromise) { this.annotationsPromise.then(function (result) { _this3.loading = false; //this.alertState = result.alertState; @@ -571,8 +524,7 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _this3.loading = false; _this3.annotations = []; - _this3.render(); // this.render(this.data);??? - + _this3.render(); }); } else { this.loading = false; @@ -586,11 +538,6 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit this.addEditorTab('Options', optionsEditorCtrl, 2); this.addEditorTab('Tooltip', tooltipEditorCtrl, 3); this.unitFormats = kbn.getUnitFormats(); - } - }, { - key: "paginate", - value: function paginate() { - this.refresh(); } // onRender will be called before StatusmapRenderer.onRender. // Decide if warning should be displayed over cards. diff --git a/dist/module.js.map b/dist/module.js.map index ae2ad05..6af62b1 100644 --- a/dist/module.js.map +++ b/dist/module.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/module.ts"],"names":["_","optionsEditorCtrl","tooltipEditorCtrl","migratePanelConfig","kbn","loadPluginCss","MetricsPanelCtrl","CoreEvents","PanelEvents","Bucket","BucketMatrix","rendering","Polygrafill","ColorModeDiscrete","VALUE_INDEX","TIME_INDEX","colorSchemes","name","value","invert","colorModes","opacityScales","dark","light","renderComplete","StatusHeatmapCtrl","$scope","$injector","timeSrv","annotationsSrv","$window","datasourceSrv","variableSrv","templateSrv","datasource","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardVSpacing","cardHSpacing","cardRound","xAxis","show","yAxis","minWidth","maxWidth","tooltip","freezeOnClick","showItems","items","legend","nullPointMode","yAxisSort","highlightCards","useMax","seriesFilterIndex","usingPagination","pageSize","allowAllElements","availableValues","hasAppEventCompatibleEmitter","events","fallbackToStringEvents","panel","defaultsDeep","panelDefaults","setPaginationSize","setCurrentPage","graph","multipleValues","noColorDefined","discreteExtraSeries","dataWarnings","title","tip","noDatapoints","annotations","on","render","onRender","bind","dataReceived","onDataReceived","dataError","onDataError","dataSnapshotLoad","editModeInitialized","onInitEditMode","refresh","postRefresh","onRenderComplete","onCardColorChange","data","chartWidth","renderingCompleted","defaultPageSize","pageSizeViewer","currentPage","numberOfPages","totalElements","firstPageElement","lastPageElement","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","ret","calculateInterval","getChartWidth","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","roundIntervalCeil","lowLimitMs","intervalOverride","interval","replace","scopedVars","slice","interval_to_ms","secondsToHms","annotationsPromise","getAnnotations","dashboard","datasourcePromises","then","r","issueQueriesWithInterval","origInterval","res","dataList","bucketMatrix","convertDataToBuckets","cardsData","targets","length","result","loading","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","mostRecentBucket","buckets","xBucketSize","targetIndex","map","queryResult","i","yLabel","target","hasOwnProperty","push","targetKeys","keys","targetTimestampRanges","targetTimestamps","si","s","datapoints","datapoint","idx","uniq","tsTo","tsFrom","minFrom","targetEmptyBuckets","lastTs","topBucket","relTo","relFrom","values","mostRecent","bucketFrom","b","bucket","xid","minValue","Number","MAX_VALUE","maxValue","MIN_SAFE_INTEGER","dataIndex","dp","belong","put","min","bucketsLen"],"mappings":"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","sourcesContent":["// Libraries\nimport _ from 'lodash';\nimport { auto } from 'angular';\n\n// Components\nimport './color_legend';\nimport { optionsEditorCtrl } from './options_editor';\nimport { tooltipEditorCtrl } from './tooltip_editor';\nimport { migratePanelConfig } from './panel_config_migration';\n\n// Utils\nimport kbn from 'app/core/utils/kbn';\nimport {loadPluginCss} from 'app/plugins/sdk';\n\n// Types\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationsSrv } from 'app/features/annotations/annotations_srv';\nimport { CoreEvents, PanelEvents } from './libs/grafana/events/index';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport rendering from './rendering';\nimport { Polygrafill } from './libs/polygrafill/index';\n\n\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\nexport var renderComplete:any = {name:'statusmap-render-complete'}; // eventFactory('statusmap-render-complete');\n\nclass StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n data: any;\n bucketMatrix: BucketMatrix;\n\n graph: any;\n discreteHelper: ColorModeDiscrete;\n opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n\n cardsDataComplete: any;\n cardsDataLabelsComplete: any;\n ticksWhenPaginating: [];\n\n dataWarnings: {[warningId: string]: {title: string, tip: string}} = {};\n multipleValues: boolean;\n noColorDefined: boolean;\n noDatapoints: boolean;\n\n discreteExtraSeries: ColorModeDiscrete;\n\n annotations: object[] = [];\n annotationsPromise: any;\n\n pageSizeViewer: number = 15;\n currentPage: number = 0;\n numberOfPages: number = 1;\n totalElements: number = 0;\n firstPageElement: number = 1;\n lastPageElement: number = 5;\n\n panelDefaults: any = {\n // datasource name, null = default datasource\n datasource: null,\n // color mode\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n // buckets settings\n cards: {\n cardMinWidth: 5,\n cardVSpacing: 2,\n cardHSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true\n },\n yAxis: {\n show: true,\n minWidth: -1,\n maxWidth: -1\n },\n tooltip: {\n show: true,\n freezeOnClick: true,\n showItems: false,\n items: [] // see tooltip_editor.ts\n },\n legend: {\n show: true\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n yAxisSort: 'metrics',\n highlightCards: true,\n useMax: true,\n\n seriesFilterIndex: -1,\n usingPagination: false,\n pageSize: 15,\n allowAllElements: false,\n availableValues: []\n };\n\n /** @ngInject */\n constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, public variableSrv: any, templateSrv) {\n super($scope, $injector);\n\n if(!Polygrafill.hasAppEventCompatibleEmitter(this.events)){\n CoreEvents.fallbackToStringEvents();\n PanelEvents.fallbackToStringEvents();\n renderComplete = renderComplete.name;\n }\n\n migratePanelConfig(this.panel);\n _.defaultsDeep(this.panel, this.panelDefaults);\n\n if (this.panel.usingPagination) {\n this.setPaginationSize(this.panel.pageSize);\n this.setCurrentPage(0);\n }\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteExtraSeries = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n noColorDefined: {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n multipleValues: {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n },\n noDatapoints: {\n title: 'No data points',\n tip: 'No datapoints returned from data query',\n }\n };\n\n this.annotations = [];\n this.annotationsSrv = annotationsSrv;\n\n this.timeSrv = timeSrv;\n\n this.events.on(PanelEvents.render, this.onRender.bind(this));\n this.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this));\n this.events.on(PanelEvents.dataError, this.onDataError.bind(this));\n this.events.on(PanelEvents.dataSnapshotLoad, this.onDataReceived.bind(this));\n this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n this.events.on(PanelEvents.refresh, this.postRefresh.bind(this));\n // custom event from rendering.js\n this.events.on(renderComplete, this.onRenderComplete.bind(this));\n\n this.onCardColorChange = this.onCardColorChange.bind(this);\n }\n\n onRenderComplete(data: any):void {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n }\n\n changeDefaultPaginationSize(defaultPageSize: number): void {\n this.pageSizeViewer = defaultPageSize;\n\n this.render();\n this.refresh();\n }\n\n changePaginationSize(): void {\n if (this.pageSizeViewer <= 0) {\n this.pageSizeViewer = 1;\n }\n\n this.currentPage = 0;\n\n this.render();\n this.refresh();\n }\n\n getPaginationSize(): number {\n return this.pageSizeViewer;\n }\n\n setPaginationSize(pageSize: number): void {\n this.pageSizeViewer = pageSize;\n }\n\n getCurrentPage(): number {\n return this.currentPage;\n }\n\n setCurrentPage(currentPage: number): void {\n this.currentPage = currentPage;\n }\n\n getNumberOfPages(): number {\n return this.numberOfPages;\n }\n\n getTotalElements(): number {\n return this.totalElements;\n }\n\n setTotalElements(totalElements: number): void {\n this.totalElements = totalElements;\n }\n\n getFirstPageElement(): number {\n return this.firstPageElement;\n }\n\n setFirstPageElement(firstPageElement: number): void {\n this.firstPageElement = firstPageElement;\n }\n\n getLastPageElement(): number {\n return this.lastPageElement;\n }\n\n setLastPageElement(lastPageElement: number): void {\n this.lastPageElement = lastPageElement;\n }\n\n // getChartWidth returns an approximation of chart canvas width or\n // a saved value calculated during a render.\n getChartWidth():number {\n if (this.graph.chartWidth > 0) {\n return this.graph.chartWidth;\n }\n\n const wndWidth = $(window).width();\n // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24.\n const panelWidthFactor = this.panel.gridPos.w / 24;\n const panelWidth = Math.ceil(wndWidth * panelWidthFactor);\n // approximate width of the chart draw canvas:\n // - y axis ticks are not rendered yet on first data receive,\n // so choose 200 as a decent value for y legend width\n // - chartWidth can not be lower than the half of the panel width.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // Quick workaround for 6.7 and 7.0+. There is no call to\n // calculateInterval in updateTimeRange in those versions.\n // TODO ts type has no argument for this method.\n updateTimeRange(datasource?: any) {\n let ret = super.updateTimeRange(datasource);\n this.calculateInterval();\n return ret;\n }\n\n // calculateInterval is called on 'refresh' to calculate an interval\n // for datasource.\n // It is override of calculateInterval from MetricsPanelCtrl.\n calculateInterval() {\n let chartWidth = this.getChartWidth();\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardHSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n \n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n let interval = kbn.secondsToHms(intervalMs / 1000);\n\n this.intervalMs = intervalMs;\n this.interval = interval;\n\n // Get final buckets count after interval is adjusted\n // TODO is it needed?\n //this.xBucketsCount = Math.floor(rangeMs / intervalMs);\n }\n\n issueQueries(datasource: any) {\n this.annotationsPromise = this.annotationsSrv.getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n });\n\n /* Wait for annotationSrv requests to get datasources to\n * resolve before issuing queries. This allows the annotations\n * service to fire annotations queries before graph queries\n * (but not wait for completion). This resolves\n * issue 11806.\n */\n // 5.x before 5.4 doesn't have datasourcePromises.\n if (\"undefined\" !== typeof(this.annotationsSrv.datasourcePromises)) {\n return this.annotationsSrv.datasourcePromises.then(r => {\n return this.issueQueriesWithInterval(datasource, this.interval);\n });\n } else {\n return this.issueQueriesWithInterval(datasource, this.interval);\n }\n }\n\n // Grafana 6.2 (and older) is using this.interval for queries,\n // but Grafana 6.3+ is calculating interval again in queryRunner,\n // so we need to save-restore this.panel.interval.\n issueQueriesWithInterval(datasource: any, interval: any) {\n var origInterval = this.panel.interval;\n this.panel.interval = interval;\n var res = super.issueQueries(datasource);\n this.panel.interval = origInterval;\n return res;\n }\n\n onDataReceived(dataList: any) {\n this.data = dataList;\n // Quick workaround for 7.0+. There is no call to\n // calculateInterval when enter Edit mode.\n if (!this.intervalMs) {\n this.calculateInterval();\n }\n this.bucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true);\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n\n if (this.panel.usingPagination && this.cardsData.targets) {\n this.numberOfPages = Math.ceil(this.cardsData.targets.length/this.pageSizeViewer);\n this.totalElements = this.cardsData.targets.length;\n } else {\n this.setPaginationSize(this.cardsData.targets.length);\n }\n\n if (this.annotationsPromise) {\n this.annotationsPromise.then(\n (result: { alertState: any; annotations: any }) => {\n this.loading = false;\n //this.alertState = result.alertState;\n if (result.annotations && result.annotations.length > 0) {\n this.annotations = result.annotations;\n } else {\n this.annotations = [];\n }\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n this.render(); // this.render(this.data);???\n }\n );\n } else {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', optionsEditorCtrl, 2);\n this.addEditorTab('Tooltip', tooltipEditorCtrl, 3);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n paginate() {\n this.refresh();\n }\n\n // onRender will be called before StatusmapRenderer.onRender.\n // Decide if warning should be displayed over cards.\n onRender() {\n if (!this.range || !this.data) {\n this.noDatapoints = true;\n return;\n }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.bucketMatrix) {\n this.multipleValues = this.bucketMatrix.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex == -1) {\n this.discreteExtraSeries.updateCardsValuesHasColorInfo();\n } else {\n this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle();\n }\n if (this.bucketMatrix) {\n this.noColorDefined = this.bucketMatrix.noColorDefined;\n }\n }\n\n this.noDatapoints = false;\n if (this.bucketMatrix) {\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n }\n }\n\n onCardColorChange(newColor) {\n this.panel.color.cardColor = newColor;\n this.render();\n }\n\n onDataError() {\n this.data = [];\n this.annotations = [];\n this.render();\n }\n\n postRefresh() {\n this.noColorDefined = false;\n }\n\n link(scope, elem, attrs, ctrl) {\n rendering(scope, elem, attrs, ctrl);\n }\n\n // Compatible with Grafana 7.0 overrides feature.\n retrieveTimeVar() {\n var time = this.timeSrv.timeRangeForUrl();\n return 'from=' + time.from + '&to=' + time.to;\n }\n\n // convertToBuckets groups values in data into buckets by target and timestamp.\n //\n // data is a result from datasource. It is an array of timeseries and tables:\n /* [\n // timeseries\n {\n target: \"query alias\",\n refId: \"A\",\n datapoints: [\n [0, 1582681239911],\n [3, 158....],\n ...\n ],\n tags?:{key: value,...}\n },\n // table\n {\n name: \"table name\",\n refId: \"B\",\n columns: [\n {text: \"id\"},\n {text: \"info\"},\n ...\n ],\n rows: [\n [1, \"123\"],\n [2, \"44411\"],\n ...\n ]\n },\n...\n ]\n\n to and from — a time range of the panel.\n intervalMs — a calculated interval. It is used to split a time range.\n */\n convertDataToBuckets(data:any, from:number, to:number, intervalMs: number, mostRecentBucket: boolean):BucketMatrix {\n let bucketMatrix = new BucketMatrix();\n bucketMatrix.rangeMs = to - from;\n bucketMatrix.intervalMs = intervalMs;\n\n if (!data || data.length == 0) {\n // Mimic heatmap and graph 'no data' labels.\n bucketMatrix.targets = [\n \"1.0\", \"0.0\", \"-1.0\"\n ];\n bucketMatrix.buckets[\"1.0\"] = [];\n bucketMatrix.buckets[\"0.0\"] = [];\n bucketMatrix.buckets[\"-1.0\"] = [];\n bucketMatrix.xBucketSize = 42;\n bucketMatrix.noDatapoints = true;\n return bucketMatrix;\n }\n\n let targetIndex: {[target: string]: number[]} = {};\n\n // Group indicies of elements in data by target (y label).\n\n // lodash version:\n //_.map(data, (d, i) => {\n // targetIndex[d.target] = _.concat(_.toArray(targetIndex[d.target]), i);\n //});\n\n data.map((queryResult: any, i: number) => {\n let yLabel = queryResult.target;\n if (!targetIndex.hasOwnProperty(yLabel)) {\n targetIndex[yLabel] = [];\n }\n targetIndex[yLabel].push(i);\n });\n\n let targetKeys = _.keys(targetIndex);\n\n //console.log (\"targetIndex: \", targetIndex, \"targetKeys: \", targetKeys);\n\n let targetTimestampRanges: {[target: string]: {[timestamp: number]: number[]}} = {};\n\n // Collect all timestamps for each target.\n // Make map timestamp => [from, to]. from == previous ts, to == ts from datapoint.\n targetKeys.map((target) => {\n let targetTimestamps: any[] = [];\n\n for (let si = 0; si < targetIndex[target].length; si++) {\n let s = data[targetIndex[target][si]];\n _.map(s.datapoints, (datapoint, idx) => {\n targetTimestamps.push(datapoint[TIME_INDEX]-from);\n })\n }\n\n //console.log(\"timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestamps = _.uniq(targetTimestamps);\n\n //console.log(\"uniq timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestampRanges[target] = [];\n for (let i = targetTimestamps.length-1 ; i>=0; i-- ) {\n let tsTo = targetTimestamps[i];\n let tsFrom = 0;\n if (tsTo < 0) {\n tsFrom = tsTo - intervalMs;\n } else {\n if (i-1 >= 0) {\n // Set from to previous timestamp + 1ms;\n tsFrom = targetTimestamps[i-1]+1;\n // tfTo - tfFrom should not be more than intervalMs\n let minFrom = tsTo - intervalMs;\n if (tsFrom < minFrom) {\n tsFrom = minFrom;\n }\n }\n }\n targetTimestampRanges[target][tsTo] = [tsFrom, tsTo];\n }\n });\n\n // console.log (\"targetTimestampRanges: \", targetTimestampRanges);\n\n // Create empty buckets using intervalMs to calculate ranges.\n // If mostRecentBucket is set, create a bucket with a range \"to\":\"to\"\n // to store most recent values.\n targetKeys.map((target) => {\n let targetEmptyBuckets: any[] = [];\n\n let lastTs = to-from;\n\n if (mostRecentBucket) {\n let topBucket = new Bucket();\n topBucket.yLabel = target;\n topBucket.relTo = lastTs;\n topBucket.relFrom = lastTs;\n topBucket.values = [];\n topBucket.mostRecent = true;\n if (targetTimestampRanges[target].hasOwnProperty(lastTs)) {\n topBucket.relFrom = targetTimestampRanges[target][lastTs][0];\n lastTs = topBucket.relFrom;\n }\n topBucket.to = topBucket.relTo+from;\n topBucket.from = topBucket.relFrom+from;\n targetEmptyBuckets.push(topBucket);\n }\n\n let idx = 0;\n let bucketFrom: number = 0;\n while (bucketFrom >= 0) {\n let b = new Bucket();\n b.yLabel = target;\n b.relTo = lastTs - idx*intervalMs;\n b.relFrom = lastTs - ((idx+1) * intervalMs);\n b.to = b.relTo+from;\n b.from = b.relFrom+from;\n b.values = [];\n bucketFrom = b.relFrom;\n targetEmptyBuckets.push(b);\n idx++;\n }\n\n targetEmptyBuckets.map((bucket, i) => {\n bucket.xid = i;\n });\n\n bucketMatrix.buckets[target] = targetEmptyBuckets;\n });\n\n //console.log (\"bucketMatrix: \", bucketMatrix);\n\n // Put values into buckets.\n bucketMatrix.minValue = Number.MAX_VALUE;\n bucketMatrix.maxValue = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n targetIndex[target].map((dataIndex) => {\n let s = data[dataIndex];\n s.datapoints.map((dp: any) => {\n for (let i = 0; i < bucketMatrix.buckets[target].length; i++) {\n if (bucketMatrix.buckets[target][i].belong(dp[TIME_INDEX])) {\n bucketMatrix.buckets[target][i].put(dp[VALUE_INDEX]);\n }\n }\n });\n });\n bucketMatrix.buckets[target].map((bucket) => {\n bucket.minValue = _.min(bucket.values);\n bucket.maxValue = _.max(bucket.values);\n if (bucket.minValue < bucketMatrix.minValue) {\n bucketMatrix.minValue = bucket.minValue;\n }\n if (bucket.maxValue > bucketMatrix.maxValue) {\n bucketMatrix.maxValue = bucket.maxValue;\n }\n bucket.value = bucket.maxValue;\n if (bucket.values.length > 1) {\n bucketMatrix.multipleValues = true;\n bucket.multipleValues = true;\n\n bucket.value = this.panel.seriesFilterIndex != -1 ? bucket.values[this.panel.seriesFilterIndex] : bucket.maxValue;\n }\n })\n });\n\n bucketMatrix.xBucketSize = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n let bucketsLen: number = bucketMatrix.buckets[target].length;\n if (bucketsLen > bucketMatrix.xBucketSize) {\n bucketMatrix.xBucketSize = bucketsLen;\n }\n });\n\n //console.log (\"bucketMatrix with values: \", bucketMatrix);\n\n bucketMatrix.targets = targetKeys;\n return bucketMatrix;\n }\n}\n\nexport {\n StatusHeatmapCtrl, StatusHeatmapCtrl as PanelCtrl\n};\n"],"file":"module.js"} \ No newline at end of file +{"version":3,"sources":["../src/module.ts"],"names":["_","optionsEditorCtrl","tooltipEditorCtrl","migratePanelConfig","kbn","loadPluginCss","MetricsPanelCtrl","CoreEvents","PanelEvents","Bucket","BucketMatrix","BucketMatrixPager","rendering","Polygrafill","ColorModeDiscrete","VALUE_INDEX","TIME_INDEX","colorSchemes","name","value","invert","colorModes","opacityScales","dark","light","renderComplete","StatusHeatmapCtrl","$scope","$injector","timeSrv","annotationsSrv","$window","datasourceSrv","variableSrv","templateSrv","datasource","color","mode","cardColor","colorScale","exponent","colorScheme","defaultColor","thresholds","cards","cardMinWidth","cardVSpacing","cardHSpacing","cardRound","xAxis","show","yAxis","minWidth","maxWidth","tooltip","freezeOnClick","showItems","items","legend","nullPointMode","yAxisSort","highlightCards","useMax","seriesFilterIndex","usingPagination","pageSize","hasAppEventCompatibleEmitter","events","fallbackToStringEvents","panel","defaultsDeep","panelDefaults","bucketMatrix","bucketMatrixPager","setEnable","setDefaultPageSize","setPageSize","pager","graph","multipleValues","noColorDefined","discreteExtraSeries","dataWarnings","title","tip","noDatapoints","annotations","on","render","onRender","bind","dataReceived","onDataReceived","dataError","onDataError","dataSnapshotLoad","editModeInitialized","onInitEditMode","refresh","postRefresh","onRenderComplete","onCardColorChange","data","chartWidth","renderingCompleted","defaultPageSize","pageSizeViewer","setCurrent","switchToPrev","switchToNext","wndWidth","$","window","width","panelWidthFactor","gridPos","w","panelWidth","Math","ceil","max","ret","calculateInterval","getChartWidth","minCardWidth","minSpacing","maxCardsCount","intervalMs","rangeMs","range","to","valueOf","from","roundIntervalCeil","lowLimitMs","intervalOverride","interval","replace","scopedVars","slice","interval_to_ms","secondsToHms","annotationsPromise","getAnnotations","dashboard","datasourcePromises","then","r","issueQueriesWithInterval","origInterval","res","dataList","newBucketMatrix","convertDataToBuckets","targets","length","result","loading","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","mostRecentBucket","buckets","xBucketSize","targetIndex","map","queryResult","i","yLabel","target","hasOwnProperty","push","targetKeys","keys","targetTimestampRanges","targetTimestamps","si","s","datapoints","datapoint","idx","uniq","tsTo","tsFrom","minFrom","targetEmptyBuckets","lastTs","topBucket","relTo","relFrom","values","mostRecent","bucketFrom","b","bucket","xid","minValue","Number","MAX_VALUE","maxValue","MIN_SAFE_INTEGER","dataIndex","dp","belong","put","min","bucketsLen"],"mappings":"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","sourcesContent":["// Libraries\nimport _ from 'lodash';\nimport { auto } from 'angular';\n\n// Components\nimport './color_legend';\nimport { optionsEditorCtrl } from './options_editor';\nimport { tooltipEditorCtrl } from './tooltip_editor';\nimport { migratePanelConfig } from './panel_config_migration';\n\n// Utils\nimport kbn from 'app/core/utils/kbn';\nimport {loadPluginCss} from 'app/plugins/sdk';\n\n// Types\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationsSrv } from 'app/features/annotations/annotations_srv';\nimport { CoreEvents, PanelEvents } from './libs/grafana/events/index';\nimport {Bucket, BucketMatrix, BucketMatrixPager } from './statusmap_data';\nimport rendering from './rendering';\nimport { Polygrafill } from './libs/polygrafill/index';\n\n\nimport {ColorModeDiscrete} from \"./color_mode_discrete\";\n\nconst VALUE_INDEX = 0,\n TIME_INDEX = 1;\n\nconst colorSchemes = [\n // Diverging\n { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n { name: 'GnYlRd', value: 'interpolateGnYlRd', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' }\n];\n\nlet colorModes = ['opacity', 'spectrum', 'discrete'];\nlet opacityScales = ['linear', 'sqrt'];\n\nloadPluginCss({\n dark: 'plugins/flant-statusmap-panel/css/statusmap.dark.css',\n light: 'plugins/flant-statusmap-panel/css/statusmap.light.css'\n});\n\nexport var renderComplete:any = {name:'statusmap-render-complete'}; // eventFactory('statusmap-render-complete');\n\nclass StatusHeatmapCtrl extends MetricsPanelCtrl {\n static templateUrl = 'module.html';\n\n data: any;\n bucketMatrix: BucketMatrix;\n bucketMatrixPager: BucketMatrixPager;\n\n graph: any;\n discreteHelper: ColorModeDiscrete;\n opacityScales: any = [];\n colorModes: any = [];\n colorSchemes: any = [];\n unitFormats: any;\n\n dataWarnings: {[warningId: string]: {title: string, tip: string}} = {};\n multipleValues: boolean;\n noColorDefined: boolean;\n noDatapoints: boolean;\n\n discreteExtraSeries: ColorModeDiscrete;\n\n annotations: object[] = [];\n annotationsPromise: any;\n\n // TODO remove this transient variable: use ng-model-options=\"{ getterSetter: true }\"\n pageSizeViewer: number = 15;\n\n panelDefaults: any = {\n // datasource name, null = default datasource\n datasource: null,\n // color mode\n color: {\n mode: 'spectrum',\n cardColor: '#b4ff00',\n colorScale: 'sqrt',\n exponent: 0.5,\n colorScheme: 'interpolateGnYlRd',\n // discrete mode settings\n defaultColor: '#757575',\n thresholds: [] // manual colors\n },\n // buckets settings\n cards: {\n cardMinWidth: 5,\n cardVSpacing: 2,\n cardHSpacing: 2,\n cardRound: null\n },\n xAxis: {\n show: true\n },\n yAxis: {\n show: true,\n minWidth: -1,\n maxWidth: -1\n },\n tooltip: {\n show: true,\n freezeOnClick: true,\n showItems: false,\n items: [] // see tooltip_editor.ts\n },\n legend: {\n show: true\n },\n // how null points should be handled\n nullPointMode: 'as empty',\n yAxisSort: 'metrics',\n highlightCards: true,\n useMax: true,\n\n seriesFilterIndex: -1,\n\n // Pagination options\n usingPagination: false,\n pageSize: 15\n };\n\n /** @ngInject */\n constructor($scope: any, $injector: auto.IInjectorService, timeSrv, private annotationsSrv: AnnotationsSrv, $window, datasourceSrv, public variableSrv: any, templateSrv) {\n super($scope, $injector);\n\n if(!Polygrafill.hasAppEventCompatibleEmitter(this.events)){\n CoreEvents.fallbackToStringEvents();\n PanelEvents.fallbackToStringEvents();\n renderComplete = renderComplete.name;\n }\n\n migratePanelConfig(this.panel);\n _.defaultsDeep(this.panel, this.panelDefaults);\n\n this.bucketMatrix = new BucketMatrix();\n\n // Create pager for bucketMatrix and restore page size.\n this.bucketMatrixPager = new BucketMatrixPager();\n this.bucketMatrixPager.setEnable(this.panel.usingPagination);\n this.bucketMatrixPager.setDefaultPageSize(this.panel.pageSize);\n this.bucketMatrixPager.setPageSize(this.panel.pageSize);\n $scope.pager = this.bucketMatrixPager;\n\n this.opacityScales = opacityScales;\n this.colorModes = colorModes;\n this.colorSchemes = colorSchemes;\n\n // default graph width for discrete card width calculation\n this.graph = {\n \"chartWidth\" : -1\n };\n\n this.multipleValues = false;\n this.noColorDefined = false;\n\n this.discreteExtraSeries = new ColorModeDiscrete($scope);\n\n this.dataWarnings = {\n noColorDefined: {\n title: 'Data has value with undefined color',\n tip: 'Check metric values, color values or define a new color',\n },\n multipleValues: {\n title: 'Data has multiple values for one target',\n tip: 'Change targets definitions or set \"use max value\"',\n },\n noDatapoints: {\n title: 'No data points',\n tip: 'No datapoints returned from data query',\n }\n };\n\n this.annotations = [];\n this.annotationsSrv = annotationsSrv;\n\n this.timeSrv = timeSrv;\n\n this.events.on(PanelEvents.render, this.onRender.bind(this));\n this.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this));\n this.events.on(PanelEvents.dataError, this.onDataError.bind(this));\n this.events.on(PanelEvents.dataSnapshotLoad, this.onDataReceived.bind(this));\n this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n this.events.on(PanelEvents.refresh, this.postRefresh.bind(this));\n // custom event from rendering.js\n this.events.on(renderComplete, this.onRenderComplete.bind(this));\n\n this.onCardColorChange = this.onCardColorChange.bind(this);\n }\n\n onRenderComplete(data: any):void {\n this.graph.chartWidth = data.chartWidth;\n this.renderingCompleted();\n }\n\n changeDefaultPaginationSize(defaultPageSize: number): void {\n this.bucketMatrixPager.setDefaultPageSize(defaultPageSize);\n this.bucketMatrixPager.setPageSize(defaultPageSize);\n this.pageSizeViewer = defaultPageSize;\n\n this.render();\n this.refresh();\n }\n\n onChangePageSize(): void {\n if (this.pageSizeViewer <= 0) {\n this.pageSizeViewer = this.bucketMatrixPager.defaultPageSize;\n }\n this.bucketMatrixPager.setPageSize(this.pageSizeViewer);\n this.bucketMatrixPager.setCurrent(0);\n\n this.render();\n this.refresh();\n }\n\n onPrevPage(): void {\n this.bucketMatrixPager.switchToPrev();\n this.render();\n }\n\n onNextPage(): void {\n this.bucketMatrixPager.switchToNext();\n this.render();\n }\n\n\n // getChartWidth returns an approximation of chart canvas width or\n // a saved value calculated during a render.\n getChartWidth():number {\n if (this.graph.chartWidth > 0) {\n return this.graph.chartWidth;\n }\n\n const wndWidth = $(window).width();\n // gripPos.w is a width in grid's measurements. Grid size in Grafana is 24.\n const panelWidthFactor = this.panel.gridPos.w / 24;\n const panelWidth = Math.ceil(wndWidth * panelWidthFactor);\n // approximate width of the chart draw canvas:\n // - y axis ticks are not rendered yet on first data receive,\n // so choose 200 as a decent value for y legend width\n // - chartWidth can not be lower than the half of the panel width.\n const chartWidth = _.max([\n panelWidth - 200,\n panelWidth/2\n ]);\n\n return chartWidth!;\n }\n\n // Quick workaround for 6.7 and 7.0+. There is no call to\n // calculateInterval in updateTimeRange in those versions.\n // TODO ts type has no argument for this method.\n updateTimeRange(datasource?: any) {\n let ret = super.updateTimeRange(datasource);\n this.calculateInterval();\n return ret;\n }\n\n // calculateInterval is called on 'refresh' to calculate an interval\n // for datasource.\n // It is override of calculateInterval from MetricsPanelCtrl.\n calculateInterval() {\n let chartWidth = this.getChartWidth();\n\n let minCardWidth = this.panel.cards.cardMinWidth;\n let minSpacing = this.panel.cards.cardHSpacing;\n let maxCardsCount = Math.ceil((chartWidth-minCardWidth) / (minCardWidth + minSpacing));\n\n let intervalMs;\n let rangeMs = this.range.to.valueOf() - this.range.from.valueOf();\n\n // this is minimal interval! kbn.round_interval will lower it.\n intervalMs = this.discreteExtraSeries.roundIntervalCeil(rangeMs / maxCardsCount);\n\n // Calculate low limit of interval\n let lowLimitMs = 1; // 1 millisecond default low limit\n \n let intervalOverride = this.panel.interval;\n\n // if no panel interval check datasource\n if (intervalOverride) {\n intervalOverride = this.templateSrv.replace(intervalOverride, this.panel.scopedVars);\n } else if (this.datasource && this.datasource.interval) {\n intervalOverride = this.datasource.interval;\n }\n\n if (intervalOverride) {\n if (intervalOverride[0] === '>') {\n intervalOverride = intervalOverride.slice(1);\n }\n lowLimitMs = kbn.interval_to_ms(intervalOverride);\n }\n\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n let interval = kbn.secondsToHms(intervalMs / 1000);\n\n this.intervalMs = intervalMs;\n this.interval = interval;\n\n // Get final buckets count after interval is adjusted\n // TODO is it needed?\n //this.xBucketsCount = Math.floor(rangeMs / intervalMs);\n }\n\n issueQueries(datasource: any) {\n this.annotationsPromise = this.annotationsSrv.getAnnotations({\n dashboard: this.dashboard,\n panel: this.panel,\n range: this.range,\n });\n\n /* Wait for annotationSrv requests to get datasources to\n * resolve before issuing queries. This allows the annotations\n * service to fire annotations queries before graph queries\n * (but not wait for completion). This resolves\n * issue 11806.\n */\n // 5.x before 5.4 doesn't have datasourcePromises.\n if (\"undefined\" !== typeof(this.annotationsSrv.datasourcePromises)) {\n return this.annotationsSrv.datasourcePromises.then(r => {\n return this.issueQueriesWithInterval(datasource, this.interval);\n });\n } else {\n return this.issueQueriesWithInterval(datasource, this.interval);\n }\n }\n\n // Grafana 6.2 (and older) is using this.interval for queries,\n // but Grafana 6.3+ is calculating interval again in queryRunner,\n // so we need to save-restore this.panel.interval.\n issueQueriesWithInterval(datasource: any, interval: any) {\n var origInterval = this.panel.interval;\n this.panel.interval = interval;\n var res = super.issueQueries(datasource);\n this.panel.interval = origInterval;\n return res;\n }\n\n onDataReceived(dataList: any) {\n this.data = dataList;\n // Quick workaround for 7.0+. There is no call to\n // calculateInterval when enter Edit mode.\n if (!this.intervalMs) {\n this.calculateInterval();\n }\n\n let newBucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true);\n\n this.bucketMatrix = newBucketMatrix;\n this.bucketMatrixPager.bucketMatrix = newBucketMatrix;\n if (newBucketMatrix.targets.length !== this.bucketMatrix.targets.length) {\n this.bucketMatrixPager.setCurrent(0);\n }\n\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n\n if (this.annotationsPromise) {\n this.annotationsPromise.then(\n (result: { alertState: any; annotations: any }) => {\n this.loading = false;\n //this.alertState = result.alertState;\n if (result.annotations && result.annotations.length > 0) {\n this.annotations = result.annotations;\n } else {\n this.annotations = [];\n }\n this.render();\n },\n () => {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n );\n } else {\n this.loading = false;\n this.annotations = [];\n this.render();\n }\n }\n\n onInitEditMode() {\n this.addEditorTab('Options', optionsEditorCtrl, 2);\n this.addEditorTab('Tooltip', tooltipEditorCtrl, 3);\n this.unitFormats = kbn.getUnitFormats();\n }\n\n // onRender will be called before StatusmapRenderer.onRender.\n // Decide if warning should be displayed over cards.\n onRender() {\n if (!this.range || !this.data) {\n this.noDatapoints = true;\n return;\n }\n\n this.multipleValues = false;\n if (!this.panel.useMax) {\n if (this.bucketMatrix) {\n this.multipleValues = this.bucketMatrix.multipleValues;\n }\n }\n\n this.noColorDefined = false;\n if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex == -1) {\n this.discreteExtraSeries.updateCardsValuesHasColorInfo();\n } else {\n this.discreteExtraSeries.updateCardsValuesHasColorInfoSingle();\n }\n if (this.bucketMatrix) {\n this.noColorDefined = this.bucketMatrix.noColorDefined;\n }\n }\n\n this.noDatapoints = false;\n if (this.bucketMatrix) {\n this.noDatapoints = this.bucketMatrix.noDatapoints;\n }\n }\n\n onCardColorChange(newColor) {\n this.panel.color.cardColor = newColor;\n this.render();\n }\n\n onDataError() {\n this.data = [];\n this.annotations = [];\n this.render();\n }\n\n postRefresh() {\n this.noColorDefined = false;\n }\n\n link(scope, elem, attrs, ctrl) {\n rendering(scope, elem, attrs, ctrl);\n }\n\n // Compatible with Grafana 7.0 overrides feature.\n retrieveTimeVar() {\n var time = this.timeSrv.timeRangeForUrl();\n return 'from=' + time.from + '&to=' + time.to;\n }\n\n // convertToBuckets groups values in data into buckets by target and timestamp.\n //\n // data is a result from datasource. It is an array of timeseries and tables:\n /* [\n // timeseries\n {\n target: \"query alias\",\n refId: \"A\",\n datapoints: [\n [0, 1582681239911],\n [3, 158....],\n ...\n ],\n tags?:{key: value,...}\n },\n // table\n {\n name: \"table name\",\n refId: \"B\",\n columns: [\n {text: \"id\"},\n {text: \"info\"},\n ...\n ],\n rows: [\n [1, \"123\"],\n [2, \"44411\"],\n ...\n ]\n },\n...\n ]\n\n to and from — a time range of the panel.\n intervalMs — a calculated interval. It is used to split a time range.\n */\n convertDataToBuckets(data:any, from:number, to:number, intervalMs: number, mostRecentBucket: boolean):BucketMatrix {\n let bucketMatrix = new BucketMatrix();\n bucketMatrix.rangeMs = to - from;\n bucketMatrix.intervalMs = intervalMs;\n\n if (!data || data.length == 0) {\n // Mimic heatmap and graph 'no data' labels.\n bucketMatrix.targets = [\n \"1.0\", \"0.0\", \"-1.0\"\n ];\n bucketMatrix.buckets[\"1.0\"] = [];\n bucketMatrix.buckets[\"0.0\"] = [];\n bucketMatrix.buckets[\"-1.0\"] = [];\n bucketMatrix.xBucketSize = 42;\n bucketMatrix.noDatapoints = true;\n return bucketMatrix;\n }\n\n let targetIndex: {[target: string]: number[]} = {};\n\n // Group indicies of elements in data by target (y label).\n\n // lodash version:\n //_.map(data, (d, i) => {\n // targetIndex[d.target] = _.concat(_.toArray(targetIndex[d.target]), i);\n //});\n\n data.map((queryResult: any, i: number) => {\n let yLabel = queryResult.target;\n if (!targetIndex.hasOwnProperty(yLabel)) {\n targetIndex[yLabel] = [];\n }\n targetIndex[yLabel].push(i);\n });\n\n let targetKeys = _.keys(targetIndex);\n\n //console.log (\"targetIndex: \", targetIndex, \"targetKeys: \", targetKeys);\n\n let targetTimestampRanges: {[target: string]: {[timestamp: number]: number[]}} = {};\n\n // Collect all timestamps for each target.\n // Make map timestamp => [from, to]. from == previous ts, to == ts from datapoint.\n targetKeys.map((target) => {\n let targetTimestamps: any[] = [];\n\n for (let si = 0; si < targetIndex[target].length; si++) {\n let s = data[targetIndex[target][si]];\n _.map(s.datapoints, (datapoint, idx) => {\n targetTimestamps.push(datapoint[TIME_INDEX]-from);\n })\n }\n\n //console.log(\"timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestamps = _.uniq(targetTimestamps);\n\n //console.log(\"uniq timestamps['\"+target+\"'] = \", targetTimestamps);\n\n targetTimestampRanges[target] = [];\n for (let i = targetTimestamps.length-1 ; i>=0; i-- ) {\n let tsTo = targetTimestamps[i];\n let tsFrom = 0;\n if (tsTo < 0) {\n tsFrom = tsTo - intervalMs;\n } else {\n if (i-1 >= 0) {\n // Set from to previous timestamp + 1ms;\n tsFrom = targetTimestamps[i-1]+1;\n // tfTo - tfFrom should not be more than intervalMs\n let minFrom = tsTo - intervalMs;\n if (tsFrom < minFrom) {\n tsFrom = minFrom;\n }\n }\n }\n targetTimestampRanges[target][tsTo] = [tsFrom, tsTo];\n }\n });\n\n // console.log (\"targetTimestampRanges: \", targetTimestampRanges);\n\n // Create empty buckets using intervalMs to calculate ranges.\n // If mostRecentBucket is set, create a bucket with a range \"to\":\"to\"\n // to store most recent values.\n targetKeys.map((target) => {\n let targetEmptyBuckets: any[] = [];\n\n let lastTs = to-from;\n\n if (mostRecentBucket) {\n let topBucket = new Bucket();\n topBucket.yLabel = target;\n topBucket.relTo = lastTs;\n topBucket.relFrom = lastTs;\n topBucket.values = [];\n topBucket.mostRecent = true;\n if (targetTimestampRanges[target].hasOwnProperty(lastTs)) {\n topBucket.relFrom = targetTimestampRanges[target][lastTs][0];\n lastTs = topBucket.relFrom;\n }\n topBucket.to = topBucket.relTo+from;\n topBucket.from = topBucket.relFrom+from;\n targetEmptyBuckets.push(topBucket);\n }\n\n let idx = 0;\n let bucketFrom: number = 0;\n while (bucketFrom >= 0) {\n let b = new Bucket();\n b.yLabel = target;\n b.relTo = lastTs - idx*intervalMs;\n b.relFrom = lastTs - ((idx+1) * intervalMs);\n b.to = b.relTo+from;\n b.from = b.relFrom+from;\n b.values = [];\n bucketFrom = b.relFrom;\n targetEmptyBuckets.push(b);\n idx++;\n }\n\n targetEmptyBuckets.map((bucket, i) => {\n bucket.xid = i;\n });\n\n bucketMatrix.buckets[target] = targetEmptyBuckets;\n });\n\n //console.log (\"bucketMatrix: \", bucketMatrix);\n\n // Put values into buckets.\n bucketMatrix.minValue = Number.MAX_VALUE;\n bucketMatrix.maxValue = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n targetIndex[target].map((dataIndex) => {\n let s = data[dataIndex];\n s.datapoints.map((dp: any) => {\n for (let i = 0; i < bucketMatrix.buckets[target].length; i++) {\n if (bucketMatrix.buckets[target][i].belong(dp[TIME_INDEX])) {\n bucketMatrix.buckets[target][i].put(dp[VALUE_INDEX]);\n }\n }\n });\n });\n bucketMatrix.buckets[target].map((bucket) => {\n bucket.minValue = _.min(bucket.values);\n bucket.maxValue = _.max(bucket.values);\n if (bucket.minValue < bucketMatrix.minValue) {\n bucketMatrix.minValue = bucket.minValue;\n }\n if (bucket.maxValue > bucketMatrix.maxValue) {\n bucketMatrix.maxValue = bucket.maxValue;\n }\n bucket.value = bucket.maxValue;\n if (bucket.values.length > 1) {\n bucketMatrix.multipleValues = true;\n bucket.multipleValues = true;\n\n bucket.value = this.panel.seriesFilterIndex != -1 ? bucket.values[this.panel.seriesFilterIndex] : bucket.maxValue;\n }\n })\n });\n\n bucketMatrix.xBucketSize = Number.MIN_SAFE_INTEGER;\n targetKeys.map((target) => {\n let bucketsLen: number = bucketMatrix.buckets[target].length;\n if (bucketsLen > bucketMatrix.xBucketSize) {\n bucketMatrix.xBucketSize = bucketsLen;\n }\n });\n\n //console.log (\"bucketMatrix with values: \", bucketMatrix);\n\n bucketMatrix.targets = targetKeys;\n return bucketMatrix;\n }\n}\n\nexport {\n StatusHeatmapCtrl, StatusHeatmapCtrl as PanelCtrl\n};\n"],"file":"module.js"} \ No newline at end of file diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index f311b21..65e107c 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -216,119 +216,18 @@
Buckets
-
-
Filtering
-
- - -
-
-
-
Pagination options
+
Pagination
- +
- - Rows per page +
-
-
URL
- -
- Insert the url to navigate
-
- -
- -
- -
-
-
-
-
- -
-
- -
-
- -
-
- - - - - - - -

Specify an URL (relative or absolute)

- - Use special variables to specify cell values: -
- $series_label name of the serie -
- $(template.name) name of the templated to be replaced -
- $time append &from...&to on the URL -
- $series_extra use extraSeries value to use it on URL -
-
-
-
- - - - - - -
- - - - -
- -
- -
- - -
-
-
-
-
- -
diff --git a/dist/rendering.js b/dist/rendering.js index 21fc2bb..5fdc6ba 100644 --- a/dist/rendering.js +++ b/dist/rendering.js @@ -5,14 +5,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c var _, $, moment, kbn, appEvents, contextSrv, d3, d3ScaleChromatic, StatusmapTooltip, AnnotationTooltip, renderComplete, CoreEvents, PanelEvents, MIN_CARD_SIZE, CARD_H_SPACING, CARD_V_SPACING, CARD_ROUND, DATA_RANGE_WIDING_FACTOR, DEFAULT_X_TICK_SIZE_PX, DEFAULT_Y_TICK_SIZE_PX, X_AXIS_TICK_PADDING, Y_AXIS_TICK_PADDING, MIN_SELECTION_WIDTH, Statusmap, StatusmapRenderer; - function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - - function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - - function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } @@ -161,6 +153,8 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c _defineProperty(this, "bucketMatrix", void 0); + _defineProperty(this, "bucketMatrixPager", void 0); + _defineProperty(this, "panel", void 0); _defineProperty(this, "$heatmap", void 0); @@ -247,9 +241,12 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c } if (this.panel.usingPagination) { - height -= this.panel.legend.show ? 140 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! + // TODO get height of pagination controls. + // reserve height for legend and for a row of pagination controls. + height -= this.panel.legend.show ? 70 : 40; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! } else { - height -= this.panel.legend.show ? 50 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! + // reserve height for legend + height -= this.panel.legend.show ? 32 : 4; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! } this.$heatmap.css('height', height + 'px'); @@ -317,10 +314,8 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c }, { key: "getYScale", value: function getYScale(ticks) { - var range = []; //let step = this.chartHeight / ticks.length; - - console.log('GETYSCALE - RENDERING', this.ctrl.getPaginationSize()); - var step = this.chartHeight / this.ctrl.getPaginationSize(); // svg has y=0 on the top, so top card should have a minimal value in range + var range = []; + var step = this.chartHeight / ticks.length; // svg has y=0 on the top, so top card should have a minimal value in range range.push(step); @@ -334,10 +329,8 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c }, { key: "getYAxisScale", value: function getYAxisScale(ticks) { - var range = []; //let step = this.chartHeight / ticks.length; - - console.log('GETYAXISSCALE - RENDERING', this.ctrl.getPaginationSize()); - var step = this.chartHeight / this.ctrl.getPaginationSize(); // svg has y=0 on the top, so top tick should have a minimal value in range + var range = []; + var step = this.chartHeight / ticks.length; // svg has y=0 on the top, so top tick should have a minimal value in range range.push(this.yOffset); @@ -350,21 +343,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c }, { key: "addYAxis", value: function addYAxis() { - var ticks; - - if (this.ctrl.ticksWhenPaginating !== undefined && this.ctrl.panel.usingPagination) { - ticks = _.uniq(_.map(this.ctrl.ticksWhenPaginating)); - } else { - ticks = this.bucketMatrix.targets; //ticks = _.uniq(_.map(this.data, d => d.target)); - } // // Set default Y min and max if no data - // if (_.isEmpty(this.data)) { - // ticks = ['']; - // } - // - // // TODO - // // New version! - // let ticks = this.bucketMatrix.targets; - + var ticks = this.bucketMatrixPager.targets(); // TODO move sorting into bucketMatrixPager. if (this.panel.yAxisSort == 'a → z') { ticks.sort(function (a, b) { @@ -454,15 +433,8 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.yGridSize = this.chartHeight; - if (this.ctrl.panel.usingPagination) { - // Pagination mode overrides count of rows. - //this.yGridSize = Math.floor(this.chartHeight / this.ctrl.ticksWhenPaginating.length); - console.log('addHeatmapCanvas - rendering', this.ctrl.getPaginationSize()); - this.yGridSize = Math.floor(this.chartHeight / this.ctrl.getPaginationSize()); - } else { - if (this.bucketMatrix.targets.length > 0) { - this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length); - } + if (this.bucketMatrixPager.targets().length > 0) { + this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrixPager.targets().length); } this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0; @@ -499,7 +471,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.setOpacityScale(maxValue); // Draw cards from buckets. - this.heatmap.selectAll(".statusmap-cards-row").data(this.bucketMatrix.targets).enter().selectAll(".statustmap-card").data(function (target) { + this.heatmap.selectAll(".statusmap-cards-row").data(this.bucketMatrixPager.targets()).enter().selectAll(".statustmap-card").data(function (target) { return _this.bucketMatrix.buckets[target]; }).enter().append("rect").attr("cardId", function (b) { return b.id; @@ -878,64 +850,10 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.panel = this.ctrl.panel; this.timeRange = this.ctrl.range; this.bucketMatrix = this.ctrl.bucketMatrix; + this.bucketMatrixPager = this.ctrl.bucketMatrixPager; if (!this.bucketMatrix || !this.setElementHeight()) { return; - } else { - // TODO pagination! - this.ctrl.cardsDataComplete = this.ctrl.bucketMatrix.buckets; - - if (this.ctrl.panel.usingPagination) { - if (!this.bucketMatrix.targets) { - return; - } - - this.ctrl.setFirstPageElement(this.ctrl.getCurrentPage() * this.ctrl.getPaginationSize() + 1); - var elems = this.ctrl.getTotalElements(); - console.log('total elems in add heatmap canvas', elems); - - if (elems < this.ctrl.getFirstPageElement()) { - this.ctrl.setCurrentPage(0); - this.render(); - } - - if (this.ctrl.getPaginationSize() >= this.ctrl.getTotalElements()) { - this.ctrl.setLastPageElement(this.ctrl.getTotalElements()); - } else { - if (this.ctrl.getCurrentPage() + 1 === this.ctrl.getNumberOfPages() && this.ctrl.getCurrentPage() > 0) { - this.ctrl.setLastPageElement(this.ctrl.getTotalElements()); - } else { - this.ctrl.setLastPageElement(this.ctrl.getCurrentPage() * this.ctrl.getPaginationSize() + this.ctrl.getPaginationSize()); - } - } - - var cardsList = this.ctrl.bucketMatrix.targets.slice(this.ctrl.getPaginationSize() * this.ctrl.getCurrentPage(), this.ctrl.getPaginationSize() * this.ctrl.getCurrentPage() + this.ctrl.getPaginationSize()); - var cardsToShow = []; - var labelsToShow = []; // Rewrite for bucket matrix. - - for (var i = 0; i < this.cardsData.cards.length; i++) { - var card = this.cardsData.cards[i]; - - for (var j = 0; j < cardsList.length; j++) { - var value = cardsList[j]; - - if (card.y === value) { - cardsToShow.push(card); - labelsToShow.push(value); - } - } - } - - var labelsToShowClean = _toConsumableArray(new Set(labelsToShow)); - - this.cardsData.cards = cardsToShow.slice(); - this.ctrl.ticksWhenPaginating = labelsToShowClean; - cardsToShow = undefined; - } else { - var pageSize = this.ctrl.bucketMatrix.targets.length; - this.ctrl.getPaginationSize(pageSize); - this.ctrl.ticksWhenPaginating = undefined; - } } // Draw default axes and return if no data @@ -950,8 +868,7 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.scope.xAxisHeight = this.xAxisHeight; this.scope.chartHeight = this.chartHeight; this.scope.chartWidth = this.chartWidth; - this.scope.chartTop = this.chartTop; // TODO pagination. Why this needed? - //this.ctrl.cardsData.cards = this.ctrl.cardsDataComplete.slice(); + this.scope.chartTop = this.chartTop; } }, { key: "_renderAnnotations", diff --git a/dist/rendering.js.map b/dist/rendering.js.map index 4f76bfd..e861147 100644 --- a/dist/rendering.js.map +++ b/dist/rendering.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","AnnotationTooltip","renderComplete","CoreEvents","PanelEvents","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","Statusmap","from","to","$heatmap","find","tooltip","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","render","onRender","bind","tickValueFormatter","graphHover","onGraphHover","graphHoverClear","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","renderingCompleted","height","panel","row","isString","parseInt","replace","usingPagination","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","console","log","getPaginationSize","step","push","i","length","scaleOrdinal","ticksWhenPaginating","undefined","uniq","bucketMatrix","targets","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","insert","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardHeight","addYAxis","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","data","enter","target","buckets","id","xid","yLabel","getCardX","getCardWidth","getCardY","getCardHeight","isEmpty","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","rightX","relTo","rangeMs","cx","w","cutted_width","ys","y","h","bucket","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","freezeOnClick","showFrozen","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","cardsDataComplete","setFirstPageElement","getCurrentPage","elems","getTotalElements","getFirstPageElement","setCurrentPage","setLastPageElement","getNumberOfPages","cardsList","slice","cardsToShow","labelsToShow","cardsData","card","j","labelsToShowClean","Set","pageSize","addStatusmapCanvas","noDatapoints","addStatusmap","annotations","annoData","d","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {AnnotationTooltip} from './annotations';\nimport { Bucket, BucketMatrix } from './statusmap_data';\nimport { StatusHeatmapCtrl, renderComplete } from './module';\nimport { CoreEvents, PanelEvents } from './libs/grafana/events/index';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nclass Statusmap {\n $svg: any;\n svg: any;\n bucketMatrix: BucketMatrix;\n\n timeRange: {from: number, to: number} = {from:0, to:0};\n\n constructor() {\n\n }\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n\n bucketMatrix: BucketMatrix;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: StatusHeatmapCtrl) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.statusmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on(PanelEvents.render, this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip this.empty = true;\n\n appEvents.on( CoreEvents.graphHover, this.onGraphHover.bind(this), this.scope);\n\n appEvents.on( CoreEvents.graphHoverClear, this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight(): boolean {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n if (this.panel.usingPagination) {\n height -= this.panel.legend.show ? 140 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n } else {\n height -= this.panel.legend.show ? 50 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n }\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any): number {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any): number {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n //this.scope.xScale = this.xScale = d3.scaleTime()\n // .domain([this.timeRange.from, this.timeRange.to])\n // .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n // Buckets without the most recent\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks: any[]) {\n let range:any[] = [];\n //let step = this.chartHeight / ticks.length;\n console.log('GETYSCALE - RENDERING', this.ctrl.getPaginationSize());\n let step = this.chartHeight / this.ctrl.getPaginationSize();\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks: any[]) {\n let range:any[] = [];\n //let step = this.chartHeight / ticks.length;\n console.log('GETYAXISSCALE - RENDERING', this.ctrl.getPaginationSize());\n let step = this.chartHeight / this.ctrl.getPaginationSize();\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n\n let ticks;\n\n if(this.ctrl.ticksWhenPaginating !== undefined && this.ctrl.panel.usingPagination) {\n ticks = _.uniq(_.map(this.ctrl.ticksWhenPaginating));\n } else {\n ticks = this.bucketMatrix.targets;\n //ticks = _.uniq(_.map(this.data, d => d.target));\n }\n\n // // Set default Y min and max if no data\n // if (_.isEmpty(this.data)) {\n // ticks = [''];\n // }\n //\n // // TODO\n // // New version!\n // let ticks = this.bucketMatrix.targets;\n\n\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min: number, max: number, tickInterval: number) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addStatusmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n // Insert svg as a first child into heatmap_elem\n // as the frozen tooltip moving logiс assumes that tooltip is the last child.\n this.heatmap = d3.select(heatmap_elem)\n .insert(\"svg\",\":first-child\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = this.chartHeight;\n if (this.ctrl.panel.usingPagination) {\n // Pagination mode overrides count of rows.\n //this.yGridSize = Math.floor(this.chartHeight / this.ctrl.ticksWhenPaginating.length);\n console.log('addHeatmapCanvas - rendering',this.ctrl.getPaginationSize());\n this.yGridSize = Math.floor(this.chartHeight / this.ctrl.getPaginationSize());\n } else {\n if (this.bucketMatrix.targets.length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length);\n }\n }\n\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.bucketMatrix.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addStatusmap():void {\n let maxValue = this.panel.color.max || this.bucketMatrix.maxValue;\n let minValue = this.panel.color.min || this.bucketMatrix.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n // Draw cards from buckets.\n this.heatmap.selectAll(\".statusmap-cards-row\").data(this.bucketMatrix.targets)\n .enter()\n .selectAll(\".statustmap-card\")\n .data((target:string) => this.bucketMatrix.buckets[target])\n .enter()\n .append(\"rect\")\n .attr(\"cardId\", (b:Bucket) => b.id)\n .attr(\"xid\", (b:Bucket) => b.xid)\n .attr(\"yid\", (b:Bucket) => b.yLabel)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", (b:Bucket) => b.isEmpty() ? \"empty-card\" : \"bordered statusmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n // Set mouse events on cards.\n let $cards = this.$heatmap.find(\".statusmap-card + .bordered\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit(renderComplete, {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(b: Bucket) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n //let cx = this.xScale(d.x);\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(b: Bucket) {\n //return 20;\n let w;\n\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n //let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n // Top y for card.\n // yScale gives ???\n getCardY(b: Bucket) {\n return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(b: Bucket) {\n //return 20;\n let ys = this.yScale(b.yLabel);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(bucket: Bucket) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(bucket.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values);\n }\n }\n }\n\n getCardOpacity(bucket: Bucket) {\n if (this.panel.nullPointMode === 'as empty' && bucket.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(bucket.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(b: Bucket) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit(CoreEvents.graphHoverClear);\n this.clearCrosshair();\n this.annotationTooltip.destroy();\n }\n\n onMouseMove(event: MouseEvent) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event);\n this.annotationTooltip.show(event);\n }\n }\n\n // TODO emit an event and move logic to panelCtrl\n public onMouseClick(e: MouseEvent) {\n if (this.ctrl.panel.tooltip.freezeOnClick) {\n this.tooltip.showFrozen(e);\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit(CoreEvents.graphHover, {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n\n render() {\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.bucketMatrix = this.ctrl.bucketMatrix;\n\n if (!this.bucketMatrix || !this.setElementHeight()) {\n return;\n } else {\n // TODO pagination!\n this.ctrl.cardsDataComplete = this.ctrl.bucketMatrix.buckets;\n\n if(this.ctrl.panel.usingPagination) {\n if (!this.bucketMatrix.targets) {\n return;\n }\n\n this.ctrl.setFirstPageElement((this.ctrl.getCurrentPage()*this.ctrl.getPaginationSize())+1);\n\n let elems = this.ctrl.getTotalElements();\n\n console.log('total elems in add heatmap canvas', elems);\n if (elems < this.ctrl.getFirstPageElement()) {\n this.ctrl.setCurrentPage(0);\n this.render();\n }\n\n if (this.ctrl.getPaginationSize() >= this.ctrl.getTotalElements()) {\n this.ctrl.setLastPageElement(this.ctrl.getTotalElements());\n } else {\n if ((this.ctrl.getCurrentPage()+1) === this.ctrl.getNumberOfPages() && (this.ctrl.getCurrentPage()>0)) {\n this.ctrl.setLastPageElement(this.ctrl.getTotalElements());\n } else {\n this.ctrl.setLastPageElement((this.ctrl.getCurrentPage() * this.ctrl.getPaginationSize())+this.ctrl.getPaginationSize());\n }\n }\n\n let cardsList = this.ctrl.bucketMatrix.targets.slice(this.ctrl.getPaginationSize()*this.ctrl.getCurrentPage(),\n (this.ctrl.getPaginationSize()*this.ctrl.getCurrentPage())+this.ctrl.getPaginationSize());\n\n let cardsToShow = [];\n let labelsToShow = [];\n\n // Rewrite for bucket matrix.\n for (let i = 0; i < this.cardsData.cards.length; i++) {\n const card = this.cardsData.cards[i];\n\n for (let j = 0; j < cardsList.length; j++) {\n const value = cardsList[j];\n\n if (card.y === value) {\n cardsToShow.push(card);\n labelsToShow.push(value);\n }\n\n }\n }\n\n const labelsToShowClean = [...new Set(labelsToShow)];\n\n this.cardsData.cards = cardsToShow.slice();\n this.ctrl.ticksWhenPaginating = labelsToShowClean;\n\n cardsToShow = undefined;\n } else {\n const pageSize = this.ctrl.bucketMatrix.targets.length\n this.ctrl.getPaginationSize(pageSize);\n this.ctrl.ticksWhenPaginating = undefined;\n }\n }\n\n // Draw default axes and return if no data\n this.addStatusmapCanvas();\n if (this.bucketMatrix.noDatapoints) {\n return;\n }\n\n this.addStatusmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n\n // TODO pagination. Why this needed?\n //this.ctrl.cardsData.cards = this.ctrl.cardsDataComplete.slice();\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"} \ No newline at end of file +{"version":3,"sources":["../src/rendering.ts"],"names":["rendering","scope","elem","attrs","ctrl","StatusmapRenderer","grafanaTimeFormat","ticks","min","max","range","secPerTick","oneDay","oneYear","_","$","moment","kbn","appEvents","contextSrv","d3","d3ScaleChromatic","StatusmapTooltip","AnnotationTooltip","renderComplete","CoreEvents","PanelEvents","MIN_CARD_SIZE","CARD_H_SPACING","CARD_V_SPACING","CARD_ROUND","DATA_RANGE_WIDING_FACTOR","DEFAULT_X_TICK_SIZE_PX","DEFAULT_Y_TICK_SIZE_PX","X_AXIS_TICK_PADDING","Y_AXIS_TICK_PADDING","MIN_SELECTION_WIDTH","Statusmap","from","to","$heatmap","find","tooltip","annotationTooltip","yOffset","selection","active","x1","x2","padding","left","right","top","bottom","margin","events","on","render","onRender","bind","tickValueFormatter","graphHover","onGraphHover","graphHoverClear","onGraphHoverClear","onMouseDown","onMouseMove","onMouseLeave","onMouseClick","clearCrosshair","event","drawSharedCrosshair","pos","renderingCompleted","height","panel","row","isString","parseInt","replace","usingPagination","legend","show","css","e","axisText","selectAll","nodes","maxTextWidth","map","text","getBBox","width","Math","ceil","axisLine","select","empty","axisLinePosition","parseFloat","attr","canvasWidth","xScale","scaleTime","domain","timeRange","xGridSize","chartWidth","grafanaTimeFormatter","timeFormat","dashboardTimeZone","dashboard","getTimezone","utcFormat","xAxis","axisBottom","tickFormat","tickPadding","tickSize","chartHeight","posY","chartTop","posX","yAxisWidth","heatmap","append","call","remove","step","length","push","i","scaleOrdinal","bucketMatrixPager","targets","yAxisSort","sort","a","b","localeCompare","ignorePunctuation","numeric","yAxisScale","getYAxisScale","yScale","getYScale","yAxis","axisLeft","tickValues","tickSizeInner","getYAxisWidth","tickInterval","y_widing","dataRangeWidingFactor","y_min","y_max","floor","decimals","scaledDecimals","format","value","valueFormats","heatmap_elem","insert","chartBottom","cardHSpacing","cards","cardVSpacing","cardRound","yGridSize","cardHeight","addYAxis","bucketMatrix","xBucketSize","cardWidth","addXAxis","xAxisHeight","getXAxisHeight","style","maxValue","color","minValue","mode","colorScale","getColorScale","setOpacityScale","data","enter","target","buckets","id","xid","yLabel","getCardX","getCardWidth","getCardY","getCardHeight","isEmpty","getCardColor","getCardOpacity","$cards","mouseOverBucket","highlightCard","resetCardHighLight","_renderAnnotations","emit","highlightColor","darker","strokeColor","brighter","current_card","originalFillColor","toString","colorScheme","colorSchemes","colorInterpolator","colorScaleInverted","invert","user","lightTheme","start","end","scaleSequential","opacityScale","scaleLinear","scalePow","exponent","x","rightX","relTo","rangeMs","cx","w","cutted_width","ys","y","h","bucket","cardColor","seriesFilterIndex","discreteExtraSeries","getBucketColorSingle","values","getBucketColor","nullPointMode","elemOffset","offset","clientX","clientY","getEventOffset","mouseUpHandler","onMouseUp","document","one","unbind","selectionRange","abs","timeFrom","timeTo","timeSrv","setTime","utc","clearSelection","destroy","limitSelection","offsetX","drawSelection","emitGraphHoverEvent","drawCrosshair","freezeOnClick","showFrozen","valueOf","pageX","pageY","y1","panelRelY","offsetY","posX1","posX2","selectionX","selectionWidth","position","graphTooltip","setElementHeight","addStatusmapCanvas","noDatapoints","addStatusmap","annotations","annoData","d","time","source","anno","iconColor","join","$ticks","mouseOverAnnotationTick"],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport $ from 'jquery';\nimport moment from 'moment';\nimport kbn from 'app/core/utils/kbn';\nimport {appEvents, contextSrv} from 'app/core/core';\nimport * as d3 from 'd3';\nimport * as d3ScaleChromatic from './libs/d3-scale-chromatic/index';\nimport {StatusmapTooltip} from './tooltip';\nimport {AnnotationTooltip} from './annotations';\nimport { Bucket, BucketMatrix, BucketMatrixPager } from './statusmap_data';\nimport { StatusHeatmapCtrl, renderComplete } from './module';\nimport { CoreEvents, PanelEvents } from './libs/grafana/events/index';\n\nlet MIN_CARD_SIZE = 5,\n CARD_H_SPACING = 2,\n CARD_V_SPACING = 2,\n CARD_ROUND = 0,\n DATA_RANGE_WIDING_FACTOR = 1.2,\n DEFAULT_X_TICK_SIZE_PX = 100,\n DEFAULT_Y_TICK_SIZE_PX = 50,\n X_AXIS_TICK_PADDING = 10,\n Y_AXIS_TICK_PADDING = 5,\n MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n return new StatusmapRenderer(scope, elem, attrs, ctrl);\n}\n\nclass Statusmap {\n $svg: any;\n svg: any;\n bucketMatrix: BucketMatrix;\n\n timeRange: {from: number, to: number} = {from:0, to:0};\n\n constructor() {\n\n }\n}\n\nexport class StatusmapRenderer {\n width: number = 0;\n height: number = 0;\n yScale: any;\n xScale: any;\n chartWidth: number = 0;\n chartHeight: number = 0;\n chartTop: number = 0;\n chartBottom: number = 0;\n yAxisWidth: number = 0;\n xAxisHeight: number = 0;\n cardVSpacing: number = 0;\n cardHSpacing: number = 0;\n cardRound: number = 0;\n cardWidth: number = 0;\n cardHeight: number = 0;\n colorScale: any;\n opacityScale: any;\n mouseUpHandler: any;\n xGridSize: number = 0;\n yGridSize: number = 0;\n\n bucketMatrix: BucketMatrix;\n bucketMatrixPager: BucketMatrixPager;\n panel: any;\n $heatmap: any;\n tooltip: StatusmapTooltip;\n annotationTooltip: AnnotationTooltip;\n heatmap: any;\n timeRange: any;\n\n yOffset: number;\n selection: any;\n padding: any;\n margin: any;\n dataRangeWidingFactor: number = DATA_RANGE_WIDING_FACTOR;\n\n constructor(private scope: any, private elem: any, attrs: any, private ctrl: StatusHeatmapCtrl) {\n // $heatmap is JQuery object, but heatmap is D3\n this.$heatmap = this.elem.find('.statusmap-panel');\n this.tooltip = new StatusmapTooltip(this.$heatmap, this.scope);\n this.annotationTooltip = new AnnotationTooltip(this.$heatmap, this.scope);\n\n this.yOffset = 0;\n\n this.selection = {\n active: false,\n x1: -1,\n x2: -1,\n };\n\n this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n\n this.ctrl.events.on(PanelEvents.render, this.onRender.bind(this));\n\n this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n // Shared crosshair and tooltip this.empty = true;\n\n appEvents.on( CoreEvents.graphHover, this.onGraphHover.bind(this), this.scope);\n\n appEvents.on( CoreEvents.graphHoverClear, this.onGraphHoverClear.bind(this), this.scope);\n\n // Register selection listeners\n this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n this.$heatmap.on('click', this.onMouseClick.bind(this));\n }\n\n onGraphHoverClear() {\n this.clearCrosshair();\n }\n\n onGraphHover(event: { pos: any }) {\n this.drawSharedCrosshair(event.pos);\n }\n\n onRender() {\n this.render();\n this.ctrl.renderingCompleted();\n }\n\n\n setElementHeight(): boolean {\n try {\n var height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n if (_.isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n if (this.panel.usingPagination) {\n // TODO get height of pagination controls.\n // reserve height for legend and for a row of pagination controls.\n height -= this.panel.legend.show ? 70 : 40; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n } else {\n // reserve height for legend\n height -= this.panel.legend.show ? 32 : 4; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\n }\n\n this.$heatmap.css('height', height + 'px');\n\n return true;\n } catch (e) { // IE throws errors sometimes\n return false;\n }\n }\n\n getYAxisWidth(elem: any): number {\n const axisText = elem.selectAll(\".axis-y text\").nodes();\n const maxTextWidth = _.max(_.map(axisText, text => {\n // Use SVG getBBox method\n return text.getBBox().width;\n }));\n\n return Math.ceil(maxTextWidth);\n }\n\n getXAxisHeight(elem: any): number {\n let axisLine = elem.select(\".axis-x line\");\n if (!axisLine.empty()) {\n let axisLinePosition = parseFloat(elem.select(\".axis-x line\").attr(\"y2\"));\n let canvasWidth = parseFloat(elem.attr(\"height\"));\n return canvasWidth - axisLinePosition;\n } else {\n // Default height\n return 30;\n }\n }\n\n addXAxis() {\n // Scale timestamps to cards centers\n //this.scope.xScale = this.xScale = d3.scaleTime()\n // .domain([this.timeRange.from, this.timeRange.to])\n // .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n // Buckets without the most recent\n this.scope.xScale = this.xScale = d3.scaleTime()\n .domain([this.timeRange.from, this.timeRange.to])\n .range([this.xGridSize/2, this.chartWidth-this.xGridSize/2]);\n\n let ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n let grafanaTimeFormatter = grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n let timeFormat;\n let dashboardTimeZone = this.ctrl.dashboard.getTimezone();\n if (dashboardTimeZone === 'utc') {\n timeFormat = d3.utcFormat(grafanaTimeFormatter);\n } else {\n timeFormat = d3.timeFormat(grafanaTimeFormatter);\n }\n\n let xAxis = d3\n .axisBottom(this.xScale)\n .ticks(ticks)\n .tickFormat(timeFormat)\n .tickPadding(X_AXIS_TICK_PADDING)\n .tickSize(this.chartHeight);\n\n let posY = this.chartTop; // this.margin.top !\n let posX = this.yAxisWidth;\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"axis axis-x\")\n .attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\")\n .call(xAxis);\n\n // Remove horizontal line in the top of axis labels (called domain in d3)\n this.heatmap\n .select(\".axis-x\")\n .select(\".domain\")\n .remove();\n }\n\n // divide chart height by ticks for cards drawing\n getYScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top card should have a minimal value in range\n range.push(step);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * (i+1));\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n // divide chart height by ticks with offset for ticks drawing\n getYAxisScale(ticks: any[]) {\n let range:any[] = [];\n let step = this.chartHeight / ticks.length;\n // svg has y=0 on the top, so top tick should have a minimal value in range\n range.push(this.yOffset);\n for (let i = 1; i < ticks.length; i++) {\n range.push(step * i + this.yOffset);\n }\n return d3.scaleOrdinal()\n .domain(ticks)\n .range(range);\n }\n\n addYAxis() {\n let ticks = this.bucketMatrixPager.targets();\n\n // TODO move sorting into bucketMatrixPager.\n if (this.panel.yAxisSort == 'a → z') {\n ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n } else if (this.panel.yAxisSort == 'z → a') {\n ticks.sort((b, a) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true}));\n }\n\n let yAxisScale = this.getYAxisScale(ticks);\n this.scope.yScale = this.yScale = this.getYScale(ticks);\n\n let yAxis = d3\n .axisLeft(yAxisScale)\n .tickValues(ticks)\n .tickSizeInner(0 - this.width)\n .tickPadding(Y_AXIS_TICK_PADDING);\n\n this.heatmap\n .append(\"g\")\n .attr(\"class\", \"axis axis-y\")\n .call(yAxis);\n\n // Calculate Y axis width first, then move axis into visible area\n let posY = this.margin.top;\n let posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.heatmap.select(\".axis-y\").attr(\"transform\", \"translate(\" + posX + \",\" + posY + \")\");\n\n // Remove vertical line in the right of axis labels (called domain in d3)\n this.heatmap.select(\".axis-y\").select(\".domain\").remove();\n this.heatmap.select(\".axis-y\").selectAll(\".tick line\").remove();\n }\n\n // Wide Y values range and adjust to bucket size\n wideYAxisRange(min: number, max: number, tickInterval: number) {\n let y_widing = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n let y_min, y_max;\n\n if (tickInterval === 0) {\n y_max = max * this.dataRangeWidingFactor;\n y_min = min - min * (this.dataRangeWidingFactor - 1);\n tickInterval = (y_max - y_min) / 2;\n } else {\n y_max = Math.ceil((max + y_widing) / tickInterval) * tickInterval;\n y_min = Math.floor((min - y_widing) / tickInterval) * tickInterval;\n }\n\n // Don't wide axis below 0 if all values are positive\n if (min >= 0 && y_min < 0) {\n y_min = 0;\n }\n\n return {y_min, y_max};\n }\n\n tickValueFormatter(decimals, scaledDecimals = null) {\n let format = this.panel.yAxis.format;\n return function(value) {\n return kbn.valueFormats[format](value, decimals, scaledDecimals);\n };\n }\n\n // Create svg element, add axes and\n // calculate sizes for cards drawing\n addStatusmapCanvas() {\n let heatmap_elem = this.$heatmap[0];\n\n this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n if (this.heatmap) {\n this.heatmap.remove();\n }\n\n // Insert svg as a first child into heatmap_elem\n // as the frozen tooltip moving logiс assumes that tooltip is the last child.\n this.heatmap = d3.select(heatmap_elem)\n .insert(\"svg\",\":first-child\")\n .attr(\"width\", this.width)\n .attr(\"height\", this.height);\n\n this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n this.chartTop = this.margin.top;\n this.chartBottom = this.chartTop + this.chartHeight;\n\n this.cardHSpacing = this.panel.cards.cardHSpacing !== null ? this.panel.cards.cardHSpacing : CARD_H_SPACING;\n this.cardVSpacing = this.panel.cards.cardVSpacing !== null ? this.panel.cards.cardVSpacing : CARD_V_SPACING;\n this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n // calculate yOffset for YAxis\n this.yGridSize = this.chartHeight;\n if (this.bucketMatrixPager.targets().length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrixPager.targets().length);\n }\n this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0;\n this.yOffset = this.cardHeight / 2;\n\n this.addYAxis();\n\n this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n\n // TODO allow per-y cardWidth!\n // we need to fill chartWidth with xBucketSize cards.\n this.xGridSize = this.chartWidth / (this.bucketMatrix.xBucketSize+1);\n this.cardWidth = this.xGridSize - this.cardHSpacing;\n\n this.addXAxis();\n this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n if (!this.panel.yAxis.show) {\n this.heatmap.select(\".axis-y\").selectAll(\"line\").style(\"opacity\", 0);\n }\n\n if (!this.panel.xAxis.show) {\n this.heatmap.select(\".axis-x\").selectAll(\"line\").style(\"opacity\", 0);\n }\n }\n\n addStatusmap():void {\n let maxValue = this.panel.color.max || this.bucketMatrix.maxValue;\n let minValue = this.panel.color.min || this.bucketMatrix.minValue;\n\n if (this.panel.color.mode !== 'discrete') {\n this.colorScale = this.getColorScale(maxValue, minValue);\n }\n this.setOpacityScale(maxValue);\n\n // Draw cards from buckets.\n this.heatmap.selectAll(\".statusmap-cards-row\").data(this.bucketMatrixPager.targets())\n .enter()\n .selectAll(\".statustmap-card\")\n .data((target:string) => this.bucketMatrix.buckets[target])\n .enter()\n .append(\"rect\")\n .attr(\"cardId\", (b:Bucket) => b.id)\n .attr(\"xid\", (b:Bucket) => b.xid)\n .attr(\"yid\", (b:Bucket) => b.yLabel)\n .attr(\"x\", this.getCardX.bind(this))\n .attr(\"width\", this.getCardWidth.bind(this))\n .attr(\"y\", this.getCardY.bind(this))\n .attr(\"height\", this.getCardHeight.bind(this))\n .attr(\"rx\", this.cardRound)\n .attr(\"ry\", this.cardRound)\n .attr(\"class\", (b:Bucket) => b.isEmpty() ? \"empty-card\" : \"bordered statusmap-card\")\n .style(\"fill\", this.getCardColor.bind(this))\n .style(\"stroke\", this.getCardColor.bind(this))\n .style(\"stroke-width\", 0)\n //.style(\"stroke-width\", getCardStrokeWidth)\n //.style(\"stroke-dasharray\", \"3,3\")\n .style(\"opacity\", this.getCardOpacity.bind(this));\n\n // Set mouse events on cards.\n let $cards = this.$heatmap.find(\".statusmap-card + .bordered\");\n $cards\n .on(\"mouseenter\", (event) => {\n this.tooltip.mouseOverBucket = true;\n this.highlightCard(event);\n })\n .on(\"mouseleave\", (event) => {\n this.tooltip.mouseOverBucket = false;\n this.resetCardHighLight(event);\n });\n\n this._renderAnnotations();\n\n this.ctrl.events.emit(renderComplete, {\n \"chartWidth\": this.chartWidth\n });\n }\n\n highlightCard(event) {\n const color = d3.select(event.target).style(\"fill\");\n const highlightColor = d3.color(color).darker(2);\n const strokeColor = d3.color(color).brighter(4);\n const current_card = d3.select(event.target);\n this.tooltip.originalFillColor = color;\n current_card\n .style(\"fill\", highlightColor.toString())\n .style(\"stroke\", strokeColor.toString())\n .style(\"stroke-width\", 1);\n }\n\n resetCardHighLight(event) {\n d3.select(event.target)\n .style(\"fill\", this.tooltip.originalFillColor)\n .style(\"stroke\", this.tooltip.originalFillColor)\n .style(\"stroke-width\", 0);\n }\n\n getColorScale(maxValue, minValue = 0) {\n let colorScheme = _.find(this.ctrl.colorSchemes, {value: this.panel.color.colorScheme});\n let colorInterpolator = d3ScaleChromatic[colorScheme.value];\n let colorScaleInverted = colorScheme.invert === 'always' ||\n (colorScheme.invert === 'dark' && !contextSrv.user.lightTheme);\n\n if (maxValue == minValue)\n maxValue = minValue + 1;\n\n let start = colorScaleInverted ? maxValue : minValue;\n let end = colorScaleInverted ? minValue : maxValue;\n\n return d3.scaleSequential(colorInterpolator).domain([start, end]);\n }\n\n setOpacityScale(maxValue) {\n if (this.panel.color.colorScale === 'linear') {\n this.opacityScale = d3.scaleLinear()\n .domain([0, maxValue])\n .range([0, 1]);\n } else if (this.panel.color.colorScale === 'sqrt') {\n this.opacityScale = d3.scalePow().exponent(this.panel.color.exponent)\n .domain([0, maxValue])\n .range([0, 1]);\n }\n }\n\n getCardX(b: Bucket) {\n let x;\n // cx is the center of the card. Card should be placed to the left.\n //let cx = this.xScale(d.x);\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n\n if (cx - this.cardWidth/2 < 0) {\n x = this.yAxisWidth + this.cardHSpacing/2;\n } else {\n x = this.yAxisWidth + cx - this.cardWidth/2;\n }\n\n return x;\n }\n\n // xScale returns card center. Adjust cardWidth in case of overlaping.\n getCardWidth(b: Bucket) {\n //return 20;\n let w;\n\n let rightX = (b.relTo / this.bucketMatrix.rangeMs) * this.chartWidth;\n let cx = rightX - this.cardWidth/2;\n //let cx = this.xScale(d.x);\n\n if (cx < this.cardWidth/2) {\n // Center should not exceed half of card.\n // Cut card to the left to prevent overlay of y axis.\n let cutted_width = (cx - this.cardHSpacing/2) + this.cardWidth/2;\n w = cutted_width > 0 ? cutted_width : 0;\n } else if (this.chartWidth - cx < this.cardWidth/2) {\n // Cut card to the right to prevent overlay of right graph edge.\n w = this.cardWidth/2 + (this.chartWidth - cx - this.cardHSpacing/2);\n } else {\n w = this.cardWidth;\n }\n\n // Card width should be MIN_CARD_SIZE at least\n w = Math.max(w, MIN_CARD_SIZE);\n\n if (this.cardHSpacing == 0) {\n w = w+1;\n }\n\n return w;\n }\n\n // Top y for card.\n // yScale gives ???\n getCardY(b: Bucket) {\n return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n }\n\n getCardHeight(b: Bucket) {\n //return 20;\n let ys = this.yScale(b.yLabel);\n let y = ys + this.chartTop - this.cardHeight - this.cardVSpacing/2;\n let h = this.cardHeight;\n\n // Cut card height to prevent overlay\n if (y < this.chartTop) {\n h = ys - this.cardVSpacing/2;\n } else if (ys > this.chartBottom) {\n h = this.chartBottom - y;\n } else if (y + this.cardHeight > this.chartBottom) {\n h = this.chartBottom - y;\n }\n\n // Height can't be more than chart height\n h = Math.min(h, this.chartHeight);\n // Card height should be MIN_CARD_SIZE at least\n h = Math.max(h, MIN_CARD_SIZE);\n\n if (this.cardVSpacing == 0) {\n h = h+1\n }\n\n return h;\n }\n\n getCardColor(bucket: Bucket) {\n if (this.panel.color.mode === 'opacity') {\n return this.panel.color.cardColor;\n } else if (this.panel.color.mode === 'spectrum') {\n return this.colorScale(bucket.value);\n } else if (this.panel.color.mode === 'discrete') {\n if (this.panel.seriesFilterIndex != null && this.panel.seriesFilterIndex != -1) {\n return this.ctrl.discreteExtraSeries.getBucketColorSingle(bucket.values[this.panel.seriesFilterIndex]);\n } else {\n return this.ctrl.discreteExtraSeries.getBucketColor(bucket.values);\n }\n }\n }\n\n getCardOpacity(bucket: Bucket) {\n if (this.panel.nullPointMode === 'as empty' && bucket.value == null ) {\n return 0;\n }\n if (this.panel.color.mode === 'opacity') {\n return this.opacityScale(bucket.value);\n } else {\n return 1;\n }\n }\n\n getCardStrokeWidth(b: Bucket) {\n if (this.panel.color.mode === 'discrete') {\n return '1';\n }\n return '0';\n }\n\n\n /////////////////////////////\n // Selection and crosshair //\n /////////////////////////////\n\n getEventOffset(event) {\n const elemOffset = this.$heatmap.offset();\n const x = Math.floor(event.clientX - elemOffset.left);\n const y = Math.floor(event.clientY - elemOffset.top);\n return { x, y };\n }\n\n onMouseDown(event) {\n const offset = this.getEventOffset(event);\n this.selection.active = true;\n this.selection.x1 = offset.x;\n\n this.mouseUpHandler = () => {\n this.onMouseUp();\n };\n\n $(document).one(\"mouseup\", this.mouseUpHandler.bind(this));\n }\n\n onMouseUp() {\n $(document).unbind(\"mouseup\", this.mouseUpHandler.bind(this));\n this.mouseUpHandler = null;\n this.selection.active = false;\n\n let selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n let timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n let timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth - this.xGridSize/2);\n\n this.ctrl.timeSrv.setTime({\n from: moment.utc(timeFrom),\n to: moment.utc(timeTo)\n });\n }\n\n this.clearSelection();\n }\n\n onMouseLeave(e) {\n appEvents.emit(CoreEvents.graphHoverClear);\n this.clearCrosshair();\n this.annotationTooltip.destroy();\n }\n\n onMouseMove(event: MouseEvent) {\n if (!this.heatmap) { return; }\n\n const offset = this.getEventOffset(event);\n if (this.selection.active) {\n // Clear crosshair and tooltip\n this.clearCrosshair();\n this.tooltip.destroy();\n this.annotationTooltip.destroy();\n\n this.selection.x2 = this.limitSelection(event.offsetX);\n this.drawSelection(this.selection.x1, this.selection.x2);\n } else {\n //const pos = this.getEventPos(event, offset);\n this.emitGraphHoverEvent(event);\n this.drawCrosshair(offset.x);\n this.tooltip.show(event);\n this.annotationTooltip.show(event);\n }\n }\n\n // TODO emit an event and move logic to panelCtrl\n public onMouseClick(e: MouseEvent) {\n if (this.ctrl.panel.tooltip.freezeOnClick) {\n this.tooltip.showFrozen(e);\n this.tooltip.destroy();\n }\n }\n\n getEventPos(event, offset) {\n const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n const y = this.yScale.invert(offset.y - this.chartTop);\n const pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x,\n x1: x,\n y: y,\n y1: y,\n panelRelY: null,\n offset,\n };\n\n return pos;\n }\n\n emitGraphHoverEvent(event) {\n let x = this.xScale.invert(event.offsetX - this.yAxisWidth - this.xGridSize/2).valueOf();\n let y = this.yScale(event.offsetY);\n let pos = {\n pageX: event.pageX,\n pageY: event.pageY,\n x: x, x1: x,\n y: y, y1: y,\n panelRelY: 0\n };\n\n // Set minimum offset to prevent showing legend from another panel\n pos.panelRelY = Math.max(event.offsetY / this.height, 0.001);\n\n // broadcast to other graph panels that we are hovering\n appEvents.emit(CoreEvents.graphHover, {pos: pos, panel: this.panel});\n }\n\n limitSelection(x2) {\n x2 = Math.max(x2, this.yAxisWidth);\n x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n return x2;\n }\n\n drawSelection(posX1, posX2) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n let selectionX = Math.min(posX1, posX2);\n let selectionWidth = Math.abs(posX1 - posX2);\n\n if (selectionWidth > MIN_SELECTION_WIDTH) {\n this.heatmap.append(\"rect\")\n .attr(\"class\", \"status-heatmap-selection\")\n .attr(\"x\", selectionX)\n .attr(\"width\", selectionWidth)\n .attr(\"y\", this.chartTop)\n .attr(\"height\", this.chartHeight);\n }\n }\n }\n\n clearSelection() {\n this.selection.x1 = -1;\n this.selection.x2 = -1;\n\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-selection\").remove();\n }\n }\n\n\n drawCrosshair(position) {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n\n let posX = position;\n posX = Math.max(posX, this.yAxisWidth);\n posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n this.heatmap.append(\"g\")\n .attr(\"class\", \"status-heatmap-crosshair\")\n .attr(\"transform\", \"translate(\" + posX + \",0)\")\n .append(\"line\")\n .attr(\"x1\", 1)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", 1)\n .attr(\"y2\", this.chartBottom)\n .attr(\"stroke-width\", 1);\n }\n }\n\n // map time to X\n drawSharedCrosshair(pos) {\n if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n const posX = this.xScale(pos.x) + this.yAxisWidth;\n this.drawCrosshair(posX);\n }\n }\n\n clearCrosshair() {\n if (this.heatmap) {\n this.heatmap.selectAll(\".status-heatmap-crosshair\").remove();\n }\n }\n\n render() {\n this.panel = this.ctrl.panel;\n this.timeRange = this.ctrl.range;\n this.bucketMatrix = this.ctrl.bucketMatrix;\n this.bucketMatrixPager = this.ctrl.bucketMatrixPager;\n\n if (!this.bucketMatrix || !this.setElementHeight()) {\n return;\n }\n\n // Draw default axes and return if no data\n this.addStatusmapCanvas();\n if (this.bucketMatrix.noDatapoints) {\n return;\n }\n\n this.addStatusmap();\n this.scope.yAxisWidth = this.yAxisWidth;\n this.scope.xAxisHeight = this.xAxisHeight;\n this.scope.chartHeight = this.chartHeight;\n this.scope.chartWidth = this.chartWidth;\n this.scope.chartTop = this.chartTop;\n }\n\n _renderAnnotations() {\n if (!this.ctrl.annotations || this.ctrl.annotations.length == 0) {\n return;\n }\n\n if (!this.heatmap) {\n return;\n }\n\n\n\n let annoData = _.map(this.ctrl.annotations, (d,i) => ({\"x\": Math.floor(this.yAxisWidth + this.xScale(d.time)), \"id\":i, \"anno\": d.source}));\n\n //({\"ctrl_annotations\": this.ctrl.annotations, \"annoData\": annoData});\n\n let anno = this.heatmap\n .append(\"g\")\n .attr(\"class\", \"statusmap-annotations\")\n .attr(\"transform\", \"translate(0.5,0)\")\n .selectAll(\".statusmap-annotations\")\n .data(annoData)\n .enter().append(\"g\")\n ;\n anno.append(\"line\")\n //.attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"x1\", d => d.x)\n .attr(\"y1\", this.chartTop)\n .attr(\"x2\", d => d.x)\n .attr(\"y2\", this.chartBottom)\n .style(\"stroke\", d => d.anno.iconColor)\n .style(\"stroke-width\", 1)\n .style(\"stroke-dasharray\", \"3,3\")\n ;\n anno.append(\"polygon\")\n .attr(\"points\", d => [[d.x, this.chartBottom+1], [d.x-5, this.chartBottom+6], [d.x+5, this.chartBottom+6]].join(\" \"))\n .style(\"stroke-width\", 0)\n .style(\"fill\", d => d.anno.iconColor)\n ;\n // Polygons didn't fire mouseevents\n anno.append(\"rect\")\n .attr(\"x\", d => d.x-5)\n .attr(\"width\", 10)\n .attr(\"y\", this.chartBottom+1)\n .attr(\"height\", 5)\n .attr(\"class\", \"statusmap-annotation-tick\")\n .attr(\"annoId\", d => d.id)\n .style(\"opacity\", 0)\n ;\n\n let $ticks = this.$heatmap.find(\".statusmap-annotation-tick\");\n $ticks\n .on(\"mouseenter\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = true;\n })\n .on(\"mouseleave\", (event) => {\n this.annotationTooltip.mouseOverAnnotationTick = false;\n });\n }\n}\n\nfunction grafanaTimeFormat(ticks, min, max) {\n if (min && max && ticks) {\n let range = max - min;\n let secPerTick = (range/ticks) / 1000;\n let oneDay = 86400000;\n let oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return \"%H:%M:%S\";\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return \"%H:%M\";\n }\n if (secPerTick <= 80000) {\n return \"%m/%d %H:%M\";\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return \"%m/%d\";\n }\n return \"%Y-%m\";\n }\n\n return \"%H:%M\";\n}\n"],"file":"rendering.js"} \ No newline at end of file diff --git a/dist/statusmap_data.js b/dist/statusmap_data.js index 74292a8..503ecbc 100644 --- a/dist/statusmap_data.js +++ b/dist/statusmap_data.js @@ -3,7 +3,7 @@ System.register([], function (_export, _context) { "use strict"; - var Bucket, BucketMatrix; + var Bucket, BucketMatrix, pagerChanged, BucketMatrixPager; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -98,6 +98,7 @@ System.register([], function (_export, _context) { function () { // buckets for each y label // a flag that indicate that buckets has stub values + // An array of row labels // TODO remove: a transition from CardsData function BucketMatrix() { _classCallCheck(this, BucketMatrix); @@ -155,6 +156,149 @@ System.register([], function (_export, _context) { return BucketMatrix; }()); + + _export("pagerChanged", pagerChanged = { + name: 'statusmap-pager-changed' + }); + + _export("BucketMatrixPager", BucketMatrixPager = + /*#__PURE__*/ + function () { + function BucketMatrixPager() { + _classCallCheck(this, BucketMatrixPager); + + _defineProperty(this, "bucketMatrix", void 0); + + _defineProperty(this, "enable", void 0); + + _defineProperty(this, "defaultPageSize", -1); + + _defineProperty(this, "pageSize", -1); + + _defineProperty(this, "currentPage", 0); + + var m = new BucketMatrix(); + this.bucketMatrix = m; + } // An array of row labels for current page. + + + _createClass(BucketMatrixPager, [{ + key: "targets", + value: function targets() { + if (!this.enable) { + return this.bucketMatrix.targets; + } + + return this.bucketMatrix.targets.slice(this.pageSize * this.currentPage, this.pageSize * (this.currentPage + 1)); + } + }, { + key: "buckets", + value: function buckets() { + if (!this.enable) { + return this.bucketMatrix.buckets; + } + + var buckets = {}; + var me = this; + this.targets().map(function (rowLabel) { + buckets[rowLabel] = me.bucketMatrix.buckets[rowLabel]; + }); + return buckets; + } + }, { + key: "setEnable", + value: function setEnable(enable) { + this.enable = enable; + } + }, { + key: "setCurrent", + value: function setCurrent(num) { + this.currentPage = num; + } + }, { + key: "setDefaultPageSize", + value: function setDefaultPageSize(num) { + this.defaultPageSize = num; + } + }, { + key: "setPageSize", + value: function setPageSize(num) { + this.pageSize = num; + } + }, { + key: "pages", + value: function pages() { + return Math.ceil(this.totalRows() / this.pageSize); + } + }, { + key: "totalRows", + value: function totalRows() { + return this.bucketMatrix.targets.length; + } + }, { + key: "pageStartRow", + value: function pageStartRow() { + if (!this.enable) { + return 1; + } + + return this.pageSize * this.currentPage + 1; + } + }, { + key: "pageEndRow", + value: function pageEndRow() { + if (!this.enable) { + return this.totalRows(); + } + + var last = this.pageSize * (this.currentPage + 1); + + if (last > this.totalRows()) { + return this.totalRows(); + } + + return last; + } + }, { + key: "hasNext", + value: function hasNext() { + if (!this.enable) { + return false; + } + + if ((this.currentPage + 1) * this.pageSize >= this.totalRows()) { + return false; + } + + return true; // currentPage >= ctrl.bucketMatrix.targets.length/ctrl.pageSizeViewer - 1 || ctrl.numberOfPages == 0 + } + }, { + key: "hasPrev", + value: function hasPrev() { + if (!this.enable) { + return false; + } + + return this.currentPage > 0; + } + }, { + key: "switchToNext", + value: function switchToNext() { + if (this.hasNext()) { + this.currentPage = this.currentPage + 1; + } + } + }, { + key: "switchToPrev", + value: function switchToPrev() { + if (this.hasPrev()) { + this.currentPage = this.currentPage - 1; + } + } + }]); + + return BucketMatrixPager; + }()); } }; }); diff --git a/dist/statusmap_data.js.map b/dist/statusmap_data.js.map index 3a1c7db..8d1f35f 100644 --- a/dist/statusmap_data.js.map +++ b/dist/statusmap_data.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/statusmap_data.ts"],"names":["Bucket","ts","from","to","value","values","push","length","BucketMatrix","yid","xid","buckets","hasData","targets","map","target"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;wBACMA,M;;;AACJ;AAEA;AAEqB;AACrB;AAEA;AAEA;AAGA;AAGA;AAGA;AAMA;AAGA;AAGA,0BAAc;AAAA;;AAAA,sCA7BD,CA6BC;;AAAA,0CA3BE,EA2BF;;AAAA,2CA1BG,EA0BH;;AAAA,kDAxBY,KAwBZ;;AAAA,kDAtBY,KAsBZ;;AAAA,qCApBF,EAoBE;;AAAA,0CAnBG,EAmBH;;AAAA,qCAjBF,CAiBE;;AAAA,uCAhBA,CAgBA;;AAAA,wCAdC,CAcD;;AAAA,sCAbD,CAaC;;AAAA,2CAXI,CAWJ;;AAAA,yCAVE,CAUF;;AAAA,8CARQ,KAQR;;AAAA,4CALK,CAKL;;AAAA,4CAJK,CAIL;;AAAA,yCAFE,CAEF;AACb;;;;iCAEMC,E,EAAqB;AAC1B,mBAAOA,EAAE,IAAI,KAAKC,IAAX,IAAmBD,EAAE,IAAI,KAAKE,EAArC;AACD;;;8BAEGC,K,EAAY;AACd,iBAAKC,MAAL,CAAYC,IAAZ,CAAiBF,KAAjB;AACD;;;iCAEM,CACL;AACD;;;oCAEkB;AACjB,mBAAO,KAAKC,MAAL,CAAYE,MAAZ,IAAsB,CAA7B;AACD;;;;;;8BAKGC,Y;;;AACJ;AAMA;AAOyB;AAEzB,gCAAc;AAAA;;AAAA,2CAd0B,EAc1B;;AAAA,4CAbK,CAaL;;AAAA,4CAZK,CAYL;;AAAA,kDAXY,KAWZ;;AAAA,kDAVY,KAUZ;;AAAA,gDARU,KAQV;;AAAA,2CANM,EAMN;;AAAA,2CALI,CAKJ;;AAAA,8CAJO,CAIP;;AAAA,+CAFQ,CAER;AACb;;;;8BAEGC,G,EAAaC,G,EAAqB;AACpC,gBAAID,GAAG,IAAI,KAAKE,OAAhB,EAAyB;AACvB,kBAAID,GAAG,IAAI,KAAKC,OAAL,CAAaF,GAAb,CAAX,EAA8B;AAC5B,uBAAO,KAAKE,OAAL,CAAaF,GAAb,EAAkBC,GAAlB,CAAP;AACD;AACF;;AACD,mBAAO,IAAIV,MAAJ,EAAP;AACD;;;oCAEkB;AAAA;;AACjB,gBAAIY,OAAO,GAAG,KAAd;;AACA,gBAAI,KAAKC,OAAL,CAAaN,MAAb,GAAsB,CAA1B,EAA6B;AAC3B,mBAAKM,OAAL,CAAaC,GAAb,CAAiB,UAACC,MAAD,EAAmB;AAClC,oBAAI,KAAI,CAACJ,OAAL,CAAaI,MAAb,EAAqBR,MAArB,GAA8B,CAAlC,EAAqC;AACnCK,kBAAAA,OAAO,GAAG,IAAV;AACD;AACF,eAJD;AAKD;;AACD,mBAAOA,OAAP;AACD","sourcesContent":["// A holder of a group of values\nclass Bucket {\n // uniq id\n id: number = 0;\n // Array of values in this bucket\n values: any[] = [];\n columns: any[] = []; // From pr/86\n // a bucket has multiple values\n multipleValues: boolean = false;\n // a bucket has values that has no mapped color\n noColorDefined: boolean = false;\n // y label\n y: string = \"\";\n yLabel: string = \"\";\n // This value can be used to calculate a x coordinate on a graph\n x: number = 0;\n xid: number = 0;\n // a time range of this bucket\n from: number = 0;\n to: number = 0;\n // to and from relative to real \"from\"\n relFrom: number = 0;\n relTo: number = 0;\n\n mostRecent: boolean = false;\n\n // Saved minimum and maximum of values in this bucket\n minValue: number = 0;\n maxValue: number = 0;\n // A value if multiple values is not allowed\n value: number = 0;\n\n constructor() {\n }\n\n belong(ts: number): boolean {\n return ts >= this.from && ts <= this.to;\n }\n\n put(value: any) {\n this.values.push(value);\n }\n\n done() {\n // calculate min, max, value\n }\n\n isEmpty(): boolean {\n return this.values.length == 0;\n }\n\n}\n\n\nclass BucketMatrix {\n // buckets for each y label\n buckets: {[yLabel: string]: Bucket[]} = {};\n maxValue: number = 0;\n minValue: number = 0;\n multipleValues: boolean = false;\n noColorDefined: boolean = false;\n // a flag that indicate that buckets has stub values\n noDatapoints: boolean = false;\n\n targets: string[] = [];\n rangeMs: number = 0;\n intervalMs: number = 0;\n\n xBucketSize: number = 0; // TODO remove: a transition from CardsData\n\n constructor() {\n }\n\n get(yid: string, xid: number): Bucket {\n if (yid in this.buckets) {\n if (xid in this.buckets[yid]) {\n return this.buckets[yid][xid];\n }\n }\n return new Bucket();\n }\n\n hasData(): boolean {\n let hasData = false;\n if (this.targets.length > 0) {\n this.targets.map((target:string) => {\n if (this.buckets[target].length > 0) {\n hasData = true;\n }\n });\n }\n return hasData;\n }\n}\n\nexport {Bucket, BucketMatrix };"],"file":"statusmap_data.js"} \ No newline at end of file +{"version":3,"sources":["../src/statusmap_data.ts"],"names":["Bucket","ts","from","to","value","values","push","length","BucketMatrix","yid","xid","buckets","hasData","targets","map","target","pagerChanged","name","BucketMatrixPager","m","bucketMatrix","enable","slice","pageSize","currentPage","me","rowLabel","num","defaultPageSize","Math","ceil","totalRows","last","hasNext","hasPrev"],"mappings":"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","sourcesContent":["// A holder of a group of values\nclass Bucket {\n // uniq id\n id: number = 0;\n // Array of values in this bucket\n values: any[] = [];\n columns: any[] = []; // From pr/86\n // a bucket has multiple values\n multipleValues: boolean = false;\n // a bucket has values that has no mapped color\n noColorDefined: boolean = false;\n // y label\n y: string = \"\";\n yLabel: string = \"\";\n // This value can be used to calculate a x coordinate on a graph\n x: number = 0;\n xid: number = 0;\n // a time range of this bucket\n from: number = 0;\n to: number = 0;\n // to and from relative to real \"from\"\n relFrom: number = 0;\n relTo: number = 0;\n\n mostRecent: boolean = false;\n\n // Saved minimum and maximum of values in this bucket\n minValue: number = 0;\n maxValue: number = 0;\n // A value if multiple values is not allowed\n value: number = 0;\n\n constructor() {\n }\n\n belong(ts: number): boolean {\n return ts >= this.from && ts <= this.to;\n }\n\n put(value: any) {\n this.values.push(value);\n }\n\n done() {\n // calculate min, max, value\n }\n\n isEmpty(): boolean {\n return this.values.length == 0;\n }\n\n}\n\n\nclass BucketMatrix {\n // buckets for each y label\n buckets: {[yLabel: string]: Bucket[]} = {};\n maxValue: number = 0;\n minValue: number = 0;\n multipleValues: boolean = false;\n noColorDefined: boolean = false;\n // a flag that indicate that buckets has stub values\n noDatapoints: boolean = false;\n\n // An array of row labels\n targets: string[] = [];\n rangeMs: number = 0;\n intervalMs: number = 0;\n\n xBucketSize: number = 0; // TODO remove: a transition from CardsData\n\n constructor() {\n }\n\n get(yid: string, xid: number): Bucket {\n if (yid in this.buckets) {\n if (xid in this.buckets[yid]) {\n return this.buckets[yid][xid];\n }\n }\n return new Bucket();\n }\n\n hasData(): boolean {\n let hasData = false;\n if (this.targets.length > 0) {\n this.targets.map((target:string) => {\n if (this.buckets[target].length > 0) {\n hasData = true;\n }\n });\n }\n return hasData;\n }\n}\n\nexport var pagerChanged:any = {name:'statusmap-pager-changed'};\n\nclass BucketMatrixPager {\n bucketMatrix: BucketMatrix;\n enable: boolean;\n defaultPageSize: number = -1;\n pageSize: number = -1;\n currentPage: number = 0;\n\n constructor() {\n let m = new BucketMatrix();\n\n this.bucketMatrix = m;\n }\n\n // An array of row labels for current page.\n targets(): string[] {\n if (!this.enable) {\n return this.bucketMatrix.targets;\n }\n\n return this.bucketMatrix.targets.slice(this.pageSize * this.currentPage, this.pageSize * (this.currentPage+1) );\n }\n\n buckets(): {[yLabel: string]: Bucket[]} {\n if (!this.enable) {\n return this.bucketMatrix.buckets;\n }\n\n let buckets: {[yLabel: string]: Bucket[]} = {}\n let me = this;\n\n this.targets().map(function (rowLabel) {\n buckets[rowLabel] = me.bucketMatrix.buckets[rowLabel];\n })\n\n return buckets;\n }\n\n setEnable(enable: boolean) {\n this.enable = enable;\n }\n\n setCurrent(num: number): void {\n this.currentPage = num;\n }\n\n setDefaultPageSize(num: number): void {\n this.defaultPageSize = num;\n }\n\n setPageSize(num: number): void {\n this.pageSize = num;\n }\n\n pages(): number {\n return Math.ceil(this.totalRows() / this.pageSize);\n }\n\n totalRows(): number {\n return this.bucketMatrix.targets.length;\n }\n\n pageStartRow(): number {\n if (!this.enable) {\n return 1;\n }\n return (this.pageSize * this.currentPage) + 1;\n }\n\n pageEndRow(): number {\n if (!this.enable) {\n return this.totalRows();\n }\n\n let last = this.pageSize * (this.currentPage+1);\n if (last > this.totalRows()) {\n return this.totalRows();\n }\n\n return last;\n }\n\n hasNext(): boolean {\n if (!this.enable) {\n return false;\n }\n\n if ((this.currentPage+1)*this.pageSize >= this.totalRows()) {\n return false;\n }\n\n return true;\n // currentPage >= ctrl.bucketMatrix.targets.length/ctrl.pageSizeViewer - 1 || ctrl.numberOfPages == 0\n }\n\n hasPrev(): boolean {\n if (!this.enable) {\n return false;\n }\n\n return this.currentPage > 0;\n }\n\n switchToNext() {\n if (this.hasNext()) {\n this.currentPage = this.currentPage + 1;\n }\n }\n\n switchToPrev() {\n if (this.hasPrev()) {\n this.currentPage = this.currentPage - 1;\n }\n }\n\n}\n\nexport {Bucket, BucketMatrix, BucketMatrixPager };"],"file":"statusmap_data.js"} \ No newline at end of file diff --git a/dist/tooltipextraseries.js b/dist/tooltipextraseries.js deleted file mode 100644 index 7378e7f..0000000 --- a/dist/tooltipextraseries.js +++ /dev/null @@ -1,248 +0,0 @@ -"use strict"; - -System.register(["d3", "lodash", "jquery", "./extra_series_format"], function (_export, _context) { - "use strict"; - - var d3, _, $, ExtraSeriesFormatValue, TOOLTIP_PADDING_X, TOOLTIP_PADDING_Y, StatusHeatmapTooltipExtraSeries; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - - function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - - return { - setters: [function (_d) { - d3 = _d.default; - }, function (_lodash) { - _ = _lodash.default; - }, function (_jquery) { - $ = _jquery.default; - }, function (_extra_series_format) { - ExtraSeriesFormatValue = _extra_series_format.ExtraSeriesFormatValue; - }], - execute: function () { - TOOLTIP_PADDING_X = -50; - TOOLTIP_PADDING_Y = 5; - - _export("StatusHeatmapTooltipExtraSeries", StatusHeatmapTooltipExtraSeries = - /*#__PURE__*/ - function () { - function StatusHeatmapTooltipExtraSeries(elem, scope) { - _classCallCheck(this, StatusHeatmapTooltipExtraSeries); - - _defineProperty(this, "scope", void 0); - - _defineProperty(this, "dashboard", void 0); - - _defineProperty(this, "panelCtrl", void 0); - - _defineProperty(this, "panel", void 0); - - _defineProperty(this, "heatmapPanel", void 0); - - _defineProperty(this, "mouseOverBucket", void 0); - - _defineProperty(this, "originalFillColor", void 0); - - _defineProperty(this, "tooltip", void 0); - - this.scope = scope; - this.dashboard = scope.ctrl.dashboard; - this.panelCtrl = scope.ctrl; - this.panel = scope.ctrl.panel; - this.heatmapPanel = elem; - this.mouseOverBucket = false; - this.originalFillColor = null; - elem.on("mouseover", this.onMouseOver.bind(this)); - elem.on("click", this.onMouseClick.bind(this)); - } - - _createClass(StatusHeatmapTooltipExtraSeries, [{ - key: "onMouseOver", - value: function onMouseOver(e) { - if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { - return; - } - } - }, { - key: "onMouseClick", - value: function onMouseClick(e) { - if (!this.panel.usingUrl) { - return; - } - - this.destroy(); - this.add(); - } - }, { - key: "add", - value: function add() { - this.tooltip = d3.select("body").append("div").attr("class", "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip"); - } - }, { - key: "destroy", - value: function destroy() { - if (this.tooltip) { - this.tooltip.remove(); - } - - this.tooltip = null; - } - }, { - key: "show", - value: function show(pos) { - if (!this.panel.usingUrl || !this.tooltip) { - return; - } // shared tooltip mode - - - if (pos.panelRelY) { - return; - } - - var cardId = d3.select(pos.target).attr('cardId'); - - if (!cardId) { - this.destroy(); - return; - } - - var card; - - if (this.panel.usingPagination) { - card = this.panelCtrl.cardsDataComplete[cardId]; - } else { - card = this.panelCtrl.cardsData.cards[cardId]; - } - - if (!card) { - this.destroy(); - return; - } - - if (card.value == null) { - this.destroy(); - return; - } - - var x = card.x; - var y = card.y; - var value = card.value; - var values = card.values; - var tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss'; - var time = this.dashboard.formatDate(+x, tooltipTimeFormat); - var tooltipHtml = "
".concat(time, "
"); - - if (this.panel.color.mode === 'discrete') { - var statuses = ""; - - if (this.panelCtrl.panel.seriesFilterIndex == -1) { - statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); - } else { - statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); - } - - tooltipHtml += "\n
\n name: ".concat(y, "\n
\n
\n status:\n
    \n ").concat(_.join(_.map(statuses, function (v) { - return "

    ").concat(v.tooltip, "

    "); - }), ""), "\n
\n
\n

"); - } - - tooltipHtml += "
"; - var urls = this.panelCtrl.panel.urls; - var rtime = this.panelCtrl.retrieveTimeVar(); - var curl = JSON.parse(JSON.stringify(urls)); - - for (var i = 0; i < curl.length; i++) { - //Change name var - curl[i].base_url = _.replace(curl[i].base_url, /\$series_label/g, y); //Set up extra series - - if (curl[i].useExtraSeries == true) { - var tf = curl[i].extraSeries.format; - var vh = card.values[curl[i].extraSeries.index]; //let extraSeries: any = this.dashboard.formatDate(+vh, tf) - - var series_extra = this.formatExtraSeries(vh, tf); - curl[i].base_url = _.replace(curl[i].base_url, /\$series_extra/g, series_extra); - } //Change time var - - - curl[i].base_url = _.replace(curl[i].base_url, /\$time/g, rtime); //Replace vars - - curl[i].base_url = this.panelCtrl.renderLink(curl[i].base_url, this.panelCtrl.variableSrv.variables); - } - - if (this.panelCtrl.panel.usingUrl == true) { - tooltipHtml += "\n
\n ".concat(_.join(_.map(curl, function (v) { - return "
\n
"); - }), ""), "\n

"); - } // "Ambiguous bucket state: Multiple values!"; - - - if (!this.panel.useMax && card.multipleValues) { - tooltipHtml += "
Error: ".concat(this.panelCtrl.dataWarnings.multipleValues.title, "
"); - } // Discrete mode errors - - - if (this.panel.color.mode === 'discrete') { - if (card.noColorDefined) { - var badValues = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); - tooltipHtml += "
Error: ".concat(this.panelCtrl.dataWarnings.noColorDefined.title, "\n
not colored values:\n
    \n ").concat(_.join(_.map(badValues, function (v) { - return "
  • ".concat(v, "
  • "); - }), ""), "\n
\n
"); - } - } - - this.tooltip.html(tooltipHtml); - this.move(pos); - } - }, { - key: "formatExtraSeries", - value: function formatExtraSeries(value, type) { - var extraSeries = ''; - - switch (type) { - case ExtraSeriesFormatValue.Date: - extraSeries = this.dashboard.formatDate(+value, type); - return extraSeries; - - case ExtraSeriesFormatValue.Raw: - extraSeries = value; - return extraSeries; - - default: - return extraSeries; - } - } - }, { - key: "move", - value: function move(pos) { - if (!this.tooltip) { - return; - } - - var elem = $(this.tooltip.node())[0]; - var tooltipWidth = elem.clientWidth; - var tooltipHeight = elem.clientHeight; - var left = pos.pageX + TOOLTIP_PADDING_X; - var top = pos.pageY + TOOLTIP_PADDING_Y; - - if (pos.pageX + tooltipWidth + 40 > window.innerWidth) { - left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X; - } - - if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) { - top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; - } - - return this.tooltip.style("left", left + "px").style("top", top + "px"); - } - }]); - - return StatusHeatmapTooltipExtraSeries; - }()); - } - }; -}); -//# sourceMappingURL=tooltipextraseries.js.map diff --git a/dist/tooltipextraseries.js.map b/dist/tooltipextraseries.js.map deleted file mode 100644 index b005126..0000000 --- a/dist/tooltipextraseries.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/tooltipextraseries.ts"],"names":["d3","_","$","ExtraSeriesFormatValue","TOOLTIP_PADDING_X","TOOLTIP_PADDING_Y","StatusHeatmapTooltipExtraSeries","elem","scope","dashboard","ctrl","panelCtrl","panel","heatmapPanel","mouseOverBucket","originalFillColor","on","onMouseOver","bind","onMouseClick","e","usingUrl","data","isEmpty","destroy","add","tooltip","select","append","attr","remove","pos","panelRelY","cardId","target","card","usingPagination","cardsDataComplete","cardsData","cards","value","x","y","values","tooltipTimeFormat","time","formatDate","tooltipHtml","color","mode","statuses","seriesFilterIndex","discreteExtraSeries","convertValuesToTooltips","convertValueToTooltips","join","map","v","urls","rtime","retrieveTimeVar","curl","JSON","parse","stringify","i","length","base_url","replace","useExtraSeries","tf","extraSeries","format","vh","index","series_extra","formatExtraSeries","renderLink","variableSrv","variables","forcelowercase","toLowerCase","label","truncate","icon_fa","useMax","multipleValues","dataWarnings","title","noColorDefined","badValues","getNotColoredValues","html","move","type","Date","Raw","node","tooltipWidth","clientWidth","tooltipHeight","clientHeight","left","pageX","top","pageY","window","innerWidth","pageYOffset","innerHeight","style"],"mappings":"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","sourcesContent":["import d3 from 'd3';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport { ExtraSeriesFormatValue } from './extra_series_format';\n\nconst TOOLTIP_PADDING_X = -50;\nconst TOOLTIP_PADDING_Y = 5;\n\nexport class StatusHeatmapTooltipExtraSeries {\n scope: any;\n dashboard: any;\n panelCtrl: any;\n panel: any;\n heatmapPanel: any;\n mouseOverBucket: any;\n originalFillColor: any;\n tooltip: any;\n\n constructor(elem: any, scope: any) {\n this.scope = scope;\n this.dashboard = scope.ctrl.dashboard;\n this.panelCtrl = scope.ctrl;\n this.panel = scope.ctrl.panel;\n this.heatmapPanel = elem;\n this.mouseOverBucket = false;\n this.originalFillColor = null;\n \n elem.on(\"mouseover\", this.onMouseOver.bind(this));\n elem.on(\"click\", this.onMouseClick.bind(this));\n }\n\n public onMouseOver(e: Event) {\n if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { \n return; \n }\n }\n\n public onMouseClick(e: Event) {\n if (!this.panel.usingUrl) { \n return; \n }\n\n this.destroy();\n this.add();\n }\n\n public add() {\n this.tooltip = d3.select(\"body\")\n .append(\"div\")\n .attr(\"class\", \"statusmap-tooltip-extraseries graph-tooltip grafana-tooltip\");\n }\n\n public destroy() {\n if (this.tooltip) {\n this.tooltip.remove();\n }\n \n this.tooltip = null;\n }\n\n public show(pos: any) {\n if (!this.panel.usingUrl || !this.tooltip) { \n return; \n }\n\n // shared tooltip mode\n if (pos.panelRelY) {\n return;\n }\n\n let cardId: any = d3.select(pos.target).attr('cardId');\n \n if (!cardId) {\n this.destroy();\n \n return;\n }\n \n let card: any;\n\n if (this.panel.usingPagination) {\n card = this.panelCtrl.cardsDataComplete[cardId];\n } else {\n card = this.panelCtrl.cardsData.cards[cardId];\n }\n \n if (!card) {\n this.destroy();\n \n return;\n } \n \n if (card.value == null) {\n this.destroy();\n \n return;\n }\n \n let x: any = card.x;\n let y: any = card.y;\n let value: any = card.value;\n let values: any = card.values;\n let tooltipTimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n let time: Date = this.dashboard.formatDate(+x, tooltipTimeFormat);\n \n let tooltipHtml: string = `
${time}
` \n \n if (this.panel.color.mode === 'discrete') {\n let statuses: any = \"\";\n \n if (this.panelCtrl.panel.seriesFilterIndex == -1) {\n statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values);\n } else {\n statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value);\n }\n \n tooltipHtml += `\n
\n name: ${y}\n
\n
\n status:\n
    \n ${_.join(_.map(statuses, v => `

    ${v.tooltip}

    `), \"\")}\n
\n
\n

`;\n }\n \n tooltipHtml += `
`;\n \n let urls: any = this.panelCtrl.panel.urls\n let rtime: any = this.panelCtrl.retrieveTimeVar(); \n\n let curl: any = JSON.parse(JSON.stringify(urls));\n\n for (let i = 0; i < curl.length; i++) {\n //Change name var\n curl[i].base_url = _.replace(curl[i].base_url, /\\$series_label/g, y)\n //Set up extra series\n if (curl[i].useExtraSeries == true) {\n let tf: any = curl[i].extraSeries.format\n let vh: any = card.values[curl[i].extraSeries.index]\n //let extraSeries: any = this.dashboard.formatDate(+vh, tf)\n let series_extra: any = this.formatExtraSeries(vh,tf);\n\n curl[i].base_url = _.replace(curl[i].base_url, /\\$series_extra/g, series_extra)\n }\n //Change time var\n curl[i].base_url = _.replace(curl[i].base_url, /\\$time/g, rtime)\n \n //Replace vars\n curl[i].base_url = this.panelCtrl.renderLink(curl[i].base_url, this.panelCtrl.variableSrv.variables)\n }\n \n if (this.panelCtrl.panel.usingUrl == true) {\n tooltipHtml += `\n
\n ${_.join(_.map(curl, v => `
\n
`), \"\")}\n

`;\n }\n\n // \"Ambiguous bucket state: Multiple values!\";\n if (!this.panel.useMax && card.multipleValues) {\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
`;\n }\n\n // Discrete mode errors\n if (this.panel.color.mode === 'discrete') {\n if (card.noColorDefined) {\n let badValues: any = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values);\n tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title}\n
not colored values:\n
    \n ${_.join(_.map(badValues, v => `
  • ${v}
  • `), \"\")}\n
\n
`;\n }\n }\n\n this.tooltip.html(tooltipHtml);\n\n this.move(pos);\n }\n\n public formatExtraSeries (value: any, type: any) {\n let extraSeries: any = '';\n\n switch(type) {\n case ExtraSeriesFormatValue.Date:\n extraSeries = this.dashboard.formatDate(+value, type);\n return extraSeries;\n case ExtraSeriesFormatValue.Raw:\n extraSeries = value;\n return extraSeries;\n default:\n return extraSeries;\n }\n }\n\n public move(pos: any) {\n if (!this.tooltip) { \n return; \n }\n\n let elem: any = $(this.tooltip.node())[0];\n let tooltipWidth = elem.clientWidth;\n let tooltipHeight = elem.clientHeight;\n\n let left = pos.pageX + TOOLTIP_PADDING_X;\n let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n }\n \n if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n }\n\n return this.tooltip\n .style(\"left\", left + \"px\")\n .style(\"top\", top + \"px\");\n }\n}"],"file":"tooltipextraseries.js"} \ No newline at end of file diff --git a/src/css/_statusmap.scss b/src/css/_statusmap.scss index 6e991ae..0c9be82 100644 --- a/src/css/_statusmap.scss +++ b/src/css/_statusmap.scss @@ -102,6 +102,20 @@ width: 70.0rem!important } +.statusmap-pagination { + // space between legend and pagination controls + margin-top: 5px; + label { + margin-right:0px; + } + input { + margin-right: 0px; + } + .last-in-group { + margin-right: 4px; + } +} + .pagination-buttons{text-align: right;} .status-heatmap-legend-wrapper { diff --git a/src/extra_series_format.ts b/src/extra_series_format.ts deleted file mode 100644 index 4d6dea3..0000000 --- a/src/extra_series_format.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum ExtraSeriesFormat { - Date = 'Date', - Raw = 'Raw', -} - -export enum ExtraSeriesFormatValue { - Date = 'YYYY/MM/DD/HH_mm_ss', - Raw = '', -} \ No newline at end of file diff --git a/src/img/tooltip-editor.png b/src/img/tooltip-editor.png index b4410a8..97a26d8 100644 Binary files a/src/img/tooltip-editor.png and b/src/img/tooltip-editor.png differ diff --git a/src/img/tooltip-url.png b/src/img/tooltip-url.png index 6966228..cb65c49 100644 Binary files a/src/img/tooltip-url.png and b/src/img/tooltip-url.png differ diff --git a/src/module.html b/src/module.html index 1ceaddb..2863c19 100644 --- a/src/module.html +++ b/src/module.html @@ -1,37 +1,37 @@
-
-
-
- - -
-
-
{{ctrl.dataWarnings.multipleValues.title}} {{ctrl.dataWarnings.noColorDefined.title}} {{ctrl.dataWarnings.noDatapoints.title}}
+
+
-
+
+
- -
- + +
+ + +
+
diff --git a/src/module.ts b/src/module.ts index 028731e..a5f9b1f 100644 --- a/src/module.ts +++ b/src/module.ts @@ -16,7 +16,7 @@ import {loadPluginCss} from 'app/plugins/sdk'; import { MetricsPanelCtrl } from 'app/plugins/sdk'; import { AnnotationsSrv } from 'app/features/annotations/annotations_srv'; import { CoreEvents, PanelEvents } from './libs/grafana/events/index'; -import { Bucket, BucketMatrix } from './statusmap_data'; +import {Bucket, BucketMatrix, BucketMatrixPager } from './statusmap_data'; import rendering from './rendering'; import { Polygrafill } from './libs/polygrafill/index'; @@ -70,6 +70,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { data: any; bucketMatrix: BucketMatrix; + bucketMatrixPager: BucketMatrixPager; graph: any; discreteHelper: ColorModeDiscrete; @@ -78,10 +79,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { colorSchemes: any = []; unitFormats: any; - cardsDataComplete: any; - cardsDataLabelsComplete: any; - ticksWhenPaginating: []; - dataWarnings: {[warningId: string]: {title: string, tip: string}} = {}; multipleValues: boolean; noColorDefined: boolean; @@ -92,12 +89,8 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { annotations: object[] = []; annotationsPromise: any; + // TODO remove this transient variable: use ng-model-options="{ getterSetter: true }" pageSizeViewer: number = 15; - currentPage: number = 0; - numberOfPages: number = 1; - totalElements: number = 0; - firstPageElement: number = 1; - lastPageElement: number = 5; panelDefaults: any = { // datasource name, null = default datasource @@ -144,10 +137,10 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { useMax: true, seriesFilterIndex: -1, + + // Pagination options usingPagination: false, - pageSize: 15, - allowAllElements: false, - availableValues: [] + pageSize: 15 }; /** @ngInject */ @@ -163,10 +156,14 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { migratePanelConfig(this.panel); _.defaultsDeep(this.panel, this.panelDefaults); - if (this.panel.usingPagination) { - this.setPaginationSize(this.panel.pageSize); - this.setCurrentPage(0); - } + this.bucketMatrix = new BucketMatrix(); + + // Create pager for bucketMatrix and restore page size. + this.bucketMatrixPager = new BucketMatrixPager(); + this.bucketMatrixPager.setEnable(this.panel.usingPagination); + this.bucketMatrixPager.setDefaultPageSize(this.panel.pageSize); + this.bucketMatrixPager.setPageSize(this.panel.pageSize); + $scope.pager = this.bucketMatrixPager; this.opacityScales = opacityScales; this.colorModes = colorModes; @@ -220,66 +217,35 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { } changeDefaultPaginationSize(defaultPageSize: number): void { + this.bucketMatrixPager.setDefaultPageSize(defaultPageSize); + this.bucketMatrixPager.setPageSize(defaultPageSize); this.pageSizeViewer = defaultPageSize; this.render(); this.refresh(); } - changePaginationSize(): void { + onChangePageSize(): void { if (this.pageSizeViewer <= 0) { - this.pageSizeViewer = 1; + this.pageSizeViewer = this.bucketMatrixPager.defaultPageSize; } - - this.currentPage = 0; + this.bucketMatrixPager.setPageSize(this.pageSizeViewer); + this.bucketMatrixPager.setCurrent(0); this.render(); this.refresh(); } - getPaginationSize(): number { - return this.pageSizeViewer; - } - - setPaginationSize(pageSize: number): void { - this.pageSizeViewer = pageSize; - } - - getCurrentPage(): number { - return this.currentPage; - } - - setCurrentPage(currentPage: number): void { - this.currentPage = currentPage; - } - - getNumberOfPages(): number { - return this.numberOfPages; - } - - getTotalElements(): number { - return this.totalElements; - } - - setTotalElements(totalElements: number): void { - this.totalElements = totalElements; - } - - getFirstPageElement(): number { - return this.firstPageElement; - } - - setFirstPageElement(firstPageElement: number): void { - this.firstPageElement = firstPageElement; + onPrevPage(): void { + this.bucketMatrixPager.switchToPrev(); + this.render(); } - getLastPageElement(): number { - return this.lastPageElement; + onNextPage(): void { + this.bucketMatrixPager.switchToNext(); + this.render(); } - setLastPageElement(lastPageElement: number): void { - this.lastPageElement = lastPageElement; - } // getChartWidth returns an approximation of chart canvas width or // a saved value calculated during a render. @@ -402,16 +368,17 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { if (!this.intervalMs) { this.calculateInterval(); } - this.bucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true); - this.noDatapoints = this.bucketMatrix.noDatapoints; - if (this.panel.usingPagination && this.cardsData.targets) { - this.numberOfPages = Math.ceil(this.cardsData.targets.length/this.pageSizeViewer); - this.totalElements = this.cardsData.targets.length; - } else { - this.setPaginationSize(this.cardsData.targets.length); + let newBucketMatrix = this.convertDataToBuckets(dataList, this.range.from.valueOf(), this.range.to.valueOf(), this.intervalMs, true); + + this.bucketMatrix = newBucketMatrix; + this.bucketMatrixPager.bucketMatrix = newBucketMatrix; + if (newBucketMatrix.targets.length !== this.bucketMatrix.targets.length) { + this.bucketMatrixPager.setCurrent(0); } + this.noDatapoints = this.bucketMatrix.noDatapoints; + if (this.annotationsPromise) { this.annotationsPromise.then( (result: { alertState: any; annotations: any }) => { @@ -427,7 +394,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { () => { this.loading = false; this.annotations = []; - this.render(); // this.render(this.data);??? + this.render(); } ); } else { @@ -443,10 +410,6 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.unitFormats = kbn.getUnitFormats(); } - paginate() { - this.refresh(); - } - // onRender will be called before StatusmapRenderer.onRender. // Decide if warning should be displayed over cards. onRender() { diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index f311b21..65e107c 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -216,119 +216,18 @@
Buckets
-
-
Filtering
-
- - -
-
-
-
Pagination options
+
Pagination
- +
- - Rows per page +
-
-
URL
- -
- Insert the url to navigate
-
- -
- -
- -
-
-
-
-
- -
-
- -
-
- -
-
- - - - - - - -

Specify an URL (relative or absolute)

- - Use special variables to specify cell values: -
- $series_label name of the serie -
- $(template.name) name of the templated to be replaced -
- $time append &from...&to on the URL -
- $series_extra use extraSeries value to use it on URL -
-
-
-
- - - - - - -
- - - - -
- -
- -
- - -
-
-
-
-
- -
diff --git a/src/rendering.ts b/src/rendering.ts index f6789e1..8c265a5 100644 --- a/src/rendering.ts +++ b/src/rendering.ts @@ -7,7 +7,7 @@ import * as d3 from 'd3'; import * as d3ScaleChromatic from './libs/d3-scale-chromatic/index'; import {StatusmapTooltip} from './tooltip'; import {AnnotationTooltip} from './annotations'; -import { Bucket, BucketMatrix } from './statusmap_data'; +import { Bucket, BucketMatrix, BucketMatrixPager } from './statusmap_data'; import { StatusHeatmapCtrl, renderComplete } from './module'; import { CoreEvents, PanelEvents } from './libs/grafana/events/index'; @@ -61,6 +61,7 @@ export class StatusmapRenderer { yGridSize: number = 0; bucketMatrix: BucketMatrix; + bucketMatrixPager: BucketMatrixPager; panel: any; $heatmap: any; tooltip: StatusmapTooltip; @@ -134,9 +135,12 @@ export class StatusmapRenderer { } if (this.panel.usingPagination) { - height -= this.panel.legend.show ? 140 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! + // TODO get height of pagination controls. + // reserve height for legend and for a row of pagination controls. + height -= this.panel.legend.show ? 70 : 40; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! } else { - height -= this.panel.legend.show ? 50 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! + // reserve height for legend + height -= this.panel.legend.show ? 32 : 4; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! } this.$heatmap.css('height', height + 'px'); @@ -214,9 +218,7 @@ export class StatusmapRenderer { // divide chart height by ticks for cards drawing getYScale(ticks: any[]) { let range:any[] = []; - //let step = this.chartHeight / ticks.length; - console.log('GETYSCALE - RENDERING', this.ctrl.getPaginationSize()); - let step = this.chartHeight / this.ctrl.getPaginationSize(); + let step = this.chartHeight / ticks.length; // svg has y=0 on the top, so top card should have a minimal value in range range.push(step); for (let i = 1; i < ticks.length; i++) { @@ -230,9 +232,7 @@ export class StatusmapRenderer { // divide chart height by ticks with offset for ticks drawing getYAxisScale(ticks: any[]) { let range:any[] = []; - //let step = this.chartHeight / ticks.length; - console.log('GETYAXISSCALE - RENDERING', this.ctrl.getPaginationSize()); - let step = this.chartHeight / this.ctrl.getPaginationSize(); + let step = this.chartHeight / ticks.length; // svg has y=0 on the top, so top tick should have a minimal value in range range.push(this.yOffset); for (let i = 1; i < ticks.length; i++) { @@ -244,26 +244,9 @@ export class StatusmapRenderer { } addYAxis() { + let ticks = this.bucketMatrixPager.targets(); - let ticks; - - if(this.ctrl.ticksWhenPaginating !== undefined && this.ctrl.panel.usingPagination) { - ticks = _.uniq(_.map(this.ctrl.ticksWhenPaginating)); - } else { - ticks = this.bucketMatrix.targets; - //ticks = _.uniq(_.map(this.data, d => d.target)); - } - - // // Set default Y min and max if no data - // if (_.isEmpty(this.data)) { - // ticks = ['']; - // } - // - // // TODO - // // New version! - // let ticks = this.bucketMatrix.targets; - - + // TODO move sorting into bucketMatrixPager. if (this.panel.yAxisSort == 'a → z') { ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true})); } else if (this.panel.yAxisSort == 'z → a') { @@ -352,17 +335,9 @@ export class StatusmapRenderer { // calculate yOffset for YAxis this.yGridSize = this.chartHeight; - if (this.ctrl.panel.usingPagination) { - // Pagination mode overrides count of rows. - //this.yGridSize = Math.floor(this.chartHeight / this.ctrl.ticksWhenPaginating.length); - console.log('addHeatmapCanvas - rendering',this.ctrl.getPaginationSize()); - this.yGridSize = Math.floor(this.chartHeight / this.ctrl.getPaginationSize()); - } else { - if (this.bucketMatrix.targets.length > 0) { - this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length); - } + if (this.bucketMatrixPager.targets().length > 0) { + this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrixPager.targets().length); } - this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0; this.yOffset = this.cardHeight / 2; @@ -398,7 +373,7 @@ export class StatusmapRenderer { this.setOpacityScale(maxValue); // Draw cards from buckets. - this.heatmap.selectAll(".statusmap-cards-row").data(this.bucketMatrix.targets) + this.heatmap.selectAll(".statusmap-cards-row").data(this.bucketMatrixPager.targets()) .enter() .selectAll(".statustmap-card") .data((target:string) => this.bucketMatrix.buckets[target]) @@ -778,75 +753,14 @@ export class StatusmapRenderer { } } - render() { this.panel = this.ctrl.panel; this.timeRange = this.ctrl.range; this.bucketMatrix = this.ctrl.bucketMatrix; + this.bucketMatrixPager = this.ctrl.bucketMatrixPager; if (!this.bucketMatrix || !this.setElementHeight()) { return; - } else { - // TODO pagination! - this.ctrl.cardsDataComplete = this.ctrl.bucketMatrix.buckets; - - if(this.ctrl.panel.usingPagination) { - if (!this.bucketMatrix.targets) { - return; - } - - this.ctrl.setFirstPageElement((this.ctrl.getCurrentPage()*this.ctrl.getPaginationSize())+1); - - let elems = this.ctrl.getTotalElements(); - - console.log('total elems in add heatmap canvas', elems); - if (elems < this.ctrl.getFirstPageElement()) { - this.ctrl.setCurrentPage(0); - this.render(); - } - - if (this.ctrl.getPaginationSize() >= this.ctrl.getTotalElements()) { - this.ctrl.setLastPageElement(this.ctrl.getTotalElements()); - } else { - if ((this.ctrl.getCurrentPage()+1) === this.ctrl.getNumberOfPages() && (this.ctrl.getCurrentPage()>0)) { - this.ctrl.setLastPageElement(this.ctrl.getTotalElements()); - } else { - this.ctrl.setLastPageElement((this.ctrl.getCurrentPage() * this.ctrl.getPaginationSize())+this.ctrl.getPaginationSize()); - } - } - - let cardsList = this.ctrl.bucketMatrix.targets.slice(this.ctrl.getPaginationSize()*this.ctrl.getCurrentPage(), - (this.ctrl.getPaginationSize()*this.ctrl.getCurrentPage())+this.ctrl.getPaginationSize()); - - let cardsToShow = []; - let labelsToShow = []; - - // Rewrite for bucket matrix. - for (let i = 0; i < this.cardsData.cards.length; i++) { - const card = this.cardsData.cards[i]; - - for (let j = 0; j < cardsList.length; j++) { - const value = cardsList[j]; - - if (card.y === value) { - cardsToShow.push(card); - labelsToShow.push(value); - } - - } - } - - const labelsToShowClean = [...new Set(labelsToShow)]; - - this.cardsData.cards = cardsToShow.slice(); - this.ctrl.ticksWhenPaginating = labelsToShowClean; - - cardsToShow = undefined; - } else { - const pageSize = this.ctrl.bucketMatrix.targets.length - this.ctrl.getPaginationSize(pageSize); - this.ctrl.ticksWhenPaginating = undefined; - } } // Draw default axes and return if no data @@ -861,9 +775,6 @@ export class StatusmapRenderer { this.scope.chartHeight = this.chartHeight; this.scope.chartWidth = this.chartWidth; this.scope.chartTop = this.chartTop; - - // TODO pagination. Why this needed? - //this.ctrl.cardsData.cards = this.ctrl.cardsDataComplete.slice(); } _renderAnnotations() { diff --git a/src/statusmap_data.ts b/src/statusmap_data.ts index 23383d0..65c6f2b 100644 --- a/src/statusmap_data.ts +++ b/src/statusmap_data.ts @@ -62,6 +62,7 @@ class BucketMatrix { // a flag that indicate that buckets has stub values noDatapoints: boolean = false; + // An array of row labels targets: string[] = []; rangeMs: number = 0; intervalMs: number = 0; @@ -93,4 +94,122 @@ class BucketMatrix { } } -export {Bucket, BucketMatrix }; \ No newline at end of file +export var pagerChanged:any = {name:'statusmap-pager-changed'}; + +class BucketMatrixPager { + bucketMatrix: BucketMatrix; + enable: boolean; + defaultPageSize: number = -1; + pageSize: number = -1; + currentPage: number = 0; + + constructor() { + let m = new BucketMatrix(); + + this.bucketMatrix = m; + } + + // An array of row labels for current page. + targets(): string[] { + if (!this.enable) { + return this.bucketMatrix.targets; + } + + return this.bucketMatrix.targets.slice(this.pageSize * this.currentPage, this.pageSize * (this.currentPage+1) ); + } + + buckets(): {[yLabel: string]: Bucket[]} { + if (!this.enable) { + return this.bucketMatrix.buckets; + } + + let buckets: {[yLabel: string]: Bucket[]} = {} + let me = this; + + this.targets().map(function (rowLabel) { + buckets[rowLabel] = me.bucketMatrix.buckets[rowLabel]; + }) + + return buckets; + } + + setEnable(enable: boolean) { + this.enable = enable; + } + + setCurrent(num: number): void { + this.currentPage = num; + } + + setDefaultPageSize(num: number): void { + this.defaultPageSize = num; + } + + setPageSize(num: number): void { + this.pageSize = num; + } + + pages(): number { + return Math.ceil(this.totalRows() / this.pageSize); + } + + totalRows(): number { + return this.bucketMatrix.targets.length; + } + + pageStartRow(): number { + if (!this.enable) { + return 1; + } + return (this.pageSize * this.currentPage) + 1; + } + + pageEndRow(): number { + if (!this.enable) { + return this.totalRows(); + } + + let last = this.pageSize * (this.currentPage+1); + if (last > this.totalRows()) { + return this.totalRows(); + } + + return last; + } + + hasNext(): boolean { + if (!this.enable) { + return false; + } + + if ((this.currentPage+1)*this.pageSize >= this.totalRows()) { + return false; + } + + return true; + // currentPage >= ctrl.bucketMatrix.targets.length/ctrl.pageSizeViewer - 1 || ctrl.numberOfPages == 0 + } + + hasPrev(): boolean { + if (!this.enable) { + return false; + } + + return this.currentPage > 0; + } + + switchToNext() { + if (this.hasNext()) { + this.currentPage = this.currentPage + 1; + } + } + + switchToPrev() { + if (this.hasPrev()) { + this.currentPage = this.currentPage - 1; + } + } + +} + +export {Bucket, BucketMatrix, BucketMatrixPager }; \ No newline at end of file diff --git a/src/tooltipextraseries.ts b/src/tooltipextraseries.ts deleted file mode 100644 index 36b2a11..0000000 --- a/src/tooltipextraseries.ts +++ /dev/null @@ -1,228 +0,0 @@ -import d3 from 'd3'; -import _ from 'lodash'; -import $ from 'jquery'; -import { ExtraSeriesFormatValue } from './extra_series_format'; - -const TOOLTIP_PADDING_X = -50; -const TOOLTIP_PADDING_Y = 5; - -export class StatusHeatmapTooltipExtraSeries { - scope: any; - dashboard: any; - panelCtrl: any; - panel: any; - heatmapPanel: any; - mouseOverBucket: any; - originalFillColor: any; - tooltip: any; - - constructor(elem: any, scope: any) { - this.scope = scope; - this.dashboard = scope.ctrl.dashboard; - this.panelCtrl = scope.ctrl; - this.panel = scope.ctrl.panel; - this.heatmapPanel = elem; - this.mouseOverBucket = false; - this.originalFillColor = null; - - elem.on("mouseover", this.onMouseOver.bind(this)); - elem.on("click", this.onMouseClick.bind(this)); - } - - public onMouseOver(e: Event) { - if (!this.panel.usingUrl || !this.scope.ctrl.data || _.isEmpty(this.scope.ctrl.data)) { - return; - } - } - - public onMouseClick(e: Event) { - if (!this.panel.usingUrl) { - return; - } - - this.destroy(); - this.add(); - } - - public add() { - this.tooltip = d3.select("body") - .append("div") - .attr("class", "statusmap-tooltip-extraseries graph-tooltip grafana-tooltip"); - } - - public destroy() { - if (this.tooltip) { - this.tooltip.remove(); - } - - this.tooltip = null; - } - - public show(pos: any) { - if (!this.panel.usingUrl || !this.tooltip) { - return; - } - - // shared tooltip mode - if (pos.panelRelY) { - return; - } - - let cardId: any = d3.select(pos.target).attr('cardId'); - - if (!cardId) { - this.destroy(); - - return; - } - - let card: any; - - if (this.panel.usingPagination) { - card = this.panelCtrl.cardsDataComplete[cardId]; - } else { - card = this.panelCtrl.cardsData.cards[cardId]; - } - - if (!card) { - this.destroy(); - - return; - } - - if (card.value == null) { - this.destroy(); - - return; - } - - let x: any = card.x; - let y: any = card.y; - let value: any = card.value; - let values: any = card.values; - let tooltipTimeFormat: string = 'YYYY-MM-DD HH:mm:ss'; - let time: Date = this.dashboard.formatDate(+x, tooltipTimeFormat); - - let tooltipHtml: string = `
${time}
` - - if (this.panel.color.mode === 'discrete') { - let statuses: any = ""; - - if (this.panelCtrl.panel.seriesFilterIndex == -1) { - statuses = this.panelCtrl.discreteExtraSeries.convertValuesToTooltips(values); - } else { - statuses = this.panelCtrl.discreteExtraSeries.convertValueToTooltips(value); - } - - tooltipHtml += ` -
- name: ${y} -
-
- status: -
    - ${_.join(_.map(statuses, v => `

    ${v.tooltip}

    `), "")} -
-
-

`; - } - - tooltipHtml += `
`; - - let urls: any = this.panelCtrl.panel.urls - let rtime: any = this.panelCtrl.retrieveTimeVar(); - - let curl: any = JSON.parse(JSON.stringify(urls)); - - for (let i = 0; i < curl.length; i++) { - //Change name var - curl[i].base_url = _.replace(curl[i].base_url, /\$series_label/g, y) - //Set up extra series - if (curl[i].useExtraSeries == true) { - let tf: any = curl[i].extraSeries.format - let vh: any = card.values[curl[i].extraSeries.index] - //let extraSeries: any = this.dashboard.formatDate(+vh, tf) - let series_extra: any = this.formatExtraSeries(vh,tf); - - curl[i].base_url = _.replace(curl[i].base_url, /\$series_extra/g, series_extra) - } - //Change time var - curl[i].base_url = _.replace(curl[i].base_url, /\$time/g, rtime) - - //Replace vars - curl[i].base_url = this.panelCtrl.renderLink(curl[i].base_url, this.panelCtrl.variableSrv.variables) - } - - if (this.panelCtrl.panel.usingUrl == true) { - tooltipHtml += ` -
- ${_.join(_.map(curl, v => `
-
`), "")} -

`; - } - - // "Ambiguous bucket state: Multiple values!"; - if (!this.panel.useMax && card.multipleValues) { - tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.multipleValues.title}
`; - } - - // Discrete mode errors - if (this.panel.color.mode === 'discrete') { - if (card.noColorDefined) { - let badValues: any = this.panelCtrl.discreteExtraSeries.getNotColoredValues(values); - tooltipHtml += `
Error: ${this.panelCtrl.dataWarnings.noColorDefined.title} -
not colored values: -
    - ${_.join(_.map(badValues, v => `
  • ${v}
  • `), "")} -
-
`; - } - } - - this.tooltip.html(tooltipHtml); - - this.move(pos); - } - - public formatExtraSeries (value: any, type: any) { - let extraSeries: any = ''; - - switch(type) { - case ExtraSeriesFormatValue.Date: - extraSeries = this.dashboard.formatDate(+value, type); - return extraSeries; - case ExtraSeriesFormatValue.Raw: - extraSeries = value; - return extraSeries; - default: - return extraSeries; - } - } - - public move(pos: any) { - if (!this.tooltip) { - return; - } - - let elem: any = $(this.tooltip.node())[0]; - let tooltipWidth = elem.clientWidth; - let tooltipHeight = elem.clientHeight; - - let left = pos.pageX + TOOLTIP_PADDING_X; - let top = pos.pageY + TOOLTIP_PADDING_Y; - - if (pos.pageX + tooltipWidth + 40 > window.innerWidth) { - left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X; - } - - if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) { - top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y; - } - - return this.tooltip - .style("left", left + "px") - .style("top", top + "px"); - } -} \ No newline at end of file