Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow tables to handle _id values in non DS+ rows #14929

Merged
merged 4 commits into from
Oct 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions packages/client/src/components/app/GridBlock.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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...
Expand Down
2 changes: 2 additions & 0 deletions packages/frontend-core/src/components/grid/lib/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 13 additions & 6 deletions packages/frontend-core/src/components/grid/lib/utils.js
Original file line number Diff line number Diff line change
@@ -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 => {
Expand All @@ -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)
}
17 changes: 11 additions & 6 deletions packages/frontend-core/src/components/grid/stores/rows.js
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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]) {
Expand Down Expand Up @@ -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
Expand Down
Loading