From 929c75924703012d6c83bb164561d890bbec2fe6 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 12 Mar 2025 16:47:26 +0000 Subject: [PATCH 01/21] wip --- .../SetupPanel/AutomationBlockSetup.svelte | 1 + .../SetupPanel/RowSelectorTypes.svelte | 1 + .../common/CodeEditor/CodeEditor.svelte | 18 +++++++++++++++--- .../common/bindings/BindingPanel.svelte | 2 ++ .../common/bindings/CodeEditorField.svelte | 1 + packages/pro | 2 +- packages/types/src/api/web/ai.ts | 4 ++++ 7 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index eb8cdd27e3..194add5975 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -1059,6 +1059,7 @@ inputData[key] = e.detail }} completions={stepCompletions} + {bindings} mode={codeMode} autocompleteEnabled={codeMode !== EditorModes.JS} bind:getCaretPosition diff --git a/packages/builder/src/components/automation/SetupPanel/RowSelectorTypes.svelte b/packages/builder/src/components/automation/SetupPanel/RowSelectorTypes.svelte index aefbf02303..3282f89f2d 100644 --- a/packages/builder/src/components/automation/SetupPanel/RowSelectorTypes.svelte +++ b/packages/builder/src/components/automation/SetupPanel/RowSelectorTypes.svelte @@ -152,6 +152,7 @@
{ onChange({ row: { diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index b5b2736159..03adde1438 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -59,7 +59,11 @@ import { javascript } from "@codemirror/lang-javascript" import { EditorModes } from "./" import { themeStore } from "@/stores/portal" - import { FeatureFlag, type EditorMode } from "@budibase/types" + import { + type EnrichedBinding, + FeatureFlag, + type EditorMode, + } from "@budibase/types" import { tooltips } from "@codemirror/view" import type { BindingCompletion, CodeValidator } from "@/types" import { validateHbsTemplate } from "./validator/hbs" @@ -80,6 +84,7 @@ export let readonly = false export let readonlyLineNumbers = false export let dropdown = DropdownPosition.Relative + export let bindings: EnrichedBinding[] = [] const dispatch = createEventDispatcher() @@ -100,7 +105,8 @@ let promptInput: TextArea $: aiGenEnabled = featureFlag.isEnabled(FeatureFlag.AI_JS_GENERATION) && - mode.name === "javascript" + mode.name === "javascript" && + !readonly $: { if (autofocus && isEditorInitialised) { @@ -165,7 +171,7 @@ popoverWidth = 30 let code = "" try { - const resp = await API.generateJs({ prompt }) + const resp = await API.generateJs({ prompt, bindings }) code = resp.code } catch (e) { console.error(e) @@ -189,6 +195,7 @@ suggestedCode = null previousContents = null resetPopover() + dispatch("change", editor.state.doc.toString()) } const rejectSuggestion = () => { @@ -513,6 +520,11 @@ bind:this={popover} minWidth={popoverWidth} anchor={popoverAnchor} + on:close={() => { + if (suggestedCode) { + acceptSuggestion() + } + }} align="left-outside" > {#if promptLoading} diff --git a/packages/builder/src/components/common/bindings/BindingPanel.svelte b/packages/builder/src/components/common/bindings/BindingPanel.svelte index 8d5a9321ea..3d9d77509e 100644 --- a/packages/builder/src/components/common/bindings/BindingPanel.svelte +++ b/packages/builder/src/components/common/bindings/BindingPanel.svelte @@ -359,6 +359,7 @@ bind:getCaretPosition bind:insertAtPos {completions} + {bindings} {validations} autofocus={autofocusEditor} placeholder={placeholder || @@ -372,6 +373,7 @@ value={jsValue ? decodeJSBinding(jsValue) : ""} on:change={onChangeJSValue} {completions} + {bindings} {validations} mode={EditorModes.JS} bind:getCaretPosition diff --git a/packages/builder/src/components/common/bindings/CodeEditorField.svelte b/packages/builder/src/components/common/bindings/CodeEditorField.svelte index 3a7b388f07..3f2c7570a9 100644 --- a/packages/builder/src/components/common/bindings/CodeEditorField.svelte +++ b/packages/builder/src/components/common/bindings/CodeEditorField.svelte @@ -144,6 +144,7 @@ on:change={onChangeJSValue} on:blur completions={jsCompletions} + {bindings} mode={EditorModes.JS} bind:getCaretPosition bind:insertAtPos diff --git a/packages/pro b/packages/pro index a44aec4935..0a71c9147a 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit a44aec4935713412feaaddb50b5075a5e748c575 +Subproject commit 0a71c9147ab8ac184013e6ce197b689e160ff663 diff --git a/packages/types/src/api/web/ai.ts b/packages/types/src/api/web/ai.ts index b97b45c5ee..3962422b77 100644 --- a/packages/types/src/api/web/ai.ts +++ b/packages/types/src/api/web/ai.ts @@ -1,6 +1,10 @@ +import { EnrichedBinding } from "../../ui" + export interface GenerateJsRequest { prompt: string + bindings?: EnrichedBinding[] } + export interface GenerateJsResponse { code: string } From df5e5d909b249f410549950fc82af2b6d4080b38 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 12 Mar 2025 16:50:34 +0000 Subject: [PATCH 02/21] Dispatch blur as well as change. --- .../builder/src/components/common/CodeEditor/CodeEditor.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index 03adde1438..78c6179ef9 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -196,6 +196,7 @@ previousContents = null resetPopover() dispatch("change", editor.state.doc.toString()) + dispatch("blur", editor.state.doc.toString()) } const rejectSuggestion = () => { From 2399d398bc4e56b0914372a21849f5632c9a0039 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Thu, 13 Mar 2025 16:25:24 +0000 Subject: [PATCH 03/21] Update pro reference. --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 0a71c9147a..e956fa4a0d 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 0a71c9147ab8ac184013e6ce197b689e160ff663 +Subproject commit e956fa4a0d78570c8507464345a064f4d9964884 From abea3d6ac2432dcca986cb9a5ccfce3c5596e57b Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Thu, 13 Mar 2025 16:38:32 +0000 Subject: [PATCH 04/21] "Fix" automation saving after AI prompt. --- packages/bbui/src/Form/Core/TextArea.svelte | 16 ++++++++++++---- .../common/CodeEditor/CodeEditor.svelte | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/bbui/src/Form/Core/TextArea.svelte b/packages/bbui/src/Form/Core/TextArea.svelte index 4d2e68934f..30c1993f9b 100644 --- a/packages/bbui/src/Form/Core/TextArea.svelte +++ b/packages/bbui/src/Form/Core/TextArea.svelte @@ -19,7 +19,7 @@ const dispatch = createEventDispatcher() - let focus = false + let isFocused = false let textarea: HTMLTextAreaElement let scrollable = false @@ -27,8 +27,16 @@ $: minHeightString = getStyleString("min-height", minHeight) $: dispatch("scrollable", scrollable) + export function focus() { + textarea.focus() + } + + export function contents() { + return textarea.value + } + const onBlur = () => { - focus = false + isFocused = false updateValue() } @@ -65,7 +73,7 @@ style={`${heightString}${minHeightString}`} class="spectrum-Textfield spectrum-Textfield--multiline" class:is-disabled={disabled} - class:is-focused={focus} + class:is-focused={isFocused} >