From 806a7593f0a2606b02da20e704793fce6abbba55 Mon Sep 17 00:00:00 2001 From: Faton Ramadani Date: Fri, 17 Mar 2023 20:51:00 +0100 Subject: [PATCH] feat(frontend): App component triggers (#1303) * feat(frontend): add trigger list * feat(frontend): add trigger list * feat(frontend): add support for refreshOn * feat(frontend): add support for refreshOn * feat(frontend): rework * feat(frontend): rework * feat(frontend): code cleanup --- .../apps/components/helpers/InputValue.svelte | 2 - .../components/apps/editor/AppEditor.svelte | 2 +- .../apps/editor/SettingsPanel.svelte | 11 ++ .../lib/components/apps/editor/appUtils.ts | 16 +++ .../InlineScriptEditor.svelte | 11 +- .../settingsPanel/SelectedRunnable.svelte | 4 + .../BackgroundScriptTriggerList.svelte | 100 +++++++++++++++++ .../triggerLists/ComponentTriggerList.svelte | 30 +++++ .../triggerLists/TriggerBadgesList.svelte | 106 ++++++++++++++++++ .../triggerLists/triggerListUtils.ts | 23 ++++ 10 files changed, 292 insertions(+), 13 deletions(-) create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/ComponentTriggerList.svelte create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/TriggerBadgesList.svelte create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/triggerListUtils.ts diff --git a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte index 1940344c45..7a7e74a1c8 100644 --- a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte +++ b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte @@ -125,8 +125,6 @@ function onValueChange(newValue: any): void { if (lastInput.type === 'connected' && newValue !== undefined && newValue !== null) { - console.log(newValue, id, lastInput) - const { connection } = lastInput if (!connection) { // No connection diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index 205fb53774..89f4159c9c 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -248,7 +248,7 @@ CSS -
+
{#if $selectedComponent !== undefined} diff --git a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte index 6e164ca18f..9ddddd2920 100644 --- a/frontend/src/lib/components/apps/editor/SettingsPanel.svelte +++ b/frontend/src/lib/components/apps/editor/SettingsPanel.svelte @@ -5,6 +5,7 @@ import GridPanel from './GridPanel.svelte' import PanelSection from './settingsPanel/common/PanelSection.svelte' import InputsSpecsEditor from './settingsPanel/InputsSpecsEditor.svelte' + import BackgroundScriptTriggerList from './settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte' const { selectedComponent, app, stateId } = getContext('AppViewerContext') @@ -29,6 +30,16 @@ /> +
+ {#if script.inlineScript} + + {/if} +
{#if Object.keys(script.fields).length > 0} {#key $stateId} diff --git a/frontend/src/lib/components/apps/editor/appUtils.ts b/frontend/src/lib/components/apps/editor/appUtils.ts index e3dd9ec632..e459c47351 100644 --- a/frontend/src/lib/components/apps/editor/appUtils.ts +++ b/frontend/src/lib/components/apps/editor/appUtils.ts @@ -55,6 +55,22 @@ export function getNextGridItemId(app: App): string { return id } +export function getAllRecomputeIdsForComponent(app: App, id: string) { + const items = allItems(app.grid, app.subgrids) + + const recomputedBy: string[] = [] + + items.forEach((item) => { + if (item.data.type === 'buttoncomponent') { + if (item.data.recomputeIds?.includes(id)) { + recomputedBy.push(item.id) + } + } + }) + + return recomputedBy +} + export function createNewGridItem(grid: GridItem[], id: string, data: AppComponent): GridItem { const newComponent = { resizable: true, diff --git a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte index 88feae9400..8b64cfa158 100644 --- a/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +++ b/frontend/src/lib/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte @@ -3,7 +3,7 @@ import type { Preview } from '$lib/gen' import { createEventDispatcher, getContext, onMount } from 'svelte' import type { AppViewerContext, InlineScript } from '../../types' - import { CornerDownLeft, Maximize2, Plus, Trash2, X } from 'lucide-svelte' + import { CornerDownLeft, Maximize2, Trash2 } from 'lucide-svelte' import InlineScriptEditorDrawer from './InlineScriptEditorDrawer.svelte' import { inferArgs } from '$lib/infer' import type { Schema } from '$lib/common' @@ -206,15 +206,6 @@
- {#if inlineScript.language == 'frontend'} -
List of outputs to listen to (e.g 'a.result b.result'):
- {/if}
{#if inlineScript.language != 'frontend'} ('AppViewerContext') @@ -66,6 +67,9 @@
+{#if appInput.runnable?.type === 'runnableByName' && appInput.runnable.inlineScript} + +{/if} {#if appInput.runnable?.type === 'runnableByName' && !appInput.runnable.inlineScript} Please configure the language in the inline script panel diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte new file mode 100644 index 0000000000..0dc5338ce6 --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/BackgroundScriptTriggerList.svelte @@ -0,0 +1,100 @@ + + + `${x.id} - ${x.key}`) ?? undefined + : undefined} + onLoad={autoRefresh} + on:delete={(e) => { + const index = e.detail.index + if (inlineScript) { + inlineScript.refreshOn?.splice(index, 1) + } + + inlineScript = JSON.parse(JSON.stringify(inlineScript)) + }} +> + {#if inlineScript?.language === 'frontend'} + + {/if} + diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/ComponentTriggerList.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/ComponentTriggerList.svelte new file mode 100644 index 0000000000..1b32bfd570 --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/ComponentTriggerList.svelte @@ -0,0 +1,30 @@ + + + diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/TriggerBadgesList.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/TriggerBadgesList.svelte new file mode 100644 index 0000000000..33bb30f40f --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/TriggerBadgesList.svelte @@ -0,0 +1,106 @@ + + +
+ {#if recomputedBadges.length === 0 && !onLoad && !onClick && inputDependencies?.length === 0 && !frontendDependencies} +

+ This script has no triggers. It will never run. +

+ {:else} +
Triggered by
+ + {#if onLoad || onClick} +
+
Event
+
+ {#if onLoad} + On load + {/if} + {#if onClick} + On click + {/if} +
+
+ {/if} + {#if inputDependencies.length > 0} +
+
+
Values change
+
+
+ {#each inputDependencies as label, index} + + {label} + + {/each} +
+
+ {/if} + + {#if recomputedBadges?.length > 0} +
+
Success of
+
+ {#each recomputedBadges as badge} + {badge} + {/each} +
+
+ {/if} + {/if} + {#if frontendDependencies} +
+
+
Values change (Frontend)
+ +
+
+ {#each frontendDependencies as label, index} + + {label} + + + {/each} +
+
+ {/if} +
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/triggerListUtils.ts b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/triggerListUtils.ts new file mode 100644 index 0000000000..8b64dfe49a --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/triggerLists/triggerListUtils.ts @@ -0,0 +1,23 @@ +import type { + StaticAppInput, + ConnectedAppInput, + RowAppInput, + UserAppInput +} from '$lib/components/apps/inputType' + +export function getDependencies( + fields: + | Record + | undefined +): string[] { + let dependencies: string[] = [] + + if (!fields) return dependencies + + Object.values(fields).forEach((field) => { + if (field.type === 'connected' && dependencies && field.connection) { + dependencies.push(`${field.connection.componentId} - ${field.connection.path}`) + } + }) + return dependencies +}