Skip to content

Commit 24c7fdf

Browse files
committed
Closes #13471 - Change split behavior of gauges and metrics vis (#13583)
* Closes #13471 - Change split behavior of gauges and metrics vis * removing old css classes
1 parent 8071ff5 commit 24c7fdf

File tree

10 files changed

+141
-5
lines changed

10 files changed

+141
-5
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function getDisplayName(Component) {
2+
return Component.displayName || Component.name || 'Component';
3+
}

src/core_plugins/metrics/public/components/vis_types/gauge/vis.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import PropTypes from 'prop-types';
22
import React from 'react';
3+
import { visWithSplits } from '../../vis_with_splits';
34
import tickFormatter from '../../lib/tick_formatter';
45
import _ from 'lodash';
56
import Gauge from 'plugins/metrics/visualizations/components/gauge';
@@ -29,6 +30,7 @@ function GaugeVisualization(props) {
2930
const { backgroundColor, model, visData } = props;
3031
const colors = getColors(props);
3132
const series = _.get(visData, `${model.id}.series`, [])
33+
.filter(row => row)
3234
.map((row, i) => {
3335
const seriesDef = model.series.find(s => _.includes(row.id, s.id));
3436
const newProps = {};
@@ -41,7 +43,8 @@ function GaugeVisualization(props) {
4143
const params = {
4244
metric: series[0],
4345
type: model.gauge_style || 'half',
44-
reversed: props.reversed
46+
reversed: props.reversed,
47+
additionalLabel: props.additionalLabel
4548
};
4649

4750
if (colors.text) {
@@ -70,11 +73,12 @@ function GaugeVisualization(props) {
7073
GaugeVisualization.propTypes = {
7174
backgroundColor: PropTypes.string,
7275
className: PropTypes.string,
76+
additionalLabel: PropTypes.string,
7377
model: PropTypes.object,
7478
onBrush: PropTypes.func,
7579
onChange: PropTypes.func,
7680
reversed: PropTypes.bool,
7781
visData: PropTypes.object
7882
};
7983

80-
export default GaugeVisualization;
84+
export default visWithSplits(GaugeVisualization);

src/core_plugins/metrics/public/components/vis_types/metric/vis.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import PropTypes from 'prop-types';
22
import React from 'react';
3+
import { visWithSplits } from '../../vis_with_splits';
34
import tickFormatter from '../../lib/tick_formatter';
45
import _ from 'lodash';
56
import Metric from 'plugins/metrics/visualizations/components/metric';
@@ -29,6 +30,7 @@ function MetricVisualization(props) {
2930
const { backgroundColor, model, visData } = props;
3031
const colors = getColors(props);
3132
const series = _.get(visData, `${model.id}.series`, [])
33+
.filter(row => row)
3234
.map((row, i) => {
3335
const seriesDef = model.series.find(s => _.includes(row.id, s.id));
3436
const newProps = {};
@@ -40,7 +42,8 @@ function MetricVisualization(props) {
4042
});
4143
const params = {
4244
metric: series[0],
43-
reversed: props.reversed
45+
reversed: props.reversed,
46+
additionalLabel: props.additionalLabel
4447
};
4548
if (series[1]) {
4649
params.secondary = series[1];
@@ -63,11 +66,12 @@ function MetricVisualization(props) {
6366
MetricVisualization.propTypes = {
6467
backgroundColor: PropTypes.string,
6568
className: PropTypes.string,
69+
additionalLabel: PropTypes.string,
6670
model: PropTypes.object,
6771
onBrush: PropTypes.func,
6872
onChange: PropTypes.func,
6973
reversed: PropTypes.bool,
7074
visData: PropTypes.object
7175
};
7276

73-
export default MetricVisualization;
77+
export default visWithSplits(MetricVisualization);
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import React from 'react';
2+
import { getDisplayName } from './lib/get_display_name';
3+
import { last, findIndex, first } from 'lodash';
4+
import calculateLabel from '../../common/calculate_label';
5+
export function visWithSplits(WrappedComponent) {
6+
function SplitVisComponent(props) {
7+
const { model, visData } = props;
8+
if (visData[model.id].series.every(s => s.id.split(':').length === 1)) {
9+
return (<WrappedComponent {...props} />);
10+
}
11+
12+
const splitsVisData = visData[model.id].series.reduce((acc, series) => {
13+
const [seriesId, splitId] = series.id.split(':');
14+
const seriesModel = model.series.find(s => s.id === seriesId);
15+
if (!seriesModel || !splitId) return acc;
16+
const metric = last(seriesModel.metrics);
17+
const label = calculateLabel(metric, seriesModel.metrics);
18+
if (!acc[splitId]) acc[splitId] = { series: [], label: series.label };
19+
acc[splitId].series.push({
20+
...series,
21+
id: seriesId,
22+
color: seriesModel.color,
23+
label: seriesModel.label || label
24+
});
25+
return acc;
26+
}, {});
27+
28+
const nonSplitSeries = first(visData[model.id].series.filter((series) => {
29+
const seriesModel = model.series.find(s => s.id === series.id);
30+
if (!seriesModel) return false;
31+
return ['everything', 'filter'].includes(seriesModel.split_mode);
32+
}));
33+
34+
const indexOfNonSplit = nonSplitSeries ? findIndex(model.series, s => s.id === nonSplitSeries.id) : null;
35+
36+
37+
const rows = Object.keys(splitsVisData).map(key => {
38+
const splitData = splitsVisData[key];
39+
const { series, label } = splitData;
40+
const newSeries = (indexOfNonSplit != null && indexOfNonSplit > 0) ? [...series, nonSplitSeries] : [nonSplitSeries, ...series];
41+
const newVisData = {
42+
[model.id]: {
43+
id: model.id,
44+
series: newSeries || series
45+
}
46+
};
47+
return (
48+
<div key={key} className="splitVis_split">
49+
<div className="splitVis_visualization">
50+
<WrappedComponent
51+
model={model}
52+
visData={newVisData}
53+
onBrush={props.onBrush}
54+
additionalLabel={label}
55+
backgroundColor={props.backgroundColor}
56+
/>
57+
</div>
58+
</div>
59+
);
60+
});
61+
62+
return (
63+
<div className="splitVis">{rows}</div>
64+
);
65+
}
66+
SplitVisComponent.displayName = `SplitVisComponent(${getDisplayName(WrappedComponent)})`;
67+
return SplitVisComponent;
68+
}

src/core_plugins/metrics/public/less/main.less

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,6 @@
3636
@import './sortable.less';
3737
@import './color_picker.less';
3838
@import './error.less';
39+
@import './split_vis.less';
3940

4041

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
.splitVis {
2+
display: flex;
3+
flex: 1 0 auto;
4+
}
5+
6+
.splitVis_split {
7+
display: flex;
8+
flex: 1 0 0;
9+
flex-direction: column;
10+
overflow: hidden;
11+
}
12+
13+
.splitVis_visualization {
14+
position: relative;
15+
flex: 1 0 auto;
16+
}

src/core_plugins/metrics/public/visualizations/components/gauge.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ class Gauge extends Component {
8888
};
8989

9090
let metrics;
91+
let additionalLabel;
92+
if (this.props.additionalLabel) {
93+
additionalLabel = (
94+
<div className="thorGauge_additionalLabel">
95+
{this.props.additionalLabel}
96+
</div>
97+
);
98+
}
9199
if (type === 'half') {
92100
metrics = (
93101
<div
@@ -106,6 +114,7 @@ class Gauge extends Component {
106114
ref="label"
107115
>{ formatter(value) }
108116
</div>
117+
{additionalLabel}
109118
</div>
110119
);
111120
} else {
@@ -126,6 +135,7 @@ class Gauge extends Component {
126135
ref="title"
127136
>{ title }
128137
</div>
138+
{additionalLabel}
129139
</div>
130140
);
131141
}
@@ -161,6 +171,7 @@ Gauge.propTypes = {
161171
reversed: PropTypes.bool,
162172
type: PropTypes.oneOf(['half', 'circle']),
163173
valueColor: PropTypes.string,
174+
additionalLabel: PropTypes.string
164175
};
165176

166177
export default Gauge;

src/core_plugins/metrics/public/visualizations/components/metric.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ class Metric extends Component {
117117
);
118118
}
119119

120+
let additionalLabel;
121+
if (this.props.additionalLabel) {
122+
additionalLabel = (
123+
<div className="rhythm_metric__additionalLabel">
124+
{this.props.additionalLabel}
125+
</div>
126+
);
127+
}
128+
120129
return (
121130
<div className="rhythm_metric" style={styles.container}>
122131
<div
@@ -129,6 +138,7 @@ class Metric extends Component {
129138
<div style={styles.primary_value} className="rhythm_metric__primary-value">{ primaryValue }</div>
130139
</div>
131140
{ secondarySnippet }
141+
{additionalLabel}
132142
</div>
133143
</div>
134144
</div>
@@ -141,7 +151,8 @@ Metric.propTypes = {
141151
backgroundColor: PropTypes.string,
142152
metric: PropTypes.object,
143153
secondary: PropTypes.object,
144-
reversed: PropTypes.bool
154+
reversed: PropTypes.bool,
155+
additionalLabel: PropTypes.string
145156
};
146157

147158
export default Metric;

src/core_plugins/metrics/public/visualizations/less/includes/gauge.less

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@
3939
color: @black;
4040
}
4141

42+
.thorGauge_additionalLabel {
43+
font-size: 8px;
44+
overflow: hidden;
45+
white-space: nowrap;
46+
text-overflow: ellipsis;
47+
width: 100%;
48+
padding: 0 5px;
49+
}
50+
4251
.thorCircleGauge__resize {
4352
position: relative;
4453
display: flex;

src/core_plugins/metrics/public/visualizations/less/includes/metric.less

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,12 @@
6060
padding: 0.25em 0.5em 0.5em;
6161
}
6262

63+
.rhythm_metric__additionalLabel {
64+
font-size: 0.25em;
65+
width: 50px;
66+
overflow: hidden;
67+
text-overflow: ellipsis;
68+
padding: 2px 0 0 0;
69+
white-space: nowrap;
70+
text-align: center;
71+
}

0 commit comments

Comments
 (0)