diff --git a/package-lock.json b/package-lock.json index 65711f67d..bbadb339d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,9 @@ "packages": { "": { "name": "@appwrite/console", - "version": "0.0.1", "dependencies": { "@analytics/google-analytics": "^1.0.5", - "@appwrite.io/pink": "^0.0.6-rc.3", + "@appwrite.io/pink": "^0.0.6-rc.4", "@appwrite.io/pink-icons": "^0.0.6-rc.3", "@aw-labs/appwrite-console": "^13.1.0", "@popperjs/core": "^2.11.6", @@ -149,9 +148,9 @@ "integrity": "sha512-1Yw7u/COtxx06BfwlI+kVhsa/upKYzmCNrT4c8QDeCY2KMYlnijkUjtHiPU08HxyTIVB5j6d75O0YWVIHwQS8g==" }, "node_modules/@appwrite.io/pink": { - "version": "0.0.6-rc.3", - "resolved": "https://registry.npmjs.org/@appwrite.io/pink/-/pink-0.0.6-rc.3.tgz", - "integrity": "sha512-oeRwchmRdHjspYJFipc6k/oWOOdaD7TKFwJ1weZMJMF2/GmQ44zCYo2qJhN2tPRb73Wje2dTvnkV6MH/Rxg7vw==", + "version": "0.0.6-rc.4", + "resolved": "https://registry.npmjs.org/@appwrite.io/pink/-/pink-0.0.6-rc.4.tgz", + "integrity": "sha512-vSBq0wB4lQMM8vRPCh0B2M8aWIdrFQSf14X58y8DVjj0djg/gwQ51pwxLojXAol7rwFNhh73NSqTuRC4y+BpxA==", "dependencies": { "@appwrite.io/pink-icons": "*", "normalize.css": "^8.0.1", diff --git a/package.json b/package.json index a7cc3b720..0f895b303 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,5 @@ { "name": "@appwrite/console", - "version": "0.0.1", "engines": { "node": ">=16" }, @@ -20,8 +19,8 @@ }, "dependencies": { "@analytics/google-analytics": "^1.0.5", - "@appwrite.io/pink": "^0.0.6-rc.3", "@appwrite.io/pink-icons": "^0.0.6-rc.3", + "@appwrite.io/pink": "^0.0.6-rc.4", "@aw-labs/appwrite-console": "^13.1.0", "@popperjs/core": "^2.11.6", "@sentry/svelte": "^7.44.2", diff --git a/src/lib/components/card.svelte b/src/lib/components/card.svelte index 314b629c5..043b7a8c3 100644 --- a/src/lib/components/card.svelte +++ b/src/lib/components/card.svelte @@ -43,6 +43,7 @@ class:common-section={!isTile} class:is-border-dashed={isDashed} class:is-danger={danger} + class:is-allowed-focus={href} on:click on:keyup={clickOnEnter} {href}> diff --git a/src/lib/components/index.ts b/src/lib/components/index.ts index 4d67decd7..4f6f1e303 100644 --- a/src/lib/components/index.ts +++ b/src/lib/components/index.ts @@ -49,3 +49,4 @@ export { default as Output } from './output.svelte'; export { default as ViewSelector } from './viewSelector.svelte'; export { default as LabelCard } from './labelCard.svelte'; export { default as CustomPagination } from './customPagination.svelte'; +export { default as Limit } from './limit.svelte'; diff --git a/src/lib/components/limit.svelte b/src/lib/components/limit.svelte new file mode 100644 index 000000000..7594ccc94 --- /dev/null +++ b/src/lib/components/limit.svelte @@ -0,0 +1,44 @@ + + +
+ +

{name} per page. Total results: {sum}

+
diff --git a/src/lib/components/pagination.svelte b/src/lib/components/pagination.svelte index 166bdf03e..216455f72 100644 --- a/src/lib/components/pagination.svelte +++ b/src/lib/components/pagination.svelte @@ -1,10 +1,10 @@ {#if totalPages > 1} - {@const search = $page.url.search} - + {#key $pageStore.url} + + {/key} {:else} {/if} diff --git a/src/lib/components/searchQuery.svelte b/src/lib/components/searchQuery.svelte index a99963441..c77eb214e 100644 --- a/src/lib/components/searchQuery.svelte +++ b/src/lib/components/searchQuery.svelte @@ -29,23 +29,28 @@ } }); - $: valueChange(search); + $: valueChange(search ?? ''); function valueChange(value: string) { clearTimeout(timer); - timer = setTimeout(async () => { + timer = setTimeout(() => { const url = new URL($page.url); - if (url.search === value) { + const previous = url.searchParams.get('search') ?? ''; + + if (previous === value) { return; } - /** - * Reset to first page if search changes. - */ + if ($page.data.page > 1) { - url.pathname = url.pathname.replace(new RegExp(`/${$page.data.page}*$`), '/'); + url.searchParams.delete('page'); + } + + if (value === '') { + url.searchParams.delete('search'); + } else { + url.searchParams.set('search', value); } - url.search = value; trackEvent('search'); goto(url, { keepFocus: true }); }, debounce); diff --git a/src/lib/components/viewSelector.svelte b/src/lib/components/viewSelector.svelte index 423005bc6..500e40a03 100644 --- a/src/lib/components/viewSelector.svelte +++ b/src/lib/components/viewSelector.svelte @@ -1,34 +1,68 @@ - + + -{#if $columns?.length} - {#if $prefs?.preferredView === 'list'} +{#if !hideColumns && view === View.Table} + {#if $columns?.length} - - -
  • - -
  • + {#key $page.url} +
  • + updateViewPreferences(View.Table)} + class="toggle-button-element" + aria-label="List View" + type="button" + class:is-selected={view === View.Table}> + +
  • +
  • + updateViewPreferences(View.Grid)} + class="toggle-button-element" + aria-label="Grid View" + type="button" + class:is-selected={view === View.Grid}> + +
  • + {/key} {/if} diff --git a/src/lib/helpers/load.ts b/src/lib/helpers/load.ts index d60c8c4ee..6478fcd9f 100644 --- a/src/lib/helpers/load.ts +++ b/src/lib/helpers/load.ts @@ -1,24 +1,35 @@ -import { goto } from '$app/navigation'; +import { preferences } from '$lib/stores/preferences'; +import type { Page } from '@sveltejs/kit'; export function pageToOffset(page: number, limit: number): number { return page ? page * limit - limit : 0; } -export async function redirectOnOffsetOverflow( - offset: number, - page: number, - total: number, - project: string, - path: string, - search: string -) { - if (offset > total) { - if (page <= 2) { - await goto(`/console/project-${project}/${path}?${search}`); - } else { - await goto(`/console/project-${project}/${path}/${page - 1}?${search}`); - } - } +export function getPage(url: URL): number { + return Number(url.searchParams.get('page')); +} + +export function getLimit(url: URL, route: Page['route'], fallback: number): number { + return Number(url.searchParams.get('limit') ?? preferences.get(route).limit ?? fallback); +} + +export enum View { + Table = 'table', + Grid = 'grid' +} + +export function getView(url: URL, route: Page['route'], fallback: View): View { + return (url.searchParams.get('view') ?? preferences.get(route).view) === View.Grid + ? View.Grid + : View.Table ?? fallback; +} + +export function getColumns(route: Page['route'], fallback: string[]): string[] { + return preferences.get(route).columns ?? fallback; +} + +export function getSearch(url: URL): string | undefined { + return url.searchParams.get('search') ?? undefined; } type TabElement = { href: string; title: string; hasChildren?: boolean }; diff --git a/src/lib/layout/activity.svelte b/src/lib/layout/activity.svelte index 113f89809..8afec6a43 100644 --- a/src/lib/layout/activity.svelte +++ b/src/lib/layout/activity.svelte @@ -1,5 +1,5 @@ @@ -66,8 +65,8 @@
    -

    Total results: {logs.total}

    - + +
    {:else} diff --git a/src/lib/stores/preferences.ts b/src/lib/stores/preferences.ts new file mode 100644 index 000000000..f1184c7e2 --- /dev/null +++ b/src/lib/stores/preferences.ts @@ -0,0 +1,111 @@ +import { browser } from '$app/environment'; +import { page } from '$app/stores'; +import type { View } from '$lib/helpers/load'; +import type { Page } from '@sveltejs/kit'; +import { get, writable } from 'svelte/store'; +import { sdk } from './sdk'; + +type Preferences = { + limit?: number; + view?: View; + columns?: string[]; +}; + +type PreferencesStore = { + [key: string]: { + [key: string]: Preferences; + collections?: { + [key: string]: Preferences['columns']; + }; + }; +}; + +function createPreferences() { + const { subscribe, set, update } = writable({}); + if (browser) { + set(JSON.parse(globalThis.localStorage.getItem('preferences') ?? '{}')); + } + return { + subscribe, + get: (route: Page['route']): Preferences => { + let preferences: PreferencesStore; + subscribe((n) => (preferences = n))(); + + return ( + preferences[sdk.forProject.client.config.project]?.[route.id] ?? { + limit: null, + view: null, + columns: null + } + ); + }, + getCustomCollectionColumns: (collectionId: string): Preferences['columns'] => { + let preferences: PreferencesStore; + subscribe((n) => (preferences = n))(); + + return ( + preferences[sdk.forProject.client.config.project]?.collections?.[collectionId] ?? + null + ); + }, + setLimit: (limit: Preferences['limit']) => + update((n) => { + const path = get(page).route.id; + const project = sdk.forProject.client.config.project; + if (!n[project]?.[path]) { + n[project] ??= {}; + n[project][path] ??= {}; + } + + n[project][path].limit = limit; + + return n; + }), + setView: (view: Preferences['view']) => + update((n) => { + const path = get(page).route.id; + const project = sdk.forProject.client.config.project; + if (!n[project]?.[path]) { + n[project] ??= {}; + n[project][path] ??= {}; + } + + n[project][path].view = view; + + return n; + }), + setColumns: (columns: Preferences['columns']) => + update((n) => { + const path = get(page).route.id; + const project = sdk.forProject.client.config.project; + if (!n[project]?.[path]) { + n[project] ??= {}; + n[project][path] ??= {}; + } + + n[project][path].columns = columns; + + return n; + }), + setCustomCollectionColumns: (columns: Preferences['columns']) => + update((n) => { + const current = get(page); + const project = sdk.forProject.client.config.project; + const collection = current.params.collection; + if (!n[project]?.collections?.[collection]) { + n[project] ??= {}; + n[project].collections ??= {}; + } + + n[project].collections[collection] = columns; + + return n; + }) + }; +} + +export const preferences = createPreferences(); + +if (browser) { + preferences.subscribe((n) => globalThis.localStorage.setItem('preferences', JSON.stringify(n))); +} diff --git a/src/routes/console/account/activity/[[page]]/+page.svelte b/src/routes/console/account/activity/+page.svelte similarity index 59% rename from src/routes/console/account/activity/[[page]]/+page.svelte rename to src/routes/console/account/activity/+page.svelte index c7f2c38da..d3939555d 100644 --- a/src/routes/console/account/activity/[[page]]/+page.svelte +++ b/src/routes/console/account/activity/+page.svelte @@ -3,7 +3,6 @@ import type { PageData } from './$types'; export let data: PageData; - const path = '/console/account/activity'; - + diff --git a/src/routes/console/account/activity/+page.ts b/src/routes/console/account/activity/+page.ts new file mode 100644 index 000000000..8b6fb15c3 --- /dev/null +++ b/src/routes/console/account/activity/+page.ts @@ -0,0 +1,17 @@ +import { Query } from '@aw-labs/appwrite-console'; +import { sdk } from '$lib/stores/sdk'; +import { getLimit, getPage, pageToOffset } from '$lib/helpers/load'; +import { PAGE_LIMIT } from '$lib/constants'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); + + return { + offset, + limit, + logs: await sdk.forConsole.account.listLogs([Query.offset(offset), Query.limit(limit)]) + }; +}; diff --git a/src/routes/console/account/activity/[[page]]/+page.ts b/src/routes/console/account/activity/[[page]]/+page.ts deleted file mode 100644 index d3fc1b4d0..000000000 --- a/src/routes/console/account/activity/[[page]]/+page.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Query } from '@aw-labs/appwrite-console'; -import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; -import { PAGE_LIMIT } from '$lib/constants'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params }) => { - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); - - return { - offset, - logs: await sdk.forConsole.account.listLogs([Query.offset(offset), Query.limit(PAGE_LIMIT)]) - }; -}; diff --git a/src/routes/console/account/organizations/[[page]]/+page.svelte b/src/routes/console/account/organizations/+page.svelte similarity index 86% rename from src/routes/console/account/organizations/[[page]]/+page.svelte rename to src/routes/console/account/organizations/+page.svelte index 69ba0d589..99c580f9b 100644 --- a/src/routes/console/account/organizations/[[page]]/+page.svelte +++ b/src/routes/console/account/organizations/+page.svelte @@ -6,13 +6,13 @@ Pagination, AvatarGroup, CardContainer, - Heading + Heading, + Limit } from '$lib/components'; import { Button } from '$lib/elements/forms'; import { Container } from '$lib/layout'; - import CreateOrganization from '../../../createOrganization.svelte'; + import CreateOrganization from '../../createOrganization.svelte'; import { sdk } from '$lib/stores/sdk'; - import { CARD_LIMIT } from '$lib/constants'; import type { PageData } from './$types'; export let data: PageData; @@ -67,12 +67,8 @@ {/if}
    -

    Total results: {data.organizations.total}

    - + +
    diff --git a/src/routes/console/account/organizations/[[page]]/+page.ts b/src/routes/console/account/organizations/+page.ts similarity index 54% rename from src/routes/console/account/organizations/[[page]]/+page.ts rename to src/routes/console/account/organizations/+page.ts index 9b602d7b5..d80bc5036 100644 --- a/src/routes/console/account/organizations/[[page]]/+page.ts +++ b/src/routes/console/account/organizations/+page.ts @@ -1,18 +1,20 @@ import { Query } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; +import { getLimit, getPage, pageToOffset } from '$lib/helpers/load'; import { CARD_LIMIT } from '$lib/constants'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ params }) => { - const page = Number(params.page); - const offset = pageToOffset(page, CARD_LIMIT); +export const load: PageLoad = async ({ url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, CARD_LIMIT); + const offset = pageToOffset(page, limit); return { offset, + limit, organizations: await sdk.forConsole.teams.list([ Query.offset(offset), - Query.limit(CARD_LIMIT), + Query.limit(limit), Query.orderDesc('$createdAt') ]) }; diff --git a/src/routes/console/account/sessions/[[page]]/+page.svelte b/src/routes/console/account/sessions/+page.svelte similarity index 98% rename from src/routes/console/account/sessions/[[page]]/+page.svelte rename to src/routes/console/account/sessions/+page.svelte index 808bdb9a1..b67215de8 100644 --- a/src/routes/console/account/sessions/[[page]]/+page.svelte +++ b/src/routes/console/account/sessions/+page.svelte @@ -124,6 +124,5 @@ {/if}

    Total results: {data.sessions.total}

    -
    diff --git a/src/routes/console/account/sessions/[[page]]/+page.ts b/src/routes/console/account/sessions/+page.ts similarity index 100% rename from src/routes/console/account/sessions/[[page]]/+page.ts rename to src/routes/console/account/sessions/+page.ts diff --git a/src/routes/console/organization-[organization]/[[page]]/+page.svelte b/src/routes/console/organization-[organization]/+page.svelte similarity index 88% rename from src/routes/console/organization-[organization]/[[page]]/+page.svelte rename to src/routes/console/organization-[organization]/+page.svelte index b3150f59e..888056de7 100644 --- a/src/routes/console/organization-[organization]/[[page]]/+page.svelte +++ b/src/routes/console/organization-[organization]/+page.svelte @@ -1,13 +1,12 @@ @@ -111,12 +111,8 @@
    -

    Total results: {data.users.total}

    - + +
    {:else if data.search} diff --git a/src/routes/console/project-[project]/auth/+page.ts b/src/routes/console/project-[project]/auth/+page.ts new file mode 100644 index 000000000..badf0ca4e --- /dev/null +++ b/src/routes/console/project-[project]/auth/+page.ts @@ -0,0 +1,23 @@ +import { Query } from '@aw-labs/appwrite-console'; +import { sdk } from '$lib/stores/sdk'; +import { getLimit, getPage, getSearch, pageToOffset } from '$lib/helpers/load'; +import { PAGE_LIMIT } from '$lib/constants'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ url, route }) => { + const page = getPage(url); + const search = getSearch(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); + + return { + offset, + limit, + search, + page, + users: await sdk.forProject.users.list( + [Query.limit(limit), Query.offset(offset), Query.orderDesc('$createdAt')], + search + ) + }; +}; diff --git a/src/routes/console/project-[project]/auth/[[page]]/+page.ts b/src/routes/console/project-[project]/auth/[[page]]/+page.ts deleted file mode 100644 index 37e66a71a..000000000 --- a/src/routes/console/project-[project]/auth/[[page]]/+page.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Query } from '@aw-labs/appwrite-console'; -import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; -import { PAGE_LIMIT } from '$lib/constants'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params, url }) => { - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); - const search = url.search.slice(1) ?? undefined; - - return { - offset, - search, - page, - users: await sdk.forProject.users.list( - [Query.limit(PAGE_LIMIT), Query.offset(offset), Query.orderDesc('$createdAt')], - search - ) - }; -}; diff --git a/src/routes/console/project-[project]/auth/appleOAuth.svelte b/src/routes/console/project-[project]/auth/appleOAuth.svelte index c62ab4db4..88b48040c 100644 --- a/src/routes/console/project-[project]/auth/appleOAuth.svelte +++ b/src/routes/console/project-[project]/auth/appleOAuth.svelte @@ -1,14 +1,13 @@ diff --git a/src/routes/console/project-[project]/auth/microsoftOAuth.svelte b/src/routes/console/project-[project]/auth/microsoftOAuth.svelte index d715c16b8..e404fec84 100644 --- a/src/routes/console/project-[project]/auth/microsoftOAuth.svelte +++ b/src/routes/console/project-[project]/auth/microsoftOAuth.svelte @@ -1,14 +1,11 @@ + + diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/activity/[[page]]/+page.ts b/src/routes/console/project-[project]/auth/teams/team-[team]/activity/+page.ts similarity index 51% rename from src/routes/console/project-[project]/auth/teams/team-[team]/activity/[[page]]/+page.ts rename to src/routes/console/project-[project]/auth/teams/team-[team]/activity/+page.ts index eb4e0a47b..ea9009d74 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/activity/[[page]]/+page.ts +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/activity/+page.ts @@ -1,17 +1,19 @@ import { Query } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; +import { getLimit, getPage, pageToOffset } from '$lib/helpers/load'; import { PAGE_LIMIT } from '$lib/constants'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ params }) => { - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); +export const load: PageLoad = async ({ params, url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); return { offset, + limit, logs: await sdk.forProject.teams.listLogs(params.team, [ - Query.limit(PAGE_LIMIT), + Query.limit(limit), Query.offset(offset) ]) }; diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/activity/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/activity/[[page]]/+page.svelte deleted file mode 100644 index 3647857fd..000000000 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/activity/[[page]]/+page.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/members/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte similarity index 87% rename from src/routes/console/project-[project]/auth/teams/team-[team]/members/[[page]]/+page.svelte rename to src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte index e2c29e12e..f7518114c 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/members/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/members/+page.svelte @@ -1,6 +1,13 @@ + + diff --git a/src/routes/console/project-[project]/auth/user-[user]/activity/[[page]]/+page.ts b/src/routes/console/project-[project]/auth/user-[user]/activity/+page.ts similarity index 51% rename from src/routes/console/project-[project]/auth/user-[user]/activity/[[page]]/+page.ts rename to src/routes/console/project-[project]/auth/user-[user]/activity/+page.ts index e11f65d70..168f3add5 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/activity/[[page]]/+page.ts +++ b/src/routes/console/project-[project]/auth/user-[user]/activity/+page.ts @@ -1,17 +1,18 @@ import { Query } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; +import { getLimit, getPage, pageToOffset } from '$lib/helpers/load'; import { PAGE_LIMIT } from '$lib/constants'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ params }) => { - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); - +export const load: PageLoad = async ({ params, url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); return { offset, + limit, logs: await sdk.forProject.users.listLogs(params.user, [ - Query.limit(PAGE_LIMIT), + Query.limit(limit), Query.offset(offset) ]) }; diff --git a/src/routes/console/project-[project]/auth/user-[user]/activity/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/activity/[[page]]/+page.svelte deleted file mode 100644 index f703612b7..000000000 --- a/src/routes/console/project-[project]/auth/user-[user]/activity/[[page]]/+page.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/src/routes/console/project-[project]/auth/user-[user]/memberships/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/memberships/+page.svelte similarity index 98% rename from src/routes/console/project-[project]/auth/user-[user]/memberships/[[page]]/+page.svelte rename to src/routes/console/project-[project]/auth/user-[user]/memberships/+page.svelte index 8641a6609..a477b1a3b 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/memberships/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/memberships/+page.svelte @@ -13,7 +13,7 @@ } from '$lib/elements/table'; import { Button } from '$lib/elements/forms'; import { Container } from '$lib/layout'; - import DeleteMembership from '../../deleteMembership.svelte'; + import DeleteMembership from '../deleteMembership.svelte'; import type { Models } from '@aw-labs/appwrite-console'; import type { PageData } from './$types'; import { trackEvent } from '$lib/actions/analytics'; diff --git a/src/routes/console/project-[project]/auth/user-[user]/memberships/[[page]]/+page.ts b/src/routes/console/project-[project]/auth/user-[user]/memberships/+page.ts similarity index 100% rename from src/routes/console/project-[project]/auth/user-[user]/memberships/[[page]]/+page.ts rename to src/routes/console/project-[project]/auth/user-[user]/memberships/+page.ts diff --git a/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte similarity index 96% rename from src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte rename to src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte index af3ef5568..3afc40dc4 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.svelte @@ -13,8 +13,8 @@ import { Button } from '$lib/elements/forms'; import { Container } from '$lib/layout'; import { sdk } from '$lib/stores/sdk'; - import DeleteAllSessions from '../../deleteAllSessions.svelte'; - import DeleteSessions from '../../deleteSession.svelte'; + import DeleteAllSessions from '../deleteAllSessions.svelte'; + import DeleteSessions from '../deleteSession.svelte'; import type { PageData } from './$types'; export let data: PageData; diff --git a/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.ts b/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.ts similarity index 99% rename from src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.ts rename to src/routes/console/project-[project]/auth/user-[user]/sessions/+page.ts index b8fd5d5fb..20a1e6f4e 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.ts +++ b/src/routes/console/project-[project]/auth/user-[user]/sessions/+page.ts @@ -4,6 +4,7 @@ import type { PageLoad } from './$types'; export const load: PageLoad = async ({ params, depends }) => { depends(Dependencies.SESSIONS); + return { sessions: await sdk.forProject.users.listSessions(params.user) }; diff --git a/src/routes/console/project-[project]/databases/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/+page.svelte similarity index 64% rename from src/routes/console/project-[project]/databases/[[page]]/+page.svelte rename to src/routes/console/project-[project]/databases/+page.svelte index a1cb024e3..34348305b 100644 --- a/src/routes/console/project-[project]/databases/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/databases/+page.svelte @@ -1,42 +1,34 @@ -
    +
    Databases
    - +
    {#if data.databases.total} - {#if $prefs?.preferredView === 'list'} - + {#if data.view === 'grid'} + {:else} - + {/if} + +
    + + +
    {:else} { + const page = getPage(url); + const limit = getLimit(url, route, CARD_LIMIT); + const view = getView(url, route, View.Grid); + const offset = pageToOffset(page, limit); + + return { + offset, + limit, + view, + databases: await sdk.forProject.databases.list([ + Query.limit(limit), + Query.offset(offset), + Query.orderDesc('$createdAt') + ]) + }; +}; diff --git a/src/routes/console/project-[project]/databases/[[page]]/+page.ts b/src/routes/console/project-[project]/databases/[[page]]/+page.ts deleted file mode 100644 index eac9a802c..000000000 --- a/src/routes/console/project-[project]/databases/[[page]]/+page.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Query } from '@aw-labs/appwrite-console'; -import { pageToOffset, redirectOnOffsetOverflow } from '$lib/helpers/load'; -import { CARD_LIMIT, Dependencies, PAGE_LIMIT } from '$lib/constants'; -import { sdk } from '$lib/stores/sdk'; -import type { PageLoad } from './$types'; -import { get } from 'svelte/store'; -import { prefs } from '$lib/stores/user'; - -export const load: PageLoad = async ({ params, depends, url }) => { - depends(Dependencies.DATABASES); - - const customPrefs = get(prefs); - const page = Number(params.page); - const limit = customPrefs?.pageLimit - ? customPrefs.pageLimit - : customPrefs?.preferredView === 'list' - ? PAGE_LIMIT - : CARD_LIMIT; - - const offset = pageToOffset(page, limit); - - const databases = await sdk.forProject.databases.list([ - Query.limit(limit), - Query.offset(offset), - Query.orderDesc('$createdAt') - ]); - - await redirectOnOffsetOverflow( - offset, - page, - databases.total, - params.project, - 'databases', - url.search - ); - - return { - offset, - databases - }; -}; diff --git a/src/routes/console/project-[project]/databases/database-[database]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/+page.svelte new file mode 100644 index 000000000..769595469 --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/+page.svelte @@ -0,0 +1,44 @@ + + + +
    + Collections +
    + + + +
    +
    + + {#if data.collections.total} + {#if data.view === 'grid'} + + {:else} +
    + {/if} + +
    + + +
    + {:else} + ($showCreate = true)} /> + {/if} + diff --git a/src/routes/console/project-[project]/databases/database-[database]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/+page.ts new file mode 100644 index 000000000..429a62de6 --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/+page.ts @@ -0,0 +1,23 @@ +import { Query } from '@aw-labs/appwrite-console'; +import { CARD_LIMIT } from '$lib/constants'; +import { sdk } from '$lib/stores/sdk'; +import { getLimit, getPage, getView, pageToOffset, View } from '$lib/helpers/load'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ params, url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, CARD_LIMIT); + const view = getView(url, route, View.Grid); + const offset = pageToOffset(page, limit); + + return { + offset, + limit, + view, + collections: await sdk.forProject.databases.listCollections(params.database, [ + Query.limit(limit), + Query.offset(offset), + Query.orderDesc('$createdAt') + ]) + }; +}; diff --git a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte deleted file mode 100644 index 12680c51a..000000000 --- a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte +++ /dev/null @@ -1,59 +0,0 @@ - - - -
    - Collections - -
    - - - -
    -
    - - {#if data.collections.total} - {#if $prefs?.preferredView === 'list'} - - {:else} - - {/if} - {:else} - (showCreate = true)} /> - {/if} -
    - - diff --git a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.ts deleted file mode 100644 index 54b372c28..000000000 --- a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Query } from '@aw-labs/appwrite-console'; -import { pageToOffset, redirectOnOffsetOverflow } from '$lib/helpers/load'; -import { CARD_LIMIT, Dependencies, PAGE_LIMIT } from '$lib/constants'; -import { sdk } from '$lib/stores/sdk'; -import type { PageLoad } from './$types'; -import { get } from 'svelte/store'; -import { prefs } from '$lib/stores/user'; - -export const load: PageLoad = async ({ params, depends, url }) => { - depends(Dependencies.DATABASE); - const page = Number(params.page); - - const customPrefs = get(prefs); - - const limit = customPrefs?.pageLimit - ? customPrefs.pageLimit - : customPrefs?.preferredView === 'list' - ? PAGE_LIMIT - : CARD_LIMIT; - const offset = pageToOffset(page, limit); - - const collections = await sdk.forProject.databases.listCollections(params.database, [ - Query.limit(limit), - Query.offset(offset), - Query.orderDesc('$createdAt') - ]); - - await redirectOnOffsetOverflow( - offset, - page, - collections.total, - params.project, - `databases/database-${params.database}`, - url.search - ); - - return { - offset, - collections - }; -}; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+page.svelte new file mode 100644 index 000000000..1656253ac --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+page.svelte @@ -0,0 +1,72 @@ + + + +
    + Documents +
    + + +
    +
    + + {#if $collection?.attributes?.length} + {#if data.documents.total} +
    + +
    + + +
    + {:else} + + {/if} + {:else} + (showCreateAttribute = true)} /> + {/if} + + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+page.ts new file mode 100644 index 000000000..e5adcafdf --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+page.ts @@ -0,0 +1,24 @@ +import { Dependencies, PAGE_LIMIT } from '$lib/constants'; +import { getLimit, getPage, getView, pageToOffset, View } from '$lib/helpers/load'; +import { sdk } from '$lib/stores/sdk'; +import { Query } from '@aw-labs/appwrite-console'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ params, depends, url, route }) => { + depends(Dependencies.DOCUMENTS); + const page = getPage(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const view = getView(url, route, View.Grid); + const offset = pageToOffset(page, limit); + + return { + offset, + limit, + view, + documents: await sdk.forProject.databases.listDocuments( + params.database, + params.collection, + [Query.limit(limit), Query.offset(offset), Query.orderDesc('$createdAt')] + ) + }; +}; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte deleted file mode 100644 index 7b007be14..000000000 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte +++ /dev/null @@ -1,217 +0,0 @@ - - - -
    - Documents -
    - - -
    -
    - - {#if $collection?.attributes?.length} - {#if data.documents.total} - - - Document ID - {#each $columns as column} - {#if column.show} - {column.title} - {/if} - {/each} - - - {#each data.documents.documents as document} - - - - - - - - - {#each $columns as column} - {#if column.show} - {#if column.type === 'relationship'} - {#if column.direction === 'one'} - - {document[column.id]} - - {:else} - - {@const itemsNum = column?.data?.lenght} - - - {/if} - {:else} - {@const formatted = formatColumn(document[column.id])} - -
    - {formatted.value} -
    -
    - {/if} - {/if} - {/each} -
    - {/each} -
    -
    - - - {:else} - - {/if} - {:else} - (showCreateDropdown = true)}> -
    - Create your first attribute to get started. -

    - Need a hand? Check out our documentation. -

    -
    -
    - - - - -
    -
    - {/if} -
    - - - diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.ts deleted file mode 100644 index d8e454aaf..000000000 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Dependencies, PAGE_LIMIT } from '$lib/constants'; -import { pageToOffset } from '$lib/helpers/load'; -import { sdk } from '$lib/stores/sdk'; -import { Query } from '@aw-labs/appwrite-console'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params, depends }) => { - depends(Dependencies.DOCUMENTS); - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); - - return { - offset, - documents: await sdk.forProject.databases.listDocuments( - params.database, - params.collection, - [Query.limit(PAGE_LIMIT), Query.offset(offset), Query.orderDesc('$createdAt')] - ) - }; -}; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/+page.svelte new file mode 100644 index 000000000..d3939555d --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/+page.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/+page.ts similarity index 51% rename from src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.ts rename to src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/+page.ts index 29a301fd0..3fb3a619d 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.ts +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/+page.ts @@ -1,19 +1,21 @@ import { Query } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; +import { getLimit, getPage, pageToOffset } from '$lib/helpers/load'; import { PAGE_LIMIT } from '$lib/constants'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ params }) => { - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); +export const load: PageLoad = async ({ params, url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); return { offset, + limit, logs: await sdk.forProject.databases.listCollectionLogs( params.database, params.collection, - [Query.limit(PAGE_LIMIT), Query.offset(offset)] + [Query.limit(limit), Query.offset(offset)] ) }; }; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte deleted file mode 100644 index 029c8c45f..000000000 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/+page.svelte new file mode 100644 index 000000000..f805a79f0 --- /dev/null +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/+page.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/[[page]]/+page.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/+page.ts similarity index 53% rename from src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/[[page]]/+page.ts rename to src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/+page.ts index ff2edc03c..d11900203 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/[[page]]/+page.ts +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/+page.ts @@ -1,20 +1,22 @@ import { Query } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; +import { getLimit, getPage, pageToOffset } from '$lib/helpers/load'; import { PAGE_LIMIT } from '$lib/constants'; import type { PageLoad } from './$types'; -export const load: PageLoad = async ({ params }) => { - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); +export const load: PageLoad = async ({ params, url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); return { offset, + limit, logs: await sdk.forProject.databases.listDocumentLogs( params.database, params.collection, params.document, - [Query.limit(PAGE_LIMIT), Query.offset(offset)] + [Query.limit(limit), Query.offset(offset)] ) }; }; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/[[page]]/+page.svelte deleted file mode 100644 index 15ee2d818..000000000 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/activity/[[page]]/+page.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/store.ts b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/store.ts index 65c00bd63..5c00adeea 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/store.ts +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/store.ts @@ -1,6 +1,7 @@ import { page } from '$app/stores'; +import type { Column } from '$lib/components/viewSelector.svelte'; import type { Models } from '@aw-labs/appwrite-console'; -import { derived } from 'svelte/store'; +import { derived, writable } from 'svelte/store'; export type Attributes = | Models.AttributeBoolean @@ -22,3 +23,4 @@ export const attributes = derived( ($page) => $page.data.collection.attributes as Attributes[] ); export const indexes = derived(page, ($page) => $page.data.collection.indexes as Models.Index[]); +export const columns = writable([]); diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte index c576a7e65..efb46a2e4 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/subNavigation.svelte @@ -2,7 +2,7 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { showCreate } from '../store'; - import type { PageData } from './[[page]]/$types'; + import type { PageData } from './$types'; $: data = $page.data as PageData; $: project = $page.params.project; @@ -31,7 +31,7 @@ {#if data?.allCollections?.total}
    + + {#each $columns as column} + {#if column.show} + {column.title} + {/if} + {/each} + + + {#each data.collections.collections as collection} + + {#each $columns as column} + {#if column.show} + {#if column.id === '$id'} + {#key $columns} + + + + + + + {/key} + {:else if column.id === 'name'} + + {collection.name} + + {:else} + + {toLocaleDateTime(collection[column.id])} + + {/if} + {/if} + {/each} + + {/each} + +
    diff --git a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/tableView.svelte b/src/routes/console/project-[project]/databases/database-[database]/tableView.svelte similarity index 100% rename from src/routes/console/project-[project]/databases/database-[database]/[[page]]/tableView.svelte rename to src/routes/console/project-[project]/databases/database-[database]/tableView.svelte diff --git a/src/routes/console/project-[project]/databases/grid.svelte b/src/routes/console/project-[project]/databases/grid.svelte new file mode 100644 index 000000000..1efa0fbed --- /dev/null +++ b/src/routes/console/project-[project]/databases/grid.svelte @@ -0,0 +1,25 @@ + + + (showCreate = true)} event="database"> + {#each data.databases.databases as database} + + {database.name} + + + Database ID + + + {/each} + +

    Create a new database

    +
    +
    diff --git a/src/routes/console/project-[project]/databases/store.ts b/src/routes/console/project-[project]/databases/store.ts new file mode 100644 index 000000000..d0435fc06 --- /dev/null +++ b/src/routes/console/project-[project]/databases/store.ts @@ -0,0 +1,9 @@ +import type { Column } from '$lib/components/viewSelector.svelte'; +import { writable } from 'svelte/store'; + +export const columns = writable([ + { id: '$id', title: 'Database ID', show: true, width: 50 }, + { id: 'name', title: 'Name', show: true, width: 120 }, + { id: '$createdAt', title: 'Created', show: true, width: 120 }, + { id: '$updatedAt', title: 'Updated', show: true, width: 120 } +]); diff --git a/src/routes/console/project-[project]/databases/table.svelte b/src/routes/console/project-[project]/databases/table.svelte new file mode 100644 index 000000000..ffbc21e78 --- /dev/null +++ b/src/routes/console/project-[project]/databases/table.svelte @@ -0,0 +1,62 @@ + + + + + {#each $columns as column} + {#if column.show} + {column.title} + {/if} + {/each} + + + {#each data.databases.databases as database} + + {#each $columns as column} + {#if column.show} + {#if column.id === '$id'} + {#key $columns} + + + + + + + {/key} + {:else if column.id === 'name'} + + {database.name} + + {:else} + + {toLocaleDateTime(database[column.id])} + + {/if} + {/if} + {/each} + + {/each} + +
    diff --git a/src/routes/console/project-[project]/databases/usage/[[period]]/+page.ts b/src/routes/console/project-[project]/databases/usage/[[period]]/+page.ts index f3d931abf..3444d0621 100644 --- a/src/routes/console/project-[project]/databases/usage/[[period]]/+page.ts +++ b/src/routes/console/project-[project]/databases/usage/[[period]]/+page.ts @@ -1,16 +1,20 @@ import type { Models } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; import type { PageLoad } from './$types'; +import { error } from '@sveltejs/kit'; export const load: PageLoad = async ({ params }) => { const { period } = params; - const response = await sdk.forProject.databases.getUsage(period ?? '30d'); - - return { - count: response.databasesCount as unknown as Models.Metric[], - created: response.databasesCreate as unknown as Models.Metric[], - read: response.databasesRead as unknown as Models.Metric[], - updated: response.databasesUpdate as unknown as Models.Metric[], - deleted: response.databasesDelete as unknown as Models.Metric[] - }; + try { + const response = await sdk.forProject.databases.getUsage(period ?? '30d'); + return { + count: response.databasesCount as unknown as Models.Metric[], + created: response.databasesCreate as unknown as Models.Metric[], + read: response.databasesRead as unknown as Models.Metric[], + updated: response.databasesUpdate as unknown as Models.Metric[], + deleted: response.databasesDelete as unknown as Models.Metric[] + }; + } catch (e) { + throw error(e.code, e.message); + } }; diff --git a/src/routes/console/project-[project]/functions/[[page]]/+page.svelte b/src/routes/console/project-[project]/functions/+page.svelte similarity index 87% rename from src/routes/console/project-[project]/functions/[[page]]/+page.svelte rename to src/routes/console/project-[project]/functions/+page.svelte index f7aef2a0d..1a26cb9ba 100644 --- a/src/routes/console/project-[project]/functions/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/functions/+page.svelte @@ -1,7 +1,15 @@ @@ -25,13 +28,18 @@ let client = Client() Before sending any API calls to your new Appwrite project, make sure your device or emulator has network access to your Appwrite project's hostname or IP address.

    -
    - - For self-hosted solutions - When connecting to a locally hosted Appwrite project from an emulator or a mobile device, - you should use the private IP of the device running your Appwrite project as the hostname - of the endpoint instead of localhost. You can also use a service like ngrok to proxy the - Appwrite server. - -
    + {#if showAlert} +
    + (showAlert = false)}> + For self-hosted solutions + When connecting to a locally hosted Appwrite project from an emulator or a mobile device, + you should use the private IP of the device running your Appwrite project as the hostname + of the endpoint instead of localhost. You can also use a service like ngrok to proxy + the Appwrite server. + +
    + {/if}
    diff --git a/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step3.svelte b/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step3.svelte index 4025d7b55..ec5b9ac48 100644 --- a/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step3.svelte +++ b/src/routes/console/project-[project]/overview/platforms/wizard/flutter/step3.svelte @@ -1,6 +1,7 @@ @@ -26,13 +29,18 @@ client Before sending any API calls to your new Appwrite project, make sure your device or emulator has network access to your Appwrite project's hostname or IP address.

    -
    - - For self-hosted solutions - When connecting to a locally hosted Appwrite project from an emulator or a mobile device, - you should use the private IP of the device running your Appwrite project as the hostname - of the endpoint instead of localhost. You can also use a service like ngrok to proxy the - Appwrite server. - -
    + {#if showAlert} +
    + (showAlert = false)}> + For self-hosted solutions + When connecting to a locally hosted Appwrite project from an emulator or a mobile device, + you should use the private IP of the device running your Appwrite project as the hostname + of the endpoint instead of localhost. You can also use a service like ngrok to proxy + the Appwrite server. + +
    + {/if}
    diff --git a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte b/src/routes/console/project-[project]/settings/domains/+page.svelte similarity index 98% rename from src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte rename to src/routes/console/project-[project]/settings/domains/+page.svelte index 56b154268..75c8f573b 100644 --- a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/settings/domains/+page.svelte @@ -20,8 +20,8 @@ import { Dependencies } from '$lib/constants'; import type { Models } from '@aw-labs/appwrite-console'; import type { PageData } from './$types'; - import Create from '../create.svelte'; - import Delete from '../delete.svelte'; + import Create from './create.svelte'; + import Delete from './delete.svelte'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; export let data: PageData; diff --git a/src/routes/console/project-[project]/settings/domains/[[page]]/+page.ts b/src/routes/console/project-[project]/settings/domains/+page.ts similarity index 100% rename from src/routes/console/project-[project]/settings/domains/[[page]]/+page.ts rename to src/routes/console/project-[project]/settings/domains/+page.ts diff --git a/src/routes/console/project-[project]/storage/[[page]]/+page.svelte b/src/routes/console/project-[project]/storage/+page.svelte similarity index 88% rename from src/routes/console/project-[project]/storage/[[page]]/+page.svelte rename to src/routes/console/project-[project]/storage/+page.svelte index c197b3777..17f25d642 100644 --- a/src/routes/console/project-[project]/storage/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/storage/+page.svelte @@ -2,17 +2,25 @@ import { page } from '$app/stores'; import { goto } from '$app/navigation'; import { Button } from '$lib/elements/forms'; - import { Empty, Pagination, Copy, GridItem1, CardContainer, Heading } from '$lib/components'; + import { + Empty, + Pagination, + Copy, + GridItem1, + CardContainer, + Heading, + Limit + } from '$lib/components'; import { Pill } from '$lib/elements'; - import Create from '../create.svelte'; + import Create from './create.svelte'; import { Container } from '$lib/layout'; import { base } from '$app/paths'; import { tooltip } from '$lib/actions/tooltip'; import type { Models } from '@aw-labs/appwrite-console'; import type { PageData } from './$types'; - import { CARD_LIMIT } from '$lib/constants'; export let data: PageData; + let showCreate = false; const project = $page.params.project; @@ -83,12 +91,8 @@
    -

    Total results: {data.buckets.total}

    - + +
    {:else} { - const page = Number(params.page); - const offset = pageToOffset(page, CARD_LIMIT); +export const load: PageLoad = async ({ url, route }) => { + const page = getPage(url); + const limit = getLimit(url, route, CARD_LIMIT); + const offset = pageToOffset(page, limit); return { offset, + limit, buckets: await sdk.forProject.storage.listBuckets([ - Query.limit(CARD_LIMIT), + Query.limit(limit), Query.offset(offset), Query.orderDesc('$createdAt') ]) diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte b/src/routes/console/project-[project]/storage/bucket-[bucket]/+page.svelte similarity index 95% rename from src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte rename to src/routes/console/project-[project]/storage/bucket-[bucket]/+page.svelte index 8e2c8639f..2e8f15283 100644 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/+page.svelte @@ -11,10 +11,11 @@ DropList, DropListItem, DropListLink, - SearchQuery + SearchQuery, + Limit } from '$lib/components'; - import Create from '../create.svelte'; - import Delete from '../deleteFile.svelte'; + import Create from './create.svelte'; + import Delete from './deleteFile.svelte'; import { Table, TableHeader, @@ -34,7 +35,7 @@ import { addNotification } from '$lib/stores/notifications'; import type { PageData } from './$types'; import { invalidate } from '$app/navigation'; - import { Dependencies, PAGE_LIMIT } from '$lib/constants'; + import { Dependencies } from '$lib/constants'; import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; export let data: PageData; @@ -184,12 +185,8 @@
    -

    Total results: {data.files.total}

    - + +
    {:else if data.search} diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/+page.ts b/src/routes/console/project-[project]/storage/bucket-[bucket]/+page.ts new file mode 100644 index 000000000..82a75f0f3 --- /dev/null +++ b/src/routes/console/project-[project]/storage/bucket-[bucket]/+page.ts @@ -0,0 +1,24 @@ +import { Query } from '@aw-labs/appwrite-console'; +import { sdk } from '$lib/stores/sdk'; +import { getLimit, getPage, getSearch, pageToOffset } from '$lib/helpers/load'; +import { Dependencies, PAGE_LIMIT } from '$lib/constants'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ params, depends, url, route }) => { + depends(Dependencies.FILES); + const page = getPage(url); + const search = getSearch(url); + const limit = getLimit(url, route, PAGE_LIMIT); + const offset = pageToOffset(page, limit); + + return { + offset, + limit, + search, + files: await sdk.forProject.storage.listFiles( + params.bucket, + [Query.limit(limit), Query.offset(offset), Query.orderDesc('$createdAt')], + search + ) + }; +}; diff --git a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.ts b/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.ts deleted file mode 100644 index 19884b514..000000000 --- a/src/routes/console/project-[project]/storage/bucket-[bucket]/[[page]]/+page.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Query } from '@aw-labs/appwrite-console'; -import { sdk } from '$lib/stores/sdk'; -import { pageToOffset } from '$lib/helpers/load'; -import { Dependencies, PAGE_LIMIT } from '$lib/constants'; -import type { PageLoad } from './$types'; - -export const load: PageLoad = async ({ params, depends, url }) => { - depends(Dependencies.FILES); - const page = Number(params.page); - const offset = pageToOffset(page, PAGE_LIMIT); - const search = url.search.slice(1) ?? undefined; - - return { - offset, - search, - files: await sdk.forProject.storage.listFiles( - params.bucket, - [Query.limit(PAGE_LIMIT), Query.offset(offset), Query.orderDesc('$createdAt')], - search - ) - }; -}; diff --git a/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts b/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts index ca937981a..f3416ced6 100644 --- a/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts +++ b/src/routes/console/project-[project]/storage/usage/[[period]]/+page.ts @@ -1,15 +1,20 @@ import type { Models } from '@aw-labs/appwrite-console'; import { sdk } from '$lib/stores/sdk'; import type { PageLoad } from './$types'; +import { error } from '@sveltejs/kit'; export const load: PageLoad = async ({ params }) => { - const response = await sdk.forProject.storage.getUsage(params.period ?? '30d'); + try { + const response = await sdk.forProject.storage.getUsage(params.period ?? '30d'); - return { - count: response.bucketsCount as unknown as Models.Metric[], - created: response.bucketsCreate as unknown as Models.Metric[], - read: response.bucketsRead as unknown as Models.Metric[], - updated: response.bucketsUpdate as unknown as Models.Metric[], - deleted: response.bucketsDelete as unknown as Models.Metric[] - }; + return { + count: response.bucketsCount as unknown as Models.Metric[], + created: response.bucketsCreate as unknown as Models.Metric[], + read: response.bucketsRead as unknown as Models.Metric[], + updated: response.bucketsUpdate as unknown as Models.Metric[], + deleted: response.bucketsDelete as unknown as Models.Metric[] + }; + } catch (e) { + throw error(e.code, e.message); + } };