diff --git a/web/frontend/src/generic/PlotGrid.svelte b/web/frontend/src/generic/PlotGrid.svelte index 5152e0d..c324409 100644 --- a/web/frontend/src/generic/PlotGrid.svelte +++ b/web/frontend/src/generic/PlotGrid.svelte @@ -14,6 +14,17 @@ export let itemsPerRow export let items + + /* Migtation Notes + * Requirements + * - Parent Components must be already Migrated + * - TODO: Job.root.svelte, Node.root.svelte + * + * How-To + * - Define "Plot-Slotcode" as SV5 Snippet with argument "item" in parent (!) + * - Pass new snippet as argument/prop to here + * - @render snippet in items-loop with argument == item + */ diff --git a/web/frontend/src/generic/helper/ConcurrentJobs.svelte b/web/frontend/src/generic/helper/ConcurrentJobs.svelte index 85bac83..d42ace1 100644 --- a/web/frontend/src/generic/helper/ConcurrentJobs.svelte +++ b/web/frontend/src/generic/helper/ConcurrentJobs.svelte @@ -17,11 +17,14 @@ Icon } from "@sveltestrap/sveltestrap"; - export let cJobs; - export let showLinks = false; - export let renderCard = false; - export let width = "auto"; - export let height = "400px"; + /* Svelte 5 Props */ + let { + cJobs, + showLinks = false, + renderCard = false, + width = "auto", + height = "400px", + } = $props(); {#if renderCard} diff --git a/web/frontend/src/generic/helper/JobFootprint.svelte b/web/frontend/src/generic/helper/JobFootprint.svelte index 80e905b..8d89731 100644 --- a/web/frontend/src/generic/helper/JobFootprint.svelte +++ b/web/frontend/src/generic/helper/JobFootprint.svelte @@ -23,79 +23,90 @@ } from "@sveltestrap/sveltestrap"; import { findJobFootprintThresholds } from "../utils.js"; - export let job; - export let displayTitle = true; - export let width = "auto"; - export let height = "310px"; + /* Svelte 5 Props */ + let { + job, + displayTitle = true, + width = "auto", + height = "310px", + } = $props(); - const footprintData = job?.footprint?.map((jf) => { - const fmc = getContext("getMetricConfig")(job.cluster, job.subCluster, jf.name); - if (fmc) { - // Unit - const unit = (fmc?.unit?.prefix ? fmc.unit.prefix : "") + (fmc?.unit?.base ? fmc.unit.base : "") + /* Derived */ + const footprintData = $derived(buildFootprint(job?.footprint)); + + /* Functions */ + function buildFootprint(input) { + let result = input?.map((jf) => { + const fmc = getContext("getMetricConfig")(job.cluster, job.subCluster, jf.name); + if (fmc) { + // Unit + const unit = (fmc?.unit?.prefix ? fmc.unit.prefix : "") + (fmc?.unit?.base ? fmc.unit.base : "") - // Threshold / -Differences - const fmt = findJobFootprintThresholds(job, jf.stat, fmc); + // Threshold / -Differences + const fmt = findJobFootprintThresholds(job, jf.stat, fmc); - // Define basic data -> Value: Use as Provided - const fmBase = { - name: jf.name + ' (' + jf.stat + ')', - avg: jf.value, - unit: unit, - max: fmt.peak, - dir: fmc.lowerIsBetter - }; - - if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "alert")) { - return { - ...fmBase, - color: "danger", - message: `Footprint value way ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, - impact: 3 + // Define basic data -> Value: Use as Provided + const fmBase = { + name: jf.name + ' (' + jf.stat + ')', + avg: jf.value, + unit: unit, + max: fmt.peak, + dir: fmc.lowerIsBetter }; - } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "caution")) { + + if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "alert")) { + return { + ...fmBase, + color: "danger", + message: `Footprint value way ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, + impact: 3 + }; + } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "caution")) { + return { + ...fmBase, + color: "warning", + message: `Footprint value ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, + impact: 2, + }; + } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "normal")) { + return { + ...fmBase, + color: "success", + message: "Footprint value within expected thresholds.", + impact: 1, + }; + } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "peak")) { + return { + ...fmBase, + color: "info", + message: + "Footprint value above expected normal threshold: Check for artifacts recommended.", + impact: 0, + }; + } else { + return { + ...fmBase, + color: "secondary", + message: + "Footprint value above expected peak threshold: Check for artifacts!", + impact: -1, + }; + } + } else { // No matching metric config: display as single value return { - ...fmBase, - color: "warning", - message: `Footprint value ${fmc.lowerIsBetter ? "above" : "below"} expected normal threshold.`, - impact: 2, - }; - } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "normal")) { - return { - ...fmBase, - color: "success", - message: "Footprint value within expected thresholds.", - impact: 1, - }; - } else if (evalFootprint(jf.value, fmt, fmc.lowerIsBetter, "peak")) { - return { - ...fmBase, - color: "info", + name: jf.name + ' (' + jf.stat + ')', + avg: jf.value, message: - "Footprint value above expected normal threshold: Check for artifacts recommended.", - impact: 0, - }; - } else { - return { - ...fmBase, - color: "secondary", - message: - "Footprint value above expected peak threshold: Check for artifacts!", - impact: -1, + `No config for metric ${jf.name} found.`, + impact: 4, }; } - } else { // No matching metric config: display as single value - return { - name: jf.name + ' (' + jf.stat + ')', - avg: jf.value, - message: - `No config for metric ${jf.name} found.`, - impact: 4, - }; - } - }).sort(function (a, b) { // Sort by impact value primarily, within impact sort name alphabetically - return a.impact - b.impact || ((a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)); - });; + }).sort(function (a, b) { // Sort by impact value primarily, within impact sort name alphabetically + return a.impact - b.impact || ((a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)); + });; + + return result; + }; function evalFootprint(value, thresholds, lowerIsBetter, level) { // Handle Metrics in which less value is better @@ -176,7 +187,7 @@ >{fpd.message} - + {#if fpd.dir} diff --git a/web/frontend/src/generic/plots/Comparogram.svelte b/web/frontend/src/generic/plots/Comparogram.svelte index 6779308..ca3bf9c 100644 --- a/web/frontend/src/generic/plots/Comparogram.svelte +++ b/web/frontend/src/generic/plots/Comparogram.svelte @@ -306,7 +306,7 @@ {#if data && data[0].length > 0}
+ >
{:else} Cannot render plot: No series data returned for {metric?metric:'job resources'}