mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-23 00:00:33 +00:00
5d79f33590
* Remove $$props.field usage * Rename slots to ensure no hyphen * _props * _trigger * OnSelectedIteration type correct capitalization * rename _content * Remove afterUpdate * Migrate everything to svelte 5 * array bind * Fix popover * type never * nit fixes * Fixed many trivial errors * onClick * Fix errors * use let: * nit typing * fix: wrap state_referenced_locally vars with untrack() Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add untrack import * Fix all syntax errors due to untrack migration * Fix undefined errors * Fix more undefined errors * untrack(() => initialOpen) * svelte-ignore * Fix state_descriptors_fixed error in Chart.svelte Use $state.snapshot() to pass plain copies of data/options to Chart.js instead of $state proxies. Chart.js's listenArrayEvents tries to define property descriptors on data arrays, which Svelte 5 proxies reject. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * nit typing * Merge issue * Fix "path is not set" error in resource picker / editor * Fix InputTransformForm error when rerunning some flows * fix npm run check --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
72 lines
1.7 KiB
Svelte
72 lines
1.7 KiB
Svelte
<script lang="ts">
|
|
import { run } from 'svelte/legacy';
|
|
|
|
import { type Job } from '$lib/gen'
|
|
import { isScriptPreview } from '$lib/utils'
|
|
import { onDestroy } from 'svelte'
|
|
|
|
|
|
|
|
|
|
|
|
interface Props {
|
|
job?: Job | undefined;
|
|
/** Execution duration of current active job (in ms) */
|
|
executionDuration?: number;
|
|
/** Is current job running more than specified value in `longDefinition` seconds */
|
|
longRunning?: boolean;
|
|
/** What do we count as "long" (in ms)*/
|
|
longDefinition?: number;
|
|
/** How often component updates execution duration (in ms)
|
|
* Higher value -> more efficient component is, less accuracy it has
|
|
* Lower value -> less efficient component is, more accuracy it has
|
|
*/
|
|
updateResolution?: number;
|
|
}
|
|
|
|
let {
|
|
job = undefined,
|
|
executionDuration = $bindable(0),
|
|
longRunning = $bindable(false),
|
|
longDefinition = 30_000,
|
|
updateResolution = 5_000
|
|
}: Props = $props();
|
|
|
|
let startedAt: number | undefined = undefined
|
|
let busy: boolean = $state(false)
|
|
let interval: number | undefined
|
|
|
|
function start(job: Job) {
|
|
busy = true
|
|
startedAt = new Date(job?.started_at ?? '').getTime()
|
|
interval = setInterval(updateDuration, updateResolution)
|
|
}
|
|
|
|
function updateDuration() {
|
|
if (job?.type == 'CompletedJob') {
|
|
clearInterval(interval)
|
|
return
|
|
}
|
|
|
|
if (startedAt) executionDuration = Date.now() - startedAt
|
|
|
|
// Detect long running
|
|
if (executionDuration >= longDefinition) longRunning = true
|
|
}
|
|
|
|
onDestroy(() => {
|
|
// Clear the interval when the component is destroyed
|
|
clearInterval(interval)
|
|
})
|
|
// Detect when execution of job started
|
|
run(() => {
|
|
if (
|
|
!busy &&
|
|
job &&
|
|
'running' in job &&
|
|
(job.job_kind == 'script' || isScriptPreview(job?.job_kind))
|
|
)
|
|
start(job)
|
|
});
|
|
</script>
|