1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-01-31 03:12:45 +00:00
bramw_baserow/web-frontend/modules/database/mixins/linkRowField.js
2024-12-13 13:27:52 +00:00

89 lines
2.7 KiB
JavaScript

import { getPrimaryOrFirstField } from '@baserow/modules/database/utils/field'
import BigNumber from 'bignumber.js'
export default {
computed: {
/**
* Returns the value of the field that can be used when creating a new row
* in the linked table starting from the current row.
*/
presetsForNewRowInLinkedTable() {
const presets = {}
const value = this.primaryFieldLinkRowValue
if (value) {
presets[`field_${this.field.link_row_related_field_id}`] = [value]
}
return presets
},
/**
* Returns the value of the field.
*/
primaryFieldLinkRowValue() {
// Set the starting row as preset so that can be used later if the user wants to create a new row
// starting from the selected row.
if (!this.allFieldsInTable) {
return
}
const primaryField = getPrimaryOrFirstField(this.allFieldsInTable)
const primaryFieldType = this.$registry.get(
'field',
primaryField._.type.type
)
return {
id: this.row.id,
value: primaryFieldType.toHumanReadableString(
primaryField,
this.row[`field_${primaryField.id}`]
),
}
},
},
methods: {
/**
* Removes an existing relation from the value.
*/
removeValue(event, value, id) {
const newValue = JSON.parse(JSON.stringify(value))
const index = newValue.findIndex((item) => item.id === id)
if (index === -1) {
return
}
newValue.splice(index, 1)
this.$emit('update', newValue, value)
},
/**
* Adds a new relation to the value. This typically happens via the modal.
*/
addValue(value, { row, primary }) {
// Check if the relation already exists.
for (let i = 0; i < value.length; i++) {
if (value[i].id === row.id) {
return
}
}
// Prepare the new value with all the relations and emit that value to the
// parent.
const rowValue = this.$registry
.get('field', primary.type)
.toHumanReadableString(primary, row[`field_${primary.id}`])
// The backend sort by order first and then by id, but we don't have the order
// here, so we just sort by id
const valueCopy = JSON.parse(JSON.stringify(value))
const newValue = [
...valueCopy,
{ id: row.id, value: rowValue, order: row.order },
].toSorted((a, b) => {
const orderA = new BigNumber(a.order)
const orderB = new BigNumber(b.order)
return orderA.isLessThan(orderB)
? -1
: orderA.isEqualTo(orderB)
? a.id - b.id
: 1
})
this.$emit('update', newValue, value)
},
},
}