diff --git a/frontend/package-lock.json b/frontend/package-lock.json index bf32b04a43..ca3e1b96f2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -24,6 +24,7 @@ "monaco-yaml": "^4.0.2", "svelte-autosize": "^1.0.1", "svelte-chartjs": "^3.1.0", + "svelte-portal": "^2.2.0", "svelte-select": "^5.0.2", "vscode-ws-jsonrpc": "^2.0.1" }, @@ -6256,6 +6257,11 @@ "svelte": ">=3" } }, + "node_modules/svelte-portal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/svelte-portal/-/svelte-portal-2.2.0.tgz", + "integrity": "sha512-jhtZWtD6cUE2nMw46dJ5VXWYiqnER+JH+V/BmNBQ5fNP/YdsJCpJi+DemUy9msklqGb0f+wLhJPBtKHLWQvzjg==" + }, "node_modules/svelte-preprocess": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.0.tgz", @@ -11548,6 +11554,11 @@ "dev": true, "requires": {} }, + "svelte-portal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/svelte-portal/-/svelte-portal-2.2.0.tgz", + "integrity": "sha512-jhtZWtD6cUE2nMw46dJ5VXWYiqnER+JH+V/BmNBQ5fNP/YdsJCpJi+DemUy9msklqGb0f+wLhJPBtKHLWQvzjg==" + }, "svelte-preprocess": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index dd5bc7b8f4..910f271e1f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,8 +21,8 @@ "@sveltejs/package": "^1.0.1", "@tailwindcss/forms": "^0.5.3", "@tailwindcss/typography": "^0.5.8", - "@types/vscode": "~1.74.0", "@types/node": "^18.11.18", + "@types/vscode": "~1.74.0", "@typescript-eslint/eslint-plugin": "^5.46.1", "@typescript-eslint/parser": "^5.48.0", "@windmill-labs/svelvet": "^4.0.20", @@ -77,6 +77,7 @@ "monaco-yaml": "^4.0.2", "svelte-autosize": "^1.0.1", "svelte-chartjs": "^3.1.0", + "svelte-portal": "^2.2.0", "svelte-select": "^5.0.2", "vscode-ws-jsonrpc": "^2.0.1" }, diff --git a/frontend/src/lib/components/apps/components/HiddenComponent.svelte b/frontend/src/lib/components/apps/components/HiddenComponent.svelte new file mode 100644 index 0000000000..ab76911659 --- /dev/null +++ b/frontend/src/lib/components/apps/components/HiddenComponent.svelte @@ -0,0 +1,28 @@ + + + + + diff --git a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte index 262961aa65..4908997a94 100644 --- a/frontend/src/lib/components/apps/components/buttons/AppButton.svelte +++ b/frontend/src/lib/components/apps/components/buttons/AppButton.svelte @@ -86,11 +86,11 @@ e?.stopPropagation() window.dispatchEvent(new Event('pointerup')) }} - on:click={(e) => { + on:click={async (e) => { e?.stopPropagation() e?.preventDefault() ownClick = true - runnableComponent?.runComponent() + await runnableComponent?.runComponent() if (recomputeIds) { recomputeIds.forEach((id) => { diff --git a/frontend/src/lib/components/apps/components/form/AppFormButton.svelte b/frontend/src/lib/components/apps/components/form/AppFormButton.svelte new file mode 100644 index 0000000000..30166c49a2 --- /dev/null +++ b/frontend/src/lib/components/apps/components/form/AppFormButton.svelte @@ -0,0 +1,159 @@ + + + + + + + + + { + open = false + }} + on:confirmed={() => { + open = false + }} + > + + + + {#if noInputs} + + Run forms are associated with a runnable that has user inputs. + + Once a script or flow is chosen, set some Runnable Inputs to + + User Input + + + + {/if} + + + { + e?.stopPropagation() + window.dispatchEvent(new Event('pointerup')) + }} + on:click={async () => { + await runnableComponent?.runComponent() + + if (recomputeIds) { + recomputeIds.forEach((id) => { + $runnableComponents[id]?.() + }) + } + + open = false + }} + size="xs" + color="dark" + > + Submit + + + + + + + + + {#if errorsMessage} + {errorsMessage} + {/if} + { + open = true + }} + > + {labelValue} + + diff --git a/frontend/src/lib/components/apps/editor/ComponentEditor.svelte b/frontend/src/lib/components/apps/editor/ComponentEditor.svelte index ee3ed634f8..9ea8e17bf4 100644 --- a/frontend/src/lib/components/apps/editor/ComponentEditor.svelte +++ b/frontend/src/lib/components/apps/editor/ComponentEditor.svelte @@ -19,6 +19,7 @@ import AppTimeseries from '../components/dataDisplay/AppTimeseries.svelte' import AppHtml from '../components/dataDisplay/AppHtml.svelte' import AppSliderInputs from '../components/numberInputs/AppSliderInputs.svelte' + import AppFormButton from '../components/form/AppFormButton.svelte' import VegaLiteHtml from '../components/dataDisplay/VegaLiteHtml.svelte' export let component: AppComponent @@ -124,6 +125,12 @@ bind:componentInput={component.componentInput} bind:staticOutputs={$staticOutputs[component.id]} /> + {:else if component.type === 'formbuttoncomponent'} + {:else if component.type === 'checkboxcomponent'} {:else if component.type === 'textinputcomponent'} diff --git a/frontend/src/lib/components/apps/editor/GridEditor.svelte b/frontend/src/lib/components/apps/editor/GridEditor.svelte index f6dfab6164..1a46fd32c3 100644 --- a/frontend/src/lib/components/apps/editor/GridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/GridEditor.svelte @@ -8,6 +8,7 @@ import RecomputeAllComponents from './RecomputeAllComponents.svelte' import type { Policy } from '$lib/gen' + import HiddenComponent from '../components/HiddenComponent.svelte' export let policy: Policy @@ -176,6 +177,18 @@ +{#each $app.hiddenInlineScripts as script, index} + {#if script} + + {/if} +{/each} +