diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index c6b08e3869a..4a8dfb4fcbe 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -60,8 +60,11 @@ // Provide additional data context for live binding eval export const getAdditionalDataContext = () => { - const rows = get(grid?.getContext()?.rows) - const goldenRow = generateGoldenSample(rows) + const gridContext = grid?.getContext() + const rows = get(gridContext?.rows) || [] + const clean = gridContext?.rows.actions.cleanRow || (x => x) + const cleaned = rows.map(clean) + const goldenRow = generateGoldenSample(cleaned) const id = get(component).id return { // Not sure what this one is for... diff --git a/packages/frontend-core/src/components/grid/lib/constants.js b/packages/frontend-core/src/components/grid/lib/constants.js index 6ea7a981786..81b4a2f823d 100644 --- a/packages/frontend-core/src/components/grid/lib/constants.js +++ b/packages/frontend-core/src/components/grid/lib/constants.js @@ -10,6 +10,8 @@ export const DefaultColumnWidth = 200 export const MinColumnWidth = 80 export const NewRowID = "new" export const BlankRowID = "blank" +export const GeneratedIDPrefix = "‽‽" +export const CellIDSeparator = "‽‽" export const RowPageSize = 100 export const FocusedCellMinOffset = ScrollBarSize * 3 export const ControlsHeight = 50 diff --git a/packages/frontend-core/src/components/grid/lib/utils.js b/packages/frontend-core/src/components/grid/lib/utils.js index b5485abc36f..f1f33d9950e 100644 --- a/packages/frontend-core/src/components/grid/lib/utils.js +++ b/packages/frontend-core/src/components/grid/lib/utils.js @@ -1,18 +1,17 @@ -// We can't use "-" as a separator as this can be present in the ID -// or column name, so we use something very unusual to avoid this problem -const JOINING_CHARACTER = "‽‽" +import { GeneratedIDPrefix, CellIDSeparator } from "./constants" +import { Helpers } from "@budibase/bbui" export const parseCellID = cellId => { if (!cellId) { return { rowId: undefined, field: undefined } } - const parts = cellId.split(JOINING_CHARACTER) + const parts = cellId.split(CellIDSeparator) const field = parts.pop() - return { rowId: parts.join(JOINING_CHARACTER), field } + return { rowId: parts.join(CellIDSeparator), field } } export const getCellID = (rowId, fieldName) => { - return `${rowId}${JOINING_CHARACTER}${fieldName}` + return `${rowId}${CellIDSeparator}${fieldName}` } export const parseEventLocation = e => { @@ -21,3 +20,11 @@ export const parseEventLocation = e => { y: e.clientY ?? e.touches?.[0]?.clientY, } } + +export const generateRowID = () => { + return `${GeneratedIDPrefix}${Helpers.uuid()}` +} + +export const isGeneratedRowID = id => { + return id?.startsWith(GeneratedIDPrefix) +} diff --git a/packages/frontend-core/src/components/grid/stores/rows.js b/packages/frontend-core/src/components/grid/stores/rows.js index 4cfaa1cfd59..122bbc295a9 100644 --- a/packages/frontend-core/src/components/grid/stores/rows.js +++ b/packages/frontend-core/src/components/grid/stores/rows.js @@ -1,7 +1,12 @@ import { writable, derived, get } from "svelte/store" import { fetchData } from "../../../fetch" import { NewRowID, RowPageSize } from "../lib/constants" -import { getCellID, parseCellID } from "../lib/utils" +import { + generateRowID, + getCellID, + isGeneratedRowID, + parseCellID, +} from "../lib/utils" import { tick } from "svelte" import { Helpers } from "@budibase/bbui" import { sleep } from "../../../utils/utils" @@ -634,10 +639,10 @@ export const createActions = context => { newRow = newRows[i] // Ensure we have a unique _id. - // This means generating one for non DS+, overwriting any that may already - // exist as we cannot allow duplicates. - if (!$hasBudibaseIdentifiers) { - newRow._id = Helpers.uuid() + // We generate one for non DS+ where required, but trust that any existing + // _id values are unique (e.g. Mongo) + if (!$hasBudibaseIdentifiers && !newRow._id?.length) { + newRow._id = generateRowID() } if (!rowCacheMap[newRow._id]) { @@ -674,7 +679,7 @@ export const createActions = context => { let clone = { ...row } delete clone.__idx delete clone.__metadata - if (!get(hasBudibaseIdentifiers)) { + if (!get(hasBudibaseIdentifiers) && isGeneratedRowID(clone._id)) { delete clone._id } return clone