From a245a5b6888224793931e8cc6448babf43ac7427 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Wed, 25 Jun 2025 14:43:58 +0530 Subject: [PATCH 01/43] fix-PRO-1949: Fix .env values in platform creation screen to follow env format --- .../overview/platforms/createReactNative.svelte | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte b/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte index 95b12e2eb..0c557277a 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte @@ -35,9 +35,10 @@ const gitCloneCode = '\ngit clone https://github.com/appwrite/starter-for-react-native\ncd starter-for-react-native\n'; - const updateConfigCode = `const EXPO_PUBLIC_APPWRITE_PROJECT_ID = "${projectId}"; -const EXPO_PUBLIC_APPWRITE_ENDPOINT = "${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}"; - `; + const updateConfigCode = ( + prefix: string + ) => `${prefix}EXPO_PUBLIC_APPWRITE_PROJECT_ID=${projectId} +${prefix}EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}`; export let platform: PlatformType = PlatformType.Reactnativeandroid; @@ -232,7 +233,7 @@ const EXPO_PUBLIC_APPWRITE_ENDPOINT = "${sdk.forProject(page.params.region, page
- +
Date: Wed, 25 Jun 2025 15:28:50 +0530 Subject: [PATCH 02/43] fix: remove unused prefix parameter in createReactNative.svelte --- .../overview/platforms/createReactNative.svelte | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte b/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte index 0c557277a..2c928d9d0 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte @@ -35,10 +35,8 @@ const gitCloneCode = '\ngit clone https://github.com/appwrite/starter-for-react-native\ncd starter-for-react-native\n'; - const updateConfigCode = ( - prefix: string - ) => `${prefix}EXPO_PUBLIC_APPWRITE_PROJECT_ID=${projectId} -${prefix}EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}`; + const updateConfigCode = () => `EXPO_PUBLIC_APPWRITE_PROJECT_ID=${projectId} +EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}`; export let platform: PlatformType = PlatformType.Reactnativeandroid; @@ -233,7 +231,7 @@ ${prefix}EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page
- +
Date: Wed, 25 Jun 2025 15:56:19 +0530 Subject: [PATCH 03/43] fix:changed the function updateConfigCode to const variable and chnaged lang from bash to dotenv --- .../overview/platforms/createReactNative.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte b/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte index 2c928d9d0..edbd6a355 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/platforms/createReactNative.svelte @@ -35,7 +35,7 @@ const gitCloneCode = '\ngit clone https://github.com/appwrite/starter-for-react-native\ncd starter-for-react-native\n'; - const updateConfigCode = () => `EXPO_PUBLIC_APPWRITE_PROJECT_ID=${projectId} + const updateConfigCode = `EXPO_PUBLIC_APPWRITE_PROJECT_ID=${projectId} EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page.params.project).client.config.endpoint}`; export let platform: PlatformType = PlatformType.Reactnativeandroid; @@ -231,7 +231,7 @@ EXPO_PUBLIC_APPWRITE_ENDPOINT=${sdk.forProject(page.params.region, page.params.p
- +
Date: Thu, 26 Jun 2025 11:26:21 +0200 Subject: [PATCH 04/43] Fix cross-region deployment preview screenshots (include region) --- .../sites/(components)/siteCard.svelte | 6 +++++- .../(console)/project-[region]-[project]/sites/grid.svelte | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte index 228e42db9..543bad66a 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte @@ -3,6 +3,7 @@ import { humanFileSize } from '$lib/helpers/sizeConvertion'; import { formatTimeDetailed } from '$lib/helpers/timeConversion'; import type { Models } from '@appwrite.io/console'; + import { page } from '$app/state'; import { Badge, Divider, @@ -45,7 +46,10 @@ } function getFilePreview(fileId: string) { - return sdk.forConsole.storage.getFileView('screenshots', fileId); + // Project SDK with `console` project ID = Console SDK with region prefix + return sdk + .forProject(page.params.region, 'console') + .storage.getFileView('screenshots', fileId); } diff --git a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte index 3e740b359..45979c619 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte @@ -33,7 +33,10 @@ } function getFilePreview(fileId: string) { - return sdk.forConsole.storage.getFileView('screenshots', fileId); + // Project SDK with `console` project ID = Console SDK with region prefix + return sdk + .forProject(page.params.region, 'console') + .storage.getFileView('screenshots', fileId); } From a9bd56556b4a198d7dacb39e25d68b99b85290f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Thu, 26 Jun 2025 12:21:08 +0200 Subject: [PATCH 05/43] Improve code quality --- .../sites/(components)/siteCard.svelte | 5 +---- .../(console)/project-[region]-[project]/sites/grid.svelte | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte index 543bad66a..e8eb7e015 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte @@ -46,10 +46,7 @@ } function getFilePreview(fileId: string) { - // Project SDK with `console` project ID = Console SDK with region prefix - return sdk - .forProject(page.params.region, 'console') - .storage.getFileView('screenshots', fileId); + return sdk.forConsoleIn(page.params.region).storage.getFileView('screenshots', fileId); } diff --git a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte index 45979c619..36b12b562 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/grid.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/grid.svelte @@ -33,10 +33,7 @@ } function getFilePreview(fileId: string) { - // Project SDK with `console` project ID = Console SDK with region prefix - return sdk - .forProject(page.params.region, 'console') - .storage.getFileView('screenshots', fileId); + return sdk.forConsoleIn(page.params.region).storage.getFileView('screenshots', fileId); } From 177eaa3e4d1eb0b622b26639863f9ae38e1a41ec Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 26 Jun 2025 15:54:43 +0530 Subject: [PATCH 06/43] chore: tracking --- .../(public)/(guest)/register/invite/[slug]/+page.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte index 29ede2c9d..69f925a5e 100644 --- a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte +++ b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte @@ -77,7 +77,11 @@ await sdk.forConsole.account.updatePrefs(newPrefs); await invalidate(Dependencies.ACCOUNT); await goto(base); - trackEvent('submit_account_create', { code: code }); + trackEvent('submit_account_create', { + email: mail, + name: name, + code: code + }); } } catch (error) { addNotification({ From c01d9a54ffabe76703e515dc072b7bcc03680555 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 26 Jun 2025 16:07:10 +0530 Subject: [PATCH 07/43] fix: events --- src/routes/(public)/(guest)/login/+page.svelte | 6 +++++- src/routes/(public)/(guest)/register/+page.svelte | 6 +++++- .../(public)/(guest)/register/invite/[slug]/+page.svelte | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/routes/(public)/(guest)/login/+page.svelte b/src/routes/(public)/(guest)/login/+page.svelte index 799af47a1..5baf2d4ec 100644 --- a/src/routes/(public)/(guest)/login/+page.svelte +++ b/src/routes/(public)/(guest)/login/+page.svelte @@ -32,7 +32,11 @@ } if (data?.couponData?.code) { - trackEvent(Submit.AccountCreate, { campaign_name: data?.couponData?.code }); + trackEvent(Submit.AccountCreate, { + campaign_name: data?.couponData?.code, + email: mail, + name: $user?.name + }); await goto(`${base}/apply-credit?code=${data?.couponData?.code}`); return; } diff --git a/src/routes/(public)/(guest)/register/+page.svelte b/src/routes/(public)/(guest)/register/+page.svelte index e166d5ffd..37faff2df 100644 --- a/src/routes/(public)/(guest)/register/+page.svelte +++ b/src/routes/(public)/(guest)/register/+page.svelte @@ -32,7 +32,11 @@ await sdk.forConsole.account.create(ID.unique(), mail, pass, name ?? ''); await sdk.forConsole.account.createEmailPasswordSession(mail, pass); - trackEvent(Submit.AccountCreate, { campaign_name: data?.couponData?.code }); + trackEvent(Submit.AccountCreate, { + campaign_name: data?.couponData?.code, + email: mail, + name: name + }); if (data?.couponData?.code) { await goto(`${base}/apply-credit?code=${data?.couponData?.code}`); diff --git a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte index 69f925a5e..7e3897169 100644 --- a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte +++ b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte @@ -13,7 +13,7 @@ import { sdk } from '$lib/stores/sdk'; import { Unauthenticated } from '$lib/layout'; import { Dependencies } from '$lib/constants'; - import { trackEvent } from '$lib/actions/analytics'; + import { Submit, trackEvent } from '$lib/actions/analytics'; import { onMount } from 'svelte'; import { page } from '$app/state'; import LoginLight from '$lib/images/login/login-light-mode.svg'; @@ -77,7 +77,7 @@ await sdk.forConsole.account.updatePrefs(newPrefs); await invalidate(Dependencies.ACCOUNT); await goto(base); - trackEvent('submit_account_create', { + trackEvent(Submit.AccountCreate, { email: mail, name: name, code: code From 07cb035dec037974671c74fad25e64ffb5d42d40 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 26 Jun 2025 16:08:23 +0530 Subject: [PATCH 08/43] chore: remove await --- src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte index 7e3897169..f75275998 100644 --- a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte +++ b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte @@ -75,7 +75,7 @@ const prefs = await sdk.forConsole.account.getPrefs(); const newPrefs = { ...prefs, code }; await sdk.forConsole.account.updatePrefs(newPrefs); - await invalidate(Dependencies.ACCOUNT); + invalidate(Dependencies.ACCOUNT); await goto(base); trackEvent(Submit.AccountCreate, { email: mail, From 4b839ac71637b913f6c9cafe72d44c9a20df4031 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Thu, 26 Jun 2025 16:10:39 +0530 Subject: [PATCH 09/43] chore: use promise all --- .../(public)/(guest)/register/invite/[slug]/+page.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte index f75275998..54a49e6c1 100644 --- a/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte +++ b/src/routes/(public)/(guest)/register/invite/[slug]/+page.svelte @@ -74,8 +74,10 @@ await sdk.forConsole.account.createEmailPasswordSession(mail, pass); const prefs = await sdk.forConsole.account.getPrefs(); const newPrefs = { ...prefs, code }; - await sdk.forConsole.account.updatePrefs(newPrefs); - invalidate(Dependencies.ACCOUNT); + await Promise.all([ + sdk.forConsole.account.updatePrefs(newPrefs), + invalidate(Dependencies.ACCOUNT) + ]); await goto(base); trackEvent(Submit.AccountCreate, { email: mail, From d9ce3a498df17a17a941354243edc605802a914f Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Thu, 26 Jun 2025 16:28:25 +0530 Subject: [PATCH 10/43] fix: improve modal focus with dual autofocus strategy --- .../billing/validateCreditModal.svelte | 1 + src/lib/components/feedback/evaluation.svelte | 17 +++++++- .../feedback/feedbackGeneral.svelte | 11 ++++++ src/lib/components/modal.svelte | 39 +++++++++++++++++++ src/lib/layout/createProject.svelte | 26 +++++++++++++ .../create-organization/+page.svelte | 25 ++++++++++++ .../onboarding/create-project/+page.svelte | 26 ++++++++++++- .../domains/add-domain/+page.svelte | 1 + .../domain-[domain]/createRecordModal.svelte | 8 +++- .../overview/platforms/createWeb.svelte | 1 + .../settings/domains/add-domain/+page.svelte | 1 + .../domains/createPreviewDomainModal.svelte | 2 +- 12 files changed, 154 insertions(+), 4 deletions(-) diff --git a/src/lib/components/billing/validateCreditModal.svelte b/src/lib/components/billing/validateCreditModal.svelte index e73ea2949..9b2f02691 100644 --- a/src/lib/components/billing/validateCreditModal.svelte +++ b/src/lib/components/billing/validateCreditModal.svelte @@ -58,6 +58,7 @@ placeholder="Promo code" id="code" label="Add promo code" + autofocus bind:value={coupon} /> diff --git a/src/lib/components/feedback/evaluation.svelte b/src/lib/components/feedback/evaluation.svelte index deaad320f..5aafc8902 100644 --- a/src/lib/components/feedback/evaluation.svelte +++ b/src/lib/components/feedback/evaluation.svelte @@ -1,7 +1,17 @@
@@ -10,7 +20,12 @@ style="padding-block: 0.13rem"> {#each Array(11) as _, i}
  • - (value = i)}> + (value = i)}> {i}
  • diff --git a/src/lib/components/feedback/feedbackGeneral.svelte b/src/lib/components/feedback/feedbackGeneral.svelte index a60f65f01..a74ff90be 100644 --- a/src/lib/components/feedback/feedbackGeneral.svelte +++ b/src/lib/components/feedback/feedbackGeneral.svelte @@ -1,11 +1,22 @@ diff --git a/src/lib/components/modal.svelte b/src/lib/components/modal.svelte index 2eb562336..6db9a61f1 100644 --- a/src/lib/components/modal.svelte +++ b/src/lib/components/modal.svelte @@ -14,6 +14,7 @@ }; export let title = ''; export let hideFooter = false; + export let autoFocus = true; let alert: HTMLElement; @@ -26,6 +27,44 @@ $: if (error) { alert?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' }); } + + $: if (show && autoFocus) { + setTimeout(() => { + focusFirstElement(); + }, 100); + } + + function focusFirstElement() { + const modalDialog = document.querySelector('dialog[open]') as HTMLElement; + if (!modalDialog) return; + + const autofocusElement = modalDialog.querySelector('[autofocus]') as HTMLElement; + if (autofocusElement) { + autofocusElement.focus(); + return; + } + const activeElement = document.activeElement; + if (activeElement && modalDialog.contains(activeElement)) { + return; + } + const focusableSelectors = [ + 'input:not([disabled]):not([readonly]):not([type="hidden"])', + 'textarea:not([disabled]):not([readonly])', + 'select:not([disabled])', + 'button:not([disabled])', + 'a[href]:not([disabled])', + '[tabindex]:not([tabindex="-1"]):not([disabled])', + '.card-selector:not([disabled])', + '[role="button"]:not([disabled])', + '[role="link"]:not([disabled])', + '[contenteditable="true"]:not([disabled])' + ].join(', '); + + const firstFocusable = modalDialog.querySelector(focusableSelectors) as HTMLElement; + if (firstFocusable) { + firstFocusable.focus(); + } + }
    diff --git a/src/lib/layout/createProject.svelte b/src/lib/layout/createProject.svelte index 1f75e59b1..1bf014d0a 100644 --- a/src/lib/layout/createProject.svelte +++ b/src/lib/layout/createProject.svelte @@ -1,4 +1,5 @@ @@ -34,6 +59,7 @@ label="Name" placeholder="Project name" required + autofocus bind:value={projectName} /> {#if !showCustomId}
    diff --git a/src/routes/(console)/onboarding/create-organization/+page.svelte b/src/routes/(console)/onboarding/create-organization/+page.svelte index 0118c0e3c..fd7c4c257 100644 --- a/src/routes/(console)/onboarding/create-organization/+page.svelte +++ b/src/routes/(console)/onboarding/create-organization/+page.svelte @@ -1,4 +1,5 @@ - {#if ['processing'].includes(status)} - - - 0s - - - - {:else if ['building'].includes(status)} + {#if ['processing, building'].includes(status)}

    From 652b4bfa67fd6f0d47de0ef75adf0b208db23c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Thu, 26 Jun 2025 15:49:28 +0200 Subject: [PATCH 13/43] Update src/routes/(console)/project-[region]-[project]/sites/(components)/logsTimer.svelte --- .../sites/(components)/logsTimer.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/logsTimer.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/logsTimer.svelte index 0d4d89f37..204ce91ec 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/(components)/logsTimer.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/logsTimer.svelte @@ -10,7 +10,7 @@ - {#if ['processing, building'].includes(status)} + {#if ['processing', 'building'].includes(status)}

    From d7d29bf4596afdeb00eb535e3b294175c8131f08 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 26 Jun 2025 19:59:52 +0530 Subject: [PATCH 14/43] fix: usage calc on function. --- .../function-[function]/usage/[[period]]/+page.svelte | 8 +++++++- .../function-[function]/usage/[[period]]/+page.ts | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte index 30c05dd10..705478db7 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.svelte @@ -9,6 +9,12 @@ $: count = data.executions; $: gbHoursTotal = data.executionsMbSecondsTotal / 1000 / 3600; $: mbSecondsCount = data.executionsMbSeconds; + $: gbHoursCount = data.executionsMbSeconds + ?.map((metric) => ({ + ...metric, + value: metric.value / 1000 / 3600 + })) + .filter(({ value }) => value); @@ -33,7 +39,7 @@ title: 'Total GB hours' }} total={gbHoursTotal} - count={mbSecondsCount} /> + count={gbHoursCount} /> {/if}
    diff --git a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts index a802c1c30..041a37dbd 100644 --- a/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/functions/function-[function]/usage/[[period]]/+page.ts @@ -7,6 +7,7 @@ export const load: PageLoad = async ({ params }) => { const period = isValueOfStringEnum(FunctionUsageRange, params.period) ? params.period : FunctionUsageRange.ThirtyDays; + return sdk .forProject(params.region, params.project) .functions.getUsage(params.function, period); From ca208252500073267d755fb647bb7e75719d5ac1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 27 Jun 2025 12:15:53 +0530 Subject: [PATCH 15/43] fix: column selector bug. --- src/lib/components/columnSelector.svelte | 67 +++++++++++-------- src/lib/stores/preferences.ts | 25 +++---- .../collection-[collection]/+page.svelte | 6 +- .../attributes/deleteAttribute.svelte | 20 +++++- .../createAttribute.svelte | 14 ++-- .../settings/displayName.svelte | 3 +- .../collection-[collection]/table.svelte | 2 +- 7 files changed, 87 insertions(+), 50 deletions(-) diff --git a/src/lib/components/columnSelector.svelte b/src/lib/components/columnSelector.svelte index 87351c126..42db1b9b5 100644 --- a/src/lib/components/columnSelector.svelte +++ b/src/lib/components/columnSelector.svelte @@ -31,49 +31,62 @@ } }; - onMount(async () => { + const saveColumnPreferences = () => { + const shownColumns = $columns.filter((n) => n.hide !== true).map((n) => n.id); + if (isCustomCollection) { - const prefs = preferences.getCustomCollectionColumns(page.params.collection); - columns.set( - $columns.map((column) => { - column.hide = prefs?.includes(column.id) ?? false; + preferences.setCustomCollectionColumns(page.params.collection, shownColumns); + } else { + preferences.setColumns(shownColumns); + } + }; + + onMount(() => { + if (isCustomCollection) { + const shownColumns = preferences.getCustomCollectionColumns(page.params.collection); + + columns.update((columns) => { + return columns.map((column) => { + column.hide = !shownColumns.includes(column.id); return column; - }) - ); + }); + }); } else { const prefs = preferences.get(page.route); - // Override the shown columns only if a preference was set - if (prefs?.columns) { - columns.set( - $columns.map((column) => { - column.hide = prefs.columns?.includes(column.id) ?? false; + if (prefs?.columns && prefs.columns.length > 0) { + columns.update((cols) => { + return cols.map((column) => { + column.hide = !prefs.columns.includes(column.id); return column; - }) - ); + }); + }); } } - columns.subscribe((ctx) => { - const columns = ctx.filter((n) => n.hide === true).map((n) => n.id); - - if (isCustomCollection) { - preferences.setCustomCollectionColumns(columns); - } else { - preferences.setColumns(columns); - } - }); - calcMaxHeight(); }); let selectedColumnsNumber = $derived( $columns.reduce((acc, column) => { - if (column.hide === true) return acc; + if (column.hide) return acc; return ++acc; }, 0) ); + + function toggleColumn(column: Column) { + columns.update((cols) => + cols.map((col) => { + if (col.id === column.id) { + col.hide = !column.hide; + } + return col; + }) + ); + + saveColumnPreferences(); + } @@ -86,7 +99,7 @@ {#each $columns as column} {#if !column?.exclude} (column.hide = !column.hide)} + on:click={() => toggleColumn(column)} disabled={allowNoColumns ? false : selectedColumnsNumber <= 1 && column.hide !== true}> @@ -94,7 +107,7 @@ (column.hide = !column.hide)} /> + on:click={() => toggleColumn(column)} /> {column.title}
    diff --git a/src/lib/stores/preferences.ts b/src/lib/stores/preferences.ts index 8513fa9c2..98911f7a7 100644 --- a/src/lib/stores/preferences.ts +++ b/src/lib/stores/preferences.ts @@ -4,7 +4,6 @@ import type { Page } from '@sveltejs/kit'; import { get, writable } from 'svelte/store'; import { sdk } from './sdk'; import type { Models } from '@appwrite.io/console'; -import { organization } from './organization'; import { page } from '$app/state'; import { user } from '$lib/stores/user'; import deepEqual from 'deep-equal'; @@ -30,7 +29,7 @@ type PreferencesStore = { } & { hideAiDisclaimer?: boolean }; async function updateConsolePreferences(store: PreferencesStore): Promise { - const currentPreferences = get(user).prefs ?? (await sdk.forConsole.account.getPrefs()); + const currentPreferences = get(user)?.prefs ?? (await sdk.forConsole.account.getPrefs()); if (!currentPreferences?.console || Array.isArray(currentPreferences.console)) { currentPreferences.console = {}; } @@ -79,9 +78,9 @@ function createPreferences() { let newPrefsSnapshot: PreferencesStore; update((currentPrefs) => { - oldPrefsSnapshot = currentPrefs; + oldPrefsSnapshot = structuredClone(currentPrefs); callback(currentPrefs); - newPrefsSnapshot = currentPrefs; + newPrefsSnapshot = structuredClone(currentPrefs); return currentPrefs; }); @@ -149,16 +148,14 @@ function createPreferences() { return n; }), - setCustomCollectionColumns: (columns: Preferences['columns']) => + setCustomCollectionColumns: (collectionId: string, columns: Preferences['columns']) => updateAndSync((n) => { - const collection = page.params.collection; - if (!n?.collections?.[collection]) { + if (!n?.collections?.[collectionId]) { n ??= {}; n.collections ??= {}; } - n.collections[collection] = columns; - + n.collections[collectionId] = Array.from(new Set(columns)); return n; }), loadTeamPrefs: async (id: string) => { @@ -173,8 +170,11 @@ function createPreferences() { getDisplayNames: () => { return preferences?.displayNames ?? {}; }, - setDisplayNames: async (collectionId: string, names: TeamPreferences['names']) => { - const id = get(organization).$id; + setDisplayNames: async ( + orgId: string, + collectionId: string, + names: TeamPreferences['names'] + ) => { let teamPrefs: Models.Preferences; update((n) => { if (!n?.displayNames) { @@ -187,7 +187,8 @@ function createPreferences() { return n; }); - await sdk.forConsole.teams.updatePrefs(id, teamPrefs); + + await sdk.forConsole.teams.updatePrefs(orgId, teamPrefs); } }; } 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 289cb6368..33954aad2 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 @@ -40,7 +40,7 @@ id: attribute.key, title: attribute.key, type: attribute.type as ColumnType, - show: selected?.includes(attribute.key) ?? true, + hide: !selected?.includes(attribute.key), array: attribute?.array, format: 'format' in attribute && attribute?.format === 'enum' ? attribute.format : null, elements: 'elements' in attribute ? attribute.elements : null @@ -51,7 +51,7 @@ ...['$id', '$createdAt', '$updatedAt'].map((id) => ({ id, title: id, - show: true, + hide: false, type: (id === '$id' ? 'string' : 'datetime') as ColumnType })) ]); @@ -99,7 +99,7 @@ disabled={!(hasAttributes && hasValidAttributes)} analyticsSource="database_documents" /> - + {#if flags.showCsvImport(data)} @@ -178,7 +186,9 @@ { + on:click={(e) => { + e.stopPropagation(); + e.preventDefault(); selectedFile = file; showDelete = true; }}> diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte index 944a12b11..b9d9e6e7a 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte @@ -6,6 +6,8 @@ import { createEventDispatcher } from 'svelte'; import { page } from '$app/state'; import type { Models } from '@appwrite.io/console'; + import { calculateSize } from '$lib/helpers/sizeConvertion'; + import { Typography, Layout } from '@appwrite.io/pink-svelte'; export let file: Models.File; export let showDelete = false; @@ -32,5 +34,30 @@ - Are you sure you want to delete {file.name}? + + + Are you sure you want to delete the following file? + + +
    + + {file.name} + + + {file.mimeType} + + + + {calculateSize(file.sizeOriginal)} + + + +
    + + + This action cannot be undone. The file will be permanently deleted from your storage + bucket. + +
    From 439617a75c0571c4054b892a88d7789b13f1d392 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Fri, 27 Jun 2025 13:46:16 +0530 Subject: [PATCH 20/43] resolve file deletion navigation issue and chnaged delete model ui back to original --- .../storage/bucket-[bucket]/deleteFile.svelte | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte index b9d9e6e7a..2008ccdc4 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/bucket-[bucket]/deleteFile.svelte @@ -6,8 +6,6 @@ import { createEventDispatcher } from 'svelte'; import { page } from '$app/state'; import type { Models } from '@appwrite.io/console'; - import { calculateSize } from '$lib/helpers/sizeConvertion'; - import { Typography, Layout } from '@appwrite.io/pink-svelte'; export let file: Models.File; export let showDelete = false; @@ -34,30 +32,5 @@ - - - Are you sure you want to delete the following file? - - -
    - - {file.name} - - - {file.mimeType} - - - - {calculateSize(file.sizeOriginal)} - - - -
    - - - This action cannot be undone. The file will be permanently deleted from your storage - bucket. - -
    +

    Are you sure you want to delete {file.name}?

    From f26a0808a3b70165d78fe0e78bedc4c4b747e8b7 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Fri, 27 Jun 2025 17:46:50 +0530 Subject: [PATCH 21/43] fix:added focus for other buttons still need to add for others --- src/lib/components/feedback/evaluation.svelte | 10 ----- src/lib/components/modal.svelte | 39 ------------------- src/lib/layout/createProject.svelte | 25 ------------ .../create-organization/+page.svelte | 1 + .../create-organization/+page.svelte | 24 ------------ .../onboarding/create-project/+page.svelte | 24 ------------ .../createMember.svelte | 3 +- .../members/+page.svelte | 2 +- .../auth/createUser.svelte | 2 +- .../teams/team-[team]/createMembership.svelte | 2 +- 10 files changed, 6 insertions(+), 126 deletions(-) diff --git a/src/lib/components/feedback/evaluation.svelte b/src/lib/components/feedback/evaluation.svelte index 5aafc8902..1b04a3f81 100644 --- a/src/lib/components/feedback/evaluation.svelte +++ b/src/lib/components/feedback/evaluation.svelte @@ -1,17 +1,7 @@
    diff --git a/src/lib/components/modal.svelte b/src/lib/components/modal.svelte index 6db9a61f1..2eb562336 100644 --- a/src/lib/components/modal.svelte +++ b/src/lib/components/modal.svelte @@ -14,7 +14,6 @@ }; export let title = ''; export let hideFooter = false; - export let autoFocus = true; let alert: HTMLElement; @@ -27,44 +26,6 @@ $: if (error) { alert?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' }); } - - $: if (show && autoFocus) { - setTimeout(() => { - focusFirstElement(); - }, 100); - } - - function focusFirstElement() { - const modalDialog = document.querySelector('dialog[open]') as HTMLElement; - if (!modalDialog) return; - - const autofocusElement = modalDialog.querySelector('[autofocus]') as HTMLElement; - if (autofocusElement) { - autofocusElement.focus(); - return; - } - const activeElement = document.activeElement; - if (activeElement && modalDialog.contains(activeElement)) { - return; - } - const focusableSelectors = [ - 'input:not([disabled]):not([readonly]):not([type="hidden"])', - 'textarea:not([disabled]):not([readonly])', - 'select:not([disabled])', - 'button:not([disabled])', - 'a[href]:not([disabled])', - '[tabindex]:not([tabindex="-1"]):not([disabled])', - '.card-selector:not([disabled])', - '[role="button"]:not([disabled])', - '[role="link"]:not([disabled])', - '[contenteditable="true"]:not([disabled])' - ].join(', '); - - const firstFocusable = modalDialog.querySelector(focusableSelectors) as HTMLElement; - if (firstFocusable) { - firstFocusable.focus(); - } - } diff --git a/src/lib/layout/createProject.svelte b/src/lib/layout/createProject.svelte index 1bf014d0a..856eea30f 100644 --- a/src/lib/layout/createProject.svelte +++ b/src/lib/layout/createProject.svelte @@ -1,5 +1,4 @@ diff --git a/src/routes/(console)/create-organization/+page.svelte b/src/routes/(console)/create-organization/+page.svelte index a45c2cdc3..7cb126160 100644 --- a/src/routes/(console)/create-organization/+page.svelte +++ b/src/routes/(console)/create-organization/+page.svelte @@ -186,6 +186,7 @@ bind:value={name} label="Organization name" placeholder="Enter organization name" + autofocus id="name" required />
    diff --git a/src/routes/(console)/onboarding/create-organization/+page.svelte b/src/routes/(console)/onboarding/create-organization/+page.svelte index fd7c4c257..a5cfa3a3d 100644 --- a/src/routes/(console)/onboarding/create-organization/+page.svelte +++ b/src/routes/(console)/onboarding/create-organization/+page.svelte @@ -1,5 +1,4 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte index ab227bb65..35fb78e81 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/teams/team-[team]/createMembership.svelte @@ -52,7 +52,7 @@ label="Email" placeholder="Enter email" required={true} - autofocus={true} + autofocus bind:value={email} /> From 6129f84da8303ddd89a4434f0392449e80e4ed84 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Fri, 27 Jun 2025 10:54:51 -0700 Subject: [PATCH 22/43] fix: hide estimated costs in project breakdown Since the backend doesn't return the estimated cost, the Console shows 0 for every estimated cost. As an interim, this PR hides the column rather than showing incorrect data. --- .../usage/[[invoice]]/ProjectBreakdown.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte index f1141f2c8..98a028282 100644 --- a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte +++ b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/ProjectBreakdown.svelte @@ -115,7 +115,7 @@ { id: 'reads', hide: !databaseOperationMetric }, { id: 'writes', hide: !databaseOperationMetric }, { id: 'metric', hide: !!databaseOperationMetric }, - { id: 'costs' } + { id: 'costs', hide: true } ]} let:root> From a89b03d5eb1e528483c73f2c6766a809de56c9a1 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Fri, 27 Jun 2025 15:27:54 -0700 Subject: [PATCH 23/43] fix: add $id, $createdAt, and $updatedAt to documents filter This was added before, but must have regressed due to merge conflicts. --- .../database-[database]/collection-[collection]/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 33954aad2..291617ca2 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 @@ -95,7 +95,7 @@ From 7576993357238875121ea8def9f6f7df5feb6136 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 29 Jun 2025 11:08:41 +0530 Subject: [PATCH 24/43] fix: payment methods not updated after adding it. --- src/lib/components/billing/paymentModal.svelte | 2 +- .../components/billing/selectPaymentMethod.svelte | 15 +++++++++++++-- .../change-plan/+page.svelte | 6 +++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/lib/components/billing/paymentModal.svelte b/src/lib/components/billing/paymentModal.svelte index 9ef191311..c79602517 100644 --- a/src/lib/components/billing/paymentModal.svelte +++ b/src/lib/components/billing/paymentModal.svelte @@ -21,7 +21,7 @@ try { const card = await submitStripeCard(name, page?.params?.organization ?? null); modal.closeModal(); - invalidate(Dependencies.PAYMENT_METHODS); + await invalidate(Dependencies.PAYMENT_METHODS); dispatch('submit', card); addNotification({ type: 'success', diff --git a/src/lib/components/billing/selectPaymentMethod.svelte b/src/lib/components/billing/selectPaymentMethod.svelte index 9a7265c8b..d036db8ee 100644 --- a/src/lib/components/billing/selectPaymentMethod.svelte +++ b/src/lib/components/billing/selectPaymentMethod.svelte @@ -20,8 +20,19 @@ async function cardSaved(event: CustomEvent) { value = event.detail.$id; - invalidate(Dependencies.UPGRADE_PLAN); - invalidate(Dependencies.CREATE_ORGANIZATION); + + if (value) { + methods = { + ...methods, + total: methods.total + 1, + paymentMethods: [...methods.paymentMethods, event.detail] + }; + } + + await Promise.all([ + invalidate(Dependencies.UPGRADE_PLAN), + invalidate(Dependencies.CREATE_ORGANIZATION) + ]); } onMount(() => { diff --git a/src/routes/(console)/organization-[organization]/change-plan/+page.svelte b/src/routes/(console)/organization-[organization]/change-plan/+page.svelte index f31095d81..f10c5a14f 100644 --- a/src/routes/(console)/organization-[organization]/change-plan/+page.svelte +++ b/src/routes/(console)/organization-[organization]/change-plan/+page.svelte @@ -338,12 +338,12 @@
    - {:then paymentMethods} + {:then _}
    + bind:methods={paymentMethods}> {#if !selectedCoupon?.code} {#if paymentMethodId} From 035afa78ecb7187212efdff743f2cbe575749fbf Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 29 Jun 2025 19:51:47 +0530 Subject: [PATCH 25/43] fix: back nav from change-plan. --- src/lib/layout/wizard.svelte | 6 ++++-- .../change-plan/+page.svelte | 6 +----- .../usage/[[invoice]]/totalMembers.svelte | 2 +- .../auth/security/updateSessionLength.svelte | 10 ++++++---- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lib/layout/wizard.svelte b/src/lib/layout/wizard.svelte index 3cf61a924..8a0d696b0 100644 --- a/src/lib/layout/wizard.svelte +++ b/src/lib/layout/wizard.svelte @@ -50,7 +50,7 @@ if (confirmExit) { showExitModal = true; } else { - goto(href); + goBack(); trackEvent('wizard_exit', { from: 'escape' }); @@ -58,6 +58,8 @@ } } + const goBack = () => goto(href); + onMount(() => ($isNewWizardStatusOpen = true)); onDestroy(() => ($isNewWizardStatusOpen = false)); @@ -77,7 +79,7 @@ if (confirmExit) { showExitModal = true; } else { - goto(href); + goBack(); trackEvent('wizard_exit', { from: 'button' }); diff --git a/src/routes/(console)/organization-[organization]/change-plan/+page.svelte b/src/routes/(console)/organization-[organization]/change-plan/+page.svelte index f31095d81..b7619a0ef 100644 --- a/src/routes/(console)/organization-[organization]/change-plan/+page.svelte +++ b/src/routes/(console)/organization-[organization]/change-plan/+page.svelte @@ -271,11 +271,7 @@ Change plan - Appwrite - +
    diff --git a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/totalMembers.svelte b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/totalMembers.svelte index 1609ddbf6..15176735f 100644 --- a/src/routes/(console)/organization-[organization]/usage/[[invoice]]/totalMembers.svelte +++ b/src/routes/(console)/organization-[organization]/usage/[[invoice]]/totalMembers.svelte @@ -52,7 +52,7 @@ - + {#snippet children(paginatedItems: typeof members.memberships)} diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionLength.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionLength.svelte index 14edb541c..295ce51c6 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionLength.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionLength.svelte @@ -7,11 +7,13 @@ import { createTimeUnitPair } from '$lib/helpers/unit'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; - import { project } from '../../store'; + import { project as projectStore } from '../../store'; import { Layout } from '@appwrite.io/pink-svelte'; + import { page } from '$app/state'; - const { value, unit, baseValue, units } = createTimeUnitPair($project?.authDuration); - const options = units.map((v) => ({ label: v.name, value: v.name })); + const project = $derived($projectStore ?? page.data?.project); + const { value, unit, baseValue, units } = $derived(createTimeUnitPair(project?.authDuration)); + const options = $derived(units.map((v) => ({ label: v.name, value: v.name }))); async function updateSessionLength() { try { @@ -43,7 +45,7 @@ - From a986b691e1e27047c40bac6920a28242554f7b07 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 29 Jun 2025 20:00:57 +0530 Subject: [PATCH 26/43] fix: check. --- .../organization-[organization]/change-plan/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/organization-[organization]/change-plan/+page.svelte b/src/routes/(console)/organization-[organization]/change-plan/+page.svelte index f10c5a14f..0f2a414ea 100644 --- a/src/routes/(console)/organization-[organization]/change-plan/+page.svelte +++ b/src/routes/(console)/organization-[organization]/change-plan/+page.svelte @@ -338,7 +338,7 @@
    - {:then _} + {:then}
    Date: Mon, 30 Jun 2025 09:37:09 +0530 Subject: [PATCH 27/43] fix: regression from @2043. --- src/routes/(console)/project-[region]-[project]/+layout.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/+layout.ts b/src/routes/(console)/project-[region]-[project]/+layout.ts index a0cd52c69..c1fb52045 100644 --- a/src/routes/(console)/project-[region]-[project]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/+layout.ts @@ -34,7 +34,9 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => { // fetch if not available in `plansInfo` includedInBasePlans ? plansInfo.get(organization.billingPlan) - : sdk.forConsole.billing.getOrganizationPlan(organization.$id), + : isCloud + ? sdk.forConsole.billing.getOrganizationPlan(organization.$id) + : null, loadAvailableRegions(project.teamId) ]); From c36dd1d0b0d9fa4d117aea84351bcd405e7403b1 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 30 Jun 2025 10:48:25 +0530 Subject: [PATCH 28/43] fix: invalidation issue causing null organization on project's first creation. --- .../billing/selectPaymentMethod.svelte | 2 +- src/lib/components/breadcrumbs.svelte | 3 ++- src/routes/(console)/+layout.svelte | 22 +++++++++++-------- .../(console)/create-organization/+page.ts | 3 ++- .../create-organization/+page.svelte | 8 +++++-- src/routes/+layout.ts | 1 + 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/lib/components/billing/selectPaymentMethod.svelte b/src/lib/components/billing/selectPaymentMethod.svelte index d036db8ee..30e5ea254 100644 --- a/src/lib/components/billing/selectPaymentMethod.svelte +++ b/src/lib/components/billing/selectPaymentMethod.svelte @@ -31,7 +31,7 @@ await Promise.all([ invalidate(Dependencies.UPGRADE_PLAN), - invalidate(Dependencies.CREATE_ORGANIZATION) + invalidate(Dependencies.ORGANIZATION) ]); } diff --git a/src/lib/components/breadcrumbs.svelte b/src/lib/components/breadcrumbs.svelte index cbe0799c3..e29c4c8d0 100644 --- a/src/lib/components/breadcrumbs.svelte +++ b/src/lib/components/breadcrumbs.svelte @@ -101,7 +101,8 @@ async function createProjectsBottomSheet(organization: Organization): Promise { isLoadingProjects = true; - loadedProjects = await projects; + // null on non-org/project path like `onboarding`. + loadedProjects = (await projects) ?? loadedProjects; isLoadingProjects = false; const createProjectItem = { diff --git a/src/routes/(console)/+layout.svelte b/src/routes/(console)/+layout.svelte index 4a6d3ac3b..452847d49 100644 --- a/src/routes/(console)/+layout.svelte +++ b/src/routes/(console)/+layout.svelte @@ -316,15 +316,19 @@ $: checkForUsageLimits($organization); - $: projects = sdk.forConsole.projects.list([ - Query.equal( - 'teamId', - // id from page params ?? id from store ?? id from preferences - page.params.organization ?? currentOrganizationId ?? data.currentOrgId - ), - Query.limit(5), - Query.orderDesc('$updatedAt') - ]); + $: isOnOnboarding = page.route?.id?.includes('/(console)/onboarding'); + + $: projects = isOnOnboarding + ? null + : sdk.forConsole.projects.list([ + Query.equal( + 'teamId', + // id from page params ?? id from store ?? id from preferences + page.params.organization ?? currentOrganizationId ?? data.currentOrgId + ), + Query.limit(5), + Query.orderDesc('$updatedAt') + ]); $: if ($requestedMigration) { openMigrationWizard(); diff --git a/src/routes/(console)/create-organization/+page.ts b/src/routes/(console)/create-organization/+page.ts index f6f9eeb7f..9aba3aefd 100644 --- a/src/routes/(console)/create-organization/+page.ts +++ b/src/routes/(console)/create-organization/+page.ts @@ -5,8 +5,9 @@ import type { Coupon } from '$lib/sdk/billing'; import type { Organization } from '$lib/stores/organization'; export const load: PageLoad = async ({ url, parent, depends }) => { - depends(Dependencies.CREATE_ORGANIZATION); const { organizations } = await parent(); + depends(Dependencies.CREATE_ORGANIZATION); + const [coupon, paymentMethods] = await Promise.all([ getCoupon(url), sdk.forConsole.billing.listPaymentMethods() diff --git a/src/routes/(console)/onboarding/create-organization/+page.svelte b/src/routes/(console)/onboarding/create-organization/+page.svelte index 0118c0e3c..73524af47 100644 --- a/src/routes/(console)/onboarding/create-organization/+page.svelte +++ b/src/routes/(console)/onboarding/create-organization/+page.svelte @@ -2,14 +2,14 @@ import { isCloud } from '$lib/system'; import { sdk } from '$lib/stores/sdk'; import { ID } from '@appwrite.io/console'; - import { BillingPlan } from '$lib/constants'; + import { BillingPlan, Dependencies } from '$lib/constants'; import { tierToPlan } from '$lib/stores/billing'; import { addNotification } from '$lib/stores/notifications'; import { loadAvailableRegions } from '$routes/(console)/regions'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { Button, Card, Layout, Input, Typography, Spinner } from '@appwrite.io/pink-svelte'; import { Form } from '$lib/elements/forms/index.js'; - import { goto } from '$app/navigation'; + import { goto, invalidate } from '$app/navigation'; import { base } from '$app/paths'; let isLoading = false; @@ -47,6 +47,10 @@ if (organization) { loadAvailableRegions(organization?.$id).then(); await goto(`${base}/organization-${organization.$id}`); + + // fixes an edge case where + // the org is not available for some reason! + await invalidate(Dependencies.CREATE_ORGANIZATION); } isLoading = false; } diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts index 78d86d2e4..21fe42dde 100644 --- a/src/routes/+layout.ts +++ b/src/routes/+layout.ts @@ -16,6 +16,7 @@ export const ssr = false; export const load: LayoutLoad = async ({ depends, url, route }) => { depends(Dependencies.ACCOUNT); + depends(Dependencies.CREATE_ORGANIZATION); const [account, error] = (await sdk.forConsole.account .get() From af6d3f9fe9a0f197173d8dfb538dd83cc515d4a8 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 30 Jun 2025 10:55:36 +0530 Subject: [PATCH 29/43] fix: test as per new logic. --- e2e/journeys/upgrade-free-tier.spec.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/e2e/journeys/upgrade-free-tier.spec.ts b/e2e/journeys/upgrade-free-tier.spec.ts index 76d5fafcd..80802f499 100644 --- a/e2e/journeys/upgrade-free-tier.spec.ts +++ b/e2e/journeys/upgrade-free-tier.spec.ts @@ -11,7 +11,12 @@ test('upgrade - free tier', async ({ page }) => { await page.waitForURL(/\/organization-[^/]+\/change-plan/); await page.locator('input[value="tier-1"]').click(); await page.getByRole('button', { name: 'add' }).first().click(); + await enterCreditCard(page); + + // wait for a second after adding a card to update the UI. + await page.waitForSelector('button#method[role="combobox"]'); + // skip members await page.getByRole('button', { name: 'change plan' }).click(); await page.waitForURL(/\/console\/project-(?:[a-z0-9]+-)?([^/]+)\/get-started/); From b26833ec89bfdf83dce8fd8004eec47414418518 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 11:45:20 +0530 Subject: [PATCH 30/43] fix:added autofocus to all components that need it --- src/lib/components/feedback/feedbackGeneral.svelte | 2 +- .../organization-[organization]/createMember.svelte | 2 +- .../(console)/project-[region]-[project]/auth/+page.svelte | 4 ++-- .../project-[region]-[project]/auth/createUser.svelte | 2 +- .../messaging/create-[type]/(type)/email.svelte | 1 + .../messaging/create-[type]/(type)/push.svelte | 1 + .../messaging/create-[type]/(type)/sms.svelte | 1 + .../project-[region]-[project]/storage/+page.svelte | 5 +---- .../project-[region]-[project]/storage/create.svelte | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/components/feedback/feedbackGeneral.svelte b/src/lib/components/feedback/feedbackGeneral.svelte index a74ff90be..14b5d2701 100644 --- a/src/lib/components/feedback/feedbackGeneral.svelte +++ b/src/lib/components/feedback/feedbackGeneral.svelte @@ -16,7 +16,7 @@ diff --git a/src/routes/(console)/organization-[organization]/createMember.svelte b/src/routes/(console)/organization-[organization]/createMember.svelte index 2ea47fb3d..b107cf90c 100644 --- a/src/routes/(console)/organization-[organization]/createMember.svelte +++ b/src/routes/(console)/organization-[organization]/createMember.svelte @@ -26,7 +26,7 @@ name: string, error: string, role: string = isSelfHosted ? 'owner' : 'developer'; - emailInput: HTMLInputElement; + emailInput: HTMLInputElement; async function create() { try { diff --git a/src/routes/(console)/project-[region]-[project]/auth/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/+page.svelte index aa4f5702c..1f2dc4423 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/+page.svelte @@ -60,7 +60,7 @@ - @@ -173,7 +173,7 @@ href="https://appwrite.io/docs/references/cloud/server-nodejs/users" target="user" allowCreate={$canWriteUsers} - on:mousedown={() => showCreateUser.set(true)} /> + on:click={() => showCreateUser.set(true)} /> {/if} diff --git a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte index 201e85353..982c5c7e1 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte @@ -56,7 +56,7 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte index 352715d43..529265b67 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/email.svelte @@ -106,6 +106,7 @@ id="subject" label="Subject" required + autofocus={true} placeholder="Enter subject" bind:value={subject}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte index 82d12a36f..ad9af669c 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte @@ -116,6 +116,7 @@ id="title" label="Title" required + autofocus={true} placeholder="Enter title" bind:value={title}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte index e71f479f8..d2fe11dd3 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte @@ -96,6 +96,7 @@ id="message" label="Message" required + autofocus={true} maxlength={900} placeholder="Type here..." bind:value={content}> diff --git a/src/routes/(console)/project-[region]-[project]/storage/+page.svelte b/src/routes/(console)/project-[region]-[project]/storage/+page.svelte index 9d780c407..7bbac81ce 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/+page.svelte @@ -44,10 +44,7 @@ hideColumns={!data.buckets.total} hideView={!data.buckets.total} /> {#if $canWriteBuckets} - diff --git a/src/routes/(console)/project-[region]-[project]/storage/create.svelte b/src/routes/(console)/project-[region]-[project]/storage/create.svelte index fcb3ca65f..55f73bd22 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/create.svelte @@ -55,7 +55,7 @@ label="Name" placeholder="New bucket" bind:value={name} - autofocus + autofocus={true} required /> {#if !showCustomId} From 9169ce1eedd7b81398c845da9fe0f657ae98f38c Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Fri, 27 Jun 2025 19:31:23 +0530 Subject: [PATCH 31/43] updated event delegation in the delete project --- .../settings/deleteProject.svelte | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte index 3e1178251..2e43e9f04 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte @@ -11,6 +11,7 @@ import { project, projectRegion } from '../store'; import { organization } from '$lib/stores/organization'; import { Dependencies } from '$lib/constants'; + import { onDestroy, onMount } from 'svelte'; let error: string; let showDelete = false; @@ -39,6 +40,21 @@ trackError(e, Submit.ProjectDelete); } }; + + const handleKeydown = (e: KeyboardEvent) => { + if (e.key === 'Enter') { + if (name !== $project.name) e.preventDefault(); + else handleDelete(); + } + }; + + onMount(() => { + window.addEventListener('keydown', handleKeydown); + }); + + onDestroy(() => { + window.removeEventListener('keydown', handleKeydown); + }); From eb759b710df1dfc0e17501fe92dd840f7125bff9 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Mon, 30 Jun 2025 12:03:31 +0530 Subject: [PATCH 32/43] removed event handlers which may lead to bugs --- src/lib/components/confirm.svelte | 2 +- .../settings/deleteProject.svelte | 15 --------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/lib/components/confirm.svelte b/src/lib/components/confirm.svelte index fa23d1b71..3446aff0c 100644 --- a/src/lib/components/confirm.svelte +++ b/src/lib/components/confirm.svelte @@ -1,6 +1,6 @@ From 20fd52aa9731bd90adfb0b658a74d927cf21e272 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Mon, 30 Jun 2025 12:22:16 +0530 Subject: [PATCH 33/43] replaced Dialog with Modal in the confirm --- src/lib/components/confirm.svelte | 6 +++--- .../settings/deleteProject.svelte | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lib/components/confirm.svelte b/src/lib/components/confirm.svelte index 3446aff0c..f26953c3e 100644 --- a/src/lib/components/confirm.svelte +++ b/src/lib/components/confirm.svelte @@ -1,6 +1,6 @@ - + {#if error} - + diff --git a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte index edb35e681..3e1178251 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte @@ -39,7 +39,6 @@ trackError(e, Submit.ProjectDelete); } }; - From e67e741e139adc618ff57557a9a6c011d02cee26 Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Mon, 30 Jun 2025 12:31:34 +0530 Subject: [PATCH 34/43] use console version of the Modal --- src/lib/components/confirm.svelte | 77 +++++++++++++------------------ 1 file changed, 31 insertions(+), 46 deletions(-) diff --git a/src/lib/components/confirm.svelte b/src/lib/components/confirm.svelte index f26953c3e..6ee260756 100644 --- a/src/lib/components/confirm.svelte +++ b/src/lib/components/confirm.svelte @@ -1,12 +1,11 @@ -
    - - - {#if error} - { - error = null; - }}> - {error} - - {/if} + + + {#if confirmDeletion} + This action is irreversible. Please confirm to proceed. + {/if} + - - + + - {#if confirmDeletion} - - {/if} - - + {#if confirmDeletion} + + {/if} + - - - - - {#if canDelete} - - {/if} - - - - -
    + + + + + From ccf429e42bfc826d1ad631767386074577867dcc Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Mon, 30 Jun 2025 12:43:40 +0530 Subject: [PATCH 35/43] used Modal in the delete project --- src/lib/components/confirm.svelte | 77 +++++++++++-------- .../settings/deleteProject.svelte | 44 ++++++----- 2 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/lib/components/confirm.svelte b/src/lib/components/confirm.svelte index 6ee260756..fa23d1b71 100644 --- a/src/lib/components/confirm.svelte +++ b/src/lib/components/confirm.svelte @@ -1,11 +1,12 @@ - - - {#if confirmDeletion} - This action is irreversible. Please confirm to proceed. - {/if} - +
    + + + {#if error} + { + error = null; + }}> + {error} + + {/if} - - + + - {#if confirmDeletion} - - {/if} - + {#if confirmDeletion} + + {/if} + + - - - - - + + + + + {#if canDelete} + + {/if} + + + + +
    diff --git a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte index 3e1178251..8f58048da 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte @@ -1,8 +1,9 @@ diff --git a/src/lib/components/navbar.svelte b/src/lib/components/navbar.svelte index b1932715e..c87845b4e 100644 --- a/src/lib/components/navbar.svelte +++ b/src/lib/components/navbar.svelte @@ -51,7 +51,7 @@ import { base } from '$app/paths'; import { logout } from '$lib/helpers/logout'; import { app } from '$lib/stores/app'; - import { isTabletViewport } from '$lib/stores/viewport'; + import { isTabletViewport, isSmallViewport } from '$lib/stores/viewport'; import { isCloud } from '$lib/system.js'; import { user } from '$lib/stores/user'; import { Click, trackEvent } from '$lib/actions/analytics'; @@ -166,20 +166,22 @@ >Upgrade {/if} - - { - toggleFeedback(); - trackEvent(Click.FeedbackSubmitClick, { source: 'top_nav' }); - }} - >Feedback - - - - - + {#if !$isSmallViewport} + + { + toggleFeedback(); + trackEvent(Click.FeedbackSubmitClick, { source: 'top_nav' }); + }} + >Feedback + + + + + + {/if} Feedback - + {#if $isSmallViewport} + + {/if} @@ -329,7 +331,9 @@ >Feedback - + {#if $isSmallViewport} + + {/if} diff --git a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte index 982c5c7e1..201e85353 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/createUser.svelte @@ -56,7 +56,7 @@ - + diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte index ad9af669c..41e481f95 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/push.svelte @@ -116,7 +116,7 @@ id="title" label="Title" required - autofocus={true} + autofocus placeholder="Enter title" bind:value={title}> diff --git a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte index d2fe11dd3..ebb0859a6 100644 --- a/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte +++ b/src/routes/(console)/project-[region]-[project]/messaging/create-[type]/(type)/sms.svelte @@ -96,7 +96,7 @@ id="message" label="Message" required - autofocus={true} + autofocus maxlength={900} placeholder="Type here..." bind:value={content}> diff --git a/src/routes/(console)/project-[region]-[project]/storage/create.svelte b/src/routes/(console)/project-[region]-[project]/storage/create.svelte index 55f73bd22..fcb3ca65f 100644 --- a/src/routes/(console)/project-[region]-[project]/storage/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/storage/create.svelte @@ -55,7 +55,7 @@ label="Name" placeholder="New bucket" bind:value={name} - autofocus={true} + autofocus required /> {#if !showCustomId} From 791861a6ee2c16f122762321098d06fb730c000d Mon Sep 17 00:00:00 2001 From: ArnabChatterjee20k Date: Mon, 30 Jun 2025 13:18:20 +0530 Subject: [PATCH 40/43] removed submission loader --- .../project-[region]-[project]/settings/deleteProject.svelte | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte index 815eeb0b8..f724fe07c 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte @@ -76,8 +76,7 @@ bind:value={name} /> - - + + From afb5d16e0d459ee08f7ce7c65f51b69b44d3d17c Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 14:26:02 +0530 Subject: [PATCH 41/43] fix: resolved minor issue and removed a unused element to solve lint error caught during check --- src/lib/components/sidebar.svelte | 25 ++++--------------- .../createMember.svelte | 1 - 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index 5019b139f..2285d4b12 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -268,11 +268,6 @@ }} >Feedback - - {#if $isSmallViewport} - - {/if} - @@ -284,11 +279,6 @@ trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); }}> Support - - - -
    @@ -330,11 +320,6 @@ }} >Feedback - - {#if $isSmallViewport} - - {/if} - @@ -346,11 +331,6 @@ trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); }}> Support - - - - @@ -361,6 +341,11 @@ +{#if $isSmallViewport} + + +{/if} + {#if subNavigation} - {:else} + {/if} + {#if $isSmallViewport}
    @@ -306,35 +307,33 @@
    {/if} - {#if project} -
    -
    - - - { - toggleFeedback(); - trackEvent('click_menu_feedback', { source: 'side_nav' }); - }} - >Feedback - - + {#if project && $isSmallViewport} +
    + + + { + toggleFeedback(); + trackEvent('click_menu_feedback', { source: 'side_nav' }); + }} + >Feedback + + - - { - $showSupportModal = true; - trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); - }}> - Support - - - -
    + + { + $showSupportModal = true; + trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); + }}> + Support + + +
    {/if}
    From 58b63960fb9e94b9803e8ff2374cff5b7085ee19 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 30 Jun 2025 18:34:42 +0530 Subject: [PATCH 43/43] fix: added else if condition instead of if --- src/lib/components/sidebar.svelte | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index bf7a559b7..59e049f60 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -255,8 +255,7 @@ - {/if} - {#if $isSmallViewport} + {:else if $isSmallViewport}
    @@ -269,6 +268,9 @@ }} >Feedback + + + @@ -280,6 +282,10 @@ trackEvent(Click.SupportOpenClick, { source: 'side_nav' }); }}> Support + + + @@ -340,11 +346,6 @@
    -{#if $isSmallViewport} - - -{/if} - {#if subNavigation}