From 87554f86af9bb6b25682646e5a4a798778ef91da Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Wed, 8 Apr 2026 10:34:39 +0100 Subject: [PATCH 01/13] Fix duplicate import and gate overwrite/skip on database selection - Merge duplicate Layout/Typography import in table +page.svelte - Only show overwrite/skip checkboxes in migration wizard when Databases resource is selected --- .../table-[table]/+page.svelte | 64 +++++++++++++++++-- .../migrations/(import)/wizard.svelte | 46 +++++++++++-- 2 files changed, 101 insertions(+), 9 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+page.svelte index 6467241f2..71ee82068 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+page.svelte @@ -8,7 +8,7 @@ import { Container } from '$lib/layout'; import { preferences } from '$lib/stores/preferences'; import { canWriteTables, canWriteRows } from '$lib/stores/roles'; - import { Icon, Layout, Divider, Tooltip, Typography, Link } from '@appwrite.io/pink-svelte'; + import { Dialog, Icon, Layout, Divider, Selector, Tooltip, Typography, Link } from '@appwrite.io/pink-svelte'; import type { PageData } from './$types'; import { tableColumns, @@ -44,6 +44,7 @@ import { EmptySheet, EmptySheetCards, type Field } from '$database/(entity)'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; + import { Empty as SuggestionsEmptySheet, tableColumnSuggestions, @@ -57,6 +58,11 @@ let isRefreshing = false; let showImportCSV = false; + let showImportOptions = false; + let importOverwrite = false; + let importSkip = false; + let pendingFile: Models.File | null = null; + let pendingLocalFile = false; // todo: might need a type fix here. const filterColumns = writable([]); @@ -108,17 +114,30 @@ $: disableButton = canShowSuggestionsSheet; - async function onSelect(file: Models.File, localFile = false) { + function onSelect(file: Models.File, localFile = false) { + pendingFile = file; + pendingLocalFile = localFile; + importOverwrite = false; + importSkip = false; + showImportOptions = true; + } + + async function startImport() { + if (!pendingFile) return; + + showImportOptions = false; $isCsvImportInProgress = true; try { await sdk .forProject(page.params.region, page.params.project) .migrations.createCSVImport({ - bucketId: file.bucketId, - fileId: file.$id, + bucketId: pendingFile.bucketId, + fileId: pendingFile.$id, resourceId: `${page.params.database}:${page.params.table}`, - internalFile: localFile + internalFile: pendingLocalFile, + overwrite: importOverwrite, + skip: importSkip }); addNotification({ @@ -135,6 +154,7 @@ }); } finally { $isCsvImportInProgress = false; + pendingFile = null; } } @@ -424,6 +444,40 @@ }} /> {/if} + + + + Choose how to handle documents that already exist in this table. + + + { + importOverwrite = e.detail; + if (e.detail) importSkip = false; + }} + label="Overwrite existing documents" + description="Documents with matching IDs will be updated with the imported data." /> + { + importSkip = e.detail; + if (e.detail) importOverwrite = false; + }} + label="Skip existing documents" + description="Documents with matching IDs will be silently skipped." /> + + + + + + + + + + { resetImportStores(); }; @@ -46,6 +50,11 @@ try { const resources = migrationFormToResources($formData, $provider.provider); + const importOptions = { + overwrite: importOverwrite, + skip: importSkip + }; + switch ($provider.provider) { case 'appwrite': { await sdk @@ -54,7 +63,8 @@ resources: resources as AppwriteMigrationResource[], endpoint: $provider.endpoint, projectId: $provider.projectID, - apiKey: $provider.apiKey + apiKey: $provider.apiKey, + ...importOptions }); await invalidate(Dependencies.MIGRATIONS); @@ -70,7 +80,8 @@ databaseHost: $provider.host, username: $provider.username || 'postgres', password: $provider.password, - port: $provider.port || 5432 + port: $provider.port || 5432, + ...importOptions }); await invalidate(Dependencies.MIGRATIONS); break; @@ -80,7 +91,8 @@ .forProject(page.params.region, page.params.project) .migrations.createFirebaseMigration({ resources: resources as FirebaseMigrationResource[], - serviceAccount: $provider.serviceAccount + serviceAccount: $provider.serviceAccount, + ...importOptions }); await invalidate(Dependencies.MIGRATIONS); break; @@ -95,7 +107,8 @@ adminSecret: $provider.adminSecret, database: $provider.database || $provider.subdomain, username: $provider.username || 'postgres', - password: $provider.password + password: $provider.password, + ...importOptions }); await invalidate(Dependencies.MIGRATIONS); @@ -196,6 +209,31 @@ projectSdk={sdk.forProject(page.params.region, page.params.project)} /> + + {#if $formData.databases.root} +
+ + { + importOverwrite = e.detail; + if (e.detail) importSkip = false; + }} + label="Overwrite existing documents" + description="Documents with matching IDs will be updated with the imported data." /> + { + importSkip = e.detail; + if (e.detail) importOverwrite = false; + }} + label="Skip existing documents" + description="Documents with matching IDs will be silently skipped." /> + +
+ {/if} {/if} From a81c01e38a46368122eaecba7d05e5d3cbbd7dfd Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 5 May 2026 23:57:08 +0530 Subject: [PATCH 02/13] perf: eliminate wasted API call, afterUpdate overhead, and sequential billing checks - Remove unused projects.list() call fired on every console load (result was never consumed) - Replace afterUpdate with reactive headerAlert subscription to avoid per-render overhead - Parallelize billing checks with Promise.all instead of sequential awaits - Fix database.subscribe() memory leak by wrapping in onMount for proper cleanup --- src/routes/(console)/+layout.svelte | 29 ++++++++++++++++------------- src/routes/(console)/+layout.ts | 26 +------------------------- 2 files changed, 17 insertions(+), 38 deletions(-) diff --git a/src/routes/(console)/+layout.svelte b/src/routes/(console)/+layout.svelte index ea0830ac0..56a14d626 100644 --- a/src/routes/(console)/+layout.svelte +++ b/src/routes/(console)/+layout.svelte @@ -8,7 +8,7 @@ import { database, checkForDatabaseBackupPolicies } from '$lib/stores/database'; import { newOrgModal, organization } from '$lib/stores/organization'; import { wizard } from '$lib/stores/wizard'; - import { afterUpdate, onMount } from 'svelte'; + import { onMount } from 'svelte'; import { loading } from '$routes/store'; import { requestedMigration } from '../store'; import Create from './createOrganization.svelte'; @@ -280,10 +280,12 @@ } } - database.subscribe(async (database) => { - if (!database || !page.params.region || !page.params.project) return; - // the component checks `isCloud` internally. - await checkForDatabaseBackupPolicies(page.params.region, page.params.project, database); + onMount(() => { + return database.subscribe(async (database) => { + if (!database || !page.params.region || !page.params.project) return; + // the component checks `isCloud` internally. + await checkForDatabaseBackupPolicies(page.params.region, page.params.project, database); + }); }); let currentOrganizationId = null; @@ -293,18 +295,21 @@ if (isCloud) { currentOrganizationId = org.$id; checkForEnterpriseTrial(org); - await checkForUsageLimit(org); checkForMarkedForDeletion(org); - await checkForNewDevUpgradePro(org); + + const billingChecks: Promise[] = [ + checkForUsageLimit(org), + checkForNewDevUpgradePro(org) + ]; if (org?.billingPlanDetails.requiresPaymentMethod) { - await paymentExpired(org); - await checkPaymentAuthorizationRequired(org); - + billingChecks.push(paymentExpired(org), checkPaymentAuthorizationRequired(org)); if (org?.billingTrialDays) { calculateTrialDay(org); } } + + await Promise.all(billingChecks); $activeHeaderAlert = headerAlert.getExcluding('impersonation'); } } @@ -317,9 +322,7 @@ $registerSearchers(orgSearcher, projectsSearcher); - afterUpdate(() => { - $activeHeaderAlert = headerAlert.getExcluding('impersonation'); - }); + $: void $headerAlert, ($activeHeaderAlert = headerAlert.getExcluding('impersonation')); diff --git a/src/routes/(console)/+layout.ts b/src/routes/(console)/+layout.ts index f40123b43..b191a6436 100644 --- a/src/routes/(console)/+layout.ts +++ b/src/routes/(console)/+layout.ts @@ -3,7 +3,7 @@ import { isCloud } from '$lib/system'; import type { LayoutLoad } from './$types'; import type { Account } from '$lib/stores/user'; import { Dependencies } from '$lib/constants'; -import { Platform, Query, type Models } from '@appwrite.io/console'; +import { Platform, type Models } from '@appwrite.io/console'; import { makePlansMap } from '$lib/helpers/billing'; import { plansInfo as plansInfoStore } from '$lib/stores/billing'; import { normalizeConsoleVariables } from '$lib/helpers/domains'; @@ -54,7 +54,6 @@ export const load: LayoutLoad = async ({ depends, parent, url }) => { currentOrgId: undefined, organizations, consoleVariables, - allProjectsCount: 0, plansInfo: plansInfo ?? null, version: versionData?.version ?? null }; @@ -107,28 +106,6 @@ export const load: LayoutLoad = async ({ depends, parent, url }) => { preferences.organization ?? (organizations.teams.length > 0 ? organizations.teams[0].$id : undefined); - // Load projects for the current organization if one is selected - let projectsCount = 0; - if (currentOrgId) { - try { - projectsCount = ( - await sdk.forConsole.projects.list({ - queries: [ - Query.equal('teamId', currentOrgId), - Query.limit(1), - Query.select(['$id']) - ] - }) - ).total; - } catch (e) { - if (shouldRedirectToVerifyEmail(e)) { - redirect(303, verifyEmailUrl); - } - - projectsCount = 0; - } - } - // just in case! plansInfoStore.set(fallbackPlansInfoArray); @@ -139,7 +116,6 @@ export const load: LayoutLoad = async ({ depends, parent, url }) => { currentOrgId, organizations, consoleVariables, - allProjectsCount: projectsCount, plansInfo: fallbackPlansInfoArray, version: versionData?.version ?? null }; From aad9c7fe2f3d82069e624c3e4bbc9216aacbd5d0 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Wed, 6 May 2026 00:00:47 +0530 Subject: [PATCH 03/13] lint --- src/routes/(console)/+layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/+layout.svelte b/src/routes/(console)/+layout.svelte index 56a14d626..5b3072210 100644 --- a/src/routes/(console)/+layout.svelte +++ b/src/routes/(console)/+layout.svelte @@ -322,7 +322,7 @@ $registerSearchers(orgSearcher, projectsSearcher); - $: void $headerAlert, ($activeHeaderAlert = headerAlert.getExcluding('impersonation')); + $: (void $headerAlert, ($activeHeaderAlert = headerAlert.getExcluding('impersonation'))); From 8dfd91b7d3b2d8f7f850aa1f0fd7577f22a006ae Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Thu, 7 May 2026 12:15:03 +0100 Subject: [PATCH 04/13] feat(migrations): expose Fail/Skip/Overwrite radios for import flows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reworks the import-options UI in three places to match the new OnDuplicate enum (Fail / Skip / Overwrite) shipped by the cloud worker and migration package: - Settings → Migrations wizard (Appwrite source): three-option radio group with Fail pre-selected. Wording reflects that overwrite/skip apply to the entire resource tree (databases, tables, columns, indexes, rows), not just rows. - Tables (TablesDB) CSV import: same three-option radio replacing the prior two checkboxes. Wording stays document-centric since CSV import is row-only. - Collections (DocumentsDB) JSON import: previously imported with no onDuplicate (silent default to fail). Now opens the same Import options dialog with Fail/Skip/Overwrite radios. Also bumps @appwrite.io/console SDK to https://pkg.vc/-/@appwrite/ @appwrite.io/console@341620a so the OnDuplicate enum exports match the merged backend (post 1.9.x). Renamed OnDuplicate.Upsert -> OnDuplicate.Overwrite throughout the console (the enum was renamed in upstream PR #11910 / migration 1.9.7; the prior reference compiled to undefined and silently defaulted the backend to Fail). --- bun.lock | 4 +- package.json | 2 +- .../collection-[collection]/+page.svelte | 82 +++++++++++++++++-- .../table-[table]/+page.svelte | 66 +++++++++------ .../migrations/(import)/wizard.svelte | 54 +++++++----- 5 files changed, 155 insertions(+), 53 deletions(-) diff --git a/bun.lock b/bun.lock index 05bdf932d..c2793e6bf 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@8f00f95", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@341620a", "@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", @@ -124,7 +124,7 @@ "@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@8f00f95", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@341620a", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index 0eb4abad8..b0fe8b089 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@8f00f95", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@341620a", "@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/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte index 1df280dce..017e1a03a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte @@ -5,7 +5,15 @@ import type { Column, ColumnType } from '$lib/helpers/types'; import { Container } from '$lib/layout'; import { preferences } from '$lib/stores/preferences'; - import { Icon, Layout, Divider, Tooltip } from '@appwrite.io/pink-svelte'; + import { + Icon, + Layout, + Divider, + Tooltip, + Selector, + Typography, + Dialog + } from '@appwrite.io/pink-svelte'; import type { PageProps } from './$types'; import FilePicker from '$lib/components/filePicker.svelte'; import { page } from '$app/state'; @@ -21,7 +29,7 @@ IconUpload, IconDownload } from '@appwrite.io/pink-icons-svelte'; - import { type Models } from '@appwrite.io/console'; + import { OnDuplicate, type Models } from '@appwrite.io/console'; import { sdk } from '$lib/stores/sdk'; import { goto } from '$app/navigation'; import { resolve } from '$app/paths'; @@ -49,7 +57,11 @@ let isRefreshing = $state(false); let showImportJson = $state(false); + let showImportOptions = $state(false); let showCustomColumnsModal = $state(false); + let importOnDuplicate: OnDuplicate = $state(OnDuplicate.Fail); + let pendingFile: Models.File | null = $state(null); + let pendingLocalFile = $state(false); let columnsError: string = $state(null); let spreadsheet: SpreadSheet | null = $state(null); @@ -74,17 +86,28 @@ return queryParam ? `${url}?query=${encodeURIComponent(queryParam)}` : url; } - async function onSelect(file: Models.File, localFile = false) { + function onSelect(file: Models.File, localFile = false) { + pendingFile = file; + pendingLocalFile = localFile; + importOnDuplicate = OnDuplicate.Fail; + showImportOptions = true; + } + + async function startImport() { + if (!pendingFile) return; + + showImportOptions = false; $isCollectionsJsonImportInProgress = true; try { await sdk .forProject(page.params.region, page.params.project) .migrations.createJSONImport({ - bucketId: file.bucketId, - fileId: file.$id, + bucketId: pendingFile.bucketId, + fileId: pendingFile.$id, resourceId: `${page.params.database}:${page.params.collection}`, - internalFile: localFile + internalFile: pendingLocalFile, + onDuplicate: importOnDuplicate }); addNotification({ @@ -101,6 +124,7 @@ }); } finally { $isCollectionsJsonImportInProgress = false; + pendingFile = null; } } @@ -343,6 +367,52 @@ }} /> {/if} + + + + Choose how to handle documents that already exist in this collection. + + + + + Import aborts on the first document with a matching ID. + + + + + Documents with matching IDs will be silently skipped. + + + + + Documents with matching IDs will be updated with the imported data. + + + + + + + + + + + + - { - importOverwrite = e.detail; - if (e.detail) importSkip = false; - }} - label="Overwrite existing documents" - description="Documents with matching IDs will be updated with the imported data." /> - + + Migration aborts on the first row with a matching ID. + + + { - importSkip = e.detail; - if (e.detail) importOverwrite = false; - }} - label="Skip existing documents" - description="Documents with matching IDs will be silently skipped." /> + bind:group={importOnDuplicate} + name="importOnDuplicate" + value={OnDuplicate.Skip} + label="Skip existing documents"> + + Documents with matching IDs will be silently skipped. + + + + + Documents with matching IDs will be updated with the imported data. + + diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte index 67043f5d6..033332ca4 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte @@ -11,6 +11,7 @@ AppwriteMigrationResource, FirebaseMigrationResource, NHostMigrationResource, + OnDuplicate, SupabaseMigrationResource } from '@appwrite.io/console'; import { started } from '../stores'; @@ -39,8 +40,7 @@ import { capitalize } from '$lib/helpers/string'; import { page } from '$app/state'; - let importOverwrite = false; - let importSkip = false; + let importOnDuplicate: OnDuplicate = OnDuplicate.Fail; const onExit = () => { resetImportStores(); @@ -51,8 +51,7 @@ const resources = migrationFormToResources($formData, $provider.provider); const importOptions = { - overwrite: importOverwrite, - skip: importSkip + onDuplicate: importOnDuplicate }; switch ($provider.provider) { @@ -213,24 +212,39 @@ {#if $formData.databases.root}
- { - importOverwrite = e.detail; - if (e.detail) importSkip = false; - }} - label="Overwrite existing documents" - description="Documents with matching IDs will be updated with the imported data." /> - + + Migration aborts on the first existing resource (database, + table, column, index, or row). + + + { - importSkip = e.detail; - if (e.detail) importOverwrite = false; - }} - label="Skip existing documents" - description="Documents with matching IDs will be silently skipped." /> + bind:group={importOnDuplicate} + name="importOnDuplicate" + value={OnDuplicate.Skip} + label="Skip existing resources"> + + Existing resources are left untouched. Only resources missing on + the destination are created. + + + + + Existing resources are updated to match the source. Schema drift + and row data are both reconciled. + +
{/if} From b0d92f58b12e9a4aa15df88f3a0c2408a7f45fab Mon Sep 17 00:00:00 2001 From: Prem Palanisamy Date: Thu, 7 May 2026 12:36:09 +0100 Subject: [PATCH 05/13] fix(migrations): gate onDuplicate to Fail when databases not selected MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Fail/Skip/Overwrite radios are only rendered when the Databases resource is checked. The local importOnDuplicate value, however, persists across toggles — so unticking Databases after picking Overwrite or Skip would silently apply that mode to the entire migration payload (users, teams, functions, etc.) on submit. Gate the value at submit time: only forward importOnDuplicate when $formData.databases.root is true; otherwise always send Fail. Addresses greptile P1 review on PR #2964. --- .../settings/migrations/(import)/wizard.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte index 033332ca4..43d5294b4 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/wizard.svelte @@ -50,8 +50,13 @@ try { const resources = migrationFormToResources($formData, $provider.provider); + // Gate onDuplicate to Fail when databases isn't selected. The radios + // are only shown when databases.root is checked, but the local value + // persists across toggles — without this gate, deselecting databases + // after picking Overwrite/Skip would silently apply that mode to + // other resource types (users, teams, functions, etc.) on submit. const importOptions = { - onDuplicate: importOnDuplicate + onDuplicate: $formData.databases.root ? importOnDuplicate : OnDuplicate.Fail }; switch ($provider.provider) { From c7687220d7a5aa8102433e1e131bfe0ef85c9325 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Thu, 7 May 2026 13:02:36 +0530 Subject: [PATCH 06/13] fix: update proxy rule status handling and improve variable ID generation in function and site creation --- src/lib/components/domains/status.ts | 4 -- .../components/domains/viewLogsModal.svelte | 2 +- .../auth/updateOAuth.ts | 4 +- .../table-[table]/rows/create.svelte | 15 ++++++-- .../table-[table]/rows/store.ts | 38 +++++++++++++++++++ .../create-function/deploy/+page.svelte | 1 + .../create-function/manual/+page.svelte | 1 + .../repository-[repository]/+page.svelte | 1 + .../template-[template]/+page.svelte | 1 + .../function-[function]/domains/+page.ts | 3 +- .../add-domain/verify-[domain]/+page.svelte | 2 +- .../domains/retryDomainModal.svelte | 2 +- .../function-[function]/settings/+page.svelte | 2 + .../settings/domains/+page.ts | 3 +- .../add-domain/verify-[domain]/+page.svelte | 2 +- .../settings/domains/retryDomainModal.svelte | 2 +- .../sites/create-site/deploy/+page.svelte | 1 + .../sites/create-site/manual/+page.svelte | 1 + .../repository-[repository]/+page.svelte | 1 + .../template-[template]/+page.svelte | 1 + .../sites/site-[site]/domains/+page.ts | 3 +- .../add-domain/verify-[domain]/+page.svelte | 2 +- .../domains/retryDomainModal.svelte | 2 +- .../sites/site-[site]/settings/+page.svelte | 2 + 24 files changed, 73 insertions(+), 23 deletions(-) diff --git a/src/lib/components/domains/status.ts b/src/lib/components/domains/status.ts index 89bb1df41..27c696a41 100644 --- a/src/lib/components/domains/status.ts +++ b/src/lib/components/domains/status.ts @@ -13,10 +13,6 @@ export function isProxyRuleVerified(status: ProxyRuleStatusValue): boolean { } export function normalizeProxyRuleStatus(status: ProxyRuleStatusValue): ProxyRuleStatusValue { - if (status === ProxyRuleStatus.Created) { - return ProxyRuleStatus.Unverified; - } - return status; } diff --git a/src/lib/components/domains/viewLogsModal.svelte b/src/lib/components/domains/viewLogsModal.svelte index 3f558c71a..9fd5fb366 100644 --- a/src/lib/components/domains/viewLogsModal.svelte +++ b/src/lib/components/domains/viewLogsModal.svelte @@ -43,7 +43,7 @@ try { selectedProxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId: selectedProxyRule.$id }); + .proxy.updateRuleStatus({ ruleId: selectedProxyRule.$id }); await invalidate(Dependencies.DOMAINS); show = false; diff --git a/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts index 0c2195502..3931406c3 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts @@ -218,8 +218,8 @@ async function updateProjectOAuth({ clientSecret: getSecret('clientSecret'), wellKnownURL: getDetail('wellKnownURL'), authorizationURL: getDetail('authorizationURL'), - tokenUrl: getDetail('tokenUrl'), - userInfoUrl: getDetail('userInfoUrl'), + tokenURL: getDetail('tokenUrl'), + userInfoURL: getDetail('userInfoUrl'), enabled }); case OAuthProvider.Okta: 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 275698c1e..3262b1c1a 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,8 @@ 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 type { RowValue } from './store'; import { hash } from '$lib/helpers/string'; type CreateRow = { @@ -70,7 +71,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)) { @@ -79,7 +80,13 @@ if (value && typeof value === 'object') { if (Array.isArray(value)) { - payload[key] = value.map((item) => item?.$id).filter(Boolean); + payload[key] = value + .map((item) => + item && typeof item === 'object' && '$id' in item + ? (item.$id as string) + : null + ) + .filter(Boolean); } else { payload[key] = (value as { $id: string })['$id']; } @@ -87,7 +94,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/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/store.ts index 16b04abd2..ee1686c11 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 @@ -3,6 +3,12 @@ import type { Column } from '$lib/helpers/types'; import { type Models } from '@appwrite.io/console'; import type { Attributes, Columns } from '../../store'; +type RowPrimitive = string | number | bigint | boolean | null | undefined; +interface RowObject { + [key: string]: RowValue; +} +export type RowValue = RowPrimitive | RowValue[] | RowObject; + export function isRelationshipToMany(field: Field) { if (!field) return false; if (!isRelationship(field)) return false; @@ -50,3 +56,35 @@ 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; +} diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte index e0e389e91..200e0575d 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/deploy/+page.svelte @@ -121,6 +121,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).functions.createVariable({ functionId: func.$id, + variableId: ID.unique(), key: variable.key, value: variable.value, secret: variable.secret diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/manual/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/manual/+page.svelte index 3e125c978..1e7296206 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/manual/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/manual/+page.svelte @@ -90,6 +90,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).functions.createVariable({ functionId: func.$id, + variableId: ID.unique(), key: variable.key, value: variable.value, secret: variable?.secret ?? false diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte index 7b19202d0..0e022aabc 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/repository-[repository]/+page.svelte @@ -132,6 +132,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).functions.createVariable({ functionId: func.$id, + variableId: ID.unique(), key: variable.key, value: variable.value, secret: variable?.secret ?? false diff --git a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte index cfb1bcd80..4a46da427 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/create-function/template-[template]/+page.svelte @@ -190,6 +190,7 @@ .forProject(page.params.region, page.params.project) .functions.createVariable({ functionId: func.$id, + variableId: ID.unique(), key: variable.name, value: variable.value, secret: variable?.secret ?? false diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.ts b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.ts index 5fdc16ceb..62b0175d1 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/+page.ts @@ -31,8 +31,7 @@ export const load: PageLoad = async ({ depends, params, url, route, parent }) => Query.orderDesc(''), Query.orderDesc('$updatedAt'), ...parsedQueries.values() - ], - search: search || undefined + ] }); const organizationDomains = await fetchOrganizationDomainsForRules( diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.svelte index 7701ebd8d..a79271ebf 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/add-domain/verify-[domain]/+page.svelte @@ -73,7 +73,7 @@ try { proxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId }); + .proxy.updateRuleStatus({ ruleId }); await Promise.all([ invalidate(Dependencies.DOMAINS), diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/retryDomainModal.svelte index 02a09d4c4..926b77930 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/retryDomainModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/domains/retryDomainModal.svelte @@ -68,7 +68,7 @@ try { selectedProxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId: selectedProxyRule.$id }); + .proxy.updateRuleStatus({ ruleId: selectedProxyRule.$id }); await invalidate(Dependencies.FUNCTION_DOMAINS); show = false; diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/+page.svelte index cdfb04752..6175d94b9 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/settings/+page.svelte @@ -24,6 +24,7 @@ import UpdateVariables from '$routes/(console)/project-[region]-[project]/updateVariables.svelte'; import { page } from '$app/state'; import { Link } from '$lib/elements'; + import { ID } from '@appwrite.io/console'; export let data; let showAlert = true; @@ -31,6 +32,7 @@ const sdkCreateVariable = async (key: string, value: string, secret?: boolean) => { await sdk.forProject(page.params.region, page.params.project).functions.createVariable({ functionId: data.function.$id, + variableId: ID.unique(), key, value, secret diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/+page.ts b/src/routes/(console)/project-[region]-[project]/settings/domains/+page.ts index bf7570e23..70d072a64 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/domains/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/settings/domains/+page.ts @@ -25,8 +25,7 @@ export const load: PageLoad = async ({ depends, url, route, params, parent }) => Query.equal('type', RuleType.API), Query.equal('trigger', RuleTrigger.MANUAL), Query.orderDesc('$updatedAt') - ], - search: search || undefined + ] }); const organizationDomains = await fetchOrganizationDomainsForRules(rules, organization.$id); diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte index 93f725eb0..b32e4ff1b 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/domains/add-domain/verify-[domain]/+page.svelte @@ -72,7 +72,7 @@ try { proxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId }); + .proxy.updateRuleStatus({ ruleId }); await invalidate(Dependencies.DOMAINS); await goto(routeBase); diff --git a/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte index 1098b8d3f..20f895674 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/domains/retryDomainModal.svelte @@ -68,7 +68,7 @@ try { selectedProxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId: selectedProxyRule.$id }); + .proxy.updateRuleStatus({ ruleId: selectedProxyRule.$id }); await invalidate(Dependencies.DOMAINS); show = false; diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/deploy/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/deploy/+page.svelte index 97c6506f5..fa75d2794 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/deploy/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/deploy/+page.svelte @@ -171,6 +171,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).sites.createVariable({ siteId: site.$id, + variableId: ID.unique(), key: variable.key, value: variable.value, secret: variable.secret diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte index 5a313e8f5..f2da210d0 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/manual/+page.svelte @@ -93,6 +93,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).sites.createVariable({ siteId: site.$id, + variableId: ID.unique(), key: variable.key, value: variable.value, secret: variable?.secret ?? false diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte index f4e18691b..aca5fe7bb 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/repositories/repository-[repository]/+page.svelte @@ -143,6 +143,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).sites.createVariable({ siteId: site.$id, + variableId: ID.unique(), key: variable.key, value: variable.value, secret: variable?.secret ?? false diff --git a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte index 0e57e223a..a11121d55 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/create-site/templates/template-[template]/+page.svelte @@ -151,6 +151,7 @@ const promises = variables.map((variable) => sdk.forProject(page.params.region, page.params.project).sites.createVariable({ siteId: site.$id, + variableId: ID.unique(), key: variable.name, value: variable.value, secret: variable?.secret ?? false diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts index 25c021aa6..b0ba589da 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/+page.ts @@ -30,8 +30,7 @@ export const load = async ({ params, depends, url, route, parent }) => { Query.orderDesc(''), Query.orderDesc('$updatedAt'), ...parsedQueries.values() - ], - search: search || undefined + ] }); const organizationDomains = await fetchOrganizationDomainsForRules( diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte index 83eb4f33d..cd0f6f663 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/add-domain/verify-[domain]/+page.svelte @@ -72,7 +72,7 @@ try { proxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId }); + .proxy.updateRuleStatus({ ruleId }); await Promise.all([ invalidate(Dependencies.DOMAINS), diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte index 56fa02b6d..b7b74ae34 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/domains/retryDomainModal.svelte @@ -68,7 +68,7 @@ try { selectedProxyRule = await sdk .forProject(page.params.region, page.params.project) - .proxy.updateRuleVerification({ ruleId: selectedProxyRule.$id }); + .proxy.updateRuleStatus({ ruleId: selectedProxyRule.$id }); await invalidate(Dependencies.SITES_DOMAINS); show = false; diff --git a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/+page.svelte index e91e06eeb..faddf5f36 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/site-[site]/settings/+page.svelte @@ -17,12 +17,14 @@ import UpdateVariables from '$routes/(console)/project-[region]-[project]/updateVariables.svelte'; import UpdateLogging from './updateLogging.svelte'; import UpdateDeploymentRetention from './updateDeploymentRetention.svelte'; + import { ID } from '@appwrite.io/console'; export let data; const sdkCreateVariable = async (key: string, value: string, secret: boolean) => { await sdk.forProject(page.params.region, page.params.project).sites.createVariable({ siteId: page.params.site, + variableId: ID.unique(), key, value, secret From ff360a686ac5880b1290bb4827f06bb5612f2e22 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Thu, 7 May 2026 13:50:54 +0530 Subject: [PATCH 07/13] updated proxy status --- src/lib/components/domains/status.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/components/domains/status.ts b/src/lib/components/domains/status.ts index 27c696a41..c5f1c4107 100644 --- a/src/lib/components/domains/status.ts +++ b/src/lib/components/domains/status.ts @@ -13,6 +13,9 @@ export function isProxyRuleVerified(status: ProxyRuleStatusValue): boolean { } export function normalizeProxyRuleStatus(status: ProxyRuleStatusValue): ProxyRuleStatusValue { + if (status === 'created') { + return ProxyRuleStatus.Unverified; + } return status; } From e4196b0fb8496f32899c5d61370f52865110623d Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 10 May 2026 19:18:14 +0530 Subject: [PATCH 08/13] Remove manual support triage fields --- src/routes/(console)/supportWizard.svelte | 165 +------------------ src/routes/(console)/wizard/support/store.ts | 11 +- 2 files changed, 8 insertions(+), 168 deletions(-) diff --git a/src/routes/(console)/supportWizard.svelte b/src/routes/(console)/supportWizard.svelte index 23c1b4de7..8522fb914 100644 --- a/src/routes/(console)/supportWizard.svelte +++ b/src/routes/(console)/supportWizard.svelte @@ -1,25 +1,10 @@ -{#snippet severityPopover()} - - -
- - - Critical: System is down or a critical component is non-functional, causing - a complete stoppage of work or significant business impact. - - - High: Major functionality is impaired, but a workaround is available, or a - critical component is significantly degraded. - - - Medium: Minor functionality is impaired without significant business impact. - - - Low: Issue has minor impact on business operations; workaround is not necessary. - - - Question: Requests for information, general guidance, or feature requests. - - -
-
-{/snippet} -
@@ -246,50 +129,12 @@ >Please describe your request in detail. If applicable, include steps for reproduction of any in-app issues. - - Choose a category - - {#each categories as category} - { - if ($supportData.category !== category.value) { - $supportData.topic = undefined; - } - $supportData.category = category.value; - }} - selected={$supportData.category === category.value} - >{category.label} - {/each} - - - {#if topicOptions.length > 0} - {#key $supportData.category} - - {/key} - {/if} - -
- {@render severityPopover()} -
-
({ message: '', subject: '', - category: 'technical', - severity: 'question', file: null }); From 2f013bb41313360122207f75bed394462f70d164 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Sun, 10 May 2026 19:25:59 +0530 Subject: [PATCH 09/13] Align support store initial state --- src/routes/(console)/wizard/support/store.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/wizard/support/store.ts b/src/routes/(console)/wizard/support/store.ts index 6a71574b9..abcd7f2c5 100644 --- a/src/routes/(console)/wizard/support/store.ts +++ b/src/routes/(console)/wizard/support/store.ts @@ -8,8 +8,8 @@ export type SupportData = { }; export const supportData = writable({ - message: '', - subject: '', + message: null, + subject: null, file: null }); From 8b4028d665d1480d28185b3dd80fc31b7e3ba9c8 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Mon, 11 May 2026 22:15:17 +1200 Subject: [PATCH 10/13] fix(backups): show 'Skipped' label for skipped scheduled archives (#3033) * fix(backups): surface skipped scheduled backups with a Skipped label Cloud now writes a terminal archive doc with status='skipped' for cron ticks that were dropped because the previous run hadn't finished yet. Map that to the neutral 'waiting' Status visual and override the label so the user sees "Skipped" instead of the auto-capitalized "Waiting". Co-Authored-By: Claude Opus 4.7 (1M context) * docs(backups): comment why 'skipped' maps to the 'waiting' visual Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- .../database-[database]/backups/table.svelte | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte index c64a53e8e..9170eee9b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte @@ -99,11 +99,22 @@ return 'processing'; case 'failed': return 'failed'; + // pink-svelte's Status union has no 'skipped' — fall back to the + // neutral 'waiting' visual and override the label below. + case 'skipped': + return 'waiting'; default: return 'waiting'; } } + function getBackupStatusLabel(backup: Models.BackupArchive): string { + if (backup.status === 'skipped') { + return 'Skipped'; + } + return capitalize(getBackupStatus(backup)); + } + async function deleteSingleBackup(archiveId: string) { try { await sdk @@ -231,7 +242,7 @@ {@const backupStatus = getBackupStatus(backup)} - + From 31efb78e3275e372fe911554b92c8f100951f33c Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 12 May 2026 01:33:14 +0530 Subject: [PATCH 11/13] Fix variable count display --- .../updateVariables.svelte | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/updateVariables.svelte b/src/routes/(console)/project-[region]-[project]/updateVariables.svelte index 6e3d38620..c2b915500 100644 --- a/src/routes/(console)/project-[region]-[project]/updateVariables.svelte +++ b/src/routes/(console)/project-[region]-[project]/updateVariables.svelte @@ -100,13 +100,15 @@ } return { - total, + total: variables.length, variables }; } async function ensureAllVariablesLoaded() { - if (fullVariableList && fullVariableList.total === variableList.total) return; + if (fullVariableList && fullVariableList.variables.length >= variableList.variables.length) { + return; + } fullVariableList = await loadAllVariables(); } @@ -338,7 +340,7 @@ previousVariableList = variableList; } - $: if (fullVariableList && fullVariableList.total !== variableList.total) { + $: if (fullVariableList && fullVariableList.variables.length < variableList.variables.length) { fullVariableList = undefined; } @@ -346,6 +348,7 @@ $: displayedVariables = backendPagination ? variableList.variables : variableList.variables.slice(offset, offset + limit); + $: variableCount = backendPagination ? variableList.total : variableList.variables.length; $: hasConflictOnPage = globalVariableList ? displayedVariables.filter((variable) => { @@ -422,7 +425,7 @@ Import .env - {#if variableList.total} + {#if variableCount} - {#if variableList.total} + {#if variableCount}