diff --git a/web/frontend/src/generic/plots/MetricPlot.svelte b/web/frontend/src/generic/plots/MetricPlot.svelte index 09f313c..536739d 100644 --- a/web/frontend/src/generic/plots/MetricPlot.svelte +++ b/web/frontend/src/generic/plots/MetricPlot.svelte @@ -64,6 +64,12 @@ return null; } + // handle special *-stat scopes + if (scope.match(/(.*)-stat$/)) { + const statParts = scope.split('-'); + scope = statParts[0] + } + if ( (scope == "node" && isShared == false) || metricConfig?.aggregation == "avg" @@ -130,6 +136,7 @@ export let numhwthreads = 0; export let numaccs = 0; export let zoomState = null; + export let thresholdState = null; if (useStatsSeries == null) useStatsSeries = statisticsSeries != null; if (useStatsSeries == false && series == null) useStatsSeries = true; @@ -468,12 +475,14 @@ // console.log('Dispatch Zoom with Res from / to', timestep, closest) dispatch('zoom', { newRes: closest, - lastZoomState: u?.scales + lastZoomState: u?.scales, + lastThreshold: thresholds?.normal }); } } else { dispatch('zoom', { - lastZoomState: u?.scales + lastZoomState: u?.scales, + lastThreshold: thresholds?.normal }); }; }; @@ -498,16 +507,19 @@ let timeoutId = null; function render(ren_width, ren_height) { - if (!uplot) { // Init uPlot + if (!uplot) { opts.width = ren_width; opts.height = ren_height; - if (zoomState) { + if (zoomState && metricConfig?.aggregation == "avg") { opts.scales = {...zoomState} + } else if (zoomState && metricConfig?.aggregation == "sum") { + // Allow Zoom In === Ymin changed + if (zoomState.y.min !== 0) { // scope change?: only use zoomState if thresholds match + if ((thresholdState === thresholds?.normal)) { opts.scales = {...zoomState} }; + } // else: reset scaling to default } - // console.log('Init Sizes ...', { width: opts.width, height: opts.height }) uplot = new uPlot(opts, plotData, plotWrapper); - } else { // Update size - // console.log('Update uPlot ...', { width: ren_width, height: ren_height }) + } else { uplot.setSize({ width: ren_width, height: ren_height }); } } diff --git a/web/frontend/src/job/Metric.svelte b/web/frontend/src/job/Metric.svelte index adbb44a..2e3967d 100644 --- a/web/frontend/src/job/Metric.svelte +++ b/web/frontend/src/job/Metric.svelte @@ -54,6 +54,7 @@ let statsSeries = rawData.map((data) => data?.statisticsSeries ? data.statisticsSeries : null); let zoomState = null; let pendingZoomState = null; + let thresholdState = null; const dispatch = createEventDispatcher(); const statsPattern = /(.*)-stat$/; @@ -96,18 +97,24 @@ (pendingZoomState?.x?.min !== detail?.lastZoomState?.x?.min) && (pendingZoomState?.y?.max !== detail?.lastZoomState?.y?.max) ) { - pendingZoomState = {...detail.lastZoomState} + pendingZoomState = {...detail.lastZoomState}; + } + + if (detail?.lastThreshold) { // Handle to correctly reset on summed metric scope change + thresholdState = detail.lastThreshold; + } else { + thresholdState = null; } if (detail?.newRes) { // Triggers GQL - pendingResolution = detail.newRes + pendingResolution = detail.newRes; } - } + }; let metricData; - let selectedScopes = [...scopes] + let selectedScopes = [...scopes]; const dbid = job.id; - const selectedMetrics = [metricName] + const selectedMetrics = [metricName]; $: if (selectedScope || pendingResolution) { @@ -209,6 +216,7 @@ {series} {isShared} {zoomState} + {thresholdState} /> {:else if statsSeries[selectedScopeIndex] != null && patternMatches}