From f58d529bbba367a8b4808712682b273bb882b1a3 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Wed, 23 Dec 2020 02:33:44 +0100 Subject: [PATCH 1/9] feat: minigauge dashboard store, swagger --- cmd/chronograf-migrator/dashboard.go | 6 ++ dashboard.go | 68 ++++++++++++++++++++ http/swagger.yml | 93 ++++++++++++++++++++++++++++ pkger/clone_resource.go | 6 ++ pkger/parser_models.go | 4 +- 5 files changed, 176 insertions(+), 1 deletion(-) diff --git a/cmd/chronograf-migrator/dashboard.go b/cmd/chronograf-migrator/dashboard.go index cb4f693da41..b5409d95acb 100644 --- a/cmd/chronograf-migrator/dashboard.go +++ b/cmd/chronograf-migrator/dashboard.go @@ -99,6 +99,12 @@ func convert1To2Cell(cell chronograf.DashboardCell) *influxdb.Cell { Note: cell.Note, // TODO(desa): what to do about ShowNoteWhenEmpty? } + case "gauge-mini": + v.Properties = influxdb.GaugeMiniViewProperties{ + Queries: convertQueries(cell.Queries), + ViewColors: convertColors(cell.CellColors), + Note: cell.Note, + } case "table": v.Properties = influxdb.TableViewProperties{ Queries: convertQueries(cell.Queries), diff --git a/dashboard.go b/dashboard.go index 0c36601f9ee..1c546e14b38 100644 --- a/dashboard.go +++ b/dashboard.go @@ -372,6 +372,7 @@ type ViewContents struct { const ( ViewPropertyTypeCheck = "check" ViewPropertyTypeGauge = "gauge" + ViewPropertyTypeGaugeMini = "gauge-mini" ViewPropertyTypeHeatMap = "heatmap" ViewPropertyTypeHistogram = "histogram" ViewPropertyTypeLogViewer = "log-viewer" @@ -457,6 +458,12 @@ func UnmarshalViewPropertiesJSON(b []byte) (ViewProperties, error) { return nil, err } vis = gvw + case ViewPropertyTypeGaugeMini: + var gvm GaugeMiniViewProperties + if err := json.Unmarshal(v.B, &gvm); err != nil { + return nil, err + } + vis = gvm case ViewPropertyTypeTable: var tv TableViewProperties if err := json.Unmarshal(v.B, &tv); err != nil { @@ -563,6 +570,14 @@ func MarshalViewPropertiesJSON(v ViewProperties) ([]byte, error) { }{ Shape: "chronograf-v2", GeoViewProperties: vis, + case GaugeMiniViewProperties: + s = struct { + Shape string `json:"shape"` + GaugeMiniViewProperties + }{ + Shape: "chronograf-v2", + + GaugeMiniViewProperties: vis, } case XYViewProperties: s = struct { @@ -1006,6 +1021,57 @@ type GeoViewProperties struct { GeoLayers []GeoLayer `json:"layers"` Note string `json:"note"` ShowNoteWhenEmpty bool `json:"showNoteWhenEmpty"` +type GaugeMiniBarsDefinitions struct { + GroupByColumns map[string]bool `json:"groupByColumns"` + Bars [](struct { + BarDef map[string]string `json:"barDef"` + Label string `json:"label"` + }) `json:"bars"` +} + +// GaugeMiniViewProperties represents options for gauge view in Chronograf +type GaugeMiniViewProperties struct { + Type string `json:"type"` + Queries []DashboardQuery `json:"queries"` + ViewColors []ViewColor `json:"colors"` + Note string `json:"note"` + ShowNoteWhenEmpty bool `json:"showNoteWhenEmpty"` + + // todo: wait for simpler types + BarsDefinitions GaugeMiniBarsDefinitions `json:"barsDefinitions"` + Mode string `json:"mode"` + TextMode string `json:"textMode"` + + ValueHeight float64 `json:"valueHeight"` + GaugeHeight float64 `json:"gaugeHeight"` + ValueRounding float64 `json:"valueRounding"` + GaugeRounding float64 `json:"gaugeRounding"` + BarPaddings float64 `json:"barPaddings"` + SidePaddings float64 `json:"sidePaddings"` + OveflowFraction float64 `json:"oveflowFraction"` + + ColorSecondary string `json:"colorSecondary"` + + LabelMain string `json:"labelMain"` + LabelMainFontSize float64 `json:"labelMainFontSize"` + LabelMainFontColor string `json:"labelMainFontColor"` + + LabelBarsFontSize float64 `json:"labelBarsFontSize"` + LabelBarsFontColor string `json:"labelBarsFontColor"` + + ValuePadding float64 `json:"valuePadding"` + ValueFontSize float64 `json:"valueFontSize"` + ValueFontColorInside string `json:"valueFontColorInside"` + ValueFontColorOutside string `json:"valueFontColorOutside"` + // todo: wait for simpler types + // valueFormater?: (value: number) => string + + // todo: find how to do union types inside go + // axesSteps int32 | string | nil | []float64 `json:"axesSteps"` + AxesFontSize float64 `json:"axesFontSize"` + AxesFontColor string `json:"axesFontColor"` + // todo: wait for simpler types + // axesFormater?: (value: number) => string } // TableViewProperties represents options for table view in Chronograf @@ -1056,6 +1122,7 @@ func (ScatterViewProperties) viewProperties() {} func (MosaicViewProperties) viewProperties() {} func (GaugeViewProperties) viewProperties() {} func (GeoViewProperties) viewProperties() {} +func (GaugeMiniViewProperties) viewProperties() {} func (TableViewProperties) viewProperties() {} func (MarkdownViewProperties) viewProperties() {} func (LogViewProperties) viewProperties() {} @@ -1071,6 +1138,7 @@ func (v ScatterViewProperties) GetType() string { return v.Type } func (v MosaicViewProperties) GetType() string { return v.Type } func (v GaugeViewProperties) GetType() string { return v.Type } func (v GeoViewProperties) GetType() string { return v.Type } +func (v GaugeMiniViewProperties) GetType() string { return v.Type } func (v TableViewProperties) GetType() string { return v.Type } func (v MarkdownViewProperties) GetType() string { return v.Type } func (v LogViewProperties) GetType() string { return v.Type } diff --git a/http/swagger.yml b/http/swagger.yml index 55a4d4d1769..38456991cec 100644 --- a/http/swagger.yml +++ b/http/swagger.yml @@ -9648,6 +9648,98 @@ components: $ref: "#/components/schemas/Legend" decimalPlaces: $ref: "#/components/schemas/DecimalPlaces" + GaugeMiniViewProperties: + type: object + required: + [ + type, + queries, + colors, + shape, + note, + showNoteWhenEmpty, + ] + properties: + type: + type: string + enum: [gauge-mini] + queries: + type: array + items: + $ref: "#/components/schemas/DashboardQuery" + colors: + description: Colors define color encoding of data into a visualization + type: array + items: + $ref: "#/components/schemas/DashboardColor" + shape: + type: string + enum: ["chronograf-v2"] + note: + type: string + showNoteWhenEmpty: + description: If true, will display note when empty + type: boolean + # todo: wait for simpler typings + # barsDefinitions: GaugeMiniBarsDefinitions; + mode: + type: string + enum: [progress, bullet] + textMode: + type: string + enum: [follow, left] + valueHeight: + type: number + gaugeHeight: + type: number + valueRounding: + type: number + gaugeRounding: + type: number + barPaddings: + type: number + sidePaddings: + type: number + oveflowFraction: + type: number + colorSecondary: + type: string + labelMain: + type: string + labelMainFontSize: + type: number + labelMainFontColor: + type: string + labelBarsFontSize: + type: number + labelBarsFontColor: + type: string + valuePadding: + type: number + valueFontSize: + type: number + valueFontColorInside: + type: string + valueFontColorOutside: + type: string + # todo: wait for simpler typings + # valueFormater?: (value: number) => string; + # axesSteps?: number | 'thresholds' | undefined | number[]; + axesSteps: + oneOf: + - type: number + - type: string + enum: [thresholds] + - type: undefined + - type: array + items: + type: number + axesFontSize: + type: number + axesFontColor: + type: string + # todo: wait for simpler typings + # axesFormater?: (value: number) => string; TableViewProperties: type: object required: @@ -10092,6 +10184,7 @@ components: - $ref: "#/components/schemas/SingleStatViewProperties" - $ref: "#/components/schemas/HistogramViewProperties" - $ref: "#/components/schemas/GaugeViewProperties" + - $ref: "#/components/schemas/GaugeMiniViewProperties" - $ref: "#/components/schemas/TableViewProperties" - $ref: "#/components/schemas/MarkdownViewProperties" - $ref: "#/components/schemas/CheckViewProperties" diff --git a/pkger/clone_resource.go b/pkger/clone_resource.go index 0bf5126c7e6..05991d91534 100644 --- a/pkger/clone_resource.go +++ b/pkger/clone_resource.go @@ -761,6 +761,12 @@ func convertCellView(cell influxdb.Cell) chart { ch.GeoLayers = convertGeoLayers(p.GeoLayers) ch.Note = p.Note ch.NoteOnEmpty = p.ShowNoteWhenEmpty + case influxdb.GaugeMiniViewProperties: + ch.Kind = chartKindGauge + ch.Colors = convertColors(p.ViewColors) + ch.Queries = convertQueries(p.Queries) + ch.Note = p.Note + ch.NoteOnEmpty = p.ShowNoteWhenEmpty case influxdb.HeatmapViewProperties: ch.Kind = chartKindHeatMap ch.Queries = convertQueries(p.Queries) diff --git a/pkger/parser_models.go b/pkger/parser_models.go index d16ca4e7545..1c1ef95182e 100644 --- a/pkger/parser_models.go +++ b/pkger/parser_models.go @@ -424,6 +424,7 @@ const ( chartKindUnknown chartKind = "" chartKindGauge chartKind = "gauge" chartKindGeo chartKind = "geo" + chartKindGaugeMini chartKind = "gauge-mini" chartKindHeatMap chartKind = "heatmap" chartKindHistogram chartKind = "histogram" chartKindMarkdown chartKind = "markdown" @@ -439,7 +440,8 @@ const ( func (c chartKind) ok() bool { switch c { case chartKindGauge, chartKindGeo, chartKindHeatMap, chartKindHistogram, - chartKindMarkdown, chartKindMosaic, chartKindScatter, + case chartKindGauge, chartKindGeo, chartKindGaugeMini, chartKindHeatMap, + chartKindHistogram, chartKindMarkdown, chartKindMosaic, chartKindScatter, chartKindSingleStat, chartKindSingleStatPlusLine, chartKindTable, chartKindXY, chartKindBand: return true From 2907064e8efb279ebef3018990b83946c43c7a56 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Mon, 28 Dec 2020 22:39:27 +0100 Subject: [PATCH 2/9] feat: swagger simpler types --- http/swagger.yml | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/http/swagger.yml b/http/swagger.yml index 38456991cec..5bc41416f5d 100644 --- a/http/swagger.yml +++ b/http/swagger.yml @@ -9648,6 +9648,15 @@ components: $ref: "#/components/schemas/Legend" decimalPlaces: $ref: "#/components/schemas/DecimalPlaces" + FormatStatValueOptions: + type: object + properties: + decimalPlaces: + $ref: "#/components/schemas/DecimalPlaces" + prefix: + type: string + suffix: + type: string GaugeMiniViewProperties: type: object required: @@ -9680,8 +9689,24 @@ components: showNoteWhenEmpty: description: If true, will display note when empty type: boolean - # todo: wait for simpler typings - # barsDefinitions: GaugeMiniBarsDefinitions; + barsDefinitions: + type: object + properties: + groupByColumns: + type: array + items: + type: string + bars: + type: array + items: + type: object + properties: + barDef: + type: array + items: + type: string + label: + type: string mode: type: string enum: [progress, bullet] @@ -9722,9 +9747,8 @@ components: type: string valueFontColorOutside: type: string - # todo: wait for simpler typings - # valueFormater?: (value: number) => string; - # axesSteps?: number | 'thresholds' | undefined | number[]; + valueFormater: + $ref: "#/components/schemas/FormatStatValueOptions" axesSteps: oneOf: - type: number @@ -9738,8 +9762,8 @@ components: type: number axesFontColor: type: string - # todo: wait for simpler typings - # axesFormater?: (value: number) => string; + axesFormater: + $ref: "#/components/schemas/FormatStatValueOptions" TableViewProperties: type: object required: From db669328a9d3280d5955badc89e523eaaa7322cf Mon Sep 17 00:00:00 2001 From: TheRWe Date: Tue, 29 Dec 2020 05:04:40 +0100 Subject: [PATCH 3/9] feat: missing gauge mini types added --- dashboard.go | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/dashboard.go b/dashboard.go index 1c546e14b38..3cd37359137 100644 --- a/dashboard.go +++ b/dashboard.go @@ -1029,6 +1029,12 @@ type GaugeMiniBarsDefinitions struct { }) `json:"bars"` } +type FormatStatValueOptions struct { + DecimalPlaces DecimalPlaces `json:"decimalPlaces"` + Prefix string `json:"prefix"` + Suffix string `json:"suffix"` +} + // GaugeMiniViewProperties represents options for gauge view in Chronograf type GaugeMiniViewProperties struct { Type string `json:"type"` @@ -1037,7 +1043,6 @@ type GaugeMiniViewProperties struct { Note string `json:"note"` ShowNoteWhenEmpty bool `json:"showNoteWhenEmpty"` - // todo: wait for simpler types BarsDefinitions GaugeMiniBarsDefinitions `json:"barsDefinitions"` Mode string `json:"mode"` TextMode string `json:"textMode"` @@ -1059,19 +1064,16 @@ type GaugeMiniViewProperties struct { LabelBarsFontSize float64 `json:"labelBarsFontSize"` LabelBarsFontColor string `json:"labelBarsFontColor"` - ValuePadding float64 `json:"valuePadding"` - ValueFontSize float64 `json:"valueFontSize"` - ValueFontColorInside string `json:"valueFontColorInside"` - ValueFontColorOutside string `json:"valueFontColorOutside"` - // todo: wait for simpler types - // valueFormater?: (value: number) => string - - // todo: find how to do union types inside go - // axesSteps int32 | string | nil | []float64 `json:"axesSteps"` - AxesFontSize float64 `json:"axesFontSize"` - AxesFontColor string `json:"axesFontColor"` - // todo: wait for simpler types - // axesFormater?: (value: number) => string + ValuePadding float64 `json:"valuePadding"` + ValueFontSize float64 `json:"valueFontSize"` + ValueFontColorInside string `json:"valueFontColorInside"` + ValueFontColorOutside string `json:"valueFontColorOutside"` + ValueFormater FormatStatValueOptions `json:"valueFormater"` + + AxesSteps json.RawMessage `json:"axesSteps"` + AxesFontSize float64 `json:"axesFontSize"` + AxesFontColor string `json:"axesFontColor"` + AxesFormater FormatStatValueOptions `json:"axesFormater"` } // TableViewProperties represents options for table view in Chronograf From b4ed522cddf68bf20e7b9cc7c1e2839ce1f7e861 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Tue, 29 Dec 2020 18:46:28 +0100 Subject: [PATCH 4/9] style: trailing spaces removed --- http/swagger.yml | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/http/swagger.yml b/http/swagger.yml index 5bc41416f5d..66cc1d8eeac 100644 --- a/http/swagger.yml +++ b/http/swagger.yml @@ -9655,8 +9655,8 @@ components: $ref: "#/components/schemas/DecimalPlaces" prefix: type: string - suffix: - type: string + suffix: + type: string GaugeMiniViewProperties: type: object required: @@ -9715,37 +9715,37 @@ components: enum: [follow, left] valueHeight: type: number - gaugeHeight: + gaugeHeight: type: number - valueRounding: + valueRounding: type: number - gaugeRounding: + gaugeRounding: type: number - barPaddings: + barPaddings: type: number - sidePaddings: + sidePaddings: type: number - oveflowFraction: + oveflowFraction: type: number - colorSecondary: + colorSecondary: type: string - labelMain: + labelMain: type: string - labelMainFontSize: + labelMainFontSize: type: number - labelMainFontColor: + labelMainFontColor: type: string - labelBarsFontSize: + labelBarsFontSize: type: number - labelBarsFontColor: + labelBarsFontColor: type: string - valuePadding: + valuePadding: type: number - valueFontSize: + valueFontSize: type: number - valueFontColorInside: + valueFontColorInside: type: string - valueFontColorOutside: + valueFontColorOutside: type: string valueFormater: $ref: "#/components/schemas/FormatStatValueOptions" @@ -9756,12 +9756,12 @@ components: enum: [thresholds] - type: undefined - type: array - items: - type: number - axesFontSize: - type: number - axesFontColor: - type: string + items: + type: number + axesFontSize: + type: number + axesFontColor: + type: string axesFormater: $ref: "#/components/schemas/FormatStatValueOptions" TableViewProperties: From ac04666f882c9105176349d1b4b9ac6106a39732 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Tue, 29 Dec 2020 18:57:29 +0100 Subject: [PATCH 5/9] fix: invalid indenting --- http/swagger.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/http/swagger.yml b/http/swagger.yml index 66cc1d8eeac..1484dedcabe 100644 --- a/http/swagger.yml +++ b/http/swagger.yml @@ -9656,7 +9656,7 @@ components: prefix: type: string suffix: - type: string + type: string GaugeMiniViewProperties: type: object required: @@ -9757,11 +9757,11 @@ components: - type: undefined - type: array items: - type: number + type: number axesFontSize: - type: number + type: number axesFontColor: - type: string + type: string axesFormater: $ref: "#/components/schemas/FormatStatValueOptions" TableViewProperties: From 0cf51a1ef9674e485d6db0a4d97dacdf0e19deb3 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Tue, 29 Dec 2020 21:46:20 +0100 Subject: [PATCH 6/9] feat: feature flag --- flags.yml | 8 ++++++++ kit/feature/list.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/flags.yml b/flags.yml index 9b988a0ae7f..7506e2607fe 100644 --- a/flags.yml +++ b/flags.yml @@ -100,6 +100,14 @@ expose: true lifetime: temporary +- name: Gauge Mini Graph Type + description: Enables the creation of a Gauge Mini graph in Dashboards + key: gaugeMini + default: false + contact: Bonitoo-io + expose: true + lifetime: temporary + - name: Notebooks description: Determine if the notebook feature's route and navbar icon are visible to the user key: notebooks diff --git a/kit/feature/list.go b/kit/feature/list.go index 2eade47e294..f0b5bf240cf 100644 --- a/kit/feature/list.go +++ b/kit/feature/list.go @@ -170,6 +170,20 @@ func MosaicGraphType() BoolFlag { return mosaicGraphType } +var gaugeMini = MakeBoolFlag( + "Gauge Mini Graph Type", + "gaugeMini", + "Bonitoo-io", + false, + Temporary, + true, +) + +// GaugeMiniGraphType - Enables the creation of a Gauge Mini graph in Dashboards +func GaugeMiniGraphType() BoolFlag { + return gaugeMini +} + var notebooks = MakeBoolFlag( "Notebooks", "notebooks", @@ -239,6 +253,7 @@ var all = []Flag{ simpleTaskOptionsExtraction, bandPlotType, mosaicGraphType, + gaugeMini, notebooks, injectLatestSuccessTime, enforceOrgDashboardLimits, @@ -258,6 +273,7 @@ var byKey = map[string]Flag{ "simpleTaskOptionsExtraction": simpleTaskOptionsExtraction, "bandPlotType": bandPlotType, "mosaicGraphType": mosaicGraphType, + "gaugeMini": gaugeMini, "notebooks": notebooks, "injectLatestSuccessTime": injectLatestSuccessTime, "enforceOrgDashboardLimits": enforceOrgDashboardLimits, From ce2f7d9072ca517e2ff8064d041aec2e07577ea8 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Thu, 21 Jan 2021 14:01:25 +0100 Subject: [PATCH 7/9] fix: merge errors fixed --- dashboard.go | 3 +++ pkger/parser_models.go | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dashboard.go b/dashboard.go index 3cd37359137..e330e4e51f7 100644 --- a/dashboard.go +++ b/dashboard.go @@ -570,6 +570,7 @@ func MarshalViewPropertiesJSON(v ViewProperties) ([]byte, error) { }{ Shape: "chronograf-v2", GeoViewProperties: vis, + } case GaugeMiniViewProperties: s = struct { Shape string `json:"shape"` @@ -1021,6 +1022,8 @@ type GeoViewProperties struct { GeoLayers []GeoLayer `json:"layers"` Note string `json:"note"` ShowNoteWhenEmpty bool `json:"showNoteWhenEmpty"` +} + type GaugeMiniBarsDefinitions struct { GroupByColumns map[string]bool `json:"groupByColumns"` Bars [](struct { diff --git a/pkger/parser_models.go b/pkger/parser_models.go index 1c1ef95182e..8262040d954 100644 --- a/pkger/parser_models.go +++ b/pkger/parser_models.go @@ -439,7 +439,6 @@ const ( func (c chartKind) ok() bool { switch c { - case chartKindGauge, chartKindGeo, chartKindHeatMap, chartKindHistogram, case chartKindGauge, chartKindGeo, chartKindGaugeMini, chartKindHeatMap, chartKindHistogram, chartKindMarkdown, chartKindMosaic, chartKindScatter, chartKindSingleStat, chartKindSingleStatPlusLine, chartKindTable, From 13e74d9d0601db1fc970f6c2a1f507eb723bce5a Mon Sep 17 00:00:00 2001 From: TheRWe Date: Mon, 25 Jan 2021 12:08:58 +0100 Subject: [PATCH 8/9] feat: gauge mini swagger updated --- http/swagger.yml | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/http/swagger.yml b/http/swagger.yml index 1484dedcabe..35188646310 100644 --- a/http/swagger.yml +++ b/http/swagger.yml @@ -9689,24 +9689,6 @@ components: showNoteWhenEmpty: description: If true, will display note when empty type: boolean - barsDefinitions: - type: object - properties: - groupByColumns: - type: array - items: - type: string - bars: - type: array - items: - type: object - properties: - barDef: - type: array - items: - type: string - label: - type: string mode: type: string enum: [progress, bullet] @@ -9735,6 +9717,8 @@ components: type: number labelMainFontColor: type: string + labelBarsEnabled: + type: boolean labelBarsFontSize: type: number labelBarsFontColor: From be5f39dc7d6d134f7b7ab596d0e288bb24f03727 Mon Sep 17 00:00:00 2001 From: TheRWe Date: Mon, 25 Jan 2021 12:37:39 +0100 Subject: [PATCH 9/9] fix: BarsDefinitions removed --- dashboard.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/dashboard.go b/dashboard.go index e330e4e51f7..700a0b483b7 100644 --- a/dashboard.go +++ b/dashboard.go @@ -1024,14 +1024,6 @@ type GeoViewProperties struct { ShowNoteWhenEmpty bool `json:"showNoteWhenEmpty"` } -type GaugeMiniBarsDefinitions struct { - GroupByColumns map[string]bool `json:"groupByColumns"` - Bars [](struct { - BarDef map[string]string `json:"barDef"` - Label string `json:"label"` - }) `json:"bars"` -} - type FormatStatValueOptions struct { DecimalPlaces DecimalPlaces `json:"decimalPlaces"` Prefix string `json:"prefix"` @@ -1046,7 +1038,6 @@ type GaugeMiniViewProperties struct { Note string `json:"note"` ShowNoteWhenEmpty bool `json:"showNoteWhenEmpty"` - BarsDefinitions GaugeMiniBarsDefinitions `json:"barsDefinitions"` Mode string `json:"mode"` TextMode string `json:"textMode"` @@ -1064,6 +1055,7 @@ type GaugeMiniViewProperties struct { LabelMainFontSize float64 `json:"labelMainFontSize"` LabelMainFontColor string `json:"labelMainFontColor"` + LabelBarsEnabled bool `json:"labelBarsEnabled"` LabelBarsFontSize float64 `json:"labelBarsFontSize"` LabelBarsFontColor string `json:"labelBarsFontColor"`