diff --git a/lerna.json b/lerna.json index 1b559f217d..4807a80646 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.20.13", + "version": "2.20.14", "npmClient": "yarn", "packages": [ "packages/*", diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index 843888666a..6063bb7fea 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -11,6 +11,7 @@ import { Document, isDocument, RowResponse, + RowValue, } from "@budibase/types" import { getCouchInfo } from "./connections" import { directCouchUrlCall } from "./utils" @@ -222,7 +223,7 @@ export class DatabaseImpl implements Database { }) } - async allDocs( + async allDocs( params: DatabaseQueryOpts ): Promise> { return this.performCall(db => { @@ -230,7 +231,7 @@ export class DatabaseImpl implements Database { }) } - async sql(sql: string): Promise { + async sql(sql: string): Promise { const dbName = this.name const url = `/${dbName}/${SQLITE_DESIGN_DOC_ID}` const response = await directCouchUrlCall({ diff --git a/packages/backend-core/src/db/instrumentation.ts b/packages/backend-core/src/db/instrumentation.ts index 5a05a93270..407f128b79 100644 --- a/packages/backend-core/src/db/instrumentation.ts +++ b/packages/backend-core/src/db/instrumentation.ts @@ -1,5 +1,4 @@ import { - DocumentScope, DocumentDestroyResponse, DocumentInsertResponse, DocumentBulkResponse, @@ -13,6 +12,7 @@ import { DatabasePutOpts, DatabaseQueryOpts, Document, + RowValue, } from "@budibase/types" import tracer from "dd-trace" import { Writable } from "stream" @@ -79,7 +79,7 @@ export class DDInstrumentedDatabase implements Database { }) } - allDocs( + allDocs( params: DatabaseQueryOpts ): Promise> { return tracer.trace("db.allDocs", span => { @@ -147,7 +147,7 @@ export class DDInstrumentedDatabase implements Database { }) } - sql(sql: string): Promise { + sql(sql: string): Promise { return tracer.trace("db.sql", span => { span?.addTags({ db_name: this.name }) return this.db.sql(sql) diff --git a/packages/builder/src/components/design/settings/controls/IconSelect/IconSelect.svelte b/packages/builder/src/components/design/settings/controls/IconSelect/IconSelect.svelte index 766fb30c49..0c68c3c3e6 100644 --- a/packages/builder/src/components/design/settings/controls/IconSelect/IconSelect.svelte +++ b/packages/builder/src/components/design/settings/controls/IconSelect/IconSelect.svelte @@ -116,7 +116,6 @@ $: pagerText = `Page ${currentPage} of ${totalPages}` -a11y-click-events-have-key-events
{displayValue} diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte index 4bd62c0049..fa126bbc99 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte @@ -12,11 +12,17 @@ hoverStore, } from "stores/builder" import ConfirmDialog from "components/common/ConfirmDialog.svelte" - import { Layout, Heading, Body, Icon, notifications } from "@budibase/bbui" + import { + ProgressCircle, + Layout, + Heading, + Body, + Icon, + notifications, + } from "@budibase/bbui" import ErrorSVG from "@budibase/frontend-core/assets/error.svg?raw" import { findComponent, findComponentPath } from "helpers/components" import { isActive, goto } from "@roxi/routify" - import { ClientAppSkeleton } from "@budibase/frontend-core" let iframe let layout @@ -234,16 +240,8 @@
{#if loading} -
- +
+
{:else if error}
@@ -260,6 +258,8 @@ bind:this={iframe} src="/app/preview" class:hidden={loading || error} + class:tablet={$previewStore.previewDevice === "tablet"} + class:mobile={$previewStore.previewDevice === "mobile"} />
diff --git a/packages/frontend-core/src/components/index.js b/packages/frontend-core/src/components/index.js index f71420b12b..f724e1e4d9 100644 --- a/packages/frontend-core/src/components/index.js +++ b/packages/frontend-core/src/components/index.js @@ -5,4 +5,3 @@ export { default as UserAvatar } from "./UserAvatar.svelte" export { default as UserAvatars } from "./UserAvatars.svelte" export { default as Updating } from "./Updating.svelte" export { Grid } from "./grid" -export { default as ClientAppSkeleton } from "./ClientAppSkeleton.svelte" diff --git a/packages/frontend-core/src/themes/midnight.css b/packages/frontend-core/src/themes/midnight.css index cf6a4fbd13..e311452262 100644 --- a/packages/frontend-core/src/themes/midnight.css +++ b/packages/frontend-core/src/themes/midnight.css @@ -17,8 +17,5 @@ --modal-background: var(--spectrum-global-color-gray-50); --drop-shadow: rgba(0, 0, 0, 0.25) !important; --spectrum-global-color-blue-100: rgba(35, 40, 50) !important; - - --spectrum-alias-background-color-secondary: var(--spectrum-global-color-gray-75); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100); } diff --git a/packages/frontend-core/src/themes/nord.css b/packages/frontend-core/src/themes/nord.css index bc142db0fd..d47dbe8aa8 100644 --- a/packages/frontend-core/src/themes/nord.css +++ b/packages/frontend-core/src/themes/nord.css @@ -50,7 +50,4 @@ --modal-background: var(--spectrum-global-color-gray-50); --drop-shadow: rgba(0, 0, 0, 0.15) !important; --spectrum-global-color-blue-100: rgb(56, 65, 84) !important; - - --spectrum-alias-background-color-secondary: var(--spectrum-global-color-gray-75); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100); } diff --git a/packages/server/package.json b/packages/server/package.json index 02db1138b5..771f73ac13 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -52,7 +52,6 @@ "@budibase/pro": "0.0.0", "@budibase/shared-core": "0.0.0", "@budibase/string-templates": "0.0.0", - "@budibase/frontend-core": "0.0.0", "@budibase/types": "0.0.0", "@bull-board/api": "5.10.2", "@bull-board/koa": "5.10.2", diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index d70c13f800..0f17c5a2f5 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -15,10 +15,14 @@ import { FieldType, RelationshipFieldMetadata, SourceName, + UpdateDatasourceRequest, UpdateDatasourceResponse, UserCtx, VerifyDatasourceRequest, VerifyDatasourceResponse, + Table, + RowValue, + DynamicVariable, } from "@budibase/types" import sdk from "../../sdk" import { builderSocket } from "../../websockets" @@ -90,8 +94,10 @@ async function invalidateVariables( existingDatasource: Datasource, updatedDatasource: Datasource ) { - const existingVariables: any = existingDatasource.config?.dynamicVariables - const updatedVariables: any = updatedDatasource.config?.dynamicVariables + const existingVariables: DynamicVariable[] = + existingDatasource.config?.dynamicVariables || [] + const updatedVariables: DynamicVariable[] = + updatedDatasource.config?.dynamicVariables || [] const toInvalidate = [] if (!existingVariables) { @@ -103,9 +109,9 @@ async function invalidateVariables( toInvalidate.push(...existingVariables) } else { // invaldate changed / removed - existingVariables.forEach((existing: any) => { + existingVariables.forEach(existing => { const unchanged = updatedVariables.find( - (updated: any) => + updated => existing.name === updated.name && existing.queryId === updated.queryId && existing.value === updated.value @@ -118,24 +124,32 @@ async function invalidateVariables( await invalidateDynamicVariables(toInvalidate) } -export async function update(ctx: UserCtx) { +export async function update( + ctx: UserCtx +) { const db = context.getAppDB() const datasourceId = ctx.params.datasourceId const baseDatasource = await sdk.datasources.get(datasourceId) - const auth = baseDatasource.config?.auth await invalidateVariables(baseDatasource, ctx.request.body) const isBudibaseSource = baseDatasource.type === dbCore.BUDIBASE_DATASOURCE_TYPE - const dataSourceBody = isBudibaseSource - ? { name: ctx.request.body?.name } + const dataSourceBody: Datasource = isBudibaseSource + ? { + name: ctx.request.body?.name, + type: dbCore.BUDIBASE_DATASOURCE_TYPE, + source: SourceName.BUDIBASE, + } : ctx.request.body let datasource: Datasource = { ...baseDatasource, ...sdk.datasources.mergeConfigs(dataSourceBody, baseDatasource), } + + // this block is specific to GSheets, if no auth set, set it back + const auth = baseDatasource.config?.auth if (auth && !ctx.request.body.auth) { // don't strip auth config from DB datasource.config!.auth = auth @@ -204,7 +218,7 @@ async function destroyInternalTablesBySourceId(datasourceId: string) { const db = context.getAppDB() // Get all internal tables - const internalTables = await db.allDocs( + const internalTables = await db.allDocs( getTableParams(null, { include_docs: true, }) @@ -212,8 +226,8 @@ async function destroyInternalTablesBySourceId(datasourceId: string) { // Filter by datasource and return the docs. const datasourceTableDocs = internalTables.rows.reduce( - (acc: any, table: any) => { - if (table.doc.sourceId == datasourceId) { + (acc: Table[], table) => { + if (table.doc?.sourceId == datasourceId) { acc.push(table.doc) } return acc @@ -254,9 +268,9 @@ export async function destroy(ctx: UserCtx) { if (datasource.type === dbCore.BUDIBASE_DATASOURCE_TYPE) { await destroyInternalTablesBySourceId(datasourceId) } else { - const queries = await db.allDocs(getQueryParams(datasourceId)) + const queries = await db.allDocs(getQueryParams(datasourceId)) await db.bulkDocs( - queries.rows.map((row: any) => ({ + queries.rows.map(row => ({ _id: row.id, _rev: row.value.rev, _deleted: true, diff --git a/packages/server/src/api/controllers/integration.ts b/packages/server/src/api/controllers/integration.ts index 9cfde31e4c..57038f8401 100644 --- a/packages/server/src/api/controllers/integration.ts +++ b/packages/server/src/api/controllers/integration.ts @@ -1,7 +1,10 @@ import { getDefinition, getDefinitions } from "../../integrations" import { SourceName, UserCtx } from "@budibase/types" -const DISABLED_EXTERNAL_INTEGRATIONS = [SourceName.AIRTABLE] +const DISABLED_EXTERNAL_INTEGRATIONS = [ + SourceName.AIRTABLE, + SourceName.BUDIBASE, +] export async function fetch(ctx: UserCtx) { const definitions = await getDefinitions() diff --git a/packages/server/src/api/controllers/row/internal.ts b/packages/server/src/api/controllers/row/internal.ts index a607c22cad..1ea505f2f1 100644 --- a/packages/server/src/api/controllers/row/internal.ts +++ b/packages/server/src/api/controllers/row/internal.ts @@ -296,11 +296,12 @@ export async function fetchEnrichedRow(ctx: UserCtx) { const tableId = utils.getTableId(ctx) const rowId = ctx.params.rowId as string // need table to work out where links go in row, as well as the link docs - const [table, row, links] = await Promise.all([ + const [table, links] = await Promise.all([ sdk.tables.getTable(tableId), - utils.findRow(ctx, tableId, rowId), linkRows.getLinkDocuments({ tableId, rowId, fieldName }), ]) + let row = await utils.findRow(ctx, tableId, rowId) + row = await outputProcessing(table, row) const linkVals = links as LinkDocumentValue[] // look up the actual rows based on the ids diff --git a/packages/server/src/api/controllers/static/index.ts b/packages/server/src/api/controllers/static/index.ts index 06c731f1a6..ad51669f79 100644 --- a/packages/server/src/api/controllers/static/index.ts +++ b/packages/server/src/api/controllers/static/index.ts @@ -1,5 +1,7 @@ import { InvalidFileExtensions } from "@budibase/shared-core" + import AppComponent from "./templates/BudibaseApp.svelte" + import { join } from "../../../utilities/centralPath" import * as uuid from "uuid" import { ObjectStoreBuckets } from "../../../constants" @@ -23,11 +25,9 @@ import sdk from "../../../sdk" import * as pro from "@budibase/pro" import { DocumentType, - UserCtx, App, Ctx, ProcessAttachmentResponse, - Feature, } from "@budibase/types" import { getAppMigrationVersion, @@ -36,61 +36,6 @@ import { import send from "koa-send" -const getThemeVariables = (theme: string) => { - if (theme === "spectrum--lightest") { - return ` - --spectrum-global-color-gray-50: rgb(255, 255, 255); - --spectrum-global-color-gray-200: rgb(244, 244, 244); - --spectrum-global-color-gray-300: rgb(234, 234, 234); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-50); - ` - } - if (theme === "spectrum--light") { - return ` - --spectrum-global-color-gray-50: rgb(255, 255, 255); - --spectrum-global-color-gray-200: rgb(234, 234, 234); - --spectrum-global-color-gray-300: rgb(225, 225, 225); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-50); - - ` - } - if (theme === "spectrum--dark") { - return ` - --spectrum-global-color-gray-100: rgb(50, 50, 50); - --spectrum-global-color-gray-200: rgb(62, 62, 62); - --spectrum-global-color-gray-300: rgb(74, 74, 74); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100); - ` - } - if (theme === "spectrum--darkest") { - return ` - --spectrum-global-color-gray-100: rgb(30, 30, 30); - --spectrum-global-color-gray-200: rgb(44, 44, 44); - --spectrum-global-color-gray-300: rgb(57, 57, 57); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100); - ` - } - if (theme === "spectrum--nord") { - return ` - --spectrum-global-color-gray-100: #3b4252; - - --spectrum-global-color-gray-200: #424a5c; - --spectrum-global-color-gray-300: #4c566a; - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100); - ` - } - if (theme === "spectrum--midnight") { - return ` - --hue: 220; - --sat: 10%; - --spectrum-global-color-gray-100: hsl(var(--hue), var(--sat), 17%); - --spectrum-global-color-gray-200: hsl(var(--hue), var(--sat), 20%); - --spectrum-global-color-gray-300: hsl(var(--hue), var(--sat), 24%); - --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100); - ` - } -} - export const toggleBetaUiFeature = async function (ctx: Ctx) { const cookieName = `beta:${ctx.params.feature}` @@ -205,7 +150,7 @@ const requiresMigration = async (ctx: Ctx) => { return requiresMigrations } -export const serveApp = async function (ctx: UserCtx) { +export const serveApp = async function (ctx: Ctx) { const needMigrations = await requiresMigration(ctx) const bbHeaderEmbed = @@ -226,19 +171,9 @@ export const serveApp = async function (ctx: UserCtx) { const appInfo = await db.get(DocumentType.APP_METADATA) let appId = context.getAppId() - const hideDevTools = !!ctx.params.appUrl - const sideNav = appInfo.navigation.navigation === "Left" - const hideFooter = - ctx?.user?.license?.features?.includes(Feature.BRANDING) || false - const themeVariables = getThemeVariables(appInfo?.theme) - if (!env.isJest()) { const plugins = objectStore.enrichPluginURLs(appInfo.usedPlugins) - const { head, html, css } = AppComponent.render({ - hideDevTools, - sideNav, - hideFooter, metaImage: branding?.metaImageUrl || "https://res.cloudinary.com/daog6scxm/image/upload/v1698759482/meta-images/plain-branded-meta-image-coral_ocxmgu.png", @@ -263,7 +198,7 @@ export const serveApp = async function (ctx: UserCtx) { ctx.body = await processString(appHbs, { head, body: html, - css: `:root{${themeVariables}} ${css.code}`, + style: css.code, appId, embedded: bbHeaderEmbed, }) diff --git a/packages/server/src/api/controllers/static/templates/BudibaseApp.svelte b/packages/server/src/api/controllers/static/templates/BudibaseApp.svelte index 63b293b4ca..7819368fc0 100644 --- a/packages/server/src/api/controllers/static/templates/BudibaseApp.svelte +++ b/packages/server/src/api/controllers/static/templates/BudibaseApp.svelte @@ -1,6 +1,4 @@ @@ -102,7 +96,6 @@ -
{#if clientLibPath}

There was an error loading your app

diff --git a/packages/server/src/api/controllers/static/templates/app.hbs b/packages/server/src/api/controllers/static/templates/app.hbs index b01b723c3e..8c445158a0 100644 --- a/packages/server/src/api/controllers/static/templates/app.hbs +++ b/packages/server/src/api/controllers/static/templates/app.hbs @@ -1,12 +1,8 @@ - + {{{head}}} - +