|
32 | 32 | import Settings from "./pages/Settings.svelte"; |
33 | 33 | import { initTheme, isDark, onThemeChange } from "./lib/theme.js"; |
34 | 34 |
|
| 35 | + function metricFilterFromLegacyMetricsParam(metricsParam) { |
| 36 | + if (!metricsParam) return ""; |
| 37 | + const trimmed = metricsParam.trim(); |
| 38 | + const parts = trimmed.split(",").map((s) => s.trim()).filter(Boolean); |
| 39 | + if (parts.length === 0) return ""; |
| 40 | + const isSimpleToken = (p) => /^[\w./-]+$/.test(p); |
| 41 | + if (parts.every(isSimpleToken)) { |
| 42 | + return parts |
| 43 | + .map((p) => { |
| 44 | + const esc = p.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); |
| 45 | + return `^${esc}$`; |
| 46 | + }) |
| 47 | + .join("|"); |
| 48 | + } |
| 49 | + return trimmed; |
| 50 | + } |
| 51 | +
|
35 | 52 | initTheme(); |
36 | 53 |
|
37 | 54 | let darkMode = $state(isDark()); |
|
53 | 70 | let metricColumns = $state([]); |
54 | 71 | let sidebarOpen = $state(true); |
55 | 72 | let sidebarHidden = $state(false); |
| 73 | + let navbarHidden = $state(false); |
56 | 74 | let urlTick = $state(0); |
57 | 75 | let alerts = $state([]); |
58 | 76 | let pollTimer = $state(null); |
|
212 | 230 | refreshRuns(); |
213 | 231 | }); |
214 | 232 |
|
| 233 | + $effect(() => { |
| 234 | + urlTick; |
| 235 | + navbarHidden = getQueryParam("navbar") === "hidden"; |
| 236 | + }); |
| 237 | +
|
215 | 238 | onMount(() => { |
216 | 239 | const sidebarParam = getQueryParam("sidebar"); |
217 | 240 | if (sidebarParam === "hidden") { |
|
230 | 253 | if (!Number.isNaN(s)) smoothing = s; |
231 | 254 | } |
232 | 255 |
|
233 | | - const metricsParam = getQueryParam("metrics"); |
234 | | - if (metricsParam) { |
235 | | - const parts = metricsParam.split(",").map((s) => s.trim()).filter(Boolean); |
236 | | - if (parts.length) { |
237 | | - metricFilter = parts |
238 | | - .map((p) => { |
239 | | - const esc = p.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); |
240 | | - return `^${esc}$`; |
241 | | - }) |
242 | | - .join("|"); |
243 | | - } |
| 256 | + const metricFilterParam = getQueryParam("metric_filter"); |
| 257 | + const metricsLegacyParam = getQueryParam("metrics"); |
| 258 | + if (metricFilterParam) { |
| 259 | + metricFilter = metricFilterParam; |
| 260 | + } else if (metricsLegacyParam) { |
| 261 | + metricFilter = metricFilterFromLegacyMetricsParam(metricsLegacyParam); |
244 | 262 | } |
245 | 263 |
|
246 | 264 | if (getQueryParam("accordion") === "hidden") { |
|
286 | 304 | } |
287 | 305 | await refreshProjects(); |
288 | 306 | await refreshRuns(); |
| 307 | +
|
289 | 308 | await refreshAlerts(); |
290 | 309 | } catch (e) { |
291 | 310 | console.error("Failed to load projects:", e); |
|
317 | 336 | if (projectLocked) applyLockedProject(); |
318 | 337 | }); |
319 | 338 |
|
| 339 | + let urlRunsFromQueryApplied = $state(false); |
| 340 | +
|
| 341 | + $effect(() => { |
| 342 | + if (urlRunsFromQueryApplied) return; |
| 343 | + if (!appBootstrapReady) return; |
| 344 | + if (!selectedProject) return; |
| 345 | + const runIdsParam = getQueryParam("run_ids"); |
| 346 | + const runsParam = getQueryParam("runs"); |
| 347 | + if (!runIdsParam && !runsParam) { |
| 348 | + urlRunsFromQueryApplied = true; |
| 349 | + return; |
| 350 | + } |
| 351 | + if (!runs.length) { |
| 352 | + urlRunsFromQueryApplied = true; |
| 353 | + return; |
| 354 | + } |
| 355 | + let wanted; |
| 356 | + if (runIdsParam) { |
| 357 | + const ids = runIdsParam.split(",").map((s) => s.trim()).filter(Boolean); |
| 358 | + const validKeys = new Set(runs.map((r) => runKey(r))); |
| 359 | + wanted = ids.filter((id) => validKeys.has(id)); |
| 360 | + } else { |
| 361 | + const names = runsParam.split(",").map((s) => s.trim()).filter(Boolean); |
| 362 | + const wantedNames = new Set(names); |
| 363 | + wanted = runs.filter((r) => wantedNames.has(r.name)).map((r) => runKey(r)); |
| 364 | + } |
| 365 | + if (wanted.length) { |
| 366 | + selectedRuns = wanted; |
| 367 | + } |
| 368 | + urlRunsFromQueryApplied = true; |
| 369 | + }); |
| 370 | +
|
320 | 371 | let showSidebar = $derived( |
321 | 372 | currentPage === "metrics" || |
322 | 373 | currentPage === "traces" || |
|
361 | 412 | bind:selectedSystemDevices |
362 | 413 | bind:traceModel |
363 | 414 | {traceModelChoices} |
| 415 | + {spaceId} |
364 | 416 | {logoUrls} |
365 | 417 | {darkMode} |
366 | 418 | /> |
367 | 419 | {/if} |
368 | 420 |
|
369 | 421 | <div class="main"> |
370 | | - <Navbar {currentPage} onNavigate={handleNavigate} /> |
| 422 | + {#if !navbarHidden} |
| 423 | + <Navbar {currentPage} onNavigate={handleNavigate} /> |
| 424 | + {/if} |
371 | 425 |
|
372 | 426 | <div class="page-content"> |
373 | 427 | {#if currentPage === "metrics"} |
|
0 commit comments