From 1983d31aec3638b203423b811679626c735d63c5 Mon Sep 17 00:00:00 2001 From: vargburz Date: Wed, 11 May 2022 16:53:02 +0300 Subject: [PATCH] link fixes --- src/components/Panel.tsx | 5 +- src/components/editors/IconsEditor.tsx | 11 +- src/components/editors/NotSupportedText.tsx | 2 +- src/components/editors/ThresholdsEditor.tsx | 3 +- src/components/editors/UseMetricEditor.tsx | 12 +- src/models/options.ts | 24 +- src/module.ts | 241 ++++++++++---------- src/types.ts | 2 +- src/utils.ts | 6 +- 9 files changed, 147 insertions(+), 159 deletions(-) diff --git a/src/components/Panel.tsx b/src/components/Panel.tsx index 08d45cb..50213a2 100644 --- a/src/components/Panel.tsx +++ b/src/components/Panel.tsx @@ -33,11 +33,10 @@ export function Panel({ options, data, width, height, timeZone, timeRange, onCha const isLinkActive = !_.isEmpty(options.gauge.link); const chartClickHandler = (event: React.MouseEvent) => { event.preventDefault(); - console.log('click', options); if (!isLinkActive) { return; } - window.open(options.gauge.link, "_self"); + window.open(options.gauge.link, '_self'); }; return ( @@ -46,7 +45,7 @@ export function Panel({ options, data, width, height, timeZone, timeRange, onCha className={css` width: ${width}px; height: ${height}px; - cursor: ${isLinkActive ? 'pointer' : 'default'} + cursor: ${isLinkActive ? 'pointer' : 'default'}; `} onClick={chartClickHandler} > diff --git a/src/components/editors/IconsEditor.tsx b/src/components/editors/IconsEditor.tsx index 0617345..b989d7f 100644 --- a/src/components/editors/IconsEditor.tsx +++ b/src/components/editors/IconsEditor.tsx @@ -120,11 +120,7 @@ export function IconsEditor({ onChange, value, context }: StandardEditorProps { return (
- removeIcon(iconIdx)} - tooltip="Delete Icon" - > + removeIcon(iconIdx)} tooltip="Delete Icon">
{ return ( -
- +
+ { margin-bottom: ${theme.spacing.sm}; `, }; - }); diff --git a/src/components/editors/NotSupportedText.tsx b/src/components/editors/NotSupportedText.tsx index 22c4432..3b50408 100644 --- a/src/components/editors/NotSupportedText.tsx +++ b/src/components/editors/NotSupportedText.tsx @@ -1,5 +1,5 @@ import React from 'react'; export function NotSupportedText() { - return
To be supported soon...
+ return
To be supported soon...
; } diff --git a/src/components/editors/ThresholdsEditor.tsx b/src/components/editors/ThresholdsEditor.tsx index aacfc10..354b4d3 100644 --- a/src/components/editors/ThresholdsEditor.tsx +++ b/src/components/editors/ThresholdsEditor.tsx @@ -19,7 +19,6 @@ import React from 'react'; import { css } from 'emotion'; import * as _ from 'lodash'; - interface Props { defaultColor: string; arcBackground: string; @@ -156,7 +155,7 @@ interface ThresholdsEditorStyles { const getStyles = stylesFactory((theme: GrafanaTheme): ThresholdsEditorStyles => { return { deleteButton: css` - margin-right: 0px!important; + margin-right: 0px !important; `, }; }); diff --git a/src/components/editors/UseMetricEditor.tsx b/src/components/editors/UseMetricEditor.tsx index cb2b248..4018e26 100644 --- a/src/components/editors/UseMetricEditor.tsx +++ b/src/components/editors/UseMetricEditor.tsx @@ -1,18 +1,12 @@ import { FieldNamePicker } from '../../grafana/MatchersUI/FieldNamePicker'; import { StandardEditorProps } from '@grafana/data'; -import { - HorizontalGroup, - InlineField, - InlineSwitch, - Input, -} from '@grafana/ui'; +import { HorizontalGroup, InlineField, InlineSwitch, Input } from '@grafana/ui'; import React from 'react'; import * as _ from 'lodash'; - type UseMetricConfig = { useMetric: boolean; value?: number; @@ -31,7 +25,7 @@ export function UseMetricEditor({ onChange, value, context }: StandardEditorProp config[field] = value; onChange(config); - } + }; return ( @@ -59,5 +53,5 @@ export function UseMetricEditor({ onChange, value, context }: StandardEditorProp )} - ) + ); } diff --git a/src/models/options.ts b/src/models/options.ts index 1db96d9..f150d29 100644 --- a/src/models/options.ts +++ b/src/models/options.ts @@ -6,14 +6,12 @@ import { getValueFormat } from '@grafana/data'; import _ from 'lodash'; - - // Convert Grafana options into Chartwerk Gauge options export class Options { private minValue: number | undefined; private maxValue: number | undefined; - private thresholds: { value: number, color: string }[] = []; - private icons: { src: string, position: string, size: number}[] = []; + private thresholds: Array<{ value: number; color: string }> = []; + private icons: Array<{ src: string; position: string; size: number }> = []; constructor(private grafanaSeriesList: any[], private grafanaOptions: PanelOptions) { this._setMin(); @@ -50,14 +48,16 @@ export class Options { } private _setThreshold(threshold: Threshold, idx: number): void { - const value = threshold.useMetric ? this.getLastValueFromMetrics(threshold.metricName, `Threshold ${idx + 1}`) : threshold.value; - if(value === null || value === undefined) { + const value = threshold.useMetric + ? this.getLastValueFromMetrics(threshold.metricName, `Threshold ${idx + 1}`) + : threshold.value; + if (value === null || value === undefined) { // TODO: may be throw an error return; } this.thresholds.push({ value, - color: threshold.color + color: threshold.color, }); } @@ -88,14 +88,14 @@ export class Options { } private _areIconConditionsFulfilled(icon: Icon, iconIdx: number): boolean { - if(_.isEmpty(icon.metrics)) { + if (_.isEmpty(icon.metrics)) { return true; } // check each condition and return false if something goes wrong for (let [conditionIdx, metric] of icon.metrics.entries()) { const value = this.getLastValueFromMetrics(metric, `Icon ${iconIdx + 1}, Condition ${conditionIdx + 1}`); - if(value === null || value === undefined) { + if (value === null || value === undefined) { // TODO: may be throw an error return false; } @@ -157,11 +157,7 @@ export class Options { getLastValueFromMetrics(metricName: string | undefined, optionName: string): number | null { // optionName -> helper in Error, mb use option path instead - const filteredSeries = filterMetricListByAlias( - this.grafanaSeriesList, - metricName, - optionName - ); + const filteredSeries = filterMetricListByAlias(this.grafanaSeriesList, metricName, optionName); const serie = filteredSeries[0]; // Last value for now return getAggregatedValueFromSerie(serie, Aggregation.LAST); diff --git a/src/module.ts b/src/module.ts index 0ecec60..4c0925e 100644 --- a/src/module.ts +++ b/src/module.ts @@ -9,130 +9,131 @@ import { UseMetricEditor } from './components/editors/UseMetricEditor'; import { PanelPlugin } from '@grafana/data'; - export const plugin = new PanelPlugin(Panel).setPanelOptions((builder) => { - return builder - .addRadio({ - path: 'visualizationType', - name: 'Pod', - category: ['Visualization'], - defaultValue: Pod.GAUGE, - settings: { - options: [ - { - label: 'Gauge', - value: Pod.GAUGE, - }, - { - label: 'Line', - value: Pod.LINE, - }, - { - label: 'Bar', - value: Pod.BAR, - }, - ], - }, - }) - .addCustomEditor({ - id: 'notSupportedText', - name: 'This visualization is not supported', - category: ['Visualization'], - path: '', - showIf: (config) => config.visualizationType !== Pod.GAUGE, - editor: NotSupportedText as any, - }) + return ( + builder + .addRadio({ + path: 'visualizationType', + name: 'Pod', + category: ['Visualization'], + defaultValue: Pod.GAUGE, + settings: { + options: [ + { + label: 'Gauge', + value: Pod.GAUGE, + }, + { + label: 'Line', + value: Pod.LINE, + }, + { + label: 'Bar', + value: Pod.BAR, + }, + ], + }, + }) + .addCustomEditor({ + id: 'notSupportedText', + name: 'This visualization is not supported', + category: ['Visualization'], + path: '', + showIf: (config) => config.visualizationType !== Pod.GAUGE, + editor: NotSupportedText as any, + }) - .addFieldNamePicker({ - name: 'Value', - path: 'gauge.value.metricName', - category: ['Extremum'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - }) - // TODO: defaults? - .addCustomEditor({ - id: 'min', - name: 'Min', - path: 'gauge.min', - category: ['Extremum'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - editor: UseMetricEditor as any, - }). - addCustomEditor({ - id: 'max', - name: 'Max', - path: 'gauge.max', - category: ['Extremum'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - editor: UseMetricEditor as any, - }) + .addFieldNamePicker({ + name: 'Value', + path: 'gauge.value.metricName', + category: ['Extremum'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + }) + // TODO: defaults? + .addCustomEditor({ + id: 'min', + name: 'Min', + path: 'gauge.min', + category: ['Extremum'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + editor: UseMetricEditor as any, + }) + .addCustomEditor({ + id: 'max', + name: 'Max', + path: 'gauge.max', + category: ['Extremum'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + editor: UseMetricEditor as any, + }) - // note: `gauge.unit` will contain unit name, not it's string representation - // to format value with unit, use `getValueFormat` function from `@grafana/data` - .addUnitPicker({ - path: 'gauge.unit', - name: 'Unit', - category: ['Value Format'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - }) - .addNumberInput({ - path: 'gauge.decimals', - name: 'Decimals', - settings: { - placeholder: 'auto', - min: 0, - max: 5, - }, - category: ['Value Format'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - }) - .addSliderInput({ - path: 'gauge.valueSize', - defaultValue: 20, - name: 'Size (px)', - settings: { - min: 1, - max: 50, - }, - category: ['Value Format'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - }) + // note: `gauge.unit` will contain unit name, not it's string representation + // to format value with unit, use `getValueFormat` function from `@grafana/data` + .addUnitPicker({ + path: 'gauge.unit', + name: 'Unit', + category: ['Value Format'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + }) + .addNumberInput({ + path: 'gauge.decimals', + name: 'Decimals', + settings: { + placeholder: 'auto', + min: 0, + max: 5, + }, + category: ['Value Format'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + }) + .addSliderInput({ + path: 'gauge.valueSize', + defaultValue: 20, + name: 'Size (px)', + settings: { + min: 1, + max: 50, + }, + category: ['Value Format'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + }) - .addBooleanSwitch({ - path: 'gauge.reversed', - name: 'Reversed', - defaultValue: false, - category: ['Direction'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - }) + .addBooleanSwitch({ + path: 'gauge.reversed', + name: 'Reversed', + defaultValue: false, + category: ['Direction'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + }) - .addCustomEditor({ - id: 'icons', - path: 'gauge.icons', - name: 'Icons', - category: ['Icons'], - defaultValue: [], - showIf: (config) => config.visualizationType === Pod.GAUGE, - editor: IconsEditor as any, - }) + .addCustomEditor({ + id: 'icons', + path: 'gauge.icons', + name: 'Icons', + category: ['Icons'], + defaultValue: [], + showIf: (config) => config.visualizationType === Pod.GAUGE, + editor: IconsEditor as any, + }) - .addCustomEditor({ - id: 'thresholds', - path: 'gauge.thresholds', - name: 'Thresholds', - category: ['Thresholds'], - defaultValue: { - defaultColor: '#37872d', - arcBackground: 'rgba(38, 38, 38, 0.1)', - thresholds: [], - }, - showIf: (config) => config.visualizationType === Pod.GAUGE, - editor: ThresholdsEditor as any, - }) - .addTextInput({ - path: 'gauge.link', - name: '', - category: ['Link'], - showIf: (config) => config.visualizationType === Pod.GAUGE, - }); + .addCustomEditor({ + id: 'thresholds', + path: 'gauge.thresholds', + name: 'Thresholds', + category: ['Thresholds'], + defaultValue: { + defaultColor: '#37872d', + arcBackground: 'rgba(38, 38, 38, 0.1)', + thresholds: [], + }, + showIf: (config) => config.visualizationType === Pod.GAUGE, + editor: ThresholdsEditor as any, + }) + .addTextInput({ + path: 'gauge.link', + name: '', + category: ['Link'], + showIf: (config) => config.visualizationType === Pod.GAUGE, + }) + ); }); diff --git a/src/types.ts b/src/types.ts index 0957663..cf3f960 100644 --- a/src/types.ts +++ b/src/types.ts @@ -51,7 +51,7 @@ export type Threshold = { value: number; metricName: string; color: string; -} +}; export type Icon = { conditions: Condition[]; diff --git a/src/utils.ts b/src/utils.ts index 014f99e..007f8d2 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -13,7 +13,11 @@ export function filterMetricListByAlias(list: any[], alias: string | undefined, return filteredSeries; } -export function getAggregatedValueFromSerie(serie: any, aggregation = Aggregation.LAST, valueIdx: 0 | 1 = 0): number | null { +export function getAggregatedValueFromSerie( + serie: any, + aggregation = Aggregation.LAST, + valueIdx: 0 | 1 = 0 +): number | null { // series types { datapoints: [number, number][]} // valueIdx === 0 for Grafana series, valueIdx === 1 for Chartwerk series if (serie === undefined) {