From 1cfe4da0278f7784d7a65eee3a77c3ab0c746eeb Mon Sep 17 00:00:00 2001 From: Michael Drury Date: Wed, 3 Apr 2024 16:01:45 +0100 Subject: [PATCH] Revert "Single attachment column type" --- packages/bbui/src/Form/Core/Dropzone.svelte | 2 +- .../components/backend/DataTable/formula.js | 2 +- .../DataTable/modals/CreateEditColumn.svelte | 3 +- .../controls/FieldConfiguration/utils.js | 3 +- .../builder/src/constants/backend/index.js | 16 +-- packages/builder/tsconfig.json | 3 + packages/client/manifest.json | 99 +------------------ .../app/blocks/FormBlockComponent.svelte | 5 +- .../app/forms/AttachmentField.svelte | 15 +-- .../app/forms/AttachmentSingleField.svelte | 16 --- .../client/src/components/app/forms/index.js | 1 - .../src/components/app/forms/validation.js | 2 +- .../grid/cells/AttachmentCell.svelte | 3 +- .../grid/cells/AttachmentSingleCell.svelte | 20 ---- .../src/components/grid/lib/renderers.js | 4 +- .../src/components/grid/lib/utils.js | 3 +- .../server/src/api/controllers/table/utils.ts | 22 +++++ .../server/src/api/routes/tests/row.spec.ts | 4 +- .../db/defaultData/datasource_bb_default.ts | 4 +- .../server/src/sdk/app/rows/attachments.ts | 2 +- packages/server/src/sdk/app/rows/utils.ts | 4 +- .../src/utilities/rowProcessor/attachments.ts | 6 +- .../src/utilities/rowProcessor/index.ts | 4 +- .../server/src/utilities/rowProcessor/map.ts | 2 +- .../rowProcessor/tests/attachments.spec.ts | 2 +- .../tests/outputProcessing.spec.ts | 2 +- packages/shared-core/src/table.ts | 7 +- packages/types/src/documents/app/row.ts | 7 +- .../types/src/documents/app/table/schema.ts | 10 +- 29 files changed, 73 insertions(+), 200 deletions(-) delete mode 100644 packages/client/src/components/app/forms/AttachmentSingleField.svelte delete mode 100644 packages/frontend-core/src/components/grid/cells/AttachmentSingleCell.svelte 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 }