diff --git a/packages/builder/src/components/start/CreateAppModal.svelte b/packages/builder/src/components/start/CreateAppModal.svelte index fae0f80f0d..7c1602a454 100644 --- a/packages/builder/src/components/start/CreateAppModal.svelte +++ b/packages/builder/src/components/start/CreateAppModal.svelte @@ -150,7 +150,6 @@ showCancelButton={false} showCloseIcon={false} > - <Body size="M">Select a template below, or start from scratch.</Body> <TemplateList onSelect={selected => { if (!selected) { diff --git a/packages/builder/src/components/start/TemplateList.svelte b/packages/builder/src/components/start/TemplateList.svelte index deddd92880..d8e65062b5 100644 --- a/packages/builder/src/components/start/TemplateList.svelte +++ b/packages/builder/src/components/start/TemplateList.svelte @@ -1,5 +1,5 @@ <script> - import { Heading, Layout, Icon } from "@budibase/bbui" + import { Heading, Layout, Icon, Body } from "@budibase/bbui" import Spinner from "components/common/Spinner.svelte" import api from "builderStore/api" @@ -7,6 +7,7 @@ async function fetchTemplates() { const response = await api.get("/api/templates?type=app") + console.log("Responded") return await response.json() } @@ -19,6 +20,11 @@ <Spinner size="30" /> </div> {:then templates} + {#if templates?.length > 0} + <Body size="M">Select a template below, or start from scratch.</Body> + {:else} + <Body size="M">Start your app from scratch below.</Body> + {/if} <div class="templates"> {#each templates as template} <div class="template" on:click={() => onSelect(template)}> diff --git a/packages/server/src/api/controllers/dev.js b/packages/server/src/api/controllers/dev.js index d75c4032d7..c43de7f553 100644 --- a/packages/server/src/api/controllers/dev.js +++ b/packages/server/src/api/controllers/dev.js @@ -7,11 +7,13 @@ const { clearLock } = require("../../utilities/redis") const { Replication } = require("@budibase/auth").db const { DocumentTypes } = require("../../db/utils") -async function redirect(ctx, method) { +async function redirect(ctx, method, path = "global") { const { devPath } = ctx.params const queryString = ctx.originalUrl.split("?")[1] || "" const response = await fetch( - checkSlashesInUrl(`${env.WORKER_URL}/api/global/${devPath}?${queryString}`), + checkSlashesInUrl( + `${env.WORKER_URL}/api/${path}/${devPath}?${queryString}` + ), request( ctx, { @@ -41,16 +43,22 @@ async function redirect(ctx, method) { ctx.cookies } -exports.redirectGet = async ctx => { - await redirect(ctx, "GET") +exports.buildRedirectGet = path => { + return async ctx => { + await redirect(ctx, "GET", path) + } } -exports.redirectPost = async ctx => { - await redirect(ctx, "POST") +exports.buildRedirectPost = path => { + return async ctx => { + await redirect(ctx, "POST", path) + } } -exports.redirectDelete = async ctx => { - await redirect(ctx, "DELETE") +exports.buildRedirectDelete = path => { + return async ctx => { + await redirect(ctx, "DELETE", path) + } } exports.clearLock = async ctx => { diff --git a/packages/server/src/api/controllers/templates.js b/packages/server/src/api/controllers/templates.js index f650491d2b..03dbbd2ee2 100644 --- a/packages/server/src/api/controllers/templates.js +++ b/packages/server/src/api/controllers/templates.js @@ -7,11 +7,23 @@ const DEFAULT_TEMPLATES_BUCKET = exports.fetch = async function (ctx) { const { type = "app" } = ctx.query - const response = await fetch( - `https://${DEFAULT_TEMPLATES_BUCKET}/manifest.json` - ) - const json = await response.json() - ctx.body = Object.values(json.templates[type]) + let response, + error = false + try { + response = await fetch(`https://${DEFAULT_TEMPLATES_BUCKET}/manifest.json`) + if (response.status !== 200) { + error = true + } + } catch (err) { + error = true + } + // if there is an error, simply return no templates + if (!error && response) { + const json = await response.json() + ctx.body = Object.values(json.templates[type]) + } else { + ctx.body = [] + } } // can't currently test this, have to ignore from coverage diff --git a/packages/server/src/api/routes/dev.js b/packages/server/src/api/routes/dev.js index 7612d332dd..0d9bd118aa 100644 --- a/packages/server/src/api/routes/dev.js +++ b/packages/server/src/api/routes/dev.js @@ -6,11 +6,16 @@ const { BUILDER } = require("@budibase/auth/permissions") const router = Router() -if (env.isDev() || env.isTest()) { +function redirectPath(path) { router - .get("/api/global/:devPath(.*)", controller.redirectGet) - .post("/api/global/:devPath(.*)", controller.redirectPost) - .delete("/api/global/:devPath(.*)", controller.redirectDelete) + .get(`/api/${path}/:devPath(.*)`, controller.buildRedirectGet(path)) + .post(`/api/${path}/:devPath(.*)`, controller.buildRedirectPost(path)) + .delete(`/api/${path}/:devPath(.*)`, controller.buildRedirectDelete(path)) +} + +if (env.isDev() || env.isTest()) { + redirectPath("global") + redirectPath("system") } router diff --git a/packages/server/src/utilities/rowProcessor/index.js b/packages/server/src/utilities/rowProcessor/index.js index 55af87bc13..7d4ae3016e 100644 --- a/packages/server/src/utilities/rowProcessor/index.js +++ b/packages/server/src/utilities/rowProcessor/index.js @@ -150,6 +150,10 @@ exports.processAutoColumn = processAutoColumn * @returns {object} The coerced value */ exports.coerce = (row, type) => { + // no coercion specified for type, skip it + if (!TYPE_TRANSFORM_MAP[type]) { + return row + } // eslint-disable-next-line no-prototype-builtins if (TYPE_TRANSFORM_MAP[type].hasOwnProperty(row)) { return TYPE_TRANSFORM_MAP[type][row]