Fixing issues with table columns allowing weirdness to happen around casing, now only one column with a particular name can be specified, no matter what the case, but the case will be respected.

This commit is contained in:
mike12345567 2020-10-15 18:09:19 +01:00
parent e9a0c1c512
commit 335043440d
4 changed files with 30 additions and 8 deletions

View File

@ -1,4 +1,4 @@
import { writable } from "svelte/store" import { writable, get } from "svelte/store"
import { cloneDeep } from "lodash/fp" import { cloneDeep } from "lodash/fp"
import api from "../api" import api from "../api"
@ -62,16 +62,30 @@ export const getBackendUiStore = () => {
}), }),
save: async table => { save: async table => {
const updatedTable = cloneDeep(table) const updatedTable = cloneDeep(table)
const oldTable = get(store).tables.filter(t => t._id === table._id)[0]
const fieldNames = []
// update any renamed schema keys to reflect their names // update any renamed schema keys to reflect their names
for (let key in updatedTable.schema) { for (let key of Object.keys(updatedTable.schema)) {
// if field name has been seen before remove it
if (fieldNames.indexOf(key.toLowerCase()) !== -1) {
delete updatedTable.schema[key]
continue
}
const field = updatedTable.schema[key] const field = updatedTable.schema[key]
const oldField = oldTable?.schema[key]
// if the type has changed then revert back to the old field
if (oldField != null && oldField.type !== field.type) {
updatedTable.schema[key] = oldField
}
// field has been renamed // field has been renamed
if (field.name && field.name !== key) { if (field.name && field.name !== key) {
updatedTable.schema[field.name] = field updatedTable.schema[field.name] = field
updatedTable._rename = { old: key, updated: field.name } updatedTable._rename = { old: key, updated: field.name }
delete updatedTable.schema[key] delete updatedTable.schema[key]
} }
// finally record this field has been used
fieldNames.push(key.toLowerCase())
} }
const SAVE_TABLE_URL = `/api/tables` const SAVE_TABLE_URL = `/api/tables`

View File

@ -132,7 +132,6 @@
font-size: 24px; font-size: 24px;
font-weight: 600; font-weight: 600;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
text-transform: capitalize;
margin-top: 0; margin-top: 0;
display: flex; display: flex;
flex-direction: row; flex-direction: row;

View File

@ -110,9 +110,6 @@
align-items: center; align-items: center;
gap: var(--spacing-xs); gap: var(--spacing-xs);
} }
.container span {
text-transform: capitalize;
}
h5 { h5 {
padding: var(--spacing-xl) 0 0 var(--spacing-xl); padding: var(--spacing-xl) 0 0 var(--spacing-xl);

View File

@ -41,6 +41,18 @@ exports.save = async function(ctx) {
oldTable = await db.get(ctx.request.body._id) oldTable = await db.get(ctx.request.body._id)
} }
// make sure that types don't change of a column, have to remove
// the column if you want to change the type
if (oldTable && oldTable.schema) {
for (let propKey of Object.keys(tableToSave.schema)) {
let column = tableToSave.schema[propKey]
let oldColumn = oldTable.schema[propKey]
if (oldColumn && oldColumn.type !== column.type) {
ctx.throw(400, "Cannot change the type of a column")
}
}
}
// Don't rename if the name is the same // Don't rename if the name is the same
let { _rename } = tableToSave let { _rename } = tableToSave
if (_rename && _rename.old === _rename.updated) { if (_rename && _rename.old === _rename.updated) {
@ -50,9 +62,9 @@ exports.save = async function(ctx) {
// rename row fields when table column is renamed // rename row fields when table column is renamed
if (_rename && tableToSave.schema[_rename.updated].type === "link") { if (_rename && tableToSave.schema[_rename.updated].type === "link") {
throw "Cannot rename a linked field." ctx.throw(400, "Cannot rename a linked column.")
} else if (_rename && tableToSave.primaryDisplay === _rename.old) { } else if (_rename && tableToSave.primaryDisplay === _rename.old) {
throw "Cannot rename the display column." ctx.throw(400, "Cannot rename the display column.")
} else if (_rename) { } else if (_rename) {
const rows = await db.allDocs( const rows = await db.allDocs(
getRowParams(tableToSave._id, null, { getRowParams(tableToSave._id, null, {