Disallow googlesheets from using attachments and fix order of types.

This commit is contained in:
mike12345567 2025-03-13 16:24:41 +00:00
parent cd7bec16c7
commit f203711a56
1 changed files with 71 additions and 47 deletions

View File

@ -99,6 +99,31 @@
const autoColumnInfo = getAutoColumnInformation() const autoColumnInfo = getAutoColumnInformation()
let optionsValid = true let optionsValid = true
// a fixed order for the types to stop them moving around
// we've never really guaranteed an order to these, which means that
// they can move around very easily
const fixedTypeOrder = [
FIELDS.STRING,
FIELDS.NUMBER,
FIELDS.OPTIONS,
FIELDS.ARRAY,
FIELDS.BOOLEAN,
FIELDS.DATETIME,
FIELDS.LINK,
FIELDS.AI,
FIELDS.LONGFORM,
FIELDS.USER,
FIELDS.USERS,
FIELDS.ATTACHMENT_SINGLE,
FIELDS.ATTACHMENTS,
FIELDS.FORMULA,
FIELDS.JSON,
FIELDS.BARCODEQR,
FIELDS.SIGNATURE_SINGLE,
FIELDS.BIGINT,
FIELDS.AUTO,
]
$: rowGoldenSample = RowUtils.generateGoldenSample($rows) $: rowGoldenSample = RowUtils.generateGoldenSample($rows)
$: aiEnabled = $: aiEnabled =
$licensing.customAIConfigsEnabled || $licensing.budibaseAiEnabled $licensing.customAIConfigsEnabled || $licensing.budibaseAiEnabled
@ -176,7 +201,7 @@
!editableColumn.autocolumn !editableColumn.autocolumn
$: hasDefault = $: hasDefault =
editableColumn?.default != null && editableColumn?.default !== "" editableColumn?.default != null && editableColumn?.default !== ""
$: externalTable = table.sourceType === DB_TYPE_EXTERNAL $: isExternalTable = table.sourceType === DB_TYPE_EXTERNAL
// in the case of internal tables the sourceId will just be undefined // in the case of internal tables the sourceId will just be undefined
$: tableOptions = $tables.list.filter( $: tableOptions = $tables.list.filter(
opt => opt =>
@ -187,10 +212,13 @@
(originalName && (originalName &&
SWITCHABLE_TYPES[field.type] && SWITCHABLE_TYPES[field.type] &&
!editableColumn?.autocolumn) !editableColumn?.autocolumn)
$: allowedTypes = getAllowedTypes(datasource).map(t => ({ $: allowedTypes = getAllowedTypes(datasource, table).map(t => ({
fieldId: makeFieldId(t.type, t.subtype), fieldId: makeFieldId(t.type, t.subtype),
...t, ...t,
})) }))
$: orderedAllowedTypes = fixedTypeOrder.filter(ordered =>
allowedTypes.find(allowed => allowed.type === ordered.type)
)
$: defaultValueBindings = [ $: defaultValueBindings = [
{ {
type: "context", type: "context",
@ -210,6 +238,20 @@
editableColumn.default editableColumn.default
) )
const allTableFields = [
FIELDS.STRING,
FIELDS.NUMBER,
FIELDS.OPTIONS,
FIELDS.ARRAY,
FIELDS.BOOLEAN,
FIELDS.DATETIME,
FIELDS.LINK,
FIELDS.LONGFORM,
FIELDS.FORMULA,
FIELDS.BARCODEQR,
FIELDS.BIGINT,
]
const fieldDefinitions = Object.values(FIELDS).reduce( const fieldDefinitions = Object.values(FIELDS).reduce(
// Storing the fields by complex field id // Storing the fields by complex field id
(acc, field) => ({ (acc, field) => ({
@ -412,7 +454,11 @@
deleteColName = "" deleteColName = ""
} }
function getAllowedTypes(datasource) { function getAllowedTypes(datasource, table) {
const isSqlTable = table.sql
const isGoogleSheet =
table.sourceType === DB_TYPE_EXTERNAL &&
datasource?.source === SourceName.GOOGLE_SHEETS
if (originalName) { if (originalName) {
let possibleTypes = SWITCHABLE_TYPES[field.type] || [editableColumn.type] let possibleTypes = SWITCHABLE_TYPES[field.type] || [editableColumn.type]
if (helpers.schema.isDeprecatedSingleUserColumn(editableColumn)) { if (helpers.schema.isDeprecatedSingleUserColumn(editableColumn)) {
@ -442,59 +488,37 @@
.map(([_, fieldDefinition]) => fieldDefinition) .map(([_, fieldDefinition]) => fieldDefinition)
} }
if (!externalTable) { if (!isExternalTable) {
return [ const fields = [
FIELDS.STRING, ...allTableFields,
FIELDS.NUMBER,
FIELDS.OPTIONS,
FIELDS.ARRAY,
FIELDS.BOOLEAN,
FIELDS.DATETIME,
FIELDS.LINK,
...(aiEnabled ? [FIELDS.AI] : []),
FIELDS.LONGFORM,
FIELDS.USER, FIELDS.USER,
FIELDS.USERS, FIELDS.USERS,
FIELDS.ATTACHMENT_SINGLE, FIELDS.ATTACHMENT_SINGLE,
FIELDS.ATTACHMENTS, FIELDS.ATTACHMENTS,
FIELDS.FORMULA,
FIELDS.JSON,
FIELDS.BARCODEQR,
FIELDS.SIGNATURE_SINGLE, FIELDS.SIGNATURE_SINGLE,
FIELDS.BIGINT, FIELDS.JSON,
FIELDS.AUTO, FIELDS.AUTO,
] ]
} else { if (aiEnabled) {
let fields = [ fields.push(FIELDS.AI)
FIELDS.STRING, }
FIELDS.NUMBER, return fields
FIELDS.OPTIONS, }
FIELDS.ARRAY, if (isExternalTable && isSqlTable) {
FIELDS.BOOLEAN, return [
FIELDS.DATETIME, ...allTableFields,
FIELDS.LINK,
FIELDS.LONGFORM,
FIELDS.USER, FIELDS.USER,
FIELDS.USERS, FIELDS.USERS,
FIELDS.FORMULA,
FIELDS.BARCODEQR,
FIELDS.BIGINT,
FIELDS.ATTACHMENT_SINGLE, FIELDS.ATTACHMENT_SINGLE,
FIELDS.ATTACHMENTS, FIELDS.ATTACHMENTS,
FIELDS.SIGNATURE_SINGLE, FIELDS.SIGNATURE_SINGLE,
] ]
} else if (isExternalTable && isGoogleSheet) {
// Filter out multiple users for google sheets // google-sheets supports minimum set (no attachments or user references)
if (datasource?.source === SourceName.GOOGLE_SHEETS) { return allTableFields
fields = fields.filter(x => x !== FIELDS.USERS) } else if (isExternalTable && !isSqlTable) {
} // filter out SQL-specific types for non-SQL datasources
return allTableFields.filter(x => x !== FIELDS.LINK && x !== FIELDS.ARRAY)
// Filter out SQL-specific types for non-SQL datasources
if (!table.sql) {
fields = fields.filter(x => x !== FIELDS.LINK && x !== FIELDS.ARRAY)
}
return fields
} }
} }
@ -542,10 +566,10 @@
}) })
} }
const newError = {} const newError = {}
const prohibited = externalTable const prohibited = isExternalTable
? PROTECTED_EXTERNAL_COLUMNS ? PROTECTED_EXTERNAL_COLUMNS
: PROTECTED_INTERNAL_COLUMNS : PROTECTED_INTERNAL_COLUMNS
if (!externalTable && fieldInfo.name?.startsWith("_")) { if (!isExternalTable && fieldInfo.name?.startsWith("_")) {
newError.name = `Column name cannot start with an underscore.` newError.name = `Column name cannot start with an underscore.`
} else if (fieldInfo.name && !fieldInfo.name.match(ValidColumnNameRegex)) { } else if (fieldInfo.name && !fieldInfo.name.match(ValidColumnNameRegex)) {
newError.name = `Illegal character; must be alpha-numeric.` newError.name = `Illegal character; must be alpha-numeric.`
@ -614,7 +638,7 @@
disabled={!typeEnabled} disabled={!typeEnabled}
bind:value={editableColumn.fieldId} bind:value={editableColumn.fieldId}
on:change={onHandleTypeChange} on:change={onHandleTypeChange}
options={allowedTypes} options={orderedAllowedTypes}
getOptionLabel={field => field.name} getOptionLabel={field => field.name}
getOptionValue={field => field.fieldId} getOptionValue={field => field.fieldId}
getOptionIcon={field => field.icon} getOptionIcon={field => field.icon}
@ -750,7 +774,7 @@
{errors} {errors}
/> />
{:else if editableColumn.type === FieldType.FORMULA} {:else if editableColumn.type === FieldType.FORMULA}
{#if !externalTable} {#if !isExternalTable}
<div class="split-label"> <div class="split-label">
<div class="label-length"> <div class="label-length">
<Label size="M">Formula Type</Label> <Label size="M">Formula Type</Label>