|
|
@ -1,6 +1,6 @@ |
|
|
<script> |
|
|
<script> |
|
|
import { RelationshipTypes } from "constants/backend" |
|
|
import { RelationshipTypes } from "constants/backend" |
|
|
import { Menu, MenuItem, MenuSection, Button, Input, Icon, ModalContent, RadioGroup, Heading } from "@budibase/bbui" |
|
|
import { Menu, MenuItem, MenuSection, Button, Input, Icon, ModalContent, RadioGroup, Heading, Select } from "@budibase/bbui" |
|
|
import { tables } from "stores/backend" |
|
|
import { tables } from "stores/backend" |
|
|
|
|
|
|
|
|
export let save |
|
|
export let save |
|
|
@ -12,6 +12,7 @@ |
|
|
let originalName = relationship.name |
|
|
let originalName = relationship.name |
|
|
|
|
|
|
|
|
$: console.log(relationship) |
|
|
$: console.log(relationship) |
|
|
|
|
|
$: tableOptions = plusTables.map(table => ({ label: table.name, value: table._id })) |
|
|
$: valid = relationship.name && relationship.tableId && relationship.relationshipType |
|
|
$: valid = relationship.name && relationship.tableId && relationship.relationshipType |
|
|
$: from = plusTables.find(table => table._id === relationship.source) |
|
|
$: from = plusTables.find(table => table._id === relationship.source) |
|
|
$: to = plusTables.find(table => table._id === relationship.tableId) |
|
|
$: to = plusTables.find(table => table._id === relationship.tableId) |
|
|
@ -30,6 +31,17 @@ |
|
|
value: RelationshipTypes.ONE_TO_MANY, |
|
|
value: RelationshipTypes.ONE_TO_MANY, |
|
|
} |
|
|
} |
|
|
] : [] |
|
|
] : [] |
|
|
|
|
|
|
|
|
|
|
|
$: relationshipTypes = [ |
|
|
|
|
|
{ |
|
|
|
|
|
label: "Many", |
|
|
|
|
|
value: RelationshipTypes.MANY_TO_MANY, |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
label: "One", |
|
|
|
|
|
value: RelationshipTypes.ONE_TO_MANY, |
|
|
|
|
|
} |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
function onChangeRelationshipType(evt) { |
|
|
function onChangeRelationshipType(evt) { |
|
|
if (evt.detail === RelationshipTypes.ONE_TO_MANY) { |
|
|
if (evt.detail === RelationshipTypes.ONE_TO_MANY) { |
|
|
@ -38,17 +50,25 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// save the relationship on to the datasource |
|
|
// save the relationship on to the datasource |
|
|
function saveRelationship() { |
|
|
async function saveRelationship() { |
|
|
|
|
|
// source of relationship |
|
|
datasource.entities[from.name].schema[relationship.name] = { |
|
|
datasource.entities[from.name].schema[relationship.name] = { |
|
|
type: "link", |
|
|
type: "link", |
|
|
...relationship |
|
|
...relationship |
|
|
} |
|
|
} |
|
|
if (originalName) { |
|
|
// if (originalName !== from.name) { |
|
|
delete datasource.entities[from.name].schema[originalName] |
|
|
// delete datasource.entities[from.name].schema[originalName] |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
// save other side of relationship in the other schema |
|
|
|
|
|
datasource.entities[to.name].schema[relationship.name] = { |
|
|
|
|
|
type: "link", |
|
|
|
|
|
relationshipType: relationship.relationshipType === RelationshipTypes.MANY_TO_MANY ? RelationshipTypes.MANY_TO_MANY : RelationshipTypes.MANY_TO_ONE, |
|
|
|
|
|
tableId: to._id |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
save() |
|
|
await save() |
|
|
tables.fetch() |
|
|
await tables.fetch() |
|
|
} |
|
|
} |
|
|
</script> |
|
|
</script> |
|
|
|
|
|
|
|
|
@ -62,7 +82,41 @@ |
|
|
<Input label="Relationship Name" bind:value={relationship.name} /> |
|
|
<Input label="Relationship Name" bind:value={relationship.name} /> |
|
|
|
|
|
|
|
|
<div class="table-selector"> |
|
|
<div class="table-selector"> |
|
|
<Menu> |
|
|
<Select |
|
|
|
|
|
label="Relationship" |
|
|
|
|
|
options={relationshipTypes} |
|
|
|
|
|
bind:value={relationship.relationshipType} |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
<Select |
|
|
|
|
|
label="From" |
|
|
|
|
|
options={tableOptions} |
|
|
|
|
|
bind:value={relationship.source} |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
<Select |
|
|
|
|
|
label={"Has many"} |
|
|
|
|
|
options={tableOptions} |
|
|
|
|
|
bind:value={relationship.tableId} |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
{#if relationship?.relationshipType === RelationshipTypes.MANY_TO_MANY} |
|
|
|
|
|
<Select |
|
|
|
|
|
label={"Through"} |
|
|
|
|
|
options={tableOptions} |
|
|
|
|
|
bind:value={relationship.through} |
|
|
|
|
|
/> |
|
|
|
|
|
{/if} |
|
|
|
|
|
|
|
|
|
|
|
{#if relationship?.relationshipType === RelationshipTypes.ONE_TO_MANY} |
|
|
|
|
|
<Select |
|
|
|
|
|
label={"Foreign Key"} |
|
|
|
|
|
options={Object.keys(linkTable.schema)} |
|
|
|
|
|
bind:value={relationship.foreignKey} |
|
|
|
|
|
/> |
|
|
|
|
|
{/if} |
|
|
|
|
|
|
|
|
|
|
|
<!-- <Menu> |
|
|
<MenuSection heading="From"> |
|
|
<MenuSection heading="From"> |
|
|
{#each plusTables as table} |
|
|
{#each plusTables as table} |
|
|
<MenuItem noClose icon="Table" on:click={() => (relationship.source = table._id)}> |
|
|
<MenuItem noClose icon="Table" on:click={() => (relationship.source = table._id)}> |
|
|
@ -73,8 +127,8 @@ |
|
|
</MenuItem> |
|
|
</MenuItem> |
|
|
{/each} |
|
|
{/each} |
|
|
</MenuSection> |
|
|
</MenuSection> |
|
|
</Menu> |
|
|
</Menu> --> |
|
|
<Menu> |
|
|
<!-- <Menu> |
|
|
<MenuSection heading="To"> |
|
|
<MenuSection heading="To"> |
|
|
{#each plusTables as table} |
|
|
{#each plusTables as table} |
|
|
<MenuItem noClose icon="Table" on:click={() => (relationship.tableId = table._id)}> |
|
|
<MenuItem noClose icon="Table" on:click={() => (relationship.tableId = table._id)}> |
|
|
@ -85,11 +139,9 @@ |
|
|
</MenuItem> |
|
|
</MenuItem> |
|
|
{/each} |
|
|
{/each} |
|
|
</MenuSection> |
|
|
</MenuSection> |
|
|
</Menu> |
|
|
</Menu> --> |
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
{#if from && to} |
|
|
{#if from && to} |
|
|
<div class="cardinality"> |
|
|
<!-- <div class="cardinality"> |
|
|
<RadioGroup |
|
|
<RadioGroup |
|
|
label="Define the relationship" |
|
|
label="Define the relationship" |
|
|
bind:value={relationship.relationshipType} |
|
|
bind:value={relationship.relationshipType} |
|
|
@ -98,25 +150,15 @@ |
|
|
getOptionLabel={option => option.name} |
|
|
getOptionLabel={option => option.name} |
|
|
getOptionValue={option => option.value} |
|
|
getOptionValue={option => option.value} |
|
|
/> |
|
|
/> |
|
|
</div> |
|
|
</div> --> |
|
|
|
|
|
|
|
|
{#if relationship?.relationshipType === RelationshipTypes.MANY_TO_MANY} |
|
|
<!-- <Select |
|
|
<Menu> |
|
|
label={`${linkTable.name} Column`} |
|
|
<MenuSection heading="Join Table"> |
|
|
options={Object.keys(linkTable.schema)} |
|
|
{#each plusTables as table} |
|
|
bind:value={relationship.fieldName} |
|
|
<MenuItem noClose icon="Table" on:click={() => (relationship.through = table._id)}> |
|
|
/> --> |
|
|
{table.name} |
|
|
|
|
|
{#if relationship.through === table._id} |
|
|
|
|
|
<Icon size="S" name="Checkmark" /> |
|
|
|
|
|
{/if} |
|
|
|
|
|
</MenuItem> |
|
|
|
|
|
{/each} |
|
|
|
|
|
</MenuSection> |
|
|
|
|
|
</Menu> |
|
|
|
|
|
{/if} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- <div class="table-selector"> |
|
|
<div class="table-selector"> |
|
|
|
|
|
<Menu> |
|
|
<Menu> |
|
|
<MenuSection heading={`${linkTable.name} Column`}> |
|
|
<MenuSection heading={`${linkTable.name} Column`}> |
|
|
{#each Object.keys(linkTable.schema) as column} |
|
|
{#each Object.keys(linkTable.schema) as column} |
|
|
@ -129,15 +171,21 @@ |
|
|
{/each} |
|
|
{/each} |
|
|
</MenuSection> |
|
|
</MenuSection> |
|
|
</Menu> |
|
|
</Menu> |
|
|
</div> |
|
|
</div> --> |
|
|
{/if} |
|
|
{/if} |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ModalContent> |
|
|
</ModalContent> |
|
|
|
|
|
|
|
|
<style> |
|
|
<style> |
|
|
.table-selector { |
|
|
.table-selector { |
|
|
display: grid; |
|
|
display: grid; |
|
|
grid-template-columns: 1fr 1fr; |
|
|
grid-template-columns: repeat(4, 1fr); |
|
|
grid-gap: var(--spacing-xl); |
|
|
grid-gap: var(--spacing-xl); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.cardinality { |
|
|
|
|
|
padding: 10px; |
|
|
|
|
|
} |
|
|
</style> |
|
|
</style> |