diff --git a/charts/budibase/README.md b/charts/budibase/README.md
index 164388b730..d8191026ce 100644
--- a/charts/budibase/README.md
+++ b/charts/budibase/README.md
@@ -87,6 +87,7 @@ couchdb:
storageClass: "nfs-client"
adminPassword: admin
+services:
objectStore:
storageClass: "nfs-client"
redis:
diff --git a/charts/budibase/README.md.gotmpl b/charts/budibase/README.md.gotmpl
index 92e91f8e09..e37c323837 100644
--- a/charts/budibase/README.md.gotmpl
+++ b/charts/budibase/README.md.gotmpl
@@ -86,6 +86,7 @@ couchdb:
storageClass: "nfs-client"
adminPassword: admin
+services:
objectStore:
storageClass: "nfs-client"
redis:
diff --git a/hosting/proxy/nginx.prod.conf b/hosting/proxy/nginx.prod.conf
index 6da2e4a1c3..88f9645f80 100644
--- a/hosting/proxy/nginx.prod.conf
+++ b/hosting/proxy/nginx.prod.conf
@@ -249,4 +249,30 @@ http {
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
}
+
+ # From https://docs.datadoghq.com/integrations/nginx/?tab=kubernetes
+ server {
+ listen 81;
+ server_name localhost;
+
+ access_log off;
+ allow 127.0.0.1;
+ deny all;
+
+ location /nginx_status {
+ # Choose your status module
+
+ # freely available with open source NGINX
+ stub_status;
+
+ # for open source NGINX < version 1.7.5
+ # stub_status on;
+
+ # available only with NGINX Plus
+ # status;
+
+ # ensures the version information can be retrieved
+ server_tokens on;
+ }
+ }
}
diff --git a/packages/builder/src/builderStore/index.js b/packages/builder/src/builderStore/index.js
index ece17cb46f..dd54dcf13e 100644
--- a/packages/builder/src/builderStore/index.js
+++ b/packages/builder/src/builderStore/index.js
@@ -8,6 +8,7 @@ import { derived, get } from "svelte/store"
import { findComponent, findComponentPath } from "./componentUtils"
import { RoleUtils } from "@budibase/frontend-core"
import { createHistoryStore } from "builderStore/store/history"
+import { cloneDeep } from "lodash/fp"
export const store = getFrontendStore()
export const automationStore = getAutomationStore()
@@ -69,7 +70,14 @@ export const selectedComponent = derived(
if (!$selectedScreen || !$store.selectedComponentId) {
return null
}
- return findComponent($selectedScreen?.props, $store.selectedComponentId)
+ const selected = findComponent(
+ $selectedScreen?.props,
+ $store.selectedComponentId
+ )
+
+ const clone = selected ? cloneDeep(selected) : selected
+ store.actions.components.migrateSettings(clone)
+ return clone
}
)
diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js
index a4729b4a8a..7e510c3d26 100644
--- a/packages/builder/src/builderStore/store/frontend.js
+++ b/packages/builder/src/builderStore/store/frontend.js
@@ -601,6 +601,36 @@ export const getFrontendStore = () => {
// Finally try an external table
return validTables.find(table => table.sourceType === DB_TYPE_EXTERNAL)
},
+ migrateSettings: enrichedComponent => {
+ const componentPrefix = "@budibase/standard-components"
+ let migrated = false
+
+ if (enrichedComponent?._component == `${componentPrefix}/formblock`) {
+ // Use default config if the 'buttons' prop has never been initialised
+ if (!("buttons" in enrichedComponent)) {
+ enrichedComponent["buttons"] =
+ Utils.buildDynamicButtonConfig(enrichedComponent)
+ migrated = true
+ } else if (enrichedComponent["buttons"] == null) {
+ // Ignore legacy config if 'buttons' has been reset by 'resetOn'
+ const { _id, actionType, dataSource } = enrichedComponent
+ enrichedComponent["buttons"] = Utils.buildDynamicButtonConfig({
+ _id,
+ actionType,
+ dataSource,
+ })
+ migrated = true
+ }
+
+ // Ensure existing Formblocks position their buttons at the top.
+ if (!("buttonPosition" in enrichedComponent)) {
+ enrichedComponent["buttonPosition"] = "top"
+ migrated = true
+ }
+ }
+
+ return migrated
+ },
enrichEmptySettings: (component, opts) => {
if (!component?._component) {
return
@@ -672,7 +702,6 @@ export const getFrontendStore = () => {
component[setting.key] = setting.defaultValue
}
}
-
// Validate non-empty settings
else {
if (setting.type === "dataProvider") {
@@ -722,6 +751,9 @@ export const getFrontendStore = () => {
useDefaultValues: true,
})
+ // Migrate nested component settings
+ store.actions.components.migrateSettings(instance)
+
// Add any extra properties the component needs
let extras = {}
if (definition.hasChildren) {
@@ -845,7 +877,13 @@ export const getFrontendStore = () => {
if (!component) {
return false
}
- return patchFn(component, screen)
+
+ // Mutates the fetched component with updates
+ const updated = patchFn(component, screen)
+ // Mutates the component with any required settings updates
+ const migrated = store.actions.components.migrateSettings(component)
+
+ return updated || migrated
}
await store.actions.screens.patch(patchScreen, screenId)
},
@@ -1247,9 +1285,13 @@ export const getFrontendStore = () => {
const settings = getComponentSettings(component._component)
const updatedSetting = settings.find(setting => setting.key === name)
- const resetFields = settings.filter(
- setting => name === setting.resetOn
- )
+ // Can be a single string or array of strings
+ const resetFields = settings.filter(setting => {
+ return (
+ name === setting.resetOn ||
+ (Array.isArray(setting.resetOn) && setting.resetOn.includes(name))
+ )
+ })
resetFields?.forEach(setting => {
component[setting.key] = null
})
@@ -1271,6 +1313,7 @@ export const getFrontendStore = () => {
})
}
component[name] = value
+ return true
}
},
requestEjectBlock: componentId => {
@@ -1278,7 +1321,6 @@ export const getFrontendStore = () => {
},
handleEjectBlock: async (componentId, ejectedDefinition) => {
let nextSelectedComponentId
-
await store.actions.screens.patch(screen => {
const block = findComponent(screen.props, componentId)
const parent = findComponentParent(screen.props, componentId)
diff --git a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte
index 84fa62fe69..ffe769d024 100644
--- a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte
+++ b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/FlowChart.svelte
@@ -57,16 +57,11 @@
}}
class="buttons"
>
-