diff --git a/web/frontend/src/Jobs.root.svelte b/web/frontend/src/Jobs.root.svelte index 312c726..e5ae4e5 100644 --- a/web/frontend/src/Jobs.root.svelte +++ b/web/frontend/src/Jobs.root.svelte @@ -196,7 +196,12 @@ - + + sorting = {...newSort} + }/> - + { + from = newFrom; + to = newTo; + }} + /> diff --git a/web/frontend/src/Status.root.svelte b/web/frontend/src/Status.root.svelte index 1bd3c07..613bd7f 100644 --- a/web/frontend/src/Status.root.svelte +++ b/web/frontend/src/Status.root.svelte @@ -697,7 +697,10 @@ {/if} { + selectedHistograms = [...newSelection]; + }} /> diff --git a/web/frontend/src/Systems.root.svelte b/web/frontend/src/Systems.root.svelte index 9c12aed..4510b60 100644 --- a/web/frontend/src/Systems.root.svelte +++ b/web/frontend/src/Systems.root.svelte @@ -56,7 +56,7 @@ /* State Init */ let to = $state(toPreset || new Date(Date.now())); - let from = $state(fromPreset || new Date(nowDate.setHours(nowDate.getHours() - 12))); + let from = $state(fromPreset || new Date(nowDate.setHours(nowDate.getHours() - 4))); let selectedResolution = $state(resampleConfig ? resampleDefault : 0); let hostnameFilter = $state(""); let pendingHostnameFilter = $state(""); @@ -147,7 +147,14 @@ - + { + from = newFrom; + to = newTo; + }} + /> {#if displayNodeOverview} diff --git a/web/frontend/src/User.root.svelte b/web/frontend/src/User.root.svelte index 7250399..965290e 100644 --- a/web/frontend/src/User.root.svelte +++ b/web/frontend/src/User.root.svelte @@ -62,6 +62,7 @@ let isMetricsSelectionOpen = $state(false); let sorting = $state({ field: "startTime", type: "col", order: "DESC" }); let selectedCluster = $state(filterPresets?.cluster ? filterPresets.cluster : null); + let selectedHistogramsBuffer = $state({ all: (ccconfig['user_view_histogramMetrics'] || []) }) let metrics = $state(filterPresets.cluster ? ccconfig[`plot_list_selectedMetrics:${filterPresets.cluster}`] || ccconfig.plot_list_selectedMetrics @@ -85,10 +86,7 @@ // let matchedCompareJobs = $state(0); /* Derived Vars */ - let selectedHistograms = $derived(selectedCluster - ? ccconfig[`user_view_histogramMetrics:${selectedCluster}`] || ( ccconfig['user_view_histogramMetrics'] || [] ) - : ccconfig['user_view_histogramMetrics'] || []); - + let selectedHistograms = $derived(selectedCluster ? selectedHistogramsBuffer[selectedCluster] : selectedHistogramsBuffer['all']); let stats = $derived( queryStore({ client: client, @@ -125,8 +123,21 @@ }) ); + /* Effect */ + $effect(() => { + if (!selectedHistogramsBuffer[selectedCluster]) { + selectedHistogramsBuffer[selectedCluster] = ccconfig[`user_view_histogramMetrics:${selectedCluster}`]; + }; + }); + /* On Mount */ - onMount(() => filterComponent.updateFilters()); + onMount(() => { + filterComponent.updateFilters(); + // Why? -> `$derived(ccconfig[$cluster])` only loads array from last Backend-Query if $cluster changed reactively (without reload) + if (filterPresets?.cluster) { + selectedHistogramsBuffer[filterPresets.cluster] = ccconfig[`user_view_histogramMetrics:${filterPresets.cluster}`]; + }; + }); @@ -363,7 +374,13 @@ - + + sorting = {...newSort} + } +/> { + selectedHistogramsBuffer[selectedCluster || 'all'] = [...newSelection]; + }} /> diff --git a/web/frontend/src/generic/select/HistogramSelection.svelte b/web/frontend/src/generic/select/HistogramSelection.svelte index 08fb89a..6f0d7db 100644 --- a/web/frontend/src/generic/select/HistogramSelection.svelte +++ b/web/frontend/src/generic/select/HistogramSelection.svelte @@ -20,16 +20,24 @@ } from "@sveltestrap/sveltestrap"; import { gql, getContextClient, mutationStore } from "@urql/svelte"; - export let cluster; - export let selectedHistograms; - export let isOpen; + /* Svelte 5 Props */ + let { + cluster, + isOpen = $bindable(), + presetSelectedHistograms, + applyChange + } = $props(); + /* Const Init */ const client = getContextClient(); - const initialized = getContext("initialized"); - function loadHistoMetrics(isInitialized, thisCluster) { - if (!isInitialized) return []; + /* Derived */ + let selectedHistograms = $derived(presetSelectedHistograms); // Non-Const Derived: Is settable + const availableMetrics = $derived(loadHistoMetrics(cluster)); + /* Functions */ + function loadHistoMetrics(thisCluster) { + // isInit Check Removed: Parent Component has finished Init-Query: Globalmetrics available here. if (!thisCluster) { return getContext("globalMetrics") .filter((gm) => gm?.footprint) @@ -42,18 +50,6 @@ } } - const updateConfigurationMutation = ({ name, value }) => { - return mutationStore({ - client: client, - query: gql` - mutation ($name: String!, $value: String!) { - updateConfiguration(name: $name, value: $value) - } - `, - variables: { name, value }, - }); - }; - function updateConfiguration(data) { updateConfigurationMutation({ name: data.name, @@ -67,6 +63,7 @@ function closeAndApply() { isOpen = !isOpen; + applyChange(selectedHistograms) updateConfiguration({ name: cluster ? `user_view_histogramMetrics:${cluster}` @@ -75,8 +72,18 @@ }); } - $: availableMetrics = loadHistoMetrics($initialized, cluster); - + /* Mutation */ + const updateConfigurationMutation = ({ name, value }) => { + return mutationStore({ + client: client, + query: gql` + mutation ($name: String!, $value: String!) { + updateConfiguration(name: $name, value: $value) + } + `, + variables: { name, value }, + }); + }; (isOpen = !isOpen)}> diff --git a/web/frontend/src/generic/select/SortSelection.svelte b/web/frontend/src/generic/select/SortSelection.svelte index ae416d7..f6ba534 100644 --- a/web/frontend/src/generic/select/SortSelection.svelte +++ b/web/frontend/src/generic/select/SortSelection.svelte @@ -7,7 +7,7 @@ --> { + resetSorting(presetSorting); isOpen = !isOpen; }} > @@ -66,7 +95,7 @@ Reset + + diff --git a/web/frontend/src/generic/select/TimeSelection.svelte b/web/frontend/src/generic/select/TimeSelection.svelte index 82f0c3f..1b157c8 100644 --- a/web/frontend/src/generic/select/TimeSelection.svelte +++ b/web/frontend/src/generic/select/TimeSelection.svelte @@ -12,7 +12,6 @@ --> - Range - - {#if timeRange == -1} + {#if customEnabled} + + + + + {:else} + Range + {/if} + + {#if timeType === "range"} + + {#if unknownRange} + + {/if} + {#each Object.entries(options) as [name, seconds]} + + {/each} + + {:else} from updateExplicitTimeRange("from", event)} + bind:value={pendingCustomFrom} + onchange={updateTimeCustom} > to updateExplicitTimeRange("to", event)} + bind:value={pendingCustomTo} + onchange={updateTimeCustom} > {/if} diff --git a/web/frontend/src/generic/utils.js b/web/frontend/src/generic/utils.js index 72c96c0..5a79cff 100644 --- a/web/frontend/src/generic/utils.js +++ b/web/frontend/src/generic/utils.js @@ -388,24 +388,6 @@ export function findJobFootprintThresholds(job, stat, metricConfig) { } } -export function getSortItems() { - //console.time('sort') - const globalMetrics = getContext("globalMetrics") - const result = globalMetrics.map((gm) => { - if (gm?.footprint) { - return { - field: gm.name + '_' + gm.footprint, - type: 'foot', - text: gm.name + ' (' + gm.footprint + ')', - order: 'DESC' - } - } - return null - }).filter((r) => r != null) - //console.timeEnd('sort') - return [...result]; -}; - function getMetricConfigDeep(metric, cluster, subCluster) { const clusters = getContext("clusters"); if (cluster != null) {