Files
windmill/frontend/src/lib/components/ModulePreviewResultViewer.svelte
Guilhem dc5e764d9d fix(frontend): load all flow jobs on page load (#6029)
* Add initial loading status for flow steps

* Add loading state

* reset module initial if test flow initial is reset

* ensure all jobs are loaded before unmouning the preview

* only use loadIndividualStepsStates when no history

* Revert "only use loadIndividualStepsStates when no history"

This reverts commit bfc37b7e7f.

* wait for all flow child to be loaded befor loading flowSteps

* Revert "wait for all flow child to be loaded befor loading flowSteps"

This reverts commit 7da81756b0.

* Load individual steps on flow load

* Add loading status in graph

* Use a context to manage initial state and save to local storage

* Handle new flow

* nit

* nit

* nit

* Prevent loading step when mock is enabled

* Load jobs based on last flow run

* Revert "Load jobs based on last flow run"

This reverts commit 212cb7f785.

* Change step initial display status

* nit

* Add parallelisation limit on step job loading
2025-06-25 13:07:49 +02:00

125 lines
3.4 KiB
Svelte

<script lang="ts">
import LogViewer from './LogViewer.svelte'
import JobProgressBar from '$lib/components/jobs/JobProgressBar.svelte'
import ScriptFix from './copilot/ScriptFix.svelte'
import type DiffEditor from './DiffEditor.svelte'
import type Editor from './Editor.svelte'
import type { Script, Job, FlowModule } from '$lib/gen'
import OutputPickerInner from '$lib/components/flows/propPicker/OutputPickerInner.svelte'
import { Pane, Splitpanes } from 'svelte-splitpanes'
import type { FlowEditorContext } from './flows/types'
import { getContext } from 'svelte'
import { getStringError } from './copilot/chat/utils'
interface Props {
lang: Script['language']
editor: Editor | undefined
diffEditor: DiffEditor | undefined
loopStatus?: { type: 'inside' | 'self'; flow: 'forloopflow' | 'whileloopflow' } | undefined
lastJob?: Job | undefined
scriptProgress?: number | undefined
testJob?: Job | undefined
mod: FlowModule
testIsLoading?: boolean
disableMock?: boolean
disableHistory?: boolean
onUpdateMock?: (mock: { enabled: boolean; return_value?: unknown }) => void
loadingHistory?: boolean
}
let {
lang,
editor,
diffEditor,
loopStatus = undefined,
lastJob = undefined,
scriptProgress = $bindable(undefined),
testJob = undefined,
mod,
testIsLoading = false,
disableMock = false,
disableHistory = false,
onUpdateMock,
loadingHistory = false
}: Props = $props()
const { testSteps } = getContext<FlowEditorContext>('FlowEditorContext')
let selectedJob: Job | undefined = $state(undefined)
let fetchingLastJob = false
let preview: 'mock' | 'job' | undefined = $state(undefined)
let jobProgressReset: () => void = $state(() => {})
let nlastJob = $derived.by(() => {
if (testJob && testJob.type === 'CompletedJob') {
return { ...testJob, preview: true }
}
if (lastJob) {
return { ...lastJob, preview: false }
}
return undefined
})
let forceJson = $state(false)
</script>
<Splitpanes horizontal>
<Pane size={50} minSize={10} class="text-sm text-tertiary">
{#if scriptProgress}
<JobProgressBar
job={testJob}
bind:scriptProgress
bind:reset={jobProgressReset}
compact={true}
/>
{/if}
<OutputPickerInner
lastJob={nlastJob}
fullResult
moduleId={mod.id}
closeOnOutsideClick={true}
getLogs
{onUpdateMock}
mock={mod.mock}
bind:forceJson
bind:selectedJob
isLoading={(testIsLoading && !scriptProgress) || fetchingLastJob || loadingHistory}
bind:preview
path={`path` in mod.value ? mod.value.path : ''}
{loopStatus}
{disableMock}
{disableHistory}
>
{#snippet copilot_fix()}
{#if lang && editor && diffEditor && testSteps.getStepArgs(mod.id) && selectedJob?.type === 'CompletedJob' && !selectedJob.success && getStringError(selectedJob.result)}
<ScriptFix {lang} />
{/if}
{/snippet}
</OutputPickerInner>
</Pane>
<Pane size={50} minSize={10}>
{#if (mod.mock?.enabled && preview != 'job') || preview == 'mock'}
<LogViewer
small
content={undefined}
isLoading={false}
tag={undefined}
customEmptyMessage="Using pinned data"
/>
{:else}
<LogViewer
small
jobId={selectedJob?.id}
duration={selectedJob?.['duration_ms']}
mem={selectedJob?.['mem_peak']}
content={selectedJob?.logs}
isLoading={(testIsLoading && selectedJob?.['running'] == false) ||
fetchingLastJob ||
loadingHistory}
tag={selectedJob?.tag}
/>
{/if}
</Pane>
</Splitpanes>