diff --git a/lerna.json b/lerna.json
index 1d092b043c..d31cde4be4 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/package.json b/package.json
index 579e86802e..7733a6df95 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,6 @@
"private": true,
"devDependencies": {
"@rollup/plugin-json": "^4.0.2",
- "@types/mongodb": "3.6.3",
"@typescript-eslint/parser": "4.28.0",
"babel-eslint": "^10.0.3",
"eslint": "^7.28.0",
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index 17977decba..a3bb329b72 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/backend-core",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"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": "2.0.30-alpha.3",
+ "@budibase/types": "2.0.30-alpha.7",
"@shopify/jest-koa-mocks": "5.0.1",
"@techpass/passport-openidconnect": "0.3.2",
"aws-sdk": "2.1030.0",
diff --git a/packages/bbui/package.json b/packages/bbui/package.json
index 147a1b3785..7d1ac8bbf6 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": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"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": "2.0.30-alpha.3",
+ "@budibase/string-templates": "2.0.30-alpha.7",
"@spectrum-css/actionbutton": "^1.0.1",
"@spectrum-css/actiongroup": "^1.0.1",
"@spectrum-css/avatar": "^3.0.2",
diff --git a/packages/builder/cypress/integration/datasources/rest.spec.js b/packages/builder/cypress/integration/datasources/rest.spec.js
index ec9864a47d..7cfe1ce9bb 100644
--- a/packages/builder/cypress/integration/datasources/rest.spec.js
+++ b/packages/builder/cypress/integration/datasources/rest.spec.js
@@ -22,7 +22,7 @@ filterTests(["smoke", "all"], () => {
cy.wait("@queryError")
cy.get("@queryError")
.its("response.body")
- .should("have.property", "message", "Invalid URL: http://random text?")
+ .should("have.property", "message", "Invalid URL: http://random text")
cy.get("@queryError")
.its("response.body")
.should("have.property", "status", 400)
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 8ced899d20..912c64a1b6 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"license": "GPL-3.0",
"private": true,
"scripts": {
@@ -71,10 +71,10 @@
}
},
"dependencies": {
- "@budibase/bbui": "2.0.30-alpha.3",
- "@budibase/client": "2.0.30-alpha.3",
- "@budibase/frontend-core": "2.0.30-alpha.3",
- "@budibase/string-templates": "2.0.30-alpha.3",
+ "@budibase/bbui": "2.0.30-alpha.7",
+ "@budibase/client": "2.0.30-alpha.7",
+ "@budibase/frontend-core": "2.0.30-alpha.7",
+ "@budibase/string-templates": "2.0.30-alpha.7",
"@sentry/browser": "5.19.1",
"@spectrum-css/page": "^3.0.1",
"@spectrum-css/vars": "^3.0.1",
diff --git a/packages/builder/src/builderStore/store/screenTemplates/newRowScreen.js b/packages/builder/src/builderStore/store/screenTemplates/newRowScreen.js
index dd97c511e5..6564bf6050 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/newRowScreen.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/newRowScreen.js
@@ -1,13 +1,8 @@
import sanitizeUrl from "./utils/sanitizeUrl"
import { Screen } from "./utils/Screen"
import { Component } from "./utils/Component"
-import {
- makeBreadcrumbContainer,
- makeMainForm,
- makeTitleContainer,
- makeSaveButton,
- makeDatasourceFormComponents,
-} from "./utils/commonComponents"
+import { makeBreadcrumbContainer } from "./utils/commonComponents"
+import { getSchemaForDatasource } from "../../dataBinding"
export default function (tables) {
return tables.map(table => {
@@ -23,48 +18,55 @@ export default function (tables) {
export const newRowUrl = table => sanitizeUrl(`/${table.name}/new/row`)
export const NEW_ROW_TEMPLATE = "NEW_ROW_TEMPLATE"
-function generateTitleContainer(table, formId) {
- return makeTitleContainer("New Row").addChild(makeSaveButton(table, formId))
+const rowListUrl = table => sanitizeUrl(`/${table.name}`)
+
+const getFields = schema => {
+ let columns = []
+ Object.entries(schema || {}).forEach(([field, fieldSchema]) => {
+ if (!field || !fieldSchema) {
+ return
+ }
+ if (!fieldSchema?.autocolumn) {
+ columns.push(field)
+ }
+ })
+ return columns
}
-const createScreen = table => {
- const screen = new Screen()
- .instanceName(`${table.name} - New`)
- .customProps({
- hAlign: "center",
- })
- .route(newRowUrl(table))
-
- const form = makeMainForm()
- .instanceName("Form")
+const generateFormBlock = table => {
+ const datasource = { type: "table", tableId: table._id }
+ const { schema } = getSchemaForDatasource(null, datasource, {
+ formSchema: true,
+ })
+ const formBlock = new Component("@budibase/standard-components/formblock")
+ formBlock
.customProps({
+ title: "New row",
actionType: "Create",
+ actionUrl: rowListUrl(table),
+ showDeleteButton: false,
+ showSaveButton: true,
+ fields: getFields(schema),
dataSource: {
label: table.name,
tableId: table._id,
type: "table",
},
+ labelPosition: "left",
size: "spectrum--medium",
})
-
- const fieldGroup = new Component("@budibase/standard-components/fieldgroup")
- .instanceName("Field Group")
- .customProps({
- labelPosition: "left",
- })
-
- // Add all form fields from this schema to the field group
- const datasource = { type: "table", tableId: table._id }
- makeDatasourceFormComponents(datasource).forEach(component => {
- fieldGroup.addChild(component)
- })
-
- // Add all children to the form
- const formId = form._json._id
- form
- .addChild(makeBreadcrumbContainer(table.name, "New"))
- .addChild(generateTitleContainer(table, formId))
- .addChild(fieldGroup)
-
- return screen.addChild(form).json()
+ .instanceName(`${table.name} - Form block`)
+ return formBlock
+}
+
+const createScreen = table => {
+ const formBlock = generateFormBlock(table)
+ const screen = new Screen()
+ .instanceName(`${table.name} - New`)
+ .route(newRowUrl(table))
+
+ return screen
+ .addChild(makeBreadcrumbContainer(table.name, "New row"))
+ .addChild(formBlock)
+ .json()
}
diff --git a/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js b/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js
index a1916769c9..22b39aba3e 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js
@@ -1,15 +1,8 @@
import sanitizeUrl from "./utils/sanitizeUrl"
-import { rowListUrl } from "./rowListScreen"
import { Screen } from "./utils/Screen"
import { Component } from "./utils/Component"
-import { makePropSafe } from "@budibase/string-templates"
-import {
- makeBreadcrumbContainer,
- makeTitleContainer,
- makeSaveButton,
- makeMainForm,
- makeDatasourceFormComponents,
-} from "./utils/commonComponents"
+import { makeBreadcrumbContainer } from "./utils/commonComponents"
+import { getSchemaForDatasource } from "../../dataBinding"
export default function (tables) {
return tables.map(table => {
@@ -25,125 +18,53 @@ export default function (tables) {
export const ROW_DETAIL_TEMPLATE = "ROW_DETAIL_TEMPLATE"
export const rowDetailUrl = table => sanitizeUrl(`/${table.name}/:id`)
-function generateTitleContainer(table, title, formId, repeaterId) {
- const saveButton = makeSaveButton(table, formId)
- const deleteButton = new Component("@budibase/standard-components/button")
- .text("Delete")
- .customProps({
- type: "secondary",
- quiet: true,
- size: "M",
- onClick: [
- {
- parameters: {
- tableId: table._id,
- rowId: `{{ ${makePropSafe(repeaterId)}.${makePropSafe("_id")} }}`,
- revId: `{{ ${makePropSafe(repeaterId)}.${makePropSafe("_rev")} }}`,
- confirm: true,
- },
- "##eventHandlerType": "Delete Row",
- },
- {
- parameters: {
- url: rowListUrl(table),
- },
- "##eventHandlerType": "Navigate To",
- },
- ],
- })
- .instanceName("Delete Button")
+const rowListUrl = table => sanitizeUrl(`/${table.name}`)
- const buttons = new Component("@budibase/standard-components/container")
- .instanceName("Button Container")
- .customProps({
- direction: "row",
- hAlign: "right",
- vAlign: "middle",
- size: "shrink",
- gap: "M",
- })
- .addChild(deleteButton)
- .addChild(saveButton)
+const getFields = schema => {
+ let columns = []
+ Object.entries(schema || {}).forEach(([field, fieldSchema]) => {
+ if (!field || !fieldSchema) {
+ return
+ }
+ if (!fieldSchema?.autocolumn) {
+ columns.push(field)
+ }
+ })
+ return columns
+}
- return makeTitleContainer(title).addChild(buttons)
+const generateFormBlock = table => {
+ const datasource = { type: "table", tableId: table._id }
+ const { schema } = getSchemaForDatasource(null, datasource, {
+ formSchema: true,
+ })
+
+ const formBlock = new Component("@budibase/standard-components/formblock")
+ formBlock
+ .customProps({
+ title: "Edit row",
+ actionType: "Update",
+ actionUrl: rowListUrl(table),
+ showDeleteButton: true,
+ showSaveButton: true,
+ fields: getFields(schema),
+ dataSource: {
+ label: table.name,
+ tableId: table._id,
+ type: "table",
+ },
+ labelPosition: "left",
+ size: "spectrum--medium",
+ })
+ .instanceName(`${table.name} - Form block`)
+ return formBlock
}
const createScreen = table => {
- const provider = new Component("@budibase/standard-components/dataprovider")
- .instanceName(`Data Provider`)
- .customProps({
- dataSource: {
- label: table.name,
- name: table._id,
- tableId: table._id,
- type: "table",
- },
- filter: [
- {
- field: "_id",
- operator: "equal",
- type: "string",
- value: `{{ ${makePropSafe("url")}.${makePropSafe("id")} }}`,
- valueType: "Binding",
- },
- ],
- limit: 1,
- paginate: false,
- })
-
- const repeater = new Component("@budibase/standard-components/repeater")
- .instanceName("Repeater")
- .customProps({
- dataProvider: `{{ literal ${makePropSafe(provider._json._id)} }}`,
- noRowsMessage: "We couldn't find a row to display",
- })
-
- const form = makeMainForm()
- .instanceName("Form")
- .customProps({
- actionType: "Update",
- size: "spectrum--medium",
- dataSource: {
- label: table.name,
- tableId: table._id,
- type: "table",
- },
- })
-
- const fieldGroup = new Component("@budibase/standard-components/fieldgroup")
- .instanceName("Field Group")
- .customProps({
- labelPosition: "left",
- })
-
- // Add all form fields from this schema to the field group
- const datasource = { type: "table", tableId: table._id }
- makeDatasourceFormComponents(datasource).forEach(component => {
- fieldGroup.addChild(component)
- })
-
- // Add all children to the form
- const formId = form._json._id
- const repeaterId = repeater._json._id
- const heading = table.primaryDisplay
- ? `{{ ${makePropSafe(repeaterId)}.${makePropSafe(table.primaryDisplay)} }}`
- : null
- form
- .addChild(makeBreadcrumbContainer(table.name, heading || "Edit"))
- .addChild(
- generateTitleContainer(table, heading || "Edit Row", formId, repeaterId)
- )
- .addChild(fieldGroup)
-
- repeater.addChild(form)
- provider.addChild(repeater)
-
return new Screen()
.instanceName(`${table.name} - Detail`)
.route(rowDetailUrl(table))
- .customProps({
- hAlign: "center",
- })
- .addChild(provider)
+ .addChild(makeBreadcrumbContainer(table.name, "Edit row"))
+ .addChild(generateFormBlock(table))
.json()
}
diff --git a/packages/builder/src/builderStore/store/screenTemplates/rowListScreen.js b/packages/builder/src/builderStore/store/screenTemplates/rowListScreen.js
index 39e88ae69e..b04d588ded 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/rowListScreen.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/rowListScreen.js
@@ -2,7 +2,6 @@ import sanitizeUrl from "./utils/sanitizeUrl"
import { newRowUrl } from "./newRowScreen"
import { Screen } from "./utils/Screen"
import { Component } from "./utils/Component"
-import { makePropSafe } from "@budibase/string-templates"
export default function (tables) {
return tables.map(table => {
@@ -18,48 +17,17 @@ export default function (tables) {
export const ROW_LIST_TEMPLATE = "ROW_LIST_TEMPLATE"
export const rowListUrl = table => sanitizeUrl(`/${table.name}`)
-function generateTitleContainer(table) {
- const newButton = new Component("@budibase/standard-components/button")
- .text("Create New")
- .customProps({
- size: "M",
- type: "primary",
- onClick: [
- {
- parameters: {
- url: newRowUrl(table),
- },
- "##eventHandlerType": "Navigate To",
- },
- ],
- })
- .instanceName("New Button")
-
- const heading = new Component("@budibase/standard-components/heading")
- .instanceName("Title")
- .text(table.name)
- .customProps({
- size: "M",
- align: "left",
- })
-
- return new Component("@budibase/standard-components/container")
- .customProps({
- direction: "row",
- hAlign: "stretch",
- vAlign: "middle",
- size: "shrink",
- gap: "M",
- })
- .instanceName("Title Container")
- .addChild(heading)
- .addChild(newButton)
-}
-
-const createScreen = table => {
- const provider = new Component("@budibase/standard-components/dataprovider")
- .instanceName(`Data Provider`)
+const generateTableBlock = table => {
+ const tableBlock = new Component("@budibase/standard-components/tableblock")
+ tableBlock
.customProps({
+ linkRows: true,
+ linkURL: `${rowListUrl(table)}/:id`,
+ showAutoColumns: false,
+ showTitleButton: true,
+ titleButtonText: "Create new",
+ titleButtonURL: newRowUrl(table),
+ title: table.name,
dataSource: {
label: table.name,
name: table._id,
@@ -68,41 +36,16 @@ const createScreen = table => {
},
size: "spectrum--medium",
paginate: true,
- limit: 8,
- })
-
- const spectrumTable = new Component("@budibase/standard-components/table")
- .customProps({
- dataProvider: `{{ literal ${makePropSafe(provider._json._id)} }}`,
- showAutoColumns: false,
- quiet: false,
rowCount: 8,
})
- .instanceName(`${table.name} Table`)
-
- const safeTableId = makePropSafe(spectrumTable._json._id)
- const safeRowId = makePropSafe("_id")
- const viewLink = new Component("@budibase/standard-components/link")
- .customProps({
- text: "View",
- url: `${rowListUrl(table)}/{{ ${safeTableId}.${safeRowId} }}`,
- size: "S",
- color: "var(--spectrum-global-color-gray-600)",
- align: "left",
- })
- .normalStyle({
- ["margin-left"]: "16px",
- ["margin-right"]: "16px",
- })
- .instanceName("View Link")
-
- spectrumTable.addChild(viewLink)
- provider.addChild(spectrumTable)
+ .instanceName(`${table.name} - Table block`)
+ return tableBlock
+}
+const createScreen = table => {
return new Screen()
.route(rowListUrl(table))
.instanceName(`${table.name} - List`)
- .addChild(generateTitleContainer(table))
- .addChild(provider)
+ .addChild(generateTableBlock(table))
.json()
}
diff --git a/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js b/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js
index 9176d535ab..f00cd9c215 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js
@@ -65,6 +65,11 @@ export function makeBreadcrumbContainer(tableName, text) {
vAlign: "middle",
size: "shrink",
})
+ .normalStyle({
+ width: "600px",
+ "margin-right": "auto",
+ "margin-left": "auto",
+ })
.instanceName("Breadcrumbs")
.addChild(link)
.addChild(arrowText)
@@ -138,6 +143,7 @@ const fieldTypeToComponentMap = {
attachment: "attachmentfield",
link: "relationshipfield",
json: "jsonfield",
+ barcodeqr: "codescanner",
}
export function makeDatasourceFormComponents(datasource) {
diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
index 3fd38bddeb..b7249ad60c 100644
--- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
+++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
@@ -261,6 +261,7 @@
} else {
return [
FIELDS.STRING,
+ FIELDS.BARCODEQR,
FIELDS.LONGFORM,
FIELDS.OPTIONS,
FIELDS.DATETIME,
diff --git a/packages/builder/src/components/backend/TableNavigator/TableDataImport.svelte b/packages/builder/src/components/backend/TableNavigator/TableDataImport.svelte
index 774aac0677..ea0ce59169 100644
--- a/packages/builder/src/components/backend/TableNavigator/TableDataImport.svelte
+++ b/packages/builder/src/components/backend/TableNavigator/TableDataImport.svelte
@@ -124,6 +124,14 @@
label: "Multi-select",
value: FIELDS.ARRAY.type,
},
+ {
+ label: "Barcode/QR",
+ value: FIELDS.BARCODEQR.type,
+ },
+ {
+ label: "Long Form Text",
+ value: FIELDS.LONGFORM.type,
+ },
]
diff --git a/packages/builder/src/components/design/settings/componentSettings.js b/packages/builder/src/components/design/settings/componentSettings.js
index 56ae3de490..c3b81968f4 100644
--- a/packages/builder/src/components/design/settings/componentSettings.js
+++ b/packages/builder/src/components/design/settings/componentSettings.js
@@ -51,6 +51,7 @@ const componentMap = {
"field/link": FormFieldSelect,
"field/array": FormFieldSelect,
"field/json": FormFieldSelect,
+ "field/barcode/qr": 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,
diff --git a/packages/builder/src/components/design/settings/controls/FormFieldSelect.svelte b/packages/builder/src/components/design/settings/controls/FormFieldSelect.svelte
index 1f08c56ff5..a02ea41099 100644
--- a/packages/builder/src/components/design/settings/controls/FormFieldSelect.svelte
+++ b/packages/builder/src/components/design/settings/controls/FormFieldSelect.svelte
@@ -24,18 +24,17 @@
const getOptions = (schema, type) => {
let entries = Object.entries(schema ?? {})
-
let types = []
- if (type === "field/options") {
+ if (type === "field/options" || type === "field/barcode/qr") {
// allow options to be used on both options and string fields
types = [type, "field/string"]
} else {
types = [type]
}
- types = types.map(type => type.split("/")[1])
- entries = entries.filter(entry => types.includes(entry[1].type))
+ types = types.map(type => type.slice(type.indexOf("/") + 1))
+ entries = entries.filter(entry => types.includes(entry[1].type))
return entries.map(entry => entry[0])
}
diff --git a/packages/builder/src/components/integration/index.svelte b/packages/builder/src/components/integration/index.svelte
index a0e1b8c1c4..d320cc30c2 100644
--- a/packages/builder/src/components/integration/index.svelte
+++ b/packages/builder/src/components/integration/index.svelte
@@ -1,7 +1,16 @@
{#if schema}
@@ -38,7 +82,7 @@
value={query.fields.sql}
parameters={query.parameters}
/>
- {:else if schema.type === QueryTypes.JSON}
+ {:else if shouldDisplayJsonBox}
{/if}
+ {:else if query.fields.extra?.actionType === "pipeline"}
+
+ {#if !query.fields.steps?.length}
+
+
+
+
+ {:else}
+ {#each query.fields.steps ?? [] as step, index}
+
+
+
+
+
+ Stage {index + 1}
+
+
+ {#if index > 0}
+
{
+ updateEditorsOnSwap(index, index - 1)
+ const target = query.fields.steps[index - 1].key
+ query.fields.steps[index - 1].key =
+ query.fields.steps[index].key
+ query.fields.steps[index].key = target
+ }}
+ icon="ChevronUp"
+ />
+ {/if}
+ {#if index < query.fields.steps.length - 1}
+ {
+ updateEditorsOnSwap(index, index + 1)
+ const target = query.fields.steps[index + 1].key
+ query.fields.steps[index + 1].key =
+ query.fields.steps[index].key
+ query.fields.steps[index].key = target
+ }}
+ icon="ChevronDown"
+ />
+ {/if}
+
+
{
+ updateEditorsOnDelete(index)
+ query.fields.steps.splice(index, 1)
+ query.fields.steps = [...query.fields.steps]
+ }}
+ icon="DeleteOutline"
+ />
+
+
+
+
+
+
+
+
+
+
+
+ {#if index === query.fields.steps.length - 1}
+
{
+ query.fields.steps = [
+ ...query.fields.steps,
+ {
+ key: "$match",
+ value: "{\n\t\n}",
+ },
+ ]
+ }}
+ />
+
+ {/if}
+
+ {/each}
+ {/if}
{/if}
{/key}
{/if}
@@ -67,4 +223,57 @@
grid-gap: var(--spacing-l);
align-items: center;
}
+ .blockSection {
+ padding: var(--spacing-xl);
+ }
+ .block {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: center;
+ margin-top: -6px;
+ }
+ .subblock {
+ width: 480px;
+ font-size: 16px;
+ background-color: var(--background);
+ border: 1px solid var(--spectrum-global-color-gray-300);
+ border-radius: 4px 4px 4px 4px;
+ }
+ .block-options {
+ justify-content: space-between;
+ display: flex;
+ align-items: center;
+ padding-bottom: 24px;
+ }
+ .block-actions {
+ justify-content: space-between;
+ display: flex;
+ align-items: right;
+ }
+
+ .fields {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+ align-items: stretch;
+ gap: var(--spacing-s);
+ }
+ .block-field {
+ display: grid;
+ grid-gap: 5px;
+ }
+ .separator {
+ width: 1px;
+ height: 25px;
+ border-left: 1px dashed var(--grey-4);
+ color: var(--grey-4);
+ /* center horizontally */
+ align-self: center;
+ }
+ .controls {
+ display: flex;
+ align-items: center;
+ justify-content: right;
+ }
diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js
index 28ce35d9f7..427e8d80a1 100644
--- a/packages/builder/src/constants/backend/index.js
+++ b/packages/builder/src/constants/backend/index.js
@@ -8,6 +8,15 @@ export const FIELDS = {
presence: false,
},
},
+ BARCODEQR: {
+ name: "Barcode/QR",
+ type: "barcodeqr",
+ constraints: {
+ type: "string",
+ length: {},
+ presence: false,
+ },
+ },
LONGFORM: {
name: "Long Form Text",
type: "longform",
@@ -148,6 +157,7 @@ export const ALLOWABLE_STRING_OPTIONS = [
FIELDS.STRING,
FIELDS.OPTIONS,
FIELDS.LONGFORM,
+ FIELDS.BARCODEQR,
]
export const ALLOWABLE_STRING_TYPES = ALLOWABLE_STRING_OPTIONS.map(
opt => opt.type
diff --git a/packages/builder/src/pages/builder/app/[application]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/_layout.svelte
index 28c5fe18c6..5d25bba0fc 100644
--- a/packages/builder/src/pages/builder/app/[application]/_layout.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/_layout.svelte
@@ -1,7 +1,16 @@
diff --git a/packages/client/src/components/app/blocks/FormBlock.svelte b/packages/client/src/components/app/blocks/FormBlock.svelte
index 5994360bbb..2d2d76a2b7 100644
--- a/packages/client/src/components/app/blocks/FormBlock.svelte
+++ b/packages/client/src/components/app/blocks/FormBlock.svelte
@@ -17,7 +17,7 @@
export let rowId
export let actionUrl
- const { fetchDatasourceSchema, builderStore } = getContext("sdk")
+ const { fetchDatasourceSchema } = getContext("sdk")
const FieldTypeToComponentMap = {
string: "stringfield",
number: "numberfield",
@@ -29,6 +29,7 @@
attachment: "attachmentfield",
link: "relationshipfield",
json: "jsonfield",
+ barcodeqr: "codescanner",
}
let schema
@@ -80,7 +81,7 @@
field: "_id",
operator: "equal",
type: "string",
- value: rowId,
+ value: !rowId ? `{{ ${safe("url")}.${safe("id")} }}` : rowId,
valueType: "Binding",
},
]
@@ -118,7 +119,7 @@
props={{
dataSource,
filter,
- limit: rowId ? 1 : $builderStore.inBuilder ? 1 : 0,
+ limit: 1,
paginate: false,
}}
>
@@ -129,6 +130,8 @@
props={{
dataProvider,
noRowsMessage: "We couldn't find a row to display",
+ direction: "column",
+ hAlign: "center",
}}
>
diff --git a/packages/client/src/components/app/forms/CodeScanner.svelte b/packages/client/src/components/app/forms/CodeScanner.svelte
new file mode 100644
index 0000000000..5dff3a96fa
--- /dev/null
+++ b/packages/client/src/components/app/forms/CodeScanner.svelte
@@ -0,0 +1,234 @@
+
+
+
+ {#if value && !manualMode}
+
+
+ {value}
+
+ {/if}
+
+ {#if allowManualEntry && manualMode}
+
+ {
+ dispatch("change", value)
+ }}
+ />
+
+ {/if}
+
+ {#if value}
+
{
+ dispatch("change", "")
+ }}
+ {disabled}
+ >
+ Clear
+
+ {:else}
+
{
+ showReaderModal()
+ }}
+ {disabled}
+ >
+ {scanButtonText}
+
+ {/if}
+
+
+
+
+
+
+
+
+ {#if cameraEnabled === false}
+
Your camera is disabled.
+ {/if}
+
+
+ {#if cameraEnabled === true}
+
+ {#if value}
+
+
+ {value}
+
+ {:else}
+
+
+ Searching for code...
+
+ {/if}
+
+ {/if}
+
+
+
+
+
+
+
+
+
diff --git a/packages/client/src/components/app/forms/CodeScannerField.svelte b/packages/client/src/components/app/forms/CodeScannerField.svelte
new file mode 100644
index 0000000000..7e020aa9c7
--- /dev/null
+++ b/packages/client/src/components/app/forms/CodeScannerField.svelte
@@ -0,0 +1,47 @@
+
+
+
+ {#if fieldState}
+
+ {/if}
+
diff --git a/packages/client/src/components/app/forms/index.js b/packages/client/src/components/app/forms/index.js
index 0ff82cea94..44c1516885 100644
--- a/packages/client/src/components/app/forms/index.js
+++ b/packages/client/src/components/app/forms/index.js
@@ -13,3 +13,4 @@ export { default as passwordfield } from "./PasswordField.svelte"
export { default as formstep } from "./FormStep.svelte"
export { default as jsonfield } from "./JSONField.svelte"
export { default as s3upload } from "./S3Upload.svelte"
+export { default as codescanner } from "./CodeScannerField.svelte"
diff --git a/packages/client/src/constants.js b/packages/client/src/constants.js
index 51ef3fd124..1560552dc4 100644
--- a/packages/client/src/constants.js
+++ b/packages/client/src/constants.js
@@ -1,5 +1,6 @@
export const FieldTypes = {
STRING: "string",
+ BARCODEQR: "barcodeqr",
LONGFORM: "longform",
OPTIONS: "options",
NUMBER: "number",
diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json
index 5d23386f05..50f28f646e 100644
--- a/packages/frontend-core/package.json
+++ b/packages/frontend-core/package.json
@@ -1,12 +1,12 @@
{
"name": "@budibase/frontend-core",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"description": "Budibase frontend core libraries used in builder and client",
"author": "Budibase",
"license": "MPL-2.0",
"svelte": "src/index.js",
"dependencies": {
- "@budibase/bbui": "2.0.30-alpha.3",
+ "@budibase/bbui": "2.0.30-alpha.7",
"lodash": "^4.17.21",
"svelte": "^3.46.2"
}
diff --git a/packages/sdk/package.json b/packages/sdk/package.json
index 3431ee654b..f31347f878 100644
--- a/packages/sdk/package.json
+++ b/packages/sdk/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/sdk",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"description": "Budibase Public API SDK",
"author": "Budibase",
"license": "MPL-2.0",
diff --git a/packages/server/__mocks__/mongodb.ts b/packages/server/__mocks__/mongodb.ts
index 4a1867f6f9..01b6e76fc4 100644
--- a/packages/server/__mocks__/mongodb.ts
+++ b/packages/server/__mocks__/mongodb.ts
@@ -33,7 +33,7 @@ module MongoMock {
})
}
- mongodb.ObjectID = jest.requireActual("mongodb").ObjectID
+ mongodb.ObjectId = jest.requireActual("mongodb").ObjectId
module.exports = mongodb
}
diff --git a/packages/server/package.json b/packages/server/package.json
index fa0c333a4c..539dc46ed9 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"description": "Budibase Web Server",
"main": "src/index.ts",
"repository": {
@@ -77,11 +77,11 @@
"license": "GPL-3.0",
"dependencies": {
"@apidevtools/swagger-parser": "10.0.3",
- "@budibase/backend-core": "2.0.30-alpha.3",
- "@budibase/client": "2.0.30-alpha.3",
- "@budibase/pro": "2.0.30-alpha.3",
- "@budibase/string-templates": "2.0.30-alpha.3",
- "@budibase/types": "2.0.30-alpha.3",
+ "@budibase/backend-core": "2.0.30-alpha.7",
+ "@budibase/client": "2.0.30-alpha.7",
+ "@budibase/pro": "2.0.30-alpha.7",
+ "@budibase/string-templates": "2.0.30-alpha.7",
+ "@budibase/types": "2.0.30-alpha.7",
"@bull-board/api": "3.7.0",
"@bull-board/koa": "3.9.4",
"@elastic/elasticsearch": "7.10.0",
@@ -123,7 +123,7 @@
"koa2-ratelimit": "1.1.1",
"lodash": "4.17.21",
"memorystream": "0.3.1",
- "mongodb": "3.6.3",
+ "mongodb": "4.9",
"mssql": "6.2.3",
"mysql2": "2.3.3",
"node-fetch": "2.6.7",
@@ -166,7 +166,6 @@
"@types/koa": "2.13.5",
"@types/koa__router": "8.0.11",
"@types/lodash": "4.14.180",
- "@types/mongodb": "3.6.3",
"@types/node": "14.18.20",
"@types/node-fetch": "2.6.1",
"@types/oracledb": "5.2.2",
diff --git a/packages/server/src/constants/index.js b/packages/server/src/constants/index.js
index 73bffeabd6..6b5bc4bf83 100644
--- a/packages/server/src/constants/index.js
+++ b/packages/server/src/constants/index.js
@@ -27,6 +27,7 @@ exports.NoEmptyFilterStrings = [
exports.FieldTypes = {
STRING: "string",
+ BARCODEQR: "barcodeqr",
LONGFORM: "longform",
OPTIONS: "options",
NUMBER: "number",
@@ -47,6 +48,7 @@ exports.CanSwitchTypes = [
exports.FieldTypes.STRING,
exports.FieldTypes.OPTIONS,
exports.FieldTypes.LONGFORM,
+ exports.FieldTypes.BARCODEQR,
],
[exports.FieldTypes.BOOLEAN, exports.FieldTypes.NUMBER],
]
diff --git a/packages/server/src/integrations/base/sqlTable.ts b/packages/server/src/integrations/base/sqlTable.ts
index af561e81c5..02f7ad8718 100644
--- a/packages/server/src/integrations/base/sqlTable.ts
+++ b/packages/server/src/integrations/base/sqlTable.ts
@@ -40,6 +40,7 @@ function generateSchema(
case FieldTypes.STRING:
case FieldTypes.OPTIONS:
case FieldTypes.LONGFORM:
+ case FieldTypes.BARCODEQR:
schema.text(key)
break
case FieldTypes.NUMBER:
diff --git a/packages/server/src/integrations/mongodb.ts b/packages/server/src/integrations/mongodb.ts
index 9f17028648..d7709a08c7 100644
--- a/packages/server/src/integrations/mongodb.ts
+++ b/packages/server/src/integrations/mongodb.ts
@@ -6,13 +6,12 @@ import {
} from "@budibase/types"
import {
MongoClient,
- ObjectID,
- FilterQuery,
- UpdateQuery,
- FindOneAndUpdateOption,
- UpdateOneOptions,
- UpdateManyOptions,
- CommonOptions,
+ ObjectId,
+ Filter,
+ UpdateFilter,
+ FindOneAndUpdateOptions,
+ UpdateOptions,
+ OperationOptions,
} from "mongodb"
interface MongoDBConfig {
@@ -57,6 +56,232 @@ const SCHEMA: Integration = {
delete: {
type: QueryType.JSON,
},
+ aggregate: {
+ type: QueryType.JSON,
+ steps: [
+ {
+ key: "$addFields",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$bucket",
+ template: `{
+ "groupBy": "",
+ "boundaries": [],
+ "default": "",
+ "output": {}
+}`,
+ },
+ {
+ key: "$bucketAuto",
+ template: `{
+ "groupBy": "",
+ "buckets": 1,
+ "output": {},
+ "granularity": "R5"
+}`,
+ },
+ {
+ key: "$changeStream",
+ template: `{
+ "allChangesForCluster": true,
+ "fullDocument": "",
+ "fullDocumentBeforeChange": "",
+ "resumeAfter": 1,
+ "showExpandedEvents": true,
+ "startAfter": {},
+ "startAtOperationTime": ""
+}`,
+ },
+ {
+ key: "$collStats",
+ template: `{
+ "latencyStats": { "histograms": true } },
+ "storageStats": { "scale": 1 } },
+ "count": {},
+ "queryExecStats": {}
+}`,
+ },
+ {
+ key: "$count",
+ template: ``,
+ },
+ {
+ key: "$densify",
+ template: `{
+ "field": "",
+ "partitionByFields": [],
+ "range": {
+ "step": 1,
+ "unit": 1,
+ "bounds": "full"
+ }
+}`,
+ },
+ {
+ key: "$documents",
+ template: `[]`,
+ },
+ {
+ key: "$facet",
+ template: `{\n\t\n}`,
+ },
+ {
+ key: "$fill",
+ template: `{
+ "partitionBy": "",
+ "partitionByFields": [],
+ "sortBy": {},
+ "output": {}
+}`,
+ },
+ {
+ key: "$geoNear",
+ template: `{
+ "near": {
+ "type": "Point",
+ "coordinates": [
+ -73.98142, 40.71782
+ ]
+ },
+ "key": "location",
+ "distanceField": "dist.calculated",
+ "query": { "category": "Parks" }
+}`,
+ },
+ {
+ key: "$graphLookup",
+ template: `{
+ "from": "",
+ "startWith": "",
+ "connectFromField": "",
+ "connectToField": "",
+ "as": "",
+ "maxDepth": 1,
+ "depthField": "",
+ "restrictSearchWithMatch": {}
+}`,
+ },
+ {
+ key: "$group",
+ template: `{
+ "_id": ""
+}`,
+ },
+ {
+ key: "$indexStats",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$limit",
+ template: `1`,
+ },
+ {
+ key: "$listLocalSessions",
+ template: `{\n\t\n}`,
+ },
+ {
+ key: "$listSessions",
+ template: `{\n\t\n}`,
+ },
+ {
+ key: "$lookup",
+ template: `{
+ "from": "",
+ "localField": "",
+ "foreignField": "",
+ "as": ""
+}`,
+ },
+ {
+ key: "$match",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$merge",
+ template: `{
+ "into": {},
+ "on": "_id",
+ "whenMatched": "replace",
+ "whenNotMatched": "insert"
+}`,
+ },
+ {
+ key: "$out",
+ template: `{
+ "db": "",
+ "coll": ""
+}`,
+ },
+ {
+ key: "$planCacheStats",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$project",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$redact",
+ template: "",
+ },
+ {
+ key: "$replaceRoot",
+ template: `{ "newRoot": "" }`,
+ },
+ {
+ key: "$replaceWith",
+ template: ``,
+ },
+ {
+ key: "$sample",
+ template: `{ "size": 3 }`,
+ },
+ {
+ key: "$set",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$setWindowFields",
+ template: `{
+ "partitionBy": "",
+ "sortBy": {},
+ "output": {}
+}`,
+ },
+ {
+ key: "$skip",
+ template: `1`,
+ },
+ {
+ key: "$sort",
+ template: "{\n\t\n}",
+ },
+ {
+ key: "$sortByCount",
+ template: "",
+ },
+ {
+ key: "$unionWith",
+ template: `{
+ "coll": "",
+ "pipeline": []
+}`,
+ },
+ {
+ key: "$unset",
+ template: "",
+ },
+ {
+ key: "$unwind",
+ template: `{
+ "path": "",
+ "includeArrayIndex": "",
+ "preserveNullAndEmptyArrays": true
+}`,
+ },
+ ],
+ },
},
extra: {
collection: {
@@ -64,8 +289,8 @@ const SCHEMA: Integration = {
type: DatasourceFieldType.STRING,
required: true,
},
- actionTypes: {
- displayName: "Action Types",
+ actionType: {
+ displayName: "Query Type",
type: DatasourceFieldType.LIST,
required: true,
data: {
@@ -73,6 +298,7 @@ const SCHEMA: Integration = {
create: ["insertOne", "insertMany"],
update: ["updateOne", "updateMany"],
delete: ["deleteOne", "deleteMany"],
+ aggregate: ["json", "pipeline"],
},
},
},
@@ -104,7 +330,7 @@ class MongoIntegration implements IntegrationBase {
) {
const id = json[field].match(/(?<=objectid\(['"]).*(?=['"]\))/gi)?.[0]
if (id) {
- json[field] = ObjectID.createFromHexString(id)
+ json[field] = ObjectId.createFromHexString(id)
}
}
}
@@ -168,7 +394,7 @@ class MongoIntegration implements IntegrationBase {
// For mongodb we add an extra actionType to specify
// which method we want to call on the collection
- switch (query.extra.actionTypes) {
+ switch (query.extra.actionType) {
case "insertOne": {
return await collection.insertOne(json)
}
@@ -177,7 +403,7 @@ class MongoIntegration implements IntegrationBase {
}
default: {
throw new Error(
- `actionType ${query.extra.actionTypes} does not exist on DB for create`
+ `actionType ${query.extra.actionType} does not exist on DB for create`
)
}
}
@@ -196,7 +422,7 @@ class MongoIntegration implements IntegrationBase {
const collection = db.collection(query.extra.collection)
let json = this.createObjectIds(query.json)
- switch (query.extra.actionTypes) {
+ switch (query.extra.actionType) {
case "find": {
return await collection.find(json).toArray()
}
@@ -208,9 +434,9 @@ class MongoIntegration implements IntegrationBase {
json = this.parseQueryParams(query.json, "update")
}
let findAndUpdateJson = this.createObjectIds(json) as {
- filter: FilterQuery
- update: UpdateQuery
- options: FindOneAndUpdateOption
+ filter: Filter
+ update: UpdateFilter
+ options: FindOneAndUpdateOptions
}
return await collection.findOneAndUpdate(
findAndUpdateJson.filter,
@@ -226,7 +452,7 @@ class MongoIntegration implements IntegrationBase {
}
default: {
throw new Error(
- `actionType ${query.extra.actionTypes} does not exist on DB for read`
+ `actionType ${query.extra.actionType} does not exist on DB for read`
)
}
}
@@ -248,29 +474,29 @@ class MongoIntegration implements IntegrationBase {
queryJson = this.parseQueryParams(queryJson, "update")
}
let json = this.createObjectIds(queryJson) as {
- filter: FilterQuery
- update: UpdateQuery
+ filter: Filter
+ update: UpdateFilter
options: object
}
- switch (query.extra.actionTypes) {
+ switch (query.extra.actionType) {
case "updateOne": {
return await collection.updateOne(
json.filter,
json.update,
- json.options as UpdateOneOptions
+ json.options as UpdateOptions
)
}
case "updateMany": {
return await collection.updateMany(
json.filter,
json.update,
- json.options as UpdateManyOptions
+ json.options as UpdateOptions
)
}
default: {
throw new Error(
- `actionType ${query.extra.actionTypes} does not exist on DB for update`
+ `actionType ${query.extra.actionType} does not exist on DB for update`
)
}
}
@@ -292,8 +518,8 @@ class MongoIntegration implements IntegrationBase {
queryJson = this.parseQueryParams(queryJson, "delete")
}
let json = this.createObjectIds(queryJson) as {
- filter: FilterQuery
- options: CommonOptions
+ filter: Filter
+ options: OperationOptions
}
if (!json.options) {
json = {
@@ -302,7 +528,7 @@ class MongoIntegration implements IntegrationBase {
}
}
- switch (query.extra.actionTypes) {
+ switch (query.extra.actionType) {
case "deleteOne": {
return await collection.deleteOne(json.filter, json.options)
}
@@ -311,7 +537,7 @@ class MongoIntegration implements IntegrationBase {
}
default: {
throw new Error(
- `actionType ${query.extra.actionTypes} does not exist on DB for delete`
+ `actionType ${query.extra.actionType} does not exist on DB for delete`
)
}
}
@@ -322,6 +548,43 @@ class MongoIntegration implements IntegrationBase {
await this.client.close()
}
}
+
+ async aggregate(query: {
+ json: object
+ steps: any[]
+ extra: { [key: string]: string }
+ }) {
+ try {
+ await this.connect()
+ const db = this.client.db(this.config.db)
+ const collection = db.collection(query.extra.collection)
+ let response = []
+ if (query.extra?.actionType === "pipeline") {
+ for await (const doc of collection.aggregate(
+ query.steps.map(({ key, value }) => {
+ let temp: any = {}
+ temp[key] = JSON.parse(value.value)
+ return this.createObjectIds(temp)
+ })
+ )) {
+ response.push(doc)
+ }
+ } else {
+ const stages: Array = query.json as Array
+ for await (const doc of collection.aggregate(
+ stages ? this.createObjectIds(stages) : []
+ )) {
+ response.push(doc)
+ }
+ }
+ return response
+ } catch (err) {
+ console.error("Error writing to mongodb", err)
+ throw err
+ } finally {
+ await this.client.close()
+ }
+ }
}
export default {
diff --git a/packages/server/src/integrations/tests/mongo.spec.ts b/packages/server/src/integrations/tests/mongo.spec.ts
index a326d3ac2a..b941d7ae66 100644
--- a/packages/server/src/integrations/tests/mongo.spec.ts
+++ b/packages/server/src/integrations/tests/mongo.spec.ts
@@ -34,7 +34,7 @@ describe("MongoDB Integration", () => {
await config.integration.create({
index: indexName,
json: body,
- extra: { collection: "testCollection", actionTypes: "insertOne" },
+ extra: { collection: "testCollection", actionType: "insertOne" },
})
expect(config.integration.client.insertOne).toHaveBeenCalledWith(body)
})
@@ -44,7 +44,7 @@ describe("MongoDB Integration", () => {
json: {
address: "test",
},
- extra: { collection: "testCollection", actionTypes: "find" },
+ extra: { collection: "testCollection", actionType: "find" },
}
const response = await config.integration.read(query)
expect(config.integration.client.find).toHaveBeenCalledWith(query.json)
@@ -61,7 +61,7 @@ describe("MongoDB Integration", () => {
opt: "option",
},
},
- extra: { collection: "testCollection", actionTypes: "deleteOne" },
+ extra: { collection: "testCollection", actionType: "deleteOne" },
}
await config.integration.delete(query)
expect(config.integration.client.deleteOne).toHaveBeenCalledWith(
@@ -83,7 +83,7 @@ describe("MongoDB Integration", () => {
upsert: false,
},
},
- extra: { collection: "testCollection", actionTypes: "updateOne" },
+ extra: { collection: "testCollection", actionType: "updateOne" },
}
await config.integration.update(query)
expect(config.integration.client.updateOne).toHaveBeenCalledWith(
@@ -97,7 +97,7 @@ describe("MongoDB Integration", () => {
const restore = disableConsole()
const query = {
- extra: { collection: "testCollection", actionTypes: "deleteOne" },
+ extra: { collection: "testCollection", actionType: "deleteOne" },
}
let error = null
@@ -125,19 +125,19 @@ describe("MongoDB Integration", () => {
upsert: false,
},
},
- extra: { collection: "testCollection", actionTypes: "updateOne" },
+ extra: { collection: "testCollection", actionType: "updateOne" },
}
await config.integration.update(query)
expect(config.integration.client.updateOne).toHaveBeenCalled()
const args = config.integration.client.updateOne.mock.calls[0]
expect(args[0]).toEqual({
- _id: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
- name: mongo.ObjectID.createFromHexString("BBBB12345678ABCD12345678"),
+ _id: mongo.ObjectId.createFromHexString("ACBD12345678ABCD12345678"),
+ name: mongo.ObjectId.createFromHexString("BBBB12345678ABCD12345678"),
})
expect(args[1]).toEqual({
- _id: mongo.ObjectID.createFromHexString("FFFF12345678ABCD12345678"),
- name: mongo.ObjectID.createFromHexString("CCCC12345678ABCD12345678"),
+ _id: mongo.ObjectId.createFromHexString("FFFF12345678ABCD12345678"),
+ name: mongo.ObjectId.createFromHexString("CCCC12345678ABCD12345678"),
})
expect(args[2]).toEqual({
upsert: false,
@@ -161,7 +161,7 @@ describe("MongoDB Integration", () => {
upsert: true,
},
},
- extra: { collection: "testCollection", actionTypes: "updateOne" },
+ extra: { collection: "testCollection", actionType: "updateOne" },
}
await config.integration.update(query)
expect(config.integration.client.updateOne).toHaveBeenCalled()
@@ -169,12 +169,12 @@ describe("MongoDB Integration", () => {
const args = config.integration.client.updateOne.mock.calls[0]
expect(args[0]).toEqual({
_id: {
- $eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
+ $eq: mongo.ObjectId.createFromHexString("ACBD12345678ABCD12345678"),
},
})
expect(args[1]).toEqual({
$set: {
- _id: mongo.ObjectID.createFromHexString("FFFF12345678ABCD12345678"),
+ _id: mongo.ObjectId.createFromHexString("FFFF12345678ABCD12345678"),
},
})
expect(args[2]).toEqual({
@@ -200,7 +200,7 @@ describe("MongoDB Integration", () => {
upsert: false,
},
},
- extra: { collection: "testCollection", actionTypes: "findOneAndUpdate" },
+ extra: { collection: "testCollection", actionType: "findOneAndUpdate" },
}
await config.integration.read(query)
expect(config.integration.client.findOneAndUpdate).toHaveBeenCalled()
@@ -208,7 +208,7 @@ describe("MongoDB Integration", () => {
const args = config.integration.client.findOneAndUpdate.mock.calls[0]
expect(args[0]).toEqual({
_id: {
- $eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
+ $eq: mongo.ObjectId.createFromHexString("ACBD12345678ABCD12345678"),
},
})
expect(args[1]).toEqual({
@@ -245,7 +245,7 @@ describe("MongoDB Integration", () => {
{
"upsert": true
}`,
- extra: { collection: "testCollection", actionTypes: "updateOne" },
+ extra: { collection: "testCollection", actionType: "updateOne" },
}
await config.integration.update(query)
expect(config.integration.client.updateOne).toHaveBeenCalled()
@@ -253,7 +253,7 @@ describe("MongoDB Integration", () => {
const args = config.integration.client.updateOne.mock.calls[0]
expect(args[0]).toEqual({
_id: {
- $eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
+ $eq: mongo.ObjectId.createFromHexString("ACBD12345678ABCD12345678"),
},
})
expect(args[1]).toEqual({
@@ -300,7 +300,7 @@ describe("MongoDB Integration", () => {
"upsert": true,
"extra": "ad\\"{\\"d"
}`,
- extra: { collection: "testCollection", actionTypes: "updateOne" },
+ extra: { collection: "testCollection", actionType: "updateOne" },
}
await config.integration.update(query)
expect(config.integration.client.updateOne).toHaveBeenCalled()
@@ -308,7 +308,7 @@ describe("MongoDB Integration", () => {
const args = config.integration.client.updateOne.mock.calls[0]
expect(args[0]).toEqual({
_id: {
- $eq: mongo.ObjectID.createFromHexString("ACBD12345678ABCD12345678"),
+ $eq: mongo.ObjectId.createFromHexString("ACBD12345678ABCD12345678"),
},
})
expect(args[1]).toEqual({
diff --git a/packages/server/src/utilities/csvParser.js b/packages/server/src/utilities/csvParser.js
index 8f9b3373c9..09449f6fc1 100644
--- a/packages/server/src/utilities/csvParser.js
+++ b/packages/server/src/utilities/csvParser.js
@@ -4,6 +4,7 @@ const { FieldTypes } = require("../constants")
const VALIDATORS = {
[FieldTypes.STRING]: () => true,
[FieldTypes.OPTIONS]: () => true,
+ [FieldTypes.BARCODEQR]: () => true,
[FieldTypes.NUMBER]: attribute => {
// allow not to be present
if (!attribute) {
diff --git a/packages/server/src/utilities/rowProcessor/index.js b/packages/server/src/utilities/rowProcessor/index.js
index e4c364eaf3..91daa1b5a0 100644
--- a/packages/server/src/utilities/rowProcessor/index.js
+++ b/packages/server/src/utilities/rowProcessor/index.js
@@ -48,6 +48,11 @@ const TYPE_TRANSFORM_MAP = {
[null]: "",
[undefined]: undefined,
},
+ [FieldTypes.BARCODEQR]: {
+ "": "",
+ [null]: "",
+ [undefined]: undefined,
+ },
[FieldTypes.FORMULA]: {
"": "",
[null]: "",
diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock
index 1a8f5a6cd5..0467492533 100644
--- a/packages/server/yarn.lock
+++ b/packages/server/yarn.lock
@@ -1094,12 +1094,12 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-"@budibase/backend-core@2.0.30-alpha.3":
- version "2.0.30-alpha.3"
- resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.0.30-alpha.3.tgz#42235b33676c3357d8cf8e181e619c4c92065fd0"
- integrity sha512-ixE28ddY8FqvCcaCkqsxUI5UjkFKxFu23MgNARJ8VSpj5NLq6d8qAR+xE0E2pJ58hm5r1KLn2yAZiNXZzu0dzg==
+"@budibase/backend-core@2.0.30-alpha.7":
+ version "2.0.30-alpha.7"
+ resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.0.30-alpha.7.tgz#a46ddcda96c6ecead6574cb0e2751e4ed858371d"
+ integrity sha512-aX41o4QE7OlS+JeKIDt3bJGGsbddI4eRAram+2bYlHONbupkbTAVs9DFBkV9BkMCQ8zk9FSDY90Le0GEuiI+sw==
dependencies:
- "@budibase/types" "2.0.30-alpha.3"
+ "@budibase/types" "2.0.30-alpha.7"
"@shopify/jest-koa-mocks" "5.0.1"
"@techpass/passport-openidconnect" "0.3.2"
aws-sdk "2.1030.0"
@@ -1180,13 +1180,13 @@
svelte-flatpickr "^3.2.3"
svelte-portal "^1.0.0"
-"@budibase/pro@2.0.30-alpha.3":
- version "2.0.30-alpha.3"
- resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.0.30-alpha.3.tgz#ad8f8aa5ced2b5200e05b98e392267b9f84c8177"
- integrity sha512-Cw7XUGVVbHCxKo3tJFvG5EKUvO0zdOoU/baFArjMiNHAivlZvFVWCsxptIua+qtFkaUpjQneTHihFiQnY9g83A==
+"@budibase/pro@2.0.30-alpha.7":
+ version "2.0.30-alpha.7"
+ resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.0.30-alpha.7.tgz#1432b47141b305666dc005c5fc5a02d9cd38cf6a"
+ integrity sha512-F8qkj+Uy2Pqi/FeJYDBEdNAT7zEx/dw19x8o+3vHmTnQhwLbuSOHGyy9C6PgSW5Gmm0GgxjOycDVOq7ewnwWDA==
dependencies:
- "@budibase/backend-core" "2.0.30-alpha.3"
- "@budibase/types" "2.0.30-alpha.3"
+ "@budibase/backend-core" "2.0.30-alpha.7"
+ "@budibase/types" "2.0.30-alpha.7"
"@koa/router" "8.0.8"
joi "17.6.0"
node-fetch "^2.6.1"
@@ -1209,10 +1209,10 @@
svelte-apexcharts "^1.0.2"
svelte-flatpickr "^3.1.0"
-"@budibase/types@2.0.30-alpha.3":
- version "2.0.30-alpha.3"
- resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.0.30-alpha.3.tgz#cb55bcced75b711cc8a675284fbacaa8ebf1c0f2"
- integrity sha512-rHeFVuNbSSE4fMnX6uyrM2r47m+neqFXlVNOkhHU9i7KoIcIZbEYInU8CjUFR2da3ruST9ajXjJ5UenX2+MnTg==
+"@budibase/types@2.0.30-alpha.7":
+ version "2.0.30-alpha.7"
+ resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.0.30-alpha.7.tgz#fe85563eb42ce01869e653a790a7f213ea2d6308"
+ integrity sha512-WL+2LPQyYq1BwPGgkM7wRnIv4/QXMX1ivXpzoy9lzi1yCJw0rxg8MBpfUuVU0cmDOAnmHkTh2nBQNUhLYPyvVA==
"@bull-board/api@3.7.0":
version "3.7.0"
@@ -2649,7 +2649,7 @@
"@types/connect" "*"
"@types/node" "*"
-"@types/bson@*", "@types/bson@4.2.0":
+"@types/bson@4.2.0":
version "4.2.0"
resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.0.tgz#a2f71e933ff54b2c3bf267b67fa221e295a33337"
integrity sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==
@@ -2889,14 +2889,6 @@
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
-"@types/mongodb@3.6.3":
- version "3.6.3"
- resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.3.tgz#5655af409d9e32d5d5ae9a653abf3e5f9c83eb7a"
- integrity sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==
- dependencies:
- "@types/bson" "*"
- "@types/node" "*"
-
"@types/node-fetch@2.6.1":
version "2.6.1"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975"
@@ -3036,6 +3028,19 @@
dependencies:
"@types/node" "*"
+"@types/webidl-conversions@*":
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e"
+ integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==
+
+"@types/whatwg-url@^8.2.1":
+ version "8.2.2"
+ resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63"
+ integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==
+ dependencies:
+ "@types/node" "*"
+ "@types/webidl-conversions" "*"
+
"@types/yargs-parser@*":
version "21.0.0"
resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
@@ -4152,14 +4157,6 @@ bl@^1.0.0:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
-bl@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5"
- integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==
- dependencies:
- readable-stream "^2.3.5"
- safe-buffer "^5.1.1"
-
bl@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f"
@@ -4309,10 +4306,12 @@ bson@*:
dependencies:
buffer "^5.6.0"
-bson@^1.1.4:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.6.tgz#fb819be9a60cd677e0853aee4ca712a785d6618a"
- integrity sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==
+bson@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.0.tgz#7874a60091ffc7a45c5dd2973b5cad7cded9718a"
+ integrity sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==
+ dependencies:
+ buffer "^5.6.0"
buffer-alloc-unsafe@^1.1.0:
version "1.1.0"
@@ -5305,7 +5304,7 @@ delegates@^1.0.0:
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
-denque@^1.1.0, denque@^1.4.1:
+denque@^1.1.0:
version "1.5.1"
resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf"
integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==
@@ -5315,6 +5314,11 @@ denque@^2.0.1:
resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a"
integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==
+denque@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1"
+ integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==
+
depd@2.0.0, depd@^2.0.0, depd@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@@ -7676,6 +7680,11 @@ ip-regex@^2.1.0:
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==
+ip@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da"
+ integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
+
is-accessor-descriptor@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -10216,18 +10225,25 @@ moment-timezone@^0.5.15:
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
-mongodb@3.6.3:
- version "3.6.3"
- resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.3.tgz#eddaed0cc3598474d7a15f0f2a5b04848489fd05"
- integrity sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==
+mongodb-connection-string-url@^2.5.3:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz#c0c572b71570e58be2bd52b33dffd1330cfb6990"
+ integrity sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==
dependencies:
- bl "^2.2.1"
- bson "^1.1.4"
- denque "^1.4.1"
- require_optional "^1.0.1"
- safe-buffer "^5.1.2"
+ "@types/whatwg-url" "^8.2.1"
+ whatwg-url "^11.0.0"
+
+mongodb@4.9:
+ version "4.9.0"
+ resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.9.0.tgz#58618439b721f2d6f7d38bb10a4612e29d7f1c8a"
+ integrity sha512-tJJEFJz7OQTQPZeVHZJIeSOjMRqc5eSyXTt86vSQENEErpkiG7279tM/GT5AVZ7TgXNh9HQxoa2ZkbrANz5GQw==
+ dependencies:
+ bson "^4.7.0"
+ denque "^2.1.0"
+ mongodb-connection-string-url "^2.5.3"
+ socks "^2.7.0"
optionalDependencies:
- saslprep "^1.0.0"
+ saslprep "^1.0.3"
monitor-event-loop-delay@^1.0.0:
version "1.0.0"
@@ -12240,14 +12256,6 @@ require-main-filename@^2.0.0:
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-require_optional@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
- integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==
- dependencies:
- resolve-from "^2.0.0"
- semver "^5.1.0"
-
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -12260,11 +12268,6 @@ resolve-cwd@^3.0.0:
dependencies:
resolve-from "^5.0.0"
-resolve-from@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
- integrity sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==
-
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -12451,7 +12454,7 @@ sanitize-s3-objectkey@0.0.1:
resolved "https://registry.yarnpkg.com/sanitize-s3-objectkey/-/sanitize-s3-objectkey-0.0.1.tgz#efa9887cd45275b40234fb4bb12fc5754fe64e7e"
integrity sha512-ZTk7aqLxy4sD40GWcYWoLfbe05XLmkKvh6vGKe13ADlei24xlezcvjgKy1qRArlaIbIMYaqK7PCalvZtulZlaQ==
-saslprep@^1.0.0:
+saslprep@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
@@ -12513,7 +12516,7 @@ semver-diff@^3.1.1:
dependencies:
semver "^6.3.0"
-"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1:
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -12701,6 +12704,11 @@ slice-ansi@^2.1.0:
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
+smart-buffer@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
+ integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -12801,6 +12809,14 @@ socket.io@^4.5.1:
socket.io-adapter "~2.4.0"
socket.io-parser "~4.2.0"
+socks@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0"
+ integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==
+ dependencies:
+ ip "^2.0.0"
+ smart-buffer "^4.2.0"
+
sonic-boom@^1.0.2:
version "1.4.1"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e"
@@ -13805,6 +13821,13 @@ tr46@^2.1.0:
dependencies:
punycode "^2.1.1"
+tr46@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
+ integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
+ dependencies:
+ punycode "^2.1.1"
+
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
@@ -14364,6 +14387,11 @@ webidl-conversions@^6.1.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
webpack-cli@^4.9.1:
version "4.9.2"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
@@ -14445,6 +14473,14 @@ whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+whatwg-url@^11.0.0:
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
+ integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
+ dependencies:
+ tr46 "^3.0.0"
+ webidl-conversions "^7.0.0"
+
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index d8117e19f4..d360f8f9e8 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.cjs",
"module": "dist/bundle.mjs",
diff --git a/packages/types/package.json b/packages/types/package.json
index c29f53d997..32996f4651 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/types",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"description": "Budibase types",
"main": "dist/index.js",
"types": "dist/index.d.ts",
diff --git a/packages/types/src/sdk/datasources.ts b/packages/types/src/sdk/datasources.ts
index d01d636b86..279a76446f 100644
--- a/packages/types/src/sdk/datasources.ts
+++ b/packages/types/src/sdk/datasources.ts
@@ -24,6 +24,7 @@ export enum QueryType {
export enum DatasourceFieldType {
STRING = "string",
+ CODE = "code",
LONGFORM = "longForm",
BOOLEAN = "boolean",
NUMBER = "number",
@@ -70,6 +71,11 @@ export enum FilterType {
ONE_OF = "oneOf",
}
+export interface StepDefinition {
+ key: string
+ template: string
+}
+
export interface QueryDefinition {
type: QueryType
displayName?: string
@@ -77,6 +83,7 @@ export interface QueryDefinition {
customisable?: boolean
fields?: object
urlDisplay?: boolean
+ steps?: Array
}
export interface ExtraQueryConfig {
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 34de6d0924..cf77ec8fdb 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/worker",
"email": "hi@budibase.com",
- "version": "2.0.30-alpha.3",
+ "version": "2.0.30-alpha.7",
"description": "Budibase background service",
"main": "src/index.ts",
"repository": {
@@ -36,10 +36,10 @@
"author": "Budibase",
"license": "GPL-3.0",
"dependencies": {
- "@budibase/backend-core": "2.0.30-alpha.3",
- "@budibase/pro": "2.0.30-alpha.3",
- "@budibase/string-templates": "2.0.30-alpha.3",
- "@budibase/types": "2.0.30-alpha.3",
+ "@budibase/backend-core": "2.0.30-alpha.7",
+ "@budibase/pro": "2.0.30-alpha.7",
+ "@budibase/string-templates": "2.0.30-alpha.7",
+ "@budibase/types": "2.0.30-alpha.7",
"@koa/router": "8.0.8",
"@sentry/node": "6.17.7",
"@techpass/passport-openidconnect": "0.3.2",
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index 92a8ef024d..1c9ad3fa88 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -291,12 +291,12 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-"@budibase/backend-core@2.0.30-alpha.3":
- version "2.0.30-alpha.3"
- resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.0.30-alpha.3.tgz#42235b33676c3357d8cf8e181e619c4c92065fd0"
- integrity sha512-ixE28ddY8FqvCcaCkqsxUI5UjkFKxFu23MgNARJ8VSpj5NLq6d8qAR+xE0E2pJ58hm5r1KLn2yAZiNXZzu0dzg==
+"@budibase/backend-core@2.0.30-alpha.7":
+ version "2.0.30-alpha.7"
+ resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-2.0.30-alpha.7.tgz#a46ddcda96c6ecead6574cb0e2751e4ed858371d"
+ integrity sha512-aX41o4QE7OlS+JeKIDt3bJGGsbddI4eRAram+2bYlHONbupkbTAVs9DFBkV9BkMCQ8zk9FSDY90Le0GEuiI+sw==
dependencies:
- "@budibase/types" "2.0.30-alpha.3"
+ "@budibase/types" "2.0.30-alpha.7"
"@shopify/jest-koa-mocks" "5.0.1"
"@techpass/passport-openidconnect" "0.3.2"
aws-sdk "2.1030.0"
@@ -327,21 +327,21 @@
uuid "8.3.2"
zlib "1.0.5"
-"@budibase/pro@2.0.30-alpha.3":
- version "2.0.30-alpha.3"
- resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.0.30-alpha.3.tgz#ad8f8aa5ced2b5200e05b98e392267b9f84c8177"
- integrity sha512-Cw7XUGVVbHCxKo3tJFvG5EKUvO0zdOoU/baFArjMiNHAivlZvFVWCsxptIua+qtFkaUpjQneTHihFiQnY9g83A==
+"@budibase/pro@2.0.30-alpha.7":
+ version "2.0.30-alpha.7"
+ resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-2.0.30-alpha.7.tgz#1432b47141b305666dc005c5fc5a02d9cd38cf6a"
+ integrity sha512-F8qkj+Uy2Pqi/FeJYDBEdNAT7zEx/dw19x8o+3vHmTnQhwLbuSOHGyy9C6PgSW5Gmm0GgxjOycDVOq7ewnwWDA==
dependencies:
- "@budibase/backend-core" "2.0.30-alpha.3"
- "@budibase/types" "2.0.30-alpha.3"
+ "@budibase/backend-core" "2.0.30-alpha.7"
+ "@budibase/types" "2.0.30-alpha.7"
"@koa/router" "8.0.8"
joi "17.6.0"
node-fetch "^2.6.1"
-"@budibase/types@2.0.30-alpha.3":
- version "2.0.30-alpha.3"
- resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.0.30-alpha.3.tgz#cb55bcced75b711cc8a675284fbacaa8ebf1c0f2"
- integrity sha512-rHeFVuNbSSE4fMnX6uyrM2r47m+neqFXlVNOkhHU9i7KoIcIZbEYInU8CjUFR2da3ruST9ajXjJ5UenX2+MnTg==
+"@budibase/types@2.0.30-alpha.7":
+ version "2.0.30-alpha.7"
+ resolved "https://registry.yarnpkg.com/@budibase/types/-/types-2.0.30-alpha.7.tgz#fe85563eb42ce01869e653a790a7f213ea2d6308"
+ integrity sha512-WL+2LPQyYq1BwPGgkM7wRnIv4/QXMX1ivXpzoy9lzi1yCJw0rxg8MBpfUuVU0cmDOAnmHkTh2nBQNUhLYPyvVA==
"@cspotcode/source-map-consumer@0.8.0":
version "0.8.0"
diff --git a/yarn.lock b/yarn.lock
index 340aad3f08..a0c22d92bf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -986,13 +986,6 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
-"@types/bson@*":
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.2.0.tgz#a2f71e933ff54b2c3bf267b67fa221e295a33337"
- integrity sha512-ELCPqAdroMdcuxqwMgUpifQyRoTpyYCNr1V9xKyF40VsBobsj+BbWNRvwGchMgBPGqkw655ypkjj2MEF5ywVwg==
- dependencies:
- bson "*"
-
"@types/estree@0.0.39":
version "0.0.39"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
@@ -1008,19 +1001,6 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
-"@types/mongodb@3.6.3":
- version "3.6.3"
- resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.6.3.tgz#5655af409d9e32d5d5ae9a653abf3e5f9c83eb7a"
- integrity sha512-6YNqGP1hk5bjUFaim+QoFFuI61WjHiHE1BNeB41TA00Xd2K7zG4lcWyLLq/XtIp36uMavvS5hoAUJ+1u/GcX2Q==
- dependencies:
- "@types/bson" "*"
- "@types/node" "*"
-
-"@types/node@*":
- version "17.0.33"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.33.tgz#3c1879b276dc63e73030bb91165e62a4509cd506"
- integrity sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ==
-
"@types/node@>= 8":
version "18.0.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
@@ -1466,13 +1446,6 @@ braces@^3.0.2:
dependencies:
fill-range "^7.0.1"
-bson@*:
- version "4.6.3"
- resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.3.tgz#d1a9a0b84b9e84b62390811fc5580f6a8b1d858c"
- integrity sha512-rAqP5hcUVJhXP2MCSNVsf0oM2OGU1So6A9pVRDYayvJ5+hygXHQApf87wd5NlhPM1J9RJnbqxIG/f8QTzRoQ4A==
- dependencies:
- buffer "^5.6.0"
-
btoa-lite@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
@@ -1483,7 +1456,7 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-buffer@^5.5.0, buffer@^5.6.0:
+buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==