diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index 6e886f3011..e940e6fa10 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -7,7 +7,6 @@ on:
branches:
- master
- develop
- - new-design-ui
pull_request:
branches:
- master
@@ -60,19 +59,3 @@ jobs:
with:
install: false
command: yarn test:e2e:ci
-
- - name: Configure AWS Credentials
- uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- aws-region: eu-west-1
-
- - name: Upload to S3
- if: github.ref == 'refs/heads/new-design-ui'
- run: |
- tar -czvf new_ui.tar.gz packages/server/builder/assets packages/server/builder/index.html
- aws s3 cp new_ui.tar.gz s3://prod-budi-app-assets/beta:design_ui/
- aws s3 cp packages/client/dist/budibase-client.js s3://prod-budi-app-assets/beta:design_ui/budibase-client.js
- aws cloudfront create-invalidation --distribution-id E3ELKP4RCEHVLW --paths "/beta:design_ui/*"
-
diff --git a/.github/workflows/deploy-single-image.yml b/.github/workflows/deploy-single-image.yml
new file mode 100644
index 0000000000..4a04bf3f98
--- /dev/null
+++ b/.github/workflows/deploy-single-image.yml
@@ -0,0 +1,62 @@
+name: Deploy Budibase Single Container Image to DockerHub
+on:
+ push:
+ branches:
+ - "omnibus-action"
+ - "develop"
+ - "master"
+ - "main"
+env:
+ BASE_BRANCH: ${{ github.event.pull_request.base.ref}}
+ BRANCH: ${{ github.event.pull_request.head.ref }}
+ CI: true
+ PERSONAL_ACCESS_TOKEN : ${{ secrets.PERSONAL_ACCESS_TOKEN }}
+ REGISTRY_URL: registry.hub.docker.com
+jobs:
+ build:
+ name: "build"
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [14.x]
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v2
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Setup QEMU
+ uses: docker/setup-qemu-action@v1
+ - name: Setup Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v1
+ - name: Install Pro
+ run: yarn install:pro $BRANCH $BASE_BRANCH
+ - name: Run Yarn
+ run: yarn
+ - name: Run Yarn Bootstrap
+ run: yarn bootstrap
+ - name: Runt Yarn Lint
+ run: yarn lint
+ - name: Run Yarn Build
+ run: yarn build
+ - name: Login to Docker Hub
+ uses: docker/login-action@v2
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_API_KEY }}
+ - name: Get the latest release version
+ id: version
+ run: |
+ release_version=$(cat lerna.json | jq -r '.version')
+ echo $release_version
+ echo "RELEASE_VERSION=$release_version" >> $GITHUB_ENV
+ - name: Tag and release Budibase service docker image
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ push: true
+ platforms: linux/amd64,linux/arm64
+ tags: budibase/budibase,budibase/budibase:v${{ env.RELEASE_VERSION }}
+ file: ./hosting/single/Dockerfile
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f33dcc6d53..6c05c4f684 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -16,6 +16,16 @@ on:
- 'package.json'
- 'yarn.lock'
workflow_dispatch:
+ inputs:
+ versioning:
+ type: choice
+ description: "Versioning type: patch, minor, major"
+ default: patch
+ options:
+ - patch
+ - minor
+ - major
+ required: true
env:
# Posthog token used by ui at build time
@@ -58,6 +68,7 @@ jobs:
- name: Publish budibase packages to NPM
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ RELEASE_VERSION_TYPE: ${{ github.event.inputs.version }}
run: |
# setup the username and email. I tend to use 'GitHub Actions Bot' with no email by default
git config --global user.name "Budibase Release Bot"
diff --git a/.yarnrc b/.yarnrc
new file mode 100644
index 0000000000..21fa517e23
--- /dev/null
+++ b/.yarnrc
@@ -0,0 +1 @@
+network-timeout 100000
diff --git a/charts/budibase/templates/app-service-deployment.yaml b/charts/budibase/templates/app-service-deployment.yaml
index ddc725d302..7a2c483cc8 100644
--- a/charts/budibase/templates/app-service-deployment.yaml
+++ b/charts/budibase/templates/app-service-deployment.yaml
@@ -122,6 +122,14 @@ spec:
value: {{ .Values.globals.automationMaxIterations | quote }}
- name: TENANT_FEATURE_FLAGS
value: {{ .Values.globals.tenantFeatureFlags | quote }}
+ {{ if .Values.globals.bbAdminUserEmail }}
+ - name: BB_ADMIN_USER_EMAIL
+ value: { { .Values.globals.bbAdminUserEmail | quote } }
+ {{ end }}
+ {{ if .Values.globals.bbAdminUserPassword }}
+ - name: BB_ADMIN_USER_PASSWORD
+ value: { { .Values.globals.bbAdminUserPassword | quote } }
+ {{ end }}
image: budibase/apps:{{ .Values.globals.appVersion }}
imagePullPolicy: Always
diff --git a/hosting/.env b/hosting/.env
index 39df76d01e..11dd661bf1 100644
--- a/hosting/.env
+++ b/hosting/.env
@@ -18,4 +18,8 @@ MINIO_PORT=4004
COUCH_DB_PORT=4005
REDIS_PORT=6379
WATCHTOWER_PORT=6161
-BUDIBASE_ENVIRONMENT=PRODUCTION
\ No newline at end of file
+BUDIBASE_ENVIRONMENT=PRODUCTION
+
+# An admin user can be automatically created initially if these are set
+BB_ADMIN_USER_EMAIL=
+BB_ADMIN_USER_PASSWORD=
\ No newline at end of file
diff --git a/hosting/docker-compose.yaml b/hosting/docker-compose.yaml
index f9d9eaf1c5..57cbf33709 100644
--- a/hosting/docker-compose.yaml
+++ b/hosting/docker-compose.yaml
@@ -23,6 +23,8 @@ services:
ENABLE_ANALYTICS: "true"
REDIS_URL: redis-service:6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
+ BB_ADMIN_USER_EMAIL: ${BB_ADMIN_USER_EMAIL}
+ BB_ADMIN_USER_PASSWORD: ${BB_ADMIN_USER_PASSWORD}
depends_on:
- worker-service
- redis-service
diff --git a/hosting/hosting.properties b/hosting/hosting.properties
index c8e2f5c606..11dd661bf1 100644
--- a/hosting/hosting.properties
+++ b/hosting/hosting.properties
@@ -19,3 +19,7 @@ COUCH_DB_PORT=4005
REDIS_PORT=6379
WATCHTOWER_PORT=6161
BUDIBASE_ENVIRONMENT=PRODUCTION
+
+# An admin user can be automatically created initially if these are set
+BB_ADMIN_USER_EMAIL=
+BB_ADMIN_USER_PASSWORD=
\ No newline at end of file
diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile
index 5e1b0b1374..772ae2a8ab 100644
--- a/hosting/single/Dockerfile
+++ b/hosting/single/Dockerfile
@@ -34,27 +34,32 @@ ENV \
ARCHITECTURE=amd \
BUDIBASE_ENVIRONMENT=PRODUCTION \
CLUSTER_PORT=80 \
- COUCHDB_PASSWORD=budibase \
- COUCHDB_USER=budibase \
- COUCH_DB_URL=http://budibase:budibase@localhost:5984 \
# CUSTOM_DOMAIN=budi001.custom.com \
DEPLOYMENT_ENVIRONMENT=docker \
- INTERNAL_API_KEY=budibase \
- JWT_SECRET=testsecret \
- MINIO_ACCESS_KEY=budibase \
- MINIO_SECRET_KEY=budibase \
MINIO_URL=http://localhost:9000 \
POSTHOG_TOKEN=phc_fg5I3nDOf6oJVMHSaycEhpPdlgS8rzXG2r6F2IpxCHS \
- REDIS_PASSWORD=budibase \
REDIS_URL=localhost:6379 \
SELF_HOSTED=1 \
TARGETBUILD=$TARGETBUILD \
WORKER_PORT=4002 \
- WORKER_URL=http://localhost:4002
+ WORKER_URL=http://localhost:4002 \
+ APPS_URL=http://localhost:4001
+
+# These secret env variables are generated by the runner at startup
+# their values can be overriden by the user, they will be written
+# to the .env file in the /data directory for use later on
+# REDIS_PASSWORD=budibase \
+# COUCHDB_PASSWORD=budibase \
+# COUCHDB_USER=budibase \
+# COUCH_DB_URL=http://budibase:budibase@localhost:5984 \
+# INTERNAL_API_KEY=budibase \
+# JWT_SECRET=testsecret \
+# MINIO_ACCESS_KEY=budibase \
+# MINIO_SECRET_KEY=budibase \
# install base dependencies
RUN apt-get update && \
- apt-get install -y software-properties-common wget nginx && \
+ apt-get install -y software-properties-common wget nginx uuid-runtime && \
apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && \
apt-get update
@@ -66,8 +71,8 @@ RUN curl -sL https://deb.nodesource.com/setup_16.x -o /tmp/nodesource_setup.sh &
npm install --global yarn pm2
# setup nginx
-ADD hosting/single/nginx.conf /etc/nginx
-ADD hosting/single/nginx-default-site.conf /etc/nginx/sites-enabled/default
+ADD hosting/single/nginx/nginx.conf /etc/nginx
+ADD hosting/single/nginx/nginx-default-site.conf /etc/nginx/sites-enabled/default
RUN mkdir -p /var/log/nginx && \
touch /var/log/nginx/error.log && \
touch /var/run/nginx.pid
@@ -86,13 +91,13 @@ RUN wget https://github.com/cloudant-labs/clouseau/releases/download/2.21.0/clou
WORKDIR /opt/clouseau
RUN mkdir ./bin
-ADD hosting/single/clouseau ./bin/
-ADD hosting/single/log4j.properties hosting/single/clouseau.ini ./
+ADD hosting/single/clouseau/clouseau ./bin/
+ADD hosting/single/clouseau/log4j.properties hosting/single/clouseau/clouseau.ini ./
RUN chmod +x ./bin/clouseau
# setup CouchDB
WORKDIR /opt/couchdb
-ADD hosting/single/vm.args ./etc/
+ADD hosting/single/couch/vm.args hosting/single/couch/local.ini ./etc/
# setup minio
WORKDIR /minio
diff --git a/hosting/single/clouseau b/hosting/single/clouseau/clouseau
similarity index 100%
rename from hosting/single/clouseau
rename to hosting/single/clouseau/clouseau
diff --git a/hosting/single/clouseau.ini b/hosting/single/clouseau/clouseau.ini
similarity index 92%
rename from hosting/single/clouseau.ini
rename to hosting/single/clouseau/clouseau.ini
index f086cf0398..78e43744e5 100644
--- a/hosting/single/clouseau.ini
+++ b/hosting/single/clouseau/clouseau.ini
@@ -7,7 +7,7 @@ name=clouseau@127.0.0.1
cookie=monster
; the path where you would like to store the search index files
-dir=/opt/couchdb/data/search
+dir=/data/search
; the number of search indexes that can be open simultaneously
max_indexes_open=500
diff --git a/hosting/single/log4j.properties b/hosting/single/clouseau/log4j.properties
similarity index 100%
rename from hosting/single/log4j.properties
rename to hosting/single/clouseau/log4j.properties
diff --git a/hosting/single/couch/local.ini b/hosting/single/couch/local.ini
new file mode 100644
index 0000000000..72872a60e1
--- /dev/null
+++ b/hosting/single/couch/local.ini
@@ -0,0 +1,5 @@
+; CouchDB Configuration Settings
+
+[couchdb]
+database_dir = /data/couch/dbs
+view_index_dir = /data/couch/views
diff --git a/hosting/single/vm.args b/hosting/single/couch/vm.args
similarity index 100%
rename from hosting/single/vm.args
rename to hosting/single/couch/vm.args
diff --git a/hosting/single/nginx-default-site.conf b/hosting/single/nginx/nginx-default-site.conf
similarity index 99%
rename from hosting/single/nginx-default-site.conf
rename to hosting/single/nginx/nginx-default-site.conf
index 964313fa73..c0d80a0185 100644
--- a/hosting/single/nginx-default-site.conf
+++ b/hosting/single/nginx/nginx-default-site.conf
@@ -88,7 +88,4 @@ server {
gzip_proxied any;
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;
-
-
-
}
diff --git a/hosting/single/nginx.conf b/hosting/single/nginx/nginx.conf
similarity index 100%
rename from hosting/single/nginx.conf
rename to hosting/single/nginx/nginx.conf
diff --git a/hosting/single/runner.sh b/hosting/single/runner.sh
index 6f3d247842..f8c1fc5e56 100644
--- a/hosting/single/runner.sh
+++ b/hosting/single/runner.sh
@@ -1,6 +1,34 @@
+#!/bin/bash
+declare -a ENV_VARS=("COUCHDB_USER" "COUCHDB_PASSWORD" "MINIO_ACCESS_KEY" "MINIO_SECRET_KEY" "INTERNAL_API_KEY" "JWT_SECRET" "REDIS_PASSWORD")
+if [ -f "/data/.env" ]; then
+ export $(cat /data/.env | xargs)
+fi
+# first randomise any unset environment variables
+for ENV_VAR in "${ENV_VARS[@]}"
+do
+ temp=$(eval "echo \$$ENV_VAR")
+ if [[ -z "${temp}" ]]; then
+ eval "export $ENV_VAR=$(uuidgen | sed -e 's/-//g')"
+ fi
+done
+if [[ -z "${COUCH_DB_URL}" ]]; then
+ export COUCH_DB_URL=http://$COUCHDB_USER:$COUCHDB_PASSWORD@localhost:5984
+fi
+if [ ! -f "/data/.env" ]; then
+ touch /data/.env
+ for ENV_VAR in "${ENV_VARS[@]}"
+ do
+ temp=$(eval "echo \$$ENV_VAR")
+ echo "$ENV_VAR=$temp" >> /data/.env
+ done
+fi
+
+# make these directories in runner, incase of mount
+mkdir -p /data/couch/dbs /data/couch/views
+chown couchdb:couchdb /data/couch /data/couch/dbs /data/couch/views
redis-server --requirepass $REDIS_PASSWORD &
/opt/clouseau/bin/clouseau &
-/minio/minio server /minio &
+/minio/minio server /data/minio &
/docker-entrypoint.sh /opt/couchdb/bin/couchdb &
/etc/init.d/nginx restart
if [[ ! -z "${CUSTOM_DOMAIN}" ]]; then
diff --git a/hosting/single/test.sh b/hosting/single/test.sh
index c7ef53f994..8830426a47 100755
--- a/hosting/single/test.sh
+++ b/hosting/single/test.sh
@@ -1,4 +1,4 @@
#!/bin/bash
-id=$(docker run -t -d -p 80:80 budibase:latest)
+id=$(docker run -t -d -p 8080:80 budibase:latest)
docker exec -it $id bash
docker kill $id
diff --git a/lerna.json b/lerna.json
index 703de112a8..f34472695f 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "1.0.219-alpha.17",
+ "version": "1.0.220-alpha.3",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/package.json b/package.json
index 9c35af497f..b787b4aee5 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"bootstrap": "lerna bootstrap && lerna link && ./scripts/link-dependencies.sh",
"build": "lerna run build",
"build:dev": "lerna run prebuild && tsc --build --watch --preserveWatchOutput",
- "release": "lerna publish patch --yes --force-publish && yarn release:pro",
+ "release": "lerna publish ${RELEASE_VERSION_TYPE:-patch} --yes --force-publish && yarn release:pro",
"release:develop": "lerna publish prerelease --yes --force-publish --dist-tag develop && yarn release:pro:develop",
"release:pro": "bash scripts/pro/release.sh",
"release:pro:develop": "bash scripts/pro/release.sh develop",
@@ -40,7 +40,8 @@
"dev": "yarn run kill-all && lerna link && lerna run --parallel dev:builder --concurrency 1",
"dev:noserver": "yarn run kill-builder && lerna link && lerna run dev:stack:up && lerna run --parallel dev:builder --concurrency 1 --ignore @budibase/backend-core --ignore @budibase/server --ignore @budibase/worker",
"dev:server": "yarn run kill-server && lerna run --parallel dev:builder --concurrency 1 --scope @budibase/backend-core --scope @budibase/worker --scope @budibase/server",
- "test": "lerna run test",
+ "test": "lerna run test && yarn test:pro",
+ "test:pro": "bash scripts/pro/test.sh",
"lint:eslint": "eslint packages",
"lint:prettier": "prettier --check \"packages/**/*.{js,ts,svelte}\"",
"lint": "yarn run lint:eslint && yarn run lint:prettier",
@@ -83,4 +84,4 @@
"install:pro": "bash scripts/pro/install.sh",
"dep:clean": "yarn clean && yarn bootstrap"
}
-}
+}
\ No newline at end of file
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 3db22f6f1e..a8333d56ce 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/backend-core",
- "version": "1.0.219-alpha.17",
+ "version": "1.0.220-alpha.3",
"description": "Budibase backend core libraries used in server and worker",
"main": "dist/src/index.js",
"types": "dist/src/index.d.ts",
@@ -20,7 +20,7 @@
"test:watch": "jest --watchAll"
},
"dependencies": {
- "@budibase/types": "^1.0.219-alpha.17",
+ "@budibase/types": "^1.0.220-alpha.3",
"@techpass/passport-openidconnect": "0.3.2",
"aws-sdk": "2.1030.0",
"bcrypt": "5.0.1",
@@ -59,6 +59,7 @@
]
},
"devDependencies": {
+ "@budibase/types": "^1.0.219",
"@shopify/jest-koa-mocks": "3.1.5",
"@types/jest": "27.5.1",
"@types/koa": "2.0.52",
diff --git a/packages/backend-core/src/environment.ts b/packages/backend-core/src/environment.ts
index 0a17c82873..845504fdc9 100644
--- a/packages/backend-core/src/environment.ts
+++ b/packages/backend-core/src/environment.ts
@@ -40,7 +40,7 @@ const env = {
DISABLE_ACCOUNT_PORTAL: process.env.DISABLE_ACCOUNT_PORTAL,
SELF_HOSTED: !!parseInt(process.env.SELF_HOSTED || ""),
COOKIE_DOMAIN: process.env.COOKIE_DOMAIN,
- PLATFORM_URL: process.env.PLATFORM_URL,
+ PLATFORM_URL: process.env.PLATFORM_URL || "",
POSTHOG_TOKEN: process.env.POSTHOG_TOKEN,
ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS,
TENANT_FEATURE_FLAGS: process.env.TENANT_FEATURE_FLAGS,
diff --git a/packages/bbui/package.json b/packages/bbui/package.json
index b8fa39aced..da439e585e 100644
--- a/packages/bbui/package.json
+++ b/packages/bbui/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/bbui",
"description": "A UI solution used in the different Budibase projects.",
- "version": "1.0.219-alpha.17",
+ "version": "1.0.220-alpha.3",
"license": "MPL-2.0",
"svelte": "src/index.js",
"module": "dist/bbui.es.js",
@@ -38,7 +38,7 @@
],
"dependencies": {
"@adobe/spectrum-css-workflow-icons": "^1.2.1",
- "@budibase/string-templates": "^1.0.219-alpha.17",
+ "@budibase/string-templates": "^1.0.220-alpha.3",
"@spectrum-css/actionbutton": "^1.0.1",
"@spectrum-css/actiongroup": "^1.0.1",
"@spectrum-css/avatar": "^3.0.2",
@@ -66,11 +66,12 @@
"@spectrum-css/radio": "^3.0.2",
"@spectrum-css/search": "^3.0.2",
"@spectrum-css/sidenav": "^3.0.2",
+ "@spectrum-css/slider": "3.0.1",
"@spectrum-css/statuslight": "^3.0.2",
"@spectrum-css/stepper": "^3.0.3",
"@spectrum-css/switch": "^1.0.2",
"@spectrum-css/table": "^3.0.1",
- "@spectrum-css/tabs": "^3.0.1",
+ "@spectrum-css/tabs": "^3.2.12",
"@spectrum-css/tags": "^3.0.2",
"@spectrum-css/textfield": "^3.0.1",
"@spectrum-css/toast": "^3.0.1",
diff --git a/packages/bbui/src/ActionButton/ActionButton.svelte b/packages/bbui/src/ActionButton/ActionButton.svelte
index 2d23120046..53ba6c7e51 100644
--- a/packages/bbui/src/ActionButton/ActionButton.svelte
+++ b/packages/bbui/src/ActionButton/ActionButton.svelte
@@ -82,6 +82,12 @@
.active svg {
color: var(--spectrum-global-color-blue-600);
}
+ :global([dir="ltr"] .spectrum-ActionButton .spectrum-Icon) {
+ margin-left: 0;
+ }
+ .is-selected:not(.spectrum-ActionButton--emphasized) {
+ background: var(--spectrum-global-color-gray-300);
+ }
.noPadding {
padding: 0;
min-width: 0;
diff --git a/packages/bbui/src/Banner/Banner.svelte b/packages/bbui/src/Banner/Banner.svelte
index f41fb5f803..3810021a61 100644
--- a/packages/bbui/src/Banner/Banner.svelte
+++ b/packages/bbui/src/Banner/Banner.svelte
@@ -8,6 +8,7 @@
export let size = "S"
export let extraButtonText
export let extraButtonAction
+ export let showCloseButton = true
let show = true
@@ -39,22 +40,24 @@
{/if}
-
+ {#if showCloseButton}
+
+ {/if}
{/if}
@@ -63,4 +66,7 @@
pointer-events: all;
width: 100%;
}
+ .spectrum-Button {
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ }
diff --git a/packages/bbui/src/Divider/Divider.svelte b/packages/bbui/src/Divider/Divider.svelte
index 2b4de9cfb0..e4f0f2fb61 100644
--- a/packages/bbui/src/Divider/Divider.svelte
+++ b/packages/bbui/src/Divider/Divider.svelte
@@ -16,6 +16,9 @@
/>
diff --git a/packages/bbui/src/Form/Core/index.js b/packages/bbui/src/Form/Core/index.js
index 96d81855e4..7c81cfd70b 100644
--- a/packages/bbui/src/Form/Core/index.js
+++ b/packages/bbui/src/Form/Core/index.js
@@ -12,3 +12,4 @@ export { default as CoreDatePicker } from "./DatePicker.svelte"
export { default as CoreDropzone } from "./Dropzone.svelte"
export { default as CoreStepper } from "./Stepper.svelte"
export { default as CoreRichTextField } from "./RichTextField.svelte"
+export { default as CoreSlider } from "./Slider.svelte"
diff --git a/packages/bbui/src/Form/Search.svelte b/packages/bbui/src/Form/Search.svelte
index 25dd98306b..74ffeeb22a 100644
--- a/packages/bbui/src/Form/Search.svelte
+++ b/packages/bbui/src/Form/Search.svelte
@@ -10,6 +10,7 @@
export let disabled = false
export let updateOnChange = true
export let quiet = false
+ export let inputRef
const dispatch = createEventDispatcher()
const onChange = e => {
@@ -25,6 +26,7 @@
{value}
{placeholder}
{quiet}
+ bind:inputRef
on:change={onChange}
on:click
on:input
diff --git a/packages/bbui/src/Form/Select.svelte b/packages/bbui/src/Form/Select.svelte
index 0df27e2ff0..1b68746c5e 100644
--- a/packages/bbui/src/Form/Select.svelte
+++ b/packages/bbui/src/Form/Select.svelte
@@ -14,6 +14,7 @@
export let getOptionLabel = option => extractProperty(option, "label")
export let getOptionValue = option => extractProperty(option, "value")
export let getOptionIcon = option => option?.icon
+ export let getOptionColour = option => option?.colour
export let quiet = false
export let autoWidth = false
export let sort = false
@@ -47,6 +48,7 @@
{getOptionLabel}
{getOptionValue}
{getOptionIcon}
+ {getOptionColour}
on:change={onChange}
on:click
/>
diff --git a/packages/bbui/src/Form/Slider.svelte b/packages/bbui/src/Form/Slider.svelte
new file mode 100644
index 0000000000..34b2251b35
--- /dev/null
+++ b/packages/bbui/src/Form/Slider.svelte
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/packages/bbui/src/Icon/Icon.svelte b/packages/bbui/src/Icon/Icon.svelte
index eee1d7fbae..9c99178fdb 100644
--- a/packages/bbui/src/Icon/Icon.svelte
+++ b/packages/bbui/src/Icon/Icon.svelte
@@ -47,7 +47,7 @@
{#if tooltip && showTooltip}
-
+
{/if}
diff --git a/packages/bbui/src/IconSideNav/IconSideNav.svelte b/packages/bbui/src/IconSideNav/IconSideNav.svelte
new file mode 100644
index 0000000000..e8144402e4
--- /dev/null
+++ b/packages/bbui/src/IconSideNav/IconSideNav.svelte
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/packages/bbui/src/IconSideNav/IconSideNavItem.svelte b/packages/bbui/src/IconSideNav/IconSideNavItem.svelte
new file mode 100644
index 0000000000..46625c9707
--- /dev/null
+++ b/packages/bbui/src/IconSideNav/IconSideNavItem.svelte
@@ -0,0 +1,56 @@
+
+
+ (showTooltip = true)}
+ on:focus={() => (showTooltip = true)}
+ on:mouseleave={() => (showTooltip = false)}
+ on:click
+>
+
+ {#if tooltip && showTooltip}
+
+
+
+ {/if}
+
+
+
diff --git a/packages/bbui/src/Notification/NotificationDisplay.svelte b/packages/bbui/src/Notification/NotificationDisplay.svelte
index 0b846f06ce..0f7e93eb23 100644
--- a/packages/bbui/src/Notification/NotificationDisplay.svelte
+++ b/packages/bbui/src/Notification/NotificationDisplay.svelte
@@ -9,7 +9,7 @@
{#each $notifications as { type, icon, message, id, dismissable, action, wide } (id)}
-
+
.notifications {
position: fixed;
- top: 20px;
+ bottom: 40px;
left: 0;
right: 0;
margin: 0 auto;
diff --git a/packages/bbui/src/StatusLight/StatusLight.svelte b/packages/bbui/src/StatusLight/StatusLight.svelte
index f56fee0c2a..a0c72443a6 100644
--- a/packages/bbui/src/StatusLight/StatusLight.svelte
+++ b/packages/bbui/src/StatusLight/StatusLight.svelte
@@ -17,10 +17,13 @@
export let negative = false
export let disabled = false
export let active = false
+ export let color = null
+
+
diff --git a/packages/bbui/src/Tabs/Tab.svelte b/packages/bbui/src/Tabs/Tab.svelte
index 04791619dc..c25be7dbc9 100644
--- a/packages/bbui/src/Tabs/Tab.svelte
+++ b/packages/bbui/src/Tabs/Tab.svelte
@@ -79,4 +79,10 @@
.emphasized {
color: var(--spectrum-global-color-blue-600);
}
+ .spectrum-Tabs-item {
+ color: var(--spectrum-global-color-gray-600);
+ }
+ .spectrum-Tabs-item.is-selected {
+ color: var(--spectrum-global-color-gray-900);
+ }
diff --git a/packages/bbui/src/Tabs/Tabs.svelte b/packages/bbui/src/Tabs/Tabs.svelte
index 579c61e28d..74edc9cd02 100644
--- a/packages/bbui/src/Tabs/Tabs.svelte
+++ b/packages/bbui/src/Tabs/Tabs.svelte
@@ -10,8 +10,7 @@
export let noHorizPadding = false
export let quiet = false
export let emphasized = false
- // overlay content from the tab bar onto tabs e.g. for a dropdown
- export let onTop = false
+ export let size = "M"
let thisSelected = undefined
@@ -74,20 +73,18 @@
@@ -98,26 +95,26 @@
/>
diff --git a/packages/bbui/src/index.js b/packages/bbui/src/index.js
index 2b16f32b84..7d5baad474 100644
--- a/packages/bbui/src/index.js
+++ b/packages/bbui/src/index.js
@@ -64,6 +64,9 @@ export { default as BannerDisplay } from "./Banner/BannerDisplay.svelte"
export { default as MarkdownEditor } from "./Markdown/MarkdownEditor.svelte"
export { default as MarkdownViewer } from "./Markdown/MarkdownViewer.svelte"
export { default as RichTextField } from "./Form/RichTextField.svelte"
+export { default as IconSideNav } from "./IconSideNav/IconSideNav.svelte"
+export { default as IconSideNavItem } from "./IconSideNav/IconSideNavItem.svelte"
+export { default as Slider } from "./Form/Slider.svelte"
// Renderers
export { default as BoldRenderer } from "./Table/BoldRenderer.svelte"
diff --git a/packages/bbui/yarn.lock b/packages/bbui/yarn.lock
index 0bff3e86d9..d301afea53 100644
--- a/packages/bbui/yarn.lock
+++ b/packages/bbui/yarn.lock
@@ -206,6 +206,11 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/sidenav/-/sidenav-3.0.2.tgz#9d70f408d588ee79c69857751010333671f32713"
integrity sha512-YpIdH/F0jEICYmoduGrnkTmxwJq1kfKxEp0wOs+ZkQOsvKMv1an7nyhsfOKCQqcGNfYzJ9mJAk7/u5+vsxHa8g==
+"@spectrum-css/slider@3.0.1":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@spectrum-css/slider/-/slider-3.0.1.tgz#5281e6f47eb5a4fd3d1816c138bf66d01d7f2e49"
+ integrity sha512-DI2dtMRnQuDM1miVzl3SGyR1khUEKnwdXfO5EHDFwkC3yav43F5QogkfjmjFmWWobMVovdJlAuiaaJ/IHejD0Q==
+
"@spectrum-css/statuslight@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/statuslight/-/statuslight-3.0.2.tgz#dc54b6cd113413dcdb909c486b5d7bae60db65c5"
@@ -226,10 +231,10 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/table/-/table-3.0.2.tgz#c666743d569fef81ddc8810fac8cda53b315f8d7"
integrity sha512-nt/QNC7NmUank0wozd4FySEX1UIYXuvuOKDyN1II3sxfwFSpJfp/Df9KVMhrYs4EsmB4XMGcoxp8ND/CrvH3ow==
-"@spectrum-css/tabs@^3.0.1":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@spectrum-css/tabs/-/tabs-3.0.2.tgz#822316672e7b0dfba66faa988e638ddae18c700e"
- integrity sha512-4RNcmwf0wxLpB7M54H02owlj0mKE8neL1+lytQpxOOhlwTO5zdsD82zjvx9tIc8tRnRKuhCCCwTuBxHYstnBmw==
+"@spectrum-css/tabs@^3.2.12":
+ version "3.2.12"
+ resolved "https://registry.yarnpkg.com/@spectrum-css/tabs/-/tabs-3.2.12.tgz#9b08f23d5aa881b3441af7757800c7173e5685ff"
+ integrity sha512-rPFUW9SSW4+3/UJ3UrtY2/l3sQvlqB1fqxHLPDjgykvbfrnMejcCTNV4ZrFNHXpE/6+kGnk+yVViSPtWGwJzkA==
"@spectrum-css/tags@^3.0.2":
version "3.0.2"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 109fd6db0e..f4312a1530 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "1.0.219-alpha.17",
+ "version": "1.0.220-alpha.3",
"license": "GPL-3.0",
"private": true,
"scripts": {
@@ -69,10 +69,10 @@
}
},
"dependencies": {
- "@budibase/bbui": "^1.0.219-alpha.17",
- "@budibase/client": "^1.0.219-alpha.17",
- "@budibase/frontend-core": "^1.0.219-alpha.17",
- "@budibase/string-templates": "^1.0.219-alpha.17",
+ "@budibase/bbui": "^1.0.220-alpha.3",
+ "@budibase/client": "^1.0.220-alpha.3",
+ "@budibase/frontend-core": "^1.0.220-alpha.3",
+ "@budibase/string-templates": "^1.0.220-alpha.3",
"@sentry/browser": "5.19.1",
"@spectrum-css/page": "^3.0.1",
"@spectrum-css/vars": "^3.0.1",
@@ -95,7 +95,7 @@
"@babel/preset-env": "^7.13.12",
"@babel/runtime": "^7.13.10",
"@rollup/plugin-replace": "^2.4.2",
- "@roxi/routify": "2.18.0",
+ "@roxi/routify": "2.18.5",
"@sveltejs/vite-plugin-svelte": "1.0.0-next.19",
"@testing-library/jest-dom": "^5.11.10",
"@testing-library/svelte": "^3.0.0",
@@ -113,7 +113,7 @@
"rollup": "^2.44.0",
"rollup-plugin-copy": "^3.4.0",
"start-server-and-test": "^1.12.1",
- "svelte": "^3.38.2",
+ "svelte": "^3.48.0",
"svelte-jester": "^1.3.2",
"ts-node": "^10.4.0",
"tsconfig-paths": "4.0.0",
diff --git a/packages/builder/src/builderStore/dataBinding.js b/packages/builder/src/builderStore/dataBinding.js
index 234f83d7cc..bebd06c6d7 100644
--- a/packages/builder/src/builderStore/dataBinding.js
+++ b/packages/builder/src/builderStore/dataBinding.js
@@ -20,7 +20,7 @@ import {
} from "@budibase/string-templates"
import { TableNames } from "../constants"
import { JSONUtils } from "@budibase/frontend-core"
-import ActionDefinitions from "components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/manifest.json"
+import ActionDefinitions from "components/design/settings/controls/ButtonActionEditor/manifest.json"
// Regex to match all instances of template strings
const CAPTURE_VAR_INSIDE_TEMPLATE = /{{([^}]+)}}/g
@@ -478,11 +478,17 @@ const getUrlBindings = asset => {
}
})
const safeURL = makePropSafe("url")
- return params.map(param => ({
+ const urlParamBindings = params.map(param => ({
type: "context",
runtimeBinding: `${safeURL}.${makePropSafe(param)}`,
readableBinding: `URL.${param}`,
}))
+ const queryParamsBinding = {
+ type: "context",
+ runtimeBinding: makePropSafe("query"),
+ readableBinding: "Query params",
+ }
+ return urlParamBindings.concat([queryParamsBinding])
}
const getRoleBindings = () => {
@@ -782,6 +788,13 @@ export const getAllStateVariables = () => {
})
})
+ // Add on load settings from screens
+ get(store).screens.forEach(screen => {
+ if (screen.onLoad) {
+ eventSettings.push(screen.onLoad)
+ }
+ })
+
// Extract all state keys from any "update state" actions in each setting
let bindingSet = new Set()
eventSettings.forEach(setting => {
diff --git a/packages/builder/src/builderStore/index.js b/packages/builder/src/builderStore/index.js
index 619bdd94a1..28ef1f4376 100644
--- a/packages/builder/src/builderStore/index.js
+++ b/packages/builder/src/builderStore/index.js
@@ -1,65 +1,77 @@
import { getFrontendStore } from "./store/frontend"
import { getAutomationStore } from "./store/automation"
import { getThemeStore } from "./store/theme"
-import { derived, writable } from "svelte/store"
-import { FrontendTypes, LAYOUT_NAMES } from "../constants"
+import { derived } from "svelte/store"
+import { LAYOUT_NAMES } from "../constants"
import { findComponent, findComponentPath } from "./componentUtils"
+import { RoleUtils } from "@budibase/frontend-core"
export const store = getFrontendStore()
export const automationStore = getAutomationStore()
export const themeStore = getThemeStore()
-export const currentAsset = derived(store, $store => {
- const type = $store.currentFrontEndType
- if (type === FrontendTypes.SCREEN) {
- return $store.screens.find(screen => screen._id === $store.selectedScreenId)
- } else if (type === FrontendTypes.LAYOUT) {
- return $store.layouts.find(layout => layout._id === $store.selectedLayoutId)
- }
- return null
+export const selectedScreen = derived(store, $store => {
+ return $store.screens.find(screen => screen._id === $store.selectedScreenId)
+})
+
+export const selectedLayout = derived(store, $store => {
+ return $store.layouts?.find(layout => layout._id === $store.selectedLayoutId)
})
export const selectedComponent = derived(
- [store, currentAsset],
- ([$store, $currentAsset]) => {
- if (!$currentAsset || !$store.selectedComponentId) {
+ [store, selectedScreen],
+ ([$store, $selectedScreen]) => {
+ if (!$selectedScreen || !$store.selectedComponentId) {
return null
}
- return findComponent($currentAsset?.props, $store.selectedComponentId)
+ return findComponent($selectedScreen?.props, $store.selectedComponentId)
}
)
+export const sortedScreens = derived(store, $store => {
+ return $store.screens.slice().sort((a, b) => {
+ // Sort by role first
+ const roleA = RoleUtils.getRolePriority(a.routing.roleId)
+ const roleB = RoleUtils.getRolePriority(b.routing.roleId)
+ if (roleA !== roleB) {
+ return roleA > roleB ? -1 : 1
+ }
+ // Then put home screens first
+ const homeA = !!a.routing.homeScreen
+ const homeB = !!b.routing.homeScreen
+ if (homeA !== homeB) {
+ return homeA ? -1 : 1
+ }
+ // Then sort alphabetically by each URL param
+ const aParams = a.routing.route.split("/")
+ const bParams = b.routing.route.split("/")
+ let minParams = Math.min(aParams.length, bParams.length)
+ for (let i = 0; i < minParams; i++) {
+ if (aParams[i] === bParams[i]) {
+ continue
+ }
+ return aParams[i] < bParams[i] ? -1 : 1
+ }
+ // Then sort by the fewest amount of URL params
+ return aParams.length < bParams.length ? -1 : 1
+ })
+})
+
export const selectedComponentPath = derived(
- [store, currentAsset],
- ([$store, $currentAsset]) => {
+ [store, selectedScreen],
+ ([$store, $selectedScreen]) => {
return findComponentPath(
- $currentAsset?.props,
+ $selectedScreen?.props,
$store.selectedComponentId
).map(component => component._id)
}
)
-export const currentAssetId = derived(store, $store => {
- return $store.currentFrontEndType === FrontendTypes.SCREEN
- ? $store.selectedScreenId
- : $store.selectedLayoutId
-})
-
-export const currentAssetName = derived(currentAsset, $currentAsset => {
- return $currentAsset?.name
-})
-
-// leave this as before for consistency
-export const allScreens = derived(store, $store => {
- return $store.screens
-})
-
export const mainLayout = derived(store, $store => {
return $store.layouts?.find(
layout => layout._id === LAYOUT_NAMES.MASTER.PRIVATE
)
})
-export const selectedAccessRole = writable("BASIC")
-
-export const screenSearchString = writable(null)
+// For compatibility
+export const currentAsset = selectedScreen
diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js
index ec810e5c31..16ae5ce215 100644
--- a/packages/builder/src/builderStore/store/frontend.js
+++ b/packages/builder/src/builderStore/store/frontend.js
@@ -1,12 +1,6 @@
import { get, writable } from "svelte/store"
import { cloneDeep } from "lodash/fp"
-import {
- allScreens,
- currentAsset,
- mainLayout,
- selectedComponent,
- selectedAccessRole,
-} from "builderStore"
+import { currentAsset, mainLayout, selectedComponent } from "builderStore"
import {
datasources,
integrations,
@@ -15,7 +9,6 @@ import {
tables,
} from "stores/backend"
import { API } from "api"
-import { FrontendTypes } from "constants"
import analytics, { Events } from "analytics"
import {
findComponentType,
@@ -27,6 +20,7 @@ import {
makeComponentUnique,
} from "../componentUtils"
import { Helpers } from "@budibase/bbui"
+import { DefaultAppTheme, LAYOUT_NAMES } from "../../constants"
const INITIAL_FRONTEND_STATE = {
apps: [],
@@ -47,10 +41,6 @@ const INITIAL_FRONTEND_STATE = {
messagePassing: false,
continueIfAction: false,
},
- currentFrontEndType: "none",
- selectedScreenId: "",
- selectedLayoutId: "",
- selectedComponentId: "",
errors: [],
hasAppPackage: false,
libraries: null,
@@ -61,6 +51,11 @@ const INITIAL_FRONTEND_STATE = {
customTheme: {},
previewDevice: "desktop",
highlightedSettingKey: null,
+
+ // URL params
+ selectedScreenId: null,
+ selectedComponentId: null,
+ selectedLayoutId: null,
}
export const getFrontendStore = () => {
@@ -100,6 +95,7 @@ export const getFrontendStore = () => {
previousTopNavPath: {},
version: application.version,
revertableVersion: application.revertableVersion,
+ navigation: application.navigation || {},
}))
// Initialise backend stores
@@ -108,6 +104,35 @@ export const getFrontendStore = () => {
await integrations.init()
await queries.init()
await tables.init()
+
+ // Add navigation settings to old apps
+ if (!application.navigation) {
+ const layout = layouts.find(x => x._id === LAYOUT_NAMES.MASTER.PRIVATE)
+ const customTheme = application.customTheme
+ let navigationSettings = {
+ navigation: "Top",
+ title: application.name,
+ navWidth: "Large",
+ navBackground:
+ customTheme?.navBackground || DefaultAppTheme.navBackground,
+ navTextColor:
+ customTheme?.navTextColor || DefaultAppTheme.navTextColor,
+ }
+ if (layout) {
+ navigationSettings.hideLogo = layout.props.hideLogo
+ navigationSettings.hideTitle = layout.props.hideTitle
+ navigationSettings.title = layout.props.title || application.name
+ navigationSettings.logoUrl = layout.props.logoUrl
+ navigationSettings.links = layout.props.links
+ navigationSettings.navigation = layout.props.navigation || "Top"
+ navigationSettings.sticky = layout.props.sticky
+ navigationSettings.navWidth = layout.props.width || "Large"
+ if (navigationSettings.navigation === "None") {
+ navigationSettings.navigation = "Top"
+ }
+ }
+ await store.actions.navigation.save(navigationSettings)
+ }
},
theme: {
save: async theme => {
@@ -135,6 +160,19 @@ export const getFrontendStore = () => {
})
},
},
+ navigation: {
+ save: async navigation => {
+ const appId = get(store).appId
+ await API.saveAppMetadata({
+ appId,
+ metadata: { navigation },
+ })
+ store.update(state => {
+ state.navigation = navigation
+ return state
+ })
+ },
+ },
routing: {
fetch: async () => {
const response = await API.fetchAppRoutes()
@@ -147,18 +185,12 @@ export const getFrontendStore = () => {
screens: {
select: screenId => {
store.update(state => {
- let screens = get(allScreens)
+ let screens = state.screens
let screen =
screens.find(screen => screen._id === screenId) || screens[0]
if (!screen) return state
- // Update role to the screen's role setting so that it will always
- // be visible
- selectedAccessRole.set(screen.routing.roleId)
-
- state.currentFrontEndType = FrontendTypes.SCREEN
state.selectedScreenId = screen._id
- state.currentView = "detail"
state.selectedComponentId = screen.props?._id
return state
})
@@ -221,16 +253,44 @@ export const getFrontendStore = () => {
// Refresh routes
await store.actions.routing.fetch()
},
+ updateHomeScreen: async (screen, makeHomeScreen = true) => {
+ let promises = []
+
+ // Find any existing home screen for this role so we can remove it,
+ // if we are setting this to be the new home screen
+ if (makeHomeScreen) {
+ const roleId = screen.routing.roleId
+ let existingHomeScreen = get(store).screens.find(s => {
+ return (
+ s.routing.roleId === roleId &&
+ s.routing.homeScreen &&
+ s._id !== screen._id
+ )
+ })
+ if (existingHomeScreen) {
+ existingHomeScreen.routing.homeScreen = false
+ promises.push(store.actions.screens.save(existingHomeScreen))
+ }
+ }
+
+ // Update the passed in screen
+ screen.routing.homeScreen = makeHomeScreen
+ promises.push(store.actions.screens.save(screen))
+ return await Promise.all(promises)
+ },
+ removeCustomLayout: async screen => {
+ // Pull relevant settings from old layout, if required
+ const layout = get(store).layouts.find(x => x._id === screen.layoutId)
+ screen.layoutId = null
+ screen.showNavigation = layout?.props.navigation !== "None"
+ screen.width = layout?.props.width || "Large"
+ await store.actions.screens.save(screen)
+ },
},
preview: {
saveSelected: async () => {
- const state = get(store)
const selectedAsset = get(currentAsset)
- if (state.currentFrontEndType !== FrontendTypes.LAYOUT) {
- return await store.actions.screens.save(selectedAsset)
- } else {
- return await store.actions.layouts.save(selectedAsset)
- }
+ return await store.actions.screens.save(selectedAsset)
},
setDevice: device => {
store.update(state => {
@@ -245,8 +305,6 @@ export const getFrontendStore = () => {
const layout =
store.actions.layouts.find(layoutId) || get(store).layouts[0]
if (!layout) return
- state.currentFrontEndType = FrontendTypes.LAYOUT
- state.currentView = "detail"
state.selectedLayoutId = layout._id
state.selectedComponentId = layout.props?._id
return state
@@ -297,32 +355,6 @@ export const getFrontendStore = () => {
},
},
components: {
- select: component => {
- const asset = get(currentAsset)
- if (!asset || !component) {
- return
- }
-
- // If this is the root component, select the asset instead
- const parent = findComponentParent(asset.props, component._id)
- if (parent == null) {
- const state = get(store)
- const isLayout = state.currentFrontEndType === FrontendTypes.LAYOUT
- if (isLayout) {
- store.actions.layouts.select(asset._id)
- } else {
- store.actions.screens.select(asset._id)
- }
- return
- }
-
- // Otherwise select the component
- store.update(state => {
- state.selectedComponentId = component._id
- state.currentView = "component"
- return state
- })
- },
getDefinition: componentName => {
if (!componentName) {
return null
@@ -418,7 +450,6 @@ export const getFrontendStore = () => {
// Save components and update UI
await store.actions.preview.saveSelected()
store.update(state => {
- state.currentView = "component"
state.selectedComponentId = componentInstance._id
return state
})
@@ -461,11 +492,14 @@ export const getFrontendStore = () => {
parent._children = parent._children.filter(
child => child._id !== component._id
)
- store.actions.components.select(parent)
+ store.update(state => {
+ state.selectedComponentId = parent._id
+ return state
+ })
}
await store.actions.preview.saveSelected()
},
- copy: (component, cut = false) => {
+ copy: (component, cut = false, selectParent = true) => {
const selectedAsset = get(currentAsset)
if (!selectedAsset) {
return null
@@ -485,7 +519,12 @@ export const getFrontendStore = () => {
parent._children = parent._children.filter(
child => child._id !== component._id
)
- store.actions.components.select(parent)
+ if (selectParent) {
+ store.update(state => {
+ state.selectedComponentId = parent._id
+ return state
+ })
+ }
}
}
},
@@ -536,7 +575,7 @@ export const getFrontendStore = () => {
// Save and select the new component
promises.push(store.actions.preview.saveSelected())
- store.actions.components.select(componentToPaste)
+ state.selectedComponentId = componentToPaste._id
return state
})
await Promise.all(promises)
@@ -578,35 +617,38 @@ export const getFrontendStore = () => {
},
links: {
save: async (url, title) => {
- const layout = get(mainLayout)
- if (!layout) {
+ const navigation = get(store).navigation
+ let links = [...navigation?.links]
+
+ // Skip if we have an identical link
+ if (links.find(link => link.url === url && link.text === title)) {
return
}
- // Add link setting to main layout
- if (!layout.props.links) {
- layout.props.links = []
- }
- layout.props.links.push({
+ links.push({
text: title,
url,
})
-
- await store.actions.layouts.save(layout)
+ await store.actions.navigation.save({
+ ...navigation,
+ links: [...links],
+ })
},
delete: async urls => {
- const layout = get(mainLayout)
- if (!layout?.props.links?.length) {
+ const navigation = get(store).navigation
+ let links = navigation?.links
+ if (!links?.length) {
return
}
// Filter out the URLs to delete
urls = Array.isArray(urls) ? urls : [urls]
- layout.props.links = layout.props.links.filter(
- link => !urls.includes(link.url)
- )
+ links = links.filter(link => !urls.includes(link.url))
- await store.actions.layouts.save(layout)
+ await store.actions.navigation.save({
+ ...navigation,
+ links,
+ })
},
},
settings: {
diff --git a/packages/builder/src/builderStore/store/screenTemplates/utils/Screen.js b/packages/builder/src/builderStore/store/screenTemplates/utils/Screen.js
index 272f627163..6fc79e53b0 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/utils/Screen.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/utils/Screen.js
@@ -5,7 +5,8 @@ export class Screen extends BaseStructure {
constructor() {
super(true)
this._json = {
- layoutId: "layout_private_master",
+ showNavigation: true,
+ width: "Large",
props: {
_id: Helpers.uuid(),
_component: "@budibase/standard-components/container",
@@ -26,6 +27,7 @@ export class Screen extends BaseStructure {
routing: {
route: "",
roleId: "BASIC",
+ homeScreen: false,
},
name: "screen-id",
}
diff --git a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte
index 7b189ad109..c149b6a00e 100644
--- a/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte
+++ b/packages/builder/src/components/automation/SetupPanel/AutomationBlockSetup.svelte
@@ -26,7 +26,7 @@
import CronBuilder from "./CronBuilder.svelte"
import Editor from "components/integration/QueryEditor.svelte"
import ModalBindableInput from "components/common/bindings/ModalBindableInput.svelte"
- import FilterDrawer from "components/design/PropertiesPanel/PropertyControls/FilterEditor/FilterDrawer.svelte"
+ import FilterDrawer from "components/design/settings/controls/FilterEditor/FilterDrawer.svelte"
import { LuceneUtils } from "@budibase/frontend-core"
import { getSchemaForTable } from "builderStore/dataBinding"
import { Utils } from "@budibase/frontend-core"
diff --git a/packages/builder/src/components/backend/DataTable/buttons/TableFilterButton.svelte b/packages/builder/src/components/backend/DataTable/buttons/TableFilterButton.svelte
index cf9e4b1358..633c7e1ad1 100644
--- a/packages/builder/src/components/backend/DataTable/buttons/TableFilterButton.svelte
+++ b/packages/builder/src/components/backend/DataTable/buttons/TableFilterButton.svelte
@@ -1,7 +1,7 @@
-
+
-
+
- import { notifications, Select } from "@budibase/bbui"
- import { store } from "builderStore"
- import { get } from "svelte/store"
-
- const themeOptions = [
- {
- label: "Lightest",
- value: "spectrum--lightest",
- },
- {
- label: "Light",
- value: "spectrum--light",
- },
- {
- label: "Dark",
- value: "spectrum--dark",
- },
- {
- label: "Darkest",
- value: "spectrum--darkest",
- },
- ]
-
- const onChangeTheme = async theme => {
- try {
- await store.actions.theme.save(theme)
- await store.actions.customTheme.save({
- ...get(store).customTheme,
- navBackground:
- theme === "spectrum--light"
- ? "var(--spectrum-global-color-gray-50)"
- : "var(--spectrum-global-color-gray-100)",
- })
- } catch (error) {
- notifications.error("Error updating theme")
- }
- }
-
-
-
-
-
-
diff --git a/packages/builder/src/components/design/AppPreview/ComponentSelectionList.svelte b/packages/builder/src/components/design/AppPreview/ComponentSelectionList.svelte
deleted file mode 100644
index cabcea756e..0000000000
--- a/packages/builder/src/components/design/AppPreview/ComponentSelectionList.svelte
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
- {#each enrichedStructure as item}
-
- onItemChosen(item)}
- >
-
- {item.name}
- {#if item.isCategory}
-
- {/if}
-
-
- {#each item.children || [] as item}
- {#if !item.showOnAsset || item.showOnAsset.includes($currentAssetName)}
-
- {/if}
- {/each}
-
- {/each}
-
-
-
diff --git a/packages/builder/src/components/design/AppPreview/ThemeEditor.svelte b/packages/builder/src/components/design/AppPreview/ThemeEditor.svelte
deleted file mode 100644
index e10ac4f0cd..0000000000
--- a/packages/builder/src/components/design/AppPreview/ThemeEditor.svelte
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/builder/src/components/design/AppPreview/index.js b/packages/builder/src/components/design/AppPreview/index.js
deleted file mode 100644
index 61030700ec..0000000000
--- a/packages/builder/src/components/design/AppPreview/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from "./CurrentItemPreview.svelte"
diff --git a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/ComponentTree.svelte b/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/ComponentTree.svelte
deleted file mode 100644
index 6b78bc40c1..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/ComponentTree.svelte
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
- {#each components || [] as component, index (component._id)}
- - selectComponent(component)}>
- {#if $dragDropStore?.targetComponent === component && $dragDropStore.dropPosition === DropPosition.ABOVE}
-
- {/if}
-
- toggleNodeOpen(component._id)}
- on:drop={onDrop}
- text={getComponentText(component)}
- withArrow
- indentLevel={level + 1}
- selected={$store.selectedComponentId === component._id}
- opened={isOpen(component, $selectedComponentPath, closedNodes)}
- >
-
-
-
- {#if isOpen(component, $selectedComponentPath, closedNodes)}
-
- {/if}
-
- {#if $dragDropStore?.targetComponent === component && ($dragDropStore.dropPosition === DropPosition.INSIDE || $dragDropStore.dropPosition === DropPosition.BELOW)}
-
- {/if}
-
- {/each}
-
-
-
diff --git a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/LayoutDropdownMenu.svelte b/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/LayoutDropdownMenu.svelte
deleted file mode 100644
index e54beb9e41..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/LayoutDropdownMenu.svelte
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/PathDropdownMenu.svelte b/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/PathDropdownMenu.svelte
deleted file mode 100644
index 6de656b6b5..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/PathDropdownMenu.svelte
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- Are you sure you want to delete all screens under the {path} route?
-
- The following screens will be deleted:
-
- {#each screens as screen}
-
{screen.route}
- {/each}
-
-
-
-
-
diff --git a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/PathTree.svelte b/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/PathTree.svelte
deleted file mode 100644
index 3d6984cf14..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/PathTree.svelte
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-{#if !noSearchMatch}
-
-
-
-
- {#if routeOpened}
- {#each filteredScreens as screen (screen.id)}
- changeScreen(screen.id)}
- >
-
-
- {#if selectedScreen?._id === screen.id}
-
- {/if}
- {/each}
- {/if}
-{/if}
diff --git a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/dragDropStore.js b/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/dragDropStore.js
deleted file mode 100644
index d965a2456d..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/dragDropStore.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import { writable, get } from "svelte/store"
-import { store as frontendStore } from "builderStore"
-import { findComponentPath } from "builderStore/componentUtils"
-
-export const DropEffect = {
- MOVE: "move",
- COPY: "copy",
-}
-
-export const DropPosition = {
- ABOVE: "above",
- BELOW: "below",
- INSIDE: "inside",
-}
-
-export default function () {
- const store = writable({})
-
- store.actions = {
- dragstart: component => {
- store.update(state => {
- state.dragged = component
- return state
- })
- },
- dragover: ({
- component,
- index,
- canHaveChildrenButIsEmpty,
- mousePosition,
- }) => {
- store.update(state => {
- state.targetComponent = component
- // only allow dropping inside when container is empty
- // if container has children, drag over them
-
- if (canHaveChildrenButIsEmpty && index === 0) {
- // hovered above center of target
- if (mousePosition < 0.4) {
- state.dropPosition = DropPosition.ABOVE
- }
-
- // hovered around bottom of target
- if (mousePosition > 0.8) {
- state.dropPosition = DropPosition.BELOW
- }
-
- // hovered in center of target
- if (mousePosition > 0.4 && mousePosition < 0.8) {
- state.dropPosition = DropPosition.INSIDE
- }
- return state
- }
-
- // bottom half
- if (mousePosition > 0.5) {
- state.dropPosition = DropPosition.BELOW
- } else {
- state.dropPosition = canHaveChildrenButIsEmpty
- ? DropPosition.INSIDE
- : DropPosition.ABOVE
- }
-
- return state
- })
- },
- reset: () => {
- store.update(state => {
- state.dropPosition = ""
- state.targetComponent = null
- state.dragged = null
- return state
- })
- },
- drop: async () => {
- const state = get(store)
-
- // Stop if the target and source are the same
- if (state.targetComponent === state.dragged) {
- return
- }
- // Stop if the target or source are null
- if (!state.targetComponent || !state.dragged) {
- return
- }
- // Stop if the target is a child of source
- const path = findComponentPath(state.dragged, state.targetComponent._id)
- const ids = path.map(component => component._id)
- if (ids.includes(state.targetComponent._id)) {
- return
- }
-
- // Cut and paste the component
- frontendStore.actions.components.copy(state.dragged, true)
- await frontendStore.actions.components.paste(
- state.targetComponent,
- state.dropPosition
- )
- store.actions.reset()
- },
- }
-
- return store
-}
diff --git a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/index.svelte b/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/index.svelte
deleted file mode 100644
index ed064f8307..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/ComponentNavigationTree/index.svelte
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
- {#each paths as path, idx (path)}
-
0} {path} route={routes[path]} />
- {/each}
- {#if !paths.length}
-
- There aren't any screens configured with this access role.
-
- {/if}
-
-
-
diff --git a/packages/builder/src/components/design/NavigationPanel/FrontendNavigatePane.svelte b/packages/builder/src/components/design/NavigationPanel/FrontendNavigatePane.svelte
deleted file mode 100644
index 0611d4fc71..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/FrontendNavigatePane.svelte
+++ /dev/null
@@ -1,229 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#each $store.layouts as layout, idx (layout._id)}
- 0} />
- {/each}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/builder/src/components/design/NavigationPanel/Layout.svelte b/packages/builder/src/components/design/NavigationPanel/Layout.svelte
deleted file mode 100644
index d3c89fc9e5..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/Layout.svelte
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-{#if $store.selectedLayoutId === layout._id && layout.props?._children}
-
-{/if}
diff --git a/packages/builder/src/components/design/NavigationPanel/NavigationSelectionModal.svelte b/packages/builder/src/components/design/NavigationPanel/NavigationSelectionModal.svelte
deleted file mode 100644
index 52a8e91451..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/NavigationSelectionModal.svelte
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
- (blankSelected ? chooseModal(1) : chooseModal(0))}
- size="M"
- onConfirm={() => {
- save(createdScreens)
- }}
- disabled={!selectedNav}
->
- Please select your preferred layout for the new application:
-
-
-
(selectedNav = "Left")}
- class:unselected={selectedNav && selectedNav !== "Left"}
- >
-
-
Side Nav
-
-
(selectedNav = "Top")}
- class:unselected={selectedNav && selectedNav !== "Top"}
- >
-
-
Top Nav
-
-
(selectedNav = "None")}
- class:unselected={selectedNav && selectedNav !== "None"}
- >
-
-
No Nav
-
-
-
-
-
diff --git a/packages/builder/src/components/design/NavigationPanel/NewLayoutModal.svelte b/packages/builder/src/components/design/NavigationPanel/NewLayoutModal.svelte
deleted file mode 100644
index d7288fbe23..0000000000
--- a/packages/builder/src/components/design/NavigationPanel/NewLayoutModal.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
diff --git a/packages/builder/src/components/design/Panel.svelte b/packages/builder/src/components/design/Panel.svelte
new file mode 100644
index 0000000000..c1eab881d5
--- /dev/null
+++ b/packages/builder/src/components/design/Panel.svelte
@@ -0,0 +1,112 @@
+
+
+
+
+
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertiesPanel.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertiesPanel.svelte
deleted file mode 100644
index df91a87456..0000000000
--- a/packages/builder/src/components/design/PropertiesPanel/PropertiesPanel.svelte
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
- {#key componentInstance?._id}
-
-
-
-
-
- {/key}
-
-
-
-
-
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/NavigationEditor/NavigationEditor.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/NavigationEditor/NavigationEditor.svelte
deleted file mode 100644
index 33a82d1886..0000000000
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/NavigationEditor/NavigationEditor.svelte
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-Configure links
-
-
- Configure the links in your navigation bar.
-
-
-
-
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/componentSettings.js b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/componentSettings.js
deleted file mode 100644
index 23a0a312bc..0000000000
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/componentSettings.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import { Checkbox, Select, Stepper } from "@budibase/bbui"
-import DataSourceSelect from "./DataSourceSelect.svelte"
-import S3DataSourceSelect from "./S3DataSourceSelect.svelte"
-import DataProviderSelect from "./DataProviderSelect.svelte"
-import ButtonActionEditor from "./ButtonActionEditor/ButtonActionEditor.svelte"
-import TableSelect from "./TableSelect.svelte"
-import ColorPicker from "./ColorPicker.svelte"
-import { IconSelect } from "./IconSelect"
-import FieldSelect from "./FieldSelect.svelte"
-import MultiFieldSelect from "./MultiFieldSelect.svelte"
-import SearchFieldSelect from "./SearchFieldSelect.svelte"
-import SchemaSelect from "./SchemaSelect.svelte"
-import SectionSelect from "./SectionSelect.svelte"
-import NavigationEditor from "./NavigationEditor/NavigationEditor.svelte"
-import FilterEditor from "./FilterEditor/FilterEditor.svelte"
-import URLSelect from "./URLSelect.svelte"
-import OptionsEditor from "./OptionsEditor/OptionsEditor.svelte"
-import FormFieldSelect from "./FormFieldSelect.svelte"
-import ValidationEditor from "./ValidationEditor/ValidationEditor.svelte"
-import DrawerBindableCombobox from "components/common/bindings/DrawerBindableCombobox.svelte"
-import ColumnEditor from "./ColumnEditor/ColumnEditor.svelte"
-
-const componentMap = {
- text: DrawerBindableCombobox,
- select: Select,
- dataSource: DataSourceSelect,
- "dataSource/s3": S3DataSourceSelect,
- dataProvider: DataProviderSelect,
- boolean: Checkbox,
- number: Stepper,
- event: ButtonActionEditor,
- table: TableSelect,
- color: ColorPicker,
- icon: IconSelect,
- field: FieldSelect,
- multifield: MultiFieldSelect,
- searchfield: SearchFieldSelect,
- options: OptionsEditor,
- schema: SchemaSelect,
- section: SectionSelect,
- navigation: NavigationEditor,
- filter: FilterEditor,
- url: URLSelect,
- columns: ColumnEditor,
- "field/string": FormFieldSelect,
- "field/number": FormFieldSelect,
- "field/options": FormFieldSelect,
- "field/boolean": FormFieldSelect,
- "field/longform": FormFieldSelect,
- "field/datetime": FormFieldSelect,
- "field/attachment": FormFieldSelect,
- "field/link": FormFieldSelect,
- "field/array": FormFieldSelect,
- "field/json": FormFieldSelect,
- // Some validation types are the same as others, so not all types are
- // explicitly listed here. e.g. options uses string validation
- "validation/string": ValidationEditor,
- "validation/array": ValidationEditor,
- "validation/number": ValidationEditor,
- "validation/boolean": ValidationEditor,
- "validation/datetime": ValidationEditor,
- "validation/attachment": ValidationEditor,
- "validation/link": ValidationEditor,
-}
-
-export const getComponentForSettingType = type => {
- return componentMap[type]
-}
diff --git a/packages/builder/src/components/design/PropertiesPanel/ScreenSettingsSection.svelte b/packages/builder/src/components/design/PropertiesPanel/ScreenSettingsSection.svelte
deleted file mode 100644
index e0b46d8ed7..0000000000
--- a/packages/builder/src/components/design/PropertiesPanel/ScreenSettingsSection.svelte
+++ /dev/null
@@ -1,125 +0,0 @@
-
-
-{#if $store.currentView !== "component" && $currentAsset && $store.currentFrontEndType === FrontendTypes.SCREEN}
-
- {#each screenSettings as def (`${componentInstance._id}-${def.key}`)}
- setAssetProps(def.key, val, def.parser, def.validate)}
- {bindings}
- props={{ error: errors[def.key] }}
- />
- {/each}
-
-{/if}
diff --git a/packages/builder/src/components/design/settings/componentSettings.js b/packages/builder/src/components/design/settings/componentSettings.js
new file mode 100644
index 0000000000..56ae3de490
--- /dev/null
+++ b/packages/builder/src/components/design/settings/componentSettings.js
@@ -0,0 +1,77 @@
+import { Checkbox, Select, Stepper } from "@budibase/bbui"
+import DataSourceSelect from "./controls/DataSourceSelect.svelte"
+import S3DataSourceSelect from "./controls/S3DataSourceSelect.svelte"
+import DataProviderSelect from "./controls/DataProviderSelect.svelte"
+import ButtonActionEditor from "./controls/ButtonActionEditor/ButtonActionEditor.svelte"
+import TableSelect from "./controls/TableSelect.svelte"
+import ColorPicker from "./controls/ColorPicker.svelte"
+import { IconSelect } from "./controls/IconSelect"
+import FieldSelect from "./controls/FieldSelect.svelte"
+import MultiFieldSelect from "./controls/MultiFieldSelect.svelte"
+import SearchFieldSelect from "./controls/SearchFieldSelect.svelte"
+import SchemaSelect from "./controls/SchemaSelect.svelte"
+import SectionSelect from "./controls/SectionSelect.svelte"
+import FilterEditor from "./controls/FilterEditor/FilterEditor.svelte"
+import URLSelect from "./controls/URLSelect.svelte"
+import OptionsEditor from "./controls/OptionsEditor/OptionsEditor.svelte"
+import FormFieldSelect from "./controls/FormFieldSelect.svelte"
+import ValidationEditor from "./controls/ValidationEditor/ValidationEditor.svelte"
+import DrawerBindableCombobox from "components/common/bindings/DrawerBindableCombobox.svelte"
+import ColumnEditor from "./controls/ColumnEditor/ColumnEditor.svelte"
+import BarButtonList from "./controls/BarButtonList.svelte"
+
+const componentMap = {
+ text: DrawerBindableCombobox,
+ select: Select,
+ dataSource: DataSourceSelect,
+ "dataSource/s3": S3DataSourceSelect,
+ dataProvider: DataProviderSelect,
+ boolean: Checkbox,
+ number: Stepper,
+ event: ButtonActionEditor,
+ table: TableSelect,
+ color: ColorPicker,
+ icon: IconSelect,
+ field: FieldSelect,
+ multifield: MultiFieldSelect,
+ searchfield: SearchFieldSelect,
+ options: OptionsEditor,
+ schema: SchemaSelect,
+ section: SectionSelect,
+ filter: FilterEditor,
+ url: URLSelect,
+ columns: ColumnEditor,
+ "field/string": FormFieldSelect,
+ "field/number": FormFieldSelect,
+ "field/options": FormFieldSelect,
+ "field/boolean": FormFieldSelect,
+ "field/longform": FormFieldSelect,
+ "field/datetime": FormFieldSelect,
+ "field/attachment": FormFieldSelect,
+ "field/link": FormFieldSelect,
+ "field/array": FormFieldSelect,
+ "field/json": FormFieldSelect,
+ // Some validation types are the same as others, so not all types are
+ // explicitly listed here. e.g. options uses string validation
+ "validation/string": ValidationEditor,
+ "validation/array": ValidationEditor,
+ "validation/number": ValidationEditor,
+ "validation/boolean": ValidationEditor,
+ "validation/datetime": ValidationEditor,
+ "validation/attachment": ValidationEditor,
+ "validation/link": ValidationEditor,
+}
+
+export const getComponentForSetting = setting => {
+ const { type, showInBar, barStyle } = setting || {}
+ if (!type) {
+ return null
+ }
+
+ // We can show a clone of the bar settings for certain select settings
+ if (showInBar && type === "select" && barStyle === "buttons") {
+ return BarButtonList
+ }
+
+ return componentMap[type]
+}
diff --git a/packages/builder/src/components/design/settings/controls/BarButtonList.svelte b/packages/builder/src/components/design/settings/controls/BarButtonList.svelte
new file mode 100644
index 0000000000..339edb1f74
--- /dev/null
+++ b/packages/builder/src/components/design/settings/controls/BarButtonList.svelte
@@ -0,0 +1,18 @@
+
+
+
+ {#each options as option}
+ onChange(option.value)}
+ selected={option.value === value}
+ />
+ {/each}
+
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/ButtonActionDrawer.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/ButtonActionDrawer.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/ButtonActionDrawer.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/ButtonActionDrawer.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/ButtonActionEditor.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/ButtonActionEditor.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/ButtonActionEditor.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/ButtonActionEditor.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ChangeFormStep.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ChangeFormStep.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ChangeFormStep.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ChangeFormStep.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ClearForm.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ClearForm.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ClearForm.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ClearForm.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/CloseScreenModal.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/CloseScreenModal.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/CloseScreenModal.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/CloseScreenModal.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ContinueIf.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ContinueIf.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ContinueIf.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ContinueIf.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/DeleteRow.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/DeleteRow.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/DeleteRow.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/DeleteRow.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/DuplicateRow.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/DuplicateRow.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/DuplicateRow.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/DuplicateRow.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExecuteQuery.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExecuteQuery.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExecuteQuery.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExecuteQuery.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExportData.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExportData.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExportData.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ExportData.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/LogOut.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/LogOut.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/LogOut.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/LogOut.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/NavigateTo.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/NavigateTo.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/NavigateTo.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/NavigateTo.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/RefreshDataProvider.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/RefreshDataProvider.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/RefreshDataProvider.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/RefreshDataProvider.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/S3Upload.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/S3Upload.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/S3Upload.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/S3Upload.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/SaveFields.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/SaveFields.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/SaveFields.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/SaveFields.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/SaveRow.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/SaveRow.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/SaveRow.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/SaveRow.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/TriggerAutomation.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/TriggerAutomation.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/TriggerAutomation.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/TriggerAutomation.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/UpdateFieldValue.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/UpdateFieldValue.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/UpdateFieldValue.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/UpdateFieldValue.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/UpdateState.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/UpdateState.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/UpdateState.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/UpdateState.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ValidateForm.svelte b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ValidateForm.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ValidateForm.svelte
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/ValidateForm.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/index.js b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/index.js
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/index.js
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/actions/index.js
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/index.js b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/index.js
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/index.js
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/index.js
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/manifest.json b/packages/builder/src/components/design/settings/controls/ButtonActionEditor/manifest.json
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/manifest.json
rename to packages/builder/src/components/design/settings/controls/ButtonActionEditor/manifest.json
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColorPicker.svelte b/packages/builder/src/components/design/settings/controls/ColorPicker.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColorPicker.svelte
rename to packages/builder/src/components/design/settings/controls/ColorPicker.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/CellDrawer.svelte b/packages/builder/src/components/design/settings/controls/ColumnEditor/CellDrawer.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/CellDrawer.svelte
rename to packages/builder/src/components/design/settings/controls/ColumnEditor/CellDrawer.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/CellEditor.svelte b/packages/builder/src/components/design/settings/controls/ColumnEditor/CellEditor.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/CellEditor.svelte
rename to packages/builder/src/components/design/settings/controls/ColumnEditor/CellEditor.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/ColumnDrawer.svelte b/packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnDrawer.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/ColumnDrawer.svelte
rename to packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnDrawer.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/ColumnEditor.svelte b/packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnEditor.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColumnEditor/ColumnEditor.svelte
rename to packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnEditor.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/DataProviderSelect.svelte b/packages/builder/src/components/design/settings/controls/DataProviderSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/DataProviderSelect.svelte
rename to packages/builder/src/components/design/settings/controls/DataProviderSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/DataSourceSelect.svelte b/packages/builder/src/components/design/settings/controls/DataSourceSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/DataSourceSelect.svelte
rename to packages/builder/src/components/design/settings/controls/DataSourceSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FieldSelect.svelte b/packages/builder/src/components/design/settings/controls/FieldSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FieldSelect.svelte
rename to packages/builder/src/components/design/settings/controls/FieldSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FilterEditor/FilterDrawer.svelte b/packages/builder/src/components/design/settings/controls/FilterEditor/FilterDrawer.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FilterEditor/FilterDrawer.svelte
rename to packages/builder/src/components/design/settings/controls/FilterEditor/FilterDrawer.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FilterEditor/FilterEditor.svelte b/packages/builder/src/components/design/settings/controls/FilterEditor/FilterEditor.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FilterEditor/FilterEditor.svelte
rename to packages/builder/src/components/design/settings/controls/FilterEditor/FilterEditor.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FlatButtonGroup/FlatButton.svelte b/packages/builder/src/components/design/settings/controls/FlatButtonGroup/FlatButton.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FlatButtonGroup/FlatButton.svelte
rename to packages/builder/src/components/design/settings/controls/FlatButtonGroup/FlatButton.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FlatButtonGroup/FlatButtonGroup.svelte b/packages/builder/src/components/design/settings/controls/FlatButtonGroup/FlatButtonGroup.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FlatButtonGroup/FlatButtonGroup.svelte
rename to packages/builder/src/components/design/settings/controls/FlatButtonGroup/FlatButtonGroup.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FlatButtonGroup/index.js b/packages/builder/src/components/design/settings/controls/FlatButtonGroup/index.js
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FlatButtonGroup/index.js
rename to packages/builder/src/components/design/settings/controls/FlatButtonGroup/index.js
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/FormFieldSelect.svelte b/packages/builder/src/components/design/settings/controls/FormFieldSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/FormFieldSelect.svelte
rename to packages/builder/src/components/design/settings/controls/FormFieldSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/IconSelect/IconSelect.svelte b/packages/builder/src/components/design/settings/controls/IconSelect/IconSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/IconSelect/IconSelect.svelte
rename to packages/builder/src/components/design/settings/controls/IconSelect/IconSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/IconSelect/icons.js b/packages/builder/src/components/design/settings/controls/IconSelect/icons.js
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/IconSelect/icons.js
rename to packages/builder/src/components/design/settings/controls/IconSelect/icons.js
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/IconSelect/index.js b/packages/builder/src/components/design/settings/controls/IconSelect/index.js
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/IconSelect/index.js
rename to packages/builder/src/components/design/settings/controls/IconSelect/index.js
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/LayoutSelect.svelte b/packages/builder/src/components/design/settings/controls/LayoutSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/LayoutSelect.svelte
rename to packages/builder/src/components/design/settings/controls/LayoutSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/MultiFieldSelect.svelte b/packages/builder/src/components/design/settings/controls/MultiFieldSelect.svelte
similarity index 100%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/MultiFieldSelect.svelte
rename to packages/builder/src/components/design/settings/controls/MultiFieldSelect.svelte
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/OptionsEditor/OptionsDrawer.svelte b/packages/builder/src/components/design/settings/controls/OptionsEditor/OptionsDrawer.svelte
similarity index 80%
rename from packages/builder/src/components/design/PropertiesPanel/PropertyControls/OptionsEditor/OptionsDrawer.svelte
rename to packages/builder/src/components/design/settings/controls/OptionsEditor/OptionsDrawer.svelte
index 340c1eb107..ba8e297189 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/OptionsEditor/OptionsDrawer.svelte
+++ b/packages/builder/src/components/design/settings/controls/OptionsEditor/OptionsDrawer.svelte
@@ -6,6 +6,7 @@
DrawerContent,
Layout,
Body,
+ Label,
} from "@budibase/bbui"
import { generate } from "shortid"
@@ -35,19 +36,12 @@
{/if}
{#if options?.length}
+
+
+
{#each options as option (option.id)}
-
-
+
+
import { Select } from "@budibase/bbui"
import { roles } from "stores/backend"
+ import { RoleUtils } from "@budibase/frontend-core"
export let value
export let error
+ export let placeholder = null