diff --git a/lerna.json b/lerna.json index 63ba4de90a..a5f6f6d96a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 581a264919..d7d8fa342f 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "description": "Budibase backend core libraries used in server and worker", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 31dc88c7a5..5a15ef5ed5 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.44-alpha.7", + "version": "1.0.46-alpha.0", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/cypress/support/commands.js b/packages/builder/cypress/support/commands.js index e67057344a..d99e2b271f 100644 --- a/packages/builder/cypress/support/commands.js +++ b/packages/builder/cypress/support/commands.js @@ -35,7 +35,13 @@ Cypress.Commands.add("login", () => { Cypress.Commands.add("createApp", name => { cy.visit(`localhost:${Cypress.env("PORT")}/builder`) cy.wait(500) - cy.contains(/Start from scratch/).dblclick() + cy.request(`${Cypress.config().baseUrl}api/applications?status=all`) + .its("body") + .then(body => { + if (body.length > 0) { + cy.get(".spectrum-Button").contains("Create app").click({ force: true }) + } + }) cy.get(".spectrum-Modal").within(() => { cy.get("input").eq(0).type(name).should("have.value", name).blur() cy.get(".spectrum-ButtonGroup").contains("Create app").click() diff --git a/packages/builder/package.json b/packages/builder/package.json index bb67fcafea..d990bd9b2e 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "license": "GPL-3.0", "private": true, "scripts": { @@ -65,11 +65,11 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.44-alpha.7", - "@budibase/client": "^1.0.44-alpha.7", - "@budibase/frontend-core": "^1.0.44-alpha.7", + "@budibase/bbui": "^1.0.46-alpha.0", + "@budibase/client": "^1.0.46-alpha.0", + "@budibase/frontend-core": "^1.0.46-alpha.0", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^1.0.44-alpha.7", + "@budibase/string-templates": "^1.0.46-alpha.0", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExecuteQuery.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExecuteQuery.svelte index 88c7e87054..8c438e4b22 100644 --- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExecuteQuery.svelte +++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/actions/ExecuteQuery.svelte @@ -55,8 +55,8 @@
0} {/if} @@ -49,7 +48,7 @@ {/if}
- {#each bindings as binding, idx} + {#each queryBindings as binding, idx} onBindingChange(binding.name, evt.detail)} value={runtimeToReadableBinding( - bindableOptions, + bindings, customParams?.[binding.name] )} - {bindableOptions} + {bindings} /> {:else} deleteQueryBinding(idx)} /> diff --git a/packages/builder/src/components/integration/QueryViewer.svelte b/packages/builder/src/components/integration/QueryViewer.svelte index f14d1d2b88..c6ae7c4ce8 100644 --- a/packages/builder/src/components/integration/QueryViewer.svelte +++ b/packages/builder/src/components/integration/QueryViewer.svelte @@ -120,7 +120,7 @@ config={integrationInfo.extra} /> {/if} - + {/if}
{#if shouldShowQueryConfig} diff --git a/packages/builder/src/components/start/CreateAppModal.svelte b/packages/builder/src/components/start/CreateAppModal.svelte index 178588f608..60065b6eef 100644 --- a/packages/builder/src/components/start/CreateAppModal.svelte +++ b/packages/builder/src/components/start/CreateAppModal.svelte @@ -11,7 +11,6 @@ import { capitalise } from "helpers" import { goto } from "@roxi/routify" import { APP_NAME_REGEX } from "constants" - import TemplateList from "./TemplateList.svelte" export let template export let inline @@ -147,58 +146,34 @@ } -{#if showTemplateSelection} - { - template = {} - return false - }} - showCancelButton={!inline} - showCloseIcon={!inline} - > - { - if (!selected) { - template = useImport ? { fromFile: true } : {} - return - } - template = selected + + {#if template?.fromFile} + { + $values.file = e.detail?.[0] + $touched.file = true }} /> - -{:else} - - {#if template?.fromFile} - { - $values.file = e.detail?.[0] - $touched.file = true - }} - /> - {/if} - ($touched.name = true)} - label="Name" - placeholder={$auth.user.firstName - ? `${$auth.user.firstName}'s app` - : "My app"} - /> - -{/if} + {/if} + ($touched.name = true)} + label="Name" + placeholder={$auth.user.firstName + ? `${$auth.user.firstName}'s app` + : "My app"} + /> + diff --git a/packages/builder/src/components/start/TemplateList.svelte b/packages/builder/src/components/start/TemplateList.svelte deleted file mode 100644 index 90573bddff..0000000000 --- a/packages/builder/src/components/start/TemplateList.svelte +++ /dev/null @@ -1,69 +0,0 @@ - - - -
onSelect(null)}> -
- -
- Start from scratch -

BLANK

-
-
onSelect(null, { useImport: true })} - > -
- -
- Import an app -

BLANK

