diff --git a/lerna.json b/lerna.json
index 16dc73aa30..b29f82c71a 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "2.25.0",
+ "version": "2.26.1",
"npmClient": "yarn",
"packages": [
"packages/*",
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 030fec8728..ff35ccee22 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -73,7 +73,6 @@
"chance": "1.1.8",
"ioredis-mock": "8.9.0",
"jest": "29.7.0",
- "jest-environment-node": "29.7.0",
"jest-serial-runner": "1.2.1",
"pino-pretty": "10.0.0",
"pouchdb-adapter-memory": "7.2.2",
diff --git a/packages/builder/package.json b/packages/builder/package.json
index f29ae3f7f2..a00936bdca 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -93,7 +93,6 @@
"identity-obj-proxy": "^3.0.0",
"jest": "29.7.0",
"jsdom": "^21.1.1",
- "ncp": "^2.0.0",
"svelte-jester": "^1.3.2",
"vite": "^4.5.0",
"vite-plugin-static-copy": "^0.17.0",
diff --git a/packages/builder/src/components/common/FontAwesomeIcon.svelte b/packages/builder/src/components/common/FontAwesomeIcon.svelte
index 16c065cfaa..0e10dfc86c 100644
--- a/packages/builder/src/components/common/FontAwesomeIcon.svelte
+++ b/packages/builder/src/components/common/FontAwesomeIcon.svelte
@@ -23,6 +23,7 @@
faQuestionCircle,
faCircleCheck,
faGear,
+ faRectangleList,
} from "@fortawesome/free-solid-svg-icons"
import { faGithub, faDiscord } from "@fortawesome/free-brands-svg-icons"
@@ -37,6 +38,7 @@
faFileArrowUp,
faChevronLeft,
faCircleInfo,
+ faRectangleList,
// -- Required for easyMDE use in the builder.
faBold,
diff --git a/packages/builder/src/components/common/HelpMenu.svelte b/packages/builder/src/components/common/HelpMenu.svelte
index 63156676d2..0ce5ab9c8e 100644
--- a/packages/builder/src/components/common/HelpMenu.svelte
+++ b/packages/builder/src/components/common/HelpMenu.svelte
@@ -4,6 +4,7 @@
import { isEnabled, TENANT_FEATURE_FLAGS } from "helpers/featureFlags"
import { licensing } from "stores/portal"
import { isPremiumOrAbove } from "helpers/planTitle"
+ import { ChangelogURL } from "constants"
$: premiumOrAboveLicense = isPremiumOrAbove($licensing?.license?.plan?.type)
@@ -30,6 +31,13 @@
Help docs
+
+
+
+
+ Changelog
+
+
{/if}
+
+ Find the changelog for the latest release
+ here
+
{#if revertAvailable}
You can revert this app to version
diff --git a/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExportData.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExportData.svelte
index 096341783d..a857bc7ede 100644
--- a/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExportData.svelte
+++ b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExportData.svelte
@@ -49,17 +49,20 @@
},
]
- $: tables = findAllMatchingComponents($selectedScreen?.props, component =>
- component._component.endsWith("table")
- )
- $: tableBlocks = findAllMatchingComponents(
+ $: components = findAllMatchingComponents(
$selectedScreen?.props,
- component => component._component.endsWith("tableblock")
+ component => {
+ const type = component._component
+ return (
+ type.endsWith("/table") ||
+ type.endsWith("/tableblock") ||
+ type.endsWith("/gridblock")
+ )
+ }
)
- $: components = tables.concat(tableBlocks)
$: componentOptions = components.map(table => ({
label: table._instanceName,
- value: table._component.includes("tableblock")
+ value: table._component.endsWith("/tableblock")
? `${table._id}-table`
: table._id,
}))
@@ -69,6 +72,7 @@
$: selectedTable = components.find(
component => component._id === selectedTableId
)
+ $: parameters.rows = `{{ literal [${parameters.tableComponentId}].[selectedRows] }}`
onMount(() => {
if (!parameters.type) {
diff --git a/packages/builder/src/constants/index.js b/packages/builder/src/constants/index.js
index f556ee4b05..44c71f2e3b 100644
--- a/packages/builder/src/constants/index.js
+++ b/packages/builder/src/constants/index.js
@@ -70,3 +70,5 @@ export const PlanModel = {
PER_USER: "perUser",
DAY_PASS: "dayPass",
}
+
+export const ChangelogURL = "https://docs.budibase.com/changelog"
diff --git a/packages/builder/src/stores/builder/automations.js b/packages/builder/src/stores/builder/automations.js
index a31b05a8d8..cbe48cef33 100644
--- a/packages/builder/src/stores/builder/automations.js
+++ b/packages/builder/src/stores/builder/automations.js
@@ -166,10 +166,16 @@ const automationActions = store => ({
await store.actions.save(newAutomation)
},
test: async (automation, testData) => {
- const result = await API.testAutomation({
- automationId: automation?._id,
- testData,
- })
+ let result
+ try {
+ result = await API.testAutomation({
+ automationId: automation?._id,
+ testData,
+ })
+ } catch (err) {
+ const message = err.message || err.status || JSON.stringify(err)
+ throw `Automation test failed - ${message}`
+ }
if (!result?.trigger && !result?.steps?.length) {
if (result?.err?.code === "usage_limit_exceeded") {
throw "You have exceeded your automation quota"
diff --git a/packages/client/manifest.json b/packages/client/manifest.json
index cf5ed8140b..2fae9c0213 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -7017,10 +7017,22 @@
]
}
],
- "context": {
- "type": "schema",
- "scope": "local"
- },
+ "context": [
+ {
+ "type": "schema",
+ "scope": "local"
+ },
+ {
+ "type": "static",
+ "values": [
+ {
+ "label": "Selected rows",
+ "key": "selectedRows",
+ "type": "array"
+ }
+ ]
+ }
+ ],
"actions": ["RefreshDatasource"]
},
"bbreferencefield": {
diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte
index e365429cb6..4ed8f91f2a 100644
--- a/packages/client/src/components/app/GridBlock.svelte
+++ b/packages/client/src/components/app/GridBlock.svelte
@@ -1,8 +1,8 @@
-
- onRowClick?.({ row: e.detail })}
- />
-
+ onRowClick?.({ row: e.detail })}
+ />
+
+