diff --git a/packages/builder/src/builderStore/store/backend.js b/packages/builder/src/builderStore/store/backend.js
index f48b561ef0..3cdabf1ed5 100644
--- a/packages/builder/src/builderStore/store/backend.js
+++ b/packages/builder/src/builderStore/store/backend.js
@@ -1,4 +1,4 @@
-import { writable } from "svelte/store"
+import { writable, get } from "svelte/store"
import { cloneDeep } from "lodash/fp"
import api from "../api"
@@ -62,16 +62,30 @@ export const getBackendUiStore = () => {
}),
save: async 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
- 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 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
if (field.name && field.name !== key) {
updatedTable.schema[field.name] = field
updatedTable._rename = { old: key, updated: field.name }
delete updatedTable.schema[key]
}
+ // finally record this field has been used
+ fieldNames.push(key.toLowerCase())
}
const SAVE_TABLE_URL = `/api/tables`
diff --git a/packages/builder/src/components/backend/DataTable/Table.svelte b/packages/builder/src/components/backend/DataTable/Table.svelte
index 4c0dc06d39..8354b464c0 100644
--- a/packages/builder/src/components/backend/DataTable/Table.svelte
+++ b/packages/builder/src/components/backend/DataTable/Table.svelte
@@ -132,7 +132,6 @@
font-size: 24px;
font-weight: 600;
text-rendering: optimizeLegibility;
- text-transform: capitalize;
margin-top: 0;
display: flex;
flex-direction: row;
diff --git a/packages/builder/src/components/backend/DataTable/popovers/ColumnPopover.svelte b/packages/builder/src/components/backend/DataTable/popovers/ColumnPopover.svelte
index 2857b651c3..f844cdefae 100644
--- a/packages/builder/src/components/backend/DataTable/popovers/ColumnPopover.svelte
+++ b/packages/builder/src/components/backend/DataTable/popovers/ColumnPopover.svelte
@@ -110,9 +110,6 @@
align-items: center;
gap: var(--spacing-xs);
}
- .container span {
- text-transform: capitalize;
- }
h5 {
padding: var(--spacing-xl) 0 0 var(--spacing-xl);
diff --git a/packages/builder/src/components/userInterface/ComponentsHierarchy.svelte b/packages/builder/src/components/userInterface/ComponentsHierarchy.svelte
index 8393299b12..add2a99d6a 100644
--- a/packages/builder/src/components/userInterface/ComponentsHierarchy.svelte
+++ b/packages/builder/src/components/userInterface/ComponentsHierarchy.svelte
@@ -27,15 +27,12 @@
const joinPath = join("/")
const normalizedName = name =>
- pipe(
- name,
- [
- trimCharsStart("./"),
- trimCharsStart("~/"),
- trimCharsStart("../"),
- trimChars(" "),
- ]
- )
+ pipe(name, [
+ trimCharsStart("./"),
+ trimCharsStart("~/"),
+ trimCharsStart("../"),
+ trimChars(" "),
+ ])
const changeScreen = screen => {
store.setCurrentScreen(screen.props._instanceName)
diff --git a/packages/server/src/api/controllers/table.js b/packages/server/src/api/controllers/table.js
index 82f981e3e6..3030274016 100644
--- a/packages/server/src/api/controllers/table.js
+++ b/packages/server/src/api/controllers/table.js
@@ -41,6 +41,18 @@ exports.save = async function(ctx) {
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
let { _rename } = tableToSave
if (_rename && _rename.old === _rename.updated) {
@@ -50,9 +62,9 @@ exports.save = async function(ctx) {
// rename row fields when table column is renamed
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) {
- throw "Cannot rename the display column."
+ ctx.throw(400, "Cannot rename the display column.")
} else if (_rename) {
const rows = await db.allDocs(
getRowParams(tableToSave._id, null, {
diff --git a/packages/server/src/db/linkedRows/index.js b/packages/server/src/db/linkedRows/index.js
index 0932fc665f..6f745b6e7c 100644
--- a/packages/server/src/db/linkedRows/index.js
+++ b/packages/server/src/db/linkedRows/index.js
@@ -1,5 +1,10 @@
const LinkController = require("./LinkController")
-const { IncludeDocs, getLinkDocuments, createLinkView } = require("./linkUtils")
+const {
+ IncludeDocs,
+ getLinkDocuments,
+ createLinkView,
+ getUniqueByProp,
+} = require("./linkUtils")
const _ = require("lodash")
/**
@@ -110,7 +115,12 @@ exports.attachLinkInfo = async (instanceId, rows) => {
// now iterate through the rows and all field information
for (let row of rows) {
// get all links for row, ignore fieldName for now
- const linkVals = responses.filter(el => el.thisId === row._id)
+ // have to get unique as the previous table query can
+ // return duplicates, could be querying for both tables in a relation
+ const linkVals = getUniqueByProp(
+ responses.filter(el => el.thisId === row._id),
+ "id"
+ )
for (let linkVal of linkVals) {
// work out which link pertains to this row
if (!(row[linkVal.fieldName] instanceof Array)) {
diff --git a/packages/server/src/db/linkedRows/linkUtils.js b/packages/server/src/db/linkedRows/linkUtils.js
index 8f548eed3d..5f600cc3cb 100644
--- a/packages/server/src/db/linkedRows/linkUtils.js
+++ b/packages/server/src/db/linkedRows/linkUtils.js
@@ -92,3 +92,9 @@ exports.getLinkDocuments = async function({
}
}
}
+
+exports.getUniqueByProp = (array, prop) => {
+ return array.filter((obj, pos, arr) => {
+ return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos
+ })
+}
diff --git a/packages/standard-components/src/DataGrid/Component.svelte b/packages/standard-components/src/DataGrid/Component.svelte
index f8fa5d4e5a..21d5d86c97 100644
--- a/packages/standard-components/src/DataGrid/Component.svelte
+++ b/packages/standard-components/src/DataGrid/Component.svelte
@@ -66,7 +66,7 @@
headerCheckboxSelection: i === 0 && canEdit,
checkboxSelection: i === 0 && canEdit,
valueSetter: setters.get(schema[key].type),
- headerName: key.charAt(0).toUpperCase() + key.slice(1),
+ headerName: key,
field: key,
hide: shouldHideField(key),
sortable: true,
@@ -75,19 +75,22 @@
autoHeight: true,
}
})
- columnDefs = [...columnDefs, {
- headerName: 'Details',
- field: '_id',
+ columnDefs = [
+ ...columnDefs,
+ {
+ headerName: "Details",
+ field: "_id",
width: 25,
flex: 0,
editable: false,
sortable: false,
cellRenderer: getRenderer({
- type: '_id',
- options: detailUrl
+ type: "_id",
+ options: detailUrl,
}),
autoHeight: true,
- }]
+ },
+ ]
dataLoaded = true
}
})
diff --git a/packages/standard-components/src/DataGrid/ViewDetails/Cell.svelte b/packages/standard-components/src/DataGrid/ViewDetails/Cell.svelte
index 58cf2a5408..09c9b15e6d 100644
--- a/packages/standard-components/src/DataGrid/ViewDetails/Cell.svelte
+++ b/packages/standard-components/src/DataGrid/ViewDetails/Cell.svelte
@@ -1,12 +1,12 @@
\ No newline at end of file
+ a {
+ color: var(--grey-6);
+ }
+