diff --git a/bun.lock b/bun.lock index 49d8619dac..eff43b53ba 100644 --- a/bun.lock +++ b/bun.lock @@ -1,11 +1,12 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@ef672a3", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -24,7 +25,6 @@ "deep-equal": "^2.2.3", "echarts": "^5.6.0", "flatted": "^3.4.2", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6", "ignore": "^6.0.2", "nanoid": "^5.1.7", "nanotar": "^0.3.0", @@ -113,15 +113,15 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@ef672a3", { "dependencies": { "json-bigint": "1.0.0" } }, "sha512-p56fUkb4Vj+MeTJAiVayKr6/qH6kYpsDbqNqb8YiVhu9x+aInxH8Vo44iDiYg/KYlTAgwFSOXLrq2ZEPaVrXIw=="], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], - "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-icons-svelte": ["@appwrite.io/pink-icons-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", { "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-2HYl/CC2OlfZIR7LzbLXuSPBn0iNkjbnxpaeGCkZ7UNZ/hFeSeeWjDJqTBMdZ8+X95uuZqHx62XPTiE/svuSXQ=="], "@appwrite.io/pink-legacy": ["@appwrite.io/pink-legacy@1.0.3", "", { "dependencies": { "@appwrite.io/pink-icons": "1.0.0", "the-new-css-reset": "^1.11.2" } }, "sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ=="], - "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }], + "@appwrite.io/pink-svelte": ["@appwrite.io/pink-svelte@https://pkg.vc/-/@appwrite/@appwrite.io/pink-svelte@8dcaa17", { "dependencies": { "@appwrite.io/pink-icons-svelte": "2.0.0-RC.1", "@floating-ui/dom": "^1.6.13", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.86.6", "@tanstack/svelte-virtual": "^3.13.10", "ansicolor": "^2.0.3", "d3": "^7.9.0", "fuse.js": "^7.1.0", "pretty-bytes": "^6.1.1", "shiki": "^1.18.0", "svelte-motion": "^0.12.2", "svelte-sonner": "^0.3.28" }, "peerDependencies": { "svelte": "^4.0.0" } }, "sha512-rw3zXN7/cUciCnhj0FR8M0H5Db+LYYMaKtPxvOAIMxNTBmStzU8kTw6grqIvdtFu9vybIsjKtIwm9QLHpNDBjA=="], "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="], diff --git a/package.json b/package.json index 74c0c79488..c33ff5ef67 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@ef672a3", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c40bac9d87..c2890878a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -936,42 +936,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -1046,79 +1040,66 @@ packages: resolution: {integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.0': resolution: {integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.0': resolution: {integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.0': resolution: {integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.0': resolution: {integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.0': resolution: {integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.0': resolution: {integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.0': resolution: {integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.0': resolution: {integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.0': resolution: {integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.0': resolution: {integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.0': resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.0': resolution: {integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.60.0': resolution: {integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==} diff --git a/src/lib/helpers/faker.ts b/src/lib/helpers/faker.ts index cd937ac808..f05b11dc64 100644 --- a/src/lib/helpers/faker.ts +++ b/src/lib/helpers/faker.ts @@ -243,6 +243,10 @@ function generateSingleValue(field: Field): string | number | boolean | NestedNu return faker.number.int({ min, max }); } + case 'bigint': { + return faker.number.bigInt().toString(); + } + case 'double': { const floatAttr = field as Models.ColumnFloat; const min = isWithinSafeRange(floatAttr.min) ? floatAttr.min : 0; diff --git a/src/lib/helpers/types.ts b/src/lib/helpers/types.ts index 07dcd7c85b..544b1ca39a 100644 --- a/src/lib/helpers/types.ts +++ b/src/lib/helpers/types.ts @@ -34,6 +34,7 @@ const columnTypes = [ 'text', 'mediumtext', 'longtext', + 'bigint', 'integer', 'double', 'boolean', 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 d463b9b9ea..16a088f97c 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 @@ -64,7 +64,7 @@ import { addNotification } from '$lib/stores/notifications'; import { hash } from '$lib/helpers/string'; import { preferences } from '$lib/stores/preferences'; - import { buildRowUrl, isRelationship } from './rows/store'; + import { buildRowUrl, isRelationship, buildPayload } from './rows/store'; import { chunks } from '$lib/helpers/array'; import { Submit, trackEvent } from '$lib/actions/analytics'; @@ -346,7 +346,7 @@ databaseId: page.params.database, tableId: page.params.table, rowId: row.$id, - data: row + data: buildPayload(columns, row) }) ) ); @@ -358,7 +358,7 @@ await tablesSDK.createRows({ databaseId: page.params.database, tableId: page.params.table, - rows + rows: rows.map((row) => buildPayload(columns, row)) }); } 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 5b4075bc8a..feb0a4dff0 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 @@ -198,8 +198,15 @@ ) { const stringColumn = column as Models.ColumnString; return { display: `Size: ${stringColumn.size}` }; - } else if (column.type === 'integer' || column.type === 'double') { - const numbersColumn = column as Models.ColumnInteger | Models.ColumnFloat; + } else if ( + column.type === 'bigint' || + column.type === 'integer' || + column.type === 'double' + ) { + const numbersColumn = column as + | Models.ColumnBigint + | Models.ColumnInteger + | Models.ColumnFloat; const { min, max } = numbersColumn; const isMinBigInt = typeof min === 'bigint'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/bigint.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/bigint.svelte new file mode 100644 index 0000000000..57d60dc5e2 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/bigint.svelte @@ -0,0 +1,133 @@ + + + + + + + + + + + + + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts index dc8ee80f86..f648661435 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/store.ts @@ -4,6 +4,7 @@ import Boolean, { submitBoolean, updateBoolean } from './boolean.svelte'; import Email, { submitEmail, updateEmail } from './email.svelte'; import Enum, { submitEnum, updateEnum } from './enum.svelte'; import Float, { submitFloat, updateFloat } from './float.svelte'; +import BigInt, { submitBigInt, updateBigInt } from './bigint.svelte'; import Integer, { submitInteger, updateInteger } from './integer.svelte'; import Ip, { submitIp, updateIp } from './ip.svelte'; import String, { submitString, updateString } from './string.svelte'; @@ -41,6 +42,7 @@ export type Option = { | 'Mediumtext' | 'Longtext' | 'Varchar' + | 'BigInt' | 'Integer' | 'Float' | 'Boolean' @@ -62,6 +64,7 @@ export type Option = { | 'mediumtext' | 'longtext' | 'varchar' + | 'bigint' | 'integer' | 'double' | 'boolean' @@ -125,6 +128,15 @@ export const columnOptions: Option[] = [ update: updateVarchar, icon: IconText }, + { + name: 'BigInt', + sentenceName: 'bigint', + component: BigInt, + type: 'bigint', + create: submitBigInt, + update: updateBigInt, + icon: IconHashtag + }, { name: 'Integer', sentenceName: 'integer', diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte index 9be533a7c1..37947fefe3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/column.svelte @@ -16,7 +16,16 @@ export let label: string; export let array: boolean | undefined = undefined; export let optionalText: string | undefined = undefined; - export let value: string | number | boolean | null | string[]; + export let value: + | string + | number + | bigint + | boolean + | null + | string[] + | number[] + | bigint[] + | boolean[]; export let editing = false; export let limited = false; export let column: @@ -24,6 +33,7 @@ | Models.ColumnEmail | Models.ColumnEnum | Models.ColumnFloat + | Models.ColumnBigint | Models.ColumnInteger | Models.ColumnIp | Models.ColumnString @@ -43,6 +53,7 @@ text: String, mediumtext: String, longtext: String, + bigint: Integer, integer: Integer, double: Integer, boolean: Boolean, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte index fbfa549ae9..ceaee2a963 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/columns/types/string.svelte @@ -24,6 +24,7 @@ | Models.ColumnText | Models.ColumnMediumtext | Models.ColumnLongtext + | Models.ColumnBigint | Models.ColumnInteger | Models.ColumnFloat | Models.ColumnBoolean @@ -51,6 +52,7 @@ if (!trimmed) return null; switch (column.type) { + case 'bigint': case 'integer': { const int = parseInt(trimmed, 10); return isNaN(int) ? null : int; @@ -122,6 +124,7 @@ const getPlaceholder = () => { if (!array) { switch (column.type) { + case 'bigint': case 'integer': return 'Enter integer'; case 'double': @@ -134,6 +137,7 @@ } } else { switch (column.type) { + case 'bigint': case 'integer': return 'Enter integers separated by commas'; case 'double': diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte index 62eb13dd6f..40ed21595b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte @@ -14,7 +14,7 @@ import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { tick } from 'svelte'; - import { isRelationship, isRelationshipToMany } from './store'; + import { isRelationship, isRelationshipToMany, buildPayload } from './store'; import { hash } from '$lib/helpers/string'; type CreateRow = { @@ -70,7 +70,7 @@ function prepareRowPayload(createRowObject: CreateRow): object { const { row, columns } = createRowObject; - const payload = structuredClone(row); + const payload = structuredClone(row) as Record; for (const column of columns) { if (isRelationship(column) && !isRelationshipToMany(column)) { @@ -87,7 +87,7 @@ } } - return payload; + return buildPayload(columns, payload); } async function create(): Promise { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/edit.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/edit.svelte index 418b8a6c14..58a723129b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/edit.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/edit.svelte @@ -14,7 +14,8 @@ buildWildcardColumnsQuery, isRelationship, isRelationshipToMany, - isSpatialType + isSpatialType, + buildPayload } from './store'; import { Layout, Skeleton } from '@appwrite.io/pink-svelte'; import { deepClone } from '$lib/helpers/object'; @@ -142,11 +143,13 @@ if (!row || !work) return; try { + const payload = buildPayload(table.fields, $work); + await sdk.forProject(page.params.region, page.params.project).tablesDB.updateRow({ databaseId: table.databaseId, tableId: table.$id, rowId: row.$id, - data: $work, + data: payload, permissions: $work.$permissions }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/editRelated.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/editRelated.svelte index 8572826ed0..67a0ce0b09 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/editRelated.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/editRelated.svelte @@ -10,7 +10,12 @@ import { invalidate } from '$app/navigation'; import { type Columns, PROHIBITED_ROW_KEYS } from '../store'; import RelatedRowColumns from './relatedRowColumns.svelte'; - import { buildWildcardColumnsQuery, isRelationship, isRelationshipToMany } from './store'; + import { + buildWildcardColumnsQuery, + isRelationship, + isRelationshipToMany, + buildPayload + } from './store'; import { Accordion, Layout, Skeleton } from '@appwrite.io/pink-svelte'; import { deepClone } from '$lib/helpers/object'; import { preferences } from '$lib/stores/preferences'; @@ -253,11 +258,12 @@ const work = workData.get(rowId); const workValue = get(work); + const payload = buildPayload(relatedTable.fields, workValue); await sdk.forProject(page.params.region, page.params.project).tablesDB.updateRow({ databaseId, tableId: relatedTable.$id, rowId: rowId, - data: workValue, + data: payload, permissions: workValue.$permissions }); @@ -271,13 +277,14 @@ if (!work) return; const workValue = get(work); + const payload = buildPayload(relatedTable.fields, workValue); return sdk .forProject(page.params.region, page.params.project) .tablesDB.updateRow({ databaseId, tableId: relatedTable.$id, rowId: row.$id, - data: workValue, + data: payload, permissions: workValue.$permissions }); }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts index 1a65e7873a..b38649c3a4 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts @@ -4,6 +4,12 @@ import type { Attributes, Columns } from '../store'; import { type Models, Query } from '@appwrite.io/console'; import type { Entity, Field } from '$database/(entity)'; +type RowPrimitive = string | number | bigint | boolean | null | undefined; +interface RowObject { + [key: string]: RowValue; +} +type RowValue = RowPrimitive | RowValue[] | RowObject; + export function isRelationshipToMany(field: Field) { if (!field) return false; if (!isRelationship(field)) return false; @@ -52,6 +58,38 @@ export function isSpatialType( return spatialTypes.includes(field.type.toLowerCase()); } +function castBigIntValue(value: RowValue): RowValue { + if (value === null || value === undefined || value === '') { + return value; + } + + return String(value); +} + +export function buildPayload>( + fields: Field[] | undefined, + row: T +): T { + const payload = structuredClone(row) as Record; + + for (const field of fields ?? []) { + if (field.type !== 'bigint') { + continue; + } + + const value = payload[field.key]; + + if (field.array && Array.isArray(value)) { + payload[field.key] = value.map((item) => castBigIntValue(item)); + continue; + } + + payload[field.key] = castBigIntValue(value); + } + + return payload as T; +} + /** * Returns select queries for all main and related fields in an `Entity`. */ 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 e5c5c76d33..36eae918f9 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 @@ -17,6 +17,7 @@ buildWildcardColumnsQuery, isRelationship, isRelationshipToMany, + buildPayload, isSpatialType, isTextType } from './rows/store'; @@ -332,6 +333,7 @@ switch (type) { case 'string': return IconText; + case 'bigint': case 'double': case 'integer': return IconHashtag; @@ -644,11 +646,13 @@ async function updateRowContents(row: Models.Row) { try { + const payload = buildPayload(table.fields, row); + await sdk.forProject(page.params.region, page.params.project).tablesDB.updateRow({ databaseId, tableId: table.$id, rowId: row.$id, - data: row, + data: payload, permissions: row.$permissions }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts index 9d701180e7..1307bab88d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/store.ts @@ -11,6 +11,7 @@ export type Columns = | Models.ColumnEmail | Models.ColumnEnum | Models.ColumnFloat + | Models.ColumnBigint | Models.ColumnInteger | Models.ColumnIp | Models.ColumnString