option.label}
getOptionValue={option => option.value}
tooltip="Dynamic formula are calculated when retrieved, but cannot be filtered or sorted by,
diff --git a/packages/builder/src/components/design/settings/componentSettings.js b/packages/builder/src/components/design/settings/componentSettings.js
index 8b151564a1..6d673cbd3d 100644
--- a/packages/builder/src/components/design/settings/componentSettings.js
+++ b/packages/builder/src/components/design/settings/componentSettings.js
@@ -1,4 +1,4 @@
-import { Checkbox, Select, RadioGroup, Stepper } from "@budibase/bbui"
+import { Checkbox, Select, RadioGroup, Stepper, Input } from "@budibase/bbui"
import DataSourceSelect from "./controls/DataSourceSelect.svelte"
import S3DataSourceSelect from "./controls/S3DataSourceSelect.svelte"
import DataProviderSelect from "./controls/DataProviderSelect.svelte"
@@ -60,6 +60,7 @@ const componentMap = {
"field/longform": FormFieldSelect,
"field/datetime": FormFieldSelect,
"field/attachment": FormFieldSelect,
+ "field/s3": Input,
"field/link": FormFieldSelect,
"field/array": FormFieldSelect,
"field/json": FormFieldSelect,
diff --git a/packages/builder/src/pages/builder/_layout.svelte b/packages/builder/src/pages/builder/_layout.svelte
index b216958045..960822a39f 100644
--- a/packages/builder/src/pages/builder/_layout.svelte
+++ b/packages/builder/src/pages/builder/_layout.svelte
@@ -3,6 +3,7 @@
import { admin, auth, licensing } from "stores/portal"
import { onMount } from "svelte"
import { CookieUtils, Constants } from "@budibase/frontend-core"
+ import { banner, BANNER_TYPES } from "@budibase/bbui"
import { API } from "api"
import Branding from "./Branding.svelte"
@@ -16,6 +17,32 @@
$: user = $auth.user
$: useAccountPortal = cloud && !$admin.disableAccountPortal
+ let showVerificationPrompt = false
+
+ const checkVerification = user => {
+ if (!showVerificationPrompt && user?.account?.verified === false) {
+ showVerificationPrompt = true
+ banner.queue([
+ {
+ message: `Please verify your account. We've sent the verification link to ${user.email}`,
+ type: BANNER_TYPES.NEUTRAL,
+ showCloseButton: false,
+ extraButtonAction: () => {
+ fetch(`${$admin.accountPortalUrl}/api/auth/reset`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({ email: user.email }),
+ })
+ },
+ extraButtonText: "Resend email",
+ },
+ ])
+ }
+ }
+
+ $: checkVerification(user)
const validateTenantId = async () => {
const host = window.location.host
diff --git a/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte b/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte
index 7c4d3db7ce..c93a41f541 100644
--- a/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/_components/BuilderSidePanel.svelte
@@ -126,7 +126,7 @@
user,
prodAppId
)
- const isAppBuilder = sdk.users.hasAppBuilderPermissions(user, prodAppId)
+ const isAppBuilder = user.builder?.apps?.includes(prodAppId)
let role
if (isAdminOrGlobalBuilder) {
role = Constants.Roles.ADMIN
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[datasourceId]/_components/EditDatasourceConfigButton.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[datasourceId]/_components/EditDatasourceConfigButton.svelte
index 9e50ab8da3..9654b27b50 100644
--- a/packages/builder/src/pages/builder/app/[application]/data/datasource/[datasourceId]/_components/EditDatasourceConfigButton.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/data/datasource/[datasourceId]/_components/EditDatasourceConfigButton.svelte
@@ -27,12 +27,14 @@
if (datasource.source === IntegrationTypes.COUCHDB) {
return datasource.config.database
}
- if (
- datasource.source === IntegrationTypes.DYNAMODB ||
- datasource.source === IntegrationTypes.S3
- ) {
+ if (datasource.source === IntegrationTypes.DYNAMODB) {
return `${datasource.config.endpoint}:${datasource.config.region}`
}
+ if (datasource.source === IntegrationTypes.S3) {
+ return datasource.config.endpoint
+ ? `${datasource.config.endpoint}:${datasource.config.region}`
+ : `s3.${datasource.config.region}.amazonaws.com`
+ }
if (datasource.source === IntegrationTypes.ELASTICSEARCH) {
return datasource.config.url
}
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte
index 581e69cfaf..afcada4138 100644
--- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte
@@ -21,6 +21,7 @@
$selectedScreen,
$store.selectedComponentId
)
+
$: componentBindings = getComponentBindableProperties(
$selectedScreen,
$store.selectedComponentId
diff --git a/packages/builder/src/pages/builder/portal/settings/version.svelte b/packages/builder/src/pages/builder/portal/settings/version.svelte
index fb9144c730..c3898b7861 100644
--- a/packages/builder/src/pages/builder/portal/settings/version.svelte
+++ b/packages/builder/src/pages/builder/portal/settings/version.svelte
@@ -63,8 +63,7 @@
)
const githubResponse = await githubCheck.json()
- //Get tag and remove the v infront of the tage name e.g. v1.0.0 is 1.0.0
- githubVersion = githubResponse.tag_name.slice(1)
+ githubVersion = githubResponse.tag_name
//Get the release date and output it in the local time format
githubPublishedDate = new Date(githubResponse.published_at)
diff --git a/packages/builder/src/pages/builder/portal/users/users/[userId].svelte b/packages/builder/src/pages/builder/portal/users/users/[userId].svelte
index 2a74cd9de5..ec10ec8316 100644
--- a/packages/builder/src/pages/builder/portal/users/users/[userId].svelte
+++ b/packages/builder/src/pages/builder/portal/users/users/[userId].svelte
@@ -111,7 +111,7 @@
})
}
return availableApps.map(app => {
- const prodAppId = apps.getProdAppID(app.appId)
+ const prodAppId = apps.getProdAppID(app.devId)
return {
name: app.name,
devId: app.devId,
diff --git a/packages/builder/src/stores/portal/licensing.js b/packages/builder/src/stores/portal/licensing.js
index 795616add1..3197822e53 100644
--- a/packages/builder/src/stores/portal/licensing.js
+++ b/packages/builder/src/stores/portal/licensing.js
@@ -107,7 +107,7 @@ export const createLicensingStore = () => {
Constants.Features.USER_GROUPS
)
const backupsEnabled = license.features.includes(
- Constants.Features.BACKUPS
+ Constants.Features.APP_BACKUPS
)
const scimEnabled = license.features.includes(Constants.Features.SCIM)
const environmentVariablesEnabled = license.features.includes(
diff --git a/packages/client/manifest.json b/packages/client/manifest.json
index 229d344d55..75fe287b2a 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -3721,7 +3721,7 @@
},
"settings": [
{
- "type": "field/attachment",
+ "type": "field/s3",
"label": "Field",
"key": "field",
"required": true
diff --git a/packages/client/src/components/app/forms/S3Upload.svelte b/packages/client/src/components/app/forms/S3Upload.svelte
index 795e2e4332..dfc5032de9 100644
--- a/packages/client/src/components/app/forms/S3Upload.svelte
+++ b/packages/client/src/components/app/forms/S3Upload.svelte
@@ -2,6 +2,7 @@
import Field from "./Field.svelte"
import { CoreDropzone, ProgressCircle } from "@budibase/bbui"
import { getContext, onMount, onDestroy } from "svelte"
+ import { cloneDeep } from "../../../../../bbui/src/helpers"
export let datasourceId
export let bucket
@@ -14,6 +15,7 @@
let fieldState
let fieldApi
+ let localFiles = []
const { API, notificationStore, uploadStore } = getContext("sdk")
const component = getContext("component")
@@ -90,9 +92,17 @@
}
const handleChange = e => {
- const changed = fieldApi.setValue(e.detail)
+ localFiles = e.detail
+ let files = cloneDeep(e.detail) || []
+ // remove URL as it contains the full base64 image data
+ files.forEach(file => {
+ if (file.type?.startsWith("image")) {
+ delete file.url
+ }
+ })
+ const changed = fieldApi.setValue(files)
if (onChange && changed) {
- onChange({ value: e.detail })
+ onChange({ value: files })
}
}
@@ -118,7 +128,7 @@
{#if fieldState}
import Provider from "./Provider.svelte"
import { onMount, onDestroy } from "svelte"
+ import { themeStore } from "stores"
let width = window.innerWidth
let height = window.innerHeight
@@ -13,11 +14,14 @@
}
})
+ $: theme = $themeStore.theme
+
$: data = {
mobile: width && width < tabletBreakpoint,
tablet: width && width >= tabletBreakpoint && width < desktopBreakpoint,
width,
height,
+ theme,
}
onMount(() => {
diff --git a/packages/frontend-core/src/components/grid/cells/DateCell.svelte b/packages/frontend-core/src/components/grid/cells/DateCell.svelte
index 53b159ee30..9144f5b769 100644
--- a/packages/frontend-core/src/components/grid/cells/DateCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/DateCell.svelte
@@ -1,5 +1,5 @@
@@ -192,6 +221,13 @@
>
Edit column
+