forked from phc/cluster-dashboard
aggiunti grafici e cambiato temperatura in voltaggio
parent
6d3b35ee66
commit
c3cad5796f
@ -0,0 +1,27 @@
|
||||
import { useEffect, useState } from 'preact/hooks'
|
||||
import { server } from '../utils.js'
|
||||
import { PlotDouble } from './PlotDouble.jsx'
|
||||
|
||||
export const GraphCardDouble = ({ label, url1, url2 }) => {
|
||||
const [samples1, setSamples1] = useState([])
|
||||
const [samples2, setSamples2] = useState([])
|
||||
|
||||
useEffect(() => {
|
||||
if (url1) {
|
||||
server.get(url1).then(data => setSamples1(data))
|
||||
}
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
if (url2) {
|
||||
server.get(url2).then(data => setSamples2(data))
|
||||
}
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div class="card">
|
||||
<div class="label">{label}</div>
|
||||
<div class="graph">{url1 && url2 && <PlotDouble samples1={samples1} samples2={samples2} />}</div>
|
||||
</div>
|
||||
)
|
||||
}
|
@ -0,0 +1,102 @@
|
||||
import * as d3 from 'd3'
|
||||
import { useEffect, useRef } from 'preact/hooks'
|
||||
|
||||
// set the dimensions and margins of the graph
|
||||
const margin = { top: 10, right: 10, bottom: 30, left: 30 }
|
||||
|
||||
export const PlotDouble = ({ samples1, samples2 }) => {
|
||||
if (samples1.length === 0 || samples2.length === 0) {
|
||||
return <>Loading...</>
|
||||
}
|
||||
|
||||
const data1 = samples1.map(({ timestamp, value }) => ({
|
||||
timestamp: d3.isoParse(timestamp),
|
||||
value: value,
|
||||
}))
|
||||
|
||||
const data2 = samples2.map(({ timestamp, value }) => ({
|
||||
timestamp: d3.isoParse(timestamp),
|
||||
value: value,
|
||||
}))
|
||||
|
||||
const plotRef = useRef(null)
|
||||
|
||||
useEffect(() => {
|
||||
if (plotRef.current) {
|
||||
const el = plotRef.current
|
||||
|
||||
const width = el.offsetWidth - margin.left - margin.right
|
||||
const height = el.offsetHeight - margin.top - margin.bottom
|
||||
|
||||
const svg = d3
|
||||
.select(el)
|
||||
.append('svg')
|
||||
.attr('width', el.offsetWidth)
|
||||
.attr('height', el.offsetHeight)
|
||||
.append('g')
|
||||
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
|
||||
|
||||
const x = d3
|
||||
.scaleTime()
|
||||
.domain(
|
||||
d3.extent([...data1, ...data2], function (d) {
|
||||
return d.timestamp
|
||||
})
|
||||
)
|
||||
.range([0, width])
|
||||
|
||||
const y = d3
|
||||
.scaleLinear()
|
||||
.domain([
|
||||
0,
|
||||
d3.max([...data1, ...data2], function (d) {
|
||||
return +d.value
|
||||
}),
|
||||
])
|
||||
.range([height, 0])
|
||||
|
||||
svg.append('g')
|
||||
.attr('transform', 'translate(0,' + height + ')')
|
||||
.call(d3.axisBottom(x))
|
||||
|
||||
svg.append('g').call(d3.axisLeft(y))
|
||||
|
||||
const line1 = svg.append('g')
|
||||
const line2 = svg.append('g')
|
||||
|
||||
line1.append('path')
|
||||
.datum(data1)
|
||||
.attr('fill', 'none')
|
||||
.attr('stroke', 'steelblue')
|
||||
.attr('stroke-width', 2)
|
||||
.attr(
|
||||
'd',
|
||||
d3
|
||||
.line()
|
||||
.x(d => x(d.timestamp))
|
||||
.y(d => y(d.value))
|
||||
)
|
||||
|
||||
line2.append('path')
|
||||
.datum(data2)
|
||||
.attr('fill', 'none')
|
||||
.attr('stroke', 'darkgreen')
|
||||
.attr('stroke-width', 2)
|
||||
.attr(
|
||||
'd',
|
||||
d3
|
||||
.line()
|
||||
.x(d => x(d.timestamp))
|
||||
.y(d => y(d.value))
|
||||
)
|
||||
}
|
||||
|
||||
return () => {
|
||||
if (plotRef.current) {
|
||||
plotRef.current.firstChild.remove()
|
||||
}
|
||||
}
|
||||
}, [plotRef])
|
||||
|
||||
return <div class="d3-plot" ref={plotRef}></div>
|
||||
}
|
Loading…
Reference in New Issue