From 46b85ac12cfb5ff480ce2dfdef5a23bdb0cd140f Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 4 Oct 2023 16:50:05 +0200 Subject: [PATCH] Multiple users column --- .../DataTable/modals/CreateEditColumn.svelte | 4 +++- .../builder/src/constants/backend/index.js | 3 +++ .../server/src/integrations/base/sqlTable.ts | 21 +++++++++++++++++-- .../rowProcessor/bbReferenceProcessor.ts | 16 +++++++++----- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 09e6ff80ec..28f73dd4f6 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -188,7 +188,9 @@ ) } - allowedTypes = getAllowedTypes() + if (!savingColumn) { + allowedTypes = getAllowedTypes() + } } $: initialiseField(field, savingColumn) diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js index 0da50aac49..a81b33c2d3 100644 --- a/packages/builder/src/constants/backend/index.js +++ b/packages/builder/src/constants/backend/index.js @@ -133,6 +133,9 @@ export const FIELDS = { type: FieldType.BB_REFERENCE, subtype: FieldSubtype.USERS, icon: "User", + constraints: { + type: "array", + }, }, } diff --git a/packages/server/src/integrations/base/sqlTable.ts b/packages/server/src/integrations/base/sqlTable.ts index 4383167f4a..b608c765e0 100644 --- a/packages/server/src/integrations/base/sqlTable.ts +++ b/packages/server/src/integrations/base/sqlTable.ts @@ -1,9 +1,16 @@ import { Knex, knex } from "knex" -import { Operation, QueryJson, RenameColumn, Table } from "@budibase/types" +import { + FieldSubtype, + Operation, + QueryJson, + RenameColumn, + Table, +} from "@budibase/types" import { breakExternalTableId } from "../utils" import SchemaBuilder = Knex.SchemaBuilder import CreateTableBuilder = Knex.CreateTableBuilder import { FieldTypes, RelationshipType } from "../../constants" +import { utils } from "@budibase/shared-core" function generateSchema( schema: CreateTableBuilder, @@ -42,7 +49,17 @@ function generateSchema( case FieldTypes.LONGFORM: case FieldTypes.BARCODEQR: case FieldTypes.BB_REFERENCE: - schema.text(key) + const subtype = column.subtype as FieldSubtype + switch (subtype) { + case FieldSubtype.USER: + schema.text(key) + break + case FieldSubtype.USERS: + schema.json(key) + break + default: + throw utils.unreachable(subtype) + } break case FieldTypes.NUMBER: // if meta is specified then this is a junction table entry diff --git a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts index 942efb058c..f9b95e6045 100644 --- a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts +++ b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts @@ -3,10 +3,10 @@ import { utils } from "@budibase/shared-core" import { FieldSubtype } from "@budibase/types" import { InvalidBBRefError } from "./errors" -export async function processInputBBReferences( +export async function processInputBBReferences( value: string | string[] | { _id: string } | { _id: string }[], subtype: FieldSubtype -): Promise { +): Promise { const referenceIds: string[] = [] if (Array.isArray(value)) { @@ -34,6 +34,11 @@ export async function processInputBBReferences( if (notFoundIds?.length) { throw new InvalidBBRefError(notFoundIds[0], FieldSubtype.USER) } + + if (subtype === FieldSubtype.USERS) { + return referenceIds + } + return referenceIds.join(",") || null default: @@ -42,15 +47,16 @@ export async function processInputBBReferences( } export async function processOutputBBReferences( - value: string, + value: string | string[], subtype: FieldSubtype ) { - if (typeof value !== "string") { + if (value === null || value === undefined) { // Already processed or nothing to process return value || undefined } - const ids = value.split(",").filter(id => !!id) + const ids = + typeof value === "string" ? value.split(",").filter(id => !!id) : value switch (subtype) { case FieldSubtype.USER: