From 03a4f2cfa114fd0f0fe770c19e45ea6dc8b1f09d Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 13 Mar 2023 23:38:14 +0100 Subject: [PATCH] improve refresh and background script behavior --- .../apps/components/buttons/AppButton.svelte | 7 +-- .../apps/components/buttons/AppForm.svelte | 10 +-- .../components/buttons/AppFormButton.svelte | 7 +-- .../components/helpers/HiddenComponent.svelte | 3 + .../apps/components/helpers/InputValue.svelte | 8 ++- .../components/helpers/RefreshButton.svelte | 4 +- .../helpers/RunnableComponent.svelte | 41 ++++++++---- .../components/helpers/RunnableWrapper.svelte | 2 + .../apps/components/helpers/eval.ts | 22 ++++++- .../components/apps/editor/GridEditor.svelte | 1 + .../apps/editor/RecomputeAllComponents.svelte | 8 ++- .../apps/editor/SettingsPanel.svelte | 31 ++++++--- .../editor/settingsPanel/Recompute.svelte | 1 + frontend/src/lib/components/apps/types.ts | 1 + frontend/src/lib/components/apps/utils.ts | 2 +- .../(logged)/apps/get/[...path]/+page.svelte | 63 ++++++++++--------- .../[workspace]/[...secret]/+page.svelte | 44 ++++++------- 17 files changed, 153 insertions(+), 102 deletions(-) diff --git a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte index ff07a5523b..0c70232808 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte @@ -26,7 +26,7 @@ export const staticOutputs: string[] = ['loading', 'result'] - const { runnableComponents, worldStore, app } = getContext('AppViewerContext') + const { worldStore, app } = getContext('AppViewerContext') let labelValue: string let color: ButtonType.Color @@ -109,10 +109,6 @@ } else { await runnableComponent?.runComponent() } - - if (recomputeIds) { - await Promise.all(recomputeIds.map((id) => $runnableComponents?.[id]?.())) - } } @@ -136,6 +132,7 @@ ('AppViewerContext') + const { app, worldStore, stateId } = getContext('AppViewerContext') let labelValue: string = 'Default label' let color: ButtonType.Color @@ -62,6 +61,7 @@ { runnableComponent?.runComponent() - - if (recomputeIds) { - recomputeIds.forEach((id) => { - $runnableComponents[id]?.() - }) - } }} {size} {color} diff --git a/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte index 3e03bbe555..8d1bf8439b 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppFormButton.svelte @@ -94,6 +94,7 @@ }} > { await runnableComponent?.runComponent() - if (recomputeIds) { - recomputeIds.forEach((id) => { - $runnableComponents[id]?.() - }) - } - open = false }} size="xs" diff --git a/frontend/src/lib/components/apps/components/helpers/HiddenComponent.svelte b/frontend/src/lib/components/apps/components/helpers/HiddenComponent.svelte index 1dd4f5ec33..ee46b7e9f1 100644 --- a/frontend/src/lib/components/apps/components/helpers/HiddenComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/HiddenComponent.svelte @@ -12,6 +12,7 @@ export let name: string export let inlineScript: InlineScript | undefined export let fields: Record + export let autoRefresh: boolean = false let result: any = undefined @@ -22,6 +23,7 @@ render={false} {id} {fields} + {autoRefresh} bind:result runnable={{ name, @@ -29,6 +31,7 @@ type: 'runnableByName' }} wrapperClass="hidden" + recomputable > diff --git a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte index 429e627172..adc3b4e21f 100644 --- a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte +++ b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte @@ -25,7 +25,7 @@ } } - const { worldStore, state } = getContext('AppViewerContext') + const { worldStore, state, mode } = getContext('AppViewerContext') $: stateId = $worldStore?.state @@ -70,7 +70,8 @@ input.expr, computeGlobalContext($worldStore, id, extraContext), true, - $state + $state, + $mode == 'dnd' ) error = '' return r @@ -87,7 +88,8 @@ '`' + input.eval + '`', computeGlobalContext($worldStore, id, extraContext), true, - $state + $state, + $mode == 'dnd' ) error = '' return r diff --git a/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte b/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte index cef375d9a0..de979fea43 100644 --- a/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RefreshButton.svelte @@ -1,7 +1,5 @@ diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte index e542791deb..3050627d56 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableWrapper.svelte @@ -21,6 +21,7 @@ export let goto: string | undefined = undefined export let gotoNewTab: boolean | undefined = undefined export let render: boolean + export let recomputeIds: string[] = [] const { staticExporter, noBackend } = getContext('AppViewerContext') @@ -44,6 +45,7 @@ {:else if componentInput.type === 'runnable' && isRunnableDefined()} { - await goto(x) + return await evaluator(context, state, async (x, newTab) => { + if (newTab || editor) { + if (!newTab) { + sendUserToast( + 'In editor mode, `goto` opens a new tab to prevent losing your work. To test the redirection , use the preview mode.' + ) + } + window.open(x, '_blank') + } else { + await goto(x) + } }) } diff --git a/frontend/src/lib/components/apps/editor/GridEditor.svelte b/frontend/src/lib/components/apps/editor/GridEditor.svelte index 9b259d0baa..d0708c7641 100644 --- a/frontend/src/lib/components/apps/editor/GridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/GridEditor.svelte @@ -240,6 +240,7 @@ inlineScript={script.inlineScript} name={script.name} fields={script.fields} + autoRefresh={script.autoRefresh ?? false} bind:staticOutputs={$staticOutputs[`bg_${index}`]} /> {/if} diff --git a/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte b/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte index b87c49e738..a7cbe0d053 100644 --- a/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte +++ b/frontend/src/lib/components/apps/editor/RecomputeAllComponents.svelte @@ -5,7 +5,7 @@ import Button from '../../common/button/Button.svelte' import type { AppViewerContext } from '../types' - const { runnableComponents } = getContext('AppViewerContext') + const { runnableComponents, app } = getContext('AppViewerContext') let loading: boolean = false let timeout: NodeJS.Timer | undefined = undefined let interval: number | undefined = undefined @@ -36,6 +36,12 @@ loading = true Promise.all( Object.keys($runnableComponents).map((id) => { + if (id.startsWith('bg_')) { + let index = parseInt(id.split('_')[1]) + if (!$app.hiddenInlineScripts[index]?.autoRefresh) { + return + } + } return $runnableComponents?.[id]?.() }) ).finally(() => { diff --git a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte index 0222cb9735..6e164ca18f 100644 --- a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte +++ b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte @@ -1,4 +1,5 @@ {#if app} -
- - {#if can_write} -
- -
- {/if} -
+ {#key app} +
+ + {#if can_write} +
+ +
+ {/if} +
+ {/key} {:else} {/if} diff --git a/frontend/src/routes/public/[workspace]/[...secret]/+page.svelte b/frontend/src/routes/public/[workspace]/[...secret]/+page.svelte index 0041d99353..7de84ac01f 100644 --- a/frontend/src/routes/public/[workspace]/[...secret]/+page.svelte +++ b/frontend/src/routes/public/[workspace]/[...secret]/+page.svelte @@ -71,27 +71,29 @@ {:else if app} -
- -
+ {#key app} +
+ +
+ {/key} {:else} {/if}