-
-
- - diff --git a/packages/builder/src/pages/builder/portal/apps/index.svelte b/packages/builder/src/pages/builder/portal/apps/index.svelte index ac10b5317f..047c60e979 100644 --- a/packages/builder/src/pages/builder/portal/apps/index.svelte +++ b/packages/builder/src/pages/builder/portal/apps/index.svelte @@ -11,6 +11,7 @@ notifications, Body, Search, + Icon, } from "@budibase/bbui" import Spinner from "components/common/Spinner.svelte" import CreateAppModal from "components/start/CreateAppModal.svelte" @@ -27,6 +28,7 @@ import AppRow from "components/start/AppRow.svelte" import { AppStatus } from "constants" import analytics, { Events } from "analytics" + import Logo from "assets/bb-space-man.svg" let sortBy = "name" let template @@ -78,6 +80,7 @@ } const initiateAppCreation = () => { + template = {} creationModal.show() creatingApp = true } @@ -300,14 +303,26 @@
{#if cloud} - {/if} - -
@@ -389,9 +404,24 @@ {#if !enrichedApps.length && !creatingApp && loaded}
- - - +
+
+ + logo +
+ Create a business app in minutes! +
+ +
+
+
{/if} @@ -474,12 +504,15 @@ } .grid { + height: 200px; display: grid; + overflow: hidden; grid-gap: var(--spacing-xl); grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); + grid-template-rows: minmax(70px, 1fr) minmax(100px, 1fr) minmax(0px, 0); } .template-card { - height: 80px; + height: 70px; border-radius: var(--border-radius-s); border: 1px solid var(--spectrum-global-color-gray-300); cursor: pointer; @@ -533,4 +566,42 @@ justify-content: center; align-items: center; } + + .centered { + width: calc(100% - 350px); + height: calc(100% - 100px); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + } + + .main { + width: 300px; + } + + .new-screen-text { + width: 160px; + text-align: center; + color: #2c2c2c; + font-weight: 600; + } + + .new-screen-button { + margin-left: 5px; + height: 20px; + width: 100px; + display: flex; + align-items: center; + } + + .img-size { + width: 160px; + height: 160px; + } + + .background-icon { + margin-top: 4px; + margin-right: 4px; + } diff --git a/packages/cli/package.json b/packages/cli/package.json index 79e2b4e433..512798df86 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/cli", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "description": "Budibase CLI, for developers, self hosting and migrations.", "main": "src/index.js", "bin": { diff --git a/packages/client/package.json b/packages/client/package.json index b45bb995e3..a5fc58c6bf 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "license": "MPL-2.0", "module": "dist/budibase-client.js", "main": "dist/budibase-client.js", @@ -19,10 +19,10 @@ "dev:builder": "rollup -cw" }, "dependencies": { - "@budibase/bbui": "^1.0.44-alpha.7", - "@budibase/frontend-core": "^1.0.44-alpha.7", + "@budibase/bbui": "^1.0.46-alpha.0", + "@budibase/frontend-core": "^1.0.46-alpha.0", "@budibase/standard-components": "^0.9.139", - "@budibase/string-templates": "^1.0.44-alpha.7", + "@budibase/string-templates": "^1.0.46-alpha.0", "regexparam": "^1.3.0", "shortid": "^2.2.15", "svelte-spa-router": "^3.0.5" diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 079ed250ad..6b4f5938d3 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -1,12 +1,12 @@ { "name": "@budibase/frontend-core", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "description": "Budibase frontend core libraries used in builder and client", "author": "Budibase", "license": "GPL-3.0", "svelte": "src/index.js", "dependencies": { - "@budibase/bbui": "^1.0.44-alpha.7", + "@budibase/bbui": "^1.0.46-alpha.0", "lodash": "^4.17.21", "svelte": "^3.46.2" } diff --git a/packages/server/package.json b/packages/server/package.json index afe19c5763..ad85c14302 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/server", "email": "hi@budibase.com", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "description": "Budibase Web Server", "main": "src/index.ts", "repository": { @@ -70,9 +70,9 @@ "license": "GPL-3.0", "dependencies": { "@apidevtools/swagger-parser": "^10.0.3", - "@budibase/backend-core": "^1.0.44-alpha.7", - "@budibase/client": "^1.0.44-alpha.7", - "@budibase/string-templates": "^1.0.44-alpha.7", + "@budibase/backend-core": "^1.0.46-alpha.0", + "@budibase/client": "^1.0.46-alpha.0", + "@budibase/string-templates": "^1.0.46-alpha.0", "@bull-board/api": "^3.7.0", "@bull-board/koa": "^3.7.0", "@elastic/elasticsearch": "7.10.0", diff --git a/packages/server/src/utilities/workerRequests.js b/packages/server/src/utilities/workerRequests.js index 92dffc8d3f..421b8c426e 100644 --- a/packages/server/src/utilities/workerRequests.js +++ b/packages/server/src/utilities/workerRequests.js @@ -71,7 +71,7 @@ exports.getDeployedApps = async () => { for (let [key, value] of Object.entries(json)) { if (value.url) { value.url = value.url.toLowerCase() - apps[key] = value + apps[key.toLowerCase()] = value } } return apps diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index b56da074e3..d79c8b2503 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/string-templates", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "description": "Handlebars wrapper for Budibase templating.", "main": "src/index.cjs", "module": "dist/bundle.mjs", diff --git a/packages/string-templates/src/helpers/javascript.js b/packages/string-templates/src/helpers/javascript.js index 9231283e89..0173be0b54 100644 --- a/packages/string-templates/src/helpers/javascript.js +++ b/packages/string-templates/src/helpers/javascript.js @@ -1,5 +1,6 @@ const { atob } = require("../utilities") const { cloneDeep } = require("lodash/fp") +const { LITERAL_MARKER } = require("../helpers/constants") // The method of executing JS scripts depends on the bundle being built. // This setter is used in the entrypoint (either index.cjs or index.mjs). @@ -46,8 +47,9 @@ module.exports.processJS = (handlebars, context) => { $: path => getContextValue(path, cloneDeep(context)), } - // Create a sandbox with out context and run the JS - return runJS(js, sandboxContext) + // Create a sandbox with our context and run the JS + const res = { data: runJS(js, sandboxContext) } + return `{{${LITERAL_MARKER} js_result-${JSON.stringify(res)}}}` } catch (error) { return "Error while executing JS" } diff --git a/packages/string-templates/src/processors/postprocessor.js b/packages/string-templates/src/processors/postprocessor.js index 4d1c84013a..7fc3f663fe 100644 --- a/packages/string-templates/src/processors/postprocessor.js +++ b/packages/string-templates/src/processors/postprocessor.js @@ -36,6 +36,11 @@ module.exports.processors = [ return value === "true" case "object": return JSON.parse(value) + case "js_result": + // We use the literal helper to process the result of JS expressions + // as we want to be able to return any types. + // We wrap the value in an abject to be able to use undefined properly. + return JSON.parse(value).data } return value }), diff --git a/packages/string-templates/test/javascript.spec.js b/packages/string-templates/test/javascript.spec.js index 05cc80331a..5363f37e02 100644 --- a/packages/string-templates/test/javascript.spec.js +++ b/packages/string-templates/test/javascript.spec.js @@ -7,7 +7,7 @@ const processJS = (js, context) => { describe("Test the JavaScript helper", () => { it("should execute a simple expression", () => { const output = processJS(`return 1 + 2`) - expect(output).toBe("3") + expect(output).toBe(3) }) it("should be able to use primitive bindings", () => { @@ -50,6 +50,52 @@ describe("Test the JavaScript helper", () => { expect(output).toBe("shazbat") }) + it("should be able to return an object", () => { + const output = processJS(`return $("foo")`, { + foo: { + bar: { + baz: "shazbat", + }, + }, + }) + expect(output.bar.baz).toBe("shazbat") + }) + + it("should be able to return an array", () => { + const output = processJS(`return $("foo")`, { + foo: ["a", "b", "c"], + }) + expect(output[2]).toBe("c") + }) + + it("should be able to return null", () => { + const output = processJS(`return $("foo")`, { + foo: null, + }) + expect(output).toBe(null) + }) + + it("should be able to return undefined", () => { + const output = processJS(`return $("foo")`, { + foo: undefined, + }) + expect(output).toBe(undefined) + }) + + it("should be able to return 0", () => { + const output = processJS(`return $("foo")`, { + foo: 0, + }) + expect(output).toBe(0) + }) + + it("should be able to return an empty string", () => { + const output = processJS(`return $("foo")`, { + foo: "", + }) + expect(output).toBe("") + }) + it("should be able to use a deep array binding", () => { const output = processJS(`return $("foo.0.bar")`, { foo: [ diff --git a/packages/worker/package.json b/packages/worker/package.json index 0631938233..1464b3154b 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/worker", "email": "hi@budibase.com", - "version": "1.0.44-alpha.7", + "version": "1.0.46-alpha.0", "description": "Budibase background service", "main": "src/index.js", "repository": { @@ -29,8 +29,8 @@ "author": "Budibase", "license": "GPL-3.0", "dependencies": { - "@budibase/backend-core": "^1.0.44-alpha.7", - "@budibase/string-templates": "^1.0.44-alpha.7", + "@budibase/backend-core": "^1.0.46-alpha.0", + "@budibase/string-templates": "^1.0.46-alpha.0", "@koa/router": "^8.0.0", "@sentry/node": "^6.0.0", "@techpass/passport-openidconnect": "^0.3.0", diff --git a/packages/worker/src/api/controllers/system/environment.js b/packages/worker/src/api/controllers/system/environment.js index 4edf1ff8d3..609c3e83c5 100644 --- a/packages/worker/src/api/controllers/system/environment.js +++ b/packages/worker/src/api/controllers/system/environment.js @@ -7,6 +7,6 @@ exports.fetch = async ctx => { accountPortalUrl: env.ACCOUNT_PORTAL_URL, disableAccountPortal: env.DISABLE_ACCOUNT_PORTAL, // in test need to pretend its in production for the UI (Cypress) - isDev: env.isDev() && !env.isTest(), + isDev: env.isDev(), } }