diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index e03768a420..bd10833f91 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -34,3 +34,14 @@ jobs:
CI: true
name: Budibase CI
- run: yarn test:e2e:ci
+
+ - name: Build and Push Staging Docker Image
+ # Only run on push
+ if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
+ run: |
+ docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
+ yarn build:docker:staging
+ env:
+ DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
+ DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}
+
diff --git a/hosting/scripts/linux/release-to-docker-hub.sh b/hosting/scripts/linux/release-to-docker-hub.sh
index b1921916e4..1661fed9f0 100755
--- a/hosting/scripts/linux/release-to-docker-hub.sh
+++ b/hosting/scripts/linux/release-to-docker-hub.sh
@@ -1,9 +1,15 @@
#!/bin/bash
+
+tag=$1
+tag=${tag:-latest}
+
pushd ../../build
docker-compose build --force app-service
docker-compose build --force worker-service
-docker tag build_app-service budibase/budibase-apps:latest
+
+docker tag build_app-service budibase/budibase-apps:$tag
+docker tag build_worker-service budibase/budibase-worker:$tag
+
docker push budibase/budibase-apps
-docker tag build_worker-service budibase/budibase-worker:latest
docker push budibase/budibase-worker
popd
diff --git a/package.json b/package.json
index 37efca51ba..037e9c4b1c 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,7 @@
"format": "prettier --write \"{,!(node_modules)/**/}*.{js,jsx,svelte}\"",
"test:e2e": "lerna run cy:test",
"test:e2e:ci": "lerna run cy:ci",
- "build:docker": "cd hosting/scripts/linux/ && ./release-to-docker-hub.sh && cd -"
+ "build:docker": "cd hosting/scripts/linux/ && ./release-to-docker-hub.sh && cd -",
+ "build:docker:staging": "cd hosting/scripts/linux/ && ./release-to-docker-hub.sh staging && cd -"
}
}
diff --git a/packages/builder/src/analytics.js b/packages/builder/src/analytics.js
index f59d71ac30..c68f228c12 100644
--- a/packages/builder/src/analytics.js
+++ b/packages/builder/src/analytics.js
@@ -106,6 +106,16 @@ function highlightFeedbackIcon() {
return isFeedbackTimeElapsed(firstRunStr)
}
+// Opt In/Out
+const ifAnalyticsEnabled = func => () => {
+ if (analyticsEnabled && process.env.POSTHOG_TOKEN) {
+ return func()
+ }
+}
+const disabled = () => posthog.has_opted_out_capturing()
+const optIn = () => posthog.opt_in_capturing()
+const optOut = () => posthog.opt_out_capturing()
+
export default {
activate,
identify,
@@ -115,4 +125,7 @@ export default {
requestFeedbackOnDeploy,
submitFeedback,
highlightFeedbackIcon,
+ disabled: ifAnalyticsEnabled(disabled),
+ optIn: ifAnalyticsEnabled(optIn),
+ optOut: ifAnalyticsEnabled(optOut),
}
diff --git a/packages/builder/src/builderStore/dataBinding.js b/packages/builder/src/builderStore/dataBinding.js
index 022e78c637..679a77ca2b 100644
--- a/packages/builder/src/builderStore/dataBinding.js
+++ b/packages/builder/src/builderStore/dataBinding.js
@@ -2,6 +2,7 @@ import { cloneDeep } from "lodash/fp"
import { get } from "svelte/store"
import { backendUiStore, store } from "builderStore"
import { findAllMatchingComponents, findComponentPath } from "./storeUtils"
+import { TableNames } from "../constants"
// Regex to match all instances of template strings
const CAPTURE_VAR_INSIDE_TEMPLATE = /{{([^}]+)}}/g
@@ -114,6 +115,37 @@ export const getContextBindings = (rootComponent, componentId) => {
})
})
})
+
+ // Add logged in user bindings
+ const tables = get(backendUiStore).tables
+ const userTable = tables.find(table => table._id === TableNames.USERS)
+ const schema = {
+ ...userTable.schema,
+ _id: { type: "string" },
+ _rev: { type: "string" },
+ }
+ const keys = Object.keys(schema).sort()
+ keys.forEach(key => {
+ const fieldSchema = schema[key]
+ // Replace certain bindings with a new property to help display components
+ let runtimeBoundKey = key
+ if (fieldSchema.type === "link") {
+ runtimeBoundKey = `${key}_count`
+ } else if (fieldSchema.type === "attachment") {
+ runtimeBoundKey = `${key}_first`
+ }
+
+ contextBindings.push({
+ type: "context",
+ runtimeBinding: `user.${runtimeBoundKey}`,
+ readableBinding: `Current User.${key}`,
+ fieldSchema,
+ providerId: "user",
+ tableId: TableNames.USERS,
+ field: key,
+ })
+ })
+
return contextBindings
}
diff --git a/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte b/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte
index 8855fb6895..50e7346876 100644
--- a/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte
+++ b/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte
@@ -43,6 +43,7 @@