From 1751928d1883d21b6024c72aa690a40d74d57411 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Tue, 21 Mar 2023 13:41:38 +0000 Subject: [PATCH 01/71] refactor: improve table overflow detection --- src/lib/elements/table/tableScroll.svelte | 25 ++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/lib/elements/table/tableScroll.svelte b/src/lib/elements/table/tableScroll.svelte index 814fe00e5..6d30f8aff 100644 --- a/src/lib/elements/table/tableScroll.svelte +++ b/src/lib/elements/table/tableScroll.svelte @@ -2,11 +2,28 @@ import type { Action } from 'svelte/action'; export let isSticky = false; + let isOverflowing = false; - const hasOverflow: Action void> = (node, callback) => { + const hasOverflow: Action = (node) => { const observer = new ResizeObserver((entries) => { for (const entry of entries) { - callback(entry.contentRect.width < entry.target.scrollWidth); + let overflowing = false; + if (entry.contentRect.width < entry.target.scrollWidth) { + overflowing = true; + } + + const cols = entry.target.querySelectorAll('.table-thead-col'); + for (let i = 0; i < cols.length; i++) { + const col = cols[i]; + const cs = getComputedStyle(col); + const innerWidth = + col.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight); + if (innerWidth < 32) { + overflowing = true; + } + } + + isOverflowing = overflowing; } }); @@ -18,12 +35,10 @@ } }; }; - - let isOverflowing = false;
-
(isOverflowing = v)}> +
From 815b7f27d3aa20c81ed908d385ade935fc58c198 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Mar 2023 06:40:26 +0000 Subject: [PATCH 02/71] restructure --- src/routes/console/project-[project]/settings/+page.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 4691bea04..5c2d77e5d 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -122,9 +122,10 @@ - Services -

Choose services you wish to enable or disable.

+ Configurations + Services +

Choose services you wish to enable or disable.

    From 646ace7f042534c70a5d6a2b000b1dddcd5593ae Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Mar 2023 12:52:27 +0545 Subject: [PATCH 03/71] pause resume --- .../project-[project]/settings/+page.svelte | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 5c2d77e5d..49fd03669 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -44,6 +44,36 @@ } } + async function toggleProject() { + updating = true; + try { + const path = '/projects/' + $project.$id; + await sdk.forConsole.client.call( + 'PATCH', + new URL(sdk.forConsole.client.config.endpoint + path), + { + 'content-type': 'application/json' + }, + { + paused: !($project.paused ?? false), + name: $project.name + } + ); + invalidate(Dependencies.PROJECT); + addNotification({ + type: 'success', + message: 'Project has been ' + ($project.paused ? 'resumed' : 'paused') + '.' + }); + trackEvent(Submit.ProjectUpdateName); + } catch (error) { + addNotification({ + type: 'error', + message: error.message + }); + trackError(error, Submit.ProjectUpdateName); + } + } + $: { // When project name is updated, finalize the updating flow $project.name; @@ -124,7 +154,7 @@ Configurations - Services +

    Services

    Choose services you wish to enable or disable.

    @@ -141,6 +171,14 @@
+
+
+

Pause Project

+

While paused, you will not be able to make API requests.

+
+ +
From 73a1a4c08e0e55267abe87786711546df114db50 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Mar 2023 12:57:20 +0545 Subject: [PATCH 04/71] paused tag --- src/routes/console/organization-[organization]/+page.svelte | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/routes/console/organization-[organization]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte index 888056de7..ad54b0778 100644 --- a/src/routes/console/organization-[organization]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -66,6 +66,9 @@ {project.name} + {#if project.paused} + Paused + {/if} {@const platforms = filterPlatforms( project.platforms.map((platform) => getPlatformInfo(platform.type)) From f772440c57373367206191925aba20f9162b7ccf Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Mar 2023 13:20:49 +0545 Subject: [PATCH 05/71] pause with dialog --- .../project-[project]/settings/+page.svelte | 9 +++++++++ .../settings/pauseProject.svelte | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/routes/console/project-[project]/settings/pauseProject.svelte diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 49fd03669..736775acf 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -14,12 +14,14 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import PauseProject from './pauseProject.svelte'; let name: string = null; let showDelete = false; let updating = false; const endpoint = sdk.forConsole.client.config.endpoint; const projectId = $page.params.project; + let showPause = false; onMount(async () => { name ??= $project.name; @@ -45,6 +47,10 @@ } async function toggleProject() { + if (!$project.paused && !showPause) { + showPause = true; + return; + } updating = true; try { const path = '/projects/' + $project.$id; @@ -71,6 +77,8 @@ message: error.message }); trackError(error, Submit.ProjectUpdateName); + } finally { + showPause = false; } } @@ -207,3 +215,4 @@ + diff --git a/src/routes/console/project-[project]/settings/pauseProject.svelte b/src/routes/console/project-[project]/settings/pauseProject.svelte new file mode 100644 index 000000000..0ca501486 --- /dev/null +++ b/src/routes/console/project-[project]/settings/pauseProject.svelte @@ -0,0 +1,20 @@ + + + + Delete Database +

+ Are you sure you want to pause {$project.name}? While paused, you will not be able to + make API requests. +

+ + + + +
From 4072de02644776e1fa147f5095274e15dae6d38a Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Mar 2023 14:18:59 +0545 Subject: [PATCH 06/71] typo and icon --- src/routes/console/organization-[organization]/+page.svelte | 3 ++- .../console/project-[project]/settings/pauseProject.svelte | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/routes/console/organization-[organization]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte index ad54b0778..43ae0d73e 100644 --- a/src/routes/console/organization-[organization]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -67,7 +67,8 @@ {project.name} {#if project.paused} - Paused + + {/if} {@const platforms = filterPlatforms( diff --git a/src/routes/console/project-[project]/settings/pauseProject.svelte b/src/routes/console/project-[project]/settings/pauseProject.svelte index 0ca501486..9878c337c 100644 --- a/src/routes/console/project-[project]/settings/pauseProject.svelte +++ b/src/routes/console/project-[project]/settings/pauseProject.svelte @@ -8,7 +8,7 @@ - Delete Database + Pause Project

Are you sure you want to pause {$project.name}? While paused, you will not be able to make API requests. From c2c50a59e060b8243ad35f5fce230d61dcbe09e7 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 26 Mar 2023 14:25:01 +0545 Subject: [PATCH 07/71] fix resume also has dialog --- .../project-[project]/settings/+page.svelte | 12 ++++----- .../settings/pauseProject.svelte | 20 --------------- .../settings/toggleProject.svelte | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 26 deletions(-) delete mode 100644 src/routes/console/project-[project]/settings/pauseProject.svelte create mode 100644 src/routes/console/project-[project]/settings/toggleProject.svelte diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 736775acf..6fd2e236e 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -14,14 +14,14 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; - import PauseProject from './pauseProject.svelte'; + import PauseProject from './toggleProject.svelte'; let name: string = null; let showDelete = false; let updating = false; const endpoint = sdk.forConsole.client.config.endpoint; const projectId = $page.params.project; - let showPause = false; + let showToggle = false; onMount(async () => { name ??= $project.name; @@ -47,8 +47,8 @@ } async function toggleProject() { - if (!$project.paused && !showPause) { - showPause = true; + if (!showToggle) { + showToggle = true; return; } updating = true; @@ -78,7 +78,7 @@ }); trackError(error, Submit.ProjectUpdateName); } finally { - showPause = false; + showToggle = false; } } @@ -215,4 +215,4 @@ - + diff --git a/src/routes/console/project-[project]/settings/pauseProject.svelte b/src/routes/console/project-[project]/settings/pauseProject.svelte deleted file mode 100644 index 9878c337c..000000000 --- a/src/routes/console/project-[project]/settings/pauseProject.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - Pause Project -

- Are you sure you want to pause {$project.name}? While paused, you will not be able to - make API requests. -

- - - - -
diff --git a/src/routes/console/project-[project]/settings/toggleProject.svelte b/src/routes/console/project-[project]/settings/toggleProject.svelte new file mode 100644 index 000000000..8e949e561 --- /dev/null +++ b/src/routes/console/project-[project]/settings/toggleProject.svelte @@ -0,0 +1,25 @@ + + + + {paused ? ' Resume' : 'Pause'} Project +

+ {#if paused} + Your project will be up-and-running again soon. + {:else} + Are you sure you want to pause {$project.name}? While paused, you will not be + able to make API requests. + {/if} +

+ + + + +
From 9fb6de180c3974652cb6010e42a8668e285d9fa1 Mon Sep 17 00:00:00 2001 From: Rohan kumar <51409281+rohan220217@users.noreply.github.com> Date: Fri, 31 Mar 2023 20:46:17 +0530 Subject: [PATCH 08/71] fix: session modal was not closed after successfull deletion --- .../project-[project]/auth/user-[user]/deleteSession.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/console/project-[project]/auth/user-[user]/deleteSession.svelte b/src/routes/console/project-[project]/auth/user-[user]/deleteSession.svelte index 306feb2d4..f934958b2 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/deleteSession.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/deleteSession.svelte @@ -15,6 +15,7 @@ try { await sdk.forProject.users.deleteSession($page.params.user, selectedSessionId); await invalidate(Dependencies.SESSIONS); + showDelete = false; addNotification({ type: 'success', message: 'Session has been deleted' From 401403bad9f8c5245979497a5c77458bbf550b13 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 5 Apr 2023 08:22:24 +0545 Subject: [PATCH 09/71] enable disable all services --- .../project-[project]/settings/+page.svelte | 58 +++++++++++-------- .../settings/disableAllServices.svelte | 19 ++++++ .../settings/enableAllServices.svelte | 16 +++++ .../settings/toggleProject.svelte | 25 -------- 4 files changed, 68 insertions(+), 50 deletions(-) create mode 100644 src/routes/console/project-[project]/settings/disableAllServices.svelte create mode 100644 src/routes/console/project-[project]/settings/enableAllServices.svelte delete mode 100644 src/routes/console/project-[project]/settings/toggleProject.svelte diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 6fd2e236e..a82d071c9 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -14,14 +14,16 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; - import PauseProject from './toggleProject.svelte'; + import EnableAllServices from './enableAllServices.svelte'; + import DisableAllServices from './disableAllServices.svelte'; let name: string = null; let showDelete = false; let updating = false; const endpoint = sdk.forConsole.client.config.endpoint; const projectId = $page.params.project; - let showToggle = false; + let showDisableAll = false; + let showEnableAll = false; onMount(async () => { name ??= $project.name; @@ -46,14 +48,19 @@ } } - async function toggleProject() { - if (!showToggle) { - showToggle = true; + async function toggleAllServices(status: boolean) { + if (status && !showEnableAll) { + showEnableAll = true; return; } + if (!status && !showDisableAll) { + showDisableAll = true; + return; + } + updating = true; try { - const path = '/projects/' + $project.$id; + const path = '/projects/' + $project.$id + '/service/all'; await sdk.forConsole.client.call( 'PATCH', new URL(sdk.forConsole.client.config.endpoint + path), @@ -61,24 +68,27 @@ 'content-type': 'application/json' }, { - paused: !($project.paused ?? false), - name: $project.name + status: status } ); invalidate(Dependencies.PROJECT); addNotification({ type: 'success', - message: 'Project has been ' + ($project.paused ? 'resumed' : 'paused') + '.' + message: + 'All services for' + $project.name + 'has been' + status + ? 'enabled.' + : 'disabled.' }); - trackEvent(Submit.ProjectUpdateName); + trackEvent(Submit.ProjectService); } catch (error) { addNotification({ type: 'error', message: error.message }); - trackError(error, Submit.ProjectUpdateName); + trackError(error, Submit.ProjectService); } finally { - showToggle = false; + showDisableAll = false; + showEnableAll = false; } } @@ -160,12 +170,17 @@ - Configurations + Services +

Choose services you wish to enable or disable.

-

Services

-

Choose services you wish to enable or disable.

-
+
+ | + +
+
    {#each $services.list as service} -
    -
    -

    Pause Project

    -

    While paused, you will not be able to make API requests.

    -
    - -
    @@ -215,4 +222,5 @@ - + toggleAllServices(false)} bind:show={showDisableAll} /> + toggleAllServices(true)} bind:show={showEnableAll} /> diff --git a/src/routes/console/project-[project]/settings/disableAllServices.svelte b/src/routes/console/project-[project]/settings/disableAllServices.svelte new file mode 100644 index 000000000..2774c5579 --- /dev/null +++ b/src/routes/console/project-[project]/settings/disableAllServices.svelte @@ -0,0 +1,19 @@ + + + + Disable all services +

    + Are you sure you want to disable all services? This will disable API requests to your + project. +

    + + + + +
    diff --git a/src/routes/console/project-[project]/settings/enableAllServices.svelte b/src/routes/console/project-[project]/settings/enableAllServices.svelte new file mode 100644 index 000000000..e3189a739 --- /dev/null +++ b/src/routes/console/project-[project]/settings/enableAllServices.svelte @@ -0,0 +1,16 @@ + + + + Enable all services +

    All project services will be enabled.

    + + + + +
    diff --git a/src/routes/console/project-[project]/settings/toggleProject.svelte b/src/routes/console/project-[project]/settings/toggleProject.svelte deleted file mode 100644 index 8e949e561..000000000 --- a/src/routes/console/project-[project]/settings/toggleProject.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - {paused ? ' Resume' : 'Pause'} Project -

    - {#if paused} - Your project will be up-and-running again soon. - {:else} - Are you sure you want to pause {$project.name}? While paused, you will not be - able to make API requests. - {/if} -

    - - - - -
    From d806249f3527d46e966c2a78aa9220d71d95b2f1 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 5 Apr 2023 08:28:10 +0545 Subject: [PATCH 10/71] fix white-space --- src/routes/console/project-[project]/settings/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index a82d071c9..918e08985 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -75,9 +75,9 @@ addNotification({ type: 'success', message: - 'All services for' + $project.name + 'has been' + status + 'All services for ' + $project.name + ' has been ' + (status ? 'enabled.' - : 'disabled.' + : 'disabled.') }); trackEvent(Submit.ProjectService); } catch (error) { From 3ffd2be427c18f72474fe45e8f843184dcd9447e Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 5 Apr 2023 08:28:32 +0545 Subject: [PATCH 11/71] fix whitespace --- src/routes/console/project-[project]/settings/+page.svelte | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 918e08985..b46e3bcef 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -75,9 +75,10 @@ addNotification({ type: 'success', message: - 'All services for ' + $project.name + ' has been ' + (status - ? 'enabled.' - : 'disabled.') + 'All services for ' + + $project.name + + ' has been ' + + (status ? 'enabled.' : 'disabled.') }); trackEvent(Submit.ProjectService); } catch (error) { From b9726aa0c22f566911d5ea5c869ef652d8457cd1 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 5 Apr 2023 08:52:18 +0545 Subject: [PATCH 12/71] button list --- .../console/project-[project]/settings/+page.svelte | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index b46e3bcef..193148a88 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -174,13 +174,17 @@ Services

    Choose services you wish to enable or disable.

    - -
    +
      +
    • | + >Enable all +
    • +
    • -
    + +
+
    {#each $services.list as service} From 42b60bf0f1e2796ef5ea27df6957a617e5630337 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 5 Apr 2023 09:10:19 +0545 Subject: [PATCH 13/71] service status --- .../organization-[organization]/+page.svelte | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/routes/console/organization-[organization]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte index 43ae0d73e..3d9764bf5 100644 --- a/src/routes/console/organization-[organization]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -8,6 +8,8 @@ import CreateOrganization from '../createOrganization.svelte'; import type { PageData } from './$types'; import { page } from '$app/stores'; + import { services } from '$lib/stores/project-services'; + import type { Models } from '@aw-labs/appwrite-console'; export let data: PageData; @@ -38,6 +40,17 @@ return { name, icon }; }; + function allServiceDisabled(project: Models.Project): boolean { + let disabled = true; + services.load(project); + $services.list.forEach((service) => { + if (service.value) { + disabled = false; + } + }); + return disabled; + } + function filterPlatforms(platforms: { name: string; icon: string }[]) { return platforms.filter( (value, index, self) => index === self.findIndex((t) => t.name === value.name) @@ -66,11 +79,12 @@ {project.name} - {#if project.paused} - - - {/if} + {#if allServiceDisabled(project)} +

    +

    + {/if} {@const platforms = filterPlatforms( project.platforms.map((platform) => getPlatformInfo(platform.type)) )} From 3020349a2aee6c025c33c40326b4aaf7fa8081d9 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 5 Apr 2023 09:19:12 +0545 Subject: [PATCH 14/71] update SDK --- src/routes/console/organization-[organization]/+page.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/console/organization-[organization]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte index 3d9764bf5..ed85e4a0b 100644 --- a/src/routes/console/organization-[organization]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -9,7 +9,7 @@ import type { PageData } from './$types'; import { page } from '$app/stores'; import { services } from '$lib/stores/project-services'; - import type { Models } from '@aw-labs/appwrite-console'; + import type { Models } from '@appwrite.io/console'; export let data: PageData; @@ -40,7 +40,7 @@ return { name, icon }; }; - function allServiceDisabled(project: Models.Project): boolean { + function allServiceDisabled(project: Models.Projectj): boolean { let disabled = true; services.load(project); $services.list.forEach((service) => { From c0d16975b2196e53e1e8423f6e47a6d82cbc8d8b Mon Sep 17 00:00:00 2001 From: Arman Date: Thu, 13 Apr 2023 15:42:02 +0200 Subject: [PATCH 15/71] refactor: feedback dropdown and wizard --- .../{ => feedback}/evaluation.svelte | 0 .../feedback.svelte} | 47 +++--- .../feedback/feedbackGeneral.svelte | 19 +++ .../components/feedback/feedbackNPS.svelte | 30 ++++ src/lib/components/feedback/index.ts | 3 + src/lib/components/feedbackNPS.svelte | 78 ---------- src/lib/components/index.ts | 3 - src/lib/images/feedback/feedback-dark.svg | 138 ++++++++++++++++++ src/lib/images/feedback/feedback-light.svg | 126 ++++++++++++++++ src/lib/layout/header.svelte | 20 +-- src/lib/layout/navigation.svelte | 38 ++++- src/lib/stores/app.ts | 79 ---------- src/lib/stores/feedback.ts | 122 ++++++++++++++++ src/routes/console/+layout.svelte | 2 +- src/routes/console/feedbackWizard.svelte | 30 ++++ .../createAttribute.svelte | 2 +- .../console/wizardFeedback/step1.svelte | 39 +++++ .../console/wizardFeedback/step2.svelte | 18 +++ 18 files changed, 588 insertions(+), 206 deletions(-) rename src/lib/components/{ => feedback}/evaluation.svelte (100%) rename src/lib/components/{feedbackGeneral.svelte => feedback/feedback.svelte} (55%) create mode 100644 src/lib/components/feedback/feedbackGeneral.svelte create mode 100644 src/lib/components/feedback/feedbackNPS.svelte create mode 100644 src/lib/components/feedback/index.ts delete mode 100644 src/lib/components/feedbackNPS.svelte create mode 100644 src/lib/images/feedback/feedback-dark.svg create mode 100644 src/lib/images/feedback/feedback-light.svg create mode 100644 src/lib/stores/feedback.ts create mode 100644 src/routes/console/feedbackWizard.svelte create mode 100644 src/routes/console/wizardFeedback/step1.svelte create mode 100644 src/routes/console/wizardFeedback/step2.svelte diff --git a/src/lib/components/evaluation.svelte b/src/lib/components/feedback/evaluation.svelte similarity index 100% rename from src/lib/components/evaluation.svelte rename to src/lib/components/feedback/evaluation.svelte diff --git a/src/lib/components/feedbackGeneral.svelte b/src/lib/components/feedback/feedback.svelte similarity index 55% rename from src/lib/components/feedbackGeneral.svelte rename to src/lib/components/feedback/feedback.svelte index 7cef18c38..f9e9561d7 100644 --- a/src/lib/components/feedbackGeneral.svelte +++ b/src/lib/components/feedback/feedback.svelte @@ -1,22 +1,23 @@ + + + + + + diff --git a/src/lib/components/feedback/feedbackNPS.svelte b/src/lib/components/feedback/feedbackNPS.svelte new file mode 100644 index 000000000..613e10514 --- /dev/null +++ b/src/lib/components/feedback/feedbackNPS.svelte @@ -0,0 +1,30 @@ + + + + How likely are you to recommend Appwrite to a friend or colleague? + +{#if $feedbackData.value} + + + + + +{/if} diff --git a/src/lib/components/feedback/index.ts b/src/lib/components/feedback/index.ts new file mode 100644 index 000000000..15d522683 --- /dev/null +++ b/src/lib/components/feedback/index.ts @@ -0,0 +1,3 @@ +export { default as Feedback } from './feedback.svelte'; +export { default as FeedbackGeneral } from './feedbackGeneral.svelte'; +export { default as FeedbackNPS } from './feedbackNPS.svelte'; diff --git a/src/lib/components/feedbackNPS.svelte b/src/lib/components/feedbackNPS.svelte deleted file mode 100644 index a9276b4a7..000000000 --- a/src/lib/components/feedbackNPS.svelte +++ /dev/null @@ -1,78 +0,0 @@ - - -
    -
    -

    How are we doing?

    - -
    -
    - At Appwrite, we value the feedback of our users. That means you! We'd love to hear what you - think. -
    - - - - How likely are you to recommend Appwrite to a friend or colleague? - - {#if value} - - - - - - {/if} -
    - - -
    - -
    diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index f891b8255..f2cf6e0ee 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -31,9 +31,6 @@ export { default as Box } from './box.svelte'; export { default as Search } from './search.svelte'; export { default as SearchQuery } from './searchQuery.svelte'; export { default as GridItem1 } from './gridItem1.svelte'; -export { default as FeedbackGeneral } from './feedbackGeneral.svelte'; -export { default as FeedbackNPS } from './feedbackNPS.svelte'; -export { default as Evaluation } from './evaluation.svelte'; export { default as Steps } from './steps.svelte'; export { default as Step } from './step.svelte'; export { default as Code } from './code.svelte'; diff --git a/src/lib/images/feedback/feedback-dark.svg b/src/lib/images/feedback/feedback-dark.svg new file mode 100644 index 000000000..8f0b553d6 --- /dev/null +++ b/src/lib/images/feedback/feedback-dark.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/images/feedback/feedback-light.svg b/src/lib/images/feedback/feedback-light.svg new file mode 100644 index 000000000..d7ace402f --- /dev/null +++ b/src/lib/images/feedback/feedback-light.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/layout/header.svelte b/src/lib/layout/header.svelte index e9ec88e7f..099c1411f 100644 --- a/src/lib/layout/header.svelte +++ b/src/lib/layout/header.svelte @@ -1,26 +1,20 @@ @@ -122,6 +133,24 @@ Storage +
  • + trackEvent('click_menu_settings')} + class:is-selected={$page.url.pathname.startsWith( + `${projectPath}/settings` + )} + title="Settings" + use:tooltip={{ + content: 'Settings', + placement: 'right', + disabled: !narrow + }}> + +
@@ -129,7 +158,7 @@ {/if} diff --git a/src/lib/stores/app.ts b/src/lib/stores/app.ts index 11afe9d6a..7c4b2a184 100644 --- a/src/lib/stores/app.ts +++ b/src/lib/stores/app.ts @@ -1,5 +1,4 @@ import { browser } from '$app/environment'; -import { VARS } from '$lib/system'; import { writable } from 'svelte/store'; export type AppStore = { @@ -7,89 +6,11 @@ export type AppStore = { themeInUse: 'light' | 'dark'; }; -export type Feedback = { - elapsed: number; - visualized: number; - notification: boolean; - type: 'nps' | 'general'; - show: boolean; -}; - export const app = writable({ theme: 'auto', themeInUse: 'light' }); -function createFeedbackStore() { - const { subscribe, update } = writable({ - elapsed: browser ? parseInt(localStorage.getItem('feedbackElapsed')) : 0, - visualized: browser ? parseInt(localStorage.getItem('feedbackVisualized')) : 0, - notification: false, - type: 'general', - show: false - }); - return { - subscribe, - update, - toggleFeedback: () => { - update((feedback) => { - feedback.show = !feedback.show; - return feedback; - }); - }, - toggleNotification: () => - update((feedback) => { - feedback.notification = !feedback.notification; - return feedback; - }), - switchType: (feedType: Feedback['type']) => - update((feedback) => { - feedback.type = feedType; - return feedback; - }), - addVisualization: () => - update((feedback) => { - feedback.visualized += 1; - localStorage.setItem('feedbackVisualized', feedback.visualized.toString()); - return feedback; - }), - - increaseElapsed: (time: number) => { - update((feedback) => { - feedback.elapsed += time; - localStorage.setItem('feedbackElapsed', feedback.elapsed.toString()); - return feedback; - }); - }, - submitFeedback: async ( - subject: string, - message: string, - firstname?: string, - email?: string, - value?: number - ) => { - if (!VARS.GROWTH_ENDPOINT) return; - const response = await fetch(`${VARS.GROWTH_ENDPOINT}/feedback`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - subject, - message, - email, - firstname: firstname ? firstname : undefined, - customFields: value ? [{ id: '40655', value }] : undefined - }) - }); - if (response.status >= 400) { - throw new Error('Failed to submit feedback'); - } - } - }; -} -export const feedback = createFeedbackStore(); - if (browser) { app.update((n) => ({ ...n, diff --git a/src/lib/stores/feedback.ts b/src/lib/stores/feedback.ts new file mode 100644 index 000000000..7afdbee52 --- /dev/null +++ b/src/lib/stores/feedback.ts @@ -0,0 +1,122 @@ +import { browser } from '$app/environment'; +import { VARS } from '$lib/system'; +import { writable } from 'svelte/store'; +import type { SvelteComponent } from 'svelte'; +import FeedbackGeneral from '$lib/components/feedback/feedbackGeneral.svelte'; +import FeedbackNps from '$lib/components/feedback/feedbackNPS.svelte'; + +export type Feedback = { + elapsed: number; + visualized: number; + notification: boolean; + type: 'nps' | 'general'; + show: boolean; +}; + +export type FeedbackData = { + message: string; + name?: string; + email?: string; + value?: number; +}; + +export const feedbackData = writable({ + message: '', + name: '', + email: '', + value: 0 +}); + +export type FeedbackOption = { + type: Feedback['type']; + title: string; + desc: string; + component: typeof SvelteComponent; +}; + +export const feedbackOptions: FeedbackOption[] = [ + { + type: 'general', + title: 'How can we improve?', + desc: 'Your feedback is important to us. Please be honest and tell us what you think.', + component: FeedbackGeneral + }, + { + type: 'nps', + title: 'How are we doing?', + desc: "At Appwrite, we value the feedback of our users. That means you! We'd love to hear what you think.", + component: FeedbackNps + } +]; + +export const selectedFeedback = writable(); + +function createFeedbackStore() { + const { subscribe, update } = writable({ + elapsed: browser ? parseInt(localStorage.getItem('feedbackElapsed')) : 0, + visualized: browser ? parseInt(localStorage.getItem('feedbackVisualized')) : 0, + notification: false, + type: 'general', + show: false + }); + return { + subscribe, + update, + toggleFeedback: () => { + update((feedback) => { + feedback.show = !feedback.show; + return feedback; + }); + }, + toggleNotification: () => + update((feedback) => { + feedback.notification = !feedback.notification; + return feedback; + }), + switchType: (feedType: Feedback['type']) => + update((feedback) => { + feedback.type = feedType; + return feedback; + }), + addVisualization: () => + update((feedback) => { + feedback.visualized += 1; + localStorage.setItem('feedbackVisualized', feedback.visualized.toString()); + return feedback; + }), + + increaseElapsed: (time: number) => { + update((feedback) => { + feedback.elapsed += time; + localStorage.setItem('feedbackElapsed', feedback.elapsed.toString()); + return feedback; + }); + }, + submitFeedback: async ( + subject: string, + message: string, + firstname?: string, + email?: string, + value?: number + ) => { + if (!VARS.GROWTH_ENDPOINT) return; + const response = await fetch(`${VARS.GROWTH_ENDPOINT}/feedback`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + subject, + message, + email, + firstname: firstname ? firstname : undefined, + customFields: value ? [{ id: '40655', value }] : undefined + }) + }); + if (response.status >= 400) { + throw new Error('Failed to submit feedback'); + } + } + }; +} +export const feedback = createFeedbackStore(); diff --git a/src/routes/console/+layout.svelte b/src/routes/console/+layout.svelte index 870794b40..04518a68c 100644 --- a/src/routes/console/+layout.svelte +++ b/src/routes/console/+layout.svelte @@ -7,7 +7,7 @@ import Header from '$lib/layout/header.svelte'; import SideNavigation from '$lib/layout/navigation.svelte'; import Shell from '$lib/layout/shell.svelte'; - import { feedback } from '$lib/stores/app'; + import { feedback } from '$lib/stores/feedback'; import { log } from '$lib/stores/logs'; import { newOrgModal } from '$lib/stores/organization'; import { wizard } from '$lib/stores/wizard'; diff --git a/src/routes/console/feedbackWizard.svelte b/src/routes/console/feedbackWizard.svelte new file mode 100644 index 000000000..44c023874 --- /dev/null +++ b/src/routes/console/feedbackWizard.svelte @@ -0,0 +1,30 @@ + + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte index 8f6c64749..acc089046 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte @@ -10,7 +10,7 @@ import type { Attributes } from './store'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { preferences } from '$lib/stores/preferences'; - import { feedback } from '$lib/stores/app'; + import { feedback } from '$lib/stores/feedback'; export let showCreate = false; export let selectedOption: string = null; diff --git a/src/routes/console/wizardFeedback/step1.svelte b/src/routes/console/wizardFeedback/step1.svelte new file mode 100644 index 000000000..c3a665590 --- /dev/null +++ b/src/routes/console/wizardFeedback/step1.svelte @@ -0,0 +1,39 @@ + + + + {$selectedFeedback.title} + {$selectedFeedback.desc} + + + diff --git a/src/routes/console/wizardFeedback/step2.svelte b/src/routes/console/wizardFeedback/step2.svelte new file mode 100644 index 000000000..1e91272cf --- /dev/null +++ b/src/routes/console/wizardFeedback/step2.svelte @@ -0,0 +1,18 @@ + + + + Thanks for the feedback! + +
+ {#if $app.themeInUse === 'dark'} + + {:else} + + {/if} +
+
From 11cb07f0250669ef36808601c684a54539cc6c3d Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:57:36 +0100 Subject: [PATCH 16/71] fix: empty db text truncating on mobile --- src/lib/components/empty.svelte | 8 +++++--- .../overview/platforms/wizard/flutter/step1.svelte | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lib/components/empty.svelte b/src/lib/components/empty.svelte index ab7d091a4..23d9c89c2 100644 --- a/src/lib/components/empty.svelte +++ b/src/lib/components/empty.svelte @@ -21,7 +21,8 @@ {#if single}
-
+
+ + + From 2120d77f27964ecab7d048607c2ca9d107fc5d72 Mon Sep 17 00:00:00 2001 From: Bhaskar Singh Date: Sun, 16 Apr 2023 15:55:48 +0530 Subject: [PATCH 18/71] Updating Re-Build to Retry Build --- .../functions/function-[function]/+page.svelte | 4 ++-- .../functions/function-[function]/rebuild.svelte | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/routes/console/project-[project]/functions/function-[function]/+page.svelte b/src/routes/console/project-[project]/functions/function-[function]/+page.svelte index bbadee285..119a813a4 100644 --- a/src/routes/console/project-[project]/functions/function-[function]/+page.svelte +++ b/src/routes/console/project-[project]/functions/function-[function]/+page.svelte @@ -221,7 +221,7 @@ }}> Activate - {#if ['failed'].includes(deployment.status)} + {#if 'failed' === deployment.status} { @@ -229,7 +229,7 @@ showRebuild = true; showDropdown = []; }}> - Re-Build + Retry Build {/if} - Re-build Deployment -

Are you sure you want to re-build this deployment?

+ Retry build Deployment +

Are you sure you want to retry build this deployment?

- +
From 89263731c474b825ca9309378ceb5dfccd1cc08d Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 17 Apr 2023 11:01:37 +0100 Subject: [PATCH 19/71] refactor: code style changes --- src/lib/components/empty.svelte | 5 +++-- src/lib/layout/shell.svelte | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib/components/empty.svelte b/src/lib/components/empty.svelte index 23d9c89c2..4a3a614e3 100644 --- a/src/lib/components/empty.svelte +++ b/src/lib/components/empty.svelte @@ -41,8 +41,9 @@
- Create your first {target} to get started. + + Create your first {target} to get started. +

Need a hand? Check out our documentation.

diff --git a/src/lib/layout/shell.svelte b/src/lib/layout/shell.svelte index f4f5fd0cf..dfec2d000 100644 --- a/src/lib/layout/shell.svelte +++ b/src/lib/layout/shell.svelte @@ -92,4 +92,8 @@ grid-template-columns: auto 1fr !important; } } + + .main-content { + flex-grow: 1; + } From 25299adfc339c788ae58a48850ddc4f27029b610 Mon Sep 17 00:00:00 2001 From: Bhaskar Singh Date: Fri, 21 Apr 2023 22:25:54 +0530 Subject: [PATCH 20/71] Updated library name from @aw-labs/appwrite-console to @appwrite.io/console for rebuild.svelte --- .../functions/function-[function]/rebuild.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte b/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte index 877a06e6c..255e50e49 100644 --- a/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte +++ b/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte @@ -4,7 +4,7 @@ import { Button } from '$lib/elements/forms'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; - import type { Models } from '@aw-labs/appwrite-console'; + import type { Models } from '@appwrite.io/console'; import { createEventDispatcher } from 'svelte'; export let showRebuild = false; From 869a084e486e27d0d8a1752b43b59503dcf1d5c3 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Wed, 26 Apr 2023 11:42:22 +0100 Subject: [PATCH 21/71] refactor: remove footer hack --- src/lib/layout/shell.svelte | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/lib/layout/shell.svelte b/src/lib/layout/shell.svelte index dfec2d000..f4f5fd0cf 100644 --- a/src/lib/layout/shell.svelte +++ b/src/lib/layout/shell.svelte @@ -92,8 +92,4 @@ grid-template-columns: auto 1fr !important; } } - - .main-content { - flex-grow: 1; - } From 9ef1cef8d3e8936aa5a6e85622c76d85d74388e8 Mon Sep 17 00:00:00 2001 From: Bhaskar Singh Date: Wed, 26 Apr 2023 23:38:24 +0530 Subject: [PATCH 22/71] Fixing the typo for rebuild Modal --- .../functions/function-[function]/rebuild.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte b/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte index 255e50e49..a3d1b4e1d 100644 --- a/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte +++ b/src/routes/console/project-[project]/functions/function-[function]/rebuild.svelte @@ -37,8 +37,8 @@ - Retry build Deployment -

Are you sure you want to retry build this deployment?

+ Retry build +

Are you sure you want to retry building this deployment?

From bdfcadfee321a73bec45a60312cc6a5380bfc9f7 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Tue, 9 May 2023 10:20:07 -0700 Subject: [PATCH 23/71] Replace image-item with avatar class The image-item class had a bug where the width could be incorrect causing the iamge to look squished. The new avatar class fixes this problem. --- .../project-[project]/auth/settings/+page.svelte | 14 +++++++------- .../auth/user-[user]/sessions/+page.svelte | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/routes/console/project-[project]/auth/settings/+page.svelte b/src/routes/console/project-[project]/auth/settings/+page.svelte index eba59cea4..42f640d07 100644 --- a/src/routes/console/project-[project]/auth/settings/+page.svelte +++ b/src/routes/console/project-[project]/auth/settings/+page.svelte @@ -1,17 +1,17 @@
  • {#if href} - + {:else} @@ -22,7 +82,10 @@ class="tabs-button" class:is-selected={selected} on:click|preventDefault - on:click={track}> + on:click={track} + tabindex={selected ? 0 : -1} + on:keydown={handleKeyDown} + role="tab"> {/if} diff --git a/src/lib/helpers/style.ts b/src/lib/helpers/style.ts new file mode 100644 index 000000000..fef15c8cc --- /dev/null +++ b/src/lib/helpers/style.ts @@ -0,0 +1,16 @@ +type Direction = 'rtl' | 'ltr'; + +function isDirection(dir: string): dir is Direction { + return dir === 'rtl' || dir === 'ltr'; +} + +function parseDirection(dir: string): Direction { + return isDirection(dir) ? dir : 'ltr'; +} + +export function getElementDir(el: HTMLElement): Direction { + if (window.getComputedStyle) { + return parseDirection(window.getComputedStyle(el, null).getPropertyValue('direction')); + } + return parseDirection(el.style.direction); +} From ecebcf025814d762afb3703088d4d8d31db05f25 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 16 May 2023 07:07:37 +0545 Subject: [PATCH 25/71] fix typo --- src/routes/console/organization-[organization]/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/organization-[organization]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte index 9fbe8bbe9..2b5d3759b 100644 --- a/src/routes/console/organization-[organization]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -40,7 +40,7 @@ return { name, icon }; }; - function allServiceDisabled(project: Models.Projectj): boolean { + function allServiceDisabled(project: Models.Project): boolean { let disabled = true; services.load(project); $services.list.forEach((service) => { From b6a8e6a190887c77f7ea4deac1a1a88733323b69 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 16 May 2023 07:08:23 +0545 Subject: [PATCH 26/71] remove unnecessary code --- src/routes/console/project-[project]/settings/+page.svelte | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 3df967027..a03e4e6e2 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -90,11 +90,6 @@ } } - $: { - // When project name is updated, finalize the updating flow - $project.name; - } - async function serviceUpdate(service: Service) { try { await sdk.forConsole.projects.updateServiceStatus( From 5061cb3b2f42f9595a01b8d23122a89dd3e8f2b9 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 16 May 2023 07:11:29 +0545 Subject: [PATCH 27/71] fix --- .../project-[project]/settings/disableAllServices.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/settings/disableAllServices.svelte b/src/routes/console/project-[project]/settings/disableAllServices.svelte index 2774c5579..1cf11235e 100644 --- a/src/routes/console/project-[project]/settings/disableAllServices.svelte +++ b/src/routes/console/project-[project]/settings/disableAllServices.svelte @@ -6,7 +6,7 @@ export let handleDisableAll; - + Disable all services

    Are you sure you want to disable all services? This will disable API requests to your From ede7a8e1b4ca7c9e88f3456bade223107c13635e Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 16 May 2023 13:55:05 +0545 Subject: [PATCH 28/71] transfer project UI --- src/lib/actions/analytics.ts | 1 + .../project-[project]/settings/+page.svelte | 33 +++++++++++ .../settings/transferProject.svelte | 59 +++++++++++++++++++ 3 files changed, 93 insertions(+) create mode 100644 src/routes/console/project-[project]/settings/transferProject.svelte diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index 84c178cc4..b9724ff75 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -131,6 +131,7 @@ export enum Submit { ProjectCreate = 'submit_project_create', ProjectDelete = 'submit_project_delete', ProjectUpdateName = 'submit_project_update_name', + ProjectUpdateTeam = 'submit_project_update_team', ProjectService = 'submit_project_service', MemberCreate = 'submit_member_create', MemberDelete = 'submit_member_delete', diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index ccce2b50b..80c5f4e97 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -3,6 +3,7 @@ import { onMount } from 'svelte'; import { toLocaleDateTime } from '$lib/helpers/date'; import { addNotification } from '$lib/stores/notifications'; + import { organizationList } from '$lib/stores/organization'; import { project } from '../store'; import { services, type Service } from '$lib/stores/project-services'; import { CardGrid, CopyInput, Box, Heading } from '$lib/components'; @@ -14,14 +15,19 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; + import InputSelect from '$lib/elements/forms/inputSelect.svelte'; + import Transfer from './transferProject.svelte'; let name: string = null; + let teamId: string = null; let showDelete = false; + let showTransfer = false; const endpoint = sdk.forConsole.client.config.endpoint; const projectId = $page.params.project; onMount(async () => { name ??= $project.name; + teamId ??= $project.teamId; }); async function updateName() { @@ -134,7 +140,28 @@ + + Transfer project +

    Transfer your project to another organization that you own.

    + + + ({ + value: team.$id, + label: team.name + }))} /> + + + + + + +
    Delete Project @@ -160,3 +187,9 @@ +{#if teamId} + t.$id == teamId).name} + bind:show={showTransfer} /> +{/if} diff --git a/src/routes/console/project-[project]/settings/transferProject.svelte b/src/routes/console/project-[project]/settings/transferProject.svelte new file mode 100644 index 000000000..bc9c9d34a --- /dev/null +++ b/src/routes/console/project-[project]/settings/transferProject.svelte @@ -0,0 +1,59 @@ + + + + Delete Project +

    Are you sure you want to transfer {$project.name} to {teamName}?

    +

    + Members who are not part of the destination organization must be invited to gain access to + this project. +

    + + + + + +
    From 7fcba3c21c4cbbb908f67058af8f583d8fc56595 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 17 May 2023 13:16:16 +0545 Subject: [PATCH 29/71] fix import --- .../console/project-[project]/settings/+page.svelte | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 80c5f4e97..4508266b1 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -7,7 +7,14 @@ import { project } from '../store'; import { services, type Service } from '$lib/stores/project-services'; import { CardGrid, CopyInput, Box, Heading } from '$lib/components'; - import { Button, Form, FormList, InputText, InputSwitch } from '$lib/elements/forms'; + import { + Button, + Form, + FormList, + InputText, + InputSwitch, + InputSelect + } from '$lib/elements/forms'; import { Container } from '$lib/layout'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; @@ -15,7 +22,6 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; - import InputSelect from '$lib/elements/forms/inputSelect.svelte'; import Transfer from './transferProject.svelte'; let name: string = null; From e6d02cfdcfa52f3ab26ea0b07a3ac9ef4c799119 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 17 May 2023 13:20:22 +0545 Subject: [PATCH 30/71] fix title and design --- .../console/project-[project]/settings/transferProject.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/settings/transferProject.svelte b/src/routes/console/project-[project]/settings/transferProject.svelte index bc9c9d34a..2384b6c7e 100644 --- a/src/routes/console/project-[project]/settings/transferProject.svelte +++ b/src/routes/console/project-[project]/settings/transferProject.svelte @@ -44,8 +44,8 @@ }; - - Delete Project + + Transfer Project

    Are you sure you want to transfer {$project.name} to {teamName}?

    Members who are not part of the destination organization must be invited to gain access to From 43a0d8ebe504de99da42c20b2be5601ed100a461 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Wed, 17 May 2023 14:02:38 +0545 Subject: [PATCH 31/71] fixed --- src/routes/console/project-[project]/settings/+page.svelte | 6 ++++-- .../project-[project]/settings/transferProject.svelte | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 4508266b1..95d9a3171 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -164,8 +164,10 @@ - + diff --git a/src/routes/console/project-[project]/settings/transferProject.svelte b/src/routes/console/project-[project]/settings/transferProject.svelte index 2384b6c7e..9e16d5611 100644 --- a/src/routes/console/project-[project]/settings/transferProject.svelte +++ b/src/routes/console/project-[project]/settings/transferProject.svelte @@ -45,7 +45,7 @@ - Transfer Project + Transfer project

    Are you sure you want to transfer {$project.name} to {teamName}?

    Members who are not part of the destination organization must be invited to gain access to From 602c2268ab1ef87159f4d2c5d8b404e755960964 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 17 May 2023 12:02:27 -0700 Subject: [PATCH 32/71] Update CONTRIBUTING.md to fix linting error --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 607bb07f6..ad67fbd68 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,12 +40,15 @@ git clone https://github.com/appwrite/console.git appwrite-console ``` ### 2. Install dependencies with npm + Navigate to the Appwrite Console repository and install dependencies. + ```bash cd appwrite-console && npm install ``` ### 3. Install and run Appwrite locally + When you run the Appwrite Console locally, it needs to point to a backend as well. The easiest way to do this is to run an Appwrite instance locally. Follow the [install instructions](https://appwrite.io/docs/installation) in the Appwrite docs. From f2622f0f78beedf131b43f6fcc3bcee24495e08b Mon Sep 17 00:00:00 2001 From: Arman Date: Tue, 23 May 2023 15:05:58 +0200 Subject: [PATCH 33/71] fix: reset data after submission --- src/lib/components/feedback/feedback.svelte | 4 +-- src/lib/stores/feedback.ts | 31 ++++++++++++++++----- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/lib/components/feedback/feedback.svelte b/src/lib/components/feedback/feedback.svelte index f9e9561d7..98cb759bd 100644 --- a/src/lib/components/feedback/feedback.svelte +++ b/src/lib/components/feedback/feedback.svelte @@ -22,13 +22,13 @@ type: 'success', message: 'Feedback submitted successfully' }); + feedback.toggleFeedback(); + feedbackData.reset(); } catch (error) { addNotification({ type: 'error', message: error.message }); - } finally { - feedback.toggleFeedback(); } } diff --git a/src/lib/stores/feedback.ts b/src/lib/stores/feedback.ts index 7afdbee52..d63e1d2ec 100644 --- a/src/lib/stores/feedback.ts +++ b/src/lib/stores/feedback.ts @@ -20,13 +20,6 @@ export type FeedbackData = { value?: number; }; -export const feedbackData = writable({ - message: '', - name: '', - email: '', - value: 0 -}); - export type FeedbackOption = { type: Feedback['type']; title: string; @@ -51,6 +44,30 @@ export const feedbackOptions: FeedbackOption[] = [ export const selectedFeedback = writable(); +function createFeedbackDataStore() { + const { subscribe, update } = writable({ + message: '', + name: '', + email: '', + value: 0 + }); + return { + subscribe, + update, + reset: () => { + update((feedbackData) => { + feedbackData.message = ''; + feedbackData.name = ''; + feedbackData.email = ''; + feedbackData.value = 0; + return feedbackData; + }); + } + }; +} + +export const feedbackData = createFeedbackDataStore(); + function createFeedbackStore() { const { subscribe, update } = writable({ elapsed: browser ? parseInt(localStorage.getItem('feedbackElapsed')) : 0, From b3ca78f4ae0a527609e9e803f378d4d26a4cb9e1 Mon Sep 17 00:00:00 2001 From: "Vincent (Wen Yu) Ge" Date: Tue, 23 May 2023 21:38:18 +0000 Subject: [PATCH 34/71] Add custom copy for google oauth provider --- src/lib/stores/oauth-providers.ts | 2 + .../project-[project]/auth/googleOAuth.svelte | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/routes/console/project-[project]/auth/googleOAuth.svelte diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index 8047d6bdb..40bcff26a 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -7,6 +7,7 @@ import Okta from '../../routes/console/project-[project]/auth/oktaOAuth.svelte'; import Auth0 from '../../routes/console/project-[project]/auth/auth0OAuth.svelte'; import Authentik from '../../routes/console/project-[project]/auth/authentikOAuth.svelte'; import GitLab from '../../routes/console/project-[project]/auth/gitlabOAuth.svelte'; +import Google from '../../routes/console/project-[project]/auth/googleOAuth.svelte'; import Main from '../../routes/console/project-[project]/auth/mainOAuth.svelte'; export type Provider = Models.Provider & { @@ -81,6 +82,7 @@ const setProviders = (project: Models.Project): Provider[] => { break; case 'google': docs = 'https://support.google.com/googleapi/answer/6158849'; + component = Google; break; case 'linkedin': docs = 'https://developer.linkedin.com/'; diff --git a/src/routes/console/project-[project]/auth/googleOAuth.svelte b/src/routes/console/project-[project]/auth/googleOAuth.svelte new file mode 100644 index 000000000..1b4d3c986 --- /dev/null +++ b/src/routes/console/project-[project]/auth/googleOAuth.svelte @@ -0,0 +1,82 @@ + + + + {provider.name} OAuth2 Settings + +

    + To use {provider.name} authentication in your application, first fill in this form. For more + info you can + visit the docs. +

    + + + + + To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration + and select web application as the application type. + +
    +

    URI

    + +
    + + + + + +
    From 3c9f7b62b91042518d0f792056edb374665bd4b0 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 31 May 2023 17:26:14 +0200 Subject: [PATCH 35/71] run linter --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 607bb07f6..ad67fbd68 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,12 +40,15 @@ git clone https://github.com/appwrite/console.git appwrite-console ``` ### 2. Install dependencies with npm + Navigate to the Appwrite Console repository and install dependencies. + ```bash cd appwrite-console && npm install ``` ### 3. Install and run Appwrite locally + When you run the Appwrite Console locally, it needs to point to a backend as well. The easiest way to do this is to run an Appwrite instance locally. Follow the [install instructions](https://appwrite.io/docs/installation) in the Appwrite docs. From ac4d003a14cfd1bbb0249d917a648013225610c1 Mon Sep 17 00:00:00 2001 From: Arman Date: Wed, 31 May 2023 17:42:10 +0200 Subject: [PATCH 36/71] fix: mobile wizard not closing --- src/lib/layout/navigation.svelte | 3 +++ src/routes/console/+layout.svelte | 5 ++++- src/routes/console/feedbackWizard.svelte | 13 ++++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/lib/layout/navigation.svelte b/src/lib/layout/navigation.svelte index 3b8e6b1d4..96892c26b 100644 --- a/src/lib/layout/navigation.svelte +++ b/src/lib/layout/navigation.svelte @@ -9,6 +9,8 @@ import { wizard } from '$lib/stores/wizard'; import Create from '$routes/console/feedbackWizard.svelte'; + export let isOpen = false; + $: project = $page.params.project; $: projectPath = `${base}/console/project-${project}`; @@ -32,6 +34,7 @@ } function openWizard() { + isOpen = false; wizard.start(Create); } diff --git a/src/routes/console/+layout.svelte b/src/routes/console/+layout.svelte index 04518a68c..38e74b324 100644 --- a/src/routes/console/+layout.svelte +++ b/src/routes/console/+layout.svelte @@ -15,6 +15,8 @@ import { loading } from '../store'; import Create from './createOrganization.svelte'; + let isOpen = false; + onMount(() => { loading.set(false); @@ -47,12 +49,13 @@
    - +
    diff --git a/src/routes/console/feedbackWizard.svelte b/src/routes/console/feedbackWizard.svelte index 44c023874..36f8535ef 100644 --- a/src/routes/console/feedbackWizard.svelte +++ b/src/routes/console/feedbackWizard.svelte @@ -7,12 +7,7 @@ import Step2 from './wizardFeedback/step2.svelte'; onDestroy(() => { - $feedbackData = { - message: '', - name: '', - email: '', - value: 0 - }; + feedbackData.reset(); }); const stepsComponents: WizardStepsType = new Map(); @@ -27,4 +22,8 @@ }); - + console.log('test')} /> From e37436d1044b022acb420d3a3209b14cf80b19d5 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Wed, 31 May 2023 18:52:55 +0100 Subject: [PATCH 37/71] feat: tabs focus on navigate --- src/lib/components/tab.svelte | 27 ++++++++++++++++++++++----- src/lib/helpers/waitUntil.ts | 14 ++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 src/lib/helpers/waitUntil.ts diff --git a/src/lib/components/tab.svelte b/src/lib/components/tab.svelte index db46fb6b2..3fdf83096 100644 --- a/src/lib/components/tab.svelte +++ b/src/lib/components/tab.svelte @@ -1,14 +1,31 @@ - console.log('test')} /> + From 35a74bb554c8a071a2bf5de413a8ab6fa33531ce Mon Sep 17 00:00:00 2001 From: "Vincent (Wen Yu) Ge" Date: Thu, 1 Jun 2023 20:32:07 +0000 Subject: [PATCH 40/71] Update link to cron docs --- .../function-[function]/settings/updateSchedule.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte b/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte index e60ba6e99..699b727b1 100644 --- a/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte +++ b/src/routes/console/project-[project]/functions/function-[function]/settings/updateSchedule.svelte @@ -49,7 +49,7 @@ Schedule

    Set a Cron schedule to trigger your function. Leave blank for no schedule. From 35c33066af971d78b515b47aae6f44e631d613c1 Mon Sep 17 00:00:00 2001 From: "Vincent (Wen Yu) Ge" Date: Fri, 2 Jun 2023 17:53:45 +0000 Subject: [PATCH 41/71] update instruction ordering --- src/routes/console/project-[project]/auth/googleOAuth.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/console/project-[project]/auth/googleOAuth.svelte b/src/routes/console/project-[project]/auth/googleOAuth.svelte index 1b4d3c986..c8fd0390b 100644 --- a/src/routes/console/project-[project]/auth/googleOAuth.svelte +++ b/src/routes/console/project-[project]/auth/googleOAuth.svelte @@ -58,8 +58,8 @@ showPasswordButton bind:value={secret} /> - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration - and select web application as the application type. + To complete the setup, create an OAuth2 client ID with "Web application" as the + application type, then add this redirect URI to your {provider.name} configuration.

    URI

    From 10afbd9777a47a0f339da7acc833acb85bad6aae Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Tue, 23 May 2023 10:17:15 -0700 Subject: [PATCH 42/71] Update the OAuth2 success and failure pages 1. Update design to be more consistent with other pages, while still unbranded 2. Update sizing to be more mobile friendly as the original heading size was truncated on mobile 3. Show a different message when redirecting back to the app to clarify the login was successful 4. Close the window after redirecting so the user doesn't have to --- src/routes/auth/oauth2/failure/+page.svelte | 60 ++++++++++++++++----- src/routes/auth/oauth2/success/+page.svelte | 60 ++++++++++++++++----- 2 files changed, 96 insertions(+), 24 deletions(-) diff --git a/src/routes/auth/oauth2/failure/+page.svelte b/src/routes/auth/oauth2/failure/+page.svelte index 359c6ffdc..928ad82c4 100644 --- a/src/routes/auth/oauth2/failure/+page.svelte +++ b/src/routes/auth/oauth2/failure/+page.svelte @@ -2,20 +2,56 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; import { Heading } from '$lib/components'; - import { onMount } from 'svelte'; - onMount(async () => { - const project = $page.url.searchParams.get('project'); - if (project) { - await goto(`appwrite-callback-${project}://${$page.url.search}`); + const project = $page.url.searchParams.get('project'); + const link = `appwrite-callback-${project}://${$page.url.search}`; + + const redirect = new Promise((resolve, reject) => { + if (!project) { + reject('no-project'); } + // this timeout is needed because goto does not + // throw an exception if the redirect does not work + setTimeout(() => reject('timeout'), 500); + // goto will resolve on successful redirect + goto(link).then(resolve); }); -Missing Redirect URL -

    - Your OAuth login flow is missing a proper redirect URL. Please check the - OAuth docs - and send request for new session with a valid callback URL. -

    +{#await redirect then} +
    +
    + Login failed +

    You will be automatically redirected back to your app shortly.

    +

    + If you are not redirected, please click on the following + link. +

    +
    +
    +{:catch} +
    +
    + Missing Redirect URL +

    + Your OAuth login flow is missing a proper redirect URL. Please check the + OAuth docs + and send request for new session with a valid callback URL. +

    +
    +
    +{/await} + + diff --git a/src/routes/auth/oauth2/success/+page.svelte b/src/routes/auth/oauth2/success/+page.svelte index 359c6ffdc..b67ad0ce6 100644 --- a/src/routes/auth/oauth2/success/+page.svelte +++ b/src/routes/auth/oauth2/success/+page.svelte @@ -2,20 +2,56 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; import { Heading } from '$lib/components'; - import { onMount } from 'svelte'; - onMount(async () => { - const project = $page.url.searchParams.get('project'); - if (project) { - await goto(`appwrite-callback-${project}://${$page.url.search}`); + const project = $page.url.searchParams.get('project'); + const link = `appwrite-callback-${project}://${$page.url.search}`; + + const redirect = new Promise((resolve, reject) => { + if (!project) { + reject('no-project'); } + // this timeout is needed because goto does not + // throw an exception if the redirect does not work + setTimeout(() => reject('timeout'), 500); + // goto will resolve on successful redirect + goto(link).then(resolve); }); -Missing Redirect URL -

    - Your OAuth login flow is missing a proper redirect URL. Please check the - OAuth docs - and send request for new session with a valid callback URL. -

    +{#await redirect then} +
    +
    + You're now logged in +

    You will be automatically redirected back to your app shortly.

    +

    + If you are not redirected, please click on the following + link. +

    +
    +
    +{:catch} +
    +
    + Missing Redirect URL +

    + Your OAuth login flow is missing a proper redirect URL. Please check the + OAuth docs + and send request for new session with a valid callback URL. +

    +
    +
    +{/await} + + From 7894a1cd4deec8f9f95409f489ab1d81498eaaee Mon Sep 17 00:00:00 2001 From: Erez Hod Date: Sat, 24 Jun 2023 19:25:42 +0300 Subject: [PATCH 43/71] Fixed `Extraneous argument label 'status:' in call` for Apple App setup in step 3 for `setSelfSigned` method. --- .../overview/platforms/wizard/apple/step3.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/apple/step3.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/apple/step3.svelte index fc5b28077..d0394946f 100644 --- a/src/routes/console/project-[project]/overview/platforms/wizard/apple/step3.svelte +++ b/src/routes/console/project-[project]/overview/platforms/wizard/apple/step3.svelte @@ -10,7 +10,7 @@ let client = Client() .setEndpoint("${endpoint}") .setProject("${project}") - .setSelfSigned(status: true) // For self signed certificates, only use for development`; + .setSelfSigned(true) // For self signed certificates, only use for development`; let showAlert = true; From 68cc27c4bb8772bc9100b8a149d2a4ae090e1f67 Mon Sep 17 00:00:00 2001 From: Binyamin Yawitz Date: Thu, 29 Jun 2023 17:34:51 -0400 Subject: [PATCH 44/71] Change *Raw Data* links from singular to plural --- src/lib/layout/logs.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/layout/logs.svelte b/src/lib/layout/logs.svelte index fcaabd80f..7b27b8b3d 100644 --- a/src/lib/layout/logs.svelte +++ b/src/lib/layout/logs.svelte @@ -17,7 +17,7 @@ function isDeployment(data: Models.Deployment | Models.Execution): data is Models.Deployment { if ('buildId' in data) { selectedTab = 'logs'; - rawData = `${sdk.forConsole.client.config.endpoint}/functions/${$log.func.$id}/deployment/${$log.data.$id}?mode=admin&project=${$page.params.project}`; + rawData = `${sdk.forConsole.client.config.endpoint}/functions/${$log.func.$id}/deployments/${$log.data.$id}?mode=admin&project=${$page.params.project}`; return true; } } @@ -25,7 +25,7 @@ function isExecution(data: Models.Deployment | Models.Execution): data is Models.Execution { if ('trigger' in data) { selectedTab = 'response'; - rawData = `${sdk.forConsole.client.config.endpoint}/functions/${$log.func.$id}/execution/${$log.data.$id}?mode=admin&project=${$page.params.project}`; + rawData = `${sdk.forConsole.client.config.endpoint}/functions/${$log.func.$id}/executions/${$log.data.$id}?mode=admin&project=${$page.params.project}`; return true; } } From c2d9fba323de6fcc99ec5e270400b5425ece5b0a Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Mon, 3 Jul 2023 12:37:40 +0100 Subject: [PATCH 45/71] fix: tab tests --- tests/unit/components/tab.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/components/tab.test.ts b/tests/unit/components/tab.test.ts index a0d7b0dcb..9e75e25e8 100644 --- a/tests/unit/components/tab.test.ts +++ b/tests/unit/components/tab.test.ts @@ -6,12 +6,12 @@ import { Tab } from '../../../src/lib/components'; test('shows tab', () => { const { getByRole } = render(Tab); - expect(getByRole('button')).toBeInTheDocument(); + expect(getByRole('tab')).toBeInTheDocument(); }); test('shows tab - is selected', () => { const { getByRole } = render(Tab, { selected: true }); - expect(getByRole('button')).toHaveClass('is-selected'); + expect(getByRole('tab')).toHaveClass('is-selected'); }); test('shows tab - is link', () => { @@ -23,7 +23,7 @@ test('shows tab - is link', () => { test('shows tab - on:click', async () => { const { getByRole, component } = render(Tab); - const tab = getByRole('button'); + const tab = getByRole('tab'); const callback = vi.fn(); component.$on('click', callback); From 183d5f3c25c3bc0b8b930ba629558fcfe1ced046 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 19 Jul 2023 17:27:07 +0200 Subject: [PATCH 46/71] fix: lint issues --- src/routes/console/project-[project]/settings/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 60cb06450..699f12ddf 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -263,4 +263,4 @@ bind:teamId teamName={$organizationList.teams.find((t) => t.$id == teamId).name} bind:show={showTransfer} /> -{/if} \ No newline at end of file +{/if} From e417783120d3ca88d6fdbd61fd996be64bb1e2f4 Mon Sep 17 00:00:00 2001 From: Elad Shechter Date: Mon, 24 Jul 2023 12:58:45 -0600 Subject: [PATCH 47/71] - Fix key attribute trim isn't trim Change to secondary trim utility class --- .../collection-[collection]/attributes/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte index 10f82e672..75a629bc9 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte @@ -84,7 +84,7 @@ aria-hidden="true" /> {/if}
    - {attribute.key} + {attribute.key}
    {#if attribute.status !== 'available'} Date: Tue, 25 Jul 2023 17:32:35 -0700 Subject: [PATCH 48/71] Ensure console requests include project header A change recently to Appwrite required all API calls to include the project ID. --- src/routes/console/+layout.ts | 7 ++++++- .../project-[project]/overview/platforms/wizard/store.ts | 8 ++++++-- .../console/project-[project]/settings/+page.svelte | 1 + .../project-[project]/settings/transferProject.svelte | 1 + src/routes/register/invite/[slug]/+page.svelte | 4 +++- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/routes/console/+layout.ts b/src/routes/console/+layout.ts index 65de11ecd..184409719 100644 --- a/src/routes/console/+layout.ts +++ b/src/routes/console/+layout.ts @@ -2,7 +2,12 @@ import { sdk } from '$lib/stores/sdk'; import type { LayoutLoad } from './$types'; export const load: LayoutLoad = async () => { - const response = await fetch(`${sdk.forConsole.client.config.endpoint}/health/version`); + const { endpoint, project } = sdk.forConsole.client.config; + const response = await fetch(`${endpoint}/health/version`, { + headers: { + 'X-Appwrite-Project': project + } + }); const data = await response.json(); return { diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/store.ts b/src/routes/console/project-[project]/overview/platforms/wizard/store.ts index 8a00d0d35..f8e7b1b88 100644 --- a/src/routes/console/project-[project]/overview/platforms/wizard/store.ts +++ b/src/routes/console/project-[project]/overview/platforms/wizard/store.ts @@ -56,8 +56,12 @@ export const versions = cachedStore< >('versions', function ({ set }) { return { load: async () => { - const { endpoint } = sdk.forConsole.client.config; - const response = await fetch(`${endpoint}/../versions`); + const { endpoint, project } = sdk.forConsole.client.config; + const response = await fetch(`${endpoint}/../versions`, { + headers: { + 'X-Appwrite-Project': project + } + }); set(await response.json()); } }; diff --git a/src/routes/console/project-[project]/settings/+page.svelte b/src/routes/console/project-[project]/settings/+page.svelte index 699f12ddf..be38f8bfc 100644 --- a/src/routes/console/project-[project]/settings/+page.svelte +++ b/src/routes/console/project-[project]/settings/+page.svelte @@ -74,6 +74,7 @@ 'PATCH', new URL(sdk.forConsole.client.config.endpoint + path), { + 'X-Appwrite-Project': sdk.forConsole.client.config.project, 'content-type': 'application/json' }, { diff --git a/src/routes/console/project-[project]/settings/transferProject.svelte b/src/routes/console/project-[project]/settings/transferProject.svelte index 9e16d5611..cba255afd 100644 --- a/src/routes/console/project-[project]/settings/transferProject.svelte +++ b/src/routes/console/project-[project]/settings/transferProject.svelte @@ -20,6 +20,7 @@ sdk.forConsole.client.config.endpoint + '/projects/' + $project.$id + '/team' ), { + 'X-Appwrite-Project': sdk.forConsole.client.config.project, 'content-type': 'application/json' }, { diff --git a/src/routes/register/invite/[slug]/+page.svelte b/src/routes/register/invite/[slug]/+page.svelte index 346f737c0..c2d9deb61 100644 --- a/src/routes/register/invite/[slug]/+page.svelte +++ b/src/routes/register/invite/[slug]/+page.svelte @@ -54,9 +54,11 @@ async function invite() { try { - const res = await fetch(`${sdk.forConsole.client.config.endpoint}/account/invite`, { + const { endpoint, project } = sdk.forConsole.client.config; + const res = await fetch(`${endpoint}/account/invite`, { method: 'POST', headers: { + 'X-Appwrite-Project': project, 'Content-Type': 'application/json' }, body: JSON.stringify({ From d6d960fec74a6e66e6faba80ecf6b3df5ca9060d Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Thu, 1 Jun 2023 17:59:50 -0700 Subject: [PATCH 49/71] Add user labels to user list and detail pages --- src/lib/actions/analytics.ts | 1 + .../project-[project]/auth/+page.svelte | 12 +- .../auth/user-[user]/+page.svelte | 2 + .../auth/user-[user]/updateLabels.svelte | 119 ++++++++++++++++++ 4 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/routes/console/project-[project]/auth/user-[user]/updateLabels.svelte diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index b9724ff75..664d86d46 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -118,6 +118,7 @@ export enum Submit { UserCreate = 'submit_user_create', UserDelete = 'submit_user_delete', UserUpdateEmail = 'submit_user_update_email', + UserUpdateLabels = 'submit_user_update_labels', UserUpdateName = 'submit_user_update_name', UserUpdatePassword = 'submit_user_update_password', UserUpdatePhone = 'submit_user_update_phone', diff --git a/src/routes/console/project-[project]/auth/+page.svelte b/src/routes/console/project-[project]/auth/+page.svelte index 0063f7ea1..39252ec87 100644 --- a/src/routes/console/project-[project]/auth/+page.svelte +++ b/src/routes/console/project-[project]/auth/+page.svelte @@ -29,6 +29,12 @@ export let data: PageData; + // TODO: Remove this when the console SDK is updated + const users = data.users.users.map((user) => { + const labels: string[] = []; + return { labels, ...user }; + }); + let showCreate = false; const projectId = $page.params.project; async function userCreated(event: CustomEvent>>) { @@ -49,10 +55,11 @@ Identifiers Status ID + Labels Joined - {#each data.users.users as user} + {#each users as user} @@ -102,6 +109,9 @@ + + {user.labels.join(', ')} + {toLocaleDateTime(user.registration)} diff --git a/src/routes/console/project-[project]/auth/user-[user]/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/+page.svelte index b48becb71..04ef2f14a 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/+page.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/+page.svelte @@ -2,6 +2,7 @@ import { Container } from '$lib/layout'; import DangerZone from './dangerZone.svelte'; import UpdateEmail from './updateEmail.svelte'; + import UpdateLabels from './updateLabels.svelte'; import UpdateName from './updateName.svelte'; import UpdatePassword from './updatePassword.svelte'; import UpdatePhone from './updatePhone.svelte'; @@ -15,6 +16,7 @@ + diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateLabels.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateLabels.svelte new file mode 100644 index 000000000..b8fe68150 --- /dev/null +++ b/src/routes/console/project-[project]/auth/user-[user]/updateLabels.svelte @@ -0,0 +1,119 @@ + + +
    + + Labels +

    + Categorize and manage your users based on specific criteria by assigning them + customizable labels. New label-based roles will be assigned. +

    + +
      + +
    • + {error ? error : 'Only alphanumeric characters are allowed'} +
    • +
    • + {#each suggestedLabels as suggestedLabel} + { + if (!labels.includes(suggestedLabel)) { + labels = [...labels, suggestedLabel]; + } else { + labels = labels.filter((e) => e !== suggestedLabel); + } + }}> + + {/each} +
    • +
    +
    + + + + +
    +
    From c57a8d291844cbe63090e0d0573233ef855f70ad Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Thu, 6 Jul 2023 16:57:50 -0700 Subject: [PATCH 50/71] Show user's last activity --- src/lib/helpers/date.ts | 10 ++++++++++ .../console/project-[project]/auth/+page.svelte | 15 +++++++++++++-- .../auth/user-[user]/dangerZone.svelte | 5 +++++ .../auth/user-[user]/updateStatus.svelte | 6 +++++- tests/unit/helpers/date.test.ts | 8 ++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/lib/helpers/date.ts b/src/lib/helpers/date.ts index 8558f315f..68f9c31a7 100644 --- a/src/lib/helpers/date.ts +++ b/src/lib/helpers/date.ts @@ -1,5 +1,10 @@ export const toLocaleDate = (datetime: string) => { const date = new Date(datetime); + + if (isNaN(date.getTime())) { + return 'n/a'; + } + const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'short', @@ -11,6 +16,11 @@ export const toLocaleDate = (datetime: string) => { export const toLocaleDateTime = (datetime: string | number) => { const date = new Date(datetime); + + if (isNaN(date.getTime())) { + return 'n/a'; + } + const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'short', diff --git a/src/routes/console/project-[project]/auth/+page.svelte b/src/routes/console/project-[project]/auth/+page.svelte index 0063f7ea1..830d43793 100644 --- a/src/routes/console/project-[project]/auth/+page.svelte +++ b/src/routes/console/project-[project]/auth/+page.svelte @@ -19,7 +19,7 @@ TableRowLink } from '$lib/elements/table'; import { Pill } from '$lib/elements'; - import { toLocaleDateTime } from '$lib/helpers/date'; + import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date'; import { Container } from '$lib/layout'; import { base } from '$app/paths'; import { goto } from '$app/navigation'; @@ -29,6 +29,13 @@ export let data: PageData; + // TODO: Remove this when the console SDK is updated + const users = data.users.users.map((user) => { + const labels: string[] = []; + const accessedAt = ''; + return { accessedAt, labels, ...user }; + }); + let showCreate = false; const projectId = $page.params.project; async function userCreated(event: CustomEvent>>) { @@ -50,9 +57,10 @@ Status ID Joined + Last Activity - {#each data.users.users as user} + {#each users as user} @@ -105,6 +113,9 @@ {toLocaleDateTime(user.registration)} + + {user.accessedAt ? toLocaleDate(user.accessedAt) : 'never'} + {/each} diff --git a/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte b/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte index 8fa2ff05d..a04d1cfc0 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/dangerZone.svelte @@ -1,10 +1,14 @@ @@ -42,6 +46,7 @@ ? [$user.email, $user.phone].join(',') : $user.email || $user.phone}

    +

    Last activity: {accessedAt ? toLocaleDate(accessedAt) : 'never'}

    diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte index 60a2189d1..80fe968c8 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updateStatus.svelte @@ -5,7 +5,7 @@ import { Dependencies } from '$lib/constants'; import { Pill } from '$lib/elements'; import { Button } from '$lib/elements/forms'; - import { toLocaleDateTime } from '$lib/helpers/date'; + import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { user } from './store'; @@ -71,6 +71,9 @@ trackError(error, Submit.UserUpdateStatus); } } + + // TODO: Remove this when the console SDK is updated + $: accessedAt = ($user as unknown as { accessedAt: string }).accessedAt; @@ -100,6 +103,7 @@

    {$user.phone}

    {/if}

    Joined: {toLocaleDateTime($user.registration)}

    +

    Last activity: {accessedAt ? toLocaleDate(accessedAt) : 'never'}

  • {#if !$user.status} blocked diff --git a/tests/unit/helpers/date.test.ts b/tests/unit/helpers/date.test.ts index 16b5ff3f4..fab13619a 100644 --- a/tests/unit/helpers/date.test.ts +++ b/tests/unit/helpers/date.test.ts @@ -16,6 +16,10 @@ describe('local date', () => { expect(toLocaleDate(value)).toBe(expected); }); }); + + it('invalid date', () => { + expect(toLocaleDate('')).toBe('n/a'); + }); }); describe('local date time', () => { @@ -27,6 +31,10 @@ describe('local date time', () => { expect(toLocaleDateTime(value)).toBe(expected); }); }); + + it('invalid date', () => { + expect(toLocaleDateTime('')).toBe('n/a'); + }); }); describe('is same day', () => { From 28b4b9984737e94264b0a2d003b4cbc6164130ba Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Fri, 21 Jul 2023 13:42:55 -0700 Subject: [PATCH 51/71] Update API Key Last Accessed to omit time Since accessedAt is only updated once in the last 24 hours, showing the time can cause confusion. --- .../console/project-[project]/overview/keys/+page.svelte | 4 ++-- .../overview/keys/[key]/+page@project-[project].svelte | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/console/project-[project]/overview/keys/+page.svelte b/src/routes/console/project-[project]/overview/keys/+page.svelte index 714ccea79..92cc16287 100644 --- a/src/routes/console/project-[project]/overview/keys/+page.svelte +++ b/src/routes/console/project-[project]/overview/keys/+page.svelte @@ -9,7 +9,7 @@ TableHeader, TableRowLink } from '$lib/elements/table'; - import { toLocaleDateTime } from '$lib/helpers/date'; + import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date'; import { wizard } from '$lib/stores/wizard'; import type { PageData } from './$types'; import Wizard from './wizard.svelte'; @@ -46,7 +46,7 @@ {key.name} - {key.accessedAt ? toLocaleDateTime(key.accessedAt) : 'never'} + {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} {key.expire ? toLocaleDateTime(key.expire) : 'never'} diff --git a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte index e82edaeb4..62d563158 100644 --- a/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/console/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -5,7 +5,7 @@ import { Dependencies } from '$lib/constants'; import { Button, Form, FormList, InputText } from '$lib/elements/forms'; import { symmetricDifference } from '$lib/helpers/array'; - import { toLocaleDateTime } from '$lib/helpers/date'; + import { toLocaleDate } from '$lib/helpers/date'; import { Container } from '$lib/layout'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; @@ -83,7 +83,7 @@ - {@const accessedAt = $key.accessedAt ? toLocaleDateTime($key.accessedAt) : 'never'} + {@const accessedAt = $key.accessedAt ? toLocaleDate($key.accessedAt) : 'never'}
    {$key.name} From 53abcbe90f1f77deb9b9b22d5aee039599f6f32a Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Thu, 27 Apr 2023 19:06:12 -0700 Subject: [PATCH 52/71] Add a generic OIDC OAuth2 provider --- src/lib/stores/oauth-providers.ts | 11 +- .../project-[project]/auth/oidcOAuth.svelte | 127 ++++++++++++++++++ static/icons/dark/color/oidc.svg | 4 + static/icons/dark/grayscale/oidc.svg | 4 + static/icons/light/color/oidc.svg | 4 + static/icons/light/grayscale/oidc.svg | 4 + 6 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 src/routes/console/project-[project]/auth/oidcOAuth.svelte create mode 100644 static/icons/dark/color/oidc.svg create mode 100644 static/icons/dark/grayscale/oidc.svg create mode 100644 static/icons/light/color/oidc.svg create mode 100644 static/icons/light/grayscale/oidc.svg diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index 40bcff26a..fbdd710cb 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -1,14 +1,15 @@ -import { writable } from 'svelte/store'; import type { Models } from '@appwrite.io/console'; import type { SvelteComponent } from 'svelte'; +import { writable } from 'svelte/store'; import Apple from '../../routes/console/project-[project]/auth/appleOAuth.svelte'; -import Microsoft from '../../routes/console/project-[project]/auth/microsoftOAuth.svelte'; -import Okta from '../../routes/console/project-[project]/auth/oktaOAuth.svelte'; import Auth0 from '../../routes/console/project-[project]/auth/auth0OAuth.svelte'; import Authentik from '../../routes/console/project-[project]/auth/authentikOAuth.svelte'; import GitLab from '../../routes/console/project-[project]/auth/gitlabOAuth.svelte'; import Google from '../../routes/console/project-[project]/auth/googleOAuth.svelte'; import Main from '../../routes/console/project-[project]/auth/mainOAuth.svelte'; +import Microsoft from '../../routes/console/project-[project]/auth/microsoftOAuth.svelte'; +import Oidc from '../../routes/console/project-[project]/auth/oidcOAuth.svelte'; +import Okta from '../../routes/console/project-[project]/auth/oktaOAuth.svelte'; export type Provider = Models.Provider & { icon: string; @@ -94,6 +95,10 @@ const setProviders = (project: Models.Project): Provider[] => { case 'notion': docs = 'https://developers.notion.com/docs'; break; + case 'oidc': + docs = 'https://openid.net/connect/faq/'; + component = Oidc; + break; case 'okta': docs = 'https://developer.okta.com'; component = Okta; diff --git a/src/routes/console/project-[project]/auth/oidcOAuth.svelte b/src/routes/console/project-[project]/auth/oidcOAuth.svelte new file mode 100644 index 000000000..8c3db7df6 --- /dev/null +++ b/src/routes/console/project-[project]/auth/oidcOAuth.svelte @@ -0,0 +1,127 @@ + + + + {provider.name.toUpperCase()} OAuth2 Settings + +

    + To use {provider.name.toUpperCase()} authentication in your application, first fill in this + form. For more info you can + visit the docs. +

    + + + + + + + + + + To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. + +
    +

    URI

    + +
    +
    + + + + +
    diff --git a/static/icons/dark/color/oidc.svg b/static/icons/dark/color/oidc.svg new file mode 100644 index 000000000..0eb22aad2 --- /dev/null +++ b/static/icons/dark/color/oidc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/icons/dark/grayscale/oidc.svg b/static/icons/dark/grayscale/oidc.svg new file mode 100644 index 000000000..f3a6a0937 --- /dev/null +++ b/static/icons/dark/grayscale/oidc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/icons/light/color/oidc.svg b/static/icons/light/color/oidc.svg new file mode 100644 index 000000000..0eb22aad2 --- /dev/null +++ b/static/icons/light/color/oidc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/static/icons/light/grayscale/oidc.svg b/static/icons/light/grayscale/oidc.svg new file mode 100644 index 000000000..84da2cb78 --- /dev/null +++ b/static/icons/light/grayscale/oidc.svg @@ -0,0 +1,4 @@ + + + + From 68867afabfd3431d65e7263edcc7d00163cd75d5 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Thu, 20 Jul 2023 16:17:49 -0700 Subject: [PATCH 53/71] Format OAuth2 provider name better Show provider name in the Console and use the provider key for everything else. --- src/lib/stores/oauth-providers.ts | 8 +++++--- .../console/project-[project]/auth/appleOAuth.svelte | 4 +--- .../console/project-[project]/auth/auth0OAuth.svelte | 4 +--- .../project-[project]/auth/authentikOAuth.svelte | 4 +--- .../console/project-[project]/auth/gitlabOAuth.svelte | 4 +--- .../console/project-[project]/auth/mainOAuth.svelte | 4 +--- .../project-[project]/auth/microsoftOAuth.svelte | 4 +--- .../console/project-[project]/auth/oidcOAuth.svelte | 10 ++++------ .../console/project-[project]/auth/oktaOAuth.svelte | 4 +--- .../project-[project]/auth/settings/+page.svelte | 2 +- .../console/project-[project]/auth/updateOAuth.ts | 2 +- 11 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index fbdd710cb..c43a597df 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -12,6 +12,7 @@ import Oidc from '../../routes/console/project-[project]/auth/oidcOAuth.svelte'; import Okta from '../../routes/console/project-[project]/auth/oktaOAuth.svelte'; export type Provider = Models.Provider & { + key: string; icon: string; docs?: string; component?: typeof SvelteComponent; @@ -24,11 +25,12 @@ export type Providers = { const setProviders = (project: Models.Project): Provider[] => { return ( project?.providers.map((n) => { + const p = n as Models.Provider & { key: string }; let docs: Provider['docs']; - let icon: Provider['icon'] = n.name.toLowerCase(); + let icon: Provider['icon'] = p.key.toLowerCase(); let component: Provider['component'] = Main; - switch (n.name.toLowerCase()) { + switch (p.key.toLowerCase()) { case 'amazon': docs = 'https://developer.amazon.com/apps-and-games/services-and-apis'; break; @@ -156,7 +158,7 @@ const setProviders = (project: Models.Project): Provider[] => { } return { - ...n, + ...p, icon, docs, component diff --git a/src/routes/console/project-[project]/auth/appleOAuth.svelte b/src/routes/console/project-[project]/auth/appleOAuth.svelte index 88b48040c..850ae6721 100644 --- a/src/routes/console/project-[project]/auth/appleOAuth.svelte +++ b/src/routes/console/project-[project]/auth/appleOAuth.svelte @@ -63,9 +63,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/auth0OAuth.svelte b/src/routes/console/project-[project]/auth/auth0OAuth.svelte index b8e0fa35c..52e46a680 100644 --- a/src/routes/console/project-[project]/auth/auth0OAuth.svelte +++ b/src/routes/console/project-[project]/auth/auth0OAuth.svelte @@ -72,9 +72,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/authentikOAuth.svelte b/src/routes/console/project-[project]/auth/authentikOAuth.svelte index 350fac230..e204be4e0 100644 --- a/src/routes/console/project-[project]/auth/authentikOAuth.svelte +++ b/src/routes/console/project-[project]/auth/authentikOAuth.svelte @@ -72,9 +72,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/gitlabOAuth.svelte b/src/routes/console/project-[project]/auth/gitlabOAuth.svelte index 934d73801..510e4a5c6 100644 --- a/src/routes/console/project-[project]/auth/gitlabOAuth.svelte +++ b/src/routes/console/project-[project]/auth/gitlabOAuth.svelte @@ -70,9 +70,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/mainOAuth.svelte b/src/routes/console/project-[project]/auth/mainOAuth.svelte index 684e8ff81..36d0aa89f 100644 --- a/src/routes/console/project-[project]/auth/mainOAuth.svelte +++ b/src/routes/console/project-[project]/auth/mainOAuth.svelte @@ -63,9 +63,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/microsoftOAuth.svelte b/src/routes/console/project-[project]/auth/microsoftOAuth.svelte index e404fec84..10925962a 100644 --- a/src/routes/console/project-[project]/auth/microsoftOAuth.svelte +++ b/src/routes/console/project-[project]/auth/microsoftOAuth.svelte @@ -72,9 +72,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/oidcOAuth.svelte b/src/routes/console/project-[project]/auth/oidcOAuth.svelte index 8c3db7df6..6fade4f7f 100644 --- a/src/routes/console/project-[project]/auth/oidcOAuth.svelte +++ b/src/routes/console/project-[project]/auth/oidcOAuth.svelte @@ -61,11 +61,11 @@ - {provider.name.toUpperCase()} OAuth2 Settings + {provider.name} OAuth2 Settings

    - To use {provider.name.toUpperCase()} authentication in your application, first fill in this - form. For more info you can + To use {provider.name} authentication in your application, first fill in this form. For more + info you can visit the docs.

    @@ -110,9 +110,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/oktaOAuth.svelte b/src/routes/console/project-[project]/auth/oktaOAuth.svelte index 98f607df1..548a99576 100644 --- a/src/routes/console/project-[project]/auth/oktaOAuth.svelte +++ b/src/routes/console/project-[project]/auth/oktaOAuth.svelte @@ -82,9 +82,7 @@

    URI

    + value={`${sdk.forConsole.client.config.endpoint}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} />
    diff --git a/src/routes/console/project-[project]/auth/settings/+page.svelte b/src/routes/console/project-[project]/auth/settings/+page.svelte index 42f640d07..afacc54eb 100644 --- a/src/routes/console/project-[project]/auth/settings/+page.svelte +++ b/src/routes/console/project-[project]/auth/settings/+page.svelte @@ -75,7 +75,7 @@ on:click={() => { selectedProvider = provider; trackEvent(`click_select_provider`, { - provider: provider.name.toLowerCase() + provider: provider.key.toLowerCase() }); }}>
    diff --git a/src/routes/console/project-[project]/auth/updateOAuth.ts b/src/routes/console/project-[project]/auth/updateOAuth.ts index 8e7f3272e..f148c41a3 100644 --- a/src/routes/console/project-[project]/auth/updateOAuth.ts +++ b/src/routes/console/project-[project]/auth/updateOAuth.ts @@ -28,7 +28,7 @@ export async function updateOAuth({ try { await sdk.forConsole.projects.updateOAuth2( projectId, - provider.name.toLowerCase(), + provider.key, appId || undefined, secret || undefined, enabled From b118147656a7c0ae4d8beaa93048ecda7d180a79 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 26 Jul 2023 10:27:46 -0700 Subject: [PATCH 54/71] Update user preferences text to match design --- .../project-[project]/auth/user-[user]/updatePrefs.svelte | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte b/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte index 08511efd2..2df1583c4 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updatePrefs.svelte @@ -56,11 +56,8 @@
    - User Preferences -

    - You can update your user preferences by storing information on the user's objects so - they can easily be shared across devices and sessions. -

    + Preferences +

    Add custom user preferences to share them across devices and sessions.

      From ac757e398900f2e1db62085ae6dbe4a1b30dee7e Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 26 Jul 2023 15:40:01 -0700 Subject: [PATCH 55/71] Clear wizard interceptor on wizard start and close Without doing this, an interceptor from a different wizard can run when a new wizard is opened causing incorrect validation. --- src/lib/stores/wizard.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/stores/wizard.ts b/src/lib/stores/wizard.ts index 355eb7afc..3e0ed9ecc 100644 --- a/src/lib/stores/wizard.ts +++ b/src/lib/stores/wizard.ts @@ -24,6 +24,7 @@ function createWizardStore() { update((n) => { n.show = true; n.component = component; + n.interceptor = null; n.media = media; trackEvent('wizard_start'); return n; @@ -39,6 +40,7 @@ function createWizardStore() { update((n) => { n.show = false; n.component = null; + n.interceptor = null; n.media = null; return n; From 7d1c041c973ed935870e18f9ed57dd5956f80a2d Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 26 Jul 2023 16:17:46 -0700 Subject: [PATCH 56/71] Fix wizard component type Before this, we kept getting warnings like: Type 'typeof Wizard__SvelteComponent_' is missing the following properties from type 'SvelteComponentDev' --- src/lib/stores/wizard.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/stores/wizard.ts b/src/lib/stores/wizard.ts index 3e0ed9ecc..0eccf0be0 100644 --- a/src/lib/stores/wizard.ts +++ b/src/lib/stores/wizard.ts @@ -1,11 +1,11 @@ import { trackEvent } from '$lib/actions/analytics'; -import type { SvelteComponent } from 'svelte'; +import type { ComponentType } from 'svelte'; import { writable } from 'svelte/store'; export type WizardStore = { show: boolean; media?: string; - component?: typeof SvelteComponent; + component?: ComponentType; interceptor?: () => Promise; }; @@ -20,7 +20,7 @@ function createWizardStore() { return { subscribe, set, - start: (component: typeof SvelteComponent, media: string = null) => + start: (component: ComponentType, media: string = null) => update((n) => { n.show = true; n.component = component; From 69b3d72104d2a31ff742729499152e9d6b6f13c0 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Wed, 26 Jul 2023 10:42:16 -0700 Subject: [PATCH 57/71] Update user email to match design --- .../project-[project]/auth/user-[user]/updateEmail.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte index 62ff255f8..5ffa721c0 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte @@ -36,6 +36,7 @@ Email +

      Update user's email. An Email should be formatted as: name@example.com.

        Date: Wed, 26 Jul 2023 10:42:30 -0700 Subject: [PATCH 58/71] Update user phone to match design --- .../project-[project]/auth/user-[user]/updatePhone.svelte | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte b/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte index baeeaea18..83500077b 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updatePhone.svelte @@ -36,6 +36,11 @@ Phone +

        + Update user's phone. A phone number must contain leading '+' and maximum of 15 digits. +

          Date: Thu, 27 Jul 2023 11:05:42 -0700 Subject: [PATCH 59/71] Fix bolding for update password --- .../project-[project]/auth/user-[user]/updatePassword.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte b/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte index 044408912..1aeeb199e 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updatePassword.svelte @@ -34,7 +34,7 @@

    - Enter a new password. A password must contain at least 8 characters. + Enter a new password. A password must contain at least 8 characters.

      From a8ad70f66047a6460ad7810d5a63854a4dbef37a Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Fri, 28 Jul 2023 11:34:57 -0700 Subject: [PATCH 60/71] Update update email, password, and phone description per Eldad's request Use inline code for email to indicate it's a value. Remove bolding to simplify things. --- .../project-[project]/auth/user-[user]/updateEmail.svelte | 6 +++++- .../auth/user-[user]/updatePassword.svelte | 4 +--- .../project-[project]/auth/user-[user]/updatePhone.svelte | 4 +--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte b/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte index 5ffa721c0..8a18491e3 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/updateEmail.svelte @@ -36,7 +36,11 @@ Email -

      Update user's email. An Email should be formatted as: name@example.com.

      +

      + Update user's email. An Email should be formatted as: name@example.com. +

        Password
    -

    - Enter a new password. A password must contain at least 8 characters. -

    +

    Enter a new password. A password must contain at least 8 characters.

      Phone

      - Update user's phone. A phone number must contain leading '+' and maximum of 15 digits. + Update user's phone. A phone number must contain leading '+' and maximum of 15 digits.

        From 20f541a59452ca6e7349aadba0d4e41e6d3ec548 Mon Sep 17 00:00:00 2001 From: Steven Nguyen Date: Mon, 31 Jul 2023 10:05:06 -0700 Subject: [PATCH 61/71] Update OIDC icons per design's request --- static/icons/dark/color/oidc.svg | 3 +-- static/icons/dark/grayscale/oidc.svg | 3 +-- static/icons/light/color/oidc.svg | 3 +-- static/icons/light/grayscale/oidc.svg | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/static/icons/dark/color/oidc.svg b/static/icons/dark/color/oidc.svg index 0eb22aad2..3e45a505d 100644 --- a/static/icons/dark/color/oidc.svg +++ b/static/icons/dark/color/oidc.svg @@ -1,4 +1,3 @@ - - + diff --git a/static/icons/dark/grayscale/oidc.svg b/static/icons/dark/grayscale/oidc.svg index f3a6a0937..d4720bbca 100644 --- a/static/icons/dark/grayscale/oidc.svg +++ b/static/icons/dark/grayscale/oidc.svg @@ -1,4 +1,3 @@ - - + diff --git a/static/icons/light/color/oidc.svg b/static/icons/light/color/oidc.svg index 0eb22aad2..3e45a505d 100644 --- a/static/icons/light/color/oidc.svg +++ b/static/icons/light/color/oidc.svg @@ -1,4 +1,3 @@ - - + diff --git a/static/icons/light/grayscale/oidc.svg b/static/icons/light/grayscale/oidc.svg index 84da2cb78..ec5d3f9dd 100644 --- a/static/icons/light/grayscale/oidc.svg +++ b/static/icons/light/grayscale/oidc.svg @@ -1,4 +1,3 @@ - - + From 836a3b0529a2291b320c3490b247bb1d637e0095 Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 3 Aug 2023 16:45:41 +0100 Subject: [PATCH 62/71] firebase oauth changes --- src/lib/stores/migration.ts | 1 + .../(migration-wizard)/resource-form.svelte | 45 ++++-- .../settings/migrations/(import)/step1.svelte | 129 +++++++----------- .../migrations/(import)/wizard.svelte | 15 +- .../settings/migrations/+page.ts | 10 +- 5 files changed, 104 insertions(+), 96 deletions(-) diff --git a/src/lib/stores/migration.ts b/src/lib/stores/migration.ts index 0eaf52592..953f7b695 100644 --- a/src/lib/stores/migration.ts +++ b/src/lib/stores/migration.ts @@ -177,6 +177,7 @@ type AppwriteInput = { type FirebaseInput = { provider: 'firebase'; serviceAccount?: string; + projectId?: string; }; type SupabaseInput = { diff --git a/src/routes/console/(migration-wizard)/resource-form.svelte b/src/routes/console/(migration-wizard)/resource-form.svelte index 5a0a730dc..6ce6add0c 100644 --- a/src/routes/console/(migration-wizard)/resource-form.svelte +++ b/src/routes/console/(migration-wizard)/resource-form.svelte @@ -98,11 +98,17 @@ break; } case 'firebase': { - const res = await sdk.forProject.migrations.getFirebaseReport( - providerResources.firebase, - $provider.serviceAccount - ); - report = res; + if ($provider.projectId) { + // OAuth + } else if ($provider.serviceAccount) { + // Manual auth + const res = await sdk.forProject.migrations.getFirebaseReport( + providerResources.firebase, + $provider.serviceAccount + ); + report = res; + } + break; } case 'nhost': { @@ -158,15 +164,30 @@

        Make sure to have enough storage in your project plan when importing files

    -
    -
    - + {#if $provider.provider === 'firebase'} +
    +
    + +
    +
    +

    Possible charges by Firebase

    +

    + Appwrite does not impose charges for importing data, but please note that + Firebase may have its own pricing for this service +

    +
    -
    -

    Transfer is free of charge

    -

    You won't be charged for Appwrite bandwidth usage for importing data

    + {:else} +
    +
    + +
    +
    +

    Transfer is free of charge

    +

    You won't be charged for Appwrite bandwidth usage for importing data

    +
    -
    + {/if}
    diff --git a/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte b/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte index 8e51ea1e4..904b9433f 100644 --- a/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte +++ b/src/routes/console/project-[project]/settings/migrations/(import)/step1.svelte @@ -1,12 +1,21 @@ Choose provider -
    +
    {#each Object.entries(providers) as [key, value]} -