- {#if $backButton} - - - {/if}

+ {#if $backButton} + + + {/if} {$title}

{#if $copyData?.value} diff --git a/src/lib/stores/auth-methods.ts b/src/lib/stores/auth-methods.ts index 82b7ecb6d..2f8d50f13 100644 --- a/src/lib/stores/auth-methods.ts +++ b/src/lib/stores/auth-methods.ts @@ -1,14 +1,25 @@ import { writable } from 'svelte/store'; import type { Models } from '@aw-labs/appwrite-console'; +export type AuthMethod = { + label: string; + method: string; + value: boolean | null; +}; + function createAuthMethods() { const { subscribe, set } = writable({ list: [ { - label: 'Password', + label: 'Email/Password', method: 'email-password', value: null }, + { + label: 'Phone', + method: 'phone', + value: null + }, { label: 'Magic URL', method: 'magic-url', @@ -28,11 +39,6 @@ function createAuthMethods() { label: 'JWT', method: 'jwt', value: null - }, - { - label: 'Phone', - method: 'phone', - value: null } ] }); @@ -43,10 +49,15 @@ function createAuthMethods() { load: (project: Models.Project) => { const list = [ { - label: 'Password', + label: 'Email/Password', method: 'email-password', value: project.authEmailPassword }, + { + label: 'Phone', + method: 'phone', + value: project.authPhone + }, { label: 'Magic URL', method: 'magic-url', @@ -66,11 +77,6 @@ function createAuthMethods() { label: 'JWT', method: 'jwt', value: project.authJWT - }, - { - label: 'Phone', - method: 'phone', - value: project.authPhone } ]; set({ list }); diff --git a/src/lib/stores/layout.ts b/src/lib/stores/layout.ts index 1e4f55518..43c374ed5 100644 --- a/src/lib/stores/layout.ts +++ b/src/lib/stores/layout.ts @@ -1,5 +1,5 @@ import { project } from '../../routes/console/[project]/store'; -import { get, writable } from 'svelte/store'; +import { get, readable, writable } from 'svelte/store'; export type Tab = { href: string; @@ -64,3 +64,5 @@ export function updateLayout(args: updateLayoutArguments) { } } } + +export const pageLimit = readable(12); // default page limit diff --git a/src/lib/stores/notifications.ts b/src/lib/stores/notifications.ts index 0642824df..397b578e4 100644 --- a/src/lib/stores/notifications.ts +++ b/src/lib/stores/notifications.ts @@ -32,7 +32,13 @@ export const addNotification = (notification: Omit) => { }; const n = { ...defaults, ...notification }; - notifications.update((all) => [n, ...all]); + notifications.update((all) => { + if (all.length < 3) { + return [n, ...all]; + } else { + return [n, ...all.slice(0, 2)]; + } + }); if (n.timeout) setTimeout(() => dismissNotification(n.id), n.timeout); }; diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index 45512bc7c..68baf0ff4 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -1,11 +1,11 @@ import { writable } from 'svelte/store'; import type { Models } from '@aw-labs/appwrite-console'; import type { SvelteComponent } from 'svelte'; -import Apple from '../../routes/console/[project]/users/_appleOAuth.svelte'; -import Microsoft from '../../routes/console/[project]/users/_microsoftOAuth.svelte'; -import Okta from '../../routes/console/[project]/users/_oktaOAuth.svelte'; -import Auth0 from '../../routes/console/[project]/users/_auth0OAuth.svelte'; -import Main from '../../routes/console/[project]/users/_mainOAuth.svelte'; +import Apple from '../../routes/console/[project]/authentication/_appleOAuth.svelte'; +import Microsoft from '../../routes/console/[project]/authentication/_microsoftOAuth.svelte'; +import Okta from '../../routes/console/[project]/authentication/_oktaOAuth.svelte'; +import Auth0 from '../../routes/console/[project]/authentication/_auth0OAuth.svelte'; +import Main from '../../routes/console/[project]/authentication/_mainOAuth.svelte'; export type Provider = { name: string; diff --git a/src/routes/console/[project]/users/__layout.svelte b/src/routes/console/[project]/authentication/__layout.svelte similarity index 84% rename from src/routes/console/[project]/users/__layout.svelte rename to src/routes/console/[project]/authentication/__layout.svelte index a5ccdc10f..16b0c10d1 100644 --- a/src/routes/console/[project]/users/__layout.svelte +++ b/src/routes/console/[project]/authentication/__layout.svelte @@ -3,7 +3,7 @@ import { updateLayout } from '$lib/stores/layout'; import { onMount } from 'svelte'; - const path = 'users'; + const path = 'authentication'; onMount(handle); afterNavigate(handle); @@ -13,10 +13,10 @@ function handle(event = null) { updateLayout({ navigate: event, - title: 'Users', + title: 'Authentication', level: 3, breadcrumbs: { - title: 'Users', + title: 'Authentication', href: path }, tabs: [ @@ -28,10 +28,6 @@ href: `${path}/teams`, title: 'Teams' }, - { - href: `${path}/authentication`, - title: 'Authentication' - }, { href: `${path}/usage`, title: 'Usage' @@ -39,6 +35,10 @@ { href: `${path}/security`, title: 'Security' + }, + { + href: `${path}/settings`, + title: 'Settings' } ] }); diff --git a/src/routes/console/[project]/users/_appleOAuth.svelte b/src/routes/console/[project]/authentication/_appleOAuth.svelte similarity index 93% rename from src/routes/console/[project]/users/_appleOAuth.svelte rename to src/routes/console/[project]/authentication/_appleOAuth.svelte index 157ce1900..f7e18291b 100644 --- a/src/routes/console/[project]/users/_appleOAuth.svelte +++ b/src/routes/console/[project]/authentication/_appleOAuth.svelte @@ -29,6 +29,12 @@ secret ); showModal = false; + addNotification({ + type: 'success', + message: `${provider.name} authentication has been ${ + provider.active ? 'enabled' : 'disabled' + }` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/_auth0OAuth.svelte b/src/routes/console/[project]/authentication/_auth0OAuth.svelte similarity index 93% rename from src/routes/console/[project]/users/_auth0OAuth.svelte rename to src/routes/console/[project]/authentication/_auth0OAuth.svelte index ee16907db..7baa58b4d 100644 --- a/src/routes/console/[project]/users/_auth0OAuth.svelte +++ b/src/routes/console/[project]/authentication/_auth0OAuth.svelte @@ -29,6 +29,12 @@ secret ); showModal = false; + addNotification({ + type: 'success', + message: `${provider.name} authentication has been ${ + provider.active ? 'enabled' : 'disabled' + }` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/_createTeam.svelte b/src/routes/console/[project]/authentication/_createTeam.svelte similarity index 100% rename from src/routes/console/[project]/users/_createTeam.svelte rename to src/routes/console/[project]/authentication/_createTeam.svelte diff --git a/src/routes/console/[project]/users/_createUser.svelte b/src/routes/console/[project]/authentication/_createUser.svelte similarity index 100% rename from src/routes/console/[project]/users/_createUser.svelte rename to src/routes/console/[project]/authentication/_createUser.svelte diff --git a/src/routes/console/[project]/users/_mainOAuth.svelte b/src/routes/console/[project]/authentication/_mainOAuth.svelte similarity index 92% rename from src/routes/console/[project]/users/_mainOAuth.svelte rename to src/routes/console/[project]/authentication/_mainOAuth.svelte index 85677ab84..f874c8198 100644 --- a/src/routes/console/[project]/users/_mainOAuth.svelte +++ b/src/routes/console/[project]/authentication/_mainOAuth.svelte @@ -25,6 +25,12 @@ provider.secret ); showModal = false; + addNotification({ + type: 'success', + message: `${provider.name} authentication has been ${ + provider.active ? 'enabled' : 'disabled' + }` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/_microsoftOAuth.svelte b/src/routes/console/[project]/authentication/_microsoftOAuth.svelte similarity index 93% rename from src/routes/console/[project]/users/_microsoftOAuth.svelte rename to src/routes/console/[project]/authentication/_microsoftOAuth.svelte index 432e54569..fc3bff73a 100644 --- a/src/routes/console/[project]/users/_microsoftOAuth.svelte +++ b/src/routes/console/[project]/authentication/_microsoftOAuth.svelte @@ -29,6 +29,12 @@ ); showModal = false; + addNotification({ + type: 'success', + message: `${provider.name} authentication has been ${ + provider.active ? 'enabled' : 'disabled' + }` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/_oktaOAuth.svelte b/src/routes/console/[project]/authentication/_oktaOAuth.svelte similarity index 93% rename from src/routes/console/[project]/users/_oktaOAuth.svelte rename to src/routes/console/[project]/authentication/_oktaOAuth.svelte index 32bb06db6..fb32e4b64 100644 --- a/src/routes/console/[project]/users/_oktaOAuth.svelte +++ b/src/routes/console/[project]/authentication/_oktaOAuth.svelte @@ -28,8 +28,13 @@ provider.id, secret ); - showModal = false; + addNotification({ + type: 'success', + message: `${provider.name} authentication has been ${ + provider.active ? 'enabled' : 'disabled' + }` + }); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/index.svelte b/src/routes/console/[project]/authentication/index.svelte similarity index 92% rename from src/routes/console/[project]/users/index.svelte rename to src/routes/console/[project]/authentication/index.svelte index 61a8d0f07..db078a2c7 100644 --- a/src/routes/console/[project]/users/index.svelte +++ b/src/routes/console/[project]/authentication/index.svelte @@ -21,20 +21,20 @@ import { base } from '$app/paths'; import { usersList } from './store'; import type { Models } from '@aw-labs/appwrite-console'; + import { pageLimit } from '$lib/stores/layout'; let showCreate = false; let search = ''; let offset = 0; - const limit = 5; const project = $page.params.project; const getAvatar = (name: string) => sdkForProject.avatars.getInitials(name, 32, 32).toString(); const userCreated = async (event: CustomEvent>>) => { - await goto(`${base}/console/${project}/users/user/${event.detail.$id}`); + await goto(`${base}/console/${project}/authentication/user/${event.detail.$id}`); }; $: if (search) offset = 0; - $: usersList.load(search, limit, offset ?? 0); + $: usersList.load(search, $pageLimit, offset ?? 0); @@ -63,7 +63,8 @@ {#each $usersList.users as user} - +
@@ -98,7 +99,7 @@

Total results: {$usersList.total}

- +
{:else if search} @@ -114,7 +115,7 @@

Total results: {$usersList.total}

- +
{:else} diff --git a/src/routes/console/[project]/users/security.svelte b/src/routes/console/[project]/authentication/security.svelte similarity index 96% rename from src/routes/console/[project]/users/security.svelte rename to src/routes/console/[project]/authentication/security.svelte index d65672589..f2467c717 100644 --- a/src/routes/console/[project]/users/security.svelte +++ b/src/routes/console/[project]/authentication/security.svelte @@ -135,7 +135,7 @@ -

Session Length

+

Session Length - (Coming Soon)

If you reduce the limit, users who are currently logged in will be logged out of the application. @@ -143,8 +143,9 @@

    - + { + const authUpdate = async (box: AuthMethod) => { try { - await sdkForConsole.projects.updateAuthStatus(projectId, id, value); + await sdkForConsole.projects.updateAuthStatus(projectId, box.method, box.value); addNotification({ type: 'success', - message: 'Updated project authentication status successfully' + message: `${box.label} authentication has been ${ + box.value ? 'enabled' : 'disabled' + }` }); } catch (error) { addNotification({ @@ -50,7 +52,7 @@ id={box.method} bind:value={box.value} on:change={() => { - authUpdate(box.method, box.value); + authUpdate(box); }} /> {/each}
@@ -85,7 +87,7 @@

{provider.name}

- {provider.active ? 'Enabled' : 'Disabled'} + {provider.active ? 'enabled' : 'disabled'}
diff --git a/src/routes/console/[project]/users/store.ts b/src/routes/console/[project]/authentication/store.ts similarity index 100% rename from src/routes/console/[project]/users/store.ts rename to src/routes/console/[project]/authentication/store.ts diff --git a/src/routes/console/[project]/users/teams.svelte b/src/routes/console/[project]/authentication/teams.svelte similarity index 95% rename from src/routes/console/[project]/users/teams.svelte rename to src/routes/console/[project]/authentication/teams.svelte index b65691801..989cafc42 100644 --- a/src/routes/console/[project]/users/teams.svelte +++ b/src/routes/console/[project]/authentication/teams.svelte @@ -29,7 +29,7 @@ const project = $page.params.project; const getAvatar = (name: string) => sdkForProject.avatars.getInitials(name, 32, 32).toString(); const teamCreated = async (event: CustomEvent) => { - await goto(`${base}/console/${project}/users/teams/${event.detail.$id}`); + await goto(`${base}/console/${project}/authentication/teams/${event.detail.$id}`); }; $: if (search) offset = 0; @@ -60,7 +60,8 @@ {#each $teamsList.teams as team} - +
diff --git a/src/routes/console/[project]/users/teams/[team]/__layout.svelte b/src/routes/console/[project]/authentication/teams/[team]/__layout.svelte similarity index 90% rename from src/routes/console/[project]/users/teams/[team]/__layout.svelte rename to src/routes/console/[project]/authentication/teams/[team]/__layout.svelte index e756409f8..d9ca9bb49 100644 --- a/src/routes/console/[project]/users/teams/[team]/__layout.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/__layout.svelte @@ -7,7 +7,7 @@ import { onMount } from 'svelte'; const teamId = $page.params.team; - const path = `users/teams/${teamId}`; + const path = `authentication/teams/${teamId}`; onMount(handle); afterNavigate(handle); @@ -21,7 +21,7 @@ navigate: event, level: 4, title: $team.name, - back: `${base}/console/${$page.params.project}/users/teams`, + back: `${base}/console/${$page.params.project}/authentication/teams`, breadcrumbs: { title: $team.name, href: `teams/${teamId}` diff --git a/src/routes/console/[project]/users/teams/[team]/_createMembership.svelte b/src/routes/console/[project]/authentication/teams/[team]/_createMembership.svelte similarity index 97% rename from src/routes/console/[project]/users/teams/[team]/_createMembership.svelte rename to src/routes/console/[project]/authentication/teams/[team]/_createMembership.svelte index b58a92960..03438bb2f 100644 --- a/src/routes/console/[project]/users/teams/[team]/_createMembership.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/_createMembership.svelte @@ -14,7 +14,7 @@ let name: string, email: string, roles: []; const create = async () => { - const url = `${$page.url.origin}/console/${$page.params.project}/users/teams/${$page.params.team}/members`; + const url = `${$page.url.origin}/console/${$page.params.project}/authentication/teams/${$page.params.team}/members`; try { const user = await sdkForProject.teams.createMembership( diff --git a/src/routes/console/[project]/users/teams/[team]/_deleteMembership.svelte b/src/routes/console/[project]/authentication/teams/[team]/_deleteMembership.svelte similarity index 93% rename from src/routes/console/[project]/users/teams/[team]/_deleteMembership.svelte rename to src/routes/console/[project]/authentication/teams/[team]/_deleteMembership.svelte index 22c68152f..0ea4aa7e0 100644 --- a/src/routes/console/[project]/users/teams/[team]/_deleteMembership.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/_deleteMembership.svelte @@ -23,7 +23,7 @@ showDelete = false; dispatch('deleted'); await goto( - `${base}/console/${$page.params.project}/users/teams/${selectedMembership.teamId}/members` + `${base}/console/${$page.params.project}/authentication/teams/${selectedMembership.teamId}/members` ); } catch (error) { addNotification({ diff --git a/src/routes/console/[project]/users/teams/[team]/_deleteTeam.svelte b/src/routes/console/[project]/authentication/teams/[team]/_deleteTeam.svelte similarity index 98% rename from src/routes/console/[project]/users/teams/[team]/_deleteTeam.svelte rename to src/routes/console/[project]/authentication/teams/[team]/_deleteTeam.svelte index 1b1a18398..d192856a7 100644 --- a/src/routes/console/[project]/users/teams/[team]/_deleteTeam.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/_deleteTeam.svelte @@ -15,7 +15,7 @@ try { await sdkForProject.teams.delete(team.$id); showDelete = false; - await goto(`${base}/console/${$page.params.project}/users/teams`); + await goto(`${base}/console/${$page.params.project}/authentication/teams`); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/teams/[team]/activity.svelte b/src/routes/console/[project]/authentication/teams/[team]/activity.svelte similarity index 73% rename from src/routes/console/[project]/users/teams/[team]/activity.svelte rename to src/routes/console/[project]/authentication/teams/[team]/activity.svelte index dabae43a0..7e2d74f89 100644 --- a/src/routes/console/[project]/users/teams/[team]/activity.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/activity.svelte @@ -14,11 +14,19 @@ import { toLocaleDateTime } from '$lib/helpers/date'; import { sdkForProject } from '$lib/stores/sdk'; import { app } from '$lib/stores/app'; + import { pageLimit } from '$lib/stores/layout'; let offset = 0; - const limit = 5; - $: request = sdkForProject.teams.listLogs($page.params.team, limit, offset); + $: request = sdkForProject.teams.listLogs($page.params.team, $pageLimit, offset); + + let browsers = { + firefox: 'firefox', + chrome: 'chrome', + safari: 'safari', + opera: 'opera', + edge: 'edge' + }; @@ -39,16 +47,20 @@
-
- {log.clientName} +
+ {#if browsers[log.clientName.toLocaleLowerCase()]} + {log.clientName} + {:else} + + {/if}
-

+

{log.clientName} {log.clientVersion} on {log.osName} @@ -88,7 +100,7 @@ class="u-flex u-margin-block-start-32 u-main-space-between">

Total results: {response.total}

- +
{/await} diff --git a/src/routes/console/[project]/users/teams/[team]/index.svelte b/src/routes/console/[project]/authentication/teams/[team]/index.svelte similarity index 94% rename from src/routes/console/[project]/users/teams/[team]/index.svelte rename to src/routes/console/[project]/authentication/teams/[team]/index.svelte index 57b1a3dc4..17849fdcf 100644 --- a/src/routes/console/[project]/users/teams/[team]/index.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/index.svelte @@ -7,7 +7,7 @@ import { toLocaleDateTime } from '$lib/helpers/date'; import { addNotification } from '$lib/stores/notifications'; import { team } from './store'; - import { title } from '$lib/stores/layout'; + import { title, breadcrumbs } from '$lib/stores/layout'; import DeleteTeam from './_deleteTeam.svelte'; import { onMount } from 'svelte'; @@ -35,6 +35,9 @@ await sdkForProject.teams.update($page.params.team, teamName); $team.name = teamName; title.set(teamName); + const breadcrumb = $breadcrumbs.get($breadcrumbs.size); + breadcrumb.title = teamName; + $breadcrumbs = $breadcrumbs.set($breadcrumbs.size, breadcrumb); addNotification({ message: 'Name has been updated', type: 'success' diff --git a/src/routes/console/[project]/users/teams/[team]/members.svelte b/src/routes/console/[project]/authentication/teams/[team]/members.svelte similarity index 89% rename from src/routes/console/[project]/users/teams/[team]/members.svelte rename to src/routes/console/[project]/authentication/teams/[team]/members.svelte index bc3bdc60e..3a4920973 100644 --- a/src/routes/console/[project]/users/teams/[team]/members.svelte +++ b/src/routes/console/[project]/authentication/teams/[team]/members.svelte @@ -19,9 +19,10 @@ import { memberships } from './store'; import CreateMember from './_createMembership.svelte'; import DeleteMembership from './_deleteMembership.svelte'; + import { pageLimit } from '$lib/stores/layout'; const getAvatar = (name: string) => sdkForProject.avatars.getInitials(name, 32, 32).toString(); - const deleted = () => memberships.load($page.params.team, search, limit, offset ?? 0); + const deleted = () => memberships.load($page.params.team, search, $pageLimit, offset ?? 0); const project = $page.params.project; @@ -31,14 +32,14 @@ let offset: number = null; let selectedMembership: Models.Membership; - const limit = 5; - $: if (search) offset = 0; - $: memberships.load($page.params.team, search, limit, offset ?? 0); + $: memberships.load($page.params.team, search, $pageLimit, offset ?? 0); const memberCreated = async (event: CustomEvent) => { - memberships.load($page.params.team, search, limit, offset ?? 0); - await goto(`${base}/console/${project}/users/teams/${event.detail.teamId}/members`); + memberships.load($page.params.team, search, $pageLimit, offset ?? 0); + await goto( + `${base}/console/${project}/authentication/teams/${event.detail.teamId}/members` + ); }; @@ -60,7 +61,7 @@ {#each $memberships.memberships as membership} + href={`${base}/console/${project}/authentication/user/${membership.userId}`}>

Total results: {$memberships.total}

- +
{:else if search} @@ -111,7 +112,7 @@ class="u-flex u-margin-block-start-32 u-main-space-between">

Total results: {$memberships.total}

- +
{:else} diff --git a/src/routes/console/[project]/users/teams/[team]/store.ts b/src/routes/console/[project]/authentication/teams/[team]/store.ts similarity index 100% rename from src/routes/console/[project]/users/teams/[team]/store.ts rename to src/routes/console/[project]/authentication/teams/[team]/store.ts diff --git a/src/routes/console/[project]/users/usage.svelte b/src/routes/console/[project]/authentication/usage.svelte similarity index 100% rename from src/routes/console/[project]/users/usage.svelte rename to src/routes/console/[project]/authentication/usage.svelte diff --git a/src/routes/console/[project]/users/user/[user]/__layout.svelte b/src/routes/console/[project]/authentication/user/[user]/__layout.svelte similarity index 92% rename from src/routes/console/[project]/users/user/[user]/__layout.svelte rename to src/routes/console/[project]/authentication/user/[user]/__layout.svelte index 88f449418..dd75f563e 100644 --- a/src/routes/console/[project]/users/user/[user]/__layout.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/__layout.svelte @@ -7,7 +7,7 @@ import { user } from './store'; const userId = $page.params.user; - const path = `users/user/${userId}`; + const path = `authentication/user/${userId}`; onMount(handle); afterNavigate(handle); @@ -25,7 +25,7 @@ title: $user.name, href: `user/${userId}` }, - back: `${base}/console/${$page.params.project}/users`, + back: `${base}/console/${$page.params.project}/authentication`, copy: { text: 'User ID', value: userId diff --git a/src/routes/console/[project]/users/user/[user]/_deleteAllMemberships.svelte b/src/routes/console/[project]/authentication/user/[user]/_deleteAllMemberships.svelte similarity index 90% rename from src/routes/console/[project]/users/user/[user]/_deleteAllMemberships.svelte rename to src/routes/console/[project]/authentication/user/[user]/_deleteAllMemberships.svelte index f5c76479c..a94217241 100644 --- a/src/routes/console/[project]/users/user/[user]/_deleteAllMemberships.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/_deleteAllMemberships.svelte @@ -14,7 +14,9 @@ try { await sdkForProject.teams.deleteMembership('tmpstring', 'tmpstring2'); showDeleteAll = false; - await goto(`${base}/console/${$page.params.project}/users/${$user.$id}/membeships`); + await goto( + `${base}/console/${$page.params.project}/authentication/${$user.$id}/membeships` + ); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/user/[user]/_deleteAllSessions.svelte b/src/routes/console/[project]/authentication/user/[user]/_deleteAllSessions.svelte similarity index 100% rename from src/routes/console/[project]/users/user/[user]/_deleteAllSessions.svelte rename to src/routes/console/[project]/authentication/user/[user]/_deleteAllSessions.svelte diff --git a/src/routes/console/[project]/users/user/[user]/_deleteMembership.svelte b/src/routes/console/[project]/authentication/user/[user]/_deleteMembership.svelte similarity index 93% rename from src/routes/console/[project]/users/user/[user]/_deleteMembership.svelte rename to src/routes/console/[project]/authentication/user/[user]/_deleteMembership.svelte index 4d5cf77f8..09268f061 100644 --- a/src/routes/console/[project]/users/user/[user]/_deleteMembership.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/_deleteMembership.svelte @@ -23,7 +23,7 @@ showDelete = false; dispatch('deleted'); await goto( - `${base}/console/${$page.params.project}/users/user/${selectedMembership.userId}/memberships` + `${base}/console/${$page.params.project}/authentication/user/${selectedMembership.userId}/memberships` ); } catch (error) { addNotification({ diff --git a/src/routes/console/[project]/users/user/[user]/_deleteSession.svelte b/src/routes/console/[project]/authentication/user/[user]/_deleteSession.svelte similarity index 100% rename from src/routes/console/[project]/users/user/[user]/_deleteSession.svelte rename to src/routes/console/[project]/authentication/user/[user]/_deleteSession.svelte diff --git a/src/routes/console/[project]/users/user/[user]/_deleteUser.svelte b/src/routes/console/[project]/authentication/user/[user]/_deleteUser.svelte similarity index 98% rename from src/routes/console/[project]/users/user/[user]/_deleteUser.svelte rename to src/routes/console/[project]/authentication/user/[user]/_deleteUser.svelte index 2b2d31892..e33c24137 100644 --- a/src/routes/console/[project]/users/user/[user]/_deleteUser.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/_deleteUser.svelte @@ -19,7 +19,7 @@ type: 'success', message: `${$user.name} has been deleted` }); - await goto(`${base}/console/${$page.params.project}/users`); + await goto(`${base}/console/${$page.params.project}/authentication`); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/[project]/users/user/[user]/activity.svelte b/src/routes/console/[project]/authentication/user/[user]/activity.svelte similarity index 71% rename from src/routes/console/[project]/users/user/[user]/activity.svelte rename to src/routes/console/[project]/authentication/user/[user]/activity.svelte index 54bb14966..bc592f64f 100644 --- a/src/routes/console/[project]/users/user/[user]/activity.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/activity.svelte @@ -19,6 +19,14 @@ const limit = 25; $: request = sdkForProject.users.getLogs($page.params.user, limit, offset); + + let browsers = { + firefox: 'firefox', + chrome: 'chrome', + safari: 'safari', + opera: 'opera', + edge: 'edge' + }; @@ -39,25 +47,25 @@
-
- {log.clientName} +
+ {#if browsers[log.clientName.toLocaleLowerCase()]} + {log.clientName} + {:else} + + {/if}
- -

- {log.clientName} - {log.clientVersion} -

- - on {log.osName} - {log.osVersion} - -
+

+ {log.clientName} + {log.clientVersion} + on {log.osName} + {log.osVersion} +

{log.event} @@ -89,7 +97,7 @@
diff --git a/src/routes/console/[project]/users/user/[user]/index.svelte b/src/routes/console/[project]/authentication/user/[user]/index.svelte similarity index 88% rename from src/routes/console/[project]/users/user/[user]/index.svelte rename to src/routes/console/[project]/authentication/user/[user]/index.svelte index da8f82ec3..0d1c478ad 100644 --- a/src/routes/console/[project]/users/user/[user]/index.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/index.svelte @@ -17,7 +17,7 @@ import DeleteUser from './_deleteUser.svelte'; import { user } from './store'; import { onMount } from 'svelte'; - import { title } from '$lib/stores/layout'; + import { title, breadcrumbs } from '$lib/stores/layout'; $: if (prefs) { if (JSON.stringify(prefs) !== JSON.stringify(Object.entries($user.prefs))) { @@ -60,6 +60,7 @@ } async function updateVerificationEmail() { + showVerifcationDropdown = false; try { await sdkForProject.users.updateEmailVerification($user.$id, !$user.emailVerification); $user.emailVerification = !$user.emailVerification; @@ -77,6 +78,7 @@ } } async function updateVerificationPhone() { + showVerifcationDropdown = false; try { await sdkForProject.users.updatePhoneVerification($user.$id, !$user.phoneVerification); $user.phoneVerification = !$user.phoneVerification; @@ -113,6 +115,10 @@ await sdkForProject.users.updateName($user.$id, userName); $user.name = userName; title.set(userName); + const breadcrumb = $breadcrumbs.get($breadcrumbs.size); + breadcrumb.title = userName; + $breadcrumbs = $breadcrumbs.set($breadcrumbs.size, breadcrumb); + showError = false; addNotification({ message: 'Name has been updated', @@ -189,37 +195,39 @@
{$user.name}
- {#if !$user.status} - blocked - {:else if $user.email && $user.phone} - - {$user.emailVerification && $user.phoneVerification - ? 'verified' - : $user.emailVerification - ? 'verified email' - : $user.phoneVerification - ? 'verified phone' - : 'unverified'} - - {:else} - - {$user.emailVerification - ? 'verified ' - : $user.phoneVerification - ? 'verified ' - : 'unverified'} - - {/if}
-
- {#if $user.email} -

{$user.email}

+
+
+ {#if $user.email} +

{$user.email}

+ {/if} + {#if $user.phone} +

{$user.phone}

+ {/if} +

Joined: {toLocaleDateTime($user.registration)}

+
+ {#if !$user.status} + blocked + {:else if $user.email && $user.phone} + + {$user.emailVerification && $user.phoneVerification + ? 'verified' + : $user.emailVerification + ? 'verified email' + : $user.phoneVerification + ? 'verified phone' + : 'unverified'} + + {:else} + + {$user.emailVerification + ? 'verified ' + : $user.phoneVerification + ? 'verified ' + : 'unverified'} + {/if} - {#if $user.phone} -

{$user.phone}

- {/if} -

Joined: {toLocaleDateTime($user.registration)}

@@ -421,16 +429,17 @@ {/each} {/if} - + Add preference diff --git a/src/routes/console/[project]/users/user/[user]/memberships.svelte b/src/routes/console/[project]/authentication/user/[user]/memberships.svelte similarity index 96% rename from src/routes/console/[project]/users/user/[user]/memberships.svelte rename to src/routes/console/[project]/authentication/user/[user]/memberships.svelte index db1ec6dea..0e87bf573 100644 --- a/src/routes/console/[project]/users/user/[user]/memberships.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/memberships.svelte @@ -51,7 +51,7 @@ {#each response.memberships as membership} + href={`${base}/console/${project}/authentication/user/${membership.userId}`}>
Documentation
diff --git a/src/routes/console/[project]/users/user/[user]/sessions.svelte b/src/routes/console/[project]/authentication/user/[user]/sessions.svelte similarity index 96% rename from src/routes/console/[project]/users/user/[user]/sessions.svelte rename to src/routes/console/[project]/authentication/user/[user]/sessions.svelte index ca1057375..e5ef924bd 100644 --- a/src/routes/console/[project]/users/user/[user]/sessions.svelte +++ b/src/routes/console/[project]/authentication/user/[user]/sessions.svelte @@ -16,13 +16,13 @@ import DeleteSessions from './_deleteSession.svelte'; import { toLocaleDateTime } from '$lib/helpers/date'; import { app } from '$lib/stores/app'; + import { pageLimit } from '$lib/stores/layout'; let offset = 0; let showDelete = false; let showDeleteAll = false; let selectedSessionId: string = null; - const limit = 5; const request = sdkForProject.users.getSessions($page.params.user); //TODO: replace session.expire with "last activity" @@ -94,7 +94,7 @@
@@ -104,7 +104,7 @@ class="u-flex u-margin-block-start-32 u-main-space-between">

Total results: {response.total}

- + {/await}
diff --git a/src/routes/console/[project]/users/user/[user]/store.ts b/src/routes/console/[project]/authentication/user/[user]/store.ts similarity index 100% rename from src/routes/console/[project]/users/user/[user]/store.ts rename to src/routes/console/[project]/authentication/user/[user]/store.ts diff --git a/src/routes/console/[project]/storage/bucket/[bucket]/index.svelte b/src/routes/console/[project]/storage/bucket/[bucket]/index.svelte index d3b437560..3d8647b4e 100644 --- a/src/routes/console/[project]/storage/bucket/[bucket]/index.svelte +++ b/src/routes/console/[project]/storage/bucket/[bucket]/index.svelte @@ -25,6 +25,7 @@ import { uploader } from '$lib/stores/uploader'; import { addNotification } from '$lib/stores/notifications'; import { goto } from '$app/navigation'; + import { pageLimit } from '$lib/stores/layout'; let search = ''; let showCreate = false; @@ -33,7 +34,6 @@ let selectedFile: Models.File = null; let offset = 0; - const limit = 5; const project = $page.params.project; const bucket = $page.params.bucket; @@ -42,20 +42,20 @@ const fileCreated = () => { showCreate = false; - files.load(bucket, search, limit, offset); + files.load(bucket, search, $pageLimit, offset); }; const fileDeleted = (event: CustomEvent) => { showDelete = false; uploader.removeFile(event.detail); - files.load(bucket, search, limit, offset); + files.load(bucket, search, $pageLimit, offset); }; const deleteFile = async (file: Models.File) => { try { await sdkForProject.storage.deleteFile(file.bucketId, file.$id); uploader.removeFile(file); - files.load(bucket, search, limit, offset); + files.load(bucket, search, $pageLimit, offset); } catch (error) { addNotification({ type: 'error', @@ -64,7 +64,7 @@ } }; - $: files.load(bucket, search, limit, offset); + $: files.load(bucket, search, $pageLimit, offset); $: if (search) offset = 0; @@ -175,7 +175,7 @@

Total results: {$files.total}

- +
{:else if search} @@ -191,7 +191,7 @@

Total results: {$files?.total}

- +
{:else} diff --git a/src/routes/console/[project]/storage/index.svelte b/src/routes/console/[project]/storage/index.svelte index 3c16cd351..d65192ec9 100644 --- a/src/routes/console/[project]/storage/index.svelte +++ b/src/routes/console/[project]/storage/index.svelte @@ -10,19 +10,19 @@ import { base } from '$app/paths'; import { bucketList } from './store'; import { tooltip } from '$lib/actions/tooltip'; + import { pageLimit } from '$lib/stores/layout'; let showCreate = false; let search = ''; let offset = 0; - const limit = 5; const project = $page.params.project; const bucketCreated = async (event: CustomEvent) => { showCreate = false; await goto(`${base}/console/${project}/storage/bucket/${event.detail.$id}`); }; - $: bucketList.load(search, limit, offset ?? 0); + $: bucketList.load(search, $pageLimit, offset ?? 0); $: if (search) offset = 0; @@ -97,7 +97,7 @@

Total results: {$bucketList.total}

- +
{:else if search} @@ -113,7 +113,7 @@

Total results: {$bucketList?.total}

- +
{:else} diff --git a/static/icons/dark/color/firefox.svg b/static/icons/dark/color/firefox.svg new file mode 100644 index 000000000..2c2d6095e --- /dev/null +++ b/static/icons/dark/color/firefox.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icons/dark/color/microsoft_edge.svg b/static/icons/dark/color/microsoft_edge.svg new file mode 100644 index 000000000..07a4e636c --- /dev/null +++ b/static/icons/dark/color/microsoft_edge.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icons/dark/color/opera.svg b/static/icons/dark/color/opera.svg new file mode 100644 index 000000000..0efa1752f --- /dev/null +++ b/static/icons/dark/color/opera.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/static/icons/dark/color/safari.svg b/static/icons/dark/color/safari.svg new file mode 100644 index 000000000..3b7c36e91 --- /dev/null +++ b/static/icons/dark/color/safari.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icons/dark/grayscale/firefox.svg b/static/icons/dark/grayscale/firefox.svg new file mode 100644 index 000000000..d73dc97f5 --- /dev/null +++ b/static/icons/dark/grayscale/firefox.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/dark/grayscale/microsoft_edge.svg b/static/icons/dark/grayscale/microsoft_edge.svg new file mode 100644 index 000000000..1a54e0f1f --- /dev/null +++ b/static/icons/dark/grayscale/microsoft_edge.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/dark/grayscale/opera.svg b/static/icons/dark/grayscale/opera.svg new file mode 100644 index 000000000..57a6f9113 --- /dev/null +++ b/static/icons/dark/grayscale/opera.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/dark/grayscale/safari.svg b/static/icons/dark/grayscale/safari.svg new file mode 100644 index 000000000..4c38e6ebb --- /dev/null +++ b/static/icons/dark/grayscale/safari.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/color/firefox.svg b/static/icons/light/color/firefox.svg new file mode 100644 index 000000000..2c2d6095e --- /dev/null +++ b/static/icons/light/color/firefox.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icons/light/color/microsoft_edge.svg b/static/icons/light/color/microsoft_edge.svg new file mode 100644 index 000000000..07a4e636c --- /dev/null +++ b/static/icons/light/color/microsoft_edge.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icons/light/color/opera.svg b/static/icons/light/color/opera.svg new file mode 100644 index 000000000..0efa1752f --- /dev/null +++ b/static/icons/light/color/opera.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/static/icons/light/color/safari.svg b/static/icons/light/color/safari.svg new file mode 100644 index 000000000..3b7c36e91 --- /dev/null +++ b/static/icons/light/color/safari.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/icons/light/grayscale/firefox.svg b/static/icons/light/grayscale/firefox.svg new file mode 100644 index 000000000..692e2ec0d --- /dev/null +++ b/static/icons/light/grayscale/firefox.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/grayscale/microsoft_edge.svg b/static/icons/light/grayscale/microsoft_edge.svg new file mode 100644 index 000000000..c5450831b --- /dev/null +++ b/static/icons/light/grayscale/microsoft_edge.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/grayscale/opera.svg b/static/icons/light/grayscale/opera.svg new file mode 100644 index 000000000..4fdf7668d --- /dev/null +++ b/static/icons/light/grayscale/opera.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/grayscale/safari.svg b/static/icons/light/grayscale/safari.svg new file mode 100644 index 000000000..09b484189 --- /dev/null +++ b/static/icons/light/grayscale/safari.svg @@ -0,0 +1,3 @@ + + + diff --git a/tests/unit/components/copyInput.test.ts b/tests/unit/components/copyInput.test.ts index 95c0ff689..f4d9986dc 100644 --- a/tests/unit/components/copyInput.test.ts +++ b/tests/unit/components/copyInput.test.ts @@ -13,7 +13,7 @@ test('shows CopyInput component', () => { expect(input).toBeInTheDocument(); expect(button).toBeInTheDocument(); expect(input).toHaveAttribute('type', 'text'); - expect(input).toBeDisabled(); + expect(input).toHaveAttribute('readonly'); }); test('copy to clipboard function called on click', async () => { diff --git a/tests/unit/components/switchBox.test.ignore.ts b/tests/unit/components/switchBox.test.ignore.ts deleted file mode 100644 index a2f4c538d..000000000 --- a/tests/unit/components/switchBox.test.ignore.ts +++ /dev/null @@ -1,74 +0,0 @@ -import '@testing-library/jest-dom'; -import { render, fireEvent } from '@testing-library/svelte'; -import { SwitchBox } from '../../../src/lib/components'; - -const box = { - id: 'input', - src: 'https://via.placeholder.com/50', - label: 'Bool', - alt: 'image', - required: false, - disabled: false, - value: false -}; - -test('shows boolean input', () => { - const { getByText, getByRole, getByAltText } = render(SwitchBox, { - box - }); - const checkbox = getByRole('switch'); - const img = getByAltText('image'); - - expect(getByText('Bool')).toBeInTheDocument(); - expect(img).toBeInTheDocument(); - expect(checkbox).toBeInTheDocument(); - expect(checkbox).toHaveAttribute('type', 'checkbox'); -}); - -test('shows boolean input - required', () => { - box.required = true; - const { getByRole } = render(SwitchBox, { box }); - - expect(getByRole('switch')).toBeRequired(); -}); - -test('shows boolean input - disabled', () => { - box.disabled = true; - const { getByRole } = render(SwitchBox, { box }); - - expect(getByRole('switch')).toBeDisabled(); -}); - -test('state', async () => { - const { getByRole, component } = render(SwitchBox, { box }); - const checkbox = getByRole('switch'); - - setTimeout(() => { - expect(checkbox).not.toBeChecked(); - expect(component.box.value).toStrictEqual(false); - }, 1); - - await fireEvent.click(checkbox); - setTimeout(() => { - expect(checkbox).toBeChecked(); - expect(component.box.value).toStrictEqual(true); - }, 1); - - await fireEvent.click(checkbox); - setTimeout(() => { - expect(checkbox).not.toBeChecked(); - expect(component.box.value).toStrictEqual(false); - }, 1); - - component.box.value = true; - setTimeout(() => { - expect(checkbox).toBeChecked(); - expect(component.box.value).toStrictEqual(true); - }, 1); - - component.box.value = false; - setTimeout(() => { - expect(checkbox).not.toBeChecked(); - expect(component.box.value).toStrictEqual(false); - }, 1); -});