2021-09-04 19:13:57 +02:00
|
|
|
|
<template>
|
|
|
|
|
|
<v-card style="min-height:400px;">
|
|
|
|
|
|
<v-card-title class="headline">
|
|
|
|
|
|
Gun details
|
|
|
|
|
|
</v-card-title>
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
<v-container fluid fill-height>
|
|
|
|
|
|
<v-row>
|
|
|
|
|
|
<v-col>
|
|
|
|
|
|
<div class="graph-container" ref="graphHeat"></div>
|
|
|
|
|
|
</v-col>
|
|
|
|
|
|
</v-row>
|
|
|
|
|
|
</v-container>
|
|
|
|
|
|
|
|
|
|
|
|
<v-overlay :value="busy" absolute z-index="1">
|
|
|
|
|
|
<v-progress-circular indeterminate></v-progress-circular>
|
|
|
|
|
|
</v-overlay>
|
|
|
|
|
|
</v-card>
|
|
|
|
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
.graph-container {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
|
|
|
|
|
|
import * as d3a from 'd3-array';
|
|
|
|
|
|
import Plotly from 'plotly.js-dist';
|
|
|
|
|
|
import { mapActions, mapGetters } from 'vuex';
|
|
|
|
|
|
import unpack from '@/lib/unpack.js';
|
|
|
|
|
|
import * as aes from '@/lib/graphs/aesthetics.js';
|
|
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
export default {
|
|
|
|
|
|
name: 'DougalGraphGunsDepth',
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
props: [ "data" ],
|
|
|
|
|
|
|
|
|
|
|
|
data () {
|
|
|
|
|
|
return {
|
|
|
|
|
|
graph: null,
|
|
|
|
|
|
graphHover: null,
|
|
|
|
|
|
busy: false,
|
|
|
|
|
|
resizeObserver: null,
|
|
|
|
|
|
// TODO: aspects should be a prop
|
|
|
|
|
|
aspects: [
|
|
|
|
|
|
"Mode", "Detect", "Autofire", "Aimpoint", "Firetime", "Delay",
|
2021-09-21 00:32:00 +02:00
|
|
|
|
"Delta",
|
2021-09-04 19:13:57 +02:00
|
|
|
|
"Depth", "Pressure", "Volume", "Filltime"
|
|
|
|
|
|
]
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
computed: {
|
|
|
|
|
|
//...mapGetters(['apiUrl'])
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
watch: {
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
data (newVal, oldVal) {
|
|
|
|
|
|
console.log("data changed");
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
if (newVal === null) {
|
|
|
|
|
|
this.busy = true;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.busy = false;
|
|
|
|
|
|
this.plot();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
violinplot () {
|
|
|
|
|
|
if (this.violinplot) {
|
|
|
|
|
|
this.plotViolin();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
methods: {
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
plot () {
|
|
|
|
|
|
this.plotHeat();
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
async plotHeat () {
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
|
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
if (!this.data) {
|
|
|
|
|
|
console.log("missing data");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
function transform (data, aspects=["Depth", "Pressure"]) {
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
const facets = [
|
2021-09-04 19:13:57 +02:00
|
|
|
|
// Mode
|
2021-09-21 00:32:00 +02:00
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Mode",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{text}",
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
text: [ "Off", "Auto", "Manual", "Disabled" ],
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => {
|
|
|
|
|
|
switch (gun[3]) {
|
|
|
|
|
|
case "A":
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
case "M":
|
|
|
|
|
|
return 2;
|
|
|
|
|
|
case "O":
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
case "D":
|
|
|
|
|
|
return 3;
|
|
|
|
|
|
}
|
2021-09-04 19:13:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
// Detect
|
2021-09-21 00:32:00 +02:00
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Detect",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{text}",
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
text: [ "Zero", "Peak", "Level" ],
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => {
|
|
|
|
|
|
switch (gun[4]) {
|
|
|
|
|
|
case "P":
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
case "Z":
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
case "L":
|
|
|
|
|
|
return 2;
|
|
|
|
|
|
}
|
2021-09-04 19:13:57 +02:00
|
|
|
|
}
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
// Autofire
|
2021-09-21 00:32:00 +02:00
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Autofire",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{text}",
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
text: [ "False", "True" ],
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => {
|
|
|
|
|
|
return gun[5] ? 1 : 0;
|
|
|
|
|
|
}
|
2021-09-04 19:13:57 +02:00
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// Aimpoint
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Aimpoint",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} ms"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[7]
|
2021-09-04 19:13:57 +02:00
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// Firetime
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Firetime",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} ms"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[2] == shot.meta.src_number ? gun[8] : null
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// Delta
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Delta",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} ms",
|
|
|
|
|
|
// NOTE: These values are based on
|
|
|
|
|
|
// Grane + Snorre's ±1.5 ms spec. While a fairly
|
|
|
|
|
|
// common range, I still consider these min / max
|
|
|
|
|
|
// numbers to have been chosen semi-arbitrarily.
|
|
|
|
|
|
zmin: -2,
|
|
|
|
|
|
zmax: 2
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[2] == shot.meta.src_number ? gun[7]-gun[8] : null
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Delay
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Delay",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} ms"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[9]
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Depth
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Depth",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} m"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[10]
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Pressure
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Pressure",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} psi"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[11]
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Volume
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Volume",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} in³"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
conversion: (gun, shot) => gun[12]
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Filltime
|
|
|
|
|
|
{
|
|
|
|
|
|
params: {
|
|
|
|
|
|
name: "Filltime",
|
|
|
|
|
|
hovertemplate: "SP%{x}<br>%{y}<br>%{z} ms"
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// NOTE that filltime is applicable to the *non* firing guns
|
|
|
|
|
|
conversion: (gun, shot) => gun[2] == shot.meta.src_number ? null : gun[13]
|
2021-09-04 19:13:57 +02:00
|
|
|
|
}
|
2021-09-21 00:32:00 +02:00
|
|
|
|
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
];
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// Get gun numbers
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const guns = [...new Set(data.map( s => s.meta.guns.map( g => g[1] ) ).flat())];
|
2021-09-21 00:32:00 +02:00
|
|
|
|
|
|
|
|
|
|
// z eventually will have the structure:
|
|
|
|
|
|
// z = {
|
|
|
|
|
|
// [aspect]: [ // First shotpoint
|
|
|
|
|
|
// [ // Value for gun 0, gun 1, … ],
|
|
|
|
|
|
// …more shotpoints…
|
|
|
|
|
|
// ]
|
|
|
|
|
|
// }
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const z = {};
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// x is an array of shotpoints
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const x = [];
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// y is an array of gun numbers
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const y = guns.map( gun => `G${gun}` );
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
// Build array of guns (i.e., populate z)
|
|
|
|
|
|
// We prefer to do this outside the shot-to-shot loop
|
|
|
|
|
|
// for efficiency
|
|
|
|
|
|
for (const facet of facets) {
|
|
|
|
|
|
const label = facet.params.name;
|
2021-09-04 19:13:57 +02:00
|
|
|
|
z[label] = Array(guns.length);
|
|
|
|
|
|
for (let i=0; i<guns.length; i++) {
|
|
|
|
|
|
z[label][i] = [];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
// Populate array of guns with shotpoint data
|
|
|
|
|
|
for (let shot of data) {
|
|
|
|
|
|
x.push(shot.point);
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
for (const facet of facets) {
|
|
|
|
|
|
const label = facet.params.name;
|
|
|
|
|
|
const facetGunsArray = z[label];
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
for (const gun of shot.meta.guns) {
|
|
|
|
|
|
const gunIndex = gun[1]-1;
|
|
|
|
|
|
const facetGun = facetGunsArray[gunIndex];
|
|
|
|
|
|
facetGun.push(facet.conversion(gun, shot));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-09-04 19:13:57 +02:00
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
return aspects.map( (aspect, idx) => {
|
|
|
|
|
|
const facet = facets.find(el => el.params.name == aspect) || {};
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
const defaultParams = {
|
2021-09-04 19:13:57 +02:00
|
|
|
|
name: aspect,
|
|
|
|
|
|
type: "heatmap",
|
|
|
|
|
|
showscale: false,
|
|
|
|
|
|
x,
|
|
|
|
|
|
y,
|
|
|
|
|
|
z: z[aspect],
|
2021-09-21 00:32:00 +02:00
|
|
|
|
text: facet.text ? z[aspect].map(row => row.map(v => facet.text[v])) : undefined,
|
2021-09-04 19:13:57 +02:00
|
|
|
|
xaxis: "x",
|
2021-09-21 00:32:00 +02:00
|
|
|
|
yaxis: "y" + (idx > 0 ? idx+1 : "")
|
2021-09-04 19:13:57 +02:00
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
|
|
|
|
|
|
2021-09-21 00:32:00 +02:00
|
|
|
|
return Object.assign({}, defaultParams, facet.params);
|
2021-09-04 19:13:57 +02:00
|
|
|
|
});
|
|
|
|
|
|
}
|
2021-09-21 00:32:00 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const data = transform(this.data.items, this.aspects);
|
|
|
|
|
|
this.busy = false;
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const layout = {
|
|
|
|
|
|
title: {text: "Gun details – sequence %{meta.sequence}"},
|
|
|
|
|
|
height: 200*this.aspects.length,
|
|
|
|
|
|
//autocolorscale: true,
|
|
|
|
|
|
/*
|
|
|
|
|
|
grid: {
|
|
|
|
|
|
rows: this.aspects.length,
|
|
|
|
|
|
columns: 1,
|
|
|
|
|
|
pattern: "coupled",
|
|
|
|
|
|
roworder: "bottom to top"
|
|
|
|
|
|
},
|
|
|
|
|
|
*/
|
|
|
|
|
|
//autosize: true,
|
|
|
|
|
|
// colorscale: "sequential",
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
xaxis: {
|
|
|
|
|
|
title: "Shotpoint",
|
|
|
|
|
|
showspikes: true
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
meta: this.data.meta
|
|
|
|
|
|
};
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
this.aspects.forEach ( (aspect, idx) => {
|
|
|
|
|
|
const num = idx+1;
|
|
|
|
|
|
const key = "yaxis" + num;
|
|
|
|
|
|
const anchor = "y" + num;
|
|
|
|
|
|
const segment = (1/this.aspects.length);
|
|
|
|
|
|
const margin = segment/20;
|
|
|
|
|
|
const domain = [
|
|
|
|
|
|
segment*idx + margin,
|
|
|
|
|
|
segment*num - margin
|
|
|
|
|
|
];
|
|
|
|
|
|
layout[key] = {
|
|
|
|
|
|
title: aspect,
|
|
|
|
|
|
anchor,
|
|
|
|
|
|
domain
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
const config = {
|
|
|
|
|
|
//editable: true,
|
|
|
|
|
|
displaylogo: false
|
|
|
|
|
|
};
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
this.graph = Plotly.newPlot(this.$refs.graphHeat, data, layout, config);
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
replot () {
|
|
|
|
|
|
if (!this.graph) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
console.log("Replotting");
|
|
|
|
|
|
Object.values(this.$refs).forEach( ref => {
|
|
|
|
|
|
if (ref.data) {
|
|
|
|
|
|
console.log("Replotting", ref, ref.clientWidth, ref.clientHeight);
|
|
|
|
|
|
Plotly.relayout(ref, {
|
|
|
|
|
|
width: ref.clientWidth,
|
|
|
|
|
|
height: ref.clientHeight
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
...mapActions(["api"])
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
mounted () {
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
if (this.data) {
|
|
|
|
|
|
this.plot();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.busy = true;
|
|
|
|
|
|
}
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
this.resizeObserver = new ResizeObserver(this.replot)
|
|
|
|
|
|
this.resizeObserver.observe(this.$refs.graphHeat);
|
|
|
|
|
|
},
|
2022-04-29 14:48:21 +02:00
|
|
|
|
|
2021-09-04 19:13:57 +02:00
|
|
|
|
beforeDestroy () {
|
|
|
|
|
|
if (this.resizeObserver) {
|
|
|
|
|
|
this.resizeObserver.unobserve(this.$refs.graphHeat);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
</script>
|