From ef268014c1bbad6203c5b7215c571c1ed7f0ef37 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Mon, 19 Apr 2021 10:39:27 +0100 Subject: [PATCH 01/58] v0.8.17 --- lerna.json | 2 +- packages/builder/package.json | 6 +++--- packages/client/package.json | 6 +++--- packages/server/package.json | 8 ++++---- packages/standard-components/package.json | 2 +- packages/string-templates/package.json | 2 +- packages/worker/package.json | 2 +- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lerna.json b/lerna.json index bf193f9a81..76a41df08c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.8.16", + "version": "0.8.17", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/builder/package.json b/packages/builder/package.json index df83d69095..3c1afc1bb6 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "0.8.16", + "version": "0.8.17", "license": "AGPL-3.0", "private": true, "scripts": { @@ -64,9 +64,9 @@ }, "dependencies": { "@budibase/bbui": "^1.58.13", - "@budibase/client": "^0.8.16", + "@budibase/client": "^0.8.17", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^0.8.16", + "@budibase/string-templates": "^0.8.17", "@budibase/svelte-ag-grid": "^1.0.4", "@sentry/browser": "5.19.1", "@svelteschool/svelte-forms": "0.7.0", diff --git a/packages/client/package.json b/packages/client/package.json index fc68546dea..f4a535d72e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "0.8.16", + "version": "0.8.17", "license": "MPL-2.0", "main": "dist/budibase-client.js", "module": "dist/budibase-client.js", @@ -9,13 +9,13 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/string-templates": "^0.8.16", + "@budibase/string-templates": "^0.8.17", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" }, "devDependencies": { - "@budibase/standard-components": "^0.8.16", + "@budibase/standard-components": "^0.8.17", "@rollup/plugin-commonjs": "^16.0.0", "@rollup/plugin-node-resolve": "^10.0.0", "fs-extra": "^8.1.0", diff --git a/packages/server/package.json b/packages/server/package.json index 245bb01fbf..fae63a97e0 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "0.8.16", + "version": "0.8.17", "description": "Budibase Web Server", "main": "src/electron.js", "repository": { @@ -71,8 +71,8 @@ "author": "Budibase", "license": "AGPL-3.0-or-later", "dependencies": { - "@budibase/client": "^0.8.16", - "@budibase/string-templates": "^0.8.16", + "@budibase/client": "^0.8.17", + "@budibase/string-templates": "^0.8.17", "@elastic/elasticsearch": "7.10.0", "@koa/router": "8.0.0", "@sendgrid/mail": "7.1.1", @@ -126,7 +126,7 @@ "zlib": "1.0.5" }, "devDependencies": { - "@budibase/standard-components": "^0.8.16", + "@budibase/standard-components": "^0.8.17", "@jest/test-sequencer": "^24.8.0", "cross-env": "^7.0.3", "electron": "10.1.3", diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json index b5d013943e..c7d765422f 100644 --- a/packages/standard-components/package.json +++ b/packages/standard-components/package.json @@ -35,7 +35,7 @@ "keywords": [ "svelte" ], - "version": "0.8.16", + "version": "0.8.17", "license": "MIT", "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321", "dependencies": { diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 53d5ab27fa..d7c053c570 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "0.8.16", + "version": "0.8.17", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.js", "module": "src/index.js", diff --git a/packages/worker/package.json b/packages/worker/package.json index 5576da31fe..3c8179d629 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/deployment", "email": "hi@budibase.com", - "version": "0.8.16", + "version": "0.8.17", "description": "Budibase Deployment Server", "main": "src/index.js", "repository": { From 806bd4e06b5c6333ba5c2a0bfa3967e0353df710 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 19 Apr 2021 22:24:13 +0100 Subject: [PATCH 02/58] Fixing an issue with the DynamoDB integration, didn't specify the correct terms for the AWS credentials. --- packages/server/src/integrations/dynamodb.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/integrations/dynamodb.js b/packages/server/src/integrations/dynamodb.js index 668e11e263..da95411b2b 100644 --- a/packages/server/src/integrations/dynamodb.js +++ b/packages/server/src/integrations/dynamodb.js @@ -16,7 +16,7 @@ const SCHEMA = { type: FIELD_TYPES.PASSWORD, required: true, }, - secretKey: { + secretAccessKey: { type: FIELD_TYPES.PASSWORD, required: true, }, @@ -114,7 +114,7 @@ class DynamoDBIntegration { }) } - async connect() { + connect() { AWS.config.update(this.config) } From 2ef1586d4d520d8edc01527686045b7ce5249ce8 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 19 Apr 2021 22:36:14 +0100 Subject: [PATCH 03/58] Adding cleanup operation to dynamo client. --- packages/server/src/api/controllers/query.js | 18 ++++++++++++------ packages/server/src/db/dynamoClient.js | 1 + packages/server/src/integrations/dynamodb.js | 13 +++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/server/src/api/controllers/query.js b/packages/server/src/api/controllers/query.js index a2badb0d0d..45dc4e0d86 100644 --- a/packages/server/src/api/controllers/query.js +++ b/packages/server/src/api/controllers/query.js @@ -116,9 +116,8 @@ exports.preview = async function(ctx) { const enrichedQuery = await enrichQueryFields(fields, parameters) - const rows = formatResponse( - await new Integration(datasource.config)[queryVerb](enrichedQuery) - ) + const integration = new Integration(datasource.config) + const rows = formatResponse(await integration[queryVerb](enrichedQuery)) // get all the potential fields in the schema const keys = rows.flatMap(Object.keys) @@ -127,6 +126,10 @@ exports.preview = async function(ctx) { rows, schemaFields: [...new Set(keys)], } + // cleanup + if (integration.end) { + integration.end() + } } exports.execute = async function(ctx) { @@ -146,10 +149,13 @@ exports.execute = async function(ctx) { ctx.request.body.parameters ) + const integration = new Integration(datasource.config) // call the relevant CRUD method on the integration class - ctx.body = formatResponse( - await new Integration(datasource.config)[query.queryVerb](enrichedQuery) - ) + ctx.body = formatResponse(await integration[query.queryVerb](enrichedQuery)) + // cleanup + if (integration.end) { + integration.end() + } } exports.destroy = async function(ctx) { diff --git a/packages/server/src/db/dynamoClient.js b/packages/server/src/db/dynamoClient.js index fcba726f84..3e9c8ced14 100644 --- a/packages/server/src/db/dynamoClient.js +++ b/packages/server/src/db/dynamoClient.js @@ -2,6 +2,7 @@ let _ = require("lodash") let env = require("../environment") const AWS_REGION = env.AWS_REGION ? env.AWS_REGION : "eu-west-1" +exports.AWS_REGION = AWS_REGION const TableInfo = { API_KEYS: { diff --git a/packages/server/src/integrations/dynamodb.js b/packages/server/src/integrations/dynamodb.js index da95411b2b..aa77d6d4f0 100644 --- a/packages/server/src/integrations/dynamodb.js +++ b/packages/server/src/integrations/dynamodb.js @@ -1,5 +1,6 @@ const AWS = require("aws-sdk") const { FIELD_TYPES, QUERY_TYPES } = require("./Integration") +const { AWS_REGION } = require("../db/dynamoClient") const SCHEMA = { docs: "https://github.com/dabit3/dynamodb-documentclient-cheat-sheet", @@ -114,10 +115,22 @@ class DynamoDBIntegration { }) } + end() { + this.disconnect() + } + connect() { AWS.config.update(this.config) } + disconnect() { + AWS.config.update({ + secretAccessKey: undefined, + accessKeyId: undefined, + region: AWS_REGION, + }) + } + async create(query) { const params = { TableName: query.table, From 93596311bb5d4a1bc60d05fc892d957fdd6b5f21 Mon Sep 17 00:00:00 2001 From: Mike Shanks Date: Wed, 12 May 2021 10:17:47 +0100 Subject: [PATCH 04/58] fix - rest api datasource not accepting parameters --- .../PropertyControls/EventsEditor/actions/ExecuteQuery.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte index e18336fab5..d760d65d1e 100644 --- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte +++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/actions/ExecuteQuery.svelte @@ -55,5 +55,6 @@ height={200} {query} schema={fetchQueryDefinition(query)} - editable={false} /> + editable={false} + {datasource} /> {/if} From 787d39759328187af4befea042173ba02843be47 Mon Sep 17 00:00:00 2001 From: Mike Shanks Date: Wed, 12 May 2021 17:17:08 +0100 Subject: [PATCH 05/58] desktop deprecation banner --- packages/builder/src/pages/_layout.svelte | 52 ++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/packages/builder/src/pages/_layout.svelte b/packages/builder/src/pages/_layout.svelte index ac45ff8372..169675ae98 100644 --- a/packages/builder/src/pages/_layout.svelte +++ b/packages/builder/src/pages/_layout.svelte @@ -1,5 +1,5 @@ +{#if deprecationWarning} +
+ +
+
+ From the 25th of May, Budibase is moving to a self-hosted web experience in the browser. We will cease development on the current Electron based desktop builder. +
+ +
+ read more + +
+
+ +
+{/if} +
diff --git a/packages/bbui/src/Form/Core/Switch.svelte b/packages/bbui/src/Form/Core/Switch.svelte index a2f7e5ce01..0763806bd2 100644 --- a/packages/bbui/src/Form/Core/Switch.svelte +++ b/packages/bbui/src/Form/Core/Switch.svelte @@ -26,3 +26,9 @@
+ + From 222afc68845b5b4aa722758bbc50604bf35c5836 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 08:37:07 +0100 Subject: [PATCH 09/58] Add ability for BBUI text fields to update on change and default to true --- packages/bbui/src/Form/Core/Search.svelte | 19 +++++++++++++++---- packages/bbui/src/Form/Core/TextField.svelte | 20 +++++++++++++++----- packages/bbui/src/Form/Input.svelte | 3 +++ packages/bbui/src/Form/Search.svelte | 4 ++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/packages/bbui/src/Form/Core/Search.svelte b/packages/bbui/src/Form/Core/Search.svelte index dbc8582ac3..b26c9567c0 100644 --- a/packages/bbui/src/Form/Core/Search.svelte +++ b/packages/bbui/src/Form/Core/Search.svelte @@ -2,10 +2,11 @@ import "@spectrum-css/search/dist/index-vars.css" import { createEventDispatcher } from "svelte" - export let value = "" + export let value = null export let placeholder = null export let disabled = false export let id = null + export let updateOnChange = true const dispatch = createEventDispatcher() let focus = false @@ -23,6 +24,13 @@ updateValue(event.target.value) } + const onInput = event => { + if (!updateOnChange) { + return + } + updateValue(event.target.value) + } + const updateValueOnEnter = event => { if (event.key === "Enter") { updateValue(event.target.value) @@ -44,15 +52,18 @@ { + if (readonly || !updateOnChange) { + return + } + updateValue(event.target.value) } const updateValueOnEnter = event => { @@ -66,16 +73,19 @@ {/if} diff --git a/packages/bbui/src/Form/Input.svelte b/packages/bbui/src/Form/Input.svelte index 07ebf4f4db..fcab178182 100644 --- a/packages/bbui/src/Form/Input.svelte +++ b/packages/bbui/src/Form/Input.svelte @@ -11,6 +11,7 @@ export let disabled = false export let readonly = false export let error = null + export let updateOnChange = true const dispatch = createEventDispatcher() const onChange = e => { @@ -21,6 +22,7 @@ diff --git a/packages/bbui/src/Form/Search.svelte b/packages/bbui/src/Form/Search.svelte index d41ecd4d6e..b5a6c17b4a 100644 --- a/packages/bbui/src/Form/Search.svelte +++ b/packages/bbui/src/Form/Search.svelte @@ -8,6 +8,7 @@ export let labelPosition = "above" export let placeholder = null export let disabled = false + export let updateOnChange = true const dispatch = createEventDispatcher() const onChange = e => { @@ -18,11 +19,14 @@ From 8902a26ecc7e0b2e2dbfe556631ec8c7005f7953 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 08:40:18 +0100 Subject: [PATCH 10/58] Disable update on change for component settings --- .../PropertiesPanel/PropertyControls/PropertyControl.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyControl.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyControl.svelte index 857a8279bf..4a4e21ac2e 100644 --- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyControl.svelte +++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyControl.svelte @@ -76,6 +76,7 @@ this={control} {componentInstance} value={safeValue} + updateOnChange={false} on:change={handleChange} onChange={handleChange} {type} From c575850dc056bfb2c84d6ac60f9c105e226b20b9 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 13:52:26 +0100 Subject: [PATCH 11/58] Ensure layout page component always fills the page --- packages/bbui/src/Layout/Page.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/bbui/src/Layout/Page.svelte b/packages/bbui/src/Layout/Page.svelte index 69c9adda14..f2a453dbd2 100644 --- a/packages/bbui/src/Layout/Page.svelte +++ b/packages/bbui/src/Layout/Page.svelte @@ -15,6 +15,7 @@ max-width: 80ch; margin: 0 auto; padding: calc(var(--spacing-xl) * 2); + min-height: calc(100% - var(--spacing-xl) * 4); } .wide { @@ -22,5 +23,6 @@ margin: 0; padding: var(--spacing-xl) calc(var(--spacing-xl) * 2) calc(var(--spacing-xl) * 2) calc(var(--spacing-xl) * 2); + min-height: calc(100% - var(--spacing-xl) * 3); } From 0f73190b5f642333f5ddd69ba59eae11eccb1f5f Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 13:52:42 +0100 Subject: [PATCH 12/58] Add font weight property to BBUI layout body --- packages/bbui/src/Typography/Body.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/bbui/src/Typography/Body.svelte b/packages/bbui/src/Typography/Body.svelte index b18400862d..af906ce0db 100644 --- a/packages/bbui/src/Typography/Body.svelte +++ b/packages/bbui/src/Typography/Body.svelte @@ -4,9 +4,11 @@ export let size = "M" export let serif = false export let noPadding = false + export let weight = 400

Date: Tue, 18 May 2021 13:54:04 +0100 Subject: [PATCH 13/58] Add default budibase org details --- packages/builder/src/stores/portal/organisation.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/stores/portal/organisation.js b/packages/builder/src/stores/portal/organisation.js index 97053897f9..2856785ab9 100644 --- a/packages/builder/src/stores/portal/organisation.js +++ b/packages/builder/src/stores/portal/organisation.js @@ -1,15 +1,15 @@ import { writable, get } from "svelte/store" import api from "builderStore/api" -const FALLBACK_CONFIG = { +const DEFAULT_CONFIG = { platformUrl: "", - logoUrl: "", + logoUrl: "https://i.imgur.com/ZKyklgF.png", docsUrl: "", - company: "http://localhost:10000", + company: "Budibase", } export function createOrganisationStore() { - const store = writable({}) + const store = writable(DEFAULT_CONFIG) const { subscribe, set } = store async function init() { @@ -17,7 +17,7 @@ export function createOrganisationStore() { const json = await res.json() if (json.status === 400) { - set(FALLBACK_CONFIG) + set(DEFAULT_CONFIG) } else { set({ ...json.config, _rev: json._rev }) } From 89643ca4079496973563dd411e944dfb33d81de4 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 13:54:41 +0100 Subject: [PATCH 14/58] Fix add user button style --- .../builder/src/pages/builder/portal/manage/users/index.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/pages/builder/portal/manage/users/index.svelte b/packages/builder/src/pages/builder/portal/manage/users/index.svelte index 38f1c3c3e9..a6c33331e1 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/index.svelte @@ -63,7 +63,7 @@

- +
Date: Tue, 18 May 2021 13:55:15 +0100 Subject: [PATCH 15/58] Allow app card rows to display all lock statuses --- packages/builder/src/components/start/AppRow.svelte | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/builder/src/components/start/AppRow.svelte b/packages/builder/src/components/start/AppRow.svelte index 1a4ec1a152..1fe65f290a 100644 --- a/packages/builder/src/components/start/AppRow.svelte +++ b/packages/builder/src/components/start/AppRow.svelte @@ -8,8 +8,6 @@ MenuItem, Link, } from "@budibase/bbui" - import { AppStatus } from "constants" - import { url } from "@roxi/routify" import { auth } from "stores/backend" export let app @@ -34,8 +32,13 @@
{#if app.lockedBy} -
- Locked by {app.lockedBy.email} + {#if app.lockedBy.email === $auth.user.email} +
+ Locked by you + {:else} +
+ Locked by {app.lockedBy.email} + {/if} {:else}
Open From 8f9b60a40073556f06e5914c30cd60b19043175a Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 13:56:05 +0100 Subject: [PATCH 16/58] Fix first time app creation modal not being centered and flashing apps when loading the page --- packages/builder/src/pages/builder/portal/apps/index.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/apps/index.svelte b/packages/builder/src/pages/builder/portal/apps/index.svelte index e1004c9ef2..5a76e50457 100644 --- a/packages/builder/src/pages/builder/portal/apps/index.svelte +++ b/packages/builder/src/pages/builder/portal/apps/index.svelte @@ -160,7 +160,7 @@ />
- {#if $apps.length} + {#if loaded && $apps.length}
Date: Tue, 18 May 2021 13:57:14 +0100 Subject: [PATCH 17/58] Add initial work on user app list screen --- .../src/pages/builder/apps/index.svelte | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 packages/builder/src/pages/builder/apps/index.svelte diff --git a/packages/builder/src/pages/builder/apps/index.svelte b/packages/builder/src/pages/builder/apps/index.svelte new file mode 100644 index 0000000000..e9444d426a --- /dev/null +++ b/packages/builder/src/pages/builder/apps/index.svelte @@ -0,0 +1,222 @@ + + +
+ +
+ + +
+ + Hey {$auth.user.email} + + Welcome to the {$organisation.company} portal. Below you'll find the + list of apps that you have access to, as well as company news and the + employee handbook. + + + +
+ + +
+ + Update user information + + + Update password + + $goto("../portal")}> + Open developer mode + + Log out +
+
+ +
+ Apps + -
-
- -
- GROUP - {#if $auth.user?.builder?.global} - - {/if} -
- {#each $apps as app, idx (app.appId)} -
$goto(`../app/${app.appId}`)}> -
-
- {app.name} - - Edited {Math.round(Math.random() * 10 + 1)} months ago - -
- +{#if loaded} +
+ +
+ + +
+ + Hey {$auth.user.email} + + Welcome to the {$organisation.company} portal. Below you'll find + the list of apps that you have access to, as well as company news + and the employee handbook. + + + +
+ +
- {/each} - -
-
-
-
-
+ Update user information + Update password + $goto("../portal")} + > + Open developer mode + + Log out + +
+ +
+ Apps + + -
- - - - -
From 3b6b3877b128dba72cd6a9b9bf8bd537b356d80a Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 14:43:05 +0100 Subject: [PATCH 20/58] Prevent access to create super admin screen once an admin has been created --- .../src/pages/builder/admin/_layout.svelte | 19 +++++++++++++++++++ .../src/pages/builder/admin/index.svelte | 3 --- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 packages/builder/src/pages/builder/admin/_layout.svelte diff --git a/packages/builder/src/pages/builder/admin/_layout.svelte b/packages/builder/src/pages/builder/admin/_layout.svelte new file mode 100644 index 0000000000..70823b9a34 --- /dev/null +++ b/packages/builder/src/pages/builder/admin/_layout.svelte @@ -0,0 +1,19 @@ + + +{#if loaded} + +{/if} diff --git a/packages/builder/src/pages/builder/admin/index.svelte b/packages/builder/src/pages/builder/admin/index.svelte index 3aa3f6ddfd..20cca56672 100644 --- a/packages/builder/src/pages/builder/admin/index.svelte +++ b/packages/builder/src/pages/builder/admin/index.svelte @@ -68,9 +68,6 @@ justify-content: flex-start; align-items: stretch; } - .center { - text-align: center; - } img { width: 40px; margin: 0 auto; From e76f68cee353c75fc71adc9202f3b39217bc5e25 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 15:29:34 +0100 Subject: [PATCH 21/58] Prevent rendering certain authenticated routes unless logged in, to avoid initial renders and onMount loaders firing --- packages/builder/src/pages/builder/_layout.svelte | 2 +- .../pages/builder/app/[application]/_layout.svelte | 14 +------------- .../builder/src/pages/builder/app/_layout.svelte | 7 +++++++ 3 files changed, 9 insertions(+), 14 deletions(-) create mode 100644 packages/builder/src/pages/builder/app/_layout.svelte diff --git a/packages/builder/src/pages/builder/_layout.svelte b/packages/builder/src/pages/builder/_layout.svelte index 59505de4e3..589e0af799 100644 --- a/packages/builder/src/pages/builder/_layout.svelte +++ b/packages/builder/src/pages/builder/_layout.svelte @@ -1,6 +1,6 @@ + +{#if $auth.user} + +{/if} From 6a92e7304b1aa4ea9992ab000e523cdaaa6e004e Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 18 May 2021 18:47:39 +0100 Subject: [PATCH 22/58] Allow dropzone to preview images before being uploaded --- packages/bbui/src/Form/Core/Dropzone.svelte | 47 +++++++++++++++------ 1 file changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/bbui/src/Form/Core/Dropzone.svelte b/packages/bbui/src/Form/Core/Dropzone.svelte index 5b5c72b809..3315c923f8 100644 --- a/packages/bbui/src/Form/Core/Dropzone.svelte +++ b/packages/bbui/src/Form/Core/Dropzone.svelte @@ -37,9 +37,28 @@ const fieldId = id || generateID() let selectedImageIdx = 0 let fileDragged = false + let selectedUrl $: selectedImage = value?.[selectedImageIdx] ?? null $: fileCount = value?.length ?? 0 - $: isImage = imageExtensions.includes(selectedImage?.extension?.toLowerCase()) + $: isImage = + imageExtensions.includes(selectedImage?.extension?.toLowerCase()) || + selectedImage?.type?.startsWith("image") + + $: { + if (selectedImage?.url) { + selectedUrl = selectedImage?.url + } else if (selectedImage) { + try { + let reader = new FileReader() + reader.readAsDataURL(selectedImage) + reader.onload = e => { + selectedUrl = e.target.result + } + } catch (error) { + selectedUrl = null + } + } + } async function processFileList(fileList) { if ( @@ -102,11 +121,13 @@
- + -
- - Delete user - Deleting a user completely removes them from your account. -
- -
-
+ + Delete user + Deleting a user completely removes them from your account. + +
+
@@ -143,26 +147,12 @@ .fields { display: grid; grid-gap: var(--spacing-m); - margin-top: var(--spacing-xl); } .field { display: grid; grid-template-columns: 32% 1fr; align-items: center; } - .heading { - margin-bottom: var(--spacing-xl); - } - .general { - position: relative; - margin: var(--spacing-xl) 0; - } - .roles { - margin: var(--spacing-xl) 0; - } - .delete { - margin-top: var(--spacing-xl); - } .regenerate { position: absolute; top: 0; From 27dfa40ec46d1f4ae0e04c2fdb58a8b36d5ae72c Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 19 May 2021 10:40:05 +0100 Subject: [PATCH 32/58] Add user first name and last name to backend table UI --- .../src/components/backend/DataTable/Table.svelte | 2 ++ .../backend/DataTable/modals/CreateEditUser.svelte | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/builder/src/components/backend/DataTable/Table.svelte b/packages/builder/src/components/backend/DataTable/Table.svelte index 6555197cb2..40a5d1dbac 100644 --- a/packages/builder/src/components/backend/DataTable/Table.svelte +++ b/packages/builder/src/components/backend/DataTable/Table.svelte @@ -47,6 +47,8 @@ }) schema.email.displayName = "Email" schema.roleId.displayName = "Role" + schema.firstName.displayName = "First Name" + schema.lastName.displayName = "Last Name" if (schema.status) { schema.status.displayName = "Status" } diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte index 11210db49f..bf1030dc2c 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditUser.svelte @@ -32,6 +32,8 @@ delete customSchema["email"] delete customSchema["roleId"] delete customSchema["status"] + delete customSchema["firstName"] + delete customSchema["lastName"] return Object.entries(customSchema) } @@ -87,6 +89,14 @@ meta={{ name: "password", type: "password" }} bind:value={row.password} /> + + -
- {/each} - - - - - {/if} - - - diff --git a/packages/builder/src/pages/builder/portal/oauth/_logos/Google.svelte b/packages/builder/src/pages/builder/portal/oauth/_logos/Google.svelte deleted file mode 100644 index 5686e50abc..0000000000 --- a/packages/builder/src/pages/builder/portal/oauth/_logos/Google.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - diff --git a/packages/builder/src/pages/builder/portal/oauth/index.svelte b/packages/builder/src/pages/builder/portal/oauth/index.svelte deleted file mode 100644 index f8d9b43dec..0000000000 --- a/packages/builder/src/pages/builder/portal/oauth/index.svelte +++ /dev/null @@ -1,114 +0,0 @@ - - - - -
- OAuth - - Every budibase app comes with basic authentication (email/password) - included. You can add additional authentication methods from the options - below. - -
- - {#if google} -
- - - - Google - - - - To allow users to authenticate using their Google accounts, fill out - the fields below. - -
- - {#each ConfigFields.Google as field} -
- - -
- {/each} -
- -
- - {/if} -
-
- - diff --git a/packages/server/src/constants/index.js b/packages/server/src/constants/index.js index e4a65a94f6..7d80f67a1c 100644 --- a/packages/server/src/constants/index.js +++ b/packages/server/src/constants/index.js @@ -50,6 +50,24 @@ exports.USERS_TABLE_SCHEMA = { fieldName: "email", name: "email", }, + firstName: { + name: "firstName", + fieldName: "firstName", + type: exports.FieldTypes.STRING, + constraints: { + type: exports.FieldTypes.STRING, + presence: false, + }, + }, + lastName: { + name: "lastName", + fieldName: "lastName", + type: exports.FieldTypes.STRING, + constraints: { + type: exports.FieldTypes.STRING, + presence: false, + }, + }, roleId: { fieldName: "roleId", name: "roleId", From 5c8c663935def2bb00909ac3df1e2c677ff184e6 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 19 May 2021 11:07:14 +0100 Subject: [PATCH 35/58] Fix spacing and make consistent in all portal pages --- .../src/components/login/LoginForm.svelte | 4 +- .../src/components/start/AppCard.svelte | 2 +- .../src/pages/builder/admin/index.svelte | 2 +- .../src/pages/builder/invite/index.svelte | 2 +- .../builder/portal/manage/auth/index.svelte | 60 +++++----- .../email/_components/TemplateBindings.svelte | 2 +- .../builder/portal/manage/email/index.svelte | 82 ++++++------- .../users/_components/AddUserModal.svelte | 10 +- .../_components/BasicOnboardingModal.svelte | 8 +- .../users/_components/UpdateRolesModal.svelte | 2 +- .../builder/portal/manage/users/index.svelte | 48 ++++---- .../builder/portal/settings/general.svelte | 110 ++++++++---------- 12 files changed, 151 insertions(+), 181 deletions(-) diff --git a/packages/builder/src/components/login/LoginForm.svelte b/packages/builder/src/components/login/LoginForm.svelte index bc32c74689..36b1764241 100644 --- a/packages/builder/src/components/login/LoginForm.svelte +++ b/packages/builder/src/components/login/LoginForm.svelte @@ -40,8 +40,8 @@ Sign in to Budibase + - Sign in with email - + $goto("./forgot")}> Forgot password? diff --git a/packages/builder/src/components/start/AppCard.svelte b/packages/builder/src/components/start/AppCard.svelte index 1d444b2afb..2aa5e6650d 100644 --- a/packages/builder/src/components/start/AppCard.svelte +++ b/packages/builder/src/components/start/AppCard.svelte @@ -48,7 +48,7 @@
- + Edited {Math.floor(1 + Math.random() * 10)} months ago {#if app.lockedBy} diff --git a/packages/builder/src/pages/builder/admin/index.svelte b/packages/builder/src/pages/builder/admin/index.svelte index 1b3be282ab..77a1b43c57 100644 --- a/packages/builder/src/pages/builder/admin/index.svelte +++ b/packages/builder/src/pages/builder/admin/index.svelte @@ -36,7 +36,7 @@ Create an admin user - + The admin user has access to everything in Budibase. diff --git a/packages/builder/src/pages/builder/invite/index.svelte b/packages/builder/src/pages/builder/invite/index.svelte index 8758c669a8..65b20f8a9d 100644 --- a/packages/builder/src/pages/builder/invite/index.svelte +++ b/packages/builder/src/pages/builder/invite/index.svelte @@ -27,7 +27,7 @@ Accept Invitation - + Please enter a password to set up your user. diff --git a/packages/builder/src/pages/builder/portal/manage/auth/index.svelte b/packages/builder/src/pages/builder/portal/manage/auth/index.svelte index af05e0e92c..9718e14681 100644 --- a/packages/builder/src/pages/builder/portal/manage/auth/index.svelte +++ b/packages/builder/src/pages/builder/portal/manage/auth/index.svelte @@ -59,44 +59,42 @@ }) - - -
- OAuth - - Every budibase app comes with basic authentication (email/password) - included. You can add additional authentication methods from the options - below. - -
+ + + OAuth + + Every budibase app comes with basic authentication (email/password) + included. You can add additional authentication methods from the options + below. + + + {#if google} - {#if google} -
- - - - Google - - - - To allow users to authenticate using their Google accounts, fill out - the fields below. - -
- + + + + + Google + + + + To allow users to authenticate using their Google accounts, fill out the + fields below. + + + {#each ConfigFields.Google as field}
{/each} -
- -
- - {/if} -
-
+ +
+ +
+ {/if} + diff --git a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte index 8646da9c06..b60f15d976 100644 --- a/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte +++ b/packages/builder/src/pages/builder/portal/manage/users/_components/AddUserModal.svelte @@ -30,18 +30,18 @@ - If you have SMTP configured and an email for the new user, you can use the + + If you have SMTP configured and an email for the new user, you can use the automated email onboarding flow. Otherwise, use our basic onboarding process - with autogenerated passwords. + with autogenerated passwords. + - + Update {user.email}'s role for {app.name}.
$goto(`./${detail._id}`)} {schema} @@ -75,31 +74,28 @@ allowSelectRows={false} customRenderers={[{ column: "group", component: TagsRenderer }]} /> - + - + + + diff --git a/packages/builder/src/pages/builder/portal/settings/general.svelte b/packages/builder/src/pages/builder/portal/settings/general.svelte index 8ee249fae5..cd5709d493 100644 --- a/packages/builder/src/pages/builder/portal/settings/general.svelte +++ b/packages/builder/src/pages/builder/portal/settings/general.svelte @@ -57,78 +57,76 @@ } -
- -
- General - - General is the place where you edit your organisation name, logo. You - can also configure your platform URL as well as turn on or off - analytics. - + + + General + + General is the place where you edit your organisation name, logo. You can + also configure your platform URL as well as turn on or off analytics. + + + + + Information + Here you can update your logo and organization name. + +
+
+ +
- -
- Information - Here you can update your logo and organization name. -
-
- - -
- + - -
- Platform - Here you can set up general platform settings. -
-
- - -
-
+
+ + + Platform + Here you can set up general platform settings. + +
+
+ +
- -
+
+ + + Analytics - + If you would like to send analytics that help us make Budibase better, please let us know below. -
-
- - -
+ +
+
+ +
-
- -
-
+
+ +
+
From f08b894e5583252ce2615b131ed3c161e294a4ad Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 19 May 2021 13:17:50 +0100 Subject: [PATCH 36/58] Adding admin only endpoint, removing the ability to create/delete global users from the app server and adding a global self user update. --- packages/server/src/api/controllers/row.js | 5 +- packages/server/src/api/controllers/user.js | 55 ++---------- packages/server/src/api/routes/user.js | 6 -- packages/server/src/automations/actions.js | 3 - .../src/automations/steps/createUser.js | 90 ------------------- .../worker/src/api/controllers/admin/users.js | 16 ++++ .../worker/src/api/routes/admin/configs.js | 3 + packages/worker/src/api/routes/admin/users.js | 30 +++++-- packages/worker/src/middleware/adminOnly.js | 6 ++ 9 files changed, 59 insertions(+), 155 deletions(-) delete mode 100644 packages/server/src/automations/steps/createUser.js create mode 100644 packages/worker/src/middleware/adminOnly.js diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js index 1d73abea47..6cf53a06c7 100644 --- a/packages/server/src/api/controllers/row.js +++ b/packages/server/src/api/controllers/row.js @@ -167,11 +167,10 @@ exports.save = async function (ctx) { table, }) - // TODO remove special user case in future - if (row.tableId === InternalTables.USER_METADATA) { + if (row.tableId === InternalTables.USER_METADATA && row._id) { // the row has been updated, need to put it into the ctx ctx.request.body = row - await userController.createMetadata(ctx) + await userController.updateMetadata(ctx) return } diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js index 39901990c2..d549231320 100644 --- a/packages/server/src/api/controllers/user.js +++ b/packages/server/src/api/controllers/user.js @@ -2,15 +2,10 @@ const CouchDB = require("../../db") const { generateUserMetadataID, getUserMetadataParams, - getGlobalIDFromUserMetadataID, } = require("../../db/utils") const { InternalTables } = require("../../db/utils") -const { getRole, BUILTIN_ROLE_IDS } = require("@budibase/auth/roles") -const { - getGlobalUsers, - saveGlobalUser, - deleteGlobalUser, -} = require("../../utilities/workerRequests") +const { BUILTIN_ROLE_IDS } = require("@budibase/auth/roles") +const { getGlobalUsers } = require("../../utilities/workerRequests") const { getFullUser } = require("../../utilities/users") exports.fetchMetadata = async function (ctx) { @@ -38,38 +33,6 @@ exports.fetchMetadata = async function (ctx) { ctx.body = users } -exports.createMetadata = async function (ctx) { - const appId = ctx.appId - const db = new CouchDB(appId) - const { roleId } = ctx.request.body - - if (ctx.request.body._id) { - return exports.updateMetadata(ctx) - } - - // check role valid - const role = await getRole(appId, roleId) - if (!role) ctx.throw(400, "Invalid Role") - - const globalUser = await saveGlobalUser(ctx, appId, ctx.request.body) - - const user = { - ...globalUser, - _id: generateUserMetadataID(globalUser._id), - type: "user", - tableId: InternalTables.USER_METADATA, - } - - const response = await db.post(user) - // for automations to make it obvious was successful - ctx.status = 200 - ctx.body = { - _id: response.id, - _rev: response.rev, - email: ctx.request.body.email, - } -} - exports.updateSelfMetadata = async function (ctx) { // overwrite the ID with current users ctx.request.body._id = ctx.user._id @@ -85,14 +48,13 @@ exports.updateMetadata = async function (ctx) { const appId = ctx.appId const db = new CouchDB(appId) const user = ctx.request.body - const globalUser = await saveGlobalUser(ctx, appId, { - ...user, - _id: getGlobalIDFromUserMetadataID(user._id), - }) + // make sure to always remove global user props + delete user.password + delete user.roles + delete user.builder const metadata = { - ...globalUser, tableId: InternalTables.USER_METADATA, - _id: user._id || generateUserMetadataID(globalUser._id), + _id: user._id, _rev: user._rev, } ctx.body = await db.put(metadata) @@ -100,7 +62,6 @@ exports.updateMetadata = async function (ctx) { exports.destroyMetadata = async function (ctx) { const db = new CouchDB(ctx.appId) - await deleteGlobalUser(ctx, getGlobalIDFromUserMetadataID(ctx.params.id)) try { const dbUser = await db.get(ctx.params.id) await db.remove(dbUser._id, dbUser._rev) @@ -108,7 +69,7 @@ exports.destroyMetadata = async function (ctx) { // error just means the global user has no config in this app } ctx.body = { - message: `User ${ctx.params.id} deleted.`, + message: `User metadata ${ctx.params.id} deleted.`, } } diff --git a/packages/server/src/api/routes/user.js b/packages/server/src/api/routes/user.js index 01af18b933..b3b486fe45 100644 --- a/packages/server/src/api/routes/user.js +++ b/packages/server/src/api/routes/user.js @@ -25,12 +25,6 @@ router authorized(PermissionTypes.USER, PermissionLevels.WRITE), controller.updateMetadata ) - .post( - "/api/users/metadata", - authorized(PermissionTypes.USER, PermissionLevels.WRITE), - usage, - controller.createMetadata - ) .post( "/api/users/metadata/self", authorized(PermissionTypes.USER, PermissionLevels.WRITE), diff --git a/packages/server/src/automations/actions.js b/packages/server/src/automations/actions.js index 983e87854a..ad102e7b67 100644 --- a/packages/server/src/automations/actions.js +++ b/packages/server/src/automations/actions.js @@ -3,7 +3,6 @@ const sendSmtpEmail = require("./steps/sendSmtpEmail") const createRow = require("./steps/createRow") const updateRow = require("./steps/updateRow") const deleteRow = require("./steps/deleteRow") -const createUser = require("./steps/createUser") const executeScript = require("./steps/executeScript") const executeQuery = require("./steps/executeQuery") const outgoingWebhook = require("./steps/outgoingWebhook") @@ -20,7 +19,6 @@ const BUILTIN_ACTIONS = { CREATE_ROW: createRow.run, UPDATE_ROW: updateRow.run, DELETE_ROW: deleteRow.run, - CREATE_USER: createUser.run, OUTGOING_WEBHOOK: outgoingWebhook.run, EXECUTE_SCRIPT: executeScript.run, EXECUTE_QUERY: executeQuery.run, @@ -31,7 +29,6 @@ const BUILTIN_DEFINITIONS = { CREATE_ROW: createRow.definition, UPDATE_ROW: updateRow.definition, DELETE_ROW: deleteRow.definition, - CREATE_USER: createUser.definition, OUTGOING_WEBHOOK: outgoingWebhook.definition, EXECUTE_SCRIPT: executeScript.definition, EXECUTE_QUERY: executeQuery.definition, diff --git a/packages/server/src/automations/steps/createUser.js b/packages/server/src/automations/steps/createUser.js deleted file mode 100644 index 02250901fc..0000000000 --- a/packages/server/src/automations/steps/createUser.js +++ /dev/null @@ -1,90 +0,0 @@ -const roles = require("@budibase/auth/roles") -const userController = require("../../api/controllers/user") -const env = require("../../environment") -const usage = require("../../utilities/usageQuota") - -module.exports.definition = { - description: "Create a new user", - tagline: "Create user {{inputs.email}}", - icon: "ri-user-add-line", - name: "Create User", - type: "ACTION", - stepId: "CREATE_USER", - inputs: { - roleId: roles.BUILTIN_ROLE_IDS.POWER, - }, - schema: { - inputs: { - properties: { - email: { - type: "string", - customType: "email", - title: "Email", - }, - password: { - type: "string", - title: "Password", - }, - roleId: { - type: "string", - title: "Role", - enum: roles.BUILTIN_ROLE_ID_ARRAY, - pretty: roles.BUILTIN_ROLE_NAME_ARRAY, - }, - }, - required: ["email", "password", "roleId"], - }, - outputs: { - properties: { - id: { - type: "string", - description: "The identifier of the new user", - }, - revision: { - type: "string", - description: "The revision of the new user", - }, - response: { - type: "object", - description: "The response from the user table", - }, - success: { - type: "boolean", - description: "Whether the action was successful", - }, - }, - required: ["id", "revision", "success"], - }, - }, -} - -module.exports.run = async function ({ inputs, appId, apiKey, emitter }) { - const { email, password, roleId } = inputs - const ctx = { - appId, - request: { - body: { email, password, roleId }, - }, - eventEmitter: emitter, - } - - try { - if (env.isProd()) { - await usage.update(apiKey, usage.Properties.USER, 1) - } - await userController.createMetadata(ctx) - return { - response: ctx.body, - // internal property not returned through the API - id: ctx.body._id, - revision: ctx.body._rev, - success: ctx.status === 200, - } - } catch (err) { - console.error(err) - return { - success: false, - response: err, - } - } -} diff --git a/packages/worker/src/api/controllers/admin/users.js b/packages/worker/src/api/controllers/admin/users.js index ce452d5c78..68198223a2 100644 --- a/packages/worker/src/api/controllers/admin/users.js +++ b/packages/worker/src/api/controllers/admin/users.js @@ -96,6 +96,22 @@ exports.destroy = async ctx => { } } +exports.self = async ctx => { + const db = new CouchDB(GLOBAL_DB) + const user = await db.get(ctx.user._id) + if (ctx.request.body.password) { + ctx.request.body.password = await hash(ctx.request.body.password) + } + const response = await db.put({ + ...user, + ...ctx.request.body, + }) + ctx.body = { + _id: response.id, + _rev: response.rev, + } +} + // called internally by app server user fetch exports.fetch = async ctx => { const db = new CouchDB(GLOBAL_DB) diff --git a/packages/worker/src/api/routes/admin/configs.js b/packages/worker/src/api/routes/admin/configs.js index a028ebdd81..a6fd9f5dd5 100644 --- a/packages/worker/src/api/routes/admin/configs.js +++ b/packages/worker/src/api/routes/admin/configs.js @@ -1,6 +1,7 @@ const Router = require("@koa/router") const controller = require("../../controllers/admin/configs") const joiValidator = require("../../../middleware/joi-validator") +const adminOnly = require("../../../middleware/adminOnly") const Joi = require("joi") const { Configs, ConfigUploads } = require("../../../constants") @@ -76,6 +77,8 @@ function buildConfigGetValidation() { }).unknown(true).required()) } +router.use(adminOnly) + router .post("/api/admin/configs", buildConfigSaveValidation(), controller.save) .delete("/api/admin/configs/:id", controller.destroy) diff --git a/packages/worker/src/api/routes/admin/users.js b/packages/worker/src/api/routes/admin/users.js index cac1d5af9c..1f6aebb191 100644 --- a/packages/worker/src/api/routes/admin/users.js +++ b/packages/worker/src/api/routes/admin/users.js @@ -5,13 +5,12 @@ const Joi = require("joi") const router = Router() -function buildUserSaveValidation() { - // prettier-ignore - return joiValidator.body(Joi.object({ - _id: Joi.string(), - _rev: Joi.string(), +function buildUserSaveValidation(isSelf = false) { + let schema = { email: Joi.string(), password: Joi.string().allow(null, ""), + firstName: Joi.string(), + lastName: Joi.string(), builder: Joi.object({ global: Joi.boolean().optional(), apps: Joi.array().optional(), @@ -21,7 +20,17 @@ function buildUserSaveValidation() { .pattern(/.*/, Joi.string()) .required() .unknown(true) - }).required().unknown(true)) + } + if (!isSelf) { + schema = { + ...schema, + _id: Joi.string(), + _rev: Joi.string(), + } + } + return joiValidator.body(Joi.object(schema) + .required() + .unknown(true)) } function buildInviteValidation() { @@ -39,10 +48,19 @@ function buildInviteAcceptValidation() { }).required().unknown(true)) } +function buildUpdateSelfValidation() { + // prettier-ignore + return joiValidator.body(Joi.object({ + inviteCode: Joi.string().required(), + password: Joi.string().required(), + }).required().unknown(true)) +} + router .post("/api/admin/users", buildUserSaveValidation(), controller.save) .get("/api/admin/users", controller.fetch) .post("/api/admin/users/init", controller.adminUser) + .post("/api/admin/users/self", buildUserSaveValidation(true), controller.self) .delete("/api/admin/users/:id", controller.destroy) .get("/api/admin/users/:id", controller.find) .get("/api/admin/roles/:appId") diff --git a/packages/worker/src/middleware/adminOnly.js b/packages/worker/src/middleware/adminOnly.js new file mode 100644 index 0000000000..0f1a77346d --- /dev/null +++ b/packages/worker/src/middleware/adminOnly.js @@ -0,0 +1,6 @@ +module.exports = async (ctx, next) => { + if (!ctx.user || !ctx.user.admin || !ctx.user.admin.global) { + ctx.throw(403, "Admin user only endpoint.") + } + return next() +} \ No newline at end of file From ba1ee6b033617eaabff54012483097bd7e5faa42 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 19 May 2021 13:18:58 +0100 Subject: [PATCH 37/58] Add modal to let users change their own password, without endpoint for now --- .../_components/ChangePasswordModal.svelte | 21 +++++++++++++++++ .../_components/UpdateUserInfoModal.svelte | 18 ++------------- .../src/pages/builder/apps/index.svelte | 23 +++++++++++++++---- 3 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 packages/builder/src/pages/builder/apps/_components/ChangePasswordModal.svelte diff --git a/packages/builder/src/pages/builder/apps/_components/ChangePasswordModal.svelte b/packages/builder/src/pages/builder/apps/_components/ChangePasswordModal.svelte new file mode 100644 index 0000000000..d1f21d6b5b --- /dev/null +++ b/packages/builder/src/pages/builder/apps/_components/ChangePasswordModal.svelte @@ -0,0 +1,21 @@ + + + + Enter your new password below. + + diff --git a/packages/builder/src/pages/builder/apps/_components/UpdateUserInfoModal.svelte b/packages/builder/src/pages/builder/apps/_components/UpdateUserInfoModal.svelte index e54c3c719f..21d6797e1f 100644 --- a/packages/builder/src/pages/builder/apps/_components/UpdateUserInfoModal.svelte +++ b/packages/builder/src/pages/builder/apps/_components/UpdateUserInfoModal.svelte @@ -1,9 +1,7 @@ diff --git a/packages/builder/src/pages/builder/apps/index.svelte b/packages/builder/src/pages/builder/apps/index.svelte index 7d9c8b93b4..608e02f449 100644 --- a/packages/builder/src/pages/builder/apps/index.svelte +++ b/packages/builder/src/pages/builder/apps/index.svelte @@ -19,16 +19,19 @@ import { AppStatus } from "constants" import { gradient } from "actions" import UpdateUserInfoModal from "./_components/UpdateUserInfoModal.svelte" + import ChangePasswordModal from "./_components/ChangePasswordModal.svelte" let loaded = false let userInfoModal - let userPasswordModal + let changePasswordModal onMount(async () => { await organisation.init() await apps.load(AppStatus.DEV) loaded = true }) + + $: console.log($auth.user) {#if loaded} @@ -56,7 +59,12 @@ userInfoModal.show()}> Update user information - Update password + changePasswordModal.show()} + > + Update password + $goto("../portal")} @@ -76,7 +84,11 @@
GROUP {#if $auth.user?.builder?.global} - + alert("Navigate to portal group page.")} + /> {/if}
{#each $apps as app, idx (app.appId)} @@ -100,6 +112,9 @@ + + + {/if}