commit
e9c9a89d4d
|
@ -28,10 +28,8 @@
|
||||||
.flat()
|
.flat()
|
||||||
// Prevent modal closing if there were errors
|
// Prevent modal closing if there were errors
|
||||||
return false
|
return false
|
||||||
}
|
} else if (rowResponse.status === 400 || rowResponse.status === 500) {
|
||||||
|
errors = [{ message: rowResponse.message }]
|
||||||
if (rowResponse.status === 500) {
|
|
||||||
notifier.danger(rowResponse.message)
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@
|
||||||
.flat()
|
.flat()
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
} else if (rowResponse.status === 400 && rowResponse.message) {
|
} else if (rowResponse.status === 400 || rowResponse.status === 500) {
|
||||||
errors = [{ message: rowResponse.message }]
|
errors = [{ message: rowResponse.message }]
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,16 +43,6 @@
|
||||||
</Label>
|
</Label>
|
||||||
{:else}
|
{:else}
|
||||||
{#if schema.relationshipType === 'one-to-many'}
|
{#if schema.relationshipType === 'one-to-many'}
|
||||||
<Multiselect
|
|
||||||
secondary
|
|
||||||
bind:value={linkedIds}
|
|
||||||
{label}
|
|
||||||
placeholder="Choose some options">
|
|
||||||
{#each rows as row}
|
|
||||||
<option value={row._id}>{getPrettyName(row)}</option>
|
|
||||||
{/each}
|
|
||||||
</Multiselect>
|
|
||||||
{:else}
|
|
||||||
<Select
|
<Select
|
||||||
thin
|
thin
|
||||||
secondary
|
secondary
|
||||||
|
@ -66,5 +56,15 @@
|
||||||
</option>
|
</option>
|
||||||
{/each}
|
{/each}
|
||||||
</Select>
|
</Select>
|
||||||
|
{:else}
|
||||||
|
<Multiselect
|
||||||
|
secondary
|
||||||
|
bind:value={linkedIds}
|
||||||
|
{label}
|
||||||
|
placeholder="Choose some options">
|
||||||
|
{#each rows as row}
|
||||||
|
<option value={row._id}>{getPrettyName(row)}</option>
|
||||||
|
{/each}
|
||||||
|
</Multiselect>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
@ -7,6 +7,7 @@ const {
|
||||||
DocumentTypes,
|
DocumentTypes,
|
||||||
SEPARATOR,
|
SEPARATOR,
|
||||||
ViewNames,
|
ViewNames,
|
||||||
|
generateUserID,
|
||||||
} = require("../../db/utils")
|
} = require("../../db/utils")
|
||||||
const usersController = require("./user")
|
const usersController = require("./user")
|
||||||
const {
|
const {
|
||||||
|
@ -140,7 +141,11 @@ exports.save = async function(ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!inputs._rev && !inputs._id) {
|
if (!inputs._rev && !inputs._id) {
|
||||||
inputs._id = generateRowID(inputs.tableId)
|
if (inputs.tableId === ViewNames.USERS) {
|
||||||
|
inputs._id = generateUserID(inputs.email)
|
||||||
|
} else {
|
||||||
|
inputs._id = generateRowID(inputs.tableId)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// this returns the table and row incase they have been updated
|
// this returns the table and row incase they have been updated
|
||||||
|
|
|
@ -3,7 +3,6 @@ const { IncludeDocs, getLinkDocuments } = require("./linkUtils")
|
||||||
const { generateLinkID } = require("../utils")
|
const { generateLinkID } = require("../utils")
|
||||||
const Sentry = require("@sentry/node")
|
const Sentry = require("@sentry/node")
|
||||||
const { FieldTypes, RelationshipTypes } = require("../../constants")
|
const { FieldTypes, RelationshipTypes } = require("../../constants")
|
||||||
const { isEqual } = require("lodash")
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new link document structure which can be put to the database. It is important to
|
* Creates a new link document structure which can be put to the database. It is important to
|
||||||
|
@ -133,6 +132,19 @@ class LinkController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the two schemas are equal (in the important parts, not a pure equality check)
|
||||||
|
*/
|
||||||
|
areSchemasEqual(schema1, schema2) {
|
||||||
|
const compareFields = ["name", "type", "tableId", "fieldName", "autocolumn"]
|
||||||
|
for (let field of compareFields) {
|
||||||
|
if (schema1[field] !== schema2[field]) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// all operations here will assume that the table
|
// all operations here will assume that the table
|
||||||
// this operation is related to has linked rows
|
// this operation is related to has linked rows
|
||||||
/**
|
/**
|
||||||
|
@ -310,12 +322,28 @@ class LinkController {
|
||||||
tableId: table._id,
|
tableId: table._id,
|
||||||
fieldName: fieldName,
|
fieldName: fieldName,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field.autocolumn) {
|
if (field.autocolumn) {
|
||||||
linkConfig.autocolumn = field.autocolumn
|
linkConfig.autocolumn = field.autocolumn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (field.relationshipType) {
|
||||||
|
// Ensure that the other side of the relationship is locked to one record
|
||||||
|
linkConfig.relationshipType = field.relationshipType
|
||||||
|
|
||||||
|
// Update this table to be the many
|
||||||
|
table.schema[field.name].relationshipType =
|
||||||
|
RelationshipTypes.MANY_TO_MANY
|
||||||
|
const response = await this._db.put(table)
|
||||||
|
table._rev = response.rev
|
||||||
|
}
|
||||||
|
|
||||||
// check the linked table to make sure we aren't overwriting an existing column
|
// check the linked table to make sure we aren't overwriting an existing column
|
||||||
const existingSchema = linkedTable.schema[field.fieldName]
|
const existingSchema = linkedTable.schema[field.fieldName]
|
||||||
if (existingSchema != null && !isEqual(existingSchema, linkConfig)) {
|
if (
|
||||||
|
existingSchema != null &&
|
||||||
|
!this.areSchemasEqual(existingSchema, linkConfig)
|
||||||
|
) {
|
||||||
throw new Error("Cannot overwrite existing column.")
|
throw new Error("Cannot overwrite existing column.")
|
||||||
}
|
}
|
||||||
// create the link field in the other table
|
// create the link field in the other table
|
||||||
|
|
Loading…
Reference in New Issue