From 99ba3cbdd6ed4bda78f91b053f0372733a454edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20Jim=C3=A9nez=20Garc=C3=ADa?= Date: Mon, 13 Jul 2020 14:16:37 +0300 Subject: [PATCH 1/2] feat: pagination Continuation of PR #93. --- dist/css/statusmap.dark.css | 3 + dist/css/statusmap.dark.css.map | 2 +- dist/css/statusmap.light.css | 3 + dist/css/statusmap.light.css.map | 2 +- dist/extra_series_format.js | 28 ++++ dist/extra_series_format.js.map | 1 + dist/img/tooltip-editor.png | Bin 34584 -> 38899 bytes dist/img/tooltip-url.png | Bin 10403 -> 8040 bytes dist/module.html | 24 ++- dist/module.js | 118 +++++++++++++- dist/module.js.map | 2 +- dist/partials/options_editor.html | 115 ++++++++++++++ dist/rendering.js | 112 ++++++++++++-- dist/rendering.js.map | 2 +- dist/tooltipextraseries.js | 248 ++++++++++++++++++++++++++++++ dist/tooltipextraseries.js.map | 1 + src/css/_statusmap.scss | 2 + src/extra_series_format.ts | 9 ++ src/img/tooltip-editor.png | Bin 34584 -> 38899 bytes src/img/tooltip-url.png | Bin 10403 -> 8040 bytes src/module.html | 24 ++- src/module.ts | 105 ++++++++++++- src/partials/options_editor.html | 115 ++++++++++++++ src/rendering.ts | 113 +++++++++++++- src/tooltipextraseries.ts | 228 +++++++++++++++++++++++++++ 25 files changed, 1223 insertions(+), 34 deletions(-) create mode 100644 dist/extra_series_format.js create mode 100644 dist/extra_series_format.js.map create mode 100644 dist/tooltipextraseries.js create mode 100644 dist/tooltipextraseries.js.map create mode 100644 src/extra_series_format.ts create mode 100644 src/tooltipextraseries.ts diff --git a/dist/css/statusmap.dark.css b/dist/css/statusmap.dark.css index 94e2b66..bbc2b61 100644 --- a/dist/css/statusmap.dark.css +++ b/dist/css/statusmap.dark.css @@ -69,6 +69,9 @@ .width-c-70 { width: 70rem !important; } +.pagination-buttons { + text-align: right; } + .status-heatmap-legend-wrapper { margin: 0 10px; } .status-heatmap-legend-wrapper svg { diff --git a/dist/css/statusmap.dark.css.map b/dist/css/statusmap.dark.css.map index abbcde5..e740b9c 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,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,EC3HG,OAAO;ID4Hd,KAAK,EC5HE,OAAO;ID6Hd,SAAS,EE7HE,IAAI;EFgIjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECjIM,OAAO;EDoIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECtIM,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,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", "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 49aca7b..201f225 100644 --- a/dist/css/statusmap.light.css +++ b/dist/css/statusmap.light.css @@ -69,6 +69,9 @@ .width-c-70 { width: 70rem !important; } +.pagination-buttons { + text-align: right; } + .status-heatmap-legend-wrapper { margin: 0 10px; } .status-heatmap-legend-wrapper svg { diff --git a/dist/css/statusmap.light.css.map b/dist/css/statusmap.light.css.map index 5f03d2f..89e107d 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,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,EC3HG,OAAO;ID4Hd,KAAK,EC5HE,OAAO;ID6Hd,SAAS,EE7HE,IAAI;EFgIjB,+CAAK;IACH,OAAO,EAAE,GAAG;IACZ,MAAM,ECjIM,OAAO;EDoIrB,kDAAQ;IACN,OAAO,EAAE,GAAG;IACZ,MAAM,ECtIM,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,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", "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 new file mode 100644 index 0000000..6680ce7 --- /dev/null +++ b/dist/extra_series_format.js @@ -0,0 +1,28 @@ +"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 new file mode 100644 index 0000000..15a0176 --- /dev/null +++ b/dist/extra_series_format.js.map @@ -0,0 +1 @@ +{"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 97a26d8e4cf53e8b93f74e14c94da3fff0cacf84..b4410a81b0c83c7b40290eeff38f27f5a8e3a17a 100644 GIT binary patch literal 38899 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
38+L)w>#BOOiOPp&tm*T^b)S6*-YE&qwjO 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

s9`16w2aTCB)$}`%Sq~Q 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 W=0tDP75e`(xe7>A5&6nI^nU;n{_XDo literal 34584 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 Y^L&$~kRj*kUpb&4t143_Z5H-_0J9XC&Hw-a literal 10403 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 +

+
+
+ + +
+
@@ -7,8 +16,19 @@ {{ctrl.dataWarnings.noDatapoints.title}}
- -
+
+
+
diff --git a/dist/module.js b/dist/module.js index 9b31779..2b801de 100644 --- a/dist/module.js +++ b/dist/module.js @@ -192,6 +192,12 @@ 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); @@ -206,6 +212,18 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _defineProperty(_assertThisInitialized(_this), "annotationsPromise", void 0); + _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, @@ -251,7 +269,11 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit yAxisSort: 'metrics', highlightCards: true, useMax: true, - seriesFilterIndex: -1 + seriesFilterIndex: -1, + usingPagination: false, + pageSize: 15, + allowAllElements: false, + availableValues: [] }); if (!Polygrafill.hasAppEventCompatibleEmitter(_this.events)) { @@ -265,6 +287,12 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _.defaultsDeep(_this.panel, _this.panelDefaults); + if (_this.panel.usingPagination) { + _this.setPaginationSize(_this.panel.pageSize); + + _this.setCurrentPage(0); + } + _this.opacityScales = opacityScales; _this.colorModes = colorModes; _this.colorSchemes = colorSchemes; // default graph width for discrete card width calculation @@ -317,6 +345,79 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit value: function onRenderComplete(data) { this.graph.chartWidth = data.chartWidth; this.renderingCompleted(); + } + }, { + key: "changeDefaultPaginationSize", + value: function changeDefaultPaginationSize(defaultPageSize) { + this.pageSizeViewer = defaultPageSize; + this.render(); + this.refresh(); + } + }, { + key: "changePaginationSize", + value: function changePaginationSize() { + if (this.pageSizeViewer <= 0) { + this.pageSizeViewer = 1; + } + + this.currentPage = 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: "setLastPageElement", + value: function setLastPageElement(lastPageElement) { + this.lastPageElement = lastPageElement; } // getChartWidth returns an approximation of chart canvas width or // a saved value calculated during a render. @@ -448,6 +549,13 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit 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); + } + if (this.annotationsPromise) { this.annotationsPromise.then(function (result) { _this3.loading = false; //this.alertState = result.alertState; @@ -463,7 +571,8 @@ System.register(["lodash", "./color_legend", "./options_editor", "./tooltip_edit _this3.loading = false; _this3.annotations = []; - _this3.render(); + _this3.render(); // this.render(this.data);??? + }); } else { this.loading = false; @@ -477,6 +586,11 @@ 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 11c0e62..ae2ad05 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","hasAppEventCompatibleEmitter","events","fallbackToStringEvents","panel","defaultsDeep","panelDefaults","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","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","result","loading","length","addEditorTab","unitFormats","getUnitFormats","updateCardsValuesHasColorInfo","updateCardsValuesHasColorInfoSingle","newColor","scope","elem","attrs","ctrl","time","timeRangeForUrl","mostRecentBucket","targets","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 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 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\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.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 // 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.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 +{"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACOA,MAAAA,C;;AAKEC,MAAAA,iB,mBAAAA,iB;;AACAC,MAAAA,iB,mBAAAA,iB;;AACAC,MAAAA,kB,2BAAAA,kB;;AAGFC,MAAAA,G;;AACCC,MAAAA,a,kBAAAA,a;AAGCC,MAAAA,gB,kBAAAA,gB;;AAEAC,MAAAA,U,2BAAAA,U;AAAYC,MAAAA,W,2BAAAA,W;;AACZC,MAAAA,M,mBAAAA,M;AAAQC,MAAAA,Y,mBAAAA,Y;;AACVC,MAAAA,S;;AACEC,MAAAA,W,yBAAAA,W;;AAGDC,MAAAA,iB,wBAAAA,iB;;;AAEFC,MAAAA,W,GAAc,C;AACdC,MAAAA,U,GAAa,C;AAEbC,MAAAA,Y,GAAe,CACnB;AACA;AAAEC,QAAAA,IAAI,EAAE,UAAR;AAAoBC,QAAAA,KAAK,EAAE,qBAA3B;AAAkDC,QAAAA,MAAM,EAAE;AAA1D,OAFmB,EAGnB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OAHmB,EAInB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OAJmB,EAMnB;AACA;AAAEF,QAAAA,IAAI,EAAE,OAAR;AAAiBC,QAAAA,KAAK,EAAE,kBAAxB;AAA4CC,QAAAA,MAAM,EAAE;AAApD,OAPmB,EAQnB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OARmB,EASnB;AAAEF,QAAAA,IAAI,EAAE,OAAR;AAAiBC,QAAAA,KAAK,EAAE,kBAAxB;AAA4CC,QAAAA,MAAM,EAAE;AAApD,OATmB,EAUnB;AAAEF,QAAAA,IAAI,EAAE,SAAR;AAAmBC,QAAAA,KAAK,EAAE,oBAA1B;AAAgDC,QAAAA,MAAM,EAAE;AAAxD,OAVmB,EAWnB;AAAEF,QAAAA,IAAI,EAAE,SAAR;AAAmBC,QAAAA,KAAK,EAAE,oBAA1B;AAAgDC,QAAAA,MAAM,EAAE;AAAxD,OAXmB,EAYnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAZmB,EAcnB;AACA;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAfmB,EAgBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAhBmB,EAiBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAjBmB,EAkBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAlBmB,EAmBnB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OAnBmB,EAoBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OApBmB,EAqBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OArBmB,EAsBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAtBmB,EAuBnB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OAvBmB,EAwBnB;AAAEF,QAAAA,IAAI,EAAE,MAAR;AAAgBC,QAAAA,KAAK,EAAE,iBAAvB;AAA0CC,QAAAA,MAAM,EAAE;AAAlD,OAxBmB,EAyBnB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OAzBmB,EA0BnB;AAAEF,QAAAA,IAAI,EAAE,QAAR;AAAkBC,QAAAA,KAAK,EAAE,mBAAzB;AAA8CC,QAAAA,MAAM,EAAE;AAAtD,OA1BmB,C;AA6BjBC,MAAAA,U,GAAa,CAAC,SAAD,EAAY,UAAZ,EAAwB,UAAxB,C;AACbC,MAAAA,a,GAAgB,CAAC,QAAD,EAAW,MAAX,C;AAEpBhB,MAAAA,aAAa,CAAC;AACZiB,QAAAA,IAAI,EAAE,sDADM;AAEZC,QAAAA,KAAK,EAAE;AAFK,OAAD,CAAb;;gCAKWC,c,GAAqB;AAACP,QAAAA,IAAI,EAAC;AAAN,O,GAAoC;;;wDAE9DQ,iB;;;;;;;AAqFJ;AACA,mCAAYC,MAAZ,EAAyBC,SAAzB,EAA2DC,OAA3D,EAA4EC,cAA5E,EAA4GC,OAA5G,EAAqHC,aAArH,EAA2IC,WAA3I,EAA6JC,WAA7J,EAA0K;AAAA;;AAAA;;AACxK,iGAAMP,MAAN,EAAcC,SAAd;AADwK,gBAA9FE,cAA8F,GAA9FA,cAA8F;AAAA,gBAA/BG,WAA+B,GAA/BA,WAA+B;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,0EA9ErJ,EA8EqJ;;AAAA,uEA7ExJ,EA6EwJ;;AAAA,yEA5EtJ,EA4EsJ;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,yEArEtG,EAqEsG;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,wEA9DlJ,EA8DkJ;;AAAA;;AAAA,2EA3DjJ,EA2DiJ;;AAAA,wEA1DpJ,CA0DoJ;;AAAA,0EAzDlJ,CAyDkJ;;AAAA,0EAxDlJ,CAwDkJ;;AAAA,6EAvD/I,CAuD+I;;AAAA,4EAtDhJ,CAsDgJ;;AAAA,0EApDrJ;AACnB;AACAE,YAAAA,UAAU,EAAE,IAFO;AAGnB;AACAC,YAAAA,KAAK,EAAE;AACLC,cAAAA,IAAI,EAAE,UADD;AAELC,cAAAA,SAAS,EAAE,SAFN;AAGLC,cAAAA,UAAU,EAAE,MAHP;AAILC,cAAAA,QAAQ,EAAE,GAJL;AAKLC,cAAAA,WAAW,EAAE,mBALR;AAML;AACAC,cAAAA,YAAY,EAAE,SAPT;AAQLC,cAAAA,UAAU,EAAE,EARP,CAQU;;AARV,aAJY;AAcnB;AACAC,YAAAA,KAAK,EAAE;AACLC,cAAAA,YAAY,EAAE,CADT;AAELC,cAAAA,YAAY,EAAE,CAFT;AAGLC,cAAAA,YAAY,EAAE,CAHT;AAILC,cAAAA,SAAS,EAAE;AAJN,aAfY;AAqBnBC,YAAAA,KAAK,EAAE;AACLC,cAAAA,IAAI,EAAE;AADD,aArBY;AAwBnBC,YAAAA,KAAK,EAAE;AACLD,cAAAA,IAAI,EAAE,IADD;AAELE,cAAAA,QAAQ,EAAE,CAAC,CAFN;AAGLC,cAAAA,QAAQ,EAAE,CAAC;AAHN,aAxBY;AA6BnBC,YAAAA,OAAO,EAAE;AACPJ,cAAAA,IAAI,EAAE,IADC;AAEPK,cAAAA,aAAa,EAAE,IAFR;AAGPC,cAAAA,SAAS,EAAE,KAHJ;AAIPC,cAAAA,KAAK,EAAE,EAJA,CAIG;;AAJH,aA7BU;AAmCnBC,YAAAA,MAAM,EAAE;AACNR,cAAAA,IAAI,EAAE;AADA,aAnCW;AAsCnB;AACAS,YAAAA,aAAa,EAAE,UAvCI;AAwCnBC,YAAAA,SAAS,EAAE,SAxCQ;AAyCnBC,YAAAA,cAAc,EAAE,IAzCG;AA0CnBC,YAAAA,MAAM,EAAE,IA1CW;AA4CnBC,YAAAA,iBAAiB,EAAE,CAAC,CA5CD;AA6CnBC,YAAAA,eAAe,EAAE,KA7CE;AA8CnBC,YAAAA,QAAQ,EAAE,EA9CS;AA+CnBC,YAAAA,gBAAgB,EAAE,KA/CC;AAgDnBC,YAAAA,eAAe,EAAE;AAhDE,WAoDqJ;;AAGxK,cAAG,CAACtD,WAAW,CAACuD,4BAAZ,CAAyC,MAAKC,MAA9C,CAAJ,EAA0D;AACxD7D,YAAAA,UAAU,CAAC8D,sBAAX;AACA7D,YAAAA,WAAW,CAAC6D,sBAAZ;;AACA,sCAAA7C,cAAc,GAAGA,cAAc,CAACP,IAAhC;AACD;;AAEDd,UAAAA,kBAAkB,CAAC,MAAKmE,KAAN,CAAlB;;AACAtE,UAAAA,CAAC,CAACuE,YAAF,CAAe,MAAKD,KAApB,EAA2B,MAAKE,aAAhC;;AAEA,cAAI,MAAKF,KAAL,CAAWP,eAAf,EAAgC;AAC9B,kBAAKU,iBAAL,CAAuB,MAAKH,KAAL,CAAWN,QAAlC;;AACA,kBAAKU,cAAL,CAAoB,CAApB;AACD;;AAED,gBAAKrD,aAAL,GAAqBA,aAArB;AACA,gBAAKD,UAAL,GAAkBA,UAAlB;AACA,gBAAKJ,YAAL,GAAoBA,YAApB,CAnBwK,CAqBxK;;AACA,gBAAK2D,KAAL,GAAa;AACX,0BAAe,CAAC;AADL,WAAb;AAIA,gBAAKC,cAAL,GAAsB,KAAtB;AACA,gBAAKC,cAAL,GAAsB,KAAtB;AAEA,gBAAKC,mBAAL,GAA2B,IAAIjE,iBAAJ,CAAsBa,MAAtB,CAA3B;AAEA,gBAAKqD,YAAL,GAAoB;AAClBF,YAAAA,cAAc,EAAE;AACdG,cAAAA,KAAK,EAAE,qCADO;AAEdC,cAAAA,GAAG,EAAE;AAFS,aADE;AAKlBL,YAAAA,cAAc,EAAE;AACdI,cAAAA,KAAK,EAAE,yCADO;AAEdC,cAAAA,GAAG,EAAE;AAFS,aALE;AASlBC,YAAAA,YAAY,EAAE;AACZF,cAAAA,KAAK,EAAE,gBADK;AAEZC,cAAAA,GAAG,EAAE;AAFO;AATI,WAApB;AAeA,gBAAKE,WAAL,GAAmB,EAAnB;AACA,gBAAKtD,cAAL,GAAsBA,cAAtB;AAEA,gBAAKD,OAAL,GAAeA,OAAf;;AAEA,gBAAKwC,MAAL,CAAYgB,EAAZ,CAAe5E,WAAW,CAAC6E,MAA3B,EAAmC,MAAKC,QAAL,CAAcC,IAAd,+BAAnC;;AACA,gBAAKnB,MAAL,CAAYgB,EAAZ,CAAe5E,WAAW,CAACgF,YAA3B,EAAyC,MAAKC,cAAL,CAAoBF,IAApB,+BAAzC;;AACA,gBAAKnB,MAAL,CAAYgB,EAAZ,CAAe5E,WAAW,CAACkF,SAA3B,EAAsC,MAAKC,WAAL,CAAiBJ,IAAjB,+BAAtC;;AACA,gBAAKnB,MAAL,CAAYgB,EAAZ,CAAe5E,WAAW,CAACoF,gBAA3B,EAA6C,MAAKH,cAAL,CAAoBF,IAApB,+BAA7C;;AACA,gBAAKnB,MAAL,CAAYgB,EAAZ,CAAe5E,WAAW,CAACqF,mBAA3B,EAAgD,MAAKC,cAAL,CAAoBP,IAApB,+BAAhD;;AACA,gBAAKnB,MAAL,CAAYgB,EAAZ,CAAe5E,WAAW,CAACuF,OAA3B,EAAoC,MAAKC,WAAL,CAAiBT,IAAjB,+BAApC,EAxDwK,CAyDxK;;;AACA,gBAAKnB,MAAL,CAAYgB,EAAZ,CAAe5D,cAAf,EAA+B,MAAKyE,gBAAL,CAAsBV,IAAtB,+BAA/B;;AAEA,gBAAKW,iBAAL,GAAyB,MAAKA,iBAAL,CAAuBX,IAAvB,+BAAzB;AA5DwK;AA6DzK;;;;2CAEgBY,I,EAAgB;AAC/B,iBAAKxB,KAAL,CAAWyB,UAAX,GAAwBD,IAAI,CAACC,UAA7B;AACA,iBAAKC,kBAAL;AACD;;;sDAE2BC,e,EAA+B;AACzD,iBAAKC,cAAL,GAAsBD,eAAtB;AAEA,iBAAKjB,MAAL;AACA,iBAAKU,OAAL;AACD;;;iDAE4B;AAC3B,gBAAI,KAAKQ,cAAL,IAAuB,CAA3B,EAA8B;AAC5B,mBAAKA,cAAL,GAAsB,CAAtB;AACD;;AAED,iBAAKC,WAAL,GAAmB,CAAnB;AAEA,iBAAKnB,MAAL;AACA,iBAAKU,OAAL;AACD;;;8CAE2B;AAC1B,mBAAO,KAAKQ,cAAZ;AACD;;;4CAEiBvC,Q,EAAwB;AACxC,iBAAKuC,cAAL,GAAsBvC,QAAtB;AACD;;;2CAEwB;AACvB,mBAAO,KAAKwC,WAAZ;AACD;;;yCAEcA,W,EAA2B;AACxC,iBAAKA,WAAL,GAAmBA,WAAnB;AACD;;;6CAE0B;AACzB,mBAAO,KAAKC,aAAZ;AACD;;;6CAE0B;AACzB,mBAAO,KAAKC,aAAZ;AACD;;;2CAEgBA,a,EAA6B;AAC5C,iBAAKA,aAAL,GAAqBA,aAArB;AACD;;;gDAE6B;AAC5B,mBAAO,KAAKC,gBAAZ;AACD;;;8CAEmBA,gB,EAAgC;AAClD,iBAAKA,gBAAL,GAAwBA,gBAAxB;AACD;;;+CAE4B;AAC3B,mBAAO,KAAKC,eAAZ;AACD;;;6CAEkBA,e,EAA+B;AAChD,iBAAKA,eAAL,GAAuBA,eAAvB;AACD,W,CAED;AACA;;;;0CACuB;AACrB,gBAAI,KAAKjC,KAAL,CAAWyB,UAAX,GAAwB,CAA5B,EAA+B;AAC7B,qBAAO,KAAKzB,KAAL,CAAWyB,UAAlB;AACD;;AAED,gBAAMS,QAAQ,GAAGC,CAAC,CAACC,MAAD,CAAD,CAAUC,KAAV,EAAjB,CALqB,CAMrB;;AACA,gBAAMC,gBAAgB,GAAG,KAAK3C,KAAL,CAAW4C,OAAX,CAAmBC,CAAnB,GAAuB,EAAhD;AACA,gBAAMC,UAAU,GAAGC,IAAI,CAACC,IAAL,CAAUT,QAAQ,GAAGI,gBAArB,CAAnB,CARqB,CASrB;AACA;AACA;AACA;;AACA,gBAAMb,UAAU,GAAGpG,CAAC,CAACuH,GAAF,CAAM,CACvBH,UAAU,GAAG,GADU,EAEvBA,UAAU,GAAC,CAFY,CAAN,CAAnB;;AAKA,mBAAOhB,UAAP;AACD,W,CAED;AACA;AACA;;;;0CACgBlE,U,EAAkB;AAChC,gBAAIsF,GAAG,0FAAyBtF,UAAzB,CAAP;;AACA,iBAAKuF,iBAAL;AACA,mBAAOD,GAAP;AACD,W,CAED;AACA;AACA;;;;8CACoB;AAClB,gBAAIpB,UAAU,GAAG,KAAKsB,aAAL,EAAjB;AAEA,gBAAIC,YAAY,GAAG,KAAKrD,KAAL,CAAW3B,KAAX,CAAiBC,YAApC;AACA,gBAAIgF,UAAU,GAAG,KAAKtD,KAAL,CAAW3B,KAAX,CAAiBG,YAAlC;AACA,gBAAI+E,aAAa,GAAGR,IAAI,CAACC,IAAL,CAAU,CAAClB,UAAU,GAACuB,YAAZ,KAA6BA,YAAY,GAAGC,UAA5C,CAAV,CAApB;AAEA,gBAAIE,UAAJ;AACA,gBAAIC,OAAO,GAAG,KAAKC,KAAL,CAAWC,EAAX,CAAcC,OAAd,KAA0B,KAAKF,KAAL,CAAWG,IAAX,CAAgBD,OAAhB,EAAxC,CARkB,CAUlB;;AACAJ,YAAAA,UAAU,GAAG,KAAKhD,mBAAL,CAAyBsD,iBAAzB,CAA2CL,OAAO,GAAGF,aAArD,CAAb,CAXkB,CAalB;;AACA,gBAAIQ,UAAU,GAAG,CAAjB,CAdkB,CAcE;;AAEpB,gBAAIC,gBAAgB,GAAG,KAAKhE,KAAL,CAAWiE,QAAlC,CAhBkB,CAkBlB;;AACA,gBAAID,gBAAJ,EAAsB;AACpBA,cAAAA,gBAAgB,GAAG,KAAKrG,WAAL,CAAiBuG,OAAjB,CAAyBF,gBAAzB,EAA2C,KAAKhE,KAAL,CAAWmE,UAAtD,CAAnB;AACD,aAFD,MAEO,IAAI,KAAKvG,UAAL,IAAmB,KAAKA,UAAL,CAAgBqG,QAAvC,EAAiD;AACtDD,cAAAA,gBAAgB,GAAG,KAAKpG,UAAL,CAAgBqG,QAAnC;AACD;;AAED,gBAAID,gBAAJ,EAAsB;AACpB,kBAAIA,gBAAgB,CAAC,CAAD,CAAhB,KAAwB,GAA5B,EAAiC;AAC/BA,gBAAAA,gBAAgB,GAAGA,gBAAgB,CAACI,KAAjB,CAAuB,CAAvB,CAAnB;AACD;;AACDL,cAAAA,UAAU,GAAGjI,GAAG,CAACuI,cAAJ,CAAmBL,gBAAnB,CAAb;AACD;;AAED,gBAAID,UAAU,GAAGP,UAAjB,EAA6B;AAC3BA,cAAAA,UAAU,GAAGO,UAAb;AACD;;AACD,gBAAIE,QAAQ,GAAGnI,GAAG,CAACwI,YAAJ,CAAiBd,UAAU,GAAG,IAA9B,CAAf;AAEA,iBAAKA,UAAL,GAAkBA,UAAlB;AACA,iBAAKS,QAAL,GAAgBA,QAAhB,CAtCkB,CAwClB;AACA;AACA;AACD;;;uCAEYrG,U,EAAiB;AAAA;;AAC5B,iBAAK2G,kBAAL,GAA0B,KAAKhH,cAAL,CAAoBiH,cAApB,CAAmC;AAC3DC,cAAAA,SAAS,EAAE,KAAKA,SAD2C;AAE3DzE,cAAAA,KAAK,EAAE,KAAKA,KAF+C;AAG3D0D,cAAAA,KAAK,EAAE,KAAKA;AAH+C,aAAnC,CAA1B;AAMA;;;;;;AAMA;;AACA,gBAAI,gBAAgB,OAAO,KAAKnG,cAAL,CAAoBmH,kBAA/C,EAAoE;AAClE,qBAAO,KAAKnH,cAAL,CAAoBmH,kBAApB,CAAuCC,IAAvC,CAA4C,UAAAC,CAAC,EAAI;AACtD,uBAAO,MAAI,CAACC,wBAAL,CAA8BjH,UAA9B,EAA0C,MAAI,CAACqG,QAA/C,CAAP;AACD,eAFM,CAAP;AAGD,aAJD,MAIO;AACL,qBAAO,KAAKY,wBAAL,CAA8BjH,UAA9B,EAA0C,KAAKqG,QAA/C,CAAP;AACD;AACF,W,CAED;AACA;AACA;;;;mDACyBrG,U,EAAiBqG,Q,EAAe;AACvD,gBAAIa,YAAY,GAAG,KAAK9E,KAAL,CAAWiE,QAA9B;AACA,iBAAKjE,KAAL,CAAWiE,QAAX,GAAsBA,QAAtB;;AACA,gBAAIc,GAAG,uFAAsBnH,UAAtB,CAAP;;AACA,iBAAKoC,KAAL,CAAWiE,QAAX,GAAsBa,YAAtB;AACA,mBAAOC,GAAP;AACD;;;yCAEcC,Q,EAAe;AAAA;;AAC5B,iBAAKnD,IAAL,GAAemD,QAAf,CAD4B,CAE5B;AACA;;AACA,gBAAI,CAAC,KAAKxB,UAAV,EAAsB;AACpB,mBAAKL,iBAAL;AACD;;AACD,iBAAK8B,YAAL,GAAoB,KAAKC,oBAAL,CAA0BF,QAA1B,EAAoC,KAAKtB,KAAL,CAAWG,IAAX,CAAgBD,OAAhB,EAApC,EAA+D,KAAKF,KAAL,CAAWC,EAAX,CAAcC,OAAd,EAA/D,EAAwF,KAAKJ,UAA7F,EAAyG,IAAzG,CAApB;AACA,iBAAK5C,YAAL,GAAoB,KAAKqE,YAAL,CAAkBrE,YAAtC;;AAEA,gBAAI,KAAKZ,KAAL,CAAWP,eAAX,IAA8B,KAAK0F,SAAL,CAAeC,OAAjD,EAA0D;AACxD,mBAAKjD,aAAL,GAAqBY,IAAI,CAACC,IAAL,CAAU,KAAKmC,SAAL,CAAeC,OAAf,CAAuBC,MAAvB,GAA8B,KAAKpD,cAA7C,CAArB;AACA,mBAAKG,aAAL,GAAqB,KAAK+C,SAAL,CAAeC,OAAf,CAAuBC,MAA5C;AACD,aAHD,MAGO;AACL,mBAAKlF,iBAAL,CAAuB,KAAKgF,SAAL,CAAeC,OAAf,CAAuBC,MAA9C;AACD;;AAED,gBAAI,KAAKd,kBAAT,EAA6B;AAC3B,mBAAKA,kBAAL,CAAwBI,IAAxB,CACE,UAACW,MAAD,EAAmD;AACjD,gBAAA,MAAI,CAACC,OAAL,GAAe,KAAf,CADiD,CAEjD;;AACA,oBAAID,MAAM,CAACzE,WAAP,IAAsByE,MAAM,CAACzE,WAAP,CAAmBwE,MAAnB,GAA4B,CAAtD,EAAyD;AACvD,kBAAA,MAAI,CAACxE,WAAL,GAAmByE,MAAM,CAACzE,WAA1B;AACD,iBAFD,MAEO;AACL,kBAAA,MAAI,CAACA,WAAL,GAAmB,EAAnB;AACD;;AACD,gBAAA,MAAI,CAACE,MAAL;AACD,eAVH,EAWE,YAAM;AACJ,gBAAA,MAAI,CAACwE,OAAL,GAAe,KAAf;AACA,gBAAA,MAAI,CAAC1E,WAAL,GAAmB,EAAnB;;AACA,gBAAA,MAAI,CAACE,MAAL,GAHI,CAGW;;AAChB,eAfH;AAiBD,aAlBD,MAkBO;AACL,mBAAKwE,OAAL,GAAe,KAAf;AACA,mBAAK1E,WAAL,GAAmB,EAAnB;AACA,mBAAKE,MAAL;AACD;AACF;;;2CAEgB;AACf,iBAAKyE,YAAL,CAAkB,SAAlB,EAA6B7J,iBAA7B,EAAgD,CAAhD;AACA,iBAAK6J,YAAL,CAAkB,SAAlB,EAA6B5J,iBAA7B,EAAgD,CAAhD;AACA,iBAAK6J,WAAL,GAAmB3J,GAAG,CAAC4J,cAAJ,EAAnB;AACD;;;qCAEU;AACT,iBAAKjE,OAAL;AACD,W,CAED;AACA;;;;qCACW;AACT,gBAAI,CAAC,KAAKiC,KAAN,IAAe,CAAC,KAAK7B,IAAzB,EAA+B;AAC7B,mBAAKjB,YAAL,GAAoB,IAApB;AACA;AACD;;AAED,iBAAKN,cAAL,GAAsB,KAAtB;;AACA,gBAAI,CAAC,KAAKN,KAAL,CAAWT,MAAhB,EAAwB;AACtB,kBAAI,KAAK0F,YAAT,EAAuB;AACrB,qBAAK3E,cAAL,GAAsB,KAAK2E,YAAL,CAAkB3E,cAAxC;AACD;AACF;;AAED,iBAAKC,cAAL,GAAsB,KAAtB;;AACA,gBAAI,KAAKP,KAAL,CAAWnC,KAAX,CAAiBC,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,kBAAI,KAAKkC,KAAL,CAAWR,iBAAX,IAAgC,CAAC,CAArC,EAAwC;AACtC,qBAAKgB,mBAAL,CAAyBmF,6BAAzB;AACD,eAFD,MAEO;AACL,qBAAKnF,mBAAL,CAAyBoF,mCAAzB;AACD;;AACD,kBAAI,KAAKX,YAAT,EAAuB;AACrB,qBAAK1E,cAAL,GAAsB,KAAK0E,YAAL,CAAkB1E,cAAxC;AACD;AACF;;AAED,iBAAKK,YAAL,GAAoB,KAApB;;AACA,gBAAI,KAAKqE,YAAT,EAAuB;AACrB,mBAAKrE,YAAL,GAAoB,KAAKqE,YAAL,CAAkBrE,YAAtC;AACD;AACF;;;4CAEiBiF,Q,EAAU;AAC1B,iBAAK7F,KAAL,CAAWnC,KAAX,CAAiBE,SAAjB,GAA6B8H,QAA7B;AACA,iBAAK9E,MAAL;AACD;;;wCAEa;AACZ,iBAAKc,IAAL,GAAY,EAAZ;AACA,iBAAKhB,WAAL,GAAmB,EAAnB;AACA,iBAAKE,MAAL;AACD;;;wCAEa;AACZ,iBAAKR,cAAL,GAAsB,KAAtB;AACD;;;+BAEIuF,K,EAAOC,I,EAAMC,K,EAAOC,I,EAAM;AAC7B5J,YAAAA,SAAS,CAACyJ,KAAD,EAAQC,IAAR,EAAcC,KAAd,EAAqBC,IAArB,CAAT;AACD,W,CAED;;;;4CACkB;AAChB,gBAAIC,IAAI,GAAG,KAAK5I,OAAL,CAAa6I,eAAb,EAAX;AACA,mBAAO,UAAUD,IAAI,CAACrC,IAAf,GAAsB,MAAtB,GAA+BqC,IAAI,CAACvC,EAA3C;AACD,W,CAED;AACA;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAiCqB9B,I,EAAUgC,I,EAAaF,E,EAAWH,U,EAAoB4C,gB,EAAwC;AAAA;;AACjH,gBAAInB,YAAY,GAAG,IAAI7I,YAAJ,EAAnB;AACA6I,YAAAA,YAAY,CAACxB,OAAb,GAAuBE,EAAE,GAAGE,IAA5B;AACAoB,YAAAA,YAAY,CAACzB,UAAb,GAA0BA,UAA1B;;AAEA,gBAAI,CAAC3B,IAAD,IAASA,IAAI,CAACwD,MAAL,IAAe,CAA5B,EAA+B;AAC7B;AACAJ,cAAAA,YAAY,CAACG,OAAb,GAAuB,CACrB,KADqB,EACd,KADc,EACP,MADO,CAAvB;AAGAH,cAAAA,YAAY,CAACoB,OAAb,CAAqB,KAArB,IAA8B,EAA9B;AACApB,cAAAA,YAAY,CAACoB,OAAb,CAAqB,KAArB,IAA8B,EAA9B;AACApB,cAAAA,YAAY,CAACoB,OAAb,CAAqB,MAArB,IAA+B,EAA/B;AACApB,cAAAA,YAAY,CAACqB,WAAb,GAA2B,EAA3B;AACArB,cAAAA,YAAY,CAACrE,YAAb,GAA4B,IAA5B;AACA,qBAAOqE,YAAP;AACD;;AAED,gBAAIsB,WAAyC,GAAG,EAAhD,CAlBiH,CAoBjH;AAEA;AACA;AACA;AACA;;AAEA1E,YAAAA,IAAI,CAAC2E,GAAL,CAAS,UAACC,WAAD,EAAmBC,CAAnB,EAAiC;AACxC,kBAAIC,MAAM,GAAGF,WAAW,CAACG,MAAzB;;AACA,kBAAI,CAACL,WAAW,CAACM,cAAZ,CAA2BF,MAA3B,CAAL,EAAyC;AACvCJ,gBAAAA,WAAW,CAACI,MAAD,CAAX,GAAsB,EAAtB;AACD;;AACDJ,cAAAA,WAAW,CAACI,MAAD,CAAX,CAAoBG,IAApB,CAAyBJ,CAAzB;AACD,aAND;;AAQA,gBAAIK,UAAU,GAAGrL,CAAC,CAACsL,IAAF,CAAOT,WAAP,CAAjB,CAnCiH,CAqCjH;;;AAEA,gBAAIU,qBAA0E,GAAG,EAAjF,CAvCiH,CAyCjH;AACA;;AACAF,YAAAA,UAAU,CAACP,GAAX,CAAe,UAACI,MAAD,EAAY;AACzB,kBAAIM,gBAAuB,GAAG,EAA9B;;AAEA,mBAAK,IAAIC,EAAE,GAAG,CAAd,EAAiBA,EAAE,GAAGZ,WAAW,CAACK,MAAD,CAAX,CAAoBvB,MAA1C,EAAkD8B,EAAE,EAApD,EAAwD;AACtD,oBAAIC,CAAC,GAAGvF,IAAI,CAAC0E,WAAW,CAACK,MAAD,CAAX,CAAoBO,EAApB,CAAD,CAAZ;;AACAzL,gBAAAA,CAAC,CAAC8K,GAAF,CAAMY,CAAC,CAACC,UAAR,EAAoB,UAACC,SAAD,EAAYC,GAAZ,EAAoB;AACtCL,kBAAAA,gBAAgB,CAACJ,IAAjB,CAAsBQ,SAAS,CAAC7K,UAAD,CAAT,GAAsBoH,IAA5C;AACD,iBAFD;AAGD,eARwB,CAUzB;;;AAEAqD,cAAAA,gBAAgB,GAAGxL,CAAC,CAAC8L,IAAF,CAAON,gBAAP,CAAnB,CAZyB,CAczB;;AAEAD,cAAAA,qBAAqB,CAACL,MAAD,CAArB,GAAgC,EAAhC;;AACA,mBAAK,IAAIF,CAAC,GAAGQ,gBAAgB,CAAC7B,MAAjB,GAAwB,CAArC,EAAyCqB,CAAC,IAAE,CAA5C,EAA+CA,CAAC,EAAhD,EAAqD;AACnD,oBAAIe,IAAI,GAAGP,gBAAgB,CAACR,CAAD,CAA3B;AACA,oBAAIgB,MAAM,GAAG,CAAb;;AACA,oBAAID,IAAI,GAAG,CAAX,EAAc;AACZC,kBAAAA,MAAM,GAAGD,IAAI,GAAGjE,UAAhB;AACD,iBAFD,MAEO;AACL,sBAAIkD,CAAC,GAAC,CAAF,IAAO,CAAX,EAAc;AACZ;AACAgB,oBAAAA,MAAM,GAAGR,gBAAgB,CAACR,CAAC,GAAC,CAAH,CAAhB,GAAsB,CAA/B,CAFY,CAGZ;;AACA,wBAAIiB,OAAO,GAAGF,IAAI,GAAGjE,UAArB;;AACA,wBAAIkE,MAAM,GAAGC,OAAb,EAAsB;AACpBD,sBAAAA,MAAM,GAAGC,OAAT;AACD;AACF;AACF;;AACDV,gBAAAA,qBAAqB,CAACL,MAAD,CAArB,CAA8Ba,IAA9B,IAAsC,CAACC,MAAD,EAASD,IAAT,CAAtC;AACD;AACF,aAnCD,EA3CiH,CAgFjH;AAEA;AACA;AACA;;AACAV,YAAAA,UAAU,CAACP,GAAX,CAAe,UAACI,MAAD,EAAY;AACzB,kBAAIgB,kBAAyB,GAAG,EAAhC;AAEA,kBAAIC,MAAM,GAAGlE,EAAE,GAACE,IAAhB;;AAEA,kBAAIuC,gBAAJ,EAAsB;AACpB,oBAAI0B,SAAS,GAAG,IAAI3L,MAAJ,EAAhB;AACA2L,gBAAAA,SAAS,CAACnB,MAAV,GAAmBC,MAAnB;AACAkB,gBAAAA,SAAS,CAACC,KAAV,GAAkBF,MAAlB;AACAC,gBAAAA,SAAS,CAACE,OAAV,GAAoBH,MAApB;AACAC,gBAAAA,SAAS,CAACG,MAAV,GAAmB,EAAnB;AACAH,gBAAAA,SAAS,CAACI,UAAV,GAAuB,IAAvB;;AACA,oBAAIjB,qBAAqB,CAACL,MAAD,CAArB,CAA8BC,cAA9B,CAA6CgB,MAA7C,CAAJ,EAA0D;AACxDC,kBAAAA,SAAS,CAACE,OAAV,GAAoBf,qBAAqB,CAACL,MAAD,CAArB,CAA8BiB,MAA9B,EAAsC,CAAtC,CAApB;AACAA,kBAAAA,MAAM,GAAGC,SAAS,CAACE,OAAnB;AACD;;AACDF,gBAAAA,SAAS,CAACnE,EAAV,GAAemE,SAAS,CAACC,KAAV,GAAgBlE,IAA/B;AACAiE,gBAAAA,SAAS,CAACjE,IAAV,GAAiBiE,SAAS,CAACE,OAAV,GAAkBnE,IAAnC;AACA+D,gBAAAA,kBAAkB,CAACd,IAAnB,CAAwBgB,SAAxB;AACD;;AAED,kBAAIP,GAAG,GAAG,CAAV;AACA,kBAAIY,UAAkB,GAAG,CAAzB;;AACA,qBAAOA,UAAU,IAAI,CAArB,EAAwB;AACtB,oBAAIC,CAAC,GAAG,IAAIjM,MAAJ,EAAR;AACAiM,gBAAAA,CAAC,CAACzB,MAAF,GAAWC,MAAX;AACAwB,gBAAAA,CAAC,CAACL,KAAF,GAAUF,MAAM,GAAGN,GAAG,GAAC/D,UAAvB;AACA4E,gBAAAA,CAAC,CAACJ,OAAF,GAAYH,MAAM,GAAI,CAACN,GAAG,GAAC,CAAL,IAAU/D,UAAhC;AACA4E,gBAAAA,CAAC,CAACzE,EAAF,GAAOyE,CAAC,CAACL,KAAF,GAAQlE,IAAf;AACAuE,gBAAAA,CAAC,CAACvE,IAAF,GAASuE,CAAC,CAACJ,OAAF,GAAUnE,IAAnB;AACAuE,gBAAAA,CAAC,CAACH,MAAF,GAAW,EAAX;AACAE,gBAAAA,UAAU,GAAGC,CAAC,CAACJ,OAAf;AACAJ,gBAAAA,kBAAkB,CAACd,IAAnB,CAAwBsB,CAAxB;AACAb,gBAAAA,GAAG;AACJ;;AAEDK,cAAAA,kBAAkB,CAACpB,GAAnB,CAAuB,UAAC6B,MAAD,EAAS3B,CAAT,EAAe;AACpC2B,gBAAAA,MAAM,CAACC,GAAP,GAAa5B,CAAb;AACD,eAFD;AAIAzB,cAAAA,YAAY,CAACoB,OAAb,CAAqBO,MAArB,IAA+BgB,kBAA/B;AACD,aAzCD,EArFiH,CAgIjH;AAEA;;AACA3C,YAAAA,YAAY,CAACsD,QAAb,GAAwBC,MAAM,CAACC,SAA/B;AACAxD,YAAAA,YAAY,CAACyD,QAAb,GAAwBF,MAAM,CAACG,gBAA/B;AACA5B,YAAAA,UAAU,CAACP,GAAX,CAAe,UAACI,MAAD,EAAY;AACzBL,cAAAA,WAAW,CAACK,MAAD,CAAX,CAAoBJ,GAApB,CAAwB,UAACoC,SAAD,EAAe;AACrC,oBAAIxB,CAAC,GAAGvF,IAAI,CAAC+G,SAAD,CAAZ;AACAxB,gBAAAA,CAAC,CAACC,UAAF,CAAab,GAAb,CAAiB,UAACqC,EAAD,EAAa;AAC5B,uBAAK,IAAInC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGzB,YAAY,CAACoB,OAAb,CAAqBO,MAArB,EAA6BvB,MAAjD,EAAyDqB,CAAC,EAA1D,EAA8D;AAC5D,wBAAIzB,YAAY,CAACoB,OAAb,CAAqBO,MAArB,EAA6BF,CAA7B,EAAgCoC,MAAhC,CAAuCD,EAAE,CAACpM,UAAD,CAAzC,CAAJ,EAA4D;AAC1DwI,sBAAAA,YAAY,CAACoB,OAAb,CAAqBO,MAArB,EAA6BF,CAA7B,EAAgCqC,GAAhC,CAAoCF,EAAE,CAACrM,WAAD,CAAtC;AACD;AACF;AACF,iBAND;AAOD,eATD;AAUAyI,cAAAA,YAAY,CAACoB,OAAb,CAAqBO,MAArB,EAA6BJ,GAA7B,CAAiC,UAAC6B,MAAD,EAAY;AAC3CA,gBAAAA,MAAM,CAACE,QAAP,GAAkB7M,CAAC,CAACsN,GAAF,CAAMX,MAAM,CAACJ,MAAb,CAAlB;AACAI,gBAAAA,MAAM,CAACK,QAAP,GAAkBhN,CAAC,CAACuH,GAAF,CAAMoF,MAAM,CAACJ,MAAb,CAAlB;;AACA,oBAAII,MAAM,CAACE,QAAP,GAAkBtD,YAAY,CAACsD,QAAnC,EAA6C;AAC3CtD,kBAAAA,YAAY,CAACsD,QAAb,GAAwBF,MAAM,CAACE,QAA/B;AACD;;AACD,oBAAIF,MAAM,CAACK,QAAP,GAAkBzD,YAAY,CAACyD,QAAnC,EAA6C;AAC3CzD,kBAAAA,YAAY,CAACyD,QAAb,GAAwBL,MAAM,CAACK,QAA/B;AACD;;AACDL,gBAAAA,MAAM,CAACzL,KAAP,GAAeyL,MAAM,CAACK,QAAtB;;AACA,oBAAIL,MAAM,CAACJ,MAAP,CAAc5C,MAAd,GAAuB,CAA3B,EAA8B;AAC5BJ,kBAAAA,YAAY,CAAC3E,cAAb,GAA8B,IAA9B;AACA+H,kBAAAA,MAAM,CAAC/H,cAAP,GAAwB,IAAxB;AAEA+H,kBAAAA,MAAM,CAACzL,KAAP,GAAe,MAAI,CAACoD,KAAL,CAAWR,iBAAX,IAAgC,CAAC,CAAjC,GAAqC6I,MAAM,CAACJ,MAAP,CAAc,MAAI,CAACjI,KAAL,CAAWR,iBAAzB,CAArC,GAAmF6I,MAAM,CAACK,QAAzG;AACD;AACF,eAhBD;AAiBD,aA5BD;AA8BAzD,YAAAA,YAAY,CAACqB,WAAb,GAA2BkC,MAAM,CAACG,gBAAlC;AACA5B,YAAAA,UAAU,CAACP,GAAX,CAAe,UAACI,MAAD,EAAY;AACzB,kBAAIqC,UAAkB,GAAGhE,YAAY,CAACoB,OAAb,CAAqBO,MAArB,EAA6BvB,MAAtD;;AACA,kBAAI4D,UAAU,GAAGhE,YAAY,CAACqB,WAA9B,EAA2C;AACzCrB,gBAAAA,YAAY,CAACqB,WAAb,GAA2B2C,UAA3B;AACD;AACF,aALD,EApKiH,CA2KjH;;AAEAhE,YAAAA,YAAY,CAACG,OAAb,GAAuB2B,UAAvB;AACA,mBAAO9B,YAAP;AACD;;;;QA3oB6BjJ,gB;;sBAA1BmB,iB,iBACiB,a","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 diff --git a/dist/partials/options_editor.html b/dist/partials/options_editor.html index 563e291..f311b21 100644 --- a/dist/partials/options_editor.html +++ b/dist/partials/options_editor.html @@ -216,4 +216,119 @@
+
+
Filtering
+
+ + +
+
+ +
+
Pagination options
+
+ +
+
+ + +
+
+ +
+
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 f33940e..21fc2bb 100644 --- a/dist/rendering.js +++ b/dist/rendering.js @@ -5,6 +5,14 @@ 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; } @@ -238,7 +246,11 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c height = parseInt(height.replace('px', ''), 10); } - height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! + if (this.panel.usingPagination) { + height -= this.panel.legend.show ? 140 : 10; // 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 ! + } this.$heatmap.css('height', height + 'px'); return true; @@ -305,8 +317,10 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c }, { key: "getYScale", value: function getYScale(ticks) { - 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 + 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 range.push(step); @@ -320,8 +334,10 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c }, { key: "getYAxisScale", value: function getYAxisScale(ticks) { - 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 + 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 range.push(this.yOffset); @@ -334,7 +350,21 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c }, { key: "addYAxis", value: function addYAxis() { - var ticks = this.bucketMatrix.targets; + 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; + if (this.panel.yAxisSort == 'a → z') { ticks.sort(function (a, b) { @@ -424,8 +454,15 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c this.yGridSize = this.chartHeight; - if (this.bucketMatrix.targets.length > 0) { - this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length); + 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); + } } this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0; @@ -581,7 +618,6 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c return w; } // Top y for card. // yScale gives ??? - // }, { key: "getCardY", @@ -845,6 +881,61 @@ System.register(["lodash", "jquery", "moment", "app/core/utils/kbn", "app/core/c 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 @@ -859,7 +950,8 @@ 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; + this.scope.chartTop = this.chartTop; // TODO pagination. Why this needed? + //this.ctrl.cardsData.cards = this.ctrl.cardsDataComplete.slice(); } }, { key: "_renderAnnotations", diff --git a/dist/rendering.js.map b/dist/rendering.js.map index 865db5b..4f76bfd 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","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","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","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 height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend !\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.bucketMatrix.targets;\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.bucketMatrix.targets.length > 0) {\n this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.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.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 // \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 }\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 +{"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 diff --git a/dist/tooltipextraseries.js b/dist/tooltipextraseries.js new file mode 100644 index 0000000..7378e7f --- /dev/null +++ b/dist/tooltipextraseries.js @@ -0,0 +1,248 @@ +"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 new file mode 100644 index 0000000..b005126 --- /dev/null +++ b/dist/tooltipextraseries.js.map @@ -0,0 +1 @@ +{"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 3919578..6e991ae 100644 --- a/src/css/_statusmap.scss +++ b/src/css/_statusmap.scss @@ -102,6 +102,8 @@ width: 70.0rem!important } +.pagination-buttons{text-align: right;} + .status-heatmap-legend-wrapper { margin: 0 10px; diff --git a/src/extra_series_format.ts b/src/extra_series_format.ts new file mode 100644 index 0000000..4d6dea3 --- /dev/null +++ b/src/extra_series_format.ts @@ -0,0 +1,9 @@ +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 97a26d8e4cf53e8b93f74e14c94da3fff0cacf84..b4410a81b0c83c7b40290eeff38f27f5a8e3a17a 100644 GIT binary patch literal 38899 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
38+L)w>#BOOiOPp&tm*T^b)S6*-YE&qwjO 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

s9`16w2aTCB)$}`%Sq~Q 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 W=0tDP75e`(xe7>A5&6nI^nU;n{_XDo literal 34584 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 Y^L&$~kRj*kUpb&4t143_Z5H-_0J9XC&Hw-a literal 10403 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 +

+
+
+ + +
+
@@ -7,8 +16,19 @@ {{ctrl.dataWarnings.noDatapoints.title}}
- -
+
+
+
diff --git a/src/module.ts b/src/module.ts index ed31315..028731e 100644 --- a/src/module.ts +++ b/src/module.ts @@ -78,6 +78,10 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { colorSchemes: any = []; unitFormats: any; + cardsDataComplete: any; + cardsDataLabelsComplete: any; + ticksWhenPaginating: []; + dataWarnings: {[warningId: string]: {title: string, tip: string}} = {}; multipleValues: boolean; noColorDefined: boolean; @@ -88,6 +92,13 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { annotations: object[] = []; annotationsPromise: any; + 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 datasource: null, @@ -132,7 +143,11 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { highlightCards: true, useMax: true, - seriesFilterIndex: -1 + seriesFilterIndex: -1, + usingPagination: false, + pageSize: 15, + allowAllElements: false, + availableValues: [] }; /** @ngInject */ @@ -148,6 +163,11 @@ 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.opacityScales = opacityScales; this.colorModes = colorModes; this.colorSchemes = colorSchemes; @@ -179,7 +199,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.annotations = []; this.annotationsSrv = annotationsSrv; - + this.timeSrv = timeSrv; this.events.on(PanelEvents.render, this.onRender.bind(this)); @@ -199,6 +219,68 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { this.renderingCompleted(); } + changeDefaultPaginationSize(defaultPageSize: number): void { + this.pageSizeViewer = defaultPageSize; + + this.render(); + this.refresh(); + } + + changePaginationSize(): void { + if (this.pageSizeViewer <= 0) { + this.pageSizeViewer = 1; + } + + this.currentPage = 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; + } + + getLastPageElement(): number { + return this.lastPageElement; + } + + setLastPageElement(lastPageElement: number): void { + this.lastPageElement = lastPageElement; + } + // getChartWidth returns an approximation of chart canvas width or // a saved value calculated during a render. getChartWidth():number { @@ -323,6 +405,13 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { 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); + } + if (this.annotationsPromise) { this.annotationsPromise.then( (result: { alertState: any; annotations: any }) => { @@ -338,7 +427,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { () => { this.loading = false; this.annotations = []; - this.render(); + this.render(); // this.render(this.data);??? } ); } else { @@ -354,6 +443,10 @@ 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() { @@ -453,7 +546,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { bucketMatrix.rangeMs = to - from; bucketMatrix.intervalMs = intervalMs; - if (!data || data.length == 0) { + if (!data || data.length == 0) { // Mimic heatmap and graph 'no data' labels. bucketMatrix.targets = [ "1.0", "0.0", "-1.0" @@ -469,7 +562,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { let targetIndex: {[target: string]: number[]} = {}; // Group indicies of elements in data by target (y label). - + // lodash version: //_.map(data, (d, i) => { // targetIndex[d.target] = _.concat(_.toArray(targetIndex[d.target]), i); @@ -577,7 +670,7 @@ class StatusHeatmapCtrl extends MetricsPanelCtrl { }); //console.log ("bucketMatrix: ", bucketMatrix); - + // Put values into buckets. bucketMatrix.minValue = Number.MAX_VALUE; bucketMatrix.maxValue = Number.MIN_SAFE_INTEGER; diff --git a/src/partials/options_editor.html b/src/partials/options_editor.html index 563e291..f311b21 100644 --- a/src/partials/options_editor.html +++ b/src/partials/options_editor.html @@ -216,4 +216,119 @@
+
+
Filtering
+
+ + +
+
+ +
+
Pagination options
+
+ +
+
+ + +
+
+ +
+
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 58c2a53..f6789e1 100644 --- a/src/rendering.ts +++ b/src/rendering.ts @@ -32,7 +32,7 @@ class Statusmap { bucketMatrix: BucketMatrix; timeRange: {from: number, to: number} = {from:0, to:0}; - + constructor() { } @@ -133,7 +133,11 @@ export class StatusmapRenderer { height = parseInt(height.replace('px', ''), 10); } - height -= this.panel.legend.show ? 32 : 10; // bottom padding and space for legend. Change margin in .status-heatmap-color-legend ! + if (this.panel.usingPagination) { + height -= this.panel.legend.show ? 140 : 10; // 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 ! + } this.$heatmap.css('height', height + 'px'); @@ -210,7 +214,9 @@ export class StatusmapRenderer { // divide chart height by ticks for cards drawing getYScale(ticks: any[]) { let range:any[] = []; - let step = this.chartHeight / ticks.length; + //let step = this.chartHeight / ticks.length; + console.log('GETYSCALE - RENDERING', this.ctrl.getPaginationSize()); + let step = this.chartHeight / this.ctrl.getPaginationSize(); // 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++) { @@ -224,7 +230,9 @@ 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; + //let step = this.chartHeight / ticks.length; + console.log('GETYAXISSCALE - RENDERING', this.ctrl.getPaginationSize()); + let step = this.chartHeight / this.ctrl.getPaginationSize(); // 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++) { @@ -236,7 +244,25 @@ export class StatusmapRenderer { } addYAxis() { - let ticks = this.bucketMatrix.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; + if (this.panel.yAxisSort == 'a → z') { ticks.sort((a, b) => a.localeCompare(b, 'en', {ignorePunctuation: false, numeric: true})); @@ -326,9 +352,17 @@ export class StatusmapRenderer { // calculate yOffset for YAxis this.yGridSize = this.chartHeight; - if (this.bucketMatrix.targets.length > 0) { - this.yGridSize = Math.floor(this.chartHeight / this.bucketMatrix.targets.length); + 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); + } } + this.cardHeight = this.yGridSize ? this.yGridSize - this.cardVSpacing : 0; this.yOffset = this.cardHeight / 2; @@ -501,7 +535,6 @@ export class StatusmapRenderer { // Top y for card. // yScale gives ??? - // getCardY(b: Bucket) { return this.yScale(b.yLabel) + this.chartTop - this.cardHeight - this.cardVSpacing/2; } @@ -753,6 +786,67 @@ export class StatusmapRenderer { 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 @@ -767,6 +861,9 @@ 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/tooltipextraseries.ts b/src/tooltipextraseries.ts new file mode 100644 index 0000000..36b2a11 --- /dev/null +++ b/src/tooltipextraseries.ts @@ -0,0 +1,228 @@ +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 From ef4b0e1228f1e1e8a1591bc612f854035dd1b7e1 Mon Sep 17 00:00:00 2001 From: Ivan Mikheykin Date: Mon, 13 Jul 2020 21:06:21 +0300 Subject: [PATCH 2/2] feat: pagination Continuation of PR #93. - reworked layout for pagination controls on graph - use BucketMatrixPager for pagination logic and state --- dist/css/statusmap.dark.css | 9 ++ dist/css/statusmap.dark.css.map | 2 +- dist/css/statusmap.light.css | 9 ++ dist/css/statusmap.light.css.map | 2 +- dist/extra_series_format.js | 28 ---- dist/extra_series_format.js.map | 1 - dist/img/tooltip-editor.png | Bin 38899 -> 34584 bytes dist/img/tooltip-url.png | Bin 8040 -> 10403 bytes dist/module.html | 48 +++--- dist/module.js | 133 +++++----------- dist/module.js.map | 2 +- dist/partials/options_editor.html | 113 +------------- dist/rendering.js | 117 ++------------ dist/rendering.js.map | 2 +- dist/statusmap_data.js | 146 +++++++++++++++++- dist/statusmap_data.js.map | 2 +- dist/tooltipextraseries.js | 248 ------------------------------ dist/tooltipextraseries.js.map | 1 - src/css/_statusmap.scss | 14 ++ src/extra_series_format.ts | 9 -- src/img/tooltip-editor.png | Bin 38899 -> 34584 bytes src/img/tooltip-url.png | Bin 8040 -> 10403 bytes src/module.html | 48 +++--- src/module.ts | 107 +++++-------- src/partials/options_editor.html | 113 +------------- src/rendering.ts | 119 ++------------ src/statusmap_data.ts | 121 ++++++++++++++- src/tooltipextraseries.ts | 228 --------------------------- 28 files changed, 469 insertions(+), 1153 deletions(-) delete mode 100644 dist/extra_series_format.js delete mode 100644 dist/extra_series_format.js.map delete mode 100644 dist/tooltipextraseries.js delete mode 100644 dist/tooltipextraseries.js.map delete mode 100644 src/extra_series_format.ts delete mode 100644 src/tooltipextraseries.ts 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 b4410a81b0c83c7b40290eeff38f27f5a8e3a17a..97a26d8e4cf53e8b93f74e14c94da3fff0cacf84 100644 GIT binary patch literal 34584 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
38+L)w>#BOOiOPp&tm*T^b)S6*-YE&qwjO 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

s9`16w2aTCB)$}`%Sq~Q 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 W=0tDP75e`(xe7>A5&6nI^nU;n{_XDo diff --git a/dist/img/tooltip-url.png b/dist/img/tooltip-url.png index 6966228622bbd6cc11541a1711bb5c38133061c8..cb65c494da58b44ed48d2ddcafae821bebf93117 100644 GIT binary patch literal 10403 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 Y^L&$~kRj*kUpb&4t143_Z5H-_0J9XC&Hw-a 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: "onPrevPage", + value: function onPrevPage() { + this.bucketMatrixPager.switchToPrev(); + this.render(); } }, { - 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: "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 @@ -
-
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":";;;;;;;;;;;;;;;;;;;;;;;AAwBe,WAASA,SAAT,CAAmBC,KAAnB,EAA+BC,IAA/B,EAA0CC,KAA1C,EAAsDC,IAAtD,EAAiE;AAC9E,WAAO,IAAIC,iBAAJ,CAAsBJ,KAAtB,EAA6BC,IAA7B,EAAmCC,KAAnC,EAA0CC,IAA1C,CAAP;AACD;;AAs4BD,WAASE,iBAAT,CAA2BC,KAA3B,EAAkCC,GAAlC,EAAuCC,GAAvC,EAA4C;AAC1C,QAAID,GAAG,IAAIC,GAAP,IAAcF,KAAlB,EAAyB;AACvB,UAAIG,KAAK,GAAGD,GAAG,GAAGD,GAAlB;AACA,UAAIG,UAAU,GAAID,KAAK,GAACH,KAAP,GAAgB,IAAjC;AACA,UAAIK,MAAM,GAAG,QAAb;AACA,UAAIC,OAAO,GAAG,WAAd;;AAEA,UAAIF,UAAU,IAAI,EAAlB,EAAsB;AACpB,eAAO,UAAP;AACD;;AACD,UAAIA,UAAU,IAAI,IAAd,IAAsBD,KAAK,IAAIE,MAAnC,EAA2C;AACzC,eAAO,OAAP;AACD;;AACD,UAAID,UAAU,IAAI,KAAlB,EAAyB;AACvB,eAAO,aAAP;AACD;;AACD,UAAIA,UAAU,IAAI,OAAd,IAAyBD,KAAK,IAAIG,OAAtC,EAA+C;AAC7C,eAAO,OAAP;AACD;;AACD,aAAO,OAAP;AACD;;AAED,WAAO,OAAP;AACD;;qBA/5BuBb,S;;;;AAxBjBc,MAAAA,C;;AACAC,MAAAA,C;;AACAC,MAAAA,M;;AACAC,MAAAA,G;;AACCC,MAAAA,S,gBAAAA,S;AAAWC,MAAAA,U,gBAAAA,U;;AACPC,MAAAA,E;;AACAC,MAAAA,gB;;AACJC,MAAAA,gB,YAAAA,gB;;AACAC,MAAAA,iB,gBAAAA,iB;;AAEoBC,MAAAA,c,WAAAA,c;;AACnBC,MAAAA,U,2BAAAA,U;AAAYC,MAAAA,W,2BAAAA,W;;;AAEjBC,MAAAA,a,GAAgB,C;AAChBC,MAAAA,c,GAAiB,C;AACjBC,MAAAA,c,GAAiB,C;AACjBC,MAAAA,U,GAAa,C;AACbC,MAAAA,wB,GAA2B,G;AAC3BC,MAAAA,sB,GAAyB,G;AACzBC,MAAAA,sB,GAAyB,E;AACzBC,MAAAA,mB,GAAsB,E;AACtBC,MAAAA,mB,GAAsB,C;AACtBC,MAAAA,mB,GAAsB,C;;AAMpBC,MAAAA,S,GAOJ,qBAAc;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,2CAF0B;AAACC,UAAAA,IAAI,EAAC,CAAN;AAASC,UAAAA,EAAE,EAAC;AAAZ,SAE1B;AAEb,O;;mCAGUlC,iB;;;AAoCX,mCAAoBJ,KAApB,EAAwCC,IAAxC,EAAmDC,KAAnD,EAAuEC,IAAvE,EAAgG;AAAA;;AAAA,eAA5EH,KAA4E,GAA5EA,KAA4E;AAAA,eAAxDC,IAAwD,GAAxDA,IAAwD;AAAA,eAAzBE,IAAyB,GAAzBA,IAAyB;;AAAA,yCAnChF,CAmCgF;;AAAA,0CAlC/E,CAkC+E;;AAAA;;AAAA;;AAAA,8CA/B3E,CA+B2E;;AAAA,+CA9B1E,CA8B0E;;AAAA,4CA7B7E,CA6B6E;;AAAA,+CA5B1E,CA4B0E;;AAAA,8CA3B3E,CA2B2E;;AAAA,+CA1B1E,CA0B0E;;AAAA,gDAzBzE,CAyByE;;AAAA,gDAxBzE,CAwByE;;AAAA,6CAvB5E,CAuB4E;;AAAA,6CAtB5E,CAsB4E;;AAAA,8CArB3E,CAqB2E;;AAAA;;AAAA;;AAAA;;AAAA,6CAjB5E,CAiB4E;;AAAA,6CAhB5E,CAgB4E;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,yDAFhE2B,wBAEgE;;AAC9F;AACA,eAAKS,QAAL,GAAgB,KAAKtC,IAAL,CAAUuC,IAAV,CAAe,kBAAf,CAAhB;AACA,eAAKC,OAAL,GAAe,IAAIpB,gBAAJ,CAAqB,KAAKkB,QAA1B,EAAoC,KAAKvC,KAAzC,CAAf;AACA,eAAK0C,iBAAL,GAAyB,IAAIpB,iBAAJ,CAAsB,KAAKiB,QAA3B,EAAqC,KAAKvC,KAA1C,CAAzB;AAEA,eAAK2C,OAAL,GAAe,CAAf;AAEA,eAAKC,SAAL,GAAiB;AACfC,YAAAA,MAAM,EAAE,KADO;AAEfC,YAAAA,EAAE,EAAE,CAAC,CAFU;AAGfC,YAAAA,EAAE,EAAE,CAAC;AAHU,WAAjB;AAMA,eAAKC,OAAL,GAAe;AAAEC,YAAAA,IAAI,EAAE,CAAR;AAAWC,YAAAA,KAAK,EAAE,CAAlB;AAAqBC,YAAAA,GAAG,EAAE,CAA1B;AAA6BC,YAAAA,MAAM,EAAE;AAArC,WAAf;AACA,eAAKC,MAAL,GAAc;AAAEJ,YAAAA,IAAI,EAAE,EAAR;AAAYC,YAAAA,KAAK,EAAE,EAAnB;AAAuBC,YAAAA,GAAG,EAAE,EAA5B;AAAgCC,YAAAA,MAAM,EAAE;AAAxC,WAAd;AAEA,eAAKjD,IAAL,CAAUmD,MAAV,CAAiBC,EAAjB,CAAoB9B,WAAW,CAAC+B,MAAhC,EAAwC,KAAKC,QAAL,CAAcC,IAAd,CAAmB,IAAnB,CAAxC;AAEA,eAAKvD,IAAL,CAAUwD,kBAAV,GAA+B,KAAKA,kBAAL,CAAwBD,IAAxB,CAA6B,IAA7B,CAA/B,CAnB8F,CAqB9F;AACA;AACA;AAEA;;AAEAzC,UAAAA,SAAS,CAACsC,EAAV,CAAc/B,UAAU,CAACoC,UAAzB,EAAqC,KAAKC,YAAL,CAAkBH,IAAlB,CAAuB,IAAvB,CAArC,EAAmE,KAAK1D,KAAxE;AAEAiB,UAAAA,SAAS,CAACsC,EAAV,CAAc/B,UAAU,CAACsC,eAAzB,EAA0C,KAAKC,iBAAL,CAAuBL,IAAvB,CAA4B,IAA5B,CAA1C,EAA6E,KAAK1D,KAAlF,EA7B8F,CA+B9F;;AACA,eAAKuC,QAAL,CAAcgB,EAAd,CAAiB,WAAjB,EAA8B,KAAKS,WAAL,CAAiBN,IAAjB,CAAsB,IAAtB,CAA9B;AACA,eAAKnB,QAAL,CAAcgB,EAAd,CAAiB,WAAjB,EAA8B,KAAKU,WAAL,CAAiBP,IAAjB,CAAsB,IAAtB,CAA9B;AACA,eAAKnB,QAAL,CAAcgB,EAAd,CAAiB,YAAjB,EAA+B,KAAKW,YAAL,CAAkBR,IAAlB,CAAuB,IAAvB,CAA/B;AACA,eAAKnB,QAAL,CAAcgB,EAAd,CAAiB,OAAjB,EAA0B,KAAKY,YAAL,CAAkBT,IAAlB,CAAuB,IAAvB,CAA1B;AACD;;;;8CAEmB;AAClB,iBAAKU,cAAL;AACD;;;uCAEYC,K,EAAqB;AAChC,iBAAKC,mBAAL,CAAyBD,KAAK,CAACE,GAA/B;AACD;;;qCAEU;AACT,iBAAKf,MAAL;AACA,iBAAKrD,IAAL,CAAUqE,kBAAV;AACD;;;6CAG2B;AAC1B,gBAAI;AACF,kBAAIC,MAAM,GAAG,KAAKtE,IAAL,CAAUsE,MAAV,IAAoB,KAAKC,KAAL,CAAWD,MAA/B,IAAyC,KAAKtE,IAAL,CAAUwE,GAAV,CAAcF,MAApE;;AACA,kBAAI5D,CAAC,CAAC+D,QAAF,CAAWH,MAAX,CAAJ,EAAwB;AACtBA,gBAAAA,MAAM,GAAGI,QAAQ,CAACJ,MAAM,CAACK,OAAP,CAAe,IAAf,EAAqB,EAArB,CAAD,EAA2B,EAA3B,CAAjB;AACD;;AAED,kBAAI,KAAKJ,KAAL,CAAWK,eAAf,EAAgC;AAC9BN,gBAAAA,MAAM,IAAI,KAAKC,KAAL,CAAWM,MAAX,CAAkBC,IAAlB,GAAyB,GAAzB,GAA+B,EAAzC,CAD8B,CACe;AAC9C,eAFD,MAEO;AACLR,gBAAAA,MAAM,IAAI,KAAKC,KAAL,CAAWM,MAAX,CAAkBC,IAAlB,GAAyB,EAAzB,GAA8B,EAAxC,CADK,CACuC;AAC7C;;AAED,mBAAK1C,QAAL,CAAc2C,GAAd,CAAkB,QAAlB,EAA4BT,MAAM,GAAG,IAArC;AAEA,qBAAO,IAAP;AACD,aAfD,CAeE,OAAOU,CAAP,EAAU;AAAE;AACZ,qBAAO,KAAP;AACD;AACF;;;wCAEalF,I,EAAmB;AAC/B,gBAAMmF,QAAQ,GAAGnF,IAAI,CAACoF,SAAL,CAAe,cAAf,EAA+BC,KAA/B,EAAjB;;AACA,gBAAMC,YAAY,GAAG1E,CAAC,CAACL,GAAF,CAAMK,CAAC,CAAC2E,GAAF,CAAMJ,QAAN,EAAgB,UAAAK,IAAI,EAAI;AACjD;AACA,qBAAOA,IAAI,CAACC,OAAL,GAAeC,KAAtB;AACD,aAH0B,CAAN,CAArB;;AAKA,mBAAOC,IAAI,CAACC,IAAL,CAAUN,YAAV,CAAP;AACD;;;yCAEctF,I,EAAmB;AAChC,gBAAI6F,QAAQ,GAAG7F,IAAI,CAAC8F,MAAL,CAAY,cAAZ,CAAf;;AACA,gBAAI,CAACD,QAAQ,CAACE,KAAT,EAAL,EAAuB;AACrB,kBAAIC,gBAAgB,GAAGC,UAAU,CAACjG,IAAI,CAAC8F,MAAL,CAAY,cAAZ,EAA4BI,IAA5B,CAAiC,IAAjC,CAAD,CAAjC;AACA,kBAAIC,WAAW,GAAGF,UAAU,CAACjG,IAAI,CAACkG,IAAL,CAAU,QAAV,CAAD,CAA5B;AACA,qBAAOC,WAAW,GAAGH,gBAArB;AACD,aAJD,MAIO;AACL;AACA,qBAAO,EAAP;AACD;AACF;;;qCAEU;AACT;AACA;AACA;AACA;AACA;AACA,iBAAKjG,KAAL,CAAWqG,MAAX,GAAoB,KAAKA,MAAL,GAAclF,EAAE,CAACmF,SAAH,GAC7BC,MAD6B,CACtB,CAAC,KAAKC,SAAL,CAAenE,IAAhB,EAAsB,KAAKmE,SAAL,CAAelE,EAArC,CADsB,EAE7B7B,KAF6B,CAEvB,CAAC,KAAKgG,SAAL,GAAe,CAAhB,EAAmB,KAAKC,UAAL,GAAgB,KAAKD,SAAL,GAAe,CAAlD,CAFuB,CAAlC;AAIA,gBAAInG,KAAK,GAAG,KAAKoG,UAAL,GAAkB3E,sBAA9B;AACA,gBAAI4E,oBAAoB,GAAGtG,iBAAiB,CAACC,KAAD,EAAQ,KAAKkG,SAAL,CAAenE,IAAvB,EAA6B,KAAKmE,SAAL,CAAelE,EAA5C,CAA5C;AACA,gBAAIsE,UAAJ;AACA,gBAAIC,iBAAiB,GAAG,KAAK1G,IAAL,CAAU2G,SAAV,CAAoBC,WAApB,EAAxB;;AACA,gBAAIF,iBAAiB,KAAK,KAA1B,EAAiC;AAC/BD,cAAAA,UAAU,GAAGzF,EAAE,CAAC6F,SAAH,CAAaL,oBAAb,CAAb;AACD,aAFD,MAEO;AACLC,cAAAA,UAAU,GAAGzF,EAAE,CAACyF,UAAH,CAAcD,oBAAd,CAAb;AACD;;AAED,gBAAIM,KAAK,GAAG9F,EAAE,CACT+F,UADO,CACI,KAAKb,MADT,EAEP/F,KAFO,CAEDA,KAFC,EAGP6G,UAHO,CAGIP,UAHJ,EAIPQ,WAJO,CAIKnF,mBAJL,EAKPoF,QALO,CAKE,KAAKC,WALP,CAAZ;AAOA,gBAAIC,IAAI,GAAG,KAAKC,QAAhB,CA3BS,CA2BiB;;AAC1B,gBAAIC,IAAI,GAAG,KAAKC,UAAhB;AAEA,iBAAKC,OAAL,CAAaC,MAAb,CAAoB,GAApB,EACKzB,IADL,CACU,OADV,EACmB,aADnB,EAEKA,IAFL,CAEU,WAFV,EAEuB,eAAesB,IAAf,GAAsB,GAAtB,GAA4BF,IAA5B,GAAmC,GAF1D,EAGKM,IAHL,CAGUZ,KAHV,EA9BS,CAmCT;;AACA,iBAAKU,OAAL,CACK5B,MADL,CACY,SADZ,EAEKA,MAFL,CAEY,SAFZ,EAGK+B,MAHL;AAID,W,CAED;;;;oCACUxH,K,EAAc;AACtB,gBAAIG,KAAW,GAAG,EAAlB,CADsB,CAEtB;;AACAsH,YAAAA,OAAO,CAACC,GAAR,CAAY,uBAAZ,EAAqC,KAAK7H,IAAL,CAAU8H,iBAAV,EAArC;AACA,gBAAIC,IAAI,GAAG,KAAKZ,WAAL,GAAmB,KAAKnH,IAAL,CAAU8H,iBAAV,EAA9B,CAJsB,CAKtB;;AACAxH,YAAAA,KAAK,CAAC0H,IAAN,CAAWD,IAAX;;AACA,iBAAK,IAAIE,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG9H,KAAK,CAAC+H,MAA1B,EAAkCD,CAAC,EAAnC,EAAuC;AACrC3H,cAAAA,KAAK,CAAC0H,IAAN,CAAWD,IAAI,IAAIE,CAAC,GAAC,CAAN,CAAf;AACD;;AACD,mBAAOjH,EAAE,CAACmH,YAAH,GACF/B,MADE,CACKjG,KADL,EAEFG,KAFE,CAEIA,KAFJ,CAAP;AAGD,W,CAED;;;;wCACcH,K,EAAc;AAC1B,gBAAIG,KAAW,GAAG,EAAlB,CAD0B,CAE1B;;AACAsH,YAAAA,OAAO,CAACC,GAAR,CAAY,2BAAZ,EAAyC,KAAK7H,IAAL,CAAU8H,iBAAV,EAAzC;AACA,gBAAIC,IAAI,GAAG,KAAKZ,WAAL,GAAmB,KAAKnH,IAAL,CAAU8H,iBAAV,EAA9B,CAJ0B,CAK1B;;AACAxH,YAAAA,KAAK,CAAC0H,IAAN,CAAW,KAAKxF,OAAhB;;AACA,iBAAK,IAAIyF,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG9H,KAAK,CAAC+H,MAA1B,EAAkCD,CAAC,EAAnC,EAAuC;AACrC3H,cAAAA,KAAK,CAAC0H,IAAN,CAAWD,IAAI,GAAGE,CAAP,GAAW,KAAKzF,OAA3B;AACD;;AACD,mBAAOxB,EAAE,CAACmH,YAAH,GACF/B,MADE,CACKjG,KADL,EAEFG,KAFE,CAEIA,KAFJ,CAAP;AAGD;;;qCAEU;AAET,gBAAIH,KAAJ;;AAEA,gBAAG,KAAKH,IAAL,CAAUoI,mBAAV,KAAkCC,SAAlC,IAA+C,KAAKrI,IAAL,CAAUuE,KAAV,CAAgBK,eAAlE,EAAmF;AACjFzE,cAAAA,KAAK,GAAGO,CAAC,CAAC4H,IAAF,CAAO5H,CAAC,CAAC2E,GAAF,CAAM,KAAKrF,IAAL,CAAUoI,mBAAhB,CAAP,CAAR;AACD,aAFD,MAEO;AACLjI,cAAAA,KAAK,GAAG,KAAKoI,YAAL,CAAkBC,OAA1B,CADK,CAEL;AACD,aATQ,CAWT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,gBAAI,KAAKjE,KAAL,CAAWkE,SAAX,IAAwB,OAA5B,EAAqC;AACnCtI,cAAAA,KAAK,CAACuI,IAAN,CAAW,UAACC,CAAD,EAAIC,CAAJ;AAAA,uBAAUD,CAAC,CAACE,aAAF,CAAgBD,CAAhB,EAAmB,IAAnB,EAAyB;AAACE,kBAAAA,iBAAiB,EAAE,KAApB;AAA2BC,kBAAAA,OAAO,EAAE;AAApC,iBAAzB,CAAV;AAAA,eAAX;AACD,aAFD,MAEO,IAAI,KAAKxE,KAAL,CAAWkE,SAAX,IAAwB,OAA5B,EAAqC;AAC1CtI,cAAAA,KAAK,CAACuI,IAAN,CAAW,UAACE,CAAD,EAAID,CAAJ;AAAA,uBAAUA,CAAC,CAACE,aAAF,CAAgBD,CAAhB,EAAmB,IAAnB,EAAyB;AAACE,kBAAAA,iBAAiB,EAAE,KAApB;AAA2BC,kBAAAA,OAAO,EAAE;AAApC,iBAAzB,CAAV;AAAA,eAAX;AACD;;AAED,gBAAIC,UAAU,GAAG,KAAKC,aAAL,CAAmB9I,KAAnB,CAAjB;AACA,iBAAKN,KAAL,CAAWqJ,MAAX,GAAoB,KAAKA,MAAL,GAAc,KAAKC,SAAL,CAAehJ,KAAf,CAAlC;AAEA,gBAAIiJ,KAAK,GAAGpI,EAAE,CACTqI,QADO,CACEL,UADF,EAEPM,UAFO,CAEInJ,KAFJ,EAGPoJ,aAHO,CAGO,IAAI,KAAK/D,KAHhB,EAIPyB,WAJO,CAIKlF,mBAJL,CAAZ;AAMA,iBAAKyF,OAAL,CACKC,MADL,CACY,GADZ,EAEKzB,IAFL,CAEU,OAFV,EAEmB,aAFnB,EAGK0B,IAHL,CAGU0B,KAHV,EApCS,CAyCT;;AACA,gBAAIhC,IAAI,GAAG,KAAKlE,MAAL,CAAYF,GAAvB;AACA,gBAAIsE,IAAI,GAAG,KAAKkC,aAAL,CAAmB,KAAKhC,OAAxB,IAAmCzF,mBAA9C;AACA,iBAAKyF,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BI,IAA/B,CAAoC,WAApC,EAAiD,eAAesB,IAAf,GAAsB,GAAtB,GAA4BF,IAA5B,GAAmC,GAApF,EA5CS,CA8CT;;AACA,iBAAKI,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BA,MAA/B,CAAsC,SAAtC,EAAiD+B,MAAjD;AACA,iBAAKH,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,YAAzC,EAAuDyC,MAAvD;AACD,W,CAED;;;;yCACevH,G,EAAaC,G,EAAaoJ,Y,EAAsB;AAC7D,gBAAIC,QAAQ,GAAG,CAACrJ,GAAG,IAAI,KAAKsJ,qBAAL,GAA6B,CAAjC,CAAH,GAAyCvJ,GAAG,IAAI,KAAKuJ,qBAAL,GAA6B,CAAjC,CAA7C,IAAoF,CAAnG;AACA,gBAAIC,KAAJ,EAAWC,KAAX;;AAEA,gBAAIJ,YAAY,KAAK,CAArB,EAAwB;AACtBI,cAAAA,KAAK,GAAGxJ,GAAG,GAAG,KAAKsJ,qBAAnB;AACAC,cAAAA,KAAK,GAAGxJ,GAAG,GAAGA,GAAG,IAAI,KAAKuJ,qBAAL,GAA6B,CAAjC,CAAjB;AACAF,cAAAA,YAAY,GAAG,CAACI,KAAK,GAAGD,KAAT,IAAkB,CAAjC;AACD,aAJD,MAIO;AACLC,cAAAA,KAAK,GAAGpE,IAAI,CAACC,IAAL,CAAU,CAACrF,GAAG,GAAGqJ,QAAP,IAAmBD,YAA7B,IAA6CA,YAArD;AACAG,cAAAA,KAAK,GAAGnE,IAAI,CAACqE,KAAL,CAAW,CAAC1J,GAAG,GAAGsJ,QAAP,IAAmBD,YAA9B,IAA8CA,YAAtD;AACD,aAX4D,CAa7D;;;AACA,gBAAIrJ,GAAG,IAAI,CAAP,IAAYwJ,KAAK,GAAG,CAAxB,EAA2B;AACzBA,cAAAA,KAAK,GAAG,CAAR;AACD;;AAED,mBAAO;AAACA,cAAAA,KAAK,EAALA,KAAD;AAAQC,cAAAA,KAAK,EAALA;AAAR,aAAP;AACD;;;6CAEkBE,Q,EAAiC;AAAA,gBAAvBC,cAAuB,uEAAN,IAAM;AAClD,gBAAIC,MAAM,GAAG,KAAK1F,KAAL,CAAW6E,KAAX,CAAiBa,MAA9B;AACA,mBAAO,UAASC,KAAT,EAAgB;AACrB,qBAAOrJ,GAAG,CAACsJ,YAAJ,CAAiBF,MAAjB,EAAyBC,KAAzB,EAAgCH,QAAhC,EAA0CC,cAA1C,CAAP;AACD,aAFD;AAGD,W,CAED;AACA;;;;+CACqB;AACnB,gBAAII,YAAY,GAAG,KAAKhI,QAAL,CAAc,CAAd,CAAnB;AAEA,iBAAKoD,KAAL,GAAaC,IAAI,CAACqE,KAAL,CAAW,KAAK1H,QAAL,CAAcoD,KAAd,EAAX,IAAoC,KAAK3C,OAAL,CAAaE,KAA9D;AACA,iBAAKuB,MAAL,GAAcmB,IAAI,CAACqE,KAAL,CAAW,KAAK1H,QAAL,CAAckC,MAAd,EAAX,IAAqC,KAAKzB,OAAL,CAAaI,MAAhE;;AAEA,gBAAI,KAAKuE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAaG,MAAb;AACD,aARkB,CAUnB;AACA;;;AACA,iBAAKH,OAAL,GAAexG,EAAE,CAAC4E,MAAH,CAAUwE,YAAV,EACVC,MADU,CACH,KADG,EACG,cADH,EAEVrE,IAFU,CAEL,OAFK,EAEI,KAAKR,KAFT,EAGVQ,IAHU,CAGL,QAHK,EAGK,KAAK1B,MAHV,CAAf;AAKA,iBAAK6C,WAAL,GAAmB,KAAK7C,MAAL,GAAc,KAAKpB,MAAL,CAAYF,GAA1B,GAAgC,KAAKE,MAAL,CAAYD,MAA/D;AACA,iBAAKoE,QAAL,GAAgB,KAAKnE,MAAL,CAAYF,GAA5B;AACA,iBAAKsH,WAAL,GAAmB,KAAKjD,QAAL,GAAgB,KAAKF,WAAxC;AAEA,iBAAKoD,YAAL,GAAoB,KAAKhG,KAAL,CAAWiG,KAAX,CAAiBD,YAAjB,KAAkC,IAAlC,GAAyC,KAAKhG,KAAL,CAAWiG,KAAX,CAAiBD,YAA1D,GAAyE/I,cAA7F;AACA,iBAAKiJ,YAAL,GAAoB,KAAKlG,KAAL,CAAWiG,KAAX,CAAiBC,YAAjB,KAAkC,IAAlC,GAAyC,KAAKlG,KAAL,CAAWiG,KAAX,CAAiBC,YAA1D,GAAyEhJ,cAA7F;AACA,iBAAKiJ,SAAL,GAAiB,KAAKnG,KAAL,CAAWiG,KAAX,CAAiBE,SAAjB,KAA+B,IAA/B,GAAsC,KAAKnG,KAAL,CAAWiG,KAAX,CAAiBE,SAAvD,GAAmEhJ,UAApF,CAvBmB,CAyBnB;;AACA,iBAAKiJ,SAAL,GAAiB,KAAKxD,WAAtB;;AACA,gBAAI,KAAKnH,IAAL,CAAUuE,KAAV,CAAgBK,eAApB,EAAqC;AACnC;AACA;AACAgD,cAAAA,OAAO,CAACC,GAAR,CAAY,8BAAZ,EAA2C,KAAK7H,IAAL,CAAU8H,iBAAV,EAA3C;AACA,mBAAK6C,SAAL,GAAiBlF,IAAI,CAACqE,KAAL,CAAW,KAAK3C,WAAL,GAAmB,KAAKnH,IAAL,CAAU8H,iBAAV,EAA9B,CAAjB;AACD,aALD,MAKO;AACL,kBAAI,KAAKS,YAAL,CAAkBC,OAAlB,CAA0BN,MAA1B,GAAmC,CAAvC,EAA0C;AACxC,qBAAKyC,SAAL,GAAiBlF,IAAI,CAACqE,KAAL,CAAW,KAAK3C,WAAL,GAAmB,KAAKoB,YAAL,CAAkBC,OAAlB,CAA0BN,MAAxD,CAAjB;AACD;AACF;;AAED,iBAAK0C,UAAL,GAAkB,KAAKD,SAAL,GAAiB,KAAKA,SAAL,GAAiB,KAAKF,YAAvC,GAAsD,CAAxE;AACA,iBAAKjI,OAAL,GAAe,KAAKoI,UAAL,GAAkB,CAAjC;AAEA,iBAAKC,QAAL;AAEA,iBAAKtD,UAAL,GAAkB,KAAKiC,aAAL,CAAmB,KAAKhC,OAAxB,IAAmCzF,mBAArD;AACA,iBAAKwE,UAAL,GAAkB,KAAKf,KAAL,GAAa,KAAK+B,UAAlB,GAA+B,KAAKrE,MAAL,CAAYH,KAA7D,CA5CmB,CA8CnB;AACA;;AACA,iBAAKuD,SAAL,GAAiB,KAAKC,UAAL,IAAmB,KAAKgC,YAAL,CAAkBuC,WAAlB,GAA8B,CAAjD,CAAjB;AACA,iBAAKC,SAAL,GAAiB,KAAKzE,SAAL,GAAiB,KAAKiE,YAAvC;AAEA,iBAAKS,QAAL;AACA,iBAAKC,WAAL,GAAmB,KAAKC,cAAL,CAAoB,KAAK1D,OAAzB,CAAnB;;AAEA,gBAAI,CAAC,KAAKjD,KAAL,CAAW6E,KAAX,CAAiBtE,IAAtB,EAA4B;AAC1B,mBAAK0C,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,MAAzC,EAAiDiG,KAAjD,CAAuD,SAAvD,EAAkE,CAAlE;AACD;;AAED,gBAAI,CAAC,KAAK5G,KAAL,CAAWuC,KAAX,CAAiBhC,IAAtB,EAA4B;AAC1B,mBAAK0C,OAAL,CAAa5B,MAAb,CAAoB,SAApB,EAA+BV,SAA/B,CAAyC,MAAzC,EAAiDiG,KAAjD,CAAuD,SAAvD,EAAkE,CAAlE;AACD;AACF;;;yCAEmB;AAAA;;AAClB,gBAAIC,QAAQ,GAAG,KAAK7G,KAAL,CAAW8G,KAAX,CAAiBhL,GAAjB,IAAwB,KAAKkI,YAAL,CAAkB6C,QAAzD;AACA,gBAAIE,QAAQ,GAAG,KAAK/G,KAAL,CAAW8G,KAAX,CAAiBjL,GAAjB,IAAwB,KAAKmI,YAAL,CAAkB+C,QAAzD;;AAEA,gBAAI,KAAK/G,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,mBAAKC,UAAL,GAAkB,KAAKC,aAAL,CAAmBL,QAAnB,EAA6BE,QAA7B,CAAlB;AACD;;AACD,iBAAKI,eAAL,CAAqBN,QAArB,EAPkB,CASlB;;AACA,iBAAK5D,OAAL,CAAatC,SAAb,CAAuB,sBAAvB,EAA+CyG,IAA/C,CAAoD,KAAKpD,YAAL,CAAkBC,OAAtE,EACGoD,KADH,GAEK1G,SAFL,CAEe,kBAFf,EAGKyG,IAHL,CAGU,UAACE,MAAD;AAAA,qBAAmB,KAAI,CAACtD,YAAL,CAAkBuD,OAAlB,CAA0BD,MAA1B,CAAnB;AAAA,aAHV,EAIKD,KAJL,GAKOnE,MALP,CAKc,MALd,EAMOzB,IANP,CAMY,QANZ,EAMsB,UAAC4C,CAAD;AAAA,qBAAcA,CAAC,CAACmD,EAAhB;AAAA,aANtB,EAOO/F,IAPP,CAOY,KAPZ,EAOmB,UAAC4C,CAAD;AAAA,qBAAcA,CAAC,CAACoD,GAAhB;AAAA,aAPnB,EAQOhG,IARP,CAQY,KARZ,EAQmB,UAAC4C,CAAD;AAAA,qBAAcA,CAAC,CAACqD,MAAhB;AAAA,aARnB,EASOjG,IATP,CASY,GATZ,EASiB,KAAKkG,QAAL,CAAc3I,IAAd,CAAmB,IAAnB,CATjB,EAUOyC,IAVP,CAUY,OAVZ,EAUqB,KAAKmG,YAAL,CAAkB5I,IAAlB,CAAuB,IAAvB,CAVrB,EAWOyC,IAXP,CAWY,GAXZ,EAWiB,KAAKoG,QAAL,CAAc7I,IAAd,CAAmB,IAAnB,CAXjB,EAYOyC,IAZP,CAYY,QAZZ,EAYsB,KAAKqG,aAAL,CAAmB9I,IAAnB,CAAwB,IAAxB,CAZtB,EAaOyC,IAbP,CAaY,IAbZ,EAakB,KAAK0E,SAbvB,EAcO1E,IAdP,CAcY,IAdZ,EAckB,KAAK0E,SAdvB,EAeO1E,IAfP,CAeY,OAfZ,EAeqB,UAAC4C,CAAD;AAAA,qBAAcA,CAAC,CAAC0D,OAAF,KAAc,YAAd,GAA6B,yBAA3C;AAAA,aAfrB,EAgBOnB,KAhBP,CAgBa,MAhBb,EAgBqB,KAAKoB,YAAL,CAAkBhJ,IAAlB,CAAuB,IAAvB,CAhBrB,EAiBO4H,KAjBP,CAiBa,QAjBb,EAiBuB,KAAKoB,YAAL,CAAkBhJ,IAAlB,CAAuB,IAAvB,CAjBvB,EAkBO4H,KAlBP,CAkBa,cAlBb,EAkB6B,CAlB7B,EAmBM;AACA;AApBN,aAqBOA,KArBP,CAqBa,SArBb,EAqBwB,KAAKqB,cAAL,CAAoBjJ,IAApB,CAAyB,IAAzB,CArBxB,EAVkB,CAiClB;;AACA,gBAAIkJ,MAAM,GAAG,KAAKrK,QAAL,CAAcC,IAAd,CAAmB,6BAAnB,CAAb;AACAoK,YAAAA,MAAM,CACHrJ,EADH,CACM,YADN,EACoB,UAACc,KAAD,EAAW;AAC3B,cAAA,KAAI,CAAC5B,OAAL,CAAaoK,eAAb,GAA+B,IAA/B;;AACA,cAAA,KAAI,CAACC,aAAL,CAAmBzI,KAAnB;AACD,aAJH,EAKGd,EALH,CAKM,YALN,EAKoB,UAACc,KAAD,EAAW;AAC3B,cAAA,KAAI,CAAC5B,OAAL,CAAaoK,eAAb,GAA+B,KAA/B;;AACA,cAAA,KAAI,CAACE,kBAAL,CAAwB1I,KAAxB;AACD,aARH;;AAUA,iBAAK2I,kBAAL;;AAEA,iBAAK7M,IAAL,CAAUmD,MAAV,CAAiB2J,IAAjB,CAAsB1L,cAAtB,EAAsC;AACpC,4BAAc,KAAKmF;AADiB,aAAtC;AAGD;;;wCAEarC,K,EAAO;AACnB,gBAAMmH,KAAK,GAAGrK,EAAE,CAAC4E,MAAH,CAAU1B,KAAK,CAAC2H,MAAhB,EAAwBV,KAAxB,CAA8B,MAA9B,CAAd;AACA,gBAAM4B,cAAc,GAAG/L,EAAE,CAACqK,KAAH,CAASA,KAAT,EAAgB2B,MAAhB,CAAuB,CAAvB,CAAvB;AACA,gBAAMC,WAAW,GAAGjM,EAAE,CAACqK,KAAH,CAASA,KAAT,EAAgB6B,QAAhB,CAAyB,CAAzB,CAApB;AACA,gBAAMC,YAAY,GAAGnM,EAAE,CAAC4E,MAAH,CAAU1B,KAAK,CAAC2H,MAAhB,CAArB;AACA,iBAAKvJ,OAAL,CAAa8K,iBAAb,GAAiC/B,KAAjC;AACA8B,YAAAA,YAAY,CACPhC,KADL,CACW,MADX,EACmB4B,cAAc,CAACM,QAAf,EADnB,EAEKlC,KAFL,CAEW,QAFX,EAEqB8B,WAAW,CAACI,QAAZ,EAFrB,EAGKlC,KAHL,CAGW,cAHX,EAG2B,CAH3B;AAID;;;6CAEkBjH,K,EAAO;AACxBlD,YAAAA,EAAE,CAAC4E,MAAH,CAAU1B,KAAK,CAAC2H,MAAhB,EACGV,KADH,CACS,MADT,EACiB,KAAK7I,OAAL,CAAa8K,iBAD9B,EAEGjC,KAFH,CAES,QAFT,EAEmB,KAAK7I,OAAL,CAAa8K,iBAFhC,EAGGjC,KAHH,CAGS,cAHT,EAGyB,CAHzB;AAID;;;wCAEaC,Q,EAAwB;AAAA,gBAAdE,QAAc,uEAAH,CAAG;;AACpC,gBAAIgC,WAAW,GAAG5M,CAAC,CAAC2B,IAAF,CAAO,KAAKrC,IAAL,CAAUuN,YAAjB,EAA+B;AAACrD,cAAAA,KAAK,EAAE,KAAK3F,KAAL,CAAW8G,KAAX,CAAiBiC;AAAzB,aAA/B,CAAlB;;AACA,gBAAIE,iBAAiB,GAAGvM,gBAAgB,CAACqM,WAAW,CAACpD,KAAb,CAAxC;AACA,gBAAIuD,kBAAkB,GAAGH,WAAW,CAACI,MAAZ,KAAuB,QAAvB,IACpBJ,WAAW,CAACI,MAAZ,KAAuB,MAAvB,IAAiC,CAAC3M,UAAU,CAAC4M,IAAX,CAAgBC,UADvD;AAGA,gBAAIxC,QAAQ,IAAIE,QAAhB,EACEF,QAAQ,GAAGE,QAAQ,GAAG,CAAtB;AAEF,gBAAIuC,KAAK,GAAGJ,kBAAkB,GAAGrC,QAAH,GAAcE,QAA5C;AACA,gBAAIwC,GAAG,GAAGL,kBAAkB,GAAGnC,QAAH,GAAcF,QAA1C;AAEA,mBAAOpK,EAAE,CAAC+M,eAAH,CAAmBP,iBAAnB,EAAsCpH,MAAtC,CAA6C,CAACyH,KAAD,EAAQC,GAAR,CAA7C,CAAP;AACD;;;0CAEe1C,Q,EAAU;AACxB,gBAAI,KAAK7G,KAAL,CAAW8G,KAAX,CAAiBG,UAAjB,KAAgC,QAApC,EAA8C;AAC5C,mBAAKwC,YAAL,GAAoBhN,EAAE,CAACiN,WAAH,GACf7H,MADe,CACR,CAAC,CAAD,EAAIgF,QAAJ,CADQ,EAEf9K,KAFe,CAET,CAAC,CAAD,EAAI,CAAJ,CAFS,CAApB;AAGD,aAJD,MAIO,IAAI,KAAKiE,KAAL,CAAW8G,KAAX,CAAiBG,UAAjB,KAAgC,MAApC,EAA4C;AACjD,mBAAKwC,YAAL,GAAoBhN,EAAE,CAACkN,QAAH,GAAcC,QAAd,CAAuB,KAAK5J,KAAL,CAAW8G,KAAX,CAAiB8C,QAAxC,EACf/H,MADe,CACR,CAAC,CAAD,EAAIgF,QAAJ,CADQ,EAEf9K,KAFe,CAET,CAAC,CAAD,EAAI,CAAJ,CAFS,CAApB;AAGD;AACF;;;mCAEQsI,C,EAAW;AAClB,gBAAIwF,CAAJ,CADkB,CAElB;AACA;;AACA,gBAAIC,MAAM,GAAIzF,CAAC,CAAC0F,KAAF,GAAU,KAAK/F,YAAL,CAAkBgG,OAA7B,GAAwC,KAAKhI,UAA1D;AACA,gBAAIiI,EAAE,GAAGH,MAAM,GAAG,KAAKtD,SAAL,GAAe,CAAjC;;AAEA,gBAAIyD,EAAE,GAAG,KAAKzD,SAAL,GAAe,CAApB,GAAwB,CAA5B,EAA+B;AAC7BqD,cAAAA,CAAC,GAAG,KAAK7G,UAAL,GAAkB,KAAKgD,YAAL,GAAkB,CAAxC;AACD,aAFD,MAEO;AACL6D,cAAAA,CAAC,GAAG,KAAK7G,UAAL,GAAkBiH,EAAlB,GAAuB,KAAKzD,SAAL,GAAe,CAA1C;AACD;;AAED,mBAAOqD,CAAP;AACD,W,CAED;;;;uCACaxF,C,EAAW;AACtB;AACA,gBAAI6F,CAAJ;AAEA,gBAAIJ,MAAM,GAAIzF,CAAC,CAAC0F,KAAF,GAAU,KAAK/F,YAAL,CAAkBgG,OAA7B,GAAwC,KAAKhI,UAA1D;AACA,gBAAIiI,EAAE,GAAGH,MAAM,GAAG,KAAKtD,SAAL,GAAe,CAAjC,CALsB,CAMtB;;AAEA,gBAAIyD,EAAE,GAAG,KAAKzD,SAAL,GAAe,CAAxB,EAA2B;AACzB;AACA;AACA,kBAAI2D,YAAY,GAAIF,EAAE,GAAG,KAAKjE,YAAL,GAAkB,CAAxB,GAA6B,KAAKQ,SAAL,GAAe,CAA/D;AACA0D,cAAAA,CAAC,GAAGC,YAAY,GAAG,CAAf,GAAmBA,YAAnB,GAAkC,CAAtC;AACD,aALD,MAKO,IAAI,KAAKnI,UAAL,GAAkBiI,EAAlB,GAAuB,KAAKzD,SAAL,GAAe,CAA1C,EAA6C;AAClD;AACA0D,cAAAA,CAAC,GAAG,KAAK1D,SAAL,GAAe,CAAf,IAAoB,KAAKxE,UAAL,GAAkBiI,EAAlB,GAAuB,KAAKjE,YAAL,GAAkB,CAA7D,CAAJ;AACD,aAHM,MAGA;AACLkE,cAAAA,CAAC,GAAG,KAAK1D,SAAT;AACD,aAlBqB,CAoBtB;;;AACA0D,YAAAA,CAAC,GAAGhJ,IAAI,CAACpF,GAAL,CAASoO,CAAT,EAAYlN,aAAZ,CAAJ;;AAEA,gBAAI,KAAKgJ,YAAL,IAAqB,CAAzB,EAA4B;AAC1BkE,cAAAA,CAAC,GAAGA,CAAC,GAAC,CAAN;AACD;;AAED,mBAAOA,CAAP;AACD,W,CAED;AACA;;;;mCACS7F,C,EAAW;AAClB,mBAAO,KAAKM,MAAL,CAAYN,CAAC,CAACqD,MAAd,IAAwB,KAAK5E,QAA7B,GAAwC,KAAKuD,UAA7C,GAA0D,KAAKH,YAAL,GAAkB,CAAnF;AACD;;;wCAEa7B,C,EAAW;AACvB;AACA,gBAAI+F,EAAE,GAAG,KAAKzF,MAAL,CAAYN,CAAC,CAACqD,MAAd,CAAT;AACA,gBAAI2C,CAAC,GAAGD,EAAE,GAAG,KAAKtH,QAAV,GAAqB,KAAKuD,UAA1B,GAAuC,KAAKH,YAAL,GAAkB,CAAjE;AACA,gBAAIoE,CAAC,GAAG,KAAKjE,UAAb,CAJuB,CAMvB;;AACA,gBAAIgE,CAAC,GAAG,KAAKvH,QAAb,EAAuB;AACrBwH,cAAAA,CAAC,GAAGF,EAAE,GAAG,KAAKlE,YAAL,GAAkB,CAA3B;AACD,aAFD,MAEO,IAAIkE,EAAE,GAAG,KAAKrE,WAAd,EAA2B;AAChCuE,cAAAA,CAAC,GAAG,KAAKvE,WAAL,GAAmBsE,CAAvB;AACD,aAFM,MAEA,IAAIA,CAAC,GAAG,KAAKhE,UAAT,GAAsB,KAAKN,WAA/B,EAA4C;AACjDuE,cAAAA,CAAC,GAAG,KAAKvE,WAAL,GAAmBsE,CAAvB;AACD,aAbsB,CAevB;;;AACAC,YAAAA,CAAC,GAAGpJ,IAAI,CAACrF,GAAL,CAASyO,CAAT,EAAY,KAAK1H,WAAjB,CAAJ,CAhBuB,CAiBvB;;AACA0H,YAAAA,CAAC,GAAGpJ,IAAI,CAACpF,GAAL,CAASwO,CAAT,EAAYtN,aAAZ,CAAJ;;AAEA,gBAAI,KAAKkJ,YAAL,IAAqB,CAAzB,EAA4B;AAC1BoE,cAAAA,CAAC,GAAGA,CAAC,GAAC,CAAN;AACD;;AAED,mBAAOA,CAAP;AACD;;;uCAEYC,M,EAAgB;AAC3B,gBAAI,KAAKvK,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,SAA9B,EAAyC;AACvC,qBAAO,KAAKhH,KAAL,CAAW8G,KAAX,CAAiB0D,SAAxB;AACD,aAFD,MAEO,IAAI,KAAKxK,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AAC/C,qBAAO,KAAKC,UAAL,CAAgBsD,MAAM,CAAC5E,KAAvB,CAAP;AACD,aAFM,MAEA,IAAI,KAAK3F,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AAC/C,kBAAI,KAAKhH,KAAL,CAAWyK,iBAAX,IAAgC,IAAhC,IAAwC,KAAKzK,KAAL,CAAWyK,iBAAX,IAAgC,CAAC,CAA7E,EAAgF;AAC9E,uBAAO,KAAKhP,IAAL,CAAUiP,mBAAV,CAA8BC,oBAA9B,CAAmDJ,MAAM,CAACK,MAAP,CAAc,KAAK5K,KAAL,CAAWyK,iBAAzB,CAAnD,CAAP;AACD,eAFD,MAEO;AACL,uBAAO,KAAKhP,IAAL,CAAUiP,mBAAV,CAA8BG,cAA9B,CAA6CN,MAAM,CAACK,MAApD,CAAP;AACD;AACF;AACF;;;yCAEcL,M,EAAgB;AAC7B,gBAAI,KAAKvK,KAAL,CAAW8K,aAAX,KAA6B,UAA7B,IAA2CP,MAAM,CAAC5E,KAAP,IAAgB,IAA/D,EAAsE;AACpE,qBAAO,CAAP;AACD;;AACD,gBAAI,KAAK3F,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,SAA9B,EAAyC;AACvC,qBAAO,KAAKyC,YAAL,CAAkBc,MAAM,CAAC5E,KAAzB,CAAP;AACD,aAFD,MAEO;AACL,qBAAO,CAAP;AACD;AACF;;;6CAEkBtB,C,EAAW;AAC5B,gBAAI,KAAKrE,KAAL,CAAW8G,KAAX,CAAiBE,IAAjB,KAA0B,UAA9B,EAA0C;AACxC,qBAAO,GAAP;AACD;;AACD,mBAAO,GAAP;AACD,W,CAGD;AACA;AACA;;;;yCAEerH,K,EAAO;AACpB,gBAAMoL,UAAU,GAAG,KAAKlN,QAAL,CAAcmN,MAAd,EAAnB;AACA,gBAAMnB,CAAC,GAAG3I,IAAI,CAACqE,KAAL,CAAW5F,KAAK,CAACsL,OAAN,GAAgBF,UAAU,CAACxM,IAAtC,CAAV;AACA,gBAAM8L,CAAC,GAAGnJ,IAAI,CAACqE,KAAL,CAAW5F,KAAK,CAACuL,OAAN,GAAgBH,UAAU,CAACtM,GAAtC,CAAV;AACA,mBAAO;AAAEoL,cAAAA,CAAC,EAADA,CAAF;AAAKQ,cAAAA,CAAC,EAADA;AAAL,aAAP;AACD;;;sCAEW1K,K,EAAO;AAAA;;AACjB,gBAAMqL,MAAM,GAAG,KAAKG,cAAL,CAAoBxL,KAApB,CAAf;AACA,iBAAKzB,SAAL,CAAeC,MAAf,GAAwB,IAAxB;AACA,iBAAKD,SAAL,CAAeE,EAAf,GAAoB4M,MAAM,CAACnB,CAA3B;;AAEA,iBAAKuB,cAAL,GAAsB,YAAM;AAC1B,cAAA,MAAI,CAACC,SAAL;AACD,aAFD;;AAIAjP,YAAAA,CAAC,CAACkP,QAAD,CAAD,CAAYC,GAAZ,CAAgB,SAAhB,EAA2B,KAAKH,cAAL,CAAoBpM,IAApB,CAAyB,IAAzB,CAA3B;AACD;;;sCAEW;AACV5C,YAAAA,CAAC,CAACkP,QAAD,CAAD,CAAYE,MAAZ,CAAmB,SAAnB,EAA8B,KAAKJ,cAAL,CAAoBpM,IAApB,CAAyB,IAAzB,CAA9B;AACA,iBAAKoM,cAAL,GAAsB,IAAtB;AACA,iBAAKlN,SAAL,CAAeC,MAAf,GAAwB,KAAxB;AAEA,gBAAIsN,cAAc,GAAGvK,IAAI,CAACwK,GAAL,CAAS,KAAKxN,SAAL,CAAeG,EAAf,GAAoB,KAAKH,SAAL,CAAeE,EAA5C,CAArB;;AACA,gBAAI,KAAKF,SAAL,CAAeG,EAAf,IAAqB,CAArB,IAA0BoN,cAAc,GAAGhO,mBAA/C,EAAoE;AAClE,kBAAIkO,QAAQ,GAAG,KAAKhK,MAAL,CAAYwH,MAAZ,CAAmBjI,IAAI,CAACrF,GAAL,CAAS,KAAKqC,SAAL,CAAeE,EAAxB,EAA4B,KAAKF,SAAL,CAAeG,EAA3C,IAAiD,KAAK2E,UAAtD,GAAmE,KAAKjB,SAAL,GAAe,CAArG,CAAf;AACA,kBAAI6J,MAAM,GAAG,KAAKjK,MAAL,CAAYwH,MAAZ,CAAmBjI,IAAI,CAACpF,GAAL,CAAS,KAAKoC,SAAL,CAAeE,EAAxB,EAA4B,KAAKF,SAAL,CAAeG,EAA3C,IAAiD,KAAK2E,UAAtD,GAAmE,KAAKjB,SAAL,GAAe,CAArG,CAAb;AAEA,mBAAKtG,IAAL,CAAUoQ,OAAV,CAAkBC,OAAlB,CAA0B;AACxBnO,gBAAAA,IAAI,EAAEtB,MAAM,CAAC0P,GAAP,CAAWJ,QAAX,CADkB;AAExB/N,gBAAAA,EAAE,EAAEvB,MAAM,CAAC0P,GAAP,CAAWH,MAAX;AAFoB,eAA1B;AAID;;AAED,iBAAKI,cAAL;AACD;;;uCAEYvL,C,EAAG;AACdlE,YAAAA,SAAS,CAACgM,IAAV,CAAezL,UAAU,CAACsC,eAA1B;AACA,iBAAKM,cAAL;AACA,iBAAK1B,iBAAL,CAAuBiO,OAAvB;AACD;;;sCAEWtM,K,EAAmB;AAC7B,gBAAI,CAAC,KAAKsD,OAAV,EAAmB;AAAE;AAAS;;AAE9B,gBAAM+H,MAAM,GAAG,KAAKG,cAAL,CAAoBxL,KAApB,CAAf;;AACA,gBAAI,KAAKzB,SAAL,CAAeC,MAAnB,EAA2B;AACzB;AACA,mBAAKuB,cAAL;AACA,mBAAK3B,OAAL,CAAakO,OAAb;AACA,mBAAKjO,iBAAL,CAAuBiO,OAAvB;AAEA,mBAAK/N,SAAL,CAAeG,EAAf,GAAoB,KAAK6N,cAAL,CAAoBvM,KAAK,CAACwM,OAA1B,CAApB;AACA,mBAAKC,aAAL,CAAmB,KAAKlO,SAAL,CAAeE,EAAlC,EAAsC,KAAKF,SAAL,CAAeG,EAArD;AACD,aARD,MAQO;AACL;AACA,mBAAKgO,mBAAL,CAAyB1M,KAAzB;AACA,mBAAK2M,aAAL,CAAmBtB,MAAM,CAACnB,CAA1B;AACA,mBAAK9L,OAAL,CAAawC,IAAb,CAAkBZ,KAAlB;AACA,mBAAK3B,iBAAL,CAAuBuC,IAAvB,CAA4BZ,KAA5B;AACD;AACF,W,CAED;;;;uCACoBc,C,EAAe;AACjC,gBAAI,KAAKhF,IAAL,CAAUuE,KAAV,CAAgBjC,OAAhB,CAAwBwO,aAA5B,EAA2C;AACzC,mBAAKxO,OAAL,CAAayO,UAAb,CAAwB/L,CAAxB;AACA,mBAAK1C,OAAL,CAAakO,OAAb;AACD;AACF;;;sCAEWtM,K,EAAOqL,M,EAAQ;AACzB,gBAAMnB,CAAC,GAAG,KAAKlI,MAAL,CAAYwH,MAAZ,CAAmB6B,MAAM,CAACnB,CAAP,GAAW,KAAK7G,UAAnC,EAA+CyJ,OAA/C,EAAV;AACA,gBAAMpC,CAAC,GAAG,KAAK1F,MAAL,CAAYwE,MAAZ,CAAmB6B,MAAM,CAACX,CAAP,GAAW,KAAKvH,QAAnC,CAAV;AACA,gBAAMjD,GAAG,GAAG;AACV6M,cAAAA,KAAK,EAAE/M,KAAK,CAAC+M,KADH;AAEVC,cAAAA,KAAK,EAAEhN,KAAK,CAACgN,KAFH;AAGV9C,cAAAA,CAAC,EAAEA,CAHO;AAIVzL,cAAAA,EAAE,EAAEyL,CAJM;AAKVQ,cAAAA,CAAC,EAAEA,CALO;AAMVuC,cAAAA,EAAE,EAAEvC,CANM;AAOVwC,cAAAA,SAAS,EAAE,IAPD;AAQV7B,cAAAA,MAAM,EAANA;AARU,aAAZ;AAWA,mBAAOnL,GAAP;AACD;;;8CAEmBF,K,EAAO;AACzB,gBAAIkK,CAAC,GAAG,KAAKlI,MAAL,CAAYwH,MAAZ,CAAmBxJ,KAAK,CAACwM,OAAN,GAAgB,KAAKnJ,UAArB,GAAkC,KAAKjB,SAAL,GAAe,CAApE,EAAuE0K,OAAvE,EAAR;AACA,gBAAIpC,CAAC,GAAG,KAAK1F,MAAL,CAAYhF,KAAK,CAACmN,OAAlB,CAAR;AACA,gBAAIjN,GAAG,GAAG;AACR6M,cAAAA,KAAK,EAAE/M,KAAK,CAAC+M,KADL;AAERC,cAAAA,KAAK,EAAEhN,KAAK,CAACgN,KAFL;AAGR9C,cAAAA,CAAC,EAAEA,CAHK;AAGFzL,cAAAA,EAAE,EAAEyL,CAHF;AAIRQ,cAAAA,CAAC,EAAEA,CAJK;AAIFuC,cAAAA,EAAE,EAAEvC,CAJF;AAKRwC,cAAAA,SAAS,EAAE;AALH,aAAV,CAHyB,CAWzB;;AACAhN,YAAAA,GAAG,CAACgN,SAAJ,GAAgB3L,IAAI,CAACpF,GAAL,CAAS6D,KAAK,CAACmN,OAAN,GAAgB,KAAK/M,MAA9B,EAAsC,KAAtC,CAAhB,CAZyB,CAczB;;AACAxD,YAAAA,SAAS,CAACgM,IAAV,CAAezL,UAAU,CAACoC,UAA1B,EAAsC;AAACW,cAAAA,GAAG,EAAEA,GAAN;AAAWG,cAAAA,KAAK,EAAE,KAAKA;AAAvB,aAAtC;AACD;;;yCAEc3B,E,EAAI;AACjBA,YAAAA,EAAE,GAAG6C,IAAI,CAACpF,GAAL,CAASuC,EAAT,EAAa,KAAK2E,UAAlB,CAAL;AACA3E,YAAAA,EAAE,GAAG6C,IAAI,CAACrF,GAAL,CAASwC,EAAT,EAAa,KAAK2D,UAAL,GAAkB,KAAKgB,UAApC,CAAL;AACA,mBAAO3E,EAAP;AACD;;;wCAEa0O,K,EAAOC,K,EAAO;AAC1B,gBAAI,KAAK/J,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AACA,kBAAI6J,UAAU,GAAG/L,IAAI,CAACrF,GAAL,CAASkR,KAAT,EAAgBC,KAAhB,CAAjB;AACA,kBAAIE,cAAc,GAAGhM,IAAI,CAACwK,GAAL,CAASqB,KAAK,GAAGC,KAAjB,CAArB;;AAEA,kBAAIE,cAAc,GAAGzP,mBAArB,EAA0C;AACxC,qBAAKwF,OAAL,CAAaC,MAAb,CAAoB,MAApB,EACCzB,IADD,CACM,OADN,EACe,0BADf,EAECA,IAFD,CAEM,GAFN,EAEWwL,UAFX,EAGCxL,IAHD,CAGM,OAHN,EAGeyL,cAHf,EAICzL,IAJD,CAIM,GAJN,EAIW,KAAKqB,QAJhB,EAKCrB,IALD,CAKM,QALN,EAKgB,KAAKmB,WALrB;AAMD;AACF;AACF;;;2CAEgB;AACf,iBAAK1E,SAAL,CAAeE,EAAf,GAAoB,CAAC,CAArB;AACA,iBAAKF,SAAL,CAAeG,EAAf,GAAoB,CAAC,CAArB;;AAEA,gBAAI,KAAK4E,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AACD;AACF;;;wCAGa+J,Q,EAAU;AACtB,gBAAI,KAAKlK,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AAEA,kBAAIL,IAAI,GAAGoK,QAAX;AACApK,cAAAA,IAAI,GAAG7B,IAAI,CAACpF,GAAL,CAASiH,IAAT,EAAe,KAAKC,UAApB,CAAP;AACAD,cAAAA,IAAI,GAAG7B,IAAI,CAACrF,GAAL,CAASkH,IAAT,EAAe,KAAKf,UAAL,GAAkB,KAAKgB,UAAtC,CAAP;AAEA,mBAAKC,OAAL,CAAaC,MAAb,CAAoB,GAApB,EACGzB,IADH,CACQ,OADR,EACiB,0BADjB,EAEGA,IAFH,CAEQ,WAFR,EAEqB,eAAesB,IAAf,GAAsB,KAF3C,EAGGG,MAHH,CAGU,MAHV,EAIGzB,IAJH,CAIQ,IAJR,EAIc,CAJd,EAKGA,IALH,CAKQ,IALR,EAKc,KAAKqB,QALnB,EAMGrB,IANH,CAMQ,IANR,EAMc,CANd,EAOGA,IAPH,CAOQ,IAPR,EAOc,KAAKsE,WAPnB,EAQGtE,IARH,CAQQ,cARR,EAQwB,CARxB;AASD;AACF,W,CAED;;;;8CACoB5B,G,EAAK;AACvB,gBAAI,KAAKoD,OAAL,IAAgB,KAAKxH,IAAL,CAAU2G,SAAV,CAAoBgL,YAApB,KAAqC,CAAzD,EAA4D;AAC1D,kBAAMrK,IAAI,GAAG,KAAKpB,MAAL,CAAY9B,GAAG,CAACgK,CAAhB,IAAqB,KAAK7G,UAAvC;AACA,mBAAKsJ,aAAL,CAAmBvJ,IAAnB;AACD;AACF;;;2CAEgB;AACf,gBAAI,KAAKE,OAAT,EAAkB;AAChB,mBAAKA,OAAL,CAAatC,SAAb,CAAuB,2BAAvB,EAAoDyC,MAApD;AACD;AACF;;;mCAGQ;AACP,iBAAKpD,KAAL,GAAa,KAAKvE,IAAL,CAAUuE,KAAvB;AACA,iBAAK8B,SAAL,GAAiB,KAAKrG,IAAL,CAAUM,KAA3B;AACA,iBAAKiI,YAAL,GAAoB,KAAKvI,IAAL,CAAUuI,YAA9B;;AAEA,gBAAI,CAAC,KAAKA,YAAN,IAAsB,CAAC,KAAKqJ,gBAAL,EAA3B,EAAoD;AAClD;AACD,aAFD,MAEO;AACL;AACA,mBAAK5R,IAAL,CAAU6R,iBAAV,GAA8B,KAAK7R,IAAL,CAAUuI,YAAV,CAAuBuD,OAArD;;AAEA,kBAAG,KAAK9L,IAAL,CAAUuE,KAAV,CAAgBK,eAAnB,EAAoC;AAClC,oBAAI,CAAC,KAAK2D,YAAL,CAAkBC,OAAvB,EAAgC;AAC9B;AACD;;AAED,qBAAKxI,IAAL,CAAU8R,mBAAV,CAA+B,KAAK9R,IAAL,CAAU+R,cAAV,KAA2B,KAAK/R,IAAL,CAAU8H,iBAAV,EAA5B,GAA2D,CAAzF;AAEA,oBAAIkK,KAAK,GAAG,KAAKhS,IAAL,CAAUiS,gBAAV,EAAZ;AAEArK,gBAAAA,OAAO,CAACC,GAAR,CAAY,mCAAZ,EAAiDmK,KAAjD;;AACA,oBAAIA,KAAK,GAAG,KAAKhS,IAAL,CAAUkS,mBAAV,EAAZ,EAA6C;AAC3C,uBAAKlS,IAAL,CAAUmS,cAAV,CAAyB,CAAzB;AACA,uBAAK9O,MAAL;AACD;;AAED,oBAAI,KAAKrD,IAAL,CAAU8H,iBAAV,MAAiC,KAAK9H,IAAL,CAAUiS,gBAAV,EAArC,EAAmE;AACjE,uBAAKjS,IAAL,CAAUoS,kBAAV,CAA6B,KAAKpS,IAAL,CAAUiS,gBAAV,EAA7B;AACD,iBAFD,MAEO;AACL,sBAAK,KAAKjS,IAAL,CAAU+R,cAAV,KAA2B,CAA5B,KAAmC,KAAK/R,IAAL,CAAUqS,gBAAV,EAAnC,IAAoE,KAAKrS,IAAL,CAAU+R,cAAV,KAA2B,CAAnG,EAAuG;AACrG,yBAAK/R,IAAL,CAAUoS,kBAAV,CAA6B,KAAKpS,IAAL,CAAUiS,gBAAV,EAA7B;AACD,mBAFD,MAEO;AACL,yBAAKjS,IAAL,CAAUoS,kBAAV,CAA8B,KAAKpS,IAAL,CAAU+R,cAAV,KAA6B,KAAK/R,IAAL,CAAU8H,iBAAV,EAA9B,GAA6D,KAAK9H,IAAL,CAAU8H,iBAAV,EAA1F;AACD;AACF;;AAED,oBAAIwK,SAAS,GAAG,KAAKtS,IAAL,CAAUuI,YAAV,CAAuBC,OAAvB,CAA+B+J,KAA/B,CAAqC,KAAKvS,IAAL,CAAU8H,iBAAV,KAA8B,KAAK9H,IAAL,CAAU+R,cAAV,EAAnE,EACb,KAAK/R,IAAL,CAAU8H,iBAAV,KAA8B,KAAK9H,IAAL,CAAU+R,cAAV,EAA/B,GAA2D,KAAK/R,IAAL,CAAU8H,iBAAV,EAD7C,CAAhB;AAGA,oBAAI0K,WAAW,GAAG,EAAlB;AACA,oBAAIC,YAAY,GAAG,EAAnB,CA7BkC,CA+BlC;;AACA,qBAAK,IAAIxK,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKyK,SAAL,CAAelI,KAAf,CAAqBtC,MAAzC,EAAiDD,CAAC,EAAlD,EAAsD;AACpD,sBAAM0K,IAAI,GAAG,KAAKD,SAAL,CAAelI,KAAf,CAAqBvC,CAArB,CAAb;;AAEA,uBAAK,IAAI2K,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGN,SAAS,CAACpK,MAA9B,EAAsC0K,CAAC,EAAvC,EAA2C;AACzC,wBAAM1I,KAAK,GAAGoI,SAAS,CAACM,CAAD,CAAvB;;AAEA,wBAAID,IAAI,CAAC/D,CAAL,KAAW1E,KAAf,EAAsB;AACpBsI,sBAAAA,WAAW,CAACxK,IAAZ,CAAiB2K,IAAjB;AACAF,sBAAAA,YAAY,CAACzK,IAAb,CAAkBkC,KAAlB;AACD;AAEF;AACF;;AAED,oBAAM2I,iBAAiB,sBAAO,IAAIC,GAAJ,CAAQL,YAAR,CAAP,CAAvB;;AAEA,qBAAKC,SAAL,CAAelI,KAAf,GAAuBgI,WAAW,CAACD,KAAZ,EAAvB;AACA,qBAAKvS,IAAL,CAAUoI,mBAAV,GAAgCyK,iBAAhC;AAEAL,gBAAAA,WAAW,GAAGnK,SAAd;AACD,eApDD,MAoDO;AACL,oBAAM0K,QAAQ,GAAG,KAAK/S,IAAL,CAAUuI,YAAV,CAAuBC,OAAvB,CAA+BN,MAAhD;AACA,qBAAKlI,IAAL,CAAU8H,iBAAV,CAA4BiL,QAA5B;AACA,qBAAK/S,IAAL,CAAUoI,mBAAV,GAAgCC,SAAhC;AACD;AACF,aApEM,CAsEP;;;AACA,iBAAK2K,kBAAL;;AACA,gBAAI,KAAKzK,YAAL,CAAkB0K,YAAtB,EAAoC;AAClC;AACD;;AAED,iBAAKC,YAAL;AACA,iBAAKrT,KAAL,CAAW0H,UAAX,GAAwB,KAAKA,UAA7B;AACA,iBAAK1H,KAAL,CAAWoL,WAAX,GAAyB,KAAKA,WAA9B;AACA,iBAAKpL,KAAL,CAAWsH,WAAX,GAAyB,KAAKA,WAA9B;AACA,iBAAKtH,KAAL,CAAW0G,UAAX,GAAwB,KAAKA,UAA7B;AACA,iBAAK1G,KAAL,CAAWwH,QAAX,GAAsB,KAAKA,QAA3B,CAjFO,CAmFP;AACA;AACD;;;+CAEoB;AAAA;;AACnB,gBAAI,CAAC,KAAKrH,IAAL,CAAUmT,WAAX,IAA0B,KAAKnT,IAAL,CAAUmT,WAAV,CAAsBjL,MAAtB,IAAgC,CAA9D,EAAiE;AAC/D;AACD;;AAED,gBAAI,CAAC,KAAKV,OAAV,EAAmB;AACjB;AACD;;AAID,gBAAI4L,QAAQ,GAAG1S,CAAC,CAAC2E,GAAF,CAAM,KAAKrF,IAAL,CAAUmT,WAAhB,EAA6B,UAACE,CAAD,EAAGpL,CAAH;AAAA,qBAAU;AAAC,qBAAKxC,IAAI,CAACqE,KAAL,CAAW,MAAI,CAACvC,UAAL,GAAkB,MAAI,CAACrB,MAAL,CAAYmN,CAAC,CAACC,IAAd,CAA7B,CAAN;AAAyD,sBAAKrL,CAA9D;AAAiE,wBAAQoL,CAAC,CAACE;AAA3E,eAAV;AAAA,aAA7B,CAAf,CAXmB,CAanB;;;AAEA,gBAAIC,IAAI,GAAG,KAAKhM,OAAL,CACNC,MADM,CACC,GADD,EAENzB,IAFM,CAED,OAFC,EAEQ,uBAFR,EAGNA,IAHM,CAGD,WAHC,EAGY,kBAHZ,EAINd,SAJM,CAII,wBAJJ,EAKNyG,IALM,CAKDyH,QALC,EAMNxH,KANM,GAMEnE,MANF,CAMS,GANT,CAAX;AAQA+L,YAAAA,IAAI,CAAC/L,MAAL,CAAY,MAAZ,EACA;AADA,aAEKzB,IAFL,CAEU,IAFV,EAEgB,UAAAqN,CAAC;AAAA,qBAAIA,CAAC,CAACjF,CAAN;AAAA,aAFjB,EAGKpI,IAHL,CAGU,IAHV,EAGgB,KAAKqB,QAHrB,EAIKrB,IAJL,CAIU,IAJV,EAIgB,UAAAqN,CAAC;AAAA,qBAAIA,CAAC,CAACjF,CAAN;AAAA,aAJjB,EAKKpI,IALL,CAKU,IALV,EAKgB,KAAKsE,WALrB,EAMKa,KANL,CAMW,QANX,EAMqB,UAAAkI,CAAC;AAAA,qBAAIA,CAAC,CAACG,IAAF,CAAOC,SAAX;AAAA,aANtB,EAOKtI,KAPL,CAOW,cAPX,EAO2B,CAP3B,EAQKA,KARL,CAQW,kBARX,EAQ+B,KAR/B;AAUAqI,YAAAA,IAAI,CAAC/L,MAAL,CAAY,SAAZ,EACKzB,IADL,CACU,QADV,EACoB,UAAAqN,CAAC;AAAA,qBAAI,CAAC,CAACA,CAAC,CAACjF,CAAH,EAAM,MAAI,CAAC9D,WAAL,GAAiB,CAAvB,CAAD,EAA4B,CAAC+I,CAAC,CAACjF,CAAF,GAAI,CAAL,EAAQ,MAAI,CAAC9D,WAAL,GAAiB,CAAzB,CAA5B,EAAyD,CAAC+I,CAAC,CAACjF,CAAF,GAAI,CAAL,EAAQ,MAAI,CAAC9D,WAAL,GAAiB,CAAzB,CAAzD,EAAsFoJ,IAAtF,CAA2F,GAA3F,CAAJ;AAAA,aADrB,EAEKvI,KAFL,CAEW,cAFX,EAE2B,CAF3B,EAGKA,KAHL,CAGW,MAHX,EAGmB,UAAAkI,CAAC;AAAA,qBAAIA,CAAC,CAACG,IAAF,CAAOC,SAAX;AAAA,aAHpB,EAjCmB,CAsCnB;;AACAD,YAAAA,IAAI,CAAC/L,MAAL,CAAY,MAAZ,EACKzB,IADL,CACU,GADV,EACe,UAAAqN,CAAC;AAAA,qBAAIA,CAAC,CAACjF,CAAF,GAAI,CAAR;AAAA,aADhB,EAEKpI,IAFL,CAEU,OAFV,EAEmB,EAFnB,EAGKA,IAHL,CAGU,GAHV,EAGe,KAAKsE,WAAL,GAAiB,CAHhC,EAIKtE,IAJL,CAIU,QAJV,EAIoB,CAJpB,EAKKA,IALL,CAKU,OALV,EAKmB,2BALnB,EAMKA,IANL,CAMU,QANV,EAMoB,UAAAqN,CAAC;AAAA,qBAAIA,CAAC,CAACtH,EAAN;AAAA,aANrB,EAOKZ,KAPL,CAOW,SAPX,EAOsB,CAPtB;AAUA,gBAAIwI,MAAM,GAAG,KAAKvR,QAAL,CAAcC,IAAd,CAAmB,4BAAnB,CAAb;AACAsR,YAAAA,MAAM,CACHvQ,EADH,CACM,YADN,EACoB,UAACc,KAAD,EAAW;AAC3B,cAAA,MAAI,CAAC3B,iBAAL,CAAuBqR,uBAAvB,GAAiD,IAAjD;AACD,aAHH,EAIGxQ,EAJH,CAIM,YAJN,EAIoB,UAACc,KAAD,EAAW;AAC3B,cAAA,MAAI,CAAC3B,iBAAL,CAAuBqR,uBAAvB,GAAiD,KAAjD;AACD,aANH;AAOD","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 b4410a81b0c83c7b40290eeff38f27f5a8e3a17a..97a26d8e4cf53e8b93f74e14c94da3fff0cacf84 100644 GIT binary patch literal 34584 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
38+L)w>#BOOiOPp&tm*T^b)S6*-YE&qwjO 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

s9`16w2aTCB)$}`%Sq~Q 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 W=0tDP75e`(xe7>A5&6nI^nU;n{_XDo diff --git a/src/img/tooltip-url.png b/src/img/tooltip-url.png index 6966228622bbd6cc11541a1711bb5c38133061c8..cb65c494da58b44ed48d2ddcafae821bebf93117 100644 GIT binary patch literal 10403 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 Y^L&$~kRj*kUpb&4t143_Z5H-_0J9XC&Hw-a 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; + onPrevPage(): void { + this.bucketMatrixPager.switchToPrev(); + this.render(); } - setPaginationSize(pageSize: number): void { - this.pageSizeViewer = pageSize; + onNextPage(): void { + this.bucketMatrixPager.switchToNext(); + this.render(); } - 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; - } - - getLastPageElement(): number { - return this.lastPageElement; - } - - 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 @@ -
-
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