diff --git a/frontend/src/lib/components/apps/components/display/AppRecomputeAll.svelte b/frontend/src/lib/components/apps/components/display/AppRecomputeAll.svelte index 2b41c014e5..e356525cc9 100644 --- a/frontend/src/lib/components/apps/components/display/AppRecomputeAll.svelte +++ b/frontend/src/lib/components/apps/components/display/AppRecomputeAll.svelte @@ -46,12 +46,11 @@ ? resolvedConfig.defaultRefreshInterval * 1000 : parseInt(resolvedConfig.defaultRefreshInterval) * 1000 - if (newInterval !== $recomputeAllContext.interval) { + if (newInterval !== $recomputeAllContext.interval && newInterval) { $recomputeAllContext.setInter?.(newInterval) } } } - {#each Object.keys(components['recomputeallcomponent'].initialData.configuration) as key (key)} diff --git a/frontend/src/lib/components/apps/components/helpers/InitializeComponent.svelte b/frontend/src/lib/components/apps/components/helpers/InitializeComponent.svelte index f983857059..4bbfcfe1bc 100644 --- a/frontend/src/lib/components/apps/components/helpers/InitializeComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/InitializeComponent.svelte @@ -8,6 +8,7 @@ onMount(() => { if (!$initialized.initializedComponents.includes(id)) { $initialized.initializedComponents = [...$initialized.initializedComponents, id] + $initialized = { ...$initialized } } }) diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte index 83c08cbf1e..c2905f3b5d 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte @@ -543,7 +543,7 @@ } async function setResult(res: any, jobId: string | undefined) { - dispatch('resultSet') + dispatch('resultSet', res) const errors = getResultErrors(res) if (errors) { diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte index 038a3935fd..13b38d1085 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte @@ -67,7 +67,7 @@ export let id: string export let result: any = undefined - export let initializing: boolean = true + export let initializing: boolean | undefined = true export let loading: boolean = false export let extraQueryParams: Record = {} export let autoRefresh: boolean = true @@ -96,7 +96,7 @@ runnableComponent?.setArgs(value) } - const { staticExporter, noBackend, componentControl, runnableComponents } = + const { staticExporter, initialized, noBackend, componentControl, runnableComponents } = getContext('AppViewerContext') if (noBackend && componentInput?.type == 'runnable') { @@ -115,6 +115,14 @@ if (!(initializing && componentInput?.type === 'runnable' && isRunnableDefined(componentInput))) { initializing = false + } else { + initializing = + initializing == undefined && Object.keys($initialized?.runnableInitialized ?? {}).includes(id) + ? false + : undefined + if (result == undefined && !initializing) { + result = $initialized.runnableInitialized?.[id] + } } // We need to make sure that old apps have correct values. Triggerable (button, form, etc) have both autoRefresh and recomputeOnInputChanged set to false @@ -281,7 +289,15 @@ on:cancel on:recompute on:argsChanged - on:resultSet={() => (initializing = false)} + on:resultSet={(e) => { + const res = e.detail + if (initializing !== false) { + console.log('resultSet', id) + $initialized.runnableInitialized = { ...$initialized.runnableInitialized, [id]: res } + } + + initializing = false + }} on:success={(e) => { onSuccess(e.detail) handleSideEffect(true) diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index fcaf9af1db..c1048aa711 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -136,7 +136,11 @@ const worldStore = buildWorld(context) const previewTheme: Writable = writable(undefined) - const initialized = writable({ initialized: false, initializedComponents: [] }) + const initialized = writable({ + initialized: false, + initializedComponents: [], + runnableInitialized: {} + }) const panzoomActive = writable(false) $secondaryMenuRightStore.isOpen = false diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index ca1841c7b2..8a9bd984fc 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -126,7 +126,11 @@ setContext('AppViewerContext', { worldStore: worldStore, - initialized: writable({ initialized: false, initializedComponents: [] }), + initialized: writable({ + initialized: false, + initializedComponents: [], + runnableInitialized: {} + }), app: appStore, summary: writable(summary), selectedComponent, diff --git a/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte b/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte index 0531b1eb1c..24b33d7a05 100644 --- a/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte +++ b/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte @@ -13,8 +13,11 @@ let firstLoad = false let progressTimer: NodeJS.Timeout | undefined = undefined - $: !firstLoad && canInitializeAll($initialized?.initializedComponents, $app) && refresh() + $: !firstLoad && + canInitializeAll($initialized?.initializedComponents, $app) && + refresh('all initialized') + // $: console.log('canInitializeAll', firstLoad, $initialized?.initializedComponents) function canInitializeAll(initialized: string[] | undefined, app: App) { // console.log( // 'canInitializeAll', @@ -55,7 +58,7 @@ onMount(() => { if (appEditorContext) { - appEditorContext.refreshComponents.set(refresh) + appEditorContext.refreshComponents.set(() => refresh('onClick global')) } document.addEventListener('visibilitychange', visChange) // setTimeout(() => refresh(), 1000) @@ -66,7 +69,7 @@ } }) - function onClick(stopAfterClear = false) { + function onClick(stopAfterClear: boolean, source: string) { if (timeout) { clearInterval(timeout) timeout = undefined @@ -77,11 +80,13 @@ } if (stopAfterClear) return } - refresh() + if (firstLoad) { + refresh('onClick ' + source) + } if ($recomputeAllContext.interval) { shouldRefresh = true - timeout = setInterval(refresh, $recomputeAllContext.interval) + timeout = setInterval(() => refresh('onClick interval'), $recomputeAllContext.interval) startProgress() } } @@ -102,15 +107,16 @@ }, 100) } - function setInter(inter: number | undefined) { + function setInter(inter: number | undefined, source: string) { $recomputeAllContext.interval = inter - onClick(!inter) + onClick(!inter, 'setInter ' + source) } let refreshing: string[] = [] - function refresh() { + function refresh(reason: string) { let isFirstLoad = false - if (!firstLoad) { + if (!firstLoad && reason == 'all initialized') { + console.log('refresh all first load', reason) $initialized.initialized = true firstLoad = true isFirstLoad = true @@ -118,7 +124,7 @@ $recomputeAllContext.loading = true $recomputeAllContext.progress = 100 - console.log('refresh all') + console.log('refresh all', reason) refreshing = [] const promises = Object.keys($runnableComponents) .flatMap((id) => { @@ -164,28 +170,28 @@ if (progressTimer) clearInterval(progressTimer) } } else if (shouldRefresh) { - timeout = setInterval(refresh, $recomputeAllContext.interval) + timeout = setInterval(() => refresh('onClick interval'), $recomputeAllContext.interval) startProgress() } } onMount(() => { $recomputeAllContext = { - onClick, - setInter + onClick: () => onClick(false, 'allContext'), + setInter: (n) => setInter(n, 'all context') } }) onClick()} + on:click={() => onClick(false, 'button')} interval={$recomputeAllContext.interval} {refreshing} componentNumber={$recomputeAllContext.componentNumber ?? 0} loading={$recomputeAllContext.loading} progress={$recomputeAllContext.progress} on:setInter={(e) => { - setInter(e.detail) - onClick(false) + setInter(e.detail, 'button setInter') + onClick(false, 'button setInter') }} /> diff --git a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte index 9973ebbcbf..71e3b3cf43 100644 --- a/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte +++ b/frontend/src/lib/components/apps/editor/component/ComponentInner.svelte @@ -76,9 +76,9 @@ export let component: AppComponent export let render: boolean export let componentContainerHeight: number - export let initializing: boolean | undefined = undefined export let errorHandledByComponent: boolean export let inlineEditorOpened: boolean + export let initializing: boolean | undefined = undefined {#if component.type === 'displaycomponent'} diff --git a/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte b/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte index 0a7c79fd1b..6602dc5d18 100644 --- a/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte +++ b/frontend/src/lib/components/apps/editor/component/ComponentRendered.svelte @@ -21,6 +21,9 @@ export let moveMode: string | undefined = undefined export let componentDraggedId: string | undefined = undefined export let render: boolean = false + + let initializing: boolean | undefined + const { mode, app, hoverStore, connectingInput } = getContext('AppViewerContext') @@ -31,8 +34,6 @@ $: ismoving = movingcomponents != undefined && $mode == 'dnd' && $movingcomponents?.includes(component.id) - let initializing: boolean | undefined = undefined - let errorHandledByComponent: boolean = false let componentContainerHeight: number = 0 let componentContainerWidth: number = 0 diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index c20fe5e561..be847aa07d 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -200,6 +200,7 @@ export type AppViewerContext = { initialized: Writable<{ initializedComponents: string[] initialized: boolean + runnableInitialized: Record }> selectedComponent: Writable mode: Writable