diff --git a/frontend/src/lib/components/runs/RunRow.svelte b/frontend/src/lib/components/runs/RunRow.svelte index f79b1b7307..2f904cef8e 100644 --- a/frontend/src/lib/components/runs/RunRow.svelte +++ b/frontend/src/lib/components/runs/RunRow.svelte @@ -2,7 +2,13 @@ import { base } from '$lib/base' import { goto } from '$lib/navigation' import type { Job } from '$lib/gen' - import { displayDate, msToReadableTime, truncateHash, truncateRev, isJobCancelable } from '$lib/utils' + import { + displayDate, + msToReadableTime, + truncateHash, + truncateRev, + isJobCancelable + } from '$lib/utils' import { Badge, Button } from '../common' import ScheduleEditor from '../ScheduleEditor.svelte' import BarsStaggered from '$lib/components/icons/BarsStaggered.svelte' @@ -34,11 +40,11 @@ export let containsLabel: boolean = false export let activeLabel: string | null export let isSelectingJobsToCancel: boolean = false + export let isBatch: boolean = false let scheduleEditor: ScheduleEditor $: isExternal = job && job.id === '-' - @@ -60,7 +66,7 @@ }} >
- {#if isSelectingJobsToCancel && isJobCancelable(job)} + {#if isBatch || (isSelectingJobsToCancel && isJobCancelable(job))}
@@ -123,7 +129,6 @@ Scheduled for {displayDate(job.scheduled_for)} {:else if job.canceled} Cancelling job... (created ) - {:else} Waiting for executor (created ) {/if} diff --git a/frontend/src/lib/components/runs/RunnableBatchModal.svelte b/frontend/src/lib/components/runs/RunnableBatchModal.svelte deleted file mode 100644 index 6aa7bb92e8..0000000000 --- a/frontend/src/lib/components/runs/RunnableBatchModal.svelte +++ /dev/null @@ -1,155 +0,0 @@ - - - { - modalIsOpen = false - }} - on:canceled - title="Runnable batch" - class="w-full max-w-full xl:max-w-7xl" -> -
- -
-

Runnable Jobs

-
    - {#each newJobs as job} -
  • - - {job.prior.id} - {job.prior.script_path} - {job.prior.tag} -
  • - {/each} -
-
- - -
-

Job Configurations

- - - - {#each newJobs as job} - {#if job.isSelected} -
-

{job.prior.id} Config

-
- {#if job.newArgs !== undefined} - {#each Object.keys(job.newArgs) as key} -
- - -
- {/each} - {/if} -
-
- {/if} - {/each} -
-
- - -
diff --git a/frontend/src/lib/components/runs/RunsBatch.svelte b/frontend/src/lib/components/runs/RunsBatch.svelte new file mode 100644 index 0000000000..e824104214 --- /dev/null +++ b/frontend/src/lib/components/runs/RunsBatch.svelte @@ -0,0 +1,135 @@ + + +
+ + + +
diff --git a/frontend/src/lib/components/runs/RunsTable.svelte b/frontend/src/lib/components/runs/RunsTable.svelte index 1d4df56c51..ed384ab900 100644 --- a/frontend/src/lib/components/runs/RunsTable.svelte +++ b/frontend/src/lib/components/runs/RunsTable.svelte @@ -9,7 +9,6 @@ import { workspaceStore } from '$lib/stores' import { twMerge } from 'tailwind-merge' import { isJobCancelable } from '$lib/utils' - import RunnableBatchModal from './RunnableBatchModal.svelte' //import InfiniteLoading from 'svelte-infinite-loading' export let jobs: Job[] | undefined = undefined @@ -17,6 +16,7 @@ export let omittedObscuredJobs: boolean export let showExternalJobs: boolean = false export let isSelectingJobsToCancel: boolean = false + export let isBatch: boolean = false export let selectedIds: string[] = [] export let selectedWorkspace: string | undefined = undefined export let activeLabel: string | null = null @@ -149,12 +149,27 @@ selectedIds = [] } else { allSelected = true + if (isBatch && !isSelectingJobsToCancel) { + selectedIds = jobs?.map((j) => j.id) ?? [] + return + } selectedIds = jobs?.filter(isJobCancelable).map((j) => j.id) ?? [] } } let cancelableJobCount: number = 0 $: isSelectingJobsToCancel && (allSelected = selectedIds.length === cancelableJobCount) $: isSelectingJobsToCancel && (cancelableJobCount = jobs?.filter(isJobCancelable).length ?? 0) + $: handleIsBatchToggle(isBatch) + + function handleIsBatchToggle(newIsBatch: boolean) { + if (newIsBatch) { + allSelected = true + selectedIds = jobs?.map((j) => j.id) ?? [] + } else { + allSelected = false + selectedIds = [] + } + } function jobCountString(jobCount: number | undefined, lastFetchWentToEnd: boolean): string { if (jobCount === undefined) { @@ -186,22 +201,19 @@ } } } - - let batchModalIsOpen = false computeHeight()} /> - +
-
- {#if isSelectingJobsToCancel && cancelableJobCount != 0} + {#if !!isBatch || (isSelectingJobsToCancel && cancelableJobCount != 0)}
{ const jobId = jobOrDate.job.id - if (isSelectingJobsToCancel) { + if (isBatch || isSelectingJobsToCancel) { if (selectedIds.includes(jobOrDate.job.id)) { selectedIds = selectedIds.filter((id) => id != jobId) } else { diff --git a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte index 120699e183..450965e912 100644 --- a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte @@ -39,6 +39,7 @@ import { goto } from '$app/navigation' import { base } from '$app/paths' import { isJobCancelable } from '$lib/utils' + import RunsBatch from '$lib/components/runs/RunsBatch.svelte' let jobs: Job[] | undefined let selectedIds: string[] = [] @@ -326,6 +327,7 @@ selectedIds = [] jobIdsToCancel = [] isSelectingJobsToCancel = false + isBatch = false selectedWorkspace = undefined jobLoader?.loadJobs(minTs, maxTs, true) } @@ -437,10 +439,12 @@ let jobIdsToCancel: string[] = [] let isSelectingJobsToCancel = false + let isBatch: boolean = false let fetchingFilteredJobs = false let selectedFiltersString: string | undefined = undefined async function cancelVisibleJobs() { + isBatch = false isSelectingJobsToCancel = true selectedIds = jobs?.filter(isJobCancelable).map((j) => j.id) ?? [] if (selectedIds.length === 0) { @@ -573,7 +577,7 @@ /> { @@ -965,6 +969,14 @@ options={{ right: 'Auto-refresh' }} textClass="whitespace-nowrap" /> + {#if !isSelectingJobsToCancel} + + {/if}
@@ -979,6 +991,7 @@ showExternalJobs={!graphIsRunsChart} activeLabel={label} {isSelectingJobsToCancel} + {isBatch} bind:selectedIds bind:selectedWorkspace bind:lastFetchWentToEnd @@ -1012,9 +1025,7 @@ /> {/if} {:else if selectedIds.length > 1} -
There are {selectedIds.length} jobs selected. Choose 1 to see detailed information
+ {:else}
No job selected
{/if}