@perses-dev/timeseries-chart-plugin 0.13.0-beta.2 → 0.13.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mf/js/TimeSeriesChart.3eab0aad.js +7 -0
- package/__mf/js/async/121.c3c0e54f.js +2 -0
- package/__mf/js/async/137.59c998ab.js +38 -0
- package/__mf/js/async/177.2fef2962.js +1 -0
- package/__mf/js/async/187.f5e8932b.js +1 -0
- package/__mf/js/async/192.c3dd56d5.js +1 -0
- package/__mf/js/async/2.60fa4a40.js +1 -0
- package/__mf/js/async/208.b9f374ad.js +7 -0
- package/__mf/js/async/235.d23c8ef0.js +1 -0
- package/__mf/js/async/274.72dfa9c8.js +2 -0
- package/__mf/js/async/356.8170c96d.js +1 -0
- package/__mf/js/async/392.b9ba5bf2.js +2 -0
- package/__mf/js/async/470.e09f33b7.js +2 -0
- package/__mf/js/async/491.85194549.js +1 -0
- package/__mf/js/async/52.0d78de2b.js +1 -0
- package/__mf/js/async/527.f97d1b86.js +110 -0
- package/__mf/js/async/558.8ac6d4e3.js +3 -0
- package/__mf/js/async/568.45da2c30.js +1 -0
- package/__mf/js/async/587.c9460696.js +1 -0
- package/__mf/js/async/588.0a1aa144.js +1 -0
- package/__mf/js/async/603.3b771310.js +2 -0
- package/__mf/js/async/603.3b771310.js.LICENSE.txt +9 -0
- package/__mf/js/async/616.79484ac8.js +1 -0
- package/__mf/js/async/655.dbf8c618.js +1 -0
- package/__mf/js/async/694.0fb9ee5a.js +2 -0
- package/__mf/js/async/702.785cd635.js +2 -0
- package/__mf/js/async/71.8c6cf914.js +1 -0
- package/__mf/js/async/724.c45dcf5b.js +1 -0
- package/__mf/js/async/873.04a201bf.js +1 -0
- package/__mf/js/async/941.b89f8595.js +2 -0
- package/__mf/js/async/955.176fe200.js +1 -0
- package/__mf/js/async/968.2a9fb1a0.js +1 -0
- package/__mf/js/async/978.a9865b23.js +1 -0
- package/__mf/js/async/984.4793f667.js +22 -0
- package/__mf/js/async/{90.16425d5a.js.LICENSE.txt → 984.4793f667.js.LICENSE.txt} +0 -10
- package/__mf/js/async/__federation_expose_TimeSeriesChart.62d8f589.js +1 -0
- package/__mf/js/async/lib-router.319c02cd.js +2 -0
- package/__mf/js/main.23e38819.js +7 -0
- package/lib/QuerySettingsEditor.d.ts.map +1 -1
- package/lib/QuerySettingsEditor.js +93 -14
- package/lib/QuerySettingsEditor.js.map +1 -1
- package/lib/TimeSeriesChartBase.d.ts +2 -0
- package/lib/TimeSeriesChartBase.d.ts.map +1 -1
- package/lib/TimeSeriesChartBase.js +90 -7
- package/lib/TimeSeriesChartBase.js.map +1 -1
- package/lib/TimeSeriesChartPanel.d.ts.map +1 -1
- package/lib/TimeSeriesChartPanel.js +24 -3
- package/lib/TimeSeriesChartPanel.js.map +1 -1
- package/lib/VisualOptionsEditor.js.map +1 -1
- package/lib/annotations/AnnotationTooltip.d.ts +18 -0
- package/lib/annotations/AnnotationTooltip.d.ts.map +1 -0
- package/lib/annotations/AnnotationTooltip.js +352 -0
- package/lib/annotations/AnnotationTooltip.js.map +1 -0
- package/lib/cjs/QuerySettingsEditor.js +91 -12
- package/lib/cjs/TimeSeriesChartBase.js +90 -7
- package/lib/cjs/TimeSeriesChartPanel.js +24 -3
- package/lib/cjs/annotations/AnnotationTooltip.js +370 -0
- package/lib/cjs/utils/annotation.js +37 -0
- package/lib/cjs/utils/data-transform.js +9 -13
- package/lib/time-series-chart-model.d.ts +7 -0
- package/lib/time-series-chart-model.d.ts.map +1 -1
- package/lib/time-series-chart-model.js.map +1 -1
- package/lib/utils/annotation.d.ts +5 -0
- package/lib/utils/annotation.d.ts.map +1 -0
- package/lib/utils/annotation.js +29 -0
- package/lib/utils/annotation.js.map +1 -0
- package/lib/utils/data-transform.d.ts +1 -0
- package/lib/utils/data-transform.d.ts.map +1 -1
- package/lib/utils/data-transform.js +9 -13
- package/lib/utils/data-transform.js.map +1 -1
- package/mf-manifest.json +61 -36
- package/mf-stats.json +68 -36
- package/package.json +5 -4
- package/__mf/js/TimeSeriesChart.e9912623.js +0 -7
- package/__mf/js/async/121.df4898d6.js +0 -2
- package/__mf/js/async/177.56f1be10.js +0 -1
- package/__mf/js/async/192.beef3a1a.js +0 -1
- package/__mf/js/async/2.c3740bb9.js +0 -1
- package/__mf/js/async/235.c24f24f7.js +0 -1
- package/__mf/js/async/274.d112354f.js +0 -2
- package/__mf/js/async/291.5ce0f3cb.js +0 -39
- package/__mf/js/async/356.9f551c8a.js +0 -1
- package/__mf/js/async/392.2350fb02.js +0 -2
- package/__mf/js/async/470.a4fd777e.js +0 -2
- package/__mf/js/async/491.6f81cf51.js +0 -1
- package/__mf/js/async/568.cdcaf97d.js +0 -1
- package/__mf/js/async/587.c12780da.js +0 -1
- package/__mf/js/async/588.6662e16a.js +0 -1
- package/__mf/js/async/616.52acb1b4.js +0 -1
- package/__mf/js/async/681.8d61b348.js +0 -110
- package/__mf/js/async/702.de247ad8.js +0 -2
- package/__mf/js/async/71.84e486c9.js +0 -1
- package/__mf/js/async/724.3439df06.js +0 -1
- package/__mf/js/async/78.91de282a.js +0 -1
- package/__mf/js/async/821.aa2ab3e8.js +0 -7
- package/__mf/js/async/873.9aad328a.js +0 -1
- package/__mf/js/async/90.16425d5a.js +0 -24
- package/__mf/js/async/941.c0e2d25e.js +0 -2
- package/__mf/js/async/968.6de5fa7c.js +0 -1
- package/__mf/js/async/978.5c14e175.js +0 -1
- package/__mf/js/async/__federation_expose_TimeSeriesChart.58a7f341.js +0 -1
- package/__mf/js/async/lib-router.7a3f7bb4.js +0 -2
- package/__mf/js/main.de1f5d2f.js +0 -7
- /package/__mf/css/async/{821.85c2cbf6.css → 208.85c2cbf6.css} +0 -0
- /package/__mf/js/async/{121.df4898d6.js.LICENSE.txt → 121.c3c0e54f.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{821.aa2ab3e8.js.LICENSE.txt → 208.b9f374ad.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{274.d112354f.js.LICENSE.txt → 274.72dfa9c8.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{392.2350fb02.js.LICENSE.txt → 392.b9ba5bf2.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{470.a4fd777e.js.LICENSE.txt → 470.e09f33b7.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{681.8d61b348.js.LICENSE.txt → 527.f97d1b86.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{291.5ce0f3cb.js.LICENSE.txt → 694.0fb9ee5a.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{702.de247ad8.js.LICENSE.txt → 702.785cd635.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{941.c0e2d25e.js.LICENSE.txt → 941.b89f8595.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{lib-router.7a3f7bb4.js.LICENSE.txt → lib-router.319c02cd.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// Copyright The Perses Authors
|
|
2
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
// you may not use this file except in compliance with the License.
|
|
4
|
+
// You may obtain a copy of the License at
|
|
5
|
+
//
|
|
6
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
//
|
|
8
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
// See the License for the specific language governing permissions and
|
|
12
|
+
// limitations under the License.
|
|
13
|
+
"use strict";
|
|
14
|
+
Object.defineProperty(exports, "__esModule", {
|
|
15
|
+
value: true
|
|
16
|
+
});
|
|
17
|
+
function _export(target, all) {
|
|
18
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
_export(exports, {
|
|
24
|
+
get AnnotationTooltip () {
|
|
25
|
+
return AnnotationTooltip;
|
|
26
|
+
},
|
|
27
|
+
get buildAnnotationSeries () {
|
|
28
|
+
return buildAnnotationSeries;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const _jsxruntime = require("react/jsx-runtime");
|
|
32
|
+
const _material = require("@mui/material");
|
|
33
|
+
const _Pin = /*#__PURE__*/ _interop_require_default(require("mdi-material-ui/Pin"));
|
|
34
|
+
const _PinOutline = /*#__PURE__*/ _interop_require_default(require("mdi-material-ui/PinOutline"));
|
|
35
|
+
const _useresizeobserver = /*#__PURE__*/ _interop_require_default(require("use-resize-observer"));
|
|
36
|
+
const _components = require("@perses-dev/components");
|
|
37
|
+
const _pluginsystem = require("@perses-dev/plugin-system");
|
|
38
|
+
function _interop_require_default(obj) {
|
|
39
|
+
return obj && obj.__esModule ? obj : {
|
|
40
|
+
default: obj
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function AnnotationTooltip({ annotation, containerId, formatWithUserTimeZone, pinnedPos, enablePinning = true, onUnpinClick }) {
|
|
44
|
+
const mousePos = (0, _components.useMousePosition)();
|
|
45
|
+
const { height, width, ref: tooltipRef } = (0, _useresizeobserver.default)();
|
|
46
|
+
const isPinned = pinnedPos !== null;
|
|
47
|
+
if (!isPinned && mousePos === null) return null;
|
|
48
|
+
const containerElement = containerId ? document.querySelector(containerId) : undefined;
|
|
49
|
+
const maxHeight = containerElement ? containerElement.getBoundingClientRect().height : undefined;
|
|
50
|
+
const transform = (0, _components.assembleTransform)(mousePos, pinnedPos, height ?? 0, width ?? 0, containerElement);
|
|
51
|
+
const start = (0, _components.getDateAndTime)(annotation.start, formatWithUserTimeZone);
|
|
52
|
+
const end = annotation.end !== undefined ? (0, _components.getDateAndTime)(annotation.end, formatWithUserTimeZone) : null;
|
|
53
|
+
return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Portal, {
|
|
54
|
+
container: containerElement,
|
|
55
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Box, {
|
|
56
|
+
ref: tooltipRef,
|
|
57
|
+
sx: (theme)=>(0, _components.getTooltipStyles)(theme, pinnedPos, maxHeight),
|
|
58
|
+
style: {
|
|
59
|
+
transform
|
|
60
|
+
},
|
|
61
|
+
children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Stack, {
|
|
62
|
+
spacing: 0.5,
|
|
63
|
+
children: [
|
|
64
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Box, {
|
|
65
|
+
sx: (theme)=>({
|
|
66
|
+
width: '100%',
|
|
67
|
+
maxWidth: _components.TOOLTIP_MAX_WIDTH,
|
|
68
|
+
padding: theme.spacing(1.5, 2, 0.5, 2),
|
|
69
|
+
backgroundColor: theme.palette.designSystem?.grey[800] ?? _components.TOOLTIP_BG_COLOR_FALLBACK,
|
|
70
|
+
position: 'sticky',
|
|
71
|
+
top: 0,
|
|
72
|
+
left: 0
|
|
73
|
+
}),
|
|
74
|
+
children: [
|
|
75
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Box, {
|
|
76
|
+
sx: {
|
|
77
|
+
display: 'flex',
|
|
78
|
+
alignItems: 'center',
|
|
79
|
+
paddingBottom: 0.5,
|
|
80
|
+
width: '100%'
|
|
81
|
+
},
|
|
82
|
+
children: [
|
|
83
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Box, {
|
|
84
|
+
sx: {
|
|
85
|
+
width: 8,
|
|
86
|
+
height: 8,
|
|
87
|
+
borderRadius: '50%',
|
|
88
|
+
backgroundColor: annotation.color ?? _pluginsystem.DEFAULT_ANNOTATION_COLOR,
|
|
89
|
+
marginRight: 1,
|
|
90
|
+
flexShrink: 0
|
|
91
|
+
}
|
|
92
|
+
}),
|
|
93
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Box, {
|
|
94
|
+
sx: {
|
|
95
|
+
flexGrow: 1,
|
|
96
|
+
minWidth: 0
|
|
97
|
+
},
|
|
98
|
+
children: [
|
|
99
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Typography, {
|
|
100
|
+
variant: "caption",
|
|
101
|
+
children: [
|
|
102
|
+
start.formattedDate,
|
|
103
|
+
" - ",
|
|
104
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("strong", {
|
|
105
|
+
children: start.formattedTime
|
|
106
|
+
})
|
|
107
|
+
]
|
|
108
|
+
}),
|
|
109
|
+
end && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
|
|
110
|
+
children: [
|
|
111
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Typography, {
|
|
112
|
+
variant: "caption",
|
|
113
|
+
children: ' → '
|
|
114
|
+
}),
|
|
115
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Typography, {
|
|
116
|
+
variant: "caption",
|
|
117
|
+
children: [
|
|
118
|
+
end.formattedDate,
|
|
119
|
+
" - ",
|
|
120
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)("strong", {
|
|
121
|
+
children: end.formattedTime
|
|
122
|
+
})
|
|
123
|
+
]
|
|
124
|
+
})
|
|
125
|
+
]
|
|
126
|
+
})
|
|
127
|
+
]
|
|
128
|
+
}),
|
|
129
|
+
enablePinning && /*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Stack, {
|
|
130
|
+
direction: "row",
|
|
131
|
+
alignItems: "center",
|
|
132
|
+
sx: {
|
|
133
|
+
marginLeft: 1,
|
|
134
|
+
flexShrink: 0
|
|
135
|
+
},
|
|
136
|
+
children: [
|
|
137
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Typography, {
|
|
138
|
+
sx: {
|
|
139
|
+
marginRight: 0.5,
|
|
140
|
+
fontSize: 11,
|
|
141
|
+
verticalAlign: 'middle'
|
|
142
|
+
},
|
|
143
|
+
children: isPinned ? _components.UNPIN_TOOLTIP_HELP_TEXT : _components.PIN_TOOLTIP_HELP_TEXT
|
|
144
|
+
}),
|
|
145
|
+
isPinned ? /*#__PURE__*/ (0, _jsxruntime.jsx)(_Pin.default, {
|
|
146
|
+
onClick: ()=>{
|
|
147
|
+
if (onUnpinClick !== undefined) onUnpinClick();
|
|
148
|
+
},
|
|
149
|
+
sx: {
|
|
150
|
+
fontSize: 16,
|
|
151
|
+
cursor: 'pointer'
|
|
152
|
+
}
|
|
153
|
+
}) : /*#__PURE__*/ (0, _jsxruntime.jsx)(_PinOutline.default, {
|
|
154
|
+
sx: {
|
|
155
|
+
fontSize: 16
|
|
156
|
+
}
|
|
157
|
+
})
|
|
158
|
+
]
|
|
159
|
+
})
|
|
160
|
+
]
|
|
161
|
+
}),
|
|
162
|
+
/*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Divider, {
|
|
163
|
+
sx: (theme)=>({
|
|
164
|
+
width: '100%',
|
|
165
|
+
borderColor: theme.palette.grey['500']
|
|
166
|
+
})
|
|
167
|
+
})
|
|
168
|
+
]
|
|
169
|
+
}),
|
|
170
|
+
/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Box, {
|
|
171
|
+
sx: (theme)=>({
|
|
172
|
+
padding: theme.spacing(0.5, 2, 1.5, 2)
|
|
173
|
+
}),
|
|
174
|
+
children: [
|
|
175
|
+
annotation.title && /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Typography, {
|
|
176
|
+
variant: "caption",
|
|
177
|
+
sx: {
|
|
178
|
+
display: 'block',
|
|
179
|
+
fontWeight: 'bold',
|
|
180
|
+
marginBottom: 0.5
|
|
181
|
+
},
|
|
182
|
+
children: annotation.title
|
|
183
|
+
}),
|
|
184
|
+
annotation.legend && /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Typography, {
|
|
185
|
+
variant: "caption",
|
|
186
|
+
sx: {
|
|
187
|
+
display: 'block',
|
|
188
|
+
marginBottom: 0.5
|
|
189
|
+
},
|
|
190
|
+
children: annotation.legend
|
|
191
|
+
}),
|
|
192
|
+
annotation.tags && Object.keys(annotation.tags).length > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Box, {
|
|
193
|
+
sx: {
|
|
194
|
+
display: 'flex',
|
|
195
|
+
flexWrap: 'wrap',
|
|
196
|
+
gap: 0.5,
|
|
197
|
+
marginTop: 0.5
|
|
198
|
+
},
|
|
199
|
+
children: Object.entries(annotation.tags).map(([key, value])=>/*#__PURE__*/ (0, _jsxruntime.jsxs)(_material.Box, {
|
|
200
|
+
sx: (theme)=>({
|
|
201
|
+
backgroundColor: theme.palette.grey['700'],
|
|
202
|
+
borderRadius: '4px',
|
|
203
|
+
padding: '2px 6px',
|
|
204
|
+
fontSize: '0.7rem',
|
|
205
|
+
fontFamily: 'monospace'
|
|
206
|
+
}),
|
|
207
|
+
children: [
|
|
208
|
+
key,
|
|
209
|
+
": ",
|
|
210
|
+
value
|
|
211
|
+
]
|
|
212
|
+
}, key))
|
|
213
|
+
})
|
|
214
|
+
]
|
|
215
|
+
})
|
|
216
|
+
]
|
|
217
|
+
})
|
|
218
|
+
})
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
function buildAnnotationSeries(annotations) {
|
|
222
|
+
if (!annotations?.length) return [];
|
|
223
|
+
const markAreaData = [];
|
|
224
|
+
const markLineData = [];
|
|
225
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
226
|
+
const markPointData = [];
|
|
227
|
+
annotations.forEach((annotation, index)=>{
|
|
228
|
+
const color = annotation.color ?? _pluginsystem.DEFAULT_ANNOTATION_COLOR;
|
|
229
|
+
const opacity = 0.3;
|
|
230
|
+
if (annotation.end !== undefined) {
|
|
231
|
+
// Range annotation - use markArea and markLine (silent) + markers at start/end
|
|
232
|
+
markLineData.push({
|
|
233
|
+
xAxis: annotation.start,
|
|
234
|
+
lineStyle: {
|
|
235
|
+
color,
|
|
236
|
+
width: 2,
|
|
237
|
+
type: 'dashed'
|
|
238
|
+
},
|
|
239
|
+
label: {
|
|
240
|
+
show: false
|
|
241
|
+
},
|
|
242
|
+
annotationIndex: index
|
|
243
|
+
});
|
|
244
|
+
markLineData.push({
|
|
245
|
+
xAxis: annotation.end,
|
|
246
|
+
lineStyle: {
|
|
247
|
+
color,
|
|
248
|
+
width: 2,
|
|
249
|
+
type: 'dashed'
|
|
250
|
+
},
|
|
251
|
+
label: {
|
|
252
|
+
show: false
|
|
253
|
+
},
|
|
254
|
+
annotationIndex: index
|
|
255
|
+
});
|
|
256
|
+
markAreaData.push([
|
|
257
|
+
{
|
|
258
|
+
xAxis: annotation.start,
|
|
259
|
+
itemStyle: {
|
|
260
|
+
color,
|
|
261
|
+
opacity
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
xAxis: annotation.end
|
|
266
|
+
}
|
|
267
|
+
]);
|
|
268
|
+
// Add start and end markers
|
|
269
|
+
for (const isStart of [
|
|
270
|
+
true,
|
|
271
|
+
false
|
|
272
|
+
]){
|
|
273
|
+
markPointData.push({
|
|
274
|
+
coord: [
|
|
275
|
+
isStart ? annotation.start : annotation.end,
|
|
276
|
+
0
|
|
277
|
+
],
|
|
278
|
+
symbol: 'triangle',
|
|
279
|
+
symbolSize: [
|
|
280
|
+
12,
|
|
281
|
+
12
|
|
282
|
+
],
|
|
283
|
+
symbolRotate: 0,
|
|
284
|
+
symbolOffset: [
|
|
285
|
+
0,
|
|
286
|
+
4
|
|
287
|
+
],
|
|
288
|
+
itemStyle: {
|
|
289
|
+
color
|
|
290
|
+
},
|
|
291
|
+
annotationIndex: index,
|
|
292
|
+
emphasis: {
|
|
293
|
+
disabled: true
|
|
294
|
+
},
|
|
295
|
+
isStart: isStart,
|
|
296
|
+
isEnd: !isStart
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
} else {
|
|
300
|
+
// Point annotation - use markLine (silent) + single marker
|
|
301
|
+
markLineData.push({
|
|
302
|
+
xAxis: annotation.start,
|
|
303
|
+
lineStyle: {
|
|
304
|
+
color,
|
|
305
|
+
width: 2,
|
|
306
|
+
type: 'dashed'
|
|
307
|
+
},
|
|
308
|
+
label: {
|
|
309
|
+
show: false
|
|
310
|
+
},
|
|
311
|
+
annotationIndex: index
|
|
312
|
+
});
|
|
313
|
+
// Add point marker
|
|
314
|
+
markPointData.push({
|
|
315
|
+
coord: [
|
|
316
|
+
annotation.start,
|
|
317
|
+
0
|
|
318
|
+
],
|
|
319
|
+
symbol: 'triangle',
|
|
320
|
+
symbolSize: [
|
|
321
|
+
12,
|
|
322
|
+
10
|
|
323
|
+
],
|
|
324
|
+
symbolRotate: 0,
|
|
325
|
+
symbolOffset: [
|
|
326
|
+
0,
|
|
327
|
+
'120%'
|
|
328
|
+
],
|
|
329
|
+
itemStyle: {
|
|
330
|
+
color
|
|
331
|
+
},
|
|
332
|
+
annotationIndex: index,
|
|
333
|
+
isPoint: true
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
const series = {
|
|
338
|
+
type: 'line',
|
|
339
|
+
data: [],
|
|
340
|
+
silent: false,
|
|
341
|
+
markArea: markAreaData.length > 0 ? {
|
|
342
|
+
silent: true,
|
|
343
|
+
data: markAreaData,
|
|
344
|
+
label: {
|
|
345
|
+
show: false
|
|
346
|
+
}
|
|
347
|
+
} : undefined,
|
|
348
|
+
markLine: markLineData.length > 0 ? {
|
|
349
|
+
silent: true,
|
|
350
|
+
symbol: [
|
|
351
|
+
'none',
|
|
352
|
+
'none'
|
|
353
|
+
],
|
|
354
|
+
data: markLineData,
|
|
355
|
+
lineStyle: {
|
|
356
|
+
type: 'dashed'
|
|
357
|
+
}
|
|
358
|
+
} : undefined,
|
|
359
|
+
markPoint: markPointData.length > 0 ? {
|
|
360
|
+
silent: false,
|
|
361
|
+
data: markPointData,
|
|
362
|
+
label: {
|
|
363
|
+
show: false
|
|
364
|
+
}
|
|
365
|
+
} : undefined
|
|
366
|
+
};
|
|
367
|
+
return [
|
|
368
|
+
series
|
|
369
|
+
];
|
|
370
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Copyright The Perses Authors
|
|
2
|
+
// Licensed under the Apache License, Version 2.0 (the \"License\");
|
|
3
|
+
// you may not use this file except in compliance with the License.
|
|
4
|
+
// You may obtain a copy of the License at
|
|
5
|
+
//
|
|
6
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
//
|
|
8
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
// distributed under the License is distributed on an \"AS IS\" BASIS,
|
|
10
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
// See the License for the specific language governing permissions and
|
|
12
|
+
// limitations under the License.
|
|
13
|
+
"use strict";
|
|
14
|
+
Object.defineProperty(exports, "__esModule", {
|
|
15
|
+
value: true
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(exports, "convertAnnotationToTimeSeriesAnnotation", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function() {
|
|
20
|
+
return convertAnnotationToTimeSeriesAnnotation;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
function convertAnnotationToTimeSeriesAnnotation(annotations) {
|
|
24
|
+
const result = [];
|
|
25
|
+
for (const annotation of annotations){
|
|
26
|
+
for (const item of annotation.data){
|
|
27
|
+
if (annotation.definition.display.hidden) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
result.push({
|
|
31
|
+
...annotation.definition.display,
|
|
32
|
+
...item
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
@@ -65,6 +65,7 @@ function getCommonTimeScaleForQueries(queries) {
|
|
|
65
65
|
function getTimeSeries(id, datasetIndex, formattedName, visual, timeScale, paletteColor, querySettings, yAxisIndex) {
|
|
66
66
|
const lineWidth = visual.lineWidth ?? _timeserieschartmodel.DEFAULT_LINE_WIDTH;
|
|
67
67
|
const pointRadius = visual.pointRadius ?? _timeserieschartmodel.DEFAULT_POINT_RADIUS;
|
|
68
|
+
const shouldStack = querySettings?.stack !== undefined ? querySettings.stack : visual.stack === 'all';
|
|
68
69
|
// Shows datapoint symbols when selected time range is roughly 15 minutes or less
|
|
69
70
|
const minuteMs = 60000;
|
|
70
71
|
let showPoints = timeScale.rangeMs <= minuteMs * 15;
|
|
@@ -79,7 +80,7 @@ function getTimeSeries(id, datasetIndex, formattedName, visual, timeScale, palet
|
|
|
79
80
|
datasetIndex,
|
|
80
81
|
name: formattedName,
|
|
81
82
|
color: paletteColor,
|
|
82
|
-
stack:
|
|
83
|
+
stack: shouldStack ? 'all' : undefined,
|
|
83
84
|
yAxisIndex: yAxisIndex,
|
|
84
85
|
label: {
|
|
85
86
|
show: false
|
|
@@ -94,7 +95,7 @@ function getTimeSeries(id, datasetIndex, formattedName, visual, timeScale, palet
|
|
|
94
95
|
name: formattedName,
|
|
95
96
|
connectNulls: visual.connectNulls ?? _timeserieschartmodel.DEFAULT_CONNECT_NULLS,
|
|
96
97
|
color: paletteColor,
|
|
97
|
-
stack:
|
|
98
|
+
stack: shouldStack ? 'all' : undefined,
|
|
98
99
|
yAxisIndex: yAxisIndex,
|
|
99
100
|
sampling: 'lttb',
|
|
100
101
|
progressiveThreshold: _components.OPTIMIZED_MODE_SERIES_LIMIT,
|
|
@@ -118,13 +119,6 @@ function getTimeSeries(id, datasetIndex, formattedName, visual, timeScale, palet
|
|
|
118
119
|
type: visual.lineStyle
|
|
119
120
|
}
|
|
120
121
|
},
|
|
121
|
-
selectedMode: 'single',
|
|
122
|
-
select: {
|
|
123
|
-
itemStyle: {
|
|
124
|
-
borderColor: paletteColor,
|
|
125
|
-
borderWidth: pointRadius + 0.5
|
|
126
|
-
}
|
|
127
|
-
},
|
|
128
122
|
blur: {
|
|
129
123
|
lineStyle: {
|
|
130
124
|
width: lineWidth,
|
|
@@ -177,8 +171,10 @@ function findMax(data) {
|
|
|
177
171
|
series.values.forEach((valueTuple)=>{
|
|
178
172
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
179
173
|
const [_, value] = valueTuple;
|
|
180
|
-
|
|
181
|
-
|
|
174
|
+
// Use the absolute value so percent thresholds compute correctly against
|
|
175
|
+
// negated series (e.g. when `querySettings[].negativeY` is enabled).
|
|
176
|
+
if (typeof value === 'number' && Math.abs(value) > max) {
|
|
177
|
+
max = Math.abs(value);
|
|
182
178
|
}
|
|
183
179
|
});
|
|
184
180
|
});
|
|
@@ -186,8 +182,8 @@ function findMax(data) {
|
|
|
186
182
|
data.forEach((series)=>{
|
|
187
183
|
if (series.data !== undefined) {
|
|
188
184
|
series.data.forEach((value)=>{
|
|
189
|
-
if (typeof value === 'number' && value > max) {
|
|
190
|
-
max = value;
|
|
185
|
+
if (typeof value === 'number' && Math.abs(value) > max) {
|
|
186
|
+
max = Math.abs(value);
|
|
191
187
|
}
|
|
192
188
|
});
|
|
193
189
|
}
|
|
@@ -29,6 +29,13 @@ export interface QuerySettingsOptions {
|
|
|
29
29
|
lineStyle?: LineStyleType;
|
|
30
30
|
areaOpacity?: number;
|
|
31
31
|
format?: FormatOptions;
|
|
32
|
+
/**
|
|
33
|
+
* If true, the query's series values are negated for display so they render
|
|
34
|
+
* below the X axis. The original (positive) values are preserved for legend
|
|
35
|
+
* calculations and CSV export, matching Grafana's `transform: "negative-Y"` behavior.
|
|
36
|
+
*/
|
|
37
|
+
negativeY?: boolean;
|
|
38
|
+
stack?: boolean;
|
|
32
39
|
}
|
|
33
40
|
export type TimeSeriesChartOptionsEditorProps = OptionsEditorProps<TimeSeriesChartOptions>;
|
|
34
41
|
export interface TimeSeriesChartYAxisOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-series-chart-model.d.ts","sourceRoot":"","sources":["../../src/time-series-chart-model.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,UAAU,CAAC,sBAAsB,CAAC;IACnF,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CAAC,EAAE,2BAA2B,CAAC;IACpC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,MAAM,CAAC,EAAE,4BAA4B,CAAC;IACtC,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"time-series-chart-model.d.ts","sourceRoot":"","sources":["../../src/time-series-chart-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/time-series-chart-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { FormatOptions, ThresholdOptions } from '@perses-dev/components';\nimport { OptionsEditorProps, LegendSpecOptions } from '@perses-dev/plugin-system';\nimport { Definition } from '@perses-dev/spec';\n\n/**\n * Line style options for time series charts.\n */\nexport type LineStyleType = 'solid' | 'dashed' | 'dotted';\n\n/**\n * The schema for a TimeSeriesChart panel.\n */\nexport interface TimeSeriesChartDefinition extends Definition<TimeSeriesChartOptions> {\n kind: 'TimeSeriesChart';\n}\n\n/**\n * The Options object supported by the TimeSeriesChartPanel plugin.\n */\nexport interface TimeSeriesChartOptions {\n legend?: LegendSpecOptions;\n yAxis?: TimeSeriesChartYAxisOptions;\n thresholds?: ThresholdOptions;\n visual?: TimeSeriesChartVisualOptions;\n tooltip?: TooltipSpecOptions;\n querySettings?: QuerySettingsOptions[];\n}\n\nexport interface QuerySettingsOptions {\n queryIndex: number;\n colorMode?: 'fixed' | 'fixed-single';\n colorValue?: string;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n format?: FormatOptions;\n}\n\nexport type TimeSeriesChartOptionsEditorProps = OptionsEditorProps<TimeSeriesChartOptions>;\n\nexport interface TimeSeriesChartYAxisOptions {\n show?: boolean;\n label?: string;\n format?: FormatOptions;\n min?: number;\n max?: number;\n logBase?: LOG_BASE;\n}\n\nexport interface TooltipSpecOptions {\n enablePinning: boolean;\n}\n\nexport interface TimeSeriesChartPaletteOptions {\n mode: 'auto' | 'categorical';\n}\n\nexport type TimeSeriesChartVisualOptions = {\n display?: 'line' | 'bar';\n lineWidth?: number;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n showPoints?: 'auto' | 'always';\n palette?: TimeSeriesChartPaletteOptions;\n pointRadius?: number;\n stack?: StackOptions;\n connectNulls?: boolean;\n};\n\nexport const DEFAULT_FORMAT: FormatOptions = {\n unit: 'decimal',\n shortValues: true,\n};\n\nexport const DEFAULT_Y_AXIS: TimeSeriesChartYAxisOptions = {\n show: true,\n label: '',\n format: DEFAULT_FORMAT,\n min: undefined,\n max: undefined,\n logBase: undefined,\n};\n\nexport const Y_AXIS_CONFIG = {\n show: { label: 'Show' },\n label: { label: 'Label' },\n unit: { label: 'Unit' },\n min: { label: 'Min' },\n max: { label: 'Max' },\n logBase: { label: 'Log Base' },\n};\n\nexport const DEFAULT_DISPLAY = 'line';\nexport const DEFAULT_LINE_WIDTH = 1.25;\nexport const DEFAULT_LINE_STYLE = 'solid';\nexport const DEFAULT_AREA_OPACITY = 0;\n// How much larger datapoint symbols are than line width, also applied in VisualOptionsEditor.\nexport const POINT_SIZE_OFFSET = 1.5;\nexport const DEFAULT_POINT_RADIUS = DEFAULT_LINE_WIDTH + POINT_SIZE_OFFSET;\nexport const DEFAULT_CONNECT_NULLS = false;\n\nexport const DEFAULT_VISUAL: TimeSeriesChartVisualOptions = {\n display: DEFAULT_DISPLAY,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineStyle: DEFAULT_LINE_STYLE,\n areaOpacity: DEFAULT_AREA_OPACITY,\n pointRadius: DEFAULT_POINT_RADIUS,\n connectNulls: DEFAULT_CONNECT_NULLS,\n};\n\n// Controls how often static threshold values should be plotted so threshold data shows\n// in tooltip without flicker.\nexport const THRESHOLD_PLOT_INTERVAL = 15;\n\nexport const VISUAL_CONFIG = {\n lineWidth: {\n label: 'Line Width',\n testId: 'slider-line-width',\n min: 0.25,\n max: 3,\n step: 0.25,\n },\n lineStyle: {\n label: 'Line Style',\n },\n pointRadius: {\n label: 'Point Radius',\n testId: 'slider-point-radius',\n min: 0,\n max: 6,\n step: 0.25,\n },\n areaOpacity: {\n label: 'Area Opacity',\n testId: 'slider-area-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n },\n stack: {\n label: 'Stack Series',\n },\n connectNulls: {\n label: 'Connect Nulls',\n },\n};\n\n// None is equivalent to undefined since stack is optional\nexport type StackOptions = 'none' | 'all'; // TODO: add percent option support\n\nexport const STACK_CONFIG = {\n none: { label: 'None' },\n all: { label: 'All' },\n // TODO: enable option after 'Percent' implemented\n // percent: { label: 'Percent', disabled: true }, // hidden since not implemented yet\n};\n\nexport const STACK_OPTIONS = Object.entries(STACK_CONFIG).map(([id, config]) => {\n return {\n id: id as StackOptions,\n ...config,\n };\n});\n\nexport const LINE_STYLE_CONFIG = {\n solid: { label: 'Solid' },\n dashed: { label: 'Dashes' },\n dotted: { label: 'Dots' },\n};\n\nexport const OPACITY_CONFIG = {\n label: 'Opacity',\n testId: 'slider-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n};\n\n// LogBase outlines the allowed log bases for the log-supported charts.\nexport type LOG_BASE = undefined | 2 | 10;\n\n// Single source of truth for log base configuration\nexport const LOG_BASE_CONFIG: Record<string, { label: string; log: LOG_BASE }> = {\n none: { label: 'None', log: undefined },\n '2': { label: '2', log: 2 },\n '10': { label: '10', log: 10 },\n};\n\n// Options array for SettingsAutocomplete\nexport const LOG_BASE_OPTIONS = Object.entries(LOG_BASE_CONFIG).map(([id, config]) => ({\n id: id as string,\n ...config,\n}));\n\n// Both of these constants help produce a value that is LESS THAN the initial value.\n// For positive values, we multiply by a number less than 1 to get this outcome.\n// For negative values, we multiply to a number greater than 1 to get this outcome.\nexport const POSITIVE_MIN_VALUE_MULTIPLIER = 0.8;\nexport const NEGATIVE_MIN_VALUE_MULTIPLIER = 1.2;\n\n/**\n * Creates an initial/empty options object for the TimeSeriesChartPanel.\n */\nexport function createInitialTimeSeriesChartOptions(): TimeSeriesChartOptions {\n return {};\n}\n"],"names":["DEFAULT_FORMAT","unit","shortValues","DEFAULT_Y_AXIS","show","label","format","min","undefined","max","logBase","Y_AXIS_CONFIG","DEFAULT_DISPLAY","DEFAULT_LINE_WIDTH","DEFAULT_LINE_STYLE","DEFAULT_AREA_OPACITY","POINT_SIZE_OFFSET","DEFAULT_POINT_RADIUS","DEFAULT_CONNECT_NULLS","DEFAULT_VISUAL","display","lineWidth","lineStyle","areaOpacity","pointRadius","connectNulls","THRESHOLD_PLOT_INTERVAL","VISUAL_CONFIG","testId","step","stack","STACK_CONFIG","none","all","STACK_OPTIONS","Object","entries","map","id","config","LINE_STYLE_CONFIG","solid","dashed","dotted","OPACITY_CONFIG","LOG_BASE_CONFIG","log","LOG_BASE_OPTIONS","POSITIVE_MIN_VALUE_MULTIPLIER","NEGATIVE_MIN_VALUE_MULTIPLIER","createInitialTimeSeriesChartOptions"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;
|
|
1
|
+
{"version":3,"sources":["../../src/time-series-chart-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { FormatOptions, ThresholdOptions } from '@perses-dev/components';\nimport { OptionsEditorProps, LegendSpecOptions } from '@perses-dev/plugin-system';\nimport { Definition } from '@perses-dev/spec';\n\n/**\n * Line style options for time series charts.\n */\nexport type LineStyleType = 'solid' | 'dashed' | 'dotted';\n\n/**\n * The schema for a TimeSeriesChart panel.\n */\nexport interface TimeSeriesChartDefinition extends Definition<TimeSeriesChartOptions> {\n kind: 'TimeSeriesChart';\n}\n\n/**\n * The Options object supported by the TimeSeriesChartPanel plugin.\n */\nexport interface TimeSeriesChartOptions {\n legend?: LegendSpecOptions;\n yAxis?: TimeSeriesChartYAxisOptions;\n thresholds?: ThresholdOptions;\n visual?: TimeSeriesChartVisualOptions;\n tooltip?: TooltipSpecOptions;\n querySettings?: QuerySettingsOptions[];\n}\n\nexport interface QuerySettingsOptions {\n queryIndex: number;\n colorMode?: 'fixed' | 'fixed-single';\n colorValue?: string;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n format?: FormatOptions;\n /**\n * If true, the query's series values are negated for display so they render\n * below the X axis. The original (positive) values are preserved for legend\n * calculations and CSV export, matching Grafana's `transform: \"negative-Y\"` behavior.\n */\n negativeY?: boolean;\n stack?: boolean;\n}\n\nexport type TimeSeriesChartOptionsEditorProps = OptionsEditorProps<TimeSeriesChartOptions>;\n\nexport interface TimeSeriesChartYAxisOptions {\n show?: boolean;\n label?: string;\n format?: FormatOptions;\n min?: number;\n max?: number;\n logBase?: LOG_BASE;\n}\n\nexport interface TooltipSpecOptions {\n enablePinning: boolean;\n}\n\nexport interface TimeSeriesChartPaletteOptions {\n mode: 'auto' | 'categorical';\n}\n\nexport type TimeSeriesChartVisualOptions = {\n display?: 'line' | 'bar';\n lineWidth?: number;\n lineStyle?: LineStyleType;\n areaOpacity?: number;\n showPoints?: 'auto' | 'always';\n palette?: TimeSeriesChartPaletteOptions;\n pointRadius?: number;\n stack?: StackOptions;\n connectNulls?: boolean;\n};\n\nexport const DEFAULT_FORMAT: FormatOptions = {\n unit: 'decimal',\n shortValues: true,\n};\n\nexport const DEFAULT_Y_AXIS: TimeSeriesChartYAxisOptions = {\n show: true,\n label: '',\n format: DEFAULT_FORMAT,\n min: undefined,\n max: undefined,\n logBase: undefined,\n};\n\nexport const Y_AXIS_CONFIG = {\n show: { label: 'Show' },\n label: { label: 'Label' },\n unit: { label: 'Unit' },\n min: { label: 'Min' },\n max: { label: 'Max' },\n logBase: { label: 'Log Base' },\n};\n\nexport const DEFAULT_DISPLAY = 'line';\nexport const DEFAULT_LINE_WIDTH = 1.25;\nexport const DEFAULT_LINE_STYLE = 'solid';\nexport const DEFAULT_AREA_OPACITY = 0;\n// How much larger datapoint symbols are than line width, also applied in VisualOptionsEditor.\nexport const POINT_SIZE_OFFSET = 1.5;\nexport const DEFAULT_POINT_RADIUS = DEFAULT_LINE_WIDTH + POINT_SIZE_OFFSET;\nexport const DEFAULT_CONNECT_NULLS = false;\n\nexport const DEFAULT_VISUAL: TimeSeriesChartVisualOptions = {\n display: DEFAULT_DISPLAY,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineStyle: DEFAULT_LINE_STYLE,\n areaOpacity: DEFAULT_AREA_OPACITY,\n pointRadius: DEFAULT_POINT_RADIUS,\n connectNulls: DEFAULT_CONNECT_NULLS,\n};\n\n// Controls how often static threshold values should be plotted so threshold data shows\n// in tooltip without flicker.\nexport const THRESHOLD_PLOT_INTERVAL = 15;\n\nexport const VISUAL_CONFIG = {\n lineWidth: {\n label: 'Line Width',\n testId: 'slider-line-width',\n min: 0.25,\n max: 3,\n step: 0.25,\n },\n lineStyle: {\n label: 'Line Style',\n },\n pointRadius: {\n label: 'Point Radius',\n testId: 'slider-point-radius',\n min: 0,\n max: 6,\n step: 0.25,\n },\n areaOpacity: {\n label: 'Area Opacity',\n testId: 'slider-area-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n },\n stack: {\n label: 'Stack Series',\n },\n connectNulls: {\n label: 'Connect Nulls',\n },\n};\n\n// None is equivalent to undefined since stack is optional\nexport type StackOptions = 'none' | 'all'; // TODO: add percent option support\n\nexport const STACK_CONFIG = {\n none: { label: 'None' },\n all: { label: 'All' },\n // TODO: enable option after 'Percent' implemented\n // percent: { label: 'Percent', disabled: true }, // hidden since not implemented yet\n};\n\nexport const STACK_OPTIONS = Object.entries(STACK_CONFIG).map(([id, config]) => {\n return {\n id: id as StackOptions,\n ...config,\n };\n});\n\nexport const LINE_STYLE_CONFIG = {\n solid: { label: 'Solid' },\n dashed: { label: 'Dashes' },\n dotted: { label: 'Dots' },\n};\n\nexport const OPACITY_CONFIG = {\n label: 'Opacity',\n testId: 'slider-opacity',\n min: 0,\n max: 1,\n step: 0.05,\n};\n\n// LogBase outlines the allowed log bases for the log-supported charts.\nexport type LOG_BASE = undefined | 2 | 10;\n\n// Single source of truth for log base configuration\nexport const LOG_BASE_CONFIG: Record<string, { label: string; log: LOG_BASE }> = {\n none: { label: 'None', log: undefined },\n '2': { label: '2', log: 2 },\n '10': { label: '10', log: 10 },\n};\n\n// Options array for SettingsAutocomplete\nexport const LOG_BASE_OPTIONS = Object.entries(LOG_BASE_CONFIG).map(([id, config]) => ({\n id: id as string,\n ...config,\n}));\n\n// Both of these constants help produce a value that is LESS THAN the initial value.\n// For positive values, we multiply by a number less than 1 to get this outcome.\n// For negative values, we multiply to a number greater than 1 to get this outcome.\nexport const POSITIVE_MIN_VALUE_MULTIPLIER = 0.8;\nexport const NEGATIVE_MIN_VALUE_MULTIPLIER = 1.2;\n\n/**\n * Creates an initial/empty options object for the TimeSeriesChartPanel.\n */\nexport function createInitialTimeSeriesChartOptions(): TimeSeriesChartOptions {\n return {};\n}\n"],"names":["DEFAULT_FORMAT","unit","shortValues","DEFAULT_Y_AXIS","show","label","format","min","undefined","max","logBase","Y_AXIS_CONFIG","DEFAULT_DISPLAY","DEFAULT_LINE_WIDTH","DEFAULT_LINE_STYLE","DEFAULT_AREA_OPACITY","POINT_SIZE_OFFSET","DEFAULT_POINT_RADIUS","DEFAULT_CONNECT_NULLS","DEFAULT_VISUAL","display","lineWidth","lineStyle","areaOpacity","pointRadius","connectNulls","THRESHOLD_PLOT_INTERVAL","VISUAL_CONFIG","testId","step","stack","STACK_CONFIG","none","all","STACK_OPTIONS","Object","entries","map","id","config","LINE_STYLE_CONFIG","solid","dashed","dotted","OPACITY_CONFIG","LOG_BASE_CONFIG","log","LOG_BASE_OPTIONS","POSITIVE_MIN_VALUE_MULTIPLIER","NEGATIVE_MIN_VALUE_MULTIPLIER","createInitialTimeSeriesChartOptions"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AnnotationData, AnnotationDisplay } from '@perses-dev/spec';
|
|
2
|
+
import { AnnotationSpecWithData } from '@perses-dev/dashboards';
|
|
3
|
+
export type TimeSeriesAnnotation = AnnotationData & AnnotationDisplay;
|
|
4
|
+
export declare function convertAnnotationToTimeSeriesAnnotation(annotations: AnnotationSpecWithData[]): TimeSeriesAnnotation[];
|
|
5
|
+
//# sourceMappingURL=annotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation.d.ts","sourceRoot":"","sources":["../../../src/utils/annotation.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,iBAAiB,CAAC;AAEtE,wBAAgB,uCAAuC,CAAC,WAAW,EAAE,sBAAsB,EAAE,GAAG,oBAAoB,EAAE,CAcrH"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright The Perses Authors
|
|
2
|
+
// Licensed under the Apache License, Version 2.0 (the \"License\");
|
|
3
|
+
// you may not use this file except in compliance with the License.
|
|
4
|
+
// You may obtain a copy of the License at
|
|
5
|
+
//
|
|
6
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
+
//
|
|
8
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
+
// distributed under the License is distributed on an \"AS IS\" BASIS,
|
|
10
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
+
// See the License for the specific language governing permissions and
|
|
12
|
+
// limitations under the License.
|
|
13
|
+
export function convertAnnotationToTimeSeriesAnnotation(annotations) {
|
|
14
|
+
const result = [];
|
|
15
|
+
for (const annotation of annotations){
|
|
16
|
+
for (const item of annotation.data){
|
|
17
|
+
if (annotation.definition.display.hidden) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
result.push({
|
|
21
|
+
...annotation.definition.display,
|
|
22
|
+
...item
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=annotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/annotation.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { AnnotationData, AnnotationDisplay } from '@perses-dev/spec';\nimport { AnnotationSpecWithData } from '@perses-dev/dashboards';\n\nexport type TimeSeriesAnnotation = AnnotationData & AnnotationDisplay;\n\nexport function convertAnnotationToTimeSeriesAnnotation(annotations: AnnotationSpecWithData[]): TimeSeriesAnnotation[] {\n const result: TimeSeriesAnnotation[] = [];\n for (const annotation of annotations) {\n for (const item of annotation.data) {\n if (annotation.definition.display.hidden) {\n continue;\n }\n result.push({\n ...annotation.definition.display,\n ...item,\n });\n }\n }\n return result;\n}\n"],"names":["convertAnnotationToTimeSeriesAnnotation","annotations","result","annotation","item","data","definition","display","hidden","push"],"mappings":"AAAA,+BAA+B;AAC/B,oEAAoE;AACpE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,sEAAsE;AACtE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAOjC,OAAO,SAASA,wCAAwCC,WAAqC;IAC3F,MAAMC,SAAiC,EAAE;IACzC,KAAK,MAAMC,cAAcF,YAAa;QACpC,KAAK,MAAMG,QAAQD,WAAWE,IAAI,CAAE;YAClC,IAAIF,WAAWG,UAAU,CAACC,OAAO,CAACC,MAAM,EAAE;gBACxC;YACF;YACAN,OAAOO,IAAI,CAAC;gBACV,GAAGN,WAAWG,UAAU,CAACC,OAAO;gBAChC,GAAGH,IAAI;YACT;QACF;IACF;IACA,OAAOF;AACT"}
|
|
@@ -20,6 +20,7 @@ export declare function getCommonTimeScaleForQueries(queries: Array<PanelData<Ti
|
|
|
20
20
|
export declare function getTimeSeries(id: string, datasetIndex: number, formattedName: string, visual: TimeSeriesChartVisualOptions, timeScale: TimeScale, paletteColor: string, querySettings?: {
|
|
21
21
|
lineStyle?: LineStyleType;
|
|
22
22
|
areaOpacity?: number;
|
|
23
|
+
stack?: boolean;
|
|
23
24
|
}, yAxisIndex?: number): TimeSeriesOption;
|
|
24
25
|
/**
|
|
25
26
|
* Gets threshold-specific line series styles
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-transform.d.ts","sourceRoot":"","sources":["../../../src/utils/data-transform.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAEL,gBAAgB,EAChB,iBAAiB,EAEjB,gBAAgB,EAChB,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAQL,4BAA4B,EAC5B,2BAA2B,EAC3B,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE1E,eAAO,MAAM,gBAAgB,EAAE,iBAI9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,CAG7G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,4BAA4B,EACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"data-transform.d.ts","sourceRoot":"","sources":["../../../src/utils/data-transform.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAEL,gBAAgB,EAChB,iBAAiB,EAEjB,gBAAgB,EAChB,WAAW,EAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAQL,4BAA4B,EAC5B,2BAA2B,EAC3B,aAAa,EACd,MAAM,4BAA4B,CAAC;AAEpC,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAE1E,eAAO,MAAM,gBAAgB,EAAE,iBAI9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,CAG7G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,4BAA4B,EACpC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACpF,UAAU,CAAC,EAAE,MAAM,GAClB,gBAAgB,CAqElB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CA2B9G;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,EACvC,GAAG,CAAC,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,GACX,MAAM,CAMR;AA8BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,2BAAgC,GAAG,oBAAoB,CAgDnG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI7C"}
|