From 32e750afd6c7ed08a55971e71ce7206c12e5f3d4 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 1 Feb 2024 17:37:46 +0000 Subject: [PATCH 01/12] A small ux improvement to the automation scripting system. --- .../SetupPanel/AutomationBlockSetup.svelte | 101 ++++++++++++------ .../common/CodeEditor/CodeEditor.svelte | 3 +- .../src/components/common/CodeEditor/index.js | 7 +- .../common/bindings/BindingPanel.svelte | 31 ++---- .../src/components/common/bindings/utils.js | 67 ++++++------ 5 files changed, 115 insertions(+), 94 deletions(-) diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index a9e7ab0d39..d8b41dc94d 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -33,6 +33,8 @@ import Editor from "components/integration/QueryEditor.svelte" import ModalBindableInput from "components/common/bindings/ModalBindableInput.svelte" import CodeEditor from "components/common/CodeEditor/CodeEditor.svelte" + import BindingPicker from "components/common/bindings/BindingPicker.svelte" + import { BindingHelpers } from "components/common/bindings/utils" import { bindingsToCompletions, hbAutocomplete, @@ -56,7 +58,7 @@ let drawer let fillWidth = true let inputData - let codeBindingOpen = false + let insertAtPos, getCaretPosition $: filters = lookForFilters(schemaProperties) || [] $: tempFilters = filters $: stepId = block.stepId @@ -75,6 +77,10 @@ $: isUpdateRow = stepId === ActionStepID.UPDATE_ROW $: codeMode = stepId === "EXECUTE_BASH" ? EditorModes.Handlebars : EditorModes.JS + $: bindingsHelpers = new BindingHelpers(getCaretPosition, insertAtPos, { + disableWrapping: true, + }) + $: editingJs = codeMode === EditorModes.JS $: stepCompletions = codeMode === EditorModes.Handlebars @@ -539,39 +545,51 @@ /> {:else if value.customType === "code"} - {#if codeMode == EditorModes.JS} - (codeBindingOpen = !codeBindingOpen)} - quiet - icon={codeBindingOpen ? "ChevronDown" : "ChevronRight"} - > - Bindings - - {#if codeBindingOpen} -
{JSON.stringify(bindings, null, 2)}
- {/if} - {/if} - { - // need to pass without the value inside - onChange({ detail: e.detail }, key) - inputData[key] = e.detail - }} - completions={stepCompletions} - mode={codeMode} - autocompleteEnabled={codeMode != EditorModes.JS} - height={500} - /> -
- {#if codeMode == EditorModes.Handlebars} - -
-
- Add available bindings by typing - }} - -
+
+
+ { + // need to pass without the value inside + onChange({ detail: e.detail }, key) + inputData[key] = e.detail + }} + completions={stepCompletions} + mode={codeMode} + autocompleteEnabled={codeMode !== EditorModes.JS} + bind:getCaretPosition + bind:insertAtPos + height={500} + /> +
+ {#if codeMode === EditorModes.Handlebars} + +
+
+ Add available bindings by typing + }} + +
+
+ {/if} +
+
+ {#if editingJs} +
+ + bindingsHelpers.onSelectBinding( + inputData[key], + binding, + { + js: true, + decode: false, + } + )} + mode="javascript" + />
{/if}
@@ -658,4 +676,19 @@ .test :global(.drawer) { width: 10000px !important; } + + .js-editor { + display: flex; + flex-direction: row; + flex-grow: 1; + width: 100%; + } + + .js-code { + flex: 7; + } + + .js-binding-picker { + flex: 3; + } diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index a39634f9a3..e906ef445d 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -54,6 +54,7 @@ export let placeholder = null export let autocompleteEnabled = true export let autofocus = false + export let jsBindingWrapping = true // Export a function to expose caret position export const getCaretPosition = () => { @@ -187,7 +188,7 @@ ) complete.push( EditorView.inputHandler.of((view, from, to, insert) => { - if (insert === "$") { + if (jsBindingWrapping && insert === "$") { let { text } = view.state.doc.lineAt(from) const left = from ? text.substring(0, from) : "" diff --git a/packages/builder/src/components/common/CodeEditor/index.js b/packages/builder/src/components/common/CodeEditor/index.js index da0e727e4e..38d377b47a 100644 --- a/packages/builder/src/components/common/CodeEditor/index.js +++ b/packages/builder/src/components/common/CodeEditor/index.js @@ -286,13 +286,14 @@ export const hbInsert = (value, from, to, text) => { return parsedInsert } -export function jsInsert(value, from, to, text, { helper } = {}) { +export function jsInsert(value, from, to, text, { helper, disableWrapping }) { let parsedInsert = "" const left = from ? value.substring(0, from) : "" const right = to ? value.substring(to) : "" - - if (helper) { + if (disableWrapping) { + parsedInsert = text + } else if (helper) { parsedInsert = `helpers.${text}()` } else if (!left.includes('$("') || !right.includes('")')) { parsedInsert = `$("${text}")` diff --git a/packages/builder/src/components/common/bindings/BindingPanel.svelte b/packages/builder/src/components/common/bindings/BindingPanel.svelte index 548a71b483..e6bd2fe86a 100644 --- a/packages/builder/src/components/common/bindings/BindingPanel.svelte +++ b/packages/builder/src/components/common/bindings/BindingPanel.svelte @@ -29,10 +29,9 @@ hbAutocomplete, EditorModes, bindingsToCompletions, - hbInsert, - jsInsert, } from "../CodeEditor" import BindingPicker from "./BindingPicker.svelte" + import { BindingHelpers } from "./utils" const dispatch = createEventDispatcher() @@ -60,8 +59,10 @@ let targetMode = null $: usingJS = mode === "JavaScript" - $: editorMode = mode == "JavaScript" ? EditorModes.JS : EditorModes.Handlebars + $: editorMode = + mode === "JavaScript" ? EditorModes.JS : EditorModes.Handlebars $: bindingCompletions = bindingsToCompletions(bindings, editorMode) + $: bindingHelpers = new BindingHelpers(getCaretPosition, insertAtPos) const updateValue = val => { valid = isValid(readableToRuntimeBinding(bindings, val)) @@ -70,31 +71,13 @@ } } - // Adds a JS/HBS helper to the expression const onSelectHelper = (helper, js) => { - const pos = getCaretPosition() - const { start, end } = pos - if (js) { - let js = decodeJSBinding(jsValue) - const insertVal = jsInsert(js, start, end, helper.text, { helper: true }) - insertAtPos({ start, end, value: insertVal }) - } else { - const insertVal = hbInsert(hbsValue, start, end, helper.text) - insertAtPos({ start, end, value: insertVal }) - } + bindingHelpers.onSelectHelper(js ? jsValue : hbsValue, helper, js) } - // Adds a data binding to the expression const onSelectBinding = (binding, { forceJS } = {}) => { - const { start, end } = getCaretPosition() - if (usingJS || forceJS) { - let js = decodeJSBinding(jsValue) - const insertVal = jsInsert(js, start, end, binding.readableBinding) - insertAtPos({ start, end, value: insertVal }) - } else { - const insertVal = hbInsert(hbsValue, start, end, binding.readableBinding) - insertAtPos({ start, end, value: insertVal }) - } + const js = usingJS || forceJS + bindingHelpers.onSelectBinding(js ? jsValue : hbsValue, binding, { js }) } const onChangeMode = e => { diff --git a/packages/builder/src/components/common/bindings/utils.js b/packages/builder/src/components/common/bindings/utils.js index 8d414ffed3..428e092842 100644 --- a/packages/builder/src/components/common/bindings/utils.js +++ b/packages/builder/src/components/common/bindings/utils.js @@ -1,38 +1,41 @@ -export function addHBSBinding(value, caretPos, binding) { - binding = typeof binding === "string" ? binding : binding.path - value = value == null ? "" : value +import { decodeJSBinding } from "@budibase/string-templates" +import { hbInsert, jsInsert } from "components/common/CodeEditor" - const left = caretPos?.start ? value.substring(0, caretPos.start) : "" - const right = caretPos?.end ? value.substring(caretPos.end) : "" - if (!left.includes("{{") || !right.includes("}}")) { - binding = `{{ ${binding} }}` +export class BindingHelpers { + constructor(getCaretPosition, insertAtPos, { disableWrapping } = {}) { + this.getCaretPosition = getCaretPosition + this.insertAtPos = insertAtPos + this.disableWrapping = disableWrapping } - if (caretPos.start) { - value = - value.substring(0, caretPos.start) + - binding + - value.substring(caretPos.end, value.length) - } else { - value += binding - } - return value -} -export function addJSBinding(value, caretPos, binding, { helper } = {}) { - binding = typeof binding === "string" ? binding : binding.path - value = value == null ? "" : value - if (!helper) { - binding = `$("${binding}")` - } else { - binding = `helpers.${binding}()` + // Adds a JS/HBS helper to the expression + onSelectHelper(value, helper, { js }) { + const pos = this.getCaretPosition() + const { start, end } = pos + if (js) { + const jsVal = decodeJSBinding(value) + const insertVal = jsInsert(jsVal, start, end, helper.text, { + helper: true, + }) + this.insertAtPos({ start, end, value: insertVal }) + } else { + const insertVal = hbInsert(value, start, end, helper.text) + this.insertAtPos({ start, end, value: insertVal }) + } } - if (caretPos.start) { - value = - value.substring(0, caretPos.start) + - binding + - value.substring(caretPos.end, value.length) - } else { - value += binding + + // Adds a data binding to the expression + onSelectBinding(value, binding, { js, decode }) { + const { start, end } = this.getCaretPosition() + if (js) { + const jsVal = decode ? decodeJSBinding(value) : value + const insertVal = jsInsert(jsVal, start, end, binding.readableBinding, { + disableWrapping: this.disableWrapping, + }) + this.insertAtPos({ start, end, value: insertVal }) + } else { + const insertVal = hbInsert(value, start, end, binding.readableBinding) + this.insertAtPos({ start, end, value: insertVal }) + } } - return value } From 163c10c71e1a59253ea4caee25ec15d5fdc5c246 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 09:58:15 +0000 Subject: [PATCH 02/12] Bump nodemailer from 6.7.2 to 6.9.9 in /packages/worker Bumps [nodemailer](https://github.com/nodemailer/nodemailer) from 6.7.2 to 6.9.9. - [Release notes](https://github.com/nodemailer/nodemailer/releases) - [Changelog](https://github.com/nodemailer/nodemailer/blob/master/CHANGELOG.md) - [Commits](https://github.com/nodemailer/nodemailer/compare/v6.7.2...v6.9.9) --- updated-dependencies: - dependency-name: nodemailer dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- packages/worker/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/worker/package.json b/packages/worker/package.json index 2e3200fda5..6c4cc6fe5b 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -63,7 +63,7 @@ "koa-useragent": "^4.1.0", "lodash": "4.17.21", "node-fetch": "2.6.7", - "nodemailer": "6.7.2", + "nodemailer": "6.9.9", "passport-google-oauth": "2.0.0", "passport-local": "1.0.0", "pouchdb": "7.3.0", From dab066e61b8e91165b52a5762f2f02d8de4e12bf Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 2 Feb 2024 11:11:55 +0000 Subject: [PATCH 03/12] Quick fix. --- .../builder/src/components/common/bindings/BindingPanel.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/components/common/bindings/BindingPanel.svelte b/packages/builder/src/components/common/bindings/BindingPanel.svelte index e6bd2fe86a..0ef34a36ad 100644 --- a/packages/builder/src/components/common/bindings/BindingPanel.svelte +++ b/packages/builder/src/components/common/bindings/BindingPanel.svelte @@ -72,7 +72,7 @@ } const onSelectHelper = (helper, js) => { - bindingHelpers.onSelectHelper(js ? jsValue : hbsValue, helper, js) + bindingHelpers.onSelectHelper(js ? jsValue : hbsValue, helper, { js }) } const onSelectBinding = (binding, { forceJS } = {}) => { From cadce52e1bd1b9f89d22da95aa580e6959e4255a Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 2 Feb 2024 11:28:54 +0000 Subject: [PATCH 04/12] Changing how optional decoding works. --- .../automation/SetupPanel/AutomationBlockSetup.svelte | 2 +- packages/builder/src/components/common/bindings/utils.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index d8b41dc94d..213e1e0e54 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -585,7 +585,7 @@ binding, { js: true, - decode: false, + dontDecode: true, } )} mode="javascript" diff --git a/packages/builder/src/components/common/bindings/utils.js b/packages/builder/src/components/common/bindings/utils.js index 428e092842..a086cd0394 100644 --- a/packages/builder/src/components/common/bindings/utils.js +++ b/packages/builder/src/components/common/bindings/utils.js @@ -9,11 +9,11 @@ export class BindingHelpers { } // Adds a JS/HBS helper to the expression - onSelectHelper(value, helper, { js }) { + onSelectHelper(value, helper, { js, dontDecode }) { const pos = this.getCaretPosition() const { start, end } = pos if (js) { - const jsVal = decodeJSBinding(value) + const jsVal = dontDecode ? value : decodeJSBinding(value) const insertVal = jsInsert(jsVal, start, end, helper.text, { helper: true, }) @@ -25,10 +25,10 @@ export class BindingHelpers { } // Adds a data binding to the expression - onSelectBinding(value, binding, { js, decode }) { + onSelectBinding(value, binding, { js, dontDecode }) { const { start, end } = this.getCaretPosition() if (js) { - const jsVal = decode ? decodeJSBinding(value) : value + const jsVal = dontDecode ? value : decodeJSBinding(value) const insertVal = jsInsert(jsVal, start, end, binding.readableBinding, { disableWrapping: this.disableWrapping, }) From be0ff766f3bc0c3726e7ab14a4ec7f7dd0adb525 Mon Sep 17 00:00:00 2001 From: melohagan <101575380+melohagan@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:25:18 +0000 Subject: [PATCH 05/12] Chore/fix worker request error message (#12943) * Revert "Surface email error (#12837)" This reverts commit 2a24c8537857af19c99ceb48fe111c814a8f29c6. * Improve workerRequest error handling * update account portal * Fix typing * lint --- packages/account-portal | 2 +- .../server/src/utilities/workerRequests.ts | 26 ++++++++----------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/account-portal b/packages/account-portal index 52f51dcfb9..cc12291732 160000 --- a/packages/account-portal +++ b/packages/account-portal @@ -1 +1 @@ -Subproject commit 52f51dcfb96d3fe58c8cc7a905e7d733f7cd84c2 +Subproject commit cc12291732ee902dc832bc7d93cf2086ffdf0cff diff --git a/packages/server/src/utilities/workerRequests.ts b/packages/server/src/utilities/workerRequests.ts index 1604a724d2..69ce58c8a9 100644 --- a/packages/server/src/utilities/workerRequests.ts +++ b/packages/server/src/utilities/workerRequests.ts @@ -1,4 +1,4 @@ -import fetch from "node-fetch" +import { Response, default as fetch } from "node-fetch" import env from "../environment" import { checkSlashesInUrl } from "./index" import { @@ -40,25 +40,21 @@ export function request(ctx?: Ctx, request?: any) { } async function checkResponse( - response: any, + response: Response, errorMsg: string, { ctx }: { ctx?: Ctx } = {} ) { - if (response.status !== 200) { - let error - try { - error = await response.json() - if (!error.message) { - error = JSON.stringify(error) - } - } catch (err) { - error = await response.text() + if (response.status >= 300) { + let responseErrorMessage + if (response.headers.get("content-type")?.includes("json")) { + const error = await response.json() + responseErrorMessage = error.message ?? JSON.stringify(error) + } else { + responseErrorMessage = await response.text() } - const msg = `Unable to ${errorMsg} - ${ - error.message ? error.message : error - }` + const msg = `Unable to ${errorMsg} - ${responseErrorMessage}` if (ctx) { - ctx.throw(400, msg) + ctx.throw(msg, response.status) } else { throw msg } From 8ad3182d7cb682849234a74038cdfdcd6d4ca44f Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Fri, 2 Feb 2024 12:29:48 -0300 Subject: [PATCH 06/12] bump pro submodule --- packages/pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pro b/packages/pro index 4f9616f163..aaf7101cd1 160000 --- a/packages/pro +++ b/packages/pro @@ -1 +1 @@ -Subproject commit 4f9616f163039a0eea81319d8e2288340a2ebc79 +Subproject commit aaf7101cd1493215155cc8f83124c70d53eb1be4 From 137ff312892f75122099a128f0130d602b84f65d Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 2 Feb 2024 15:34:56 +0000 Subject: [PATCH 07/12] Removing unused. --- .../components/automation/SetupPanel/AutomationBlockSetup.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index 213e1e0e54..860e6dc350 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -15,7 +15,6 @@ Icon, Checkbox, DatePicker, - Detail, } from "@budibase/bbui" import CreateWebhookModal from "components/automation/Shared/CreateWebhookModal.svelte" import { automationStore, selectedAutomation } from "builderStore" From 3f3a38f73aea586250f3e802444d3c697d0b5fd1 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Fri, 2 Feb 2024 15:46:40 +0000 Subject: [PATCH 08/12] Bump version to 2.17.3 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 8938ed4c5f..0f02995ac0 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.17.2", + "version": "2.17.3", "npmClient": "yarn", "packages": [ "packages/*", From 471d2f4ae8112b2f22325c86a05259a1ddeb55a9 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Fri, 2 Feb 2024 16:36:12 +0000 Subject: [PATCH 09/12] Remove padding from binding picker to clean up design. --- .../automation/SetupPanel/AutomationBlockSetup.svelte | 1 + .../src/components/common/bindings/BindingPicker.svelte | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index 860e6dc350..6f8fccc654 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -577,6 +577,7 @@
bindingsHelpers.onSelectBinding( diff --git a/packages/builder/src/components/common/bindings/BindingPicker.svelte b/packages/builder/src/components/common/bindings/BindingPicker.svelte index d85a0a2bbb..758fa322e7 100644 --- a/packages/builder/src/components/common/bindings/BindingPicker.svelte +++ b/packages/builder/src/components/common/bindings/BindingPicker.svelte @@ -9,6 +9,7 @@ export let bindings export let mode export let allowHelpers + export let noPaddingTop = false let search = "" let popover @@ -104,7 +105,7 @@ {#if selectedCategory} -
+
Date: Fri, 2 Feb 2024 17:16:45 +0000 Subject: [PATCH 10/12] PR comments. --- .../automation/SetupPanel/AutomationBlockSetup.svelte | 2 +- .../src/components/common/bindings/BindingPicker.svelte | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte index 6f8fccc654..1536d83a82 100644 --- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte +++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte @@ -577,7 +577,6 @@
bindingsHelpers.onSelectBinding( @@ -690,5 +689,6 @@ .js-binding-picker { flex: 3; + margin-top: calc((var(--spacing-xl) * -1) + 1px); } diff --git a/packages/builder/src/components/common/bindings/BindingPicker.svelte b/packages/builder/src/components/common/bindings/BindingPicker.svelte index 758fa322e7..9daed00324 100644 --- a/packages/builder/src/components/common/bindings/BindingPicker.svelte +++ b/packages/builder/src/components/common/bindings/BindingPicker.svelte @@ -105,7 +105,7 @@ {#if selectedCategory} -
+
Date: Mon, 5 Feb 2024 09:33:58 +0000 Subject: [PATCH 11/12] Add readonly setting to user field (#12893) --- packages/client/manifest.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 5bbf465766..313b679e49 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -6742,6 +6742,17 @@ "key": "disabled", "defaultValue": false }, + { + "type": "boolean", + "label": "Read only", + "key": "readonly", + "defaultValue": false, + "dependsOn": { + "setting": "disabled", + "value": true, + "invert": true + } + }, { "type": "select", "label": "Layout", From 79f3486180988dc57cdf0231b06b6a52ee1bdb69 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Mon, 5 Feb 2024 10:14:18 +0000 Subject: [PATCH 12/12] Bump version to 2.17.4 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 0f02995ac0..f189c78a95 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.17.3", + "version": "2.17.4", "npmClient": "yarn", "packages": [ "packages/*",