diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 4b2bbafdd5..8f0c5a0b7e 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -5,7 +5,6 @@ Label, Select, Toggle, - RadioGroup, Icon, DatePicker, Modal, @@ -26,14 +25,15 @@ ALLOWABLE_STRING_TYPES, ALLOWABLE_NUMBER_TYPES, SWITCHABLE_TYPES, + PrettyRelationshipDefinitions, } from "constants/backend" import { getAutoColumnInformation, buildAutoColumn } from "builderStore/utils" import ConfirmDialog from "components/common/ConfirmDialog.svelte" - import { truncate } from "lodash" import ModalBindableInput from "components/common/bindings/ModalBindableInput.svelte" import { getBindings } from "components/backend/DataTable/formula" import JSONSchemaModal from "./JSONSchemaModal.svelte" import { ValidColumnNameRegex } from "@budibase/shared-core" + import RelationshipSelector from "components/common/RelationshipSelector.svelte" const AUTO_TYPE = "auto" const FORMULA_TYPE = FIELDS.FORMULA.type @@ -57,6 +57,10 @@ let indexes = [...($tables.selected.indexes || [])] let isCreating = undefined + let relationshipPart1 = PrettyRelationshipDefinitions.Many + let relationshipPart2 = PrettyRelationshipDefinitions.One + + let relationshipTableIdSecondary = null let table = $tables.selected let confirmDeleteDialog let savingColumn @@ -74,6 +78,33 @@ editableColumn.constraints.presence = { allowEmpty: false } } + let relationshipMap = { + [RelationshipType.MANY_TO_ONE]: { + part1: PrettyRelationshipDefinitions.MANY, + part2: PrettyRelationshipDefinitions.ONE, + }, + [RelationshipType.MANY_TO_MANY]: { + part1: PrettyRelationshipDefinitions.MANY, + part2: PrettyRelationshipDefinitions.MANY, + }, + [RelationshipType.ONE_TO_MANY]: { + part1: PrettyRelationshipDefinitions.ONE, + part2: PrettyRelationshipDefinitions.MANY, + }, + } + + $: { + if (editableColumn.type === LINK_TYPE) { + // Determine the relationship type based on the selected values of both parts + editableColumn.relationshipType = Object.entries(relationshipMap).find( + ([_, parts]) => + parts.part1 === relationshipPart1 && parts.part2 === relationshipPart2 + )?.[0] + // Set the tableId based on the selected table + editableColumn.tableId = relationshipTableIdSecondary + } + } + const initialiseField = (field, savingColumn) => { isCreating = !field if (field && !savingColumn) { @@ -100,6 +131,16 @@ } } allowedTypes = getAllowedTypes() + + if (editableColumn.type === LINK_TYPE && editableColumn.tableId) { + relationshipTableIdSecondary = editableColumn.tableId + if (editableColumn.relationshipType in relationshipMap) { + const { part1, part2 } = + relationshipMap[editableColumn.relationshipType] + relationshipPart1 = part1 + relationshipPart2 = part2 + } + } } $: initialiseField(field, savingColumn) @@ -157,7 +198,6 @@ !uneditable && editableColumn?.type !== AUTO_TYPE && !editableColumn.autocolumn - $: relationshipOptions = getRelationshipOptions(editableColumn) $: external = table.type === "external" // in the case of internal tables the sourceId will just be undefined $: tableOptions = $tables.list.filter( @@ -288,35 +328,6 @@ return match ? parseInt(match[1]) : 0 } - function getRelationshipOptions(field) { - if (!field || !field.tableId) { - return null - } - const linkTable = tableOptions?.find(table => table._id === field.tableId) - if (!linkTable) { - return null - } - const thisName = truncate(table.name, { length: 14 }), - linkName = truncate(linkTable.name, { length: 14 }) - return [ - { - name: `Many ${thisName} rows → many ${linkName} rows`, - alt: `Many ${table.name} rows → many ${linkTable.name} rows`, - value: RelationshipType.MANY_TO_MANY, - }, - { - name: `One ${linkName} row → many ${thisName} rows`, - alt: `One ${linkTable.name} rows → many ${table.name} rows`, - value: RelationshipType.ONE_TO_MANY, - }, - { - name: `One ${thisName} row → many ${linkName} rows`, - alt: `One ${table.name} rows → many ${linkTable.name} rows`, - value: RelationshipType.MANY_TO_ONE, - }, - ] - } - function getAllowedTypes() { if ( originalName && @@ -547,30 +558,15 @@ {:else if editableColumn.type === "link"} - {:else if editableColumn.type === FORMULA_TYPE} {#if !table.sql} diff --git a/packages/builder/src/components/common/RelationshipSelector.svelte b/packages/builder/src/components/common/RelationshipSelector.svelte new file mode 100644 index 0000000000..c050323bb6 --- /dev/null +++ b/packages/builder/src/components/common/RelationshipSelector.svelte @@ -0,0 +1,69 @@ + + +
+
+ +
+
+
+
+ table.name} + getOptionValue={table => table._id} + /> +
+
+ + + diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js index ed0549eeca..dd66a48864 100644 --- a/packages/builder/src/constants/backend/index.js +++ b/packages/builder/src/constants/backend/index.js @@ -170,6 +170,11 @@ export const RelationshipType = { MANY_TO_ONE: "many-to-one", } +export const PrettyRelationshipDefinitions = { + MANY: "Many rows", + ONE: "One row", +} + export const ALLOWABLE_STRING_OPTIONS = [ FIELDS.STRING, FIELDS.OPTIONS,