diff --git a/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js b/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js
index 783bcf40aa..0ffb1de59f 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/rowDetailScreen.js
@@ -9,6 +9,7 @@ import {
makeSaveButton,
makeTableFormComponents,
makeMainForm,
+ spectrumColor,
} from "./utils/commonComponents"
export default function(tables) {
@@ -52,6 +53,7 @@ function generateTitleContainer(table, title, formId) {
background: "transparent",
color: "#4285f4",
})
+ .customStyle(spectrumColor(700))
.text("Delete")
.customProps({
className: "",
diff --git a/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js b/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js
index 1e588895af..182736a1d5 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/utils/Component.js
@@ -29,6 +29,11 @@ export class Component extends BaseStructure {
return this
}
+ customStyle(styling) {
+ this._json._styles.custom = styling
+ return this
+ }
+
instanceName(name) {
this._json._instanceName = name
return this
diff --git a/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js b/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js
index 8c6bfe646b..391d1b3c11 100644
--- a/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js
+++ b/packages/builder/src/builderStore/store/screenTemplates/utils/commonComponents.js
@@ -3,6 +3,15 @@ import { Component } from "./Component"
import { rowListUrl } from "../rowListScreen"
import { backendUiStore } from "builderStore"
+export function spectrumColor(number) {
+ // Acorn throws a parsing error in this file if the word g-l-o-b-a-l is found
+ // (without dashes - I can't even type it in a comment).
+ // God knows why. It seems to think optional chaining further down the
+ // file is invalid if the word g-l-o-b-a-l is found - hence the reason this
+ // statement is split into parts.
+ return "color: var(--spectrum-glo" + `bal-color-gray-${number});`
+}
+
export function makeLinkComponent(tableName) {
return new Component("@budibase/standard-components/link")
.normalStyle({
@@ -12,6 +21,7 @@ export function makeLinkComponent(tableName) {
.hoverStyle({
color: "#4285f4",
})
+ .customStyle(spectrumColor(700))
.text(tableName)
.customProps({
url: `/${tableName.toLowerCase()}`,
@@ -52,6 +62,7 @@ export function makeBreadcrumbContainer(tableName, text, capitalise = false) {
"margin-right": "4px",
"margin-left": "4px",
})
+ .customStyle(spectrumColor(700))
.text(">")
.instanceName("Arrow")
@@ -64,6 +75,7 @@ export function makeBreadcrumbContainer(tableName, text, capitalise = false) {
const identifierText = new Component("@budibase/standard-components/text")
.type("none")
.normalStyle(textStyling)
+ .customStyle(spectrumColor(700))
.text(text)
.instanceName("Identifier")
@@ -132,6 +144,7 @@ export function makeTitleContainer(title) {
"margin-left": "0px",
flex: "1 1 auto",
})
+ .customStyle(spectrumColor(900))
.type("h3")
.instanceName("Title")
.text(title)
diff --git a/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte b/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte
index bddb66e4c9..3390b95288 100644
--- a/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte
+++ b/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte
@@ -36,7 +36,9 @@
{:else if type === 'boolean'}
{:else if type === 'link'}
-
+
+
+
{:else if type === 'longform'}
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyGroup.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyGroup.svelte
index b04954c06f..93be958d55 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyGroup.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/PropertyGroup.svelte
@@ -25,7 +25,7 @@
{#if open}
- {#each properties as prop (`${componentInstance._id}-${prop.key}`)}
+ {#each properties as prop (`${componentInstance._id}-${prop.key}-${prop.label}`)}
{
@@ -37,8 +37,8 @@ describe("/queries", () => {
let query
beforeAll(async () => {
- ({ request, server } = await supertest())
- });
+ ;({ request, server } = await supertest())
+ })
afterAll(() => {
server.close()
@@ -47,7 +47,7 @@ describe("/queries", () => {
beforeEach(async () => {
app = await createApplication(request)
appId = app.instance._id
- });
+ })
async function createDatasource() {
return await insertDocument(appId, TEST_DATASOURCE)
@@ -63,65 +63,68 @@ describe("/queries", () => {
.post(`/api/queries`)
.send(TEST_QUERY)
.set(defaultHeaders(appId))
- .expect('Content-Type', /json/)
+ .expect("Content-Type", /json/)
.expect(200)
- expect(res.res.statusMessage).toEqual(`Query ${TEST_QUERY.name} saved successfully.`);
- expect(res.body).toEqual({
- _rev: res.body._rev,
- ...TEST_QUERY,
- });
+ expect(res.res.statusMessage).toEqual(
+ `Query ${TEST_QUERY.name} saved successfully.`
+ )
+ expect(res.body).toEqual({
+ _rev: res.body._rev,
+ ...TEST_QUERY,
})
- });
+ })
+ })
describe("fetch", () => {
let datasource
beforeEach(async () => {
datasource = await createDatasource()
- });
+ })
afterEach(() => {
delete datasource._rev
- });
+ })
it("returns all the queries from the server", async () => {
const query = await createQuery()
const res = await request
.get(`/api/queries`)
.set(defaultHeaders(appId))
- .expect('Content-Type', /json/)
+ .expect("Content-Type", /json/)
.expect(200)
- const queries = res.body;
- expect(queries).toEqual([
- {
- "_rev": query.rev,
- ...TEST_QUERY
- }
- ]);
+ const queries = res.body
+ expect(queries).toEqual([
+ {
+ _rev: query.rev,
+ ...TEST_QUERY,
+ readable: true,
+ },
+ ])
})
it("should apply authorization to endpoint", async () => {
- await builderEndpointShouldBlockNormalUsers({
- request,
- method: "GET",
- url: `/api/datasources`,
- appId: appId,
- })
+ await builderEndpointShouldBlockNormalUsers({
+ request,
+ method: "GET",
+ url: `/api/datasources`,
+ appId: appId,
})
- });
+ })
+ })
describe("destroy", () => {
- let datasource;
+ let datasource
beforeEach(async () => {
datasource = await createDatasource()
- });
+ })
afterEach(() => {
delete datasource._rev
- });
+ })
it("deletes a query and returns a success message", async () => {
const query = await createQuery()
@@ -134,10 +137,10 @@ describe("/queries", () => {
const res = await request
.get(`/api/queries`)
.set(defaultHeaders(appId))
- .expect('Content-Type', /json/)
+ .expect("Content-Type", /json/)
.expect(200)
-
- expect(res.body).toEqual([])
+
+ expect(res.body).toEqual([])
})
it("should apply authorization to endpoint", async () => {
@@ -148,5 +151,5 @@ describe("/queries", () => {
appId: appId,
})
})
- });
-});
+ })
+})
diff --git a/packages/server/src/db/linkedRows/LinkController.js b/packages/server/src/db/linkedRows/LinkController.js
index 061a9ac1ae..dd55ed898f 100644
--- a/packages/server/src/db/linkedRows/LinkController.js
+++ b/packages/server/src/db/linkedRows/LinkController.js
@@ -138,6 +138,13 @@ class LinkController {
// iterate through the link IDs in the row field, see if any don't exist already
for (let linkId of rowField) {
if (linkId && linkId !== "" && linkDocIds.indexOf(linkId) === -1) {
+ // first check the doc we're linking to exists
+ try {
+ await this._db.get(linkId)
+ } catch (err) {
+ // skip links that don't exist
+ continue
+ }
operations.push(
new LinkDocument(
table._id,
diff --git a/packages/standard-components/manifest.json b/packages/standard-components/manifest.json
index 5694e3c5b3..cbebe1986c 100644
--- a/packages/standard-components/manifest.json
+++ b/packages/standard-components/manifest.json
@@ -1294,12 +1294,6 @@
"type": "text",
"label": "Label",
"key": "label"
- },
- {
- "type": "text",
- "label": "Placeholder",
- "key": "placeholder",
- "placeholder": "Choose an option"
}
]
}