From 688b5aed7f337d958d1bcf0d27ca70f6cd49e362 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Mon, 12 Jan 2026 14:17:31 +0100 Subject: [PATCH] more migration --- .../lib/components/ConcurrentJobsChart.svelte | 12 +- frontend/src/lib/components/RunChart.svelte | 12 +- frontend/src/lib/components/RunsPage.svelte | 160 +++++++++--------- .../calendarPicker/CalendarPicker.svelte | 2 +- .../src/lib/components/runs/JobsLoader.svelte | 74 ++++---- .../components/runs/ManuelDatePicker.svelte | 14 +- .../src/lib/components/runs/RunsFilter.svelte | 12 +- frontend/src/lib/utils.ts | 2 +- 8 files changed, 144 insertions(+), 144 deletions(-) diff --git a/frontend/src/lib/components/ConcurrentJobsChart.svelte b/frontend/src/lib/components/ConcurrentJobsChart.svelte index c401df4be6..de67c50290 100644 --- a/frontend/src/lib/components/ConcurrentJobsChart.svelte +++ b/frontend/src/lib/components/ConcurrentJobsChart.svelte @@ -19,16 +19,16 @@ interface Props { extendedJobs?: ExtendedJobs | undefined maxIsNow?: boolean - minTimeSet?: string | undefined - maxTimeSet?: string | undefined + minTimeSet?: string | null + maxTimeSet?: string | null onZoom: (zoom: { min: Date; max: Date }) => void } let { extendedJobs = undefined, maxIsNow = false, - minTimeSet = undefined, - maxTimeSet = undefined, + minTimeSet = null, + maxTimeSet = null, onZoom }: Props = $props() @@ -157,8 +157,8 @@ } function computeMinMaxTime( intervals: AggregatedInterval[] | undefined, - minTimeSet: string | undefined, - maxTimeSet: string | undefined + minTimeSet: string | null, + maxTimeSet: string | null ) { let minTimeSetDate = minTimeSet ? new Date(minTimeSet) : undefined let maxTimeSetDate = maxTimeSet ? new Date(maxTimeSet) : undefined diff --git a/frontend/src/lib/components/RunChart.svelte b/frontend/src/lib/components/RunChart.svelte index 78873a3537..72b616cbba 100644 --- a/frontend/src/lib/components/RunChart.svelte +++ b/frontend/src/lib/components/RunChart.svelte @@ -23,8 +23,8 @@ interface Props { jobs?: CompletedJob[] | undefined maxIsNow?: boolean - minTimeSet?: string | undefined - maxTimeSet?: string | undefined + minTimeSet?: string | null + maxTimeSet?: string | null selectedIds?: string[] canSelect?: boolean lastFetchWentToEnd?: boolean @@ -37,8 +37,8 @@ let { jobs = [], maxIsNow = false, - minTimeSet = undefined, - maxTimeSet = undefined, + minTimeSet = null, + maxTimeSet = null, selectedIds = $bindable([]), canSelect = true, lastFetchWentToEnd = false, @@ -163,8 +163,8 @@ function computeMinMaxTime( jobs: CompletedJob[] | undefined, - minTimeSet: string | undefined, - maxTimeSet: string | undefined + minTimeSet: string | null, + maxTimeSet: string | null ) { let minTimeSetDate = minTimeSet ? new Date(minTimeSet) : undefined let maxTimeSetDate = maxTimeSet ? new Date(maxTimeSet) : undefined diff --git a/frontend/src/lib/components/RunsPage.svelte b/frontend/src/lib/components/RunsPage.svelte index bcbeb3e087..e14cdfeae6 100644 --- a/frontend/src/lib/components/RunsPage.svelte +++ b/frontend/src/lib/components/RunsPage.svelte @@ -73,7 +73,12 @@ .nullable() .default(null), show_skipped: z.boolean().default(false), - show_schedules: z.boolean().default(true) + show_schedules: z.boolean().default(true), + min_ts: z.string().nullable().default(null), + max_ts: z.string().nullable().default(null), + schedule_path: z.string().nullable().default(null), + job_kinds: z.string().default('runs'), + all_workspaces: z.boolean().default(false) }) ) let jobs: Job[] | undefined = $state() @@ -97,13 +102,6 @@ (page.url.searchParams.get('job_trigger_kind') as JobTriggerKind) ?? undefined ) - // Handled on the main page - let minTs = $state(page.url.searchParams.get('min_ts') ?? undefined) - let maxTs = $state(page.url.searchParams.get('max_ts') ?? undefined) - let schedulePath = $state(page.url.searchParams.get('schedule_path') ?? undefined) - let jobKindsCat = $state(page.url.searchParams.get('job_kinds') ?? 'runs') - let allWorkspaces = $state(page.url.searchParams.get('all_workspaces') == 'true') - let lastFetchWentToEnd = $state(false) function loadFromQuery() { @@ -115,13 +113,7 @@ : undefined jobTriggerKind = (page.url.searchParams.get('job_trigger_kind') as JobTriggerKind) ?? undefined - // Handled on the main page - minTs = page.url.searchParams.get('min_ts') ?? undefined - maxTs = page.url.searchParams.get('max_ts') ?? undefined - schedulePath = page.url.searchParams.get('schedule_path') ?? undefined perPage = parseInt(page.url.searchParams.get('per_page') ?? DEFAULT_RUNS_PER_PAGE.toString()) - jobKindsCat = page.url.searchParams.get('job_kinds') ?? 'runs' - allWorkspaces = page.url.searchParams.get('all_workspaces') == 'true' } let queue_count: Tweened | undefined = $state(undefined) @@ -178,24 +170,24 @@ if (resultError == '' && argError == '') { filterTimeout && clearTimeout(filterTimeout) filterTimeout = setTimeout(() => { - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }, 2000) } } function reset() { - minTs = undefined - maxTs = undefined + filters.min_ts = null + filters.max_ts = null jobs = undefined completedJobs = undefined lastFetchWentToEnd = false selectedManualDate = 0 selectedIds = [] - schedulePath = undefined + filters.schedule_path = null batchReRunOptions = { flow: {}, script: {} } selectionMode = false selectedWorkspace = undefined - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) } async function loadUsernames(): Promise { @@ -222,7 +214,7 @@ filters.concurrency_key = null filters.tag = null filters.worker = null - schedulePath = undefined + filters.schedule_path = null } function filterByUser(e: CustomEvent) { @@ -232,7 +224,7 @@ filters.label = null filters.concurrency_key = null filters.tag = null - schedulePath = undefined + filters.schedule_path = null } function filterByFolder(e: CustomEvent) { @@ -243,7 +235,7 @@ filters.concurrency_key = null filters.tag = null filters.worker = null - schedulePath = undefined + filters.schedule_path = null } function filterByLabel(e: CustomEvent) { @@ -255,7 +247,7 @@ filters.tag = null filters.worker = null filters.allow_wildcards = false - schedulePath = undefined + filters.schedule_path = null } function filterByConcurrencyKey(e: CustomEvent) { @@ -266,7 +258,7 @@ filters.concurrency_key = e.detail filters.tag = null filters.worker = null - schedulePath = undefined + filters.schedule_path = null } function filterByTag(e: CustomEvent) { @@ -278,7 +270,7 @@ filters.tag = e.detail filters.worker = null filters.allow_wildcards = false - schedulePath = undefined + filters.schedule_path = null } function filterBySchedule(e: CustomEvent) { @@ -289,7 +281,7 @@ filters.concurrency_key = null filters.tag = null filters.worker = null - schedulePath = e.detail + filters.schedule_path = e.detail } function filterByWorker(e: CustomEvent) { @@ -301,7 +293,7 @@ filters.tag = null filters.worker = e.detail filters.allow_wildcards = false - schedulePath = undefined + filters.schedule_path = null } let calendarChangeTimeout: ReturnType | undefined = $state(undefined) @@ -341,9 +333,9 @@ function getSelectedFilters() { return { workspace: $workspaceStore ?? '', - startedBefore: maxTs, - startedAfter: minTs, - schedulePath, + startedBefore: filters.max_ts ?? undefined, + startedAfter: filters.min_ts ?? undefined, + schedulePath: filters.schedule_path ?? undefined, scriptPathExact: filters.path === null || filters.path === '' ? undefined : filters.path, createdBy: filters.user || undefined, scriptPathStart: filters.folder ? `f/${filters.folder}/` : undefined, @@ -359,7 +351,7 @@ isSkipped: filters.show_skipped ? undefined : false, // isFlowStep: jobKindsCat != 'all' ? false : undefined, hasNullParent: - filters.path != undefined || filters.path != undefined || jobKindsCat != 'all' + filters.path != undefined || filters.path != undefined || filters.job_kinds != 'all' ? true : undefined, label: filters.label || undefined, @@ -380,7 +372,7 @@ ? resultFilter : undefined, jobTriggerKind, - allWorkspaces: allWorkspaces || undefined, + allWorkspaces: filters.all_workspaces || undefined, allowWildcards: filters.allow_wildcards || undefined } } @@ -398,7 +390,7 @@ forceCancel: forceCancel }) selectedIds = [] - jobsLoader?.loadJobs(minTs, maxTs, true, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true, true) sendUserToast(`Canceled ${uuids.length} jobs`) selectionMode = false } @@ -505,7 +497,7 @@ selectedIds = [] batchReRunOptions = { flow: {}, script: {} } - jobsLoader?.loadJobs(minTs, maxTs, true, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true, true) selectionMode = false } @@ -514,7 +506,7 @@ selectedIds = [] loadingSelectedIds = true - if (jobKindsCat !== 'runs') { + if (filters.job_kinds !== 'runs') { sendUserToast('Batch re-run is only supported for scripts and flows', true) } selectedIds = await JobService.listFilteredJobsUuids({ @@ -554,13 +546,13 @@ filters.concurrency_key = null filters.tag = null filters.worker = null - schedulePath = undefined + filters.schedule_path = null if (filters.success == f) { filters.success = null } else { filters.success = f } - jobKindsCat = 'all' + filters.job_kinds = 'all' } $effect(() => { @@ -620,7 +612,7 @@
- {#if minTs || maxTs} + {#if filters.min_ts || filters.max_ts} {/if} { - minTs = new Date(detail).toISOString() + filters.min_ts = new Date(detail).toISOString() calendarChangeTimeout && clearTimeout(calendarChangeTimeout) calendarChangeTimeout = setTimeout(() => { - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }, 1000) }} on:clear={async () => { - minTs = undefined + filters.min_ts = null calendarChangeTimeout && clearTimeout(calendarChangeTimeout) calendarChangeTimeout = setTimeout(() => { - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }, 1000) }} /> - {#if maxTs || minTs} + {#if filters.max_ts || filters.min_ts} {/if} { - maxTs = new Date(detail).toISOString() + filters.max_ts = new Date(detail).toISOString() calendarChangeTimeout && clearTimeout(calendarChangeTimeout) calendarChangeTimeout = setTimeout(() => { - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }, 1000) }} on:clear={async () => { - maxTs = undefined + filters.max_ts = null calendarChangeTimeout && clearTimeout(calendarChangeTimeout) calendarChangeTimeout = setTimeout(() => { - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }, 1000) }} /> - {#if minTs || maxTs} + {#if filters.min_ts || filters.max_ts} @@ -851,13 +851,13 @@ bind:jobTriggerKind bind:argError bind:resultError - bind:jobKindsCat - bind:allWorkspaces - bind:schedulePath + bind:jobKindsCat={filters.job_kinds} + bind:allWorkspaces={filters.all_workspaces} + bind:schedulePath={filters.schedule_path} on:change={reloadJobsWithoutFilterError} on:successChange={(e) => { - if (e.detail == 'running' && maxTs != undefined) { - maxTs = undefined + if (e.detail == 'running' && filters.max_ts != undefined) { + filters.max_ts = null } }} {usernames} @@ -865,7 +865,7 @@ {paths} mobile={innerWidth < verySmallScreenWidth} small={innerWidth < smallScreenWidth} - calendarSmall={!minTs && !maxTs} + calendarSmall={!filters.min_ts && !filters.max_ts} />
@@ -939,17 +939,17 @@ {lastFetchWentToEnd} bind:selectedIds canSelect={!selectionMode} - minTimeSet={minTs} - maxTimeSet={maxTs} + minTimeSet={filters.min_ts} + maxTimeSet={filters.max_ts} totalRowsFetched={jobs?.length ?? 0} - maxIsNow={maxTs == undefined} + maxIsNow={filters.max_ts == undefined} onLoadExtra={loadExtra} jobs={completedJobs} onZoom={async (zoom) => { - minTs = zoom.min.toISOString() - maxTs = zoom.max.toISOString() + filters.min_ts = zoom.min.toISOString() + filters.max_ts = zoom.max.toISOString() manualDatePicker?.resetChoice() - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }} onPointClicked={(ids) => { runsTable?.scrollToRun(ids) @@ -957,14 +957,14 @@ /> {:else if graph === 'ConcurrencyChart'} { - minTs = zoom.min.toISOString() - maxTs = zoom.max.toISOString() - jobsLoader?.loadJobs(minTs, maxTs, true) + filters.min_ts = zoom.min.toISOString() + filters.max_ts = zoom.max.toISOString() + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }} /> {/if} @@ -1049,10 +1049,10 @@ { lastFetchWentToEnd = false - jobsLoader?.loadJobs(minTs, maxTs, true) + jobsLoader?.loadJobs(filters.min_ts, filters.max_ts, true) }} - bind:minTs - bind:maxTs + bind:minTs={filters.min_ts} + bind:maxTs={filters.max_ts} bind:selectedManualDate {loading} bind:this={manualDatePicker} diff --git a/frontend/src/lib/components/common/calendarPicker/CalendarPicker.svelte b/frontend/src/lib/components/common/calendarPicker/CalendarPicker.svelte index a228e207f1..bfcf3761a8 100644 --- a/frontend/src/lib/components/common/calendarPicker/CalendarPicker.svelte +++ b/frontend/src/lib/components/common/calendarPicker/CalendarPicker.svelte @@ -6,7 +6,7 @@ import DateTimeInput from '$lib/components/DateTimeInput.svelte' import { twMerge } from 'tailwind-merge' - export let date: string | undefined + export let date: string | null export let label: string export let useDropdown: boolean = false export let clearable: boolean = false diff --git a/frontend/src/lib/components/runs/JobsLoader.svelte b/frontend/src/lib/components/runs/JobsLoader.svelte index 6c1f684675..3782f0c2e8 100644 --- a/frontend/src/lib/components/runs/JobsLoader.svelte +++ b/frontend/src/lib/components/runs/JobsLoader.svelte @@ -32,10 +32,10 @@ argFilter: string | undefined resultFilter?: string | undefined jobTriggerKind?: JobTriggerKind | undefined - schedulePath?: string | undefined - jobKindsCat?: string | undefined - minTs?: string | undefined - maxTs?: string | undefined + schedulePath?: string | null + jobKindsCat?: string | null + minTs: string | null + maxTs: string | null jobKinds?: string queue_count?: Tweened | undefined suspended_count?: Tweened | undefined @@ -52,9 +52,9 @@ refreshRate?: number syncQueuedRunsCount?: boolean allWorkspaces?: boolean - computeMinAndMax: (() => { minTs: string; maxTs: string | undefined } | undefined) | undefined + computeMinAndMax: (() => { minTs: string; maxTs: string | null } | undefined) | undefined lookback?: number - perPage?: number + perPage: number allowWildcards?: boolean } @@ -73,18 +73,18 @@ resultFilter = undefined, jobTriggerKind = undefined, schedulePath = undefined, - jobKindsCat = undefined, - minTs = $bindable(undefined), - maxTs = $bindable(undefined), - jobKinds = $bindable(undefined), - queue_count = $bindable(undefined), - suspended_count = $bindable(undefined), + jobKindsCat = null, + minTs = $bindable(), + maxTs = $bindable(), + jobKinds = $bindable(), + queue_count = $bindable(), + suspended_count = $bindable(), autoRefresh = true, - completedJobs = $bindable(undefined), - externalJobs = $bindable(undefined), + completedJobs = $bindable(), + externalJobs = $bindable(), concurrencyKey, tag, - extendedJobs = $bindable(undefined), + extendedJobs = $bindable(), argError = '', resultError = '', loading = $bindable(false), @@ -93,7 +93,7 @@ allWorkspaces = false, computeMinAndMax, lookback = 0, - perPage = $bindable(1000), + perPage = $bindable(), allowWildcards = false }: Props = $props() let intervalId: ReturnType | undefined = $state() @@ -120,8 +120,8 @@ return promise } - function computeJobKinds(jobKindsCat: string | undefined): string { - if (jobKindsCat == undefined && jobKinds != undefined) { + function computeJobKinds(jobKindsCat: string | null): string { + if (jobKindsCat == null && jobKinds != null) { return jobKinds } if (jobKindsCat == 'all') { @@ -192,8 +192,8 @@ } function fetchJobs( - completedBefore: string | undefined, - completedAfter: string | undefined, + completedBefore: string | null, + completedAfter: string | null, createdAfterQueue: string | undefined ): CancelablePromise { loadingFetch = true @@ -201,10 +201,10 @@ let scriptPathExact = path === null || path === '' ? undefined : path let promise = JobService.listJobs({ workspace: $workspaceStore!, - completedBefore, - completedAfter, + completedBefore: completedBefore ?? undefined, + completedAfter: completedAfter ?? undefined, createdAfterQueue, - schedulePath, + schedulePath: schedulePath ?? undefined, scriptPathExact, createdBy: user === null || user === '' ? undefined : user, scriptPathStart: scriptPathStart, @@ -253,20 +253,20 @@ function fetchExtendedJobs( concurrencyKey: string | null, - createdBeforeQueue: string | undefined, - completedAfter: string | undefined + createdBeforeQueue: string | null, + completedAfter: string | null ): CancelablePromise { loadingFetch = true let promise = ConcurrencyGroupsService.listExtendedJobs({ rowLimit: perPage, concurrencyKey: concurrencyKey == null || concurrencyKey == '' ? undefined : concurrencyKey, workspace: $workspaceStore!, - completedAfter, - createdBeforeQueue: createdBeforeQueue, + completedAfter: completedAfter ?? undefined, + createdBeforeQueue: createdBeforeQueue ?? undefined, // createdOrStartedBefore: startedBefore, // createdOrStartedAfter: startedAfter, // createdOrStartedAfterCompletedJobs: startedAfterCompletedJobs, - schedulePath, + schedulePath: schedulePath ?? undefined, scriptPathExact: path === null || path === '' ? undefined : path, createdBy: user === null || user === '' ? undefined : user, scriptPathStart: folder === null || folder === '' ? undefined : `f/${folder}/`, @@ -302,8 +302,8 @@ } export async function loadJobs( - nMinTs: string | undefined, - nMaxTs: string | undefined, + nMinTs: string | null, + nMaxTs: string | null, reset: boolean, shouldGetCount?: boolean ): Promise { @@ -334,7 +334,7 @@ const extendedMinTs = subtractDaysFromDateString(minTs, lookback) if (concurrencyKey == null || concurrencyKey === '') { - return CancelablePromiseUtils.map(fetchJobs(maxTs, undefined, extendedMinTs), (newJobs) => { + return CancelablePromiseUtils.map(fetchJobs(maxTs, null, extendedMinTs), (newJobs) => { extendedJobs = { jobs: newJobs, obscured_jobs: [] } as ExtendedJobs // Filter on minTs here and not in the backend @@ -346,7 +346,7 @@ }) } else { return CancelablePromiseUtils.map( - fetchExtendedJobs(concurrencyKey, maxTs, extendedMinTs), + fetchExtendedJobs(concurrencyKey, maxTs, extendedMinTs ?? null), (newExtendedJobs) => { extendedJobs = newExtendedJobs const newJobs = newExtendedJobs.jobs @@ -399,8 +399,8 @@ async function syncer() { if (success == 'waiting') { - minTs = undefined - maxTs = undefined + minTs = null + maxTs = null } if (loadingFetch) { return @@ -426,7 +426,7 @@ loadJobsIntern(false) } else { let minQueueCreatedAt: string | undefined = undefined - let completedTs: string | undefined = undefined + let completedTs: string | null = null let cursor = 0 @@ -491,8 +491,8 @@ return ret } - function sortMinDate(minTs: string | undefined, jobs: Job[]) { - if (minTs != undefined) { + function sortMinDate(minTs: string | null, jobs: Job[]) { + if (minTs) { const minDate = new Date(minTs) return jobs.filter((x) => x.started_at diff --git a/frontend/src/lib/components/runs/ManuelDatePicker.svelte b/frontend/src/lib/components/runs/ManuelDatePicker.svelte index aaf0d60063..ceb393799b 100644 --- a/frontend/src/lib/components/runs/ManuelDatePicker.svelte +++ b/frontend/src/lib/components/runs/ManuelDatePicker.svelte @@ -4,8 +4,8 @@ import { createEventDispatcher } from 'svelte' interface Props { - minTs: string | undefined - maxTs: string | undefined + minTs: string | null + maxTs: string | null loading?: boolean selectedManualDate?: number loadText?: string | undefined @@ -23,7 +23,7 @@ numberOfLastJobsToFetch = 1000 }: Props = $props() - export function computeMinMax(): { minTs: string; maxTs: string | undefined } | undefined { + export function computeMinMax(): { minTs: string; maxTs: string | null } | undefined { return manualDates[selectedManualDate].computeMinMax() } @@ -33,13 +33,13 @@ function computeMinMaxInc(inc: number) { let minTs = new Date(new Date().getTime() - inc).toISOString() - let maxTs = undefined + let maxTs = null return { minTs, maxTs } } const fixedManualDates: { label: string - computeMinMax: () => { minTs: string; maxTs: string | undefined } | undefined + computeMinMax: () => { minTs: string; maxTs: string | null } | undefined }[] = [ ...(!serviceLogsChoices ? [ @@ -110,8 +110,8 @@ minTs = ts.minTs maxTs = ts.maxTs } else { - minTs = undefined - maxTs = undefined + minTs = null + maxTs = null } dispatch('loadJobs') } diff --git a/frontend/src/lib/components/runs/RunsFilter.svelte b/frontend/src/lib/components/runs/RunsFilter.svelte index 02192bd7ab..bc43f60ca7 100644 --- a/frontend/src/lib/components/runs/RunsFilter.svelte +++ b/frontend/src/lib/components/runs/RunsFilter.svelte @@ -38,7 +38,7 @@ user?: string | null folder?: string | null mobile?: boolean - schedulePath: string | undefined + schedulePath: string | null allowWildcards?: boolean // Autocomplete data paths?: string[] @@ -120,7 +120,7 @@ let displayedLabel = $derived(label) let displayedConcurrencyKey = $derived(concurrencyKey) let displayedTag = $derived(tag) - let displayedSchedule = $derived(schedulePath) + let displayedSchedule = $derived(schedulePath ?? undefined) let displayedWorker = $derived(worker) $effect(() => { ;(path || user || folder || label || worker || concurrencyKey || tag || schedulePath) && @@ -134,7 +134,7 @@ label = null concurrencyKey = null tag = null - schedulePath = undefined + schedulePath = null worker = null } @@ -407,7 +407,7 @@