diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 8aed409689..5033b3504e 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -3168,8 +3168,8 @@ paths: - $ref: "#/components/parameters/ScriptExactPath" - $ref: "#/components/parameters/ScriptStartPath" - $ref: "#/components/parameters/ScriptExactHash" - - $ref: "#/components/parameters/CreatedBefore" - - $ref: "#/components/parameters/CreatedAfter" + - $ref: "#/components/parameters/StartedBefore" + - $ref: "#/components/parameters/StartedAfter" - $ref: "#/components/parameters/Success" - $ref: "#/components/parameters/JobKinds" - $ref: "#/components/parameters/Suspended" @@ -3200,8 +3200,8 @@ paths: - $ref: "#/components/parameters/ScriptExactPath" - $ref: "#/components/parameters/ScriptStartPath" - $ref: "#/components/parameters/ScriptExactHash" - - $ref: "#/components/parameters/CreatedBefore" - - $ref: "#/components/parameters/CreatedAfter" + - $ref: "#/components/parameters/StartedBefore" + - $ref: "#/components/parameters/StartedAfter" - $ref: "#/components/parameters/Success" - $ref: "#/components/parameters/JobKinds" - $ref: "#/components/parameters/ArgsFilter" @@ -3239,8 +3239,8 @@ paths: - $ref: "#/components/parameters/ScriptExactPath" - $ref: "#/components/parameters/ScriptStartPath" - $ref: "#/components/parameters/ScriptExactHash" - - $ref: "#/components/parameters/CreatedBefore" - - $ref: "#/components/parameters/CreatedAfter" + - $ref: "#/components/parameters/StartedBefore" + - $ref: "#/components/parameters/StartedAfter" - $ref: "#/components/parameters/JobKinds" - $ref: "#/components/parameters/ArgsFilter" - $ref: "#/components/parameters/ResultFilter" @@ -4620,15 +4620,15 @@ components: in: query schema: type: string - CreatedBefore: - name: created_before + StartedBefore: + name: started_before description: filter on created before (inclusive) timestamp in: query schema: type: string format: date-time - CreatedAfter: - name: created_after + StartedAfter: + name: started_after description: filter on created after (exclusive) timestamp in: query schema: diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index ad396b7f5c..692a5696eb 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -327,8 +327,8 @@ pub struct ListQueueQuery { pub script_path_exact: Option, pub script_hash: Option, pub created_by: Option, - pub created_before: Option>, - pub created_after: Option>, + pub started_before: Option>, + pub started_after: Option>, pub running: Option, pub parent_job: Option, pub order_desc: Option, @@ -364,11 +364,11 @@ fn list_queue_jobs_query(w_id: &str, lq: &ListQueueQuery, fields: &[&str]) -> Sq if let Some(pj) = &lq.parent_job { sqlb.and_where_eq("parent_job", "?".bind(pj)); } - if let Some(dt) = &lq.created_before { - sqlb.and_where_lt("created_at", format!("to_timestamp({})", dt.timestamp())); + if let Some(dt) = &lq.started_before { + sqlb.and_where_le("started_at", format!("to_timestamp({})", dt.timestamp())); } - if let Some(dt) = &lq.created_after { - sqlb.and_where_gt("created_at", format!("to_timestamp({})", dt.timestamp())); + if let Some(dt) = &lq.started_after { + sqlb.and_where_ge("started_at", format!("to_timestamp({})", dt.timestamp())); } if let Some(s) = &lq.suspended { @@ -462,8 +462,8 @@ async fn list_jobs( script_path_exact: lq.script_path_exact, script_hash: lq.script_hash, created_by: lq.created_by, - created_before: lq.created_before, - created_after: lq.created_after, + started_before: lq.started_before, + started_after: lq.started_after, running: None, parent_job: lq.parent_job, order_desc: Some(true), @@ -1695,11 +1695,11 @@ fn list_completed_jobs_query( if let Some(pj) = &lq.parent_job { sqlb.and_where_eq("parent_job", "?".bind(pj)); } - if let Some(dt) = &lq.created_before { - sqlb.and_where_lt("created_at", format!("to_timestamp({})", dt.timestamp())); + if let Some(dt) = &lq.started_before { + sqlb.and_where_le("started_at", format!("to_timestamp({})", dt.timestamp())); } - if let Some(dt) = &lq.created_after { - sqlb.and_where_gt("created_at", format!("to_timestamp({})", dt.timestamp())); + if let Some(dt) = &lq.started_after { + sqlb.and_where_ge("started_at", format!("to_timestamp({})", dt.timestamp())); } if let Some(sk) = &lq.is_skipped { sqlb.and_where_eq("is_skipped", sk); @@ -1731,8 +1731,8 @@ pub struct ListCompletedQuery { pub script_path_exact: Option, pub script_hash: Option, pub created_by: Option, - pub created_before: Option>, - pub created_after: Option>, + pub started_before: Option>, + pub started_after: Option>, pub success: Option, pub parent_job: Option, pub order_desc: Option, diff --git a/frontend/src/lib/components/RunChart.svelte b/frontend/src/lib/components/RunChart.svelte index 2d04cde1b8..1890269f62 100644 --- a/frontend/src/lib/components/RunChart.svelte +++ b/frontend/src/lib/components/RunChart.svelte @@ -45,7 +45,7 @@ label: 'Failed', data: failed?.map((job) => ({ - x: job.created_at as any, + x: job.started_at as any, y: job.duration_ms, id: job.id, path: job.script_path @@ -57,7 +57,7 @@ label: 'Successful', data: success?.map((job) => ({ - x: job.created_at as any, + x: job.started_at as any, y: job.duration_ms, id: job.id, path: job.script_path @@ -71,7 +71,10 @@ enabled: true, modifierKey: 'ctrl' as 'ctrl', onPanComplete: ({ chart }) => { - dispatch('zoom', { min: new Date(chart.scales.x.min), max: new Date(chart.scales.x.max) }) + dispatch('zoom', { + min: addSeconds(new Date(chart.scales.x.min), -1), + max: addSeconds(new Date(chart.scales.x.max), 1) + }) } }, zoom: { @@ -80,7 +83,10 @@ }, mode: 'x' as 'x', onZoom: ({ chart }) => { - dispatch('zoom', { min: new Date(chart.scales.x.min), max: new Date(chart.scales.x.max) }) + dispatch('zoom', { + min: addSeconds(new Date(chart.scales.x.min), -1), + max: addSeconds(new Date(chart.scales.x.max), 1) + }) } } } @@ -88,6 +94,22 @@ function getPath(x: any): string { return x.path } + + $: minTime = getMinTime(jobs) + + function addSeconds(date: Date, seconds: number): Date { + date.setTime(date.getTime() + seconds * 1000) + return date + } + function getMinTime(jobs: CompletedJob[] | undefined): Date { + return addSeconds(new Date(jobs?.[jobs?.length - 1]?.started_at ?? new Date().toString()), -15) + } + + $: maxTime = getMaxTime(jobs) + + function getMaxTime(jobs: CompletedJob[] | undefined): Date { + return addSeconds(new Date(jobs?.[0]?.started_at ?? new Date().toString()), 15) + } { const nurl = new URL(url.toString()) - nurl.searchParams.set(key, value) + console.log(url.toString()) + for (const { key, value } of args) { + if (value) { + nurl.searchParams.set(key, value) + } else { + nurl.searchParams.delete(key) + } + } + try { history.replaceState(history.state, '', nurl.toString()) } catch (e) { console.error(e) } - }, 200) + }, bounceTime ?? 200) } export function groupBy( diff --git a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte index d436f8a5de..c0db346ad4 100644 --- a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte @@ -1,7 +1,7 @@ @@ -254,12 +266,14 @@ /> {/key}