mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-09-11 16:09:39 +00:00
nits runs page
This commit is contained in:
@@ -1578,7 +1578,11 @@ async fn list_jobs(
|
||||
None
|
||||
};
|
||||
|
||||
let sql = if lq.success.is_none() && lq.label.is_none() {
|
||||
let sql = if lq.success.is_none()
|
||||
&& lq.label.is_none()
|
||||
&& lq.created_or_started_before.is_none()
|
||||
&& lq.started_before.is_none()
|
||||
{
|
||||
let mut sqlq = list_queue_jobs_query(
|
||||
&w_id,
|
||||
&ListQueueQuery { order_desc: Some(true), ..lq.into() },
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
export let label: string | null = null
|
||||
export let folder: string | null
|
||||
export let path: string | null
|
||||
export let success: 'success' | 'suspended' | 'waiting' | 'failure' | 'running' | undefined = undefined
|
||||
export let success: 'success' | 'suspended' | 'waiting' | 'failure' | 'running' | undefined =
|
||||
undefined
|
||||
export let isSkipped: boolean = false
|
||||
export let showSchedules: boolean = true
|
||||
export let showFutureJobs: boolean = true
|
||||
@@ -46,7 +47,9 @@
|
||||
export let refreshRate = 5000
|
||||
export let syncQueuedRunsCount: boolean = true
|
||||
export let allWorkspaces: boolean = false
|
||||
export let computeMinAndMax: (() => { minTs: string; maxTs: string } | undefined) | undefined
|
||||
export let computeMinAndMax:
|
||||
| (() => { minTs: string; maxTs: string | undefined } | undefined)
|
||||
| undefined
|
||||
export let lookback: number = 0
|
||||
export let perPage: number | undefined = undefined
|
||||
|
||||
@@ -140,7 +143,12 @@
|
||||
scriptPathStart: scriptPathStart,
|
||||
jobKinds,
|
||||
success: success == 'success' ? true : success == 'failure' ? false : undefined,
|
||||
running: (success == 'running' || success == 'suspended' ) ? true : (success == 'waiting' ) ? false : undefined,
|
||||
running:
|
||||
success == 'running' || success == 'suspended'
|
||||
? true
|
||||
: success == 'waiting'
|
||||
? false
|
||||
: undefined,
|
||||
isSkipped: isSkipped ? undefined : false,
|
||||
// isFlowStep: jobKindsCat != 'all' ? false : undefined,
|
||||
hasNullParent:
|
||||
@@ -151,7 +159,10 @@
|
||||
tag: tag === null || tag === '' ? undefined : tag,
|
||||
isNotSchedule: showSchedules == false ? true : undefined,
|
||||
suspended: success == 'waiting' ? false : success == 'suspended' ? true : undefined,
|
||||
scheduledForBeforeNow: showFutureJobs == false || (success == 'waiting' || success == 'suspended') ? true : undefined,
|
||||
scheduledForBeforeNow:
|
||||
showFutureJobs == false || success == 'waiting' || success == 'suspended'
|
||||
? true
|
||||
: undefined,
|
||||
args:
|
||||
argFilter && argFilter != '{}' && argFilter != '' && argError == ''
|
||||
? argFilter
|
||||
@@ -296,8 +307,11 @@
|
||||
}
|
||||
|
||||
async function getCount() {
|
||||
const { database_length, suspended} = (await JobService.getQueueCount({ workspace: $workspaceStore!, allWorkspaces }))
|
||||
|
||||
const { database_length, suspended } = await JobService.getQueueCount({
|
||||
workspace: $workspaceStore!,
|
||||
allWorkspaces
|
||||
})
|
||||
|
||||
if (queue_count) {
|
||||
queue_count.set(database_length)
|
||||
} else {
|
||||
@@ -307,7 +321,6 @@
|
||||
suspended_count.set(suspended ?? 0)
|
||||
} else {
|
||||
suspended_count = tweened(suspended ?? 0, { duration: 1000 })
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,13 +8,23 @@
|
||||
export let loading: boolean = false
|
||||
export let selectedManualDate = 0
|
||||
|
||||
export function computeMinMax(): { minTs: string; maxTs: string } | undefined {
|
||||
export function computeMinMax(): { minTs: string; maxTs: string | undefined } | undefined {
|
||||
return manualDates[selectedManualDate].computeMinMax()
|
||||
}
|
||||
|
||||
export function resetChoice() {
|
||||
selectedManualDate = 0
|
||||
}
|
||||
|
||||
function computeMinMaxInc(inc: number) {
|
||||
let minTs = new Date(new Date().getTime() - inc).toISOString()
|
||||
let maxTs = undefined
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
|
||||
const manualDates: {
|
||||
label: string
|
||||
computeMinMax: () => { minTs: string; maxTs: string } | undefined
|
||||
computeMinMax: () => { minTs: string; maxTs: string | undefined } | undefined
|
||||
}[] = [
|
||||
{
|
||||
label: 'Last 1000 runs',
|
||||
@@ -24,59 +34,31 @@
|
||||
},
|
||||
{
|
||||
label: 'Within 30 seconds',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 30 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(30 * 1000)
|
||||
},
|
||||
{
|
||||
label: 'Within last minute',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 60 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(1 * 60 * 1000)
|
||||
},
|
||||
{
|
||||
label: 'Within last 5 minutes',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 5 * 60 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(5 * 60 * 1000)
|
||||
},
|
||||
{
|
||||
label: 'Within last 30 minutes',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 30 * 60 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(30 * 60 * 1000)
|
||||
},
|
||||
{
|
||||
label: 'Within last 24 hours',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 24 * 60 * 60 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(24 * 60 * 60 * 1000)
|
||||
},
|
||||
{
|
||||
label: 'Within last 7 days',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 7 * 24 * 60 * 60 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(7 * 24 * 60 * 60 * 1000)
|
||||
},
|
||||
{
|
||||
label: 'Within last month',
|
||||
computeMinMax: () => {
|
||||
let minTs = new Date(new Date().getTime() - 30 * 24 * 60 * 60 * 1000).toISOString()
|
||||
let maxTs = new Date().toISOString()
|
||||
return { minTs, maxTs }
|
||||
}
|
||||
computeMinMax: () => computeMinMaxInc(30 * 24 * 60 * 60 * 1000)
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -51,9 +51,12 @@
|
||||
let concurrencyKey: string | null = $page.url.searchParams.get('concurrency_key')
|
||||
let tag: string | null = $page.url.searchParams.get('tag')
|
||||
// Rest of filters handled by RunsFilter
|
||||
let success: 'running' | 'suspended' | 'waiting' | 'success' | 'failure' | undefined = ($page.url.searchParams.get(
|
||||
'success'
|
||||
) ?? undefined) as 'running' | 'success' | 'failure' | undefined
|
||||
let success: 'running' | 'suspended' | 'waiting' | 'success' | 'failure' | undefined =
|
||||
($page.url.searchParams.get('success') ?? undefined) as
|
||||
| 'running'
|
||||
| 'success'
|
||||
| 'failure'
|
||||
| undefined
|
||||
let isSkipped: boolean | undefined =
|
||||
$page.url.searchParams.get('is_skipped') != undefined
|
||||
? $page.url.searchParams.get('is_skipped') == 'true'
|
||||
@@ -88,7 +91,7 @@
|
||||
|
||||
let queue_count: Tweened<number> | undefined = undefined
|
||||
let suspended_count: Tweened<number> | undefined = undefined
|
||||
|
||||
|
||||
let jobKinds: string | undefined = undefined
|
||||
let loading: boolean = false
|
||||
let paths: string[] = []
|
||||
@@ -297,7 +300,6 @@
|
||||
concurrencyKey = null
|
||||
tag = null
|
||||
schedulePath = undefined
|
||||
|
||||
}
|
||||
|
||||
function filterByUser(e: CustomEvent<string>) {
|
||||
@@ -398,27 +400,31 @@
|
||||
scriptPathStart: folder === null || folder === '' ? undefined : `f/${folder}/`,
|
||||
jobKinds,
|
||||
success: success == 'success' ? true : success == 'failure' ? false : undefined,
|
||||
running: (success == 'running' || success == 'suspended' ) ? true : (success == 'waiting' ) ? false : undefined,
|
||||
running:
|
||||
success == 'running' || success == 'suspended'
|
||||
? true
|
||||
: success == 'waiting'
|
||||
? false
|
||||
: undefined,
|
||||
isSkipped: isSkipped ? undefined : false,
|
||||
// isFlowStep: jobKindsCat != 'all' ? false : undefined,
|
||||
hasNullParent:
|
||||
path != undefined || path != undefined || jobKindsCat != 'all'
|
||||
? true
|
||||
: undefined,
|
||||
path != undefined || path != undefined || jobKindsCat != 'all' ? true : undefined,
|
||||
label: label === null || label === '' ? undefined : label,
|
||||
tag: tag === null || tag === '' ? undefined : tag,
|
||||
isNotSchedule: showSchedules == false ? true : undefined,
|
||||
suspended: success == 'waiting' ? false : success == 'suspended' ? true : undefined,
|
||||
scheduledForBeforeNow: showFutureJobs == false || (success == 'waiting' || success == 'suspended') ? true : undefined,
|
||||
args:
|
||||
argFilter && argFilter != '{}' && argFilter != '' && argError == ''
|
||||
? argFilter
|
||||
scheduledForBeforeNow:
|
||||
showFutureJobs == false || success == 'waiting' || success == 'suspended'
|
||||
? true
|
||||
: undefined,
|
||||
args:
|
||||
argFilter && argFilter != '{}' && argFilter != '' && argError == '' ? argFilter : undefined,
|
||||
result:
|
||||
resultFilter && resultFilter != '{}' && resultFilter != '' && resultError == ''
|
||||
? resultFilter
|
||||
: undefined,
|
||||
allWorkspaces: allWorkspaces ? true : undefined,
|
||||
allWorkspaces: allWorkspaces ? true : undefined
|
||||
}
|
||||
|
||||
selectedFiltersString = JSON.stringify(selectedFilters, null, 4)
|
||||
@@ -451,7 +457,6 @@
|
||||
extendedJobs !== undefined &&
|
||||
extendedJobs.jobs.length + extendedJobs.obscured_jobs.length >= 1000
|
||||
|
||||
|
||||
function jobsFilter(f: 'waiting' | 'suspended') {
|
||||
path = null
|
||||
user = null
|
||||
@@ -678,6 +683,7 @@
|
||||
on:zoom={async (e) => {
|
||||
minTs = e.detail.min.toISOString()
|
||||
maxTs = e.detail.max.toISOString()
|
||||
manualDatePicker?.resetChoice()
|
||||
jobLoader?.loadJobs(minTs, maxTs, true)
|
||||
}}
|
||||
/>
|
||||
@@ -697,11 +703,17 @@
|
||||
</div>
|
||||
<div class="flex flex-col gap-1 md:flex-row w-full p-4">
|
||||
<div class="flex gap-2 grow flex-row">
|
||||
<RunsQueue {success} {queue_count} {suspended_count} on:jobs_waiting={() => {
|
||||
jobsFilter('waiting')
|
||||
}} on:jobs_suspended={() => {
|
||||
jobsFilter('suspended')
|
||||
}} />
|
||||
<RunsQueue
|
||||
{success}
|
||||
{queue_count}
|
||||
{suspended_count}
|
||||
on:jobs_waiting={() => {
|
||||
jobsFilter('waiting')
|
||||
}}
|
||||
on:jobs_suspended={() => {
|
||||
jobsFilter('suspended')
|
||||
}}
|
||||
/>
|
||||
<div class="flex flex-row">
|
||||
{#if isSelectingJobsToCancel}
|
||||
<div class="mt-1 p-2 h-8 flex flex-row items-center gap-1">
|
||||
@@ -774,7 +786,9 @@
|
||||
localStorage.setItem('show_schedules_in_run', showSchedules ? 'true' : 'false')
|
||||
}}
|
||||
/>
|
||||
<span class="text-xs absolute -top-4"><span class="hidden xl:inline">CRON</span> Schedules</span>
|
||||
<span class="text-xs absolute -top-4"
|
||||
><span class="hidden xl:inline">CRON</span> Schedules</span
|
||||
>
|
||||
|
||||
<Calendar size={16} />
|
||||
</div>
|
||||
@@ -1027,6 +1041,7 @@
|
||||
on:zoom={async (e) => {
|
||||
minTs = e.detail.min.toISOString()
|
||||
maxTs = e.detail.max.toISOString()
|
||||
manualDatePicker?.resetChoice()
|
||||
jobLoader?.loadJobs(minTs, maxTs, true)
|
||||
}}
|
||||
/>
|
||||
@@ -1047,11 +1062,17 @@
|
||||
<div class="flex flex-col gap-4 md:flex-row w-full p-4 overflow-x-auto">
|
||||
<div class="flex items-center flex-row gap-2 grow">
|
||||
{#if queue_count}
|
||||
<RunsQueue {success} {queue_count} {suspended_count} on:jobs_waiting={() => {
|
||||
jobsFilter('waiting')
|
||||
}} on:jobs_suspended={() => {
|
||||
jobsFilter('suspended')
|
||||
}} />
|
||||
<RunsQueue
|
||||
{success}
|
||||
{queue_count}
|
||||
{suspended_count}
|
||||
on:jobs_waiting={() => {
|
||||
jobsFilter('waiting')
|
||||
}}
|
||||
on:jobs_suspended={() => {
|
||||
jobsFilter('suspended')
|
||||
}}
|
||||
/>
|
||||
{/if}
|
||||
<div class="flex flex-row">
|
||||
{#if isSelectingJobsToCancel}
|
||||
|
||||
Reference in New Issue
Block a user