From 48ecb19af73ee81077fa09f8039fd325fb13640e Mon Sep 17 00:00:00 2001 From: Lakee Sivaraya Date: Tue, 13 Jan 2026 18:07:26 -0800 Subject: [PATCH] updates --- apps/sim/app/api/table/[tableId]/route.ts | 19 ++++++--------- .../[tableId]/components/add-row-modal.tsx | 11 ++++----- .../[tableId]/components/edit-row-modal.tsx | 8 +++---- .../tables/[tableId]/table-data-viewer.tsx | 10 ++++---- .../tables/components/create-table-modal.tsx | 23 +++++++++---------- .../tables/components/table-card.tsx | 8 +++---- apps/sim/lib/table/validation.ts | 6 ++--- apps/sim/tools/table/types.ts | 2 +- 8 files changed, 40 insertions(+), 47 deletions(-) diff --git a/apps/sim/app/api/table/[tableId]/route.ts b/apps/sim/app/api/table/[tableId]/route.ts index 58eed19a1..df31b1175 100644 --- a/apps/sim/app/api/table/[tableId]/route.ts +++ b/apps/sim/app/api/table/[tableId]/route.ts @@ -135,7 +135,7 @@ export async function GET( /** * DELETE /api/table/[tableId]?workspaceId=xxx - * Delete a table (soft delete) + * Delete a table (hard delete) */ export async function DELETE( request: NextRequest, @@ -165,18 +165,16 @@ export async function DELETE( return NextResponse.json({ error: 'Access denied' }, { status: 403 }) } - // Soft delete table + // Delete all rows first + await db.delete(userTableRows).where(eq(userTableRows.tableId, tableId)) + + // Hard delete table const [deletedTable] = await db - .update(userTableDefinitions) - .set({ - deletedAt: new Date(), - updatedAt: new Date(), - }) + .delete(userTableDefinitions) .where( and( eq(userTableDefinitions.id, tableId), - eq(userTableDefinitions.workspaceId, validated.workspaceId), - isNull(userTableDefinitions.deletedAt) + eq(userTableDefinitions.workspaceId, validated.workspaceId) ) ) .returning() @@ -185,9 +183,6 @@ export async function DELETE( return NextResponse.json({ error: 'Table not found' }, { status: 404 }) } - // Delete all rows - await db.delete(userTableRows).where(eq(userTableRows.tableId, tableId)) - logger.info(`[${requestId}] Deleted table ${tableId}`) return NextResponse.json({ diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/add-row-modal.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/add-row-modal.tsx index 5f137f0ba..10dd44c52 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/add-row-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/add-row-modal.tsx @@ -61,8 +61,7 @@ export function AddRowModal({ isOpen, onClose, table, onSuccess }: AddRowModalPr const cleanData: Record = {} columns.forEach((col) => { const value = rowData[col.name] - const isRequired = !col.optional - if (isRequired || (value !== '' && value !== null && value !== undefined)) { + if (col.required || (value !== '' && value !== null && value !== undefined)) { if (col.type === 'number') { cleanData[col.name] = value === '' ? null : Number(value) } else if (col.type === 'json') { @@ -132,7 +131,7 @@ export function AddRowModal({ isOpen, onClose, table, onSuccess }: AddRowModalPr
))} diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/edit-row-modal.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/edit-row-modal.tsx index f66bdc916..7755ebd30 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/edit-row-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/edit-row-modal.tsx @@ -142,7 +142,7 @@ export function EditRowModal({ isOpen, onClose, table, row, onSuccess }: EditRow
))} diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table-data-viewer.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table-data-viewer.tsx index ee96c4fb8..5f8cae95f 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table-data-viewer.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table-data-viewer.tsx @@ -435,7 +435,7 @@ export function TableDataViewer() { {column.type} - {!column.optional && ( + {column.required && ( * )} @@ -675,9 +675,9 @@ export function TableDataViewer() {
- {column.optional && ( - - optional + {column.required && ( + + required )} {column.unique && ( @@ -685,7 +685,7 @@ export function TableDataViewer() { unique )} - {!column.optional && !column.unique && ( + {!column.required && !column.unique && ( )}
diff --git a/apps/sim/app/workspace/[workspaceId]/tables/components/create-table-modal.tsx b/apps/sim/app/workspace/[workspaceId]/tables/components/create-table-modal.tsx index 866866a94..b1154cb07 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/components/create-table-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/components/create-table-modal.tsx @@ -24,7 +24,7 @@ const logger = createLogger('CreateTableModal') interface ColumnDefinition { name: string type: 'string' | 'number' | 'boolean' | 'date' | 'json' - optional: boolean + required: boolean unique: boolean } @@ -48,14 +48,14 @@ export function CreateTableModal({ isOpen, onClose }: CreateTableModalProps) { const [tableName, setTableName] = useState('') const [description, setDescription] = useState('') const [columns, setColumns] = useState([ - { name: '', type: 'string', optional: false, unique: false }, + { name: '', type: 'string', required: true, unique: false }, ]) const [error, setError] = useState(null) const createTable = useCreateTable(workspaceId) const handleAddColumn = () => { - setColumns([...columns, { name: '', type: 'string', optional: false, unique: false }]) + setColumns([...columns, { name: '', type: 'string', required: true, unique: false }]) } const handleRemoveColumn = (index: number) => { @@ -110,7 +110,7 @@ export function CreateTableModal({ isOpen, onClose }: CreateTableModalProps) { // Reset form setTableName('') setDescription('') - setColumns([{ name: '', type: 'string', optional: false, unique: false }]) + setColumns([{ name: '', type: 'string', required: true, unique: false }]) setError(null) onClose() } catch (err) { @@ -123,7 +123,7 @@ export function CreateTableModal({ isOpen, onClose }: CreateTableModalProps) { // Reset form on close setTableName('') setDescription('') - setColumns([{ name: '', type: 'string', optional: false, unique: false }]) + setColumns([{ name: '', type: 'string', required: true, unique: false }]) setError(null) onClose() } @@ -202,7 +202,7 @@ export function CreateTableModal({ isOpen, onClose }: CreateTableModalProps) {
Column Name
Type
-
Optional
+
Required
Unique
@@ -239,12 +239,12 @@ export function CreateTableModal({ isOpen, onClose }: CreateTableModalProps) { />
- {/* Optional Checkbox */} + {/* Required Checkbox */}
- handleColumnChange(index, 'optional', checked === true) + handleColumnChange(index, 'required', checked === true) } />
@@ -277,9 +277,8 @@ export function CreateTableModal({ isOpen, onClose }: CreateTableModalProps) {

- Columns are required by default. Check{' '} - optional for nullable fields, or{' '} - unique to prevent duplicates. + Mark columns as unique to prevent duplicate + values (e.g., id, email)

diff --git a/apps/sim/app/workspace/[workspaceId]/tables/components/table-card.tsx b/apps/sim/app/workspace/[workspaceId]/tables/components/table-card.tsx index b7630e2e4..746164520 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/components/table-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/components/table-card.tsx @@ -256,9 +256,9 @@ export function TableCard({ table, workspaceId }: TableCardProps) {
- {column.optional && ( - - optional + {column.required && ( + + required )} {column.unique && ( @@ -266,7 +266,7 @@ export function TableCard({ table, workspaceId }: TableCardProps) { unique )} - {!column.optional && !column.unique && ( + {!column.required && !column.unique && ( )}
diff --git a/apps/sim/lib/table/validation.ts b/apps/sim/lib/table/validation.ts index 1d0f862e0..bef7f41f4 100644 --- a/apps/sim/lib/table/validation.ts +++ b/apps/sim/lib/table/validation.ts @@ -4,7 +4,7 @@ import { COLUMN_TYPES, NAME_PATTERN, TABLE_LIMITS } from './constants' export interface ColumnDefinition { name: string type: ColumnType - optional?: boolean + required?: boolean unique?: boolean } @@ -150,8 +150,8 @@ export function validateRowAgainstSchema( for (const column of schema.columns) { const value = data[column.name] - // Check required fields (columns are required by default unless marked optional) - if (!column.optional && (value === undefined || value === null)) { + // Check required fields + if (column.required && (value === undefined || value === null)) { errors.push(`Missing required field: ${column.name}`) continue } diff --git a/apps/sim/tools/table/types.ts b/apps/sim/tools/table/types.ts index 3e5bd9f48..388a33bae 100644 --- a/apps/sim/tools/table/types.ts +++ b/apps/sim/tools/table/types.ts @@ -22,7 +22,7 @@ export type ColumnType = 'string' | 'number' | 'boolean' | 'date' | 'json' export interface ColumnDefinition { name: string type: ColumnType - optional?: boolean + required?: boolean unique?: boolean }