diff --git a/packages/bbui/src/Form/Core/Dropzone.svelte b/packages/bbui/src/Form/Core/Dropzone.svelte
index dd72167791..3d803c0961 100644
--- a/packages/bbui/src/Form/Core/Dropzone.svelte
+++ b/packages/bbui/src/Form/Core/Dropzone.svelte
@@ -67,7 +67,7 @@
}
$: showDropzone =
- (!maximum || (maximum && (value?.length || 0) < maximum)) && !disabled
+ (!maximum || (maximum && value?.length < maximum)) && !disabled
async function processFileList(fileList) {
if (
diff --git a/packages/builder/src/components/backend/DataTable/formula.js b/packages/builder/src/components/backend/DataTable/formula.js
index b339729391..e3da4249bc 100644
--- a/packages/builder/src/components/backend/DataTable/formula.js
+++ b/packages/builder/src/components/backend/DataTable/formula.js
@@ -9,7 +9,7 @@ const MAX_DEPTH = 1
const TYPES_TO_SKIP = [
FieldType.FORMULA,
FieldType.LONGFORM,
- FieldType.ATTACHMENTS,
+ FieldType.ATTACHMENT,
//https://github.com/Budibase/budibase/issues/3030
FieldType.INTERNAL,
]
diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
index 92501bec3b..cfc6e9a7be 100644
--- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
+++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
@@ -394,8 +394,7 @@
FIELDS.BIGINT,
FIELDS.BOOLEAN,
FIELDS.DATETIME,
- FIELDS.ATTACHMENT_SINGLE,
- FIELDS.ATTACHMENTS,
+ FIELDS.ATTACHMENT,
FIELDS.LINK,
FIELDS.FORMULA,
FIELDS.JSON,
diff --git a/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js b/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js
index d0f9afda40..18ebf57d98 100644
--- a/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js
+++ b/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js
@@ -41,8 +41,7 @@ export const FieldTypeToComponentMap = {
[FieldType.BOOLEAN]: "booleanfield",
[FieldType.LONGFORM]: "longformfield",
[FieldType.DATETIME]: "datetimefield",
- [FieldType.ATTACHMENTS]: "attachmentfield",
- [FieldType.ATTACHMENT_SINGLE]: "attachmentsinglefield",
+ [FieldType.ATTACHMENT]: "attachmentfield",
[FieldType.LINK]: "relationshipfield",
[FieldType.JSON]: "jsonfield",
[FieldType.BARCODEQR]: "codescanner",
diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js
index e3888a52e0..dd751d4e13 100644
--- a/packages/builder/src/constants/backend/index.js
+++ b/packages/builder/src/constants/backend/index.js
@@ -107,18 +107,10 @@ export const FIELDS = {
},
},
},
- ATTACHMENT_SINGLE: {
+ ATTACHMENT: {
name: "Attachment",
- type: FieldType.ATTACHMENT_SINGLE,
- icon: "Document",
- constraints: {
- presence: false,
- },
- },
- ATTACHMENTS: {
- name: "Attachment List",
- type: FieldType.ATTACHMENTS,
- icon: "AppleFiles",
+ type: FieldType.ATTACHMENT,
+ icon: "Folder",
constraints: {
type: "array",
presence: false,
@@ -307,7 +299,7 @@ export const PaginationLocations = [
export const BannedSearchTypes = [
FieldType.LINK,
- FieldType.ATTACHMENTS,
+ FieldType.ATTACHMENT,
FieldType.FORMULA,
FieldType.JSON,
"jsonarray",
diff --git a/packages/builder/tsconfig.json b/packages/builder/tsconfig.json
index a7a4c3d800..be79dfd85c 100644
--- a/packages/builder/tsconfig.json
+++ b/packages/builder/tsconfig.json
@@ -1,6 +1,9 @@
{
"extends": "./tsconfig.build.json",
"compilerOptions": {
+ "composite": true,
+ "declaration": true,
+ "sourceMap": true,
"baseUrl": ".",
"paths": {
"assets/*": ["./assets/*"],
diff --git a/packages/client/manifest.json b/packages/client/manifest.json
index cc5c68ea83..08d614391b 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -4226,7 +4226,7 @@
]
},
"attachmentfield": {
- "name": "Attachment list",
+ "name": "Attachment",
"icon": "Attach",
"styles": ["size"],
"requiredAncestors": ["form"],
@@ -4322,103 +4322,6 @@
}
]
},
- "attachmentsinglefield": {
- "name": "Single Attachment",
- "icon": "Attach",
- "styles": ["size"],
- "requiredAncestors": ["form"],
- "editable": true,
- "size": {
- "width": 400,
- "height": 200
- },
- "settings": [
- {
- "type": "field/attachment_single",
- "label": "Field",
- "key": "field",
- "required": true
- },
- {
- "type": "text",
- "label": "Label",
- "key": "label"
- },
- {
- "type": "text",
- "label": "Help text",
- "key": "helpText"
- },
- {
- "type": "text",
- "label": "Extensions",
- "key": "extensions"
- },
- {
- "type": "number",
- "label": "Max attachments",
- "key": "maximum",
- "min": 1
- },
- {
- "type": "event",
- "label": "On change",
- "key": "onChange",
- "context": [
- {
- "label": "Field Value",
- "key": "value"
- }
- ]
- },
- {
- "type": "boolean",
- "label": "Compact",
- "key": "compact",
- "defaultValue": false
- },
- {
- "type": "boolean",
- "label": "Read only",
- "key": "disabled",
- "defaultValue": false
- },
- {
- "type": "validation/attachment",
- "label": "Validation",
- "key": "validation"
- },
- {
- "type": "select",
- "label": "Layout",
- "key": "span",
- "defaultValue": 6,
- "hidden": true,
- "showInBar": true,
- "barStyle": "buttons",
- "options": [
- {
- "label": "1 column",
- "value": 6,
- "barIcon": "Stop",
- "barTitle": "1 column"
- },
- {
- "label": "2 columns",
- "value": 3,
- "barIcon": "ColumnTwoA",
- "barTitle": "2 columns"
- },
- {
- "label": "3 columns",
- "value": 2,
- "barIcon": "ViewColumn",
- "barTitle": "3 columns"
- }
- ]
- }
- ]
- },
"relationshipfield": {
"name": "Relationship Picker",
"icon": "TaskList",
diff --git a/packages/client/src/components/app/blocks/FormBlockComponent.svelte b/packages/client/src/components/app/blocks/FormBlockComponent.svelte
index 968ed36b8b..34168355c4 100644
--- a/packages/client/src/components/app/blocks/FormBlockComponent.svelte
+++ b/packages/client/src/components/app/blocks/FormBlockComponent.svelte
@@ -15,8 +15,7 @@
[FieldType.BOOLEAN]: "booleanfield",
[FieldType.LONGFORM]: "longformfield",
[FieldType.DATETIME]: "datetimefield",
- [FieldType.ATTACHMENTS]: "attachmentfield",
- [FieldType.ATTACHMENT_SINGLE]: "attachmentsinglefield",
+ [FieldType.ATTACHMENT]: "attachmentfield",
[FieldType.LINK]: "relationshipfield",
[FieldType.JSON]: "jsonfield",
[FieldType.BARCODEQR]: "codescanner",
@@ -61,7 +60,7 @@
function getPropsByType(field) {
const propsMapByType = {
- [FieldType.ATTACHMENTS]: (_field, schema) => {
+ [FieldType.ATTACHMENT]: (_field, schema) => {
return {
maximum: schema?.constraints?.length?.maximum,
}
diff --git a/packages/client/src/components/app/forms/AttachmentField.svelte b/packages/client/src/components/app/forms/AttachmentField.svelte
index 8be70bc011..b61f88daeb 100644
--- a/packages/client/src/components/app/forms/AttachmentField.svelte
+++ b/packages/client/src/components/app/forms/AttachmentField.svelte
@@ -1,7 +1,6 @@
@@ -85,14 +78,14 @@
{validation}
{span}
{helpText}
- {type}
+ type="attachment"
bind:fieldState
bind:fieldApi
defaultValue={[]}
>
{#if fieldState}
- import { FieldType } from "@budibase/types"
- import AttachmentField from "./AttachmentField.svelte"
-
- const fieldApiMapper = {
- get: value => (!Array.isArray(value) && value ? [value] : value) || [],
- set: value => value[0] || null,
- }
-
-
-
diff --git a/packages/client/src/components/app/forms/index.js b/packages/client/src/components/app/forms/index.js
index aa54204454..5804d3a79d 100644
--- a/packages/client/src/components/app/forms/index.js
+++ b/packages/client/src/components/app/forms/index.js
@@ -9,7 +9,6 @@ export { default as booleanfield } from "./BooleanField.svelte"
export { default as longformfield } from "./LongFormField.svelte"
export { default as datetimefield } from "./DateTimeField.svelte"
export { default as attachmentfield } from "./AttachmentField.svelte"
-export { default as attachmentsinglefield } from "./AttachmentSingleField.svelte"
export { default as relationshipfield } from "./RelationshipField.svelte"
export { default as passwordfield } from "./PasswordField.svelte"
export { default as formstep } from "./FormStep.svelte"
diff --git a/packages/client/src/components/app/forms/validation.js b/packages/client/src/components/app/forms/validation.js
index cdedd85cf2..3b3a5d6e1d 100644
--- a/packages/client/src/components/app/forms/validation.js
+++ b/packages/client/src/components/app/forms/validation.js
@@ -192,7 +192,7 @@ const parseType = (value, type) => {
}
// Parse attachments, treating no elements as null
- if (type === FieldTypes.ATTACHMENTS) {
+ if (type === FieldTypes.ATTACHMENT) {
if (!Array.isArray(value) || !value.length) {
return null
}
diff --git a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
index 3a1f165b6e..a1f5c4f2aa 100644
--- a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
@@ -10,7 +10,6 @@
export let invertX = false
export let invertY = false
export let schema
- export let maximum
const { API, notifications } = getContext("grid")
const imageExtensions = ["png", "tiff", "gif", "raw", "jpg", "jpeg"]
@@ -99,7 +98,7 @@
{value}
compact
on:change={e => onChange(e.detail)}
- maximum={maximum || schema.constraints?.length?.maximum}
+ maximum={schema.constraints?.length?.maximum}
{processFiles}
{deleteAttachments}
{handleFileTooLarge}
diff --git a/packages/frontend-core/src/components/grid/cells/AttachmentSingleCell.svelte b/packages/frontend-core/src/components/grid/cells/AttachmentSingleCell.svelte
deleted file mode 100644
index c2e29b6ede..0000000000
--- a/packages/frontend-core/src/components/grid/cells/AttachmentSingleCell.svelte
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
diff --git a/packages/frontend-core/src/components/grid/lib/renderers.js b/packages/frontend-core/src/components/grid/lib/renderers.js
index c3ee276ff9..19bf63312d 100644
--- a/packages/frontend-core/src/components/grid/lib/renderers.js
+++ b/packages/frontend-core/src/components/grid/lib/renderers.js
@@ -11,7 +11,6 @@ import BooleanCell from "../cells/BooleanCell.svelte"
import FormulaCell from "../cells/FormulaCell.svelte"
import JSONCell from "../cells/JSONCell.svelte"
import AttachmentCell from "../cells/AttachmentCell.svelte"
-import AttachmentSingleCell from "../cells/AttachmentSingleCell.svelte"
import BBReferenceCell from "../cells/BBReferenceCell.svelte"
const TypeComponentMap = {
@@ -23,8 +22,7 @@ const TypeComponentMap = {
[FieldType.ARRAY]: MultiSelectCell,
[FieldType.NUMBER]: NumberCell,
[FieldType.BOOLEAN]: BooleanCell,
- [FieldType.ATTACHMENTS]: AttachmentCell,
- [FieldType.ATTACHMENT_SINGLE]: AttachmentSingleCell,
+ [FieldType.ATTACHMENT]: AttachmentCell,
[FieldType.LINK]: RelationshipCell,
[FieldType.FORMULA]: FormulaCell,
[FieldType.JSON]: JSONCell,
diff --git a/packages/frontend-core/src/components/grid/lib/utils.js b/packages/frontend-core/src/components/grid/lib/utils.js
index 49d6b0a439..8382bfece8 100644
--- a/packages/frontend-core/src/components/grid/lib/utils.js
+++ b/packages/frontend-core/src/components/grid/lib/utils.js
@@ -16,8 +16,7 @@ const TypeIconMap = {
[FieldType.ARRAY]: "Dropdown",
[FieldType.NUMBER]: "123",
[FieldType.BOOLEAN]: "Boolean",
- [FieldType.ATTACHMENTS]: "AppleFiles",
- [FieldType.ATTACHMENT_SINGLE]: "Document",
+ [FieldType.ATTACHMENT]: "AppleFiles",
[FieldType.LINK]: "DataCorrelated",
[FieldType.FORMULA]: "Calculator",
[FieldType.JSON]: "Brackets",
diff --git a/packages/server/src/api/controllers/table/utils.ts b/packages/server/src/api/controllers/table/utils.ts
index 5649a1d996..0c9933a4cf 100644
--- a/packages/server/src/api/controllers/table/utils.ts
+++ b/packages/server/src/api/controllers/table/utils.ts
@@ -30,6 +30,8 @@ import {
View,
RelationshipFieldMetadata,
FieldType,
+ FieldTypeSubtypes,
+ AttachmentFieldMetadata,
} from "@budibase/types"
export async function clearColumns(table: Table, columnNames: string[]) {
@@ -89,6 +91,26 @@ export async function checkForColumnUpdates(
await checkForViewUpdates(updatedTable, deletedColumns, columnRename)
}
+ const changedAttachmentSubtypeColumns = Object.values(
+ updatedTable.schema
+ ).filter(
+ (column): column is AttachmentFieldMetadata =>
+ column.type === FieldType.ATTACHMENT &&
+ column.subtype !== oldTable?.schema[column.name]?.subtype
+ )
+ for (const attachmentColumn of changedAttachmentSubtypeColumns) {
+ if (attachmentColumn.subtype === FieldTypeSubtypes.ATTACHMENT.SINGLE) {
+ attachmentColumn.constraints ??= { length: {} }
+ attachmentColumn.constraints.length ??= {}
+ attachmentColumn.constraints.length.maximum = 1
+ attachmentColumn.constraints.length.message =
+ "cannot contain multiple files"
+ } else {
+ delete attachmentColumn.constraints?.length?.maximum
+ delete attachmentColumn.constraints?.length?.message
+ }
+ }
+
return { rows: updatedRows, table: updatedTable }
}
diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts
index 0fe8beb7ea..8910522565 100644
--- a/packages/server/src/api/routes/tests/row.spec.ts
+++ b/packages/server/src/api/routes/tests/row.spec.ts
@@ -234,7 +234,7 @@ describe.each([
constraints: { type: "string", presence: false },
}
const attachment: FieldSchema = {
- type: FieldType.ATTACHMENTS,
+ type: FieldType.ATTACHMENT,
name: "attachment",
constraints: { type: "array", presence: false },
}
@@ -790,7 +790,7 @@ describe.each([
defaultTable({
schema: {
attachment: {
- type: FieldType.ATTACHMENTS,
+ type: FieldType.ATTACHMENT,
name: "attachment",
constraints: { type: "array", presence: false },
},
diff --git a/packages/server/src/db/defaultData/datasource_bb_default.ts b/packages/server/src/db/defaultData/datasource_bb_default.ts
index 68d49b2d8b..03aed3c118 100644
--- a/packages/server/src/db/defaultData/datasource_bb_default.ts
+++ b/packages/server/src/db/defaultData/datasource_bb_default.ts
@@ -299,7 +299,7 @@ export const DEFAULT_EMPLOYEE_TABLE_SCHEMA: Table = {
sortable: false,
},
"Badge Photo": {
- type: FieldType.ATTACHMENTS,
+ type: FieldType.ATTACHMENT,
constraints: {
type: FieldType.ARRAY,
presence: false,
@@ -607,7 +607,7 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
Attachment: {
- type: FieldType.ATTACHMENTS,
+ type: FieldType.ATTACHMENT,
constraints: {
type: FieldType.ARRAY,
presence: false,
diff --git a/packages/server/src/sdk/app/rows/attachments.ts b/packages/server/src/sdk/app/rows/attachments.ts
index 8fd2ccf795..2ab9e83c47 100644
--- a/packages/server/src/sdk/app/rows/attachments.ts
+++ b/packages/server/src/sdk/app/rows/attachments.ts
@@ -30,7 +30,7 @@ export async function getRowsWithAttachments(appId: string, table: Table) {
const db = dbCore.getDB(appId)
const attachmentCols: string[] = []
for (let [key, column] of Object.entries(table.schema)) {
- if (column.type === FieldType.ATTACHMENTS) {
+ if (column.type === FieldType.ATTACHMENT) {
attachmentCols.push(key)
}
}
diff --git a/packages/server/src/sdk/app/rows/utils.ts b/packages/server/src/sdk/app/rows/utils.ts
index e1a0fbb5c4..8aa017d238 100644
--- a/packages/server/src/sdk/app/rows/utils.ts
+++ b/packages/server/src/sdk/app/rows/utils.ts
@@ -175,13 +175,13 @@ export async function validate({
errors[fieldName] = [`${fieldName} is required`]
}
} else if (
- (type === FieldType.ATTACHMENTS || type === FieldType.JSON) &&
+ (type === FieldType.ATTACHMENT || type === FieldType.JSON) &&
typeof row[fieldName] === "string"
) {
// this should only happen if there is an error
try {
const json = JSON.parse(row[fieldName])
- if (type === FieldType.ATTACHMENTS) {
+ if (type === FieldType.ATTACHMENT) {
if (Array.isArray(json)) {
row[fieldName] = json
} else {
diff --git a/packages/server/src/utilities/rowProcessor/attachments.ts b/packages/server/src/utilities/rowProcessor/attachments.ts
index 652851a48b..e1c83352d4 100644
--- a/packages/server/src/utilities/rowProcessor/attachments.ts
+++ b/packages/server/src/utilities/rowProcessor/attachments.ts
@@ -34,7 +34,7 @@ export class AttachmentCleanup {
let files: string[] = []
const tableSchema = opts.oldTable?.schema || table.schema
for (let [key, schema] of Object.entries(tableSchema)) {
- if (schema.type !== FieldType.ATTACHMENTS) {
+ if (schema.type !== FieldType.ATTACHMENT) {
continue
}
const columnRemoved = opts.oldTable && !table.schema[key]
@@ -68,7 +68,7 @@ export class AttachmentCleanup {
return AttachmentCleanup.coreCleanup(() => {
let files: string[] = []
for (let [key, schema] of Object.entries(table.schema)) {
- if (schema.type !== FieldType.ATTACHMENTS) {
+ if (schema.type !== FieldType.ATTACHMENT) {
continue
}
rows.forEach(row => {
@@ -88,7 +88,7 @@ export class AttachmentCleanup {
return AttachmentCleanup.coreCleanup(() => {
let files: string[] = []
for (let [key, schema] of Object.entries(table.schema)) {
- if (schema.type !== FieldType.ATTACHMENTS) {
+ if (schema.type !== FieldType.ATTACHMENT) {
continue
}
const oldKeys =
diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts
index c421929888..0015680e77 100644
--- a/packages/server/src/utilities/rowProcessor/index.ts
+++ b/packages/server/src/utilities/rowProcessor/index.ts
@@ -148,7 +148,7 @@ export async function inputProcessing(
}
// remove any attachment urls, they are generated on read
- if (field.type === FieldType.ATTACHMENTS) {
+ if (field.type === FieldType.ATTACHMENT) {
const attachments = clonedRow[key]
if (attachments?.length) {
attachments.forEach((attachment: RowAttachment) => {
@@ -216,7 +216,7 @@ export async function outputProcessing(
// process complex types: attachements, bb references...
for (let [property, column] of Object.entries(table.schema)) {
- if (column.type === FieldType.ATTACHMENTS) {
+ if (column.type === FieldType.ATTACHMENT) {
for (let row of enriched) {
if (row[property] == null || !Array.isArray(row[property])) {
continue
diff --git a/packages/server/src/utilities/rowProcessor/map.ts b/packages/server/src/utilities/rowProcessor/map.ts
index 2e0ac9efe1..60fe5a001b 100644
--- a/packages/server/src/utilities/rowProcessor/map.ts
+++ b/packages/server/src/utilities/rowProcessor/map.ts
@@ -106,7 +106,7 @@ export const TYPE_TRANSFORM_MAP: any = {
return date
},
},
- [FieldType.ATTACHMENTS]: {
+ [FieldType.ATTACHMENT]: {
//@ts-ignore
[null]: [],
//@ts-ignore
diff --git a/packages/server/src/utilities/rowProcessor/tests/attachments.spec.ts b/packages/server/src/utilities/rowProcessor/tests/attachments.spec.ts
index 1b36a4cb81..cefea7e504 100644
--- a/packages/server/src/utilities/rowProcessor/tests/attachments.spec.ts
+++ b/packages/server/src/utilities/rowProcessor/tests/attachments.spec.ts
@@ -34,7 +34,7 @@ function table(): Table {
schema: {
attach: {
name: "attach",
- type: FieldType.ATTACHMENTS,
+ type: FieldType.ATTACHMENT,
constraints: {},
},
},
diff --git a/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts b/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
index 93404e0469..a17bd5f393 100644
--- a/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
+++ b/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
@@ -82,7 +82,7 @@ describe("rowProcessor - outputProcessing", () => {
sourceType: TableSourceType.INTERNAL,
schema: {
attach: {
- type: FieldType.ATTACHMENTS,
+ type: FieldType.ATTACHMENT,
name: "attach",
constraints: {},
},
diff --git a/packages/shared-core/src/table.ts b/packages/shared-core/src/table.ts
index 26a7e77cd0..5eab2fc340 100644
--- a/packages/shared-core/src/table.ts
+++ b/packages/shared-core/src/table.ts
@@ -11,10 +11,10 @@ const allowDisplayColumnByType: Record = {
[FieldType.INTERNAL]: true,
[FieldType.BARCODEQR]: true,
[FieldType.BIGINT]: true,
+
[FieldType.BOOLEAN]: false,
[FieldType.ARRAY]: false,
- [FieldType.ATTACHMENTS]: false,
- [FieldType.ATTACHMENT_SINGLE]: false,
+ [FieldType.ATTACHMENT]: false,
[FieldType.LINK]: false,
[FieldType.JSON]: false,
[FieldType.BB_REFERENCE]: false,
@@ -34,8 +34,7 @@ const allowSortColumnByType: Record = {
[FieldType.JSON]: true,
[FieldType.FORMULA]: false,
- [FieldType.ATTACHMENTS]: false,
- [FieldType.ATTACHMENT_SINGLE]: false,
+ [FieldType.ATTACHMENT]: false,
[FieldType.ARRAY]: false,
[FieldType.LINK]: false,
[FieldType.BB_REFERENCE]: false,
diff --git a/packages/types/src/documents/app/row.ts b/packages/types/src/documents/app/row.ts
index 222c346591..aa8f50d4a8 100644
--- a/packages/types/src/documents/app/row.ts
+++ b/packages/types/src/documents/app/row.ts
@@ -8,8 +8,7 @@ export enum FieldType {
BOOLEAN = "boolean",
ARRAY = "array",
DATETIME = "datetime",
- ATTACHMENTS = "attachment",
- ATTACHMENT_SINGLE = "attachment_single",
+ ATTACHMENT = "attachment",
LINK = "link",
FORMULA = "formula",
AUTO = "auto",
@@ -39,6 +38,7 @@ export interface Row extends Document {
export enum FieldSubtype {
USER = "user",
USERS = "users",
+ SINGLE = "single",
}
// The 'as' are required for typescript not to type the outputs as generic FieldSubtype
@@ -47,4 +47,7 @@ export const FieldTypeSubtypes = {
USER: FieldSubtype.USER as FieldSubtype.USER,
USERS: FieldSubtype.USERS as FieldSubtype.USERS,
},
+ ATTACHMENT: {
+ SINGLE: FieldSubtype.SINGLE as FieldSubtype.SINGLE,
+ },
}
diff --git a/packages/types/src/documents/app/table/schema.ts b/packages/types/src/documents/app/table/schema.ts
index 86c34b6a5c..45e39268ac 100644
--- a/packages/types/src/documents/app/table/schema.ts
+++ b/packages/types/src/documents/app/table/schema.ts
@@ -112,8 +112,10 @@ export interface BBReferenceFieldMetadata
relationshipType?: RelationshipType
}
-export interface AttachmentFieldMetadata extends BaseFieldSchema {
- type: FieldType.ATTACHMENTS
+export interface AttachmentFieldMetadata
+ extends Omit {
+ type: FieldType.ATTACHMENT
+ subtype?: FieldSubtype.SINGLE
}
export interface FieldConstraints {
@@ -162,7 +164,7 @@ interface OtherFieldMetadata extends BaseFieldSchema {
| FieldType.NUMBER
| FieldType.LONGFORM
| FieldType.BB_REFERENCE
- | FieldType.ATTACHMENTS
+ | FieldType.ATTACHMENT
>
}
@@ -215,5 +217,5 @@ export function isBBReferenceField(
export function isAttachmentField(
field: FieldSchema
): field is AttachmentFieldMetadata {
- return field.type === FieldType.ATTACHMENTS
+ return field.type === FieldType.ATTACHMENT
}