diff --git a/packages/bbui/src/Form/Core/Dropzone.svelte b/packages/bbui/src/Form/Core/Dropzone.svelte
index 3d803c0961..dd72167791 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 < maximum)) && !disabled
+ (!maximum || (maximum && (value?.length || 0) < 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 e3da4249bc..b339729391 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.ATTACHMENT,
+ FieldType.ATTACHMENTS,
//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 cfc6e9a7be..92501bec3b 100644
--- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
+++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
@@ -394,7 +394,8 @@
FIELDS.BIGINT,
FIELDS.BOOLEAN,
FIELDS.DATETIME,
- FIELDS.ATTACHMENT,
+ FIELDS.ATTACHMENT_SINGLE,
+ FIELDS.ATTACHMENTS,
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 18ebf57d98..d0f9afda40 100644
--- a/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js
+++ b/packages/builder/src/components/design/settings/controls/FieldConfiguration/utils.js
@@ -41,7 +41,8 @@ export const FieldTypeToComponentMap = {
[FieldType.BOOLEAN]: "booleanfield",
[FieldType.LONGFORM]: "longformfield",
[FieldType.DATETIME]: "datetimefield",
- [FieldType.ATTACHMENT]: "attachmentfield",
+ [FieldType.ATTACHMENTS]: "attachmentfield",
+ [FieldType.ATTACHMENT_SINGLE]: "attachmentsinglefield",
[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 dd751d4e13..e3888a52e0 100644
--- a/packages/builder/src/constants/backend/index.js
+++ b/packages/builder/src/constants/backend/index.js
@@ -107,10 +107,18 @@ export const FIELDS = {
},
},
},
- ATTACHMENT: {
+ ATTACHMENT_SINGLE: {
name: "Attachment",
- type: FieldType.ATTACHMENT,
- icon: "Folder",
+ type: FieldType.ATTACHMENT_SINGLE,
+ icon: "Document",
+ constraints: {
+ presence: false,
+ },
+ },
+ ATTACHMENTS: {
+ name: "Attachment List",
+ type: FieldType.ATTACHMENTS,
+ icon: "AppleFiles",
constraints: {
type: "array",
presence: false,
@@ -299,7 +307,7 @@ export const PaginationLocations = [
export const BannedSearchTypes = [
FieldType.LINK,
- FieldType.ATTACHMENT,
+ FieldType.ATTACHMENTS,
FieldType.FORMULA,
FieldType.JSON,
"jsonarray",
diff --git a/packages/builder/tsconfig.json b/packages/builder/tsconfig.json
index be79dfd85c..a7a4c3d800 100644
--- a/packages/builder/tsconfig.json
+++ b/packages/builder/tsconfig.json
@@ -1,9 +1,6 @@
{
"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 08d614391b..cc5c68ea83 100644
--- a/packages/client/manifest.json
+++ b/packages/client/manifest.json
@@ -4226,7 +4226,7 @@
]
},
"attachmentfield": {
- "name": "Attachment",
+ "name": "Attachment list",
"icon": "Attach",
"styles": ["size"],
"requiredAncestors": ["form"],
@@ -4322,6 +4322,103 @@
}
]
},
+ "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 34168355c4..968ed36b8b 100644
--- a/packages/client/src/components/app/blocks/FormBlockComponent.svelte
+++ b/packages/client/src/components/app/blocks/FormBlockComponent.svelte
@@ -15,7 +15,8 @@
[FieldType.BOOLEAN]: "booleanfield",
[FieldType.LONGFORM]: "longformfield",
[FieldType.DATETIME]: "datetimefield",
- [FieldType.ATTACHMENT]: "attachmentfield",
+ [FieldType.ATTACHMENTS]: "attachmentfield",
+ [FieldType.ATTACHMENT_SINGLE]: "attachmentsinglefield",
[FieldType.LINK]: "relationshipfield",
[FieldType.JSON]: "jsonfield",
[FieldType.BARCODEQR]: "codescanner",
@@ -60,7 +61,7 @@
function getPropsByType(field) {
const propsMapByType = {
- [FieldType.ATTACHMENT]: (_field, schema) => {
+ [FieldType.ATTACHMENTS]: (_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 b61f88daeb..8be70bc011 100644
--- a/packages/client/src/components/app/forms/AttachmentField.svelte
+++ b/packages/client/src/components/app/forms/AttachmentField.svelte
@@ -1,6 +1,7 @@
@@ -78,14 +85,14 @@
{validation}
{span}
{helpText}
- type="attachment"
+ {type}
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 5804d3a79d..aa54204454 100644
--- a/packages/client/src/components/app/forms/index.js
+++ b/packages/client/src/components/app/forms/index.js
@@ -9,6 +9,7 @@ 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 3b3a5d6e1d..cdedd85cf2 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.ATTACHMENT) {
+ if (type === FieldTypes.ATTACHMENTS) {
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 a1f5c4f2aa..3a1f165b6e 100644
--- a/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
+++ b/packages/frontend-core/src/components/grid/cells/AttachmentCell.svelte
@@ -10,6 +10,7 @@
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"]
@@ -98,7 +99,7 @@
{value}
compact
on:change={e => onChange(e.detail)}
- maximum={schema.constraints?.length?.maximum}
+ 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
new file mode 100644
index 0000000000..c2e29b6ede
--- /dev/null
+++ b/packages/frontend-core/src/components/grid/cells/AttachmentSingleCell.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/packages/frontend-core/src/components/grid/lib/renderers.js b/packages/frontend-core/src/components/grid/lib/renderers.js
index 19bf63312d..c3ee276ff9 100644
--- a/packages/frontend-core/src/components/grid/lib/renderers.js
+++ b/packages/frontend-core/src/components/grid/lib/renderers.js
@@ -11,6 +11,7 @@ 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 = {
@@ -22,7 +23,8 @@ const TypeComponentMap = {
[FieldType.ARRAY]: MultiSelectCell,
[FieldType.NUMBER]: NumberCell,
[FieldType.BOOLEAN]: BooleanCell,
- [FieldType.ATTACHMENT]: AttachmentCell,
+ [FieldType.ATTACHMENTS]: AttachmentCell,
+ [FieldType.ATTACHMENT_SINGLE]: AttachmentSingleCell,
[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 8382bfece8..49d6b0a439 100644
--- a/packages/frontend-core/src/components/grid/lib/utils.js
+++ b/packages/frontend-core/src/components/grid/lib/utils.js
@@ -16,7 +16,8 @@ const TypeIconMap = {
[FieldType.ARRAY]: "Dropdown",
[FieldType.NUMBER]: "123",
[FieldType.BOOLEAN]: "Boolean",
- [FieldType.ATTACHMENT]: "AppleFiles",
+ [FieldType.ATTACHMENTS]: "AppleFiles",
+ [FieldType.ATTACHMENT_SINGLE]: "Document",
[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 0c9933a4cf..5649a1d996 100644
--- a/packages/server/src/api/controllers/table/utils.ts
+++ b/packages/server/src/api/controllers/table/utils.ts
@@ -30,8 +30,6 @@ import {
View,
RelationshipFieldMetadata,
FieldType,
- FieldTypeSubtypes,
- AttachmentFieldMetadata,
} from "@budibase/types"
export async function clearColumns(table: Table, columnNames: string[]) {
@@ -91,26 +89,6 @@ 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 8910522565..0fe8beb7ea 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.ATTACHMENT,
+ type: FieldType.ATTACHMENTS,
name: "attachment",
constraints: { type: "array", presence: false },
}
@@ -790,7 +790,7 @@ describe.each([
defaultTable({
schema: {
attachment: {
- type: FieldType.ATTACHMENT,
+ type: FieldType.ATTACHMENTS,
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 03aed3c118..68d49b2d8b 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.ATTACHMENT,
+ type: FieldType.ATTACHMENTS,
constraints: {
type: FieldType.ARRAY,
presence: false,
@@ -607,7 +607,7 @@ export const DEFAULT_EXPENSES_TABLE_SCHEMA: Table = {
ignoreTimezones: true,
},
Attachment: {
- type: FieldType.ATTACHMENT,
+ type: FieldType.ATTACHMENTS,
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 2ab9e83c47..8fd2ccf795 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.ATTACHMENT) {
+ if (column.type === FieldType.ATTACHMENTS) {
attachmentCols.push(key)
}
}
diff --git a/packages/server/src/sdk/app/rows/utils.ts b/packages/server/src/sdk/app/rows/utils.ts
index 8aa017d238..e1a0fbb5c4 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.ATTACHMENT || type === FieldType.JSON) &&
+ (type === FieldType.ATTACHMENTS || 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.ATTACHMENT) {
+ if (type === FieldType.ATTACHMENTS) {
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 e1c83352d4..652851a48b 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.ATTACHMENT) {
+ if (schema.type !== FieldType.ATTACHMENTS) {
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.ATTACHMENT) {
+ if (schema.type !== FieldType.ATTACHMENTS) {
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.ATTACHMENT) {
+ if (schema.type !== FieldType.ATTACHMENTS) {
continue
}
const oldKeys =
diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts
index 0015680e77..c421929888 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.ATTACHMENT) {
+ if (field.type === FieldType.ATTACHMENTS) {
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.ATTACHMENT) {
+ if (column.type === FieldType.ATTACHMENTS) {
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 60fe5a001b..2e0ac9efe1 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.ATTACHMENT]: {
+ [FieldType.ATTACHMENTS]: {
//@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 cefea7e504..1b36a4cb81 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.ATTACHMENT,
+ type: FieldType.ATTACHMENTS,
constraints: {},
},
},
diff --git a/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts b/packages/server/src/utilities/rowProcessor/tests/outputProcessing.spec.ts
index a17bd5f393..93404e0469 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.ATTACHMENT,
+ type: FieldType.ATTACHMENTS,
name: "attach",
constraints: {},
},
diff --git a/packages/shared-core/src/table.ts b/packages/shared-core/src/table.ts
index 5eab2fc340..26a7e77cd0 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.ATTACHMENT]: false,
+ [FieldType.ATTACHMENTS]: false,
+ [FieldType.ATTACHMENT_SINGLE]: false,
[FieldType.LINK]: false,
[FieldType.JSON]: false,
[FieldType.BB_REFERENCE]: false,
@@ -34,7 +34,8 @@ const allowSortColumnByType: Record = {
[FieldType.JSON]: true,
[FieldType.FORMULA]: false,
- [FieldType.ATTACHMENT]: false,
+ [FieldType.ATTACHMENTS]: false,
+ [FieldType.ATTACHMENT_SINGLE]: 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 aa8f50d4a8..222c346591 100644
--- a/packages/types/src/documents/app/row.ts
+++ b/packages/types/src/documents/app/row.ts
@@ -8,7 +8,8 @@ export enum FieldType {
BOOLEAN = "boolean",
ARRAY = "array",
DATETIME = "datetime",
- ATTACHMENT = "attachment",
+ ATTACHMENTS = "attachment",
+ ATTACHMENT_SINGLE = "attachment_single",
LINK = "link",
FORMULA = "formula",
AUTO = "auto",
@@ -38,7 +39,6 @@ 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,7 +47,4 @@ 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 45e39268ac..86c34b6a5c 100644
--- a/packages/types/src/documents/app/table/schema.ts
+++ b/packages/types/src/documents/app/table/schema.ts
@@ -112,10 +112,8 @@ export interface BBReferenceFieldMetadata
relationshipType?: RelationshipType
}
-export interface AttachmentFieldMetadata
- extends Omit {
- type: FieldType.ATTACHMENT
- subtype?: FieldSubtype.SINGLE
+export interface AttachmentFieldMetadata extends BaseFieldSchema {
+ type: FieldType.ATTACHMENTS
}
export interface FieldConstraints {
@@ -164,7 +162,7 @@ interface OtherFieldMetadata extends BaseFieldSchema {
| FieldType.NUMBER
| FieldType.LONGFORM
| FieldType.BB_REFERENCE
- | FieldType.ATTACHMENT
+ | FieldType.ATTACHMENTS
>
}
@@ -217,5 +215,5 @@ export function isBBReferenceField(
export function isAttachmentField(
field: FieldSchema
): field is AttachmentFieldMetadata {
- return field.type === FieldType.ATTACHMENT
+ return field.type === FieldType.ATTACHMENTS
}