From 74ee030c213d5372b8df06007ad8a9b6bd2629c5 Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 9 Apr 2024 14:37:57 +0100 Subject: [PATCH 01/14] Fix for missing columns in Table/Grid settings --- .../GridColumnConfiguration/GridColumnConfiguration.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/components/design/settings/controls/GridColumnConfiguration/GridColumnConfiguration.svelte b/packages/builder/src/components/design/settings/controls/GridColumnConfiguration/GridColumnConfiguration.svelte index 439bf5e261..19d61e1f2a 100644 --- a/packages/builder/src/components/design/settings/controls/GridColumnConfiguration/GridColumnConfiguration.svelte +++ b/packages/builder/src/components/design/settings/controls/GridColumnConfiguration/GridColumnConfiguration.svelte @@ -34,7 +34,7 @@ $selectedScreen, datasource )?.table?.primaryDisplay - $: schema = getSchema(selectedScreen, datasource) + $: schema = getSchema($selectedScreen, datasource) $: columns = getColumns({ columns: value, schema, From 76488e1aa117276062cd5044d0f20df11d3e8445 Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 9 Apr 2024 15:22:16 +0100 Subject: [PATCH 02/14] Allow heights down to 120px for Table --- packages/client/src/components/app/GridBlock.svelte | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index 085449a5b0..f6ef55f802 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -49,6 +49,7 @@ metadata: { dataSource: table }, }, ] + $: customHeight = $component?.styles?.normal?.height // Provide additional data context for live binding eval export const getAdditionalDataContext = () => { @@ -110,6 +111,7 @@
Date: Tue, 9 Apr 2024 15:28:46 +0100 Subject: [PATCH 03/14] Add rowexplorer to illegalChildren for the repeaterblock. --- packages/client/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index a056f59cc7..4ffe979c7d 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -6011,7 +6011,7 @@ "block": true, "name": "Repeater Block", "icon": "ViewList", - "illegalChildren": ["section"], + "illegalChildren": ["section", "rowexplorer"], "hasChildren": true, "size": { "width": 400, From d96bf29bef6d02e9f78aeba2fffacfd764faab70 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 9 Apr 2024 18:09:37 +0100 Subject: [PATCH 04/14] Add more search tests. --- .../src/api/routes/tests/search.spec.ts | 55 ++++++++++++++----- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index a281d624dc..c06644fa3e 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -2,7 +2,13 @@ import { tableForDatasource } from "../../../tests/utilities/structures" import { DatabaseName, getDatasource } from "../../../integrations/tests/utils" import * as setup from "./utilities" -import { Datasource, FieldType, Table } from "@budibase/types" +import { + Datasource, + FieldType, + SearchFilter, + SearchFilters, + Table, +} from "@budibase/types" jest.unmock("mssql") @@ -53,22 +59,41 @@ describe.each([ ) }) - it("should return rows", async () => { - const rows = await Promise.all([ - config.api.row.save(table._id!, { name: "foo" }), - config.api.row.save(table._id!, { name: "bar" }), - ]) + describe("strings", () => { + interface StringSearchTest { + query: SearchFilters + expected: number[] + } - const result = await config.api.row.search(table._id!, { - tableId: table._id!, - query: {}, - }) + const stringSearchTests: StringSearchTest[] = [ + { query: {}, expected: [0, 1] }, + { query: { string: { name: "foo" } }, expected: [0] }, + { query: { fuzzy: { name: "oo" } }, expected: [0] }, + { query: { equal: { name: "foo" } }, expected: [0] }, + { query: { notEqual: { name: "foo" } }, expected: [1] }, + { query: { oneOf: { name: ["foo"] } }, expected: [0] }, + // { query: { contains: { name: "f" } }, expected: [0] }, + // { query: { notContains: { name: ["f"] } }, expected: [1] }, + // { query: { containsAny: { name: ["f"] } }, expected: [0] }, + ] - expect(result.rows).toEqual( - expect.arrayContaining([ - expect.objectContaining({ _id: rows[0]._id }), - expect.objectContaining({ _id: rows[1]._id }), - ]) + it.each(stringSearchTests)( + `should be able to run query: $query`, + async ({ query, expected }) => { + const rows = await Promise.all([ + config.api.row.save(table._id!, { name: "foo" }), + config.api.row.save(table._id!, { name: "bar" }), + ]) + + const result = await config.api.row.search(table._id!, { + tableId: table._id!, + query, + }) + + expect(result.rows.map(r => r._id)).toEqual( + expect.arrayContaining(expected.map(i => rows[i]._id)) + ) + } ) }) }) From a647e7ff0af56c6c4b6a4002055ed7da3ac281ec Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 9 Apr 2024 18:13:18 +0100 Subject: [PATCH 05/14] Fix lint. --- packages/server/src/api/routes/tests/search.spec.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index c06644fa3e..24ba277bbf 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -2,13 +2,7 @@ import { tableForDatasource } from "../../../tests/utilities/structures" import { DatabaseName, getDatasource } from "../../../integrations/tests/utils" import * as setup from "./utilities" -import { - Datasource, - FieldType, - SearchFilter, - SearchFilters, - Table, -} from "@budibase/types" +import { Datasource, FieldType, SearchFilters, Table } from "@budibase/types" jest.unmock("mssql") From 06db50147ed580d0e8625aed9dc852f9d25a3499 Mon Sep 17 00:00:00 2001 From: Dean Date: Wed, 10 Apr 2024 09:20:54 +0100 Subject: [PATCH 06/14] PR Feedback --- packages/client/src/components/app/GridBlock.svelte | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index f6ef55f802..8be3893da0 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -111,7 +111,6 @@
Date: Wed, 10 Apr 2024 09:28:36 +0100 Subject: [PATCH 07/14] Lint --- packages/client/src/components/app/GridBlock.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index 8be3893da0..0ee2cf1487 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -49,7 +49,6 @@ metadata: { dataSource: table }, }, ] - $: customHeight = $component?.styles?.normal?.height // Provide additional data context for live binding eval export const getAdditionalDataContext = () => { From 245fa93bd29ecfc7230226ce58672bac37f400a7 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 10 Apr 2024 09:30:01 +0100 Subject: [PATCH 08/14] Make test cases a little cleaner. --- .../src/api/routes/tests/search.spec.ts | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/server/src/api/routes/tests/search.spec.ts b/packages/server/src/api/routes/tests/search.spec.ts index 24ba277bbf..2b08f9afc1 100644 --- a/packages/server/src/api/routes/tests/search.spec.ts +++ b/packages/server/src/api/routes/tests/search.spec.ts @@ -54,18 +54,20 @@ describe.each([ }) describe("strings", () => { + const rows = [{ name: "foo" }, { name: "bar" }] + interface StringSearchTest { query: SearchFilters - expected: number[] + expected: (typeof rows)[number][] } const stringSearchTests: StringSearchTest[] = [ - { query: {}, expected: [0, 1] }, - { query: { string: { name: "foo" } }, expected: [0] }, - { query: { fuzzy: { name: "oo" } }, expected: [0] }, - { query: { equal: { name: "foo" } }, expected: [0] }, - { query: { notEqual: { name: "foo" } }, expected: [1] }, - { query: { oneOf: { name: ["foo"] } }, expected: [0] }, + { query: {}, expected: rows }, + { query: { string: { name: "foo" } }, expected: [rows[0]] }, + { query: { fuzzy: { name: "oo" } }, expected: [rows[0]] }, + { query: { equal: { name: "foo" } }, expected: [rows[0]] }, + { query: { notEqual: { name: "foo" } }, expected: [rows[1]] }, + { query: { oneOf: { name: ["foo"] } }, expected: [rows[0]] }, // { query: { contains: { name: "f" } }, expected: [0] }, // { query: { notContains: { name: ["f"] } }, expected: [1] }, // { query: { containsAny: { name: ["f"] } }, expected: [0] }, @@ -74,18 +76,13 @@ describe.each([ it.each(stringSearchTests)( `should be able to run query: $query`, async ({ query, expected }) => { - const rows = await Promise.all([ - config.api.row.save(table._id!, { name: "foo" }), - config.api.row.save(table._id!, { name: "bar" }), - ]) - - const result = await config.api.row.search(table._id!, { + await Promise.all(rows.map(r => config.api.row.save(table._id!, r))) + const { rows: foundRows } = await config.api.row.search(table._id!, { tableId: table._id!, query, }) - - expect(result.rows.map(r => r._id)).toEqual( - expect.arrayContaining(expected.map(i => rows[i]._id)) + expect(foundRows).toEqual( + expect.arrayContaining(expected.map(r => expect.objectContaining(r))) ) } ) From e744e4ebb1cd5780b84dd71fe3704fd146965f7e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 10 Apr 2024 11:52:19 +0200 Subject: [PATCH 09/14] Unify icons --- .../builder/src/constants/backend/index.js | 34 ++++++++++--------- .../src/components/grid/lib/utils.js | 22 +----------- packages/frontend-core/src/constants.js | 23 +++++++++++++ 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js index dd751d4e13..e4736892b9 100644 --- a/packages/builder/src/constants/backend/index.js +++ b/packages/builder/src/constants/backend/index.js @@ -5,6 +5,8 @@ import { AutoFieldSubType, Hosting, } from "@budibase/types" +import { Constants } from "@budibase/frontend-core" +const { TypeIconMap } = Constants export { RelationshipType } from "@budibase/types" @@ -22,7 +24,7 @@ export const FIELDS = { STRING: { name: "Text", type: FieldType.STRING, - icon: "Text", + icon: TypeIconMap[FieldType.STRING], constraints: { type: "string", length: {}, @@ -32,7 +34,7 @@ export const FIELDS = { BARCODEQR: { name: "Barcode/QR", type: FieldType.BARCODEQR, - icon: "Camera", + icon: TypeIconMap[FieldType.BARCODEQR], constraints: { type: "string", length: {}, @@ -42,7 +44,7 @@ export const FIELDS = { LONGFORM: { name: "Long Form Text", type: FieldType.LONGFORM, - icon: "TextAlignLeft", + icon: TypeIconMap[FieldType.LONGFORM], constraints: { type: "string", length: {}, @@ -52,7 +54,7 @@ export const FIELDS = { OPTIONS: { name: "Options", type: FieldType.OPTIONS, - icon: "Dropdown", + icon: TypeIconMap[FieldType.OPTIONS], constraints: { type: "string", presence: false, @@ -62,7 +64,7 @@ export const FIELDS = { ARRAY: { name: "Multi-select", type: FieldType.ARRAY, - icon: "Duplicate", + icon: TypeIconMap[FieldType.ARRAY], constraints: { type: "array", presence: false, @@ -72,7 +74,7 @@ export const FIELDS = { NUMBER: { name: "Number", type: FieldType.NUMBER, - icon: "123", + icon: TypeIconMap[FieldType.NUMBER], constraints: { type: "number", presence: false, @@ -82,12 +84,12 @@ export const FIELDS = { BIGINT: { name: "BigInt", type: FieldType.BIGINT, - icon: "TagBold", + icon: TypeIconMap[FieldType.BIGINT], }, BOOLEAN: { name: "Boolean", type: FieldType.BOOLEAN, - icon: "Boolean", + icon: TypeIconMap[FieldType.BOOLEAN], constraints: { type: "boolean", presence: false, @@ -96,7 +98,7 @@ export const FIELDS = { DATETIME: { name: "Date/Time", type: FieldType.DATETIME, - icon: "Calendar", + icon: TypeIconMap[FieldType.DATETIME], constraints: { type: "string", length: {}, @@ -110,7 +112,7 @@ export const FIELDS = { ATTACHMENT: { name: "Attachment", type: FieldType.ATTACHMENT, - icon: "Folder", + icon: TypeIconMap[FieldType.ATTACHMENT], constraints: { type: "array", presence: false, @@ -119,7 +121,7 @@ export const FIELDS = { LINK: { name: "Relationship", type: FieldType.LINK, - icon: "Link", + icon: TypeIconMap[FieldType.LINK], constraints: { type: "array", presence: false, @@ -128,19 +130,19 @@ export const FIELDS = { AUTO: { name: "Auto Column", type: FieldType.AUTO, - icon: "MagicWand", + icon: TypeIconMap[FieldType.AUTO], constraints: {}, }, FORMULA: { name: "Formula", type: FieldType.FORMULA, - icon: "Calculator", + icon: TypeIconMap[FieldType.FORMULA], constraints: {}, }, JSON: { name: "JSON", type: FieldType.JSON, - icon: "Brackets", + icon: TypeIconMap[FieldType.JSON], constraints: { type: "object", presence: false, @@ -150,13 +152,13 @@ export const FIELDS = { name: "User", type: FieldType.BB_REFERENCE, subtype: FieldSubtype.USER, - icon: "User", + icon: TypeIconMap[FieldType.USER], }, USERS: { name: "Users", type: FieldType.BB_REFERENCE, subtype: FieldSubtype.USERS, - icon: "User", + icon: TypeIconMap[FieldType.USERS], constraints: { type: "array", }, diff --git a/packages/frontend-core/src/components/grid/lib/utils.js b/packages/frontend-core/src/components/grid/lib/utils.js index 8382bfece8..c7c618e6f8 100644 --- a/packages/frontend-core/src/components/grid/lib/utils.js +++ b/packages/frontend-core/src/components/grid/lib/utils.js @@ -1,4 +1,4 @@ -import { FieldType, FieldTypeSubtypes } from "@budibase/types" +import { TypeIconMap } from "../../../constants" export const getColor = (idx, opacity = 0.3) => { if (idx == null || idx === -1) { @@ -7,26 +7,6 @@ export const getColor = (idx, opacity = 0.3) => { return `hsla(${((idx + 1) * 222) % 360}, 90%, 75%, ${opacity})` } -const TypeIconMap = { - [FieldType.STRING]: "Text", - [FieldType.OPTIONS]: "Dropdown", - [FieldType.DATETIME]: "Date", - [FieldType.BARCODEQR]: "Camera", - [FieldType.LONGFORM]: "TextAlignLeft", - [FieldType.ARRAY]: "Dropdown", - [FieldType.NUMBER]: "123", - [FieldType.BOOLEAN]: "Boolean", - [FieldType.ATTACHMENT]: "AppleFiles", - [FieldType.LINK]: "DataCorrelated", - [FieldType.FORMULA]: "Calculator", - [FieldType.JSON]: "Brackets", - [FieldType.BIGINT]: "TagBold", - [FieldType.BB_REFERENCE]: { - [FieldTypeSubtypes.BB_REFERENCE.USER]: "User", - [FieldTypeSubtypes.BB_REFERENCE.USERS]: "UserGroup", - }, -} - export const getColumnIcon = column => { if (column.schema.autocolumn) { return "MagicWand" diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js index 68da439195..a05a0eeb7f 100644 --- a/packages/frontend-core/src/constants.js +++ b/packages/frontend-core/src/constants.js @@ -4,6 +4,7 @@ export { OperatorOptions, SqlNumberTypeRangeMap } from "@budibase/shared-core" export { Feature as Features } from "@budibase/types" import { BpmCorrelationKey } from "@budibase/shared-core" +import { FieldType, FieldTypeSubtypes } from "@budibase/types" // Cookie names export const Cookies = { @@ -113,3 +114,25 @@ export const ContextScopes = { Local: "local", Global: "global", } + +export const TypeIconMap = { + [FieldType.STRING]: "Text", + [FieldType.OPTIONS]: "Dropdown", + [FieldType.DATETIME]: "Date", + [FieldType.BARCODEQR]: "Camera", + [FieldType.LONGFORM]: "TextAlignLeft", + [FieldType.ARRAY]: "Dropdown", + [FieldType.NUMBER]: "123", + [FieldType.BOOLEAN]: "Boolean", + [FieldType.ATTACHMENT]: "AppleFiles", + [FieldType.LINK]: "DataCorrelated", + [FieldType.FORMULA]: "Calculator", + [FieldType.JSON]: "Brackets", + [FieldType.BIGINT]: "TagBold", + [FieldType.USER]: "User", + [FieldType.USERS]: "UserGroup", + [FieldType.BB_REFERENCE]: { + [FieldTypeSubtypes.BB_REFERENCE.USER]: "User", + [FieldTypeSubtypes.BB_REFERENCE.USERS]: "UserGroup", + }, +} From d821d04d5ba54c8311cd8bfad296e737840bd089 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 10 Apr 2024 12:01:41 +0200 Subject: [PATCH 10/14] Change icon --- packages/frontend-core/src/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js index a05a0eeb7f..de1f906ba9 100644 --- a/packages/frontend-core/src/constants.js +++ b/packages/frontend-core/src/constants.js @@ -121,7 +121,7 @@ export const TypeIconMap = { [FieldType.DATETIME]: "Date", [FieldType.BARCODEQR]: "Camera", [FieldType.LONGFORM]: "TextAlignLeft", - [FieldType.ARRAY]: "Dropdown", + [FieldType.ARRAY]: "Duplicate", [FieldType.NUMBER]: "123", [FieldType.BOOLEAN]: "Boolean", [FieldType.ATTACHMENT]: "AppleFiles", From 5cdbc75fef1dce318f6f15a88dd5ab13ad2de8b6 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 10 Apr 2024 12:03:46 +0200 Subject: [PATCH 11/14] Change icon --- packages/frontend-core/src/constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js index de1f906ba9..94e1dce237 100644 --- a/packages/frontend-core/src/constants.js +++ b/packages/frontend-core/src/constants.js @@ -118,7 +118,7 @@ export const ContextScopes = { export const TypeIconMap = { [FieldType.STRING]: "Text", [FieldType.OPTIONS]: "Dropdown", - [FieldType.DATETIME]: "Date", + [FieldType.DATETIME]: "Calendar", [FieldType.BARCODEQR]: "Camera", [FieldType.LONGFORM]: "TextAlignLeft", [FieldType.ARRAY]: "Duplicate", From 61e235767dc2af88f6fdcb99a33a595f2c3c95c8 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 10 Apr 2024 12:06:53 +0200 Subject: [PATCH 12/14] Add auto icon --- packages/frontend-core/src/constants.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/frontend-core/src/constants.js b/packages/frontend-core/src/constants.js index 94e1dce237..79b35bfb8e 100644 --- a/packages/frontend-core/src/constants.js +++ b/packages/frontend-core/src/constants.js @@ -129,6 +129,7 @@ export const TypeIconMap = { [FieldType.FORMULA]: "Calculator", [FieldType.JSON]: "Brackets", [FieldType.BIGINT]: "TagBold", + [FieldType.AUTO]: "MagicWand", [FieldType.USER]: "User", [FieldType.USERS]: "UserGroup", [FieldType.BB_REFERENCE]: { From 2322e430c47c484ec3abf7be04a846a6e6c5cf8f Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 10 Apr 2024 12:26:22 +0200 Subject: [PATCH 13/14] Lint --- packages/builder/src/constants/backend/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js index e4736892b9..773e095f88 100644 --- a/packages/builder/src/constants/backend/index.js +++ b/packages/builder/src/constants/backend/index.js @@ -6,6 +6,7 @@ import { Hosting, } from "@budibase/types" import { Constants } from "@budibase/frontend-core" + const { TypeIconMap } = Constants export { RelationshipType } from "@budibase/types" From bc0b42bda6308d271cf426da057452e7da0b405a Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 10 Apr 2024 12:35:31 +0200 Subject: [PATCH 14/14] Fix test --- .../src/stores/builder/tests/sortedIntegrations.test.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/builder/src/stores/builder/tests/sortedIntegrations.test.js b/packages/builder/src/stores/builder/tests/sortedIntegrations.test.js index 9b430b1621..d57aa19148 100644 --- a/packages/builder/src/stores/builder/tests/sortedIntegrations.test.js +++ b/packages/builder/src/stores/builder/tests/sortedIntegrations.test.js @@ -6,7 +6,10 @@ import { derived } from "svelte/store" import { integrations } from "stores/builder/integrations" vi.mock("svelte/store", () => ({ - derived: vi.fn(() => {}), + derived: vi.fn(), + writable: vi.fn(() => ({ + subscribe: vi.fn(), + })), })) vi.mock("stores/builder/integrations", () => ({ integrations: vi.fn() }))