From 191cab433022a4502700674d8382336e34015ddd Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 27 Aug 2025 09:42:51 +0530 Subject: [PATCH 1/3] fix: bulk delete. --- .../table-[table]/columns/+page.svelte | 2 +- .../table-[table]/spreadsheet.svelte | 48 +++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index 602b79a70..643e77376 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -58,7 +58,7 @@ key: '$id', type: 'string', required: true, - name: 'ID', + name: '$id', selectable: false, system: true } as Models.ColumnString & { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index b68b3138c..db37f5919 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -346,22 +346,40 @@ }); } else { if (selectedRows.length) { - const batches: string[][] = []; - for (let i = 0; i < selectedRows.length; i += 100) { - batches.push(selectedRows.slice(i, i + 100)); - } - - await Promise.all( - batches.map((batch) => - sdk - .forProject(page.params.region, page.params.project) - .tablesDB.deleteRows({ - databaseId, - tableId, - queries: [Query.equal('$id', batch)] - }) - ) + const hasAnyRelationships = $table.columns.some((column) => + isRelationship(column) ); + + if (hasAnyRelationships) { + await Promise.all( + selectedRows.map((rowId) => + sdk + .forProject(page.params.region, page.params.project) + .tablesDB.deleteRow({ + databaseId, + tableId, + rowId + }) + ) + ); + } else { + const batches: string[][] = []; + for (let i = 0; i < selectedRows.length; i += 100) { + batches.push(selectedRows.slice(i, i + 100)); + } + + await Promise.all( + batches.map((batch) => + sdk + .forProject(page.params.region, page.params.project) + .tablesDB.deleteRows({ + databaseId, + tableId, + queries: [Query.equal('$id', batch)] + }) + ) + ); + } } } From 8503b089bdbfa75b7dcf8211f2086903ecd95c19 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 27 Aug 2025 09:47:08 +0530 Subject: [PATCH 2/3] fix: sample data on columns with relationships. --- .../table-[table]/+layout.svelte | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index 286525fc2..8d5c4bdf9 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -60,6 +60,7 @@ import CreateIndex from './indexes/createIndex.svelte'; import { hash } from '$lib/helpers/string'; import { preferences } from '$lib/stores/preferences'; + import { isRelationship } from './rows/store'; let editRow: EditRow; let editRelatedRow: EditRelatedRow; @@ -249,6 +250,8 @@ $randomDataModalState.show = false; let columns = $table.columns; + const hasAnyRelationships = columns.some((column) => isRelationship(column)); + if (!columns.length) { try { columns = await generateColumns($project, page.params.database, page.params.table); @@ -273,11 +276,24 @@ rowIds = ids; - await sdk.forProject(page.params.region, page.params.project).tablesDB.createRows({ - databaseId: page.params.database, - tableId: page.params.table, - rows - }); + if (hasAnyRelationships) { + await Promise.all( + rows.map((row) => + sdk.forProject(page.params.region, page.params.project).tablesDB.createRow({ + databaseId: page.params.database, + tableId: page.params.table, + rowId: row.$id, + data: row + }) + ) + ); + } else { + await sdk.forProject(page.params.region, page.params.project).tablesDB.createRows({ + databaseId: page.params.database, + tableId: page.params.table, + rows + }); + } addNotification({ type: 'success', From 47088b58d90d9ceb80245287b401cba8191a0751 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 27 Aug 2025 10:09:09 +0530 Subject: [PATCH 3/3] fix: batch reqs. --- src/lib/helpers/array.ts | 8 ++ .../table-[table]/+layout.svelte | 30 +++++--- .../table-[table]/spreadsheet.svelte | 75 +++++++++++-------- 3 files changed, 72 insertions(+), 41 deletions(-) diff --git a/src/lib/helpers/array.ts b/src/lib/helpers/array.ts index cecf9a9bd..afeffdec9 100644 --- a/src/lib/helpers/array.ts +++ b/src/lib/helpers/array.ts @@ -102,3 +102,11 @@ export function total(set: Array): number { if (!set) return 0; return set.reduce((prev, curr) => prev + curr, 0); } + +export function chunks(array: T[], size: number = 10): T[][] { + const output: T[][] = []; + for (let i = 0; i < array.length; i += size) { + output.push(array.slice(i, i + size)); + } + return output; +} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index 8d5c4bdf9..b73f1f239 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -61,6 +61,7 @@ import { hash } from '$lib/helpers/string'; import { preferences } from '$lib/stores/preferences'; import { isRelationship } from './rows/store'; + import { chunks } from '$lib/helpers/array'; let editRow: EditRow; let editRelatedRow: EditRelatedRow; @@ -275,20 +276,27 @@ const { rows, ids } = generateFakeRecords(columns, $randomDataModalState.value); rowIds = ids; + const tablesSDK = sdk.forProject(page.params.region, page.params.project).tablesDB; if (hasAnyRelationships) { - await Promise.all( - rows.map((row) => - sdk.forProject(page.params.region, page.params.project).tablesDB.createRow({ - databaseId: page.params.database, - tableId: page.params.table, - rowId: row.$id, - data: row - }) - ) - ); + for (const batch of chunks(rows)) { + try { + await Promise.all( + batch.map((row) => + tablesSDK.createRow({ + databaseId: page.params.database, + tableId: page.params.table, + rowId: row.$id, + data: row + }) + ) + ); + } catch (error) { + // ignore, its sample data. + } + } } else { - await sdk.forProject(page.params.region, page.params.project).tablesDB.createRows({ + await tablesSDK.createRows({ databaseId: page.params.database, tableId: page.params.table, rows diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index db37f5919..c8e6c45ee 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -80,6 +80,7 @@ import { debounce } from '$lib/helpers/debounce'; import { hash } from '$lib/helpers/string'; import { abbreviateNumber } from '$lib/helpers/numbers'; + import { chunks } from '$lib/helpers/array'; export let data: PageData; export let showRowCreateSheet: { @@ -337,6 +338,8 @@ async function handleDelete() { showDelete = false; + let hadErrors = false; + try { if (selectedRowForDelete) { await sdk.forProject(page.params.region, page.params.project).tablesDB.deleteRow({ @@ -350,45 +353,57 @@ isRelationship(column) ); + const tablesSDK = sdk.forProject( + page.params.region, + page.params.project + ).tablesDB; + if (hasAnyRelationships) { - await Promise.all( - selectedRows.map((rowId) => - sdk - .forProject(page.params.region, page.params.project) - .tablesDB.deleteRow({ - databaseId, - tableId, - rowId - }) - ) - ); - } else { - const batches: string[][] = []; - for (let i = 0; i < selectedRows.length; i += 100) { - batches.push(selectedRows.slice(i, i + 100)); + for (const batch of chunks(selectedRows)) { + try { + await Promise.all( + batch.map((rowId) => + tablesSDK.deleteRow({ + databaseId, + tableId, + rowId + }) + ) + ); + } catch (e) { + hadErrors = true; + // ignore but keep proceeding! + } } - await Promise.all( - batches.map((batch) => - sdk - .forProject(page.params.region, page.params.project) - .tablesDB.deleteRows({ - databaseId, - tableId, - queries: [Query.equal('$id', batch)] - }) - ) - ); + if (hadErrors) { + addNotification({ + type: 'error', + message: 'Some rows could not be deleted' + }); + } + } else { + for (const batch of chunks(selectedRows, 100)) { + await tablesSDK.deleteRows({ + databaseId, + tableId, + queries: [Query.equal('$id', batch)] + }); + } } } } await invalidate(Dependencies.ROWS); trackEvent(Submit.RowDelete); - addNotification({ - type: 'success', - message: `${selectedRows.length ? selectedRows.length : 1} row${selectedRows.length > 1 ? 's' : ''} deleted` - }); + + if (!hadErrors) { + // error is already shown above! + addNotification({ + type: 'success', + message: `${selectedRows.length ? selectedRows.length : 1} row${selectedRows.length > 1 ? 's' : ''} deleted` + }); + } spreadsheetRenderKey.set( hash([