This commit is contained in:
mike12345567 2021-07-02 14:36:24 +01:00
parent 56d83864ea
commit 499c28d883
3 changed files with 51 additions and 34 deletions

View File

@ -11,31 +11,40 @@
export let toRelationship = {} export let toRelationship = {}
export let close export let close
let originalFromName = fromRelationship.name, originalToName = toRelationship.name let originalFromName = fromRelationship.name,
originalToName = toRelationship.name
function isValid(relationship) { function isValid(relationship) {
if (relationship.relationshipType === RelationshipTypes.MANY_TO_MANY && !relationship.through) { if (
relationship.relationshipType === RelationshipTypes.MANY_TO_MANY &&
!relationship.through
) {
return false return false
} }
return relationship.name && relationship.tableId && relationship.relationshipType return (
relationship.name && relationship.tableId && relationship.relationshipType
)
} }
$: tableOptions = plusTables.map(table => ({ label: table.name, value: table._id })) $: tableOptions = plusTables.map(table => ({
label: table.name,
value: table._id,
}))
$: fromTable = plusTables.find(table => table._id === toRelationship?.tableId) $: fromTable = plusTables.find(table => table._id === toRelationship?.tableId)
$: toTable = plusTables.find(table => table._id === fromRelationship?.tableId) $: toTable = plusTables.find(table => table._id === fromRelationship?.tableId)
$: through = plusTables.find(table => table._id === fromRelationship?.through) $: through = plusTables.find(table => table._id === fromRelationship?.through)
$: valid = toTable && fromTable && isValid(fromRelationship) $: valid = toTable && fromTable && isValid(fromRelationship)
$: linkTable = through || toTable $: linkTable = through || toTable
$: relationshipTypes = [ $: relationshipTypes = [
{ {
label: "Many", label: "Many",
value: RelationshipTypes.MANY_TO_MANY, value: RelationshipTypes.MANY_TO_MANY,
}, },
{ {
label: "One", label: "One",
value: RelationshipTypes.MANY_TO_ONE, value: RelationshipTypes.MANY_TO_ONE,
} },
] ]
$: updateRelationshipType(fromRelationship?.relationshipType) $: updateRelationshipType(fromRelationship?.relationshipType)
function updateRelationshipType(fromType) { function updateRelationshipType(fromType) {
@ -48,7 +57,8 @@
function buildRelationships() { function buildRelationships() {
// if any to many only need to check from // if any to many only need to check from
const manyToMany = fromRelationship.relationshipType === RelationshipTypes.MANY_TO_MANY const manyToMany =
fromRelationship.relationshipType === RelationshipTypes.MANY_TO_MANY
// main is simply used to know this is the side the user configured it from // main is simply used to know this is the side the user configured it from
const id = uuid() const id = uuid()
let relateFrom = { let relateFrom = {
@ -97,9 +107,11 @@
async function saveRelationship() { async function saveRelationship() {
buildRelationships() buildRelationships()
// source of relationship // source of relationship
datasource.entities[fromTable.name].schema[fromRelationship.name] = fromRelationship datasource.entities[fromTable.name].schema[fromRelationship.name] =
fromRelationship
// save other side of relationship in the other schema // save other side of relationship in the other schema
datasource.entities[toTable.name].schema[toRelationship.name] = toRelationship datasource.entities[toTable.name].schema[toRelationship.name] =
toRelationship
// If relationship has been renamed // If relationship has been renamed
if (originalFromName !== fromRelationship.name) { if (originalFromName !== fromRelationship.name) {
@ -139,35 +151,35 @@
</div> </div>
<div class="table-selector"> <div class="table-selector">
<Select <Select
label="Relationship" label="Relationship"
options={relationshipTypes} options={relationshipTypes}
bind:value={fromRelationship.relationshipType} bind:value={fromRelationship.relationshipType}
/> />
<Select <Select
label="From" label="From"
options={tableOptions} options={tableOptions}
bind:value={toRelationship.tableId} bind:value={toRelationship.tableId}
/> />
<Select <Select
label={"Has many"} label={"Has many"}
options={tableOptions} options={tableOptions}
bind:value={fromRelationship.tableId} bind:value={fromRelationship.tableId}
/> />
{#if fromRelationship?.relationshipType === RelationshipTypes.MANY_TO_MANY} {#if fromRelationship?.relationshipType === RelationshipTypes.MANY_TO_MANY}
<Select <Select
label={"Through"} label={"Through"}
options={tableOptions} options={tableOptions}
bind:value={fromRelationship.through} bind:value={fromRelationship.through}
/> />
{:else if toTable} {:else if toTable}
<Select <Select
label={`Foreign Key (${toTable?.name})`} label={`Foreign Key (${toTable?.name})`}
options={Object.keys(toTable?.schema)} options={Object.keys(toTable?.schema)}
bind:value={fromRelationship.fieldName} bind:value={fromRelationship.fieldName}
/> />
{/if} {/if}
</div> </div>
@ -195,4 +207,4 @@
.right-name { .right-name {
grid-column: 2; grid-column: 2;
} }
</style> </style>

View File

@ -317,6 +317,6 @@
.table-buttons { .table-buttons {
display: grid; display: grid;
grid-gap: var(--spacing-l); grid-gap: var(--spacing-l);
grid-template-columns:1fr 1fr; grid-template-columns: 1fr 1fr;
} }
</style> </style>

View File

@ -19,20 +19,25 @@
if (!table || !table.schema) { if (!table || !table.schema) {
return [] return []
} }
return Object.entries(table.schema).filter(field => field[1].type !== "link").map(([fieldName]) => fieldName) return Object.entries(table.schema)
.filter(field => field[1].type !== "link")
.map(([fieldName]) => fieldName)
} }
</script> </script>
<ModalContent <ModalContent
title="Edit display columns" title="Edit display columns"
confirmText="Save" confirmText="Save"
onConfirm={saveDisplayColumns} onConfirm={saveDisplayColumns}
> >
<Body>Select the columns that will be shown when displaying relationships.</Body> <Body
>Select the columns that will be shown when displaying relationships.</Body
>
{#each plusTables as table} {#each plusTables as table}
<Select <Select
label={table.name} label={table.name}
options={getColumnOptions(table)} options={getColumnOptions(table)}
bind:value={table.primaryDisplay} bind:value={table.primaryDisplay}
/> />
{/each} {/each}
</ModalContent> </ModalContent>