-
+ {#if !hideLogo}
+
+ {/if}
@@ -33,6 +39,7 @@
flex-direction: row;
justify-content: space-between;
align-items: center;
+ margin-bottom: 40px;
}
.nav__top img {
margin-right: 16px;
@@ -52,7 +59,6 @@
.nav__menu {
display: flex;
- margin-top: 40px;
flex-direction: row;
justify-content: flex-start;
align-items: center;
diff --git a/packages/standard-components/src/forms/validation.js b/packages/standard-components/src/forms/validation.js
index 5b49fa084..ebdb3b3da 100644
--- a/packages/standard-components/src/forms/validation.js
+++ b/packages/standard-components/src/forms/validation.js
@@ -77,6 +77,9 @@ const lengthConstraint = maxLength => value => {
}
const numericalConstraint = (constraint, error) => value => {
+ if (value == null || value === "") {
+ return null
+ }
if (isNaN(value)) {
return "Must be a number"
}
diff --git a/packages/standard-components/src/index.js b/packages/standard-components/src/index.js
index 7b4d492fa..1c176f364 100644
--- a/packages/standard-components/src/index.js
+++ b/packages/standard-components/src/index.js
@@ -18,7 +18,6 @@ export { default as repeater } from "./Repeater.svelte"
export { default as stackedlist } from "./StackedList.svelte"
export { default as card } from "./Card.svelte"
export { default as text } from "./Text.svelte"
-export { default as login } from "./Login.svelte"
export { default as navigation } from "./Navigation.svelte"
export { default as link } from "./Link.svelte"
export { default as heading } from "./Heading.svelte"
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index c59cff561..636cd114d 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.9.5",
+ "version": "0.9.18",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.cjs",
"module": "dist/bundle.mjs",
diff --git a/packages/string-templates/src/helpers/date.js b/packages/string-templates/src/helpers/date.js
index 0d9bd7803..ce845eee3 100644
--- a/packages/string-templates/src/helpers/date.js
+++ b/packages/string-templates/src/helpers/date.js
@@ -2,6 +2,7 @@ const dayjs = require("dayjs")
dayjs.extend(require("dayjs/plugin/duration"))
dayjs.extend(require("dayjs/plugin/advancedFormat"))
dayjs.extend(require("dayjs/plugin/relativeTime"))
+dayjs.extend(require("dayjs/plugin/utc"))
/**
* This file was largely taken from the helper-date package - we did this for two reasons:
@@ -88,7 +89,11 @@ module.exports.date = (str, pattern, options) => {
setLocale(config.str, config.pattern, config.options)
- return dayjs(new Date(config.str)).format(config.pattern)
+ const date = dayjs(new Date(config.str)).utc()
+ if (config.pattern === "") {
+ return date.toISOString()
+ }
+ return date.format(config.pattern)
}
module.exports.duration = (str, pattern, format) => {
diff --git a/packages/string-templates/src/processors/postprocessor.js b/packages/string-templates/src/processors/postprocessor.js
index adc8362ab..4d1c84013 100644
--- a/packages/string-templates/src/processors/postprocessor.js
+++ b/packages/string-templates/src/processors/postprocessor.js
@@ -18,7 +18,7 @@ class Postprocessor {
module.exports.processors = [
new Postprocessor(PostProcessorNames.CONVERT_LITERALS, statement => {
- if (!statement.includes(LITERAL_MARKER)) {
+ if (typeof statement !== "string" || !statement.includes(LITERAL_MARKER)) {
return statement
}
const splitMarkerIndex = statement.indexOf("-")
diff --git a/packages/string-templates/test/examples/table.json b/packages/string-templates/test/examples/table.json
new file mode 100644
index 000000000..4d982e012
--- /dev/null
+++ b/packages/string-templates/test/examples/table.json
@@ -0,0 +1,305 @@
+{
+ "user":{
+ "_id":"ro_ta_users_us_b0bc7ba0ce304294accc1ced8165dd23",
+ "_rev":"1-e9199d92e7286005a9c11c614fdbcc51",
+ "email":"test2@test.com",
+ "status":"active",
+ "roleId":"PUBLIC",
+ "test-Created By_text":"",
+ "test-Updated By_text":""
+ },
+ "closestComponentId":"c670254c9e74e40518ee5becff53aa5be",
+ "url":{
+
+ },
+ "c670254c9e74e40518ee5becff53aa5be":{
+ "rows":[
+ {
+ "_id":"ro_ta_1399af8a08d244a9885c674dd5555c84_8c1940e906254db5ac79c51011255d6c",
+ "_rev":"1-49ff5a4094a251a7767155eb85f4c9b7",
+ "sef":"sefesfesf",
+ "Name":"sefesf",
+ "tableId":"ta_1399af8a08d244a9885c674dd5555c84",
+ "Auto ID":1,
+ "Created At":"2021-05-27T10:30:37.386Z",
+ "Updated At":"2021-05-27T10:30:37.386Z",
+ "type":"row",
+ "Created By":[
+ {
+ "_id":"ro_ta_users_us_de1bd7fe710146db990d92845008c763"
+ }
+ ],
+ "Updated By":[
+ {
+ "_id":"ro_ta_users_us_de1bd7fe710146db990d92845008c763"
+ }
+ ],
+ "testing":"2",
+ "Created By_text":"",
+ "Updated By_text":""
+ }
+ ],
+ "schema":{
+ "Auto ID":{
+ "name":"Auto ID",
+ "type":"number",
+ "subtype":"autoID",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"number",
+ "presence":false,
+ "numericality":{
+ "greaterThanOrEqualTo":"",
+ "lessThanOrEqualTo":""
+ }
+ },
+ "lastID":1
+ },
+ "Created By":{
+ "name":"Created By",
+ "type":"link",
+ "subtype":"createdBy",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"array",
+ "presence":false
+ },
+ "tableId":"ta_users",
+ "fieldName":"test-Created By",
+ "relationshipType":"many-to-many"
+ },
+ "Created At":{
+ "name":"Created At",
+ "type":"datetime",
+ "subtype":"createdAt",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"string",
+ "length":{
+
+ },
+ "presence":false,
+ "datetime":{
+ "latest":"",
+ "earliest":""
+ }
+ }
+ },
+ "Updated By":{
+ "name":"Updated By",
+ "type":"link",
+ "subtype":"updatedBy",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"array",
+ "presence":false
+ },
+ "tableId":"ta_users",
+ "fieldName":"test-Updated By",
+ "relationshipType":"many-to-many"
+ },
+ "Updated At":{
+ "name":"Updated At",
+ "type":"datetime",
+ "subtype":"updatedAt",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"string",
+ "length":{
+
+ },
+ "presence":false,
+ "datetime":{
+ "latest":"",
+ "earliest":""
+ }
+ }
+ },
+ "Name":{
+ "type":"string",
+ "constraints":{
+ "type":"string",
+ "length":{
+ "maximum":null
+ },
+ "presence":false
+ },
+ "fieldName":"test",
+ "name":"Name"
+ },
+ "sef":{
+ "type":"string",
+ "constraints":{
+ "type":"string",
+ "length":{
+ "maximum":null
+ },
+ "presence":false
+ },
+ "fieldName":"test",
+ "name":"sef"
+ },
+ "testing":{
+ "type":"formula",
+ "constraints":{
+ "type":"string",
+ "presence":false
+ },
+ "fieldName":"test",
+ "name":"testing",
+ "formula":"{{ add [Auto ID] 1 }}"
+ }
+ },
+ "rowsLength":1
+ },
+ "data":{
+ "rows":[
+ {
+ "_id":"ro_ta_1399af8a08d244a9885c674dd5555c84_8c1940e906254db5ac79c51011255d6c",
+ "_rev":"1-49ff5a4094a251a7767155eb85f4c9b7",
+ "sef":"sefesfesf",
+ "Name":"sefesf",
+ "tableId":"ta_1399af8a08d244a9885c674dd5555c84",
+ "Auto ID":1,
+ "Created At":"2021-05-27T10:30:37.386Z",
+ "Updated At":"2021-05-27T10:30:37.386Z",
+ "type":"row",
+ "Created By":[
+ {
+ "_id":"ro_ta_users_us_de1bd7fe710146db990d92845008c763"
+ }
+ ],
+ "Updated By":[
+ {
+ "_id":"ro_ta_users_us_de1bd7fe710146db990d92845008c763"
+ }
+ ],
+ "testing":"2",
+ "Created By_text":"",
+ "Updated By_text":""
+ }
+ ],
+ "schema":{
+ "Auto ID":{
+ "name":"Auto ID",
+ "type":"number",
+ "subtype":"autoID",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"number",
+ "presence":false,
+ "numericality":{
+ "greaterThanOrEqualTo":"",
+ "lessThanOrEqualTo":""
+ }
+ },
+ "lastID":1
+ },
+ "Created By":{
+ "name":"Created By",
+ "type":"link",
+ "subtype":"createdBy",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"array",
+ "presence":false
+ },
+ "tableId":"ta_users",
+ "fieldName":"test-Created By",
+ "relationshipType":"many-to-many"
+ },
+ "Created At":{
+ "name":"Created At",
+ "type":"datetime",
+ "subtype":"createdAt",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"string",
+ "length":{
+
+ },
+ "presence":false,
+ "datetime":{
+ "latest":"",
+ "earliest":""
+ }
+ }
+ },
+ "Updated By":{
+ "name":"Updated By",
+ "type":"link",
+ "subtype":"updatedBy",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"array",
+ "presence":false
+ },
+ "tableId":"ta_users",
+ "fieldName":"test-Updated By",
+ "relationshipType":"many-to-many"
+ },
+ "Updated At":{
+ "name":"Updated At",
+ "type":"datetime",
+ "subtype":"updatedAt",
+ "icon":"ri-magic-line",
+ "autocolumn":true,
+ "constraints":{
+ "type":"string",
+ "length":{
+
+ },
+ "presence":false,
+ "datetime":{
+ "latest":"",
+ "earliest":""
+ }
+ }
+ },
+ "Name":{
+ "type":"string",
+ "constraints":{
+ "type":"string",
+ "length":{
+ "maximum":null
+ },
+ "presence":false
+ },
+ "fieldName":"test",
+ "name":"Name"
+ },
+ "sef":{
+ "type":"string",
+ "constraints":{
+ "type":"string",
+ "length":{
+ "maximum":null
+ },
+ "presence":false
+ },
+ "fieldName":"test",
+ "name":"sef"
+ },
+ "testing":{
+ "type":"formula",
+ "constraints":{
+ "type":"string",
+ "presence":false
+ },
+ "fieldName":"test",
+ "name":"testing",
+ "formula":"{{ add [Auto ID] 1 }}"
+ }
+ },
+ "rowsLength":1
+ }
+}
\ No newline at end of file
diff --git a/packages/string-templates/test/helpers.spec.js b/packages/string-templates/test/helpers.spec.js
index 0d14133aa..6be8e2ed0 100644
--- a/packages/string-templates/test/helpers.spec.js
+++ b/packages/string-templates/test/helpers.spec.js
@@ -1,4 +1,5 @@
const { processString, processObject, isValid } = require("../src/index.cjs")
+const tableJson = require("./examples/table.json")
describe("test the custom helpers we have applied", () => {
it("should be able to use the object helper", async () => {
@@ -355,6 +356,15 @@ describe("Cover a few complex use cases", () => {
expect(validity).toBe(true)
})
+ it("should test a case of attempting to get a UTC ISO back out after processing", async () => {
+ const date = new Date()
+ const input = `{{ date (subtract (date dateThing "x") 300000) "" }}`
+ const output = await processString(input, {
+ dateThing: date.toISOString(),
+ })
+ expect(output).toEqual(new Date(date.getTime() - 300000).toISOString())
+ })
+
it("test a very complex duration output", async () => {
const currentTime = new Date(1612432082000).toISOString(),
eventTime = new Date(1612432071000).toISOString()
@@ -388,4 +398,17 @@ describe("Cover a few complex use cases", () => {
const output = await processObject(input, context)
expect(output.text).toBe("12-01")
})
+
+ it("should only invalidate a single string in an object", async () => {
+ const input = {
+ dataProvider:"{{ literal [c670254c9e74e40518ee5becff53aa5be] }}",
+ theme:"spectrum--lightest",
+ showAutoColumns:false,
+ quiet:true,
+ size:"spectrum--medium",
+ rowCount:8,
+ }
+ const output = await processObject(input, tableJson)
+ expect(output.dataProvider).not.toBe("Invalid Binding")
+ })
})
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 74829bb23..7d94eb34e 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/worker",
"email": "hi@budibase.com",
- "version": "0.9.5",
+ "version": "0.9.18",
"description": "Budibase background service",
"main": "src/index.js",
"repository": {
@@ -21,8 +21,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/auth": "^0.9.5",
- "@budibase/string-templates": "^0.9.5",
+ "@budibase/auth": "^0.9.18",
+ "@budibase/string-templates": "^0.9.18",
"@koa/router": "^8.0.0",
"aws-sdk": "^2.811.0",
"bcryptjs": "^2.4.3",