From 1409722c066c5d6d0eb2db51a0b3a32c3313c96f Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 23 Mar 2025 17:50:57 +0530 Subject: [PATCH 01/36] add: analytics, dependencies. --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/lib/actions/analytics.ts | 7 +++++++ src/lib/constants.ts | 2 ++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 96260c21a..780ce0ee1 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "e2e:ui": "playwright test tests/e2e --ui" }, "dependencies": { - "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@74f9464", + "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@64948b6 ", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f37e4783..e81337b51 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@appwrite.io/console': - specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@74f9464 - version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@74f9464 + specifier: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562 + version: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562 '@appwrite.io/pink-icons': specifier: 0.25.0 version: 0.25.0 @@ -211,8 +211,8 @@ packages: '@analytics/type-utils@0.6.2': resolution: {integrity: sha512-TD+xbmsBLyYy/IxFimW/YL/9L2IEnM7/EoV9Aeh56U64Ify8o27HJcKjo38XY9Tcn0uOq1AX3thkKgvtWvwFQg==} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@74f9464': - resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@74f9464} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562': + resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562} version: 1.2.1 '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@64948b6': @@ -4097,7 +4097,7 @@ snapshots: '@analytics/type-utils@0.6.2': {} - '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@74f9464': {} + '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562': {} '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@64948b6(svelte@4.2.19)': dependencies: diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index cbdc60077..aa8a6d8f9 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -157,6 +157,7 @@ export enum Click { FunctionsDeploymentDeleteClick = 'click_deployment_delete', FunctionsDeploymentCancelClick = 'click_deployment_cancel', KeyCreateClick = 'click_key_create', + DevKeyCreateClick = 'click_dev_key_create', MenuDropDownClick = 'click_menu_dropdown', MenuOverviewClick = 'click_menu_overview', ModalCloseClick = 'click_close_modal', @@ -307,12 +308,18 @@ export enum Submit { VariableDelete = 'submit_variable_delete', VariableUpdate = 'submit_variable_update', VariableEditor = 'submit_variable_editor', + KeyCreate = 'submit_key_create', KeyDelete = 'submit_key_delete', KeyUpdateName = 'submit_key_update_name', KeyUpdateScopes = 'submit_key_update_scopes', KeyUpdateExpire = 'submit_key_update_expire', + DevKeyCreate = 'submit_dev_key_create', + DevKeyDelete = 'submit_dev_key_delete', + DevKeyUpdateName = 'submit_dev_key_update_name', + DevKeyUpdateExpire = 'submit_dev_key_update_expire', + PlatformCreate = 'submit_platform_create', PlatformDelete = 'submit_platform_delete', PlatformUpdate = 'submit_platform_update', diff --git a/src/lib/constants.ts b/src/lib/constants.ts index a038fd15f..a42f70b98 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -46,6 +46,8 @@ export enum Dependencies { PLATFORMS = 'dependency:platforms', KEY = 'dependency:key', KEYS = 'dependency:keys', + DEV_KEY = 'dependency:dev_key', + DEV_KEYS = 'dependency:dev_keys', DOMAINS = 'dependency:domains', DOMAIN = 'dependency:domains', WEBHOOK = 'dependency:webhook', From 49a201700e39e15335272f999b825791de44a691 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 23 Mar 2025 18:16:25 +0530 Subject: [PATCH 02/36] feat: dev-keys on pink2 [wip]. --- .../project-[project]/overview/+layout.svelte | 17 ++- .../{keys => components}/checkbox.svelte | 0 .../expirationInput.svelte | 0 .../overview/dev-keys/+page.svelte | 46 ++++++++ .../overview/dev-keys/+page.ts | 13 +++ .../overview/dev-keys/[key]/+page.ts | 22 ++++ .../[key]/+page@project-[project].svelte | 109 ++++++++++++++++++ .../dev-keys/[key]/breadcrumbs.svelte | 28 +++++ .../overview/dev-keys/[key]/delete.svelte | 35 ++++++ .../overview/dev-keys/[key]/header.svelte | 18 +++ .../overview/dev-keys/[key]/store.ts | 5 + .../[key]/updateExpirationDate.svelte | 75 ++++++++++++ .../overview/dev-keys/action.svelte | 15 +++ .../overview/dev-keys/create/+page.svelte | 83 +++++++++++++ .../project-[project]/overview/store.ts | 2 +- 15 files changed, 466 insertions(+), 2 deletions(-) rename src/routes/(console)/project-[project]/overview/{keys => components}/checkbox.svelte (100%) rename src/routes/(console)/project-[project]/overview/{keys => components}/expirationInput.svelte (100%) create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/+page.ts create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page.ts create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/breadcrumbs.svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/store.ts create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/action.svelte create mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte diff --git a/src/routes/(console)/project-[project]/overview/+layout.svelte b/src/routes/(console)/project-[project]/overview/+layout.svelte index 8d998a7d8..fcdaf1746 100644 --- a/src/routes/(console)/project-[project]/overview/+layout.svelte +++ b/src/routes/(console)/project-[project]/overview/+layout.svelte @@ -66,7 +66,17 @@ label: 'Create API Key', icon: IconPlus, callback() { - goto(`${base}/project-[project]/overview/keys/create`); + goto(`${base}/project-${projectId}/overview/keys/create`); + }, + keys: ['c', 'k'], + group: 'integrations', + disabled: !$canWriteProjects + }, + { + label: 'Create Dev Key', + icon: IconPlus, + callback() { + goto(`${base}/project-${projectId}/overview/dev-keys/create`); }, keys: ['c', 'k'], group: 'integrations', @@ -216,6 +226,11 @@ href={`${path}/keys`} selected={$page.url.pathname === `${path}/keys`} event="keys">API keys + Dev keys {#if $action} diff --git a/src/routes/(console)/project-[project]/overview/keys/checkbox.svelte b/src/routes/(console)/project-[project]/overview/components/checkbox.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/keys/checkbox.svelte rename to src/routes/(console)/project-[project]/overview/components/checkbox.svelte diff --git a/src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte b/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/keys/expirationInput.svelte rename to src/routes/(console)/project-[project]/overview/components/expirationInput.svelte diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte new file mode 100644 index 000000000..2e104b112 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte @@ -0,0 +1,46 @@ + + +{#if data.devKeys.total} + + + Name + Last accessed + Expiration date + + {#each data.devKeys.keys as key} + + + {key.name} + + + {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} + + + {key.expire ? toLocaleDateTime(key.expire) : 'never'} + + + {/each} + +{:else} + goto(`${base}/project-${$page.params.project}/overview/dev-keys/create`)} /> +{/if} diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/+page.ts b/src/routes/(console)/project-[project]/overview/dev-keys/+page.ts new file mode 100644 index 000000000..5f7e3e623 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/+page.ts @@ -0,0 +1,13 @@ +import { Dependencies } from '$lib/constants'; +import { sdk } from '$lib/stores/sdk'; +import { selectedTab } from '../store'; +import type { PageLoad } from './$types'; + +selectedTab.set('dev-keys'); + +export const load: PageLoad = async ({ params, depends }) => { + depends(Dependencies.DEV_KEYS); + return { + devKeys: await sdk.forConsole.projects.listDevKeys(params.project) + }; +}; diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page.ts b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page.ts new file mode 100644 index 000000000..d54a142ca --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page.ts @@ -0,0 +1,22 @@ +import Header from './header.svelte'; +import Breadcrumbs from './breadcrumbs.svelte'; +import { sdk } from '$lib/stores/sdk'; +import { Dependencies } from '$lib/constants'; +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ params, depends }) => { + depends(Dependencies.DEV_KEY); + + const key = await sdk.forConsole.projects.getDevKey(params.project, params.key); + if (key.expire) { + key.expire = new Date(key.expire).toISOString().slice(0, 23); + } else { + key.expire = undefined; + } + + return { + header: Header, + breadcrumbs: Breadcrumbs, + key + }; +}; diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte new file mode 100644 index 000000000..f588a217a --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte @@ -0,0 +1,109 @@ + + + + Dev key - Appwrite + + + + {@const accessedAt = $devKey.accessedAt ? toLocaleDate($devKey.accessedAt) : 'never'} + + {$devKey.name} + Last accessed: {accessedAt} + + + + Dev key secret + + + + + +
+ + Name + Choose any name that will help you distinguish between Dev keys. + + + + + + + + +
+ + + + + Delete Dev key + The Dev key will be permanently deleted. This action is irreversible. + + +
+
+
{$devKey.name}
+

Last accessed: {accessedAt}

+
+
+
+
+ + + + +
+
+ + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/breadcrumbs.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/breadcrumbs.svelte new file mode 100644 index 000000000..a1a2f9f7c --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/breadcrumbs.svelte @@ -0,0 +1,28 @@ + + + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte new file mode 100644 index 000000000..610915a3b --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte @@ -0,0 +1,35 @@ + + + + Are you sure you want to delete this Dev key? + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte new file mode 100644 index 000000000..54e1f51c5 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte @@ -0,0 +1,18 @@ + + + + + + {$devKey?.name} + + Dev key secret + + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/store.ts b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/store.ts new file mode 100644 index 000000000..6d3fc98bd --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/store.ts @@ -0,0 +1,5 @@ +import { derived } from 'svelte/store'; +import { page } from '$app/stores'; +import type { Models } from '@appwrite.io/console'; + +export const devKey = derived(page, ($page) => $page.data.key as Models.DevKey); diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte new file mode 100644 index 000000000..b3deffb6a --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte @@ -0,0 +1,75 @@ + + +
+ + Expiration date + Set a date after which your Dev key will expire. + + {#if isExpired} + (alertsDismissed = true)} + title="Your Dev key has expired"> + For security reasons, we recommend you delete your expired key and create a new + one. + + {:else if isExpiring} + (alertsDismissed = true)} + title="Your Dev key is about to expire"> + Update the expiration date to keep the key active + + {/if} + + + + + + + +
diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte new file mode 100644 index 000000000..a6dd57d54 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte @@ -0,0 +1,15 @@ + + +{#if $canWriteKeys} + +{/if} diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte new file mode 100644 index 000000000..a60de8d18 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte @@ -0,0 +1,83 @@ + + + +
+ +
+ + + + +
+
+
+ + + + + +
diff --git a/src/routes/(console)/project-[project]/overview/store.ts b/src/routes/(console)/project-[project]/overview/store.ts index 2c18cefa9..e0fd85cdc 100644 --- a/src/routes/(console)/project-[project]/overview/store.ts +++ b/src/routes/(console)/project-[project]/overview/store.ts @@ -17,4 +17,4 @@ export const usage = cachedStore< }; }); -export const selectedTab: Writable<'platforms' | 'keys'> = writable('platforms'); +export const selectedTab: Writable<'platforms' | 'keys' | 'dev-keys'> = writable('platforms'); From ed4b4a9f0046c37b785786db5a099c8391ff1288 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 23 Mar 2025 19:44:08 +0530 Subject: [PATCH 03/36] update: simplify UI components. --- package.json | 2 +- .../overview/components/create.svelte | 110 ++++++++++++++++++ .../overview/components/delete.svelte | 49 ++++++++ .../overview/components/table.svelte | 59 ++++++++++ .../updateExpirationDate.svelte | 60 ++++++---- .../overview/dev-keys/+page.svelte | 38 +----- .../[key]/+page@project-[project].svelte | 10 +- .../overview/dev-keys/[key]/delete.svelte | 35 ------ .../overview/dev-keys/create/+page.svelte | 82 +------------ .../overview/keys/+page.svelte | 42 +------ .../keys/[key]/+page@project-[project].svelte | 8 +- .../overview/keys/[key]/delete.svelte | 35 ------ .../keys/[key]/updateExpirationDate.svelte | 75 ------------ .../overview/keys/create/+page.svelte | 97 +-------------- .../overview/keys/scopes.svelte | 2 - 15 files changed, 276 insertions(+), 428 deletions(-) create mode 100644 src/routes/(console)/project-[project]/overview/components/create.svelte create mode 100644 src/routes/(console)/project-[project]/overview/components/delete.svelte create mode 100644 src/routes/(console)/project-[project]/overview/components/table.svelte rename src/routes/(console)/project-[project]/overview/{dev-keys/[key] => components}/updateExpirationDate.svelte (51%) delete mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte delete mode 100644 src/routes/(console)/project-[project]/overview/keys/[key]/delete.svelte delete mode 100644 src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte diff --git a/package.json b/package.json index 780ce0ee1..1161a9d93 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "check": "svelte-check --tsconfig ./tsconfig.json --fail-on-warnings --threshold warning", "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --check . && eslint .", - "format": "prettier --write . && eslint --fix .", + "format": "prettier --write .", "test": "TZ=EST vitest run", "test:ui": "TZ=EST vitest --ui", "test:watch": "TZ=EST vitest watch", diff --git a/src/routes/(console)/project-[project]/overview/components/create.svelte b/src/routes/(console)/project-[project]/overview/components/create.svelte new file mode 100644 index 000000000..ab5d9f712 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/components/create.svelte @@ -0,0 +1,110 @@ + + + +
+ +
+ + + + +
+ + {#if isApiKey} +
+ + + Choose which permission scopes to grant your application. It is best + practice to allow only the permissions you need to meet your project + goals. + + + +
+ {/if} +
+
+ + + + + +
diff --git a/src/routes/(console)/project-[project]/overview/components/delete.svelte b/src/routes/(console)/project-[project]/overview/components/delete.svelte new file mode 100644 index 000000000..8a5c0bfa1 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/components/delete.svelte @@ -0,0 +1,49 @@ + + + + Are you sure you want to delete this execution? + diff --git a/src/routes/(console)/project-[project]/overview/components/table.svelte b/src/routes/(console)/project-[project]/overview/components/table.svelte new file mode 100644 index 000000000..a6b232f52 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/components/table.svelte @@ -0,0 +1,59 @@ + + +{#if keys.total} + + + Name + Last accessed + Expiration date + {#if isApiKey} + Scopes + {/if} + + {#each keys.keys as key} + + + {key.name} + + + {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} + + + {key.expire ? toLocaleDateTime(key.expire) : 'never'} + + {#if isApiKey} + + {asApiKey(key).scopes.length} Scopes + + {/if} + + {/each} + +{:else} + goto(`${base}/project-${$page.params.project}/overview/${slug}/create`)} /> +{/if} diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte similarity index 51% rename from src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte rename to src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte index b3deffb6a..1393f86e0 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/updateExpirationDate.svelte +++ b/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte @@ -8,52 +8,70 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { Alert } from '@appwrite.io/pink-svelte'; - import { project } from '../../../store'; - import { devKey } from './store'; - import ExpirationInput from '../../components/expirationInput.svelte'; + import ExpirationInput from './expirationInput.svelte'; + import type { Models } from '@appwrite.io/console'; + import { page } from '$app/stores'; - let expiration = $devKey.expire; + export let keyType: 'api' | 'dev' = 'api'; + export let key: Models.DevKey | Models.Key; + + const projectId = $page.params.project; + + let isApiKey = keyType === 'api'; + const label = isApiKey ? 'API' : 'Dev'; + const dependency = isApiKey ? Dependencies.KEY : Dependencies.DEV_KEY; + const event = isApiKey ? Submit.KeyUpdateExpire : Submit.DevKeyUpdateExpire; + + let expiration = key.expire; async function updateExpire() { try { - await sdk.forConsole.projects.updateDevKey( - $project.$id, - $devKey.$id, - $devKey.name, - expiration - ); - await invalidate(Dependencies.DEV_KEY); - trackEvent(Submit.DevKeyUpdateExpire); + isApiKey + ? await sdk.forConsole.projects.updateKey( + projectId, + key.$id, + key.name, + (key as Models.Key).scopes, + expiration + ) + : await sdk.forConsole.projects.updateDevKey( + projectId, + key.$id, + key.name, + expiration + ); + + await invalidate(dependency); + trackEvent(event); addNotification({ type: 'success', - message: 'Dev key expiration has been updated' + message: `${label} key expiration has been updated` }); } catch (error) { addNotification({ type: 'error', message: error.message }); - trackError(error, Submit.DevKeyUpdateExpire); + trackError(error, event); } } let alertsDismissed = false; $: isExpiring = - !alertsDismissed && $devKey.expire && diffDays(new Date(), new Date($devKey.expire)) < 14; - $: isExpired = - !alertsDismissed && $devKey.expire !== null && new Date($devKey.expire) < new Date(); + !alertsDismissed && key.expire && diffDays(new Date(), new Date(key.expire)) < 14; + $: isExpired = !alertsDismissed && key.expire !== null && new Date(key.expire) < new Date();
Expiration date - Set a date after which your Dev key will expire. + Set a date after which your {label} key will expire. {#if isExpired} (alertsDismissed = true)} - title="Your Dev key has expired"> + title="Your {label} key has expired"> For security reasons, we recommend you delete your expired key and create a new one. @@ -61,7 +79,7 @@ (alertsDismissed = true)} - title="Your Dev key is about to expire"> + title="Your {label} key is about to expire"> Update the expiration date to keep the key active {/if} @@ -69,7 +87,7 @@ - +
diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte index 2e104b112..1303b0b70 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte @@ -1,46 +1,12 @@ -{#if data.devKeys.total} - - - Name - Last accessed - Expiration date - - {#each data.devKeys.keys as key} - - - {key.name} - - - {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} - - - {key.expire ? toLocaleDateTime(key.expire) : 'never'} - - - {/each} - -{:else} - goto(`${base}/project-${$page.params.project}/overview/dev-keys/create`)} /> -{/if} + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte index f588a217a..d62096b86 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte @@ -10,9 +10,9 @@ import { sdk } from '$lib/stores/sdk'; import { onMount } from 'svelte'; import { project } from '../../../store'; - import Delete from './delete.svelte'; + import Delete from '../../components/delete.svelte'; import { devKey } from './store'; - import UpdateExpirationDate from './updateExpirationDate.svelte'; + import UpdateExpirationDate from '../../components/updateExpirationDate.svelte'; let showDelete = false; let name: string = null; @@ -55,6 +55,8 @@ {@const accessedAt = $devKey.accessedAt ? toLocaleDate($devKey.accessedAt) : 'never'} {$devKey.name} + + Last accessed: {accessedAt} @@ -84,7 +86,7 @@ - + Delete Dev key @@ -106,4 +108,4 @@ - + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte deleted file mode 100644 index 610915a3b..000000000 --- a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/delete.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - Are you sure you want to delete this Dev key? - diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte index a60de8d18..e3dae9bcf 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte @@ -1,83 +1,5 @@ - -
- -
- - - - -
-
- - - - - - -
+ diff --git a/src/routes/(console)/project-[project]/overview/keys/+page.svelte b/src/routes/(console)/project-[project]/overview/keys/+page.svelte index d1b6b096d..d23abab9f 100644 --- a/src/routes/(console)/project-[project]/overview/keys/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/+page.svelte @@ -1,50 +1,12 @@ -{#if data.keys.total} - - - Name - Last accessed - Expiration date - Scopes - - {#each data.keys.keys as key} - - - {key.name} - - - {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} - - - {key.expire ? toLocaleDateTime(key.expire) : 'never'} - - - {key.scopes.length} Scopes - - - {/each} - -{:else} - goto(`${base}/project-${$page.params.project}/overview/keys/create`)} /> -{/if} +
diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte index b9dbf675e..ade356733 100644 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -12,9 +12,9 @@ import { onMount } from 'svelte'; import { project } from '../../../store'; import Scopes from '../scopes.svelte'; - import Delete from './delete.svelte'; + import Delete from '../../components/delete.svelte'; import { key } from './store'; - import UpdateExpirationDate from './updateExpirationDate.svelte'; + import UpdateExpirationDate from '../../components/updateExpirationDate.svelte'; let showDelete = false; let name: string = null; @@ -140,7 +140,7 @@ - + Delete API key @@ -162,4 +162,4 @@ - + diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/delete.svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/delete.svelte deleted file mode 100644 index 5968bd499..000000000 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/delete.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - Are you sure you want to delete this execution? - diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte deleted file mode 100644 index 5595ea2b2..000000000 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/updateExpirationDate.svelte +++ /dev/null @@ -1,75 +0,0 @@ - - -
- - Expiration date - Set a date after which your API key will expire. - - {#if isExpired} - (alertsDismissed = true)} - title="Your API key has expired"> - For security reasons, we recommend you delete your expired key and create a new - one. - - {:else if isExpiring} - (alertsDismissed = true)} - title="Your API key is about to expire"> - Update the expiration date to keep the key active - - {/if} - - - - - - - - diff --git a/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte b/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte index a435ceea3..da0dad597 100644 --- a/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte @@ -1,98 +1,5 @@ - -
- -
- - - - -
- -
- - - Choose which permission scopes to grant your application. It is best - practice to allow only the permissions you need to meet your project goals. - - - -
-
- - - - - - -
+ diff --git a/src/routes/(console)/project-[project]/overview/keys/scopes.svelte b/src/routes/(console)/project-[project]/overview/keys/scopes.svelte index 9c4f39f0a..44fb2c49c 100644 --- a/src/routes/(console)/project-[project]/overview/keys/scopes.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/scopes.svelte @@ -77,8 +77,6 @@ } } } - - $: console.log(scopes); From eb18860154f3b376ffc24febbf7f7f2307128fda Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 23 Mar 2025 19:50:48 +0530 Subject: [PATCH 04/36] fix: duplicate shortcut. --- src/routes/(console)/project-[project]/overview/+layout.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[project]/overview/+layout.svelte b/src/routes/(console)/project-[project]/overview/+layout.svelte index fcdaf1746..d48a3e12c 100644 --- a/src/routes/(console)/project-[project]/overview/+layout.svelte +++ b/src/routes/(console)/project-[project]/overview/+layout.svelte @@ -78,7 +78,7 @@ callback() { goto(`${base}/project-${projectId}/overview/dev-keys/create`); }, - keys: ['c', 'k'], + keys: ['c', 'd', 'k'], group: 'integrations', disabled: !$canWriteProjects } From 0d4f71e63eb17744dea90425088935f12f735820 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 24 Mar 2025 11:16:04 +0530 Subject: [PATCH 05/36] update: cleanups, expiry fixes. --- .../overview/components/create.svelte | 7 +++--- .../overview/components/delete.svelte | 2 +- .../components/expirationInput.svelte | 24 +++++++++++++++++-- .../components/updateExpirationDate.svelte | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/routes/(console)/project-[project]/overview/components/create.svelte b/src/routes/(console)/project-[project]/overview/components/create.svelte index ab5d9f712..f74d558e1 100644 --- a/src/routes/(console)/project-[project]/overview/components/create.svelte +++ b/src/routes/(console)/project-[project]/overview/components/create.svelte @@ -44,11 +44,11 @@ ) : await sdk.forConsole.projects.createDevKey(projectId, name, expire || undefined); - if ($onboarding) { + if ($onboarding && isApiKey) { await invalidate(Dependencies.PROJECT); } trackEvent(event); - goto(`${base}/project-${$page.params.project}/overview/${slug}/${$id}`); + goto(`${base}/project-${projectId}/overview/${slug}/${$id}`); addNotification({ message: `${label} key has been created`, type: 'success' @@ -79,7 +79,8 @@ placeholder="{label} key name" required bind:value={name} /> - + + diff --git a/src/routes/(console)/project-[project]/overview/components/delete.svelte b/src/routes/(console)/project-[project]/overview/components/delete.svelte index 8a5c0bfa1..230adeb2a 100644 --- a/src/routes/(console)/project-[project]/overview/components/delete.svelte +++ b/src/routes/(console)/project-[project]/overview/components/delete.svelte @@ -45,5 +45,5 @@ - Are you sure you want to delete this execution? + Are you sure you want to delete this key? diff --git a/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte b/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte index cafc292c6..1df900861 100644 --- a/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte +++ b/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte @@ -19,7 +19,7 @@ return date.toISOString(); } - const options = [ + const defaultOptions = [ { label: 'Never', value: null @@ -46,10 +46,30 @@ } ]; + const limitedOptions = [ + { + label: '1 Day', + value: incrementToday(1, 'day') + }, + { + label: '7 Days', + value: incrementToday(7, 'day') + }, + { + label: '30 days', + value: incrementToday(30, 'day') + } + ]; + export let value: string | null = null; + export let keyType: 'api' | 'dev' = 'api'; + + const options = keyType === 'api' ? defaultOptions : limitedOptions; function initExpirationSelect() { - if (value === null || !isValidDate(value)) return null; + if (value === null || !isValidDate(value)) { + return options[0]?.value ?? null; + } let result = 'custom'; for (const option of options) { diff --git a/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte index 1393f86e0..34dad4c13 100644 --- a/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte +++ b/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte @@ -83,7 +83,7 @@ Update the expiration date to keep the key active {/if} - + From 9d62307e10f04df7e2c916b1d42b52f047dae2a3 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 24 Mar 2025 14:56:31 +0530 Subject: [PATCH 06/36] fixes: as per designs. --- .../overview/components/create.svelte | 65 +++++++---------- .../overview/components/table.svelte | 34 +++++++-- .../overview/dev-keys/action.svelte | 71 ++++++++++++++++++- .../overview/dev-keys/create/+page.svelte | 5 -- 4 files changed, 124 insertions(+), 51 deletions(-) delete mode 100644 src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/create.svelte b/src/routes/(console)/project-[project]/overview/components/create.svelte index f74d558e1..b2dbc90ee 100644 --- a/src/routes/(console)/project-[project]/overview/components/create.svelte +++ b/src/routes/(console)/project-[project]/overview/components/create.svelte @@ -8,23 +8,16 @@ import Button from '$lib/elements/forms/button.svelte'; import Form from '$lib/elements/forms/form.svelte'; import { sdk } from '$lib/stores/sdk'; - import { onboarding } from '$routes/(console)/project-[project]/store'; + import { onboarding } from '../../store'; import { goto, invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { addNotification } from '$lib/stores/notifications'; import { writable } from 'svelte/store'; - import Scopes from '$routes/(console)/project-[project]/overview/keys/scopes.svelte'; - - export let keyType: 'api' | 'dev' = 'api'; + import Scopes from '../keys/scopes.svelte'; const projectId = $page.params.project; - const isApiKey = keyType === 'api'; - const label = isApiKey ? 'API' : 'Dev'; - const slug = isApiKey ? 'keys' : 'dev-keys'; - const event = isApiKey ? Submit.KeyCreate : Submit.DevKeyCreate; - let showExitModal = false; let formComponent: Form; let isSubmitting = writable(false); @@ -35,22 +28,21 @@ async function create() { try { - const { $id } = isApiKey - ? await sdk.forConsole.projects.createKey( - projectId, - name, - scopes, - expire || undefined - ) - : await sdk.forConsole.projects.createDevKey(projectId, name, expire || undefined); + const { $id } = await sdk.forConsole.projects.createKey( + projectId, + name, + scopes, + expire || undefined + ); - if ($onboarding && isApiKey) { + if ($onboarding) { await invalidate(Dependencies.PROJECT); } - trackEvent(event); - goto(`${base}/project-${projectId}/overview/${slug}/${$id}`); + + trackEvent(Submit.KeyCreate); + await goto(`${base}/project-${projectId}/overview/keys/${$id}`); addNotification({ - message: `${label} key has been created`, + message: `API key has been created`, type: 'success' }); } catch (error) { @@ -58,14 +50,14 @@ type: 'error', message: error.message }); - trackError(error, event); + trackError(error, Submit.KeyCreate); } } @@ -76,26 +68,23 @@ - + - {#if isApiKey} -
- - - Choose which permission scopes to grant your application. It is best - practice to allow only the permissions you need to meet your project - goals. - - - -
- {/if} +
+ + + Choose which permission scopes to grant your application. It is best + practice to allow only the permissions you need to meet your project goals. + + + +
diff --git a/src/routes/(console)/project-[project]/overview/components/table.svelte b/src/routes/(console)/project-[project]/overview/components/table.svelte index a6b232f52..3c142c025 100644 --- a/src/routes/(console)/project-[project]/overview/components/table.svelte +++ b/src/routes/(console)/project-[project]/overview/components/table.svelte @@ -1,8 +1,8 @@ {#if keys.total} - + Name Last accessed @@ -31,7 +44,7 @@ {/if} {#each keys.keys as key} - + {key.name} @@ -39,7 +52,18 @@ {key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} - {key.expire ? toLocaleDateTime(key.expire) : 'never'} + {@const expiration = getExpiryDetails(key)} + + {key.expire ? toLocaleDateTime(key.expire) : 'never'} + + {#if expiration.status} + + {/if} + {#if isApiKey} diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte index a6dd57d54..dd5398dc8 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte @@ -1,15 +1,80 @@ - {#if $canWriteKeys} - + +
+ + + Test your app without rate limits and more detailed error messages. + + + + + + + + + + + + + + {/if} diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte deleted file mode 100644 index e3dae9bcf..000000000 --- a/src/routes/(console)/project-[project]/overview/dev-keys/create/+page.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - From 6f4a45f79dbad9f5341248383e290fb62a5fb8b8 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 24 Mar 2025 17:08:16 +0530 Subject: [PATCH 07/36] update: streamline components. --- src/lib/elements/forms/inputSelect.svelte | 3 +- .../components/expirationInput.svelte | 22 +- .../overview/components/keyDetails.svelte | 205 ++++++++++++++++++ .../components/updateExpirationDate.svelte | 9 +- .../[key]/+page@project-[project].svelte | 109 +--------- .../overview/dev-keys/action.svelte | 2 +- .../keys/[key]/+page@project-[project].svelte | 163 +------------- 7 files changed, 232 insertions(+), 281 deletions(-) create mode 100644 src/routes/(console)/project-[project]/overview/components/keyDetails.svelte diff --git a/src/lib/elements/forms/inputSelect.svelte b/src/lib/elements/forms/inputSelect.svelte index b64746bfd..ae4187870 100644 --- a/src/lib/elements/forms/inputSelect.svelte +++ b/src/lib/elements/forms/inputSelect.svelte @@ -4,6 +4,7 @@ export let id: string; export let label: string | undefined = undefined; + export let helper: string | undefined = undefined; export let value: string | number | boolean | null; export let optionalText: string | number | boolean | null | undefined = undefined; export let placeholder = ''; @@ -55,7 +56,7 @@ {disabled} {isSearchable} {required} - helper={error} + helper={error ?? helper} state={error ? 'error' : 'default'} on:invalid={handleInvalid} on:input diff --git a/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte b/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte index 1df900861..0f92c7742 100644 --- a/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte +++ b/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte @@ -1,5 +1,5 @@ - - - {#if expirationSelect !== 'custom' && expirationSelect !== null} - Your key will expire in {toLocaleDate(value)} - {/if} - - + + {#if expirationSelect === 'custom'} {/if} diff --git a/src/routes/(console)/project-[project]/overview/components/keyDetails.svelte b/src/routes/(console)/project-[project]/overview/components/keyDetails.svelte new file mode 100644 index 000000000..570abf8a1 --- /dev/null +++ b/src/routes/(console)/project-[project]/overview/components/keyDetails.svelte @@ -0,0 +1,205 @@ + + + + {label} key - Appwrite + + + + {@const accessedAt = key.accessedAt ? toLocaleDate(key.accessedAt) : 'never'} + + Key details + + + {#each Object.entries(tiles) as [label, value]} + + + {label} + + + {#if label === 'Secret'} + + {:else} + {value} + {/if} + + + {/each} + + + + +
+ + Name + Choose any name that will help you distinguish between {label} keys. + + + + + + + + + + + {#if isApiKey} +
+ {@const apiKey = asApiKey(key)} + + Scopes + You can choose which permission scope to grant your application. It is a best practice + to allow only the permissions you need to meet your project goals. + + {#if scopes !== null} + + {/if} + + + + + + + + {/if} + + + + + Delete {label} key + The Dev key will be permanently deleted. This action is irreversible. + + +
+
+
{key.name}
+

Last accessed: {accessedAt}

+
+
+
+
+ + + + +
+
+ + diff --git a/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte index 34dad4c13..eda52dfef 100644 --- a/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte +++ b/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte @@ -4,7 +4,7 @@ import { CardGrid } from '$lib/components'; import { Dependencies } from '$lib/constants'; import { Button, Form } from '$lib/elements/forms'; - import { diffDays } from '$lib/helpers/date'; + import { diffDays, isSameDay } from '$lib/helpers/date'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import { Alert } from '@appwrite.io/pink-svelte'; @@ -17,7 +17,7 @@ const projectId = $page.params.project; - let isApiKey = keyType === 'api'; + const isApiKey = keyType === 'api'; const label = isApiKey ? 'API' : 'Dev'; const dependency = isApiKey ? Dependencies.KEY : Dependencies.DEV_KEY; const event = isApiKey ? Submit.KeyUpdateExpire : Submit.DevKeyUpdateExpire; @@ -60,6 +60,9 @@ $: isExpiring = !alertsDismissed && key.expire && diffDays(new Date(), new Date(key.expire)) < 14; $: isExpired = !alertsDismissed && key.expire !== null && new Date(key.expire) < new Date(); + + // for comparison's sake. + $: disableButton = isSameDay(new Date(expiration), new Date(key?.expire));
@@ -87,7 +90,7 @@
- + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte index d62096b86..d9751bd0f 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte @@ -1,111 +1,6 @@ - - Dev key - Appwrite - - - - {@const accessedAt = $devKey.accessedAt ? toLocaleDate($devKey.accessedAt) : 'never'} - - {$devKey.name} - - - Last accessed: {accessedAt} - - - - Dev key secret - - - - - -
- - Name - Choose any name that will help you distinguish between Dev keys. - - - - - - - - - - - - - - Delete Dev key - The Dev key will be permanently deleted. This action is irreversible. - - -
-
-
{$devKey.name}
-

Last accessed: {accessedAt}

-
-
-
-
- - - - -
-
- - + diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte index dd5398dc8..d29bce66e 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte @@ -30,7 +30,7 @@ showModal = false; trackEvent(Submit.DevKeyCreate); - goto(`${base}/project-${projectId}/overview/dev-keys/${$id}`); + await goto(`${base}/project-${projectId}/overview/dev-keys/${$id}`); addNotification({ message: `Dev key has been created`, type: 'success' diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte index ade356733..118d093f5 100644 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -1,165 +1,6 @@ - - API key - Appwrite - - - - {@const accessedAt = $key.accessedAt ? toLocaleDate($key.accessedAt) : 'never'} - - {$key.name} - -

- Last accessed: {accessedAt}
- Scopes granted: {$key.scopes.length} -

-
-
- - - API key secret - - - - - -
- - Name - Choose any name that will help you distinguish between API keys. - - - - - - - - - -
- - Scopes - You can choose which permission scope to grant your application. It is a best practice to - allow only the permissions you need to meet your project goals. - - {#if scopes !== null} - - {/if} - - - - - - - - - - - - Delete API key - The API key will be permanently deleted. This action is irreversible. - - -
-
-
{$key.name}
-

Last accessed: {accessedAt}

-
-
-
-
- - - - -
-
- - + From 4c9900762e75c62df30d19c7a3b4b5d1ce603b18 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 26 Mar 2025 11:30:53 +0530 Subject: [PATCH 08/36] update: component dir path. --- package.json | 1 - .../overview/{components => (components)}/checkbox.svelte | 0 .../overview/{components => (components)}/create.svelte | 0 .../overview/{components => (components)}/delete.svelte | 0 .../{components => (components)}/expirationInput.svelte | 0 .../overview/{components => (components)}/keyDetails.svelte | 0 .../overview/{components => (components)}/table.svelte | 0 .../updateExpirationDate.svelte | 6 +++++- .../project-[project]/overview/dev-keys/+page.svelte | 2 +- .../overview/dev-keys/[key]/+page@project-[project].svelte | 2 +- .../project-[project]/overview/dev-keys/action.svelte | 2 +- .../(console)/project-[project]/overview/keys/+page.svelte | 2 +- .../overview/keys/[key]/+page@project-[project].svelte | 2 +- .../project-[project]/overview/keys/create/+page.svelte | 2 +- 14 files changed, 11 insertions(+), 8 deletions(-) rename src/routes/(console)/project-[project]/overview/{components => (components)}/checkbox.svelte (100%) rename src/routes/(console)/project-[project]/overview/{components => (components)}/create.svelte (100%) rename src/routes/(console)/project-[project]/overview/{components => (components)}/delete.svelte (100%) rename src/routes/(console)/project-[project]/overview/{components => (components)}/expirationInput.svelte (100%) rename src/routes/(console)/project-[project]/overview/{components => (components)}/keyDetails.svelte (100%) rename src/routes/(console)/project-[project]/overview/{components => (components)}/table.svelte (100%) rename src/routes/(console)/project-[project]/overview/{components => (components)}/updateExpirationDate.svelte (93%) diff --git a/package.json b/package.json index ad70f3ff5..0846a0a16 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ }, "dependencies": { "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@9562", - "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@08b7400", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@64948b6 ", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/src/routes/(console)/project-[project]/overview/components/checkbox.svelte b/src/routes/(console)/project-[project]/overview/(components)/checkbox.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/components/checkbox.svelte rename to src/routes/(console)/project-[project]/overview/(components)/checkbox.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/create.svelte b/src/routes/(console)/project-[project]/overview/(components)/create.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/components/create.svelte rename to src/routes/(console)/project-[project]/overview/(components)/create.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/delete.svelte b/src/routes/(console)/project-[project]/overview/(components)/delete.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/components/delete.svelte rename to src/routes/(console)/project-[project]/overview/(components)/delete.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/expirationInput.svelte b/src/routes/(console)/project-[project]/overview/(components)/expirationInput.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/components/expirationInput.svelte rename to src/routes/(console)/project-[project]/overview/(components)/expirationInput.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/keyDetails.svelte b/src/routes/(console)/project-[project]/overview/(components)/keyDetails.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/components/keyDetails.svelte rename to src/routes/(console)/project-[project]/overview/(components)/keyDetails.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/table.svelte b/src/routes/(console)/project-[project]/overview/(components)/table.svelte similarity index 100% rename from src/routes/(console)/project-[project]/overview/components/table.svelte rename to src/routes/(console)/project-[project]/overview/(components)/table.svelte diff --git a/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte b/src/routes/(console)/project-[project]/overview/(components)/updateExpirationDate.svelte similarity index 93% rename from src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte rename to src/routes/(console)/project-[project]/overview/(components)/updateExpirationDate.svelte index eda52dfef..c0d21dd97 100644 --- a/src/routes/(console)/project-[project]/overview/components/updateExpirationDate.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/updateExpirationDate.svelte @@ -62,7 +62,11 @@ $: isExpired = !alertsDismissed && key.expire !== null && new Date(key.expire) < new Date(); // for comparison's sake. - $: disableButton = isSameDay(new Date(expiration), new Date(key?.expire)); + $: disableButton = + // expiration becomes `null` in `ExpirationInput`. + typeof key?.expire === 'undefined' && expiration === null + ? true + : isSameDay(new Date(expiration), new Date(key?.expire));
diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte index 1303b0b70..35382191b 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/+page.svelte @@ -2,7 +2,7 @@ import type { PageData } from './$types'; import Action from './action.svelte'; import { setOverviewAction } from '../context'; - import Table from '../components/table.svelte'; + import Table from '../(components)/table.svelte'; export let data: PageData; diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte index d9751bd0f..9e16d83b5 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/+page@project-[project].svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte index d29bce66e..48710d628 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte @@ -4,7 +4,7 @@ import { Icon, Modal, Layout } from '@appwrite.io/pink-svelte'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { Form, InputText } from '$lib/elements/forms/index.js'; - import ExpirationInput from '../components/expirationInput.svelte'; + import ExpirationInput from '../(components)/expirationInput.svelte'; import { sdk } from '$lib/stores/sdk'; import { goto } from '$app/navigation'; import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; diff --git a/src/routes/(console)/project-[project]/overview/keys/+page.svelte b/src/routes/(console)/project-[project]/overview/keys/+page.svelte index d23abab9f..f9f98b736 100644 --- a/src/routes/(console)/project-[project]/overview/keys/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/+page.svelte @@ -2,7 +2,7 @@ import type { PageData } from './$types'; import Action from './action.svelte'; import { setOverviewAction } from '../context'; - import Table from '../components/table.svelte'; + import Table from '../(components)/table.svelte'; export let data: PageData; diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte index 118d093f5..82d29d955 100644 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte +++ b/src/routes/(console)/project-[project]/overview/keys/[key]/+page@project-[project].svelte @@ -1,6 +1,6 @@ diff --git a/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte b/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte index da0dad597..dd2233840 100644 --- a/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/create/+page.svelte @@ -1,5 +1,5 @@ From 501b97bc9d944906d625090a40aa25e80e9d0165 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 26 Mar 2025 17:17:01 +0530 Subject: [PATCH 09/36] fix: accordion divider; update: wizard column size. --- .../overview/(components)/create.svelte | 1 + .../project-[project]/overview/keys/scopes.svelte | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[project]/overview/(components)/create.svelte b/src/routes/(console)/project-[project]/overview/(components)/create.svelte index b2dbc90ee..e4267b08d 100644 --- a/src/routes/(console)/project-[project]/overview/(components)/create.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/create.svelte @@ -60,6 +60,7 @@ href={`${base}/project-${projectId}/overview/keys/`} bind:showExitModal column + columnSize="s" confirmExit> diff --git a/src/routes/(console)/project-[project]/overview/keys/scopes.svelte b/src/routes/(console)/project-[project]/overview/keys/scopes.svelte index 44fb2c49c..d3a7601e6 100644 --- a/src/routes/(console)/project-[project]/overview/keys/scopes.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/scopes.svelte @@ -17,6 +17,16 @@ Other = 'Other' } + const categories = [ + Category.Auth, + Category.Database, + Category.Functions, + Category.Storage, + Category.Messaging, + Category.Sites, + Category.Other + ]; + let mounted = false; onMount(() => { @@ -90,14 +100,16 @@ - {#each [Category.Auth, Category.Database, Category.Functions, Category.Storage, Category.Messaging, Category.Sites, Category.Other] as category} + {#each categories as category, index} {@const checked = categoryState(category, scopes)} + {@const isLastItem = index === categories.length - 1} {@const scopesLength = allScopes.filter( (n) => n.category === category && scopes.includes(n.scope) ).length} onCategoryChange(event, category)}> From 8bd1869768b845bbce7b11f95ef9aa548f7b111c Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 27 Mar 2025 13:00:09 +0530 Subject: [PATCH 10/36] feat: Import documents from a CSV. --- package.json | 4 +- pnpm-lock.yaml | 28 +-- src/lib/components/csvImportBox.svelte | 162 ++++++++++++++++++ src/lib/helpers/files.ts | 18 ++ .../project-[project]/+layout.svelte | 2 + .../collection-[collection]/+page.svelte | 125 +++++++++++++- .../attributes/+page.svelte | 77 +++++---- .../attributes/createAttributeDropdown.svelte | 45 +++-- .../csvDisabled.svelte | 12 ++ .../collection-[collection]/store.ts | 3 + 10 files changed, 406 insertions(+), 70 deletions(-) create mode 100644 src/lib/components/csvImportBox.svelte create mode 100644 src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/csvDisabled.svelte diff --git a/package.json b/package.json index f74a73efc..44254c1e8 100644 --- a/package.json +++ b/package.json @@ -21,9 +21,9 @@ "dependencies": { "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@8db247c", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a5aab5", + "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@310", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@203ff84", + "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@310", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f6bc6d6a..d5db0176e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,14 +15,14 @@ importers: specifier: 0.25.0 version: 0.25.0 '@appwrite.io/pink-icons-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a5aab5 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a5aab5(svelte@4.2.19) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@310 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@310(svelte@4.2.19) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@203ff84 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@203ff84(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@310 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@310(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -215,14 +215,14 @@ packages: resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@8db247c} version: 1.2.1 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@203ff849e6d6a66529bf690af2e97cade99ef488': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@203ff849e6d6a66529bf690af2e97cade99ef488} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@2db2d48b7ac3f0f2a0a8b90c9d81310183586c2a': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@2db2d48b7ac3f0f2a0a8b90c9d81310183586c2a} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a5aab5': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a5aab5} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@310': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@310} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -236,8 +236,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@203ff84': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@203ff84} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@310': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@310} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 @@ -4243,11 +4243,11 @@ snapshots: '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@8db247c': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@203ff849e6d6a66529bf690af2e97cade99ef488(svelte@4.2.19)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@2db2d48b7ac3f0f2a0a8b90c9d81310183586c2a(svelte@4.2.19)': dependencies: svelte: 4.2.19 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@4a5aab5(svelte@4.2.19)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@310(svelte@4.2.19)': dependencies: svelte: 4.2.19 @@ -4260,9 +4260,9 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@203ff84(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19)': + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@310(react-dom@18.3.1(react@18.3.1))(svelte@4.2.19)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@203ff849e6d6a66529bf690af2e97cade99ef488(svelte@4.2.19) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@2db2d48b7ac3f0f2a0a8b90c9d81310183586c2a(svelte@4.2.19) '@floating-ui/dom': 1.6.13 '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.3(svelte@4.2.19))(svelte@4.2.19) '@melt-ui/svelte': 0.86.3(svelte@4.2.19) diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte new file mode 100644 index 000000000..9b444447a --- /dev/null +++ b/src/lib/components/csvImportBox.svelte @@ -0,0 +1,162 @@ + + +{#if showCsvImportBox} +
+
+
+

+ + Importing documents ({importItems.size}) + +

+ + +
+ + {#each [...importItems.entries()] as [key, value]} +
+
    +
  • +
    +
    + + {text(key)} + + + + Collection name + +
    +
    +
    +
  • +
+
+ {/each} +
+
+{/if} + + diff --git a/src/lib/helpers/files.ts b/src/lib/helpers/files.ts index f85f4e7bd..89e92d654 100644 --- a/src/lib/helpers/files.ts +++ b/src/lib/helpers/files.ts @@ -97,6 +97,24 @@ export function removeFile(file: File, files: FileList) { return dataTransfer.files; } +export function readColumnsFromCSV(file: File): Promise { + // more than enough! + const CHUNK_SIZE = 4096; + + return new Promise((resolve, reject) => { + const reader = new FileReader(); + + reader.onload = () => { + const text = reader.result as string; + const [firstLine] = text.split('\n'); + resolve(firstLine.split(',')); + }; + + reader.onerror = reject; + reader.readAsText(file.slice(0, CHUNK_SIZE)); + }); +} + export const defaultIgnore = ` ### Node ### # Logs diff --git a/src/routes/(console)/project-[project]/+layout.svelte b/src/routes/(console)/project-[project]/+layout.svelte index 9faa9c742..5c9bac20e 100644 --- a/src/routes/(console)/project-[project]/+layout.svelte +++ b/src/routes/(console)/project-[project]/+layout.svelte @@ -24,6 +24,7 @@ canWriteProjects, canWriteSites } from '$lib/stores/roles'; + import CsvImportBox from '$lib/components/csvImportBox.svelte'; onMount(() => { return sdk.forConsole.client.subscribe(['project', 'console'], (response) => { @@ -117,6 +118,7 @@ + From 140a2155b3953ca77041ebf68dad7f8d28bdbe75 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 23 Apr 2025 16:23:38 +0530 Subject: [PATCH 19/36] fix: table missing dev key data. --- .../overview/(components)/table.svelte | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[project]/overview/(components)/table.svelte b/src/routes/(console)/project-[project]/overview/(components)/table.svelte index 3c142c025..241f49a7e 100644 --- a/src/routes/(console)/project-[project]/overview/(components)/table.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/table.svelte @@ -5,7 +5,7 @@ import { Badge, Layout, Table } from '@appwrite.io/pink-svelte'; import { goto } from '$app/navigation'; import { base } from '$app/paths'; - import { page } from '$app/stores'; + import { page } from '$app/state'; import type { Models } from '@appwrite.io/console'; export let keyType: 'api' | 'dev' = 'api'; @@ -31,6 +31,11 @@ message: isExpired ? 'Expired' : isExpiring ? 'Expires soon' : null }; } + + function getKeys(): Models.Key[] | Models.DevKey[] { + if (isApiKey) return keys['keys'] as Models.Key[]; + else return keys['devKeys'] as Models.DevKey[]; + } {#if keys.total} @@ -43,7 +48,7 @@ Scopes {/if} - {#each keys.keys as key} + {#each getKeys() as key (key.$id)} {key.name} @@ -79,5 +84,5 @@ allowCreate={$canWriteKeys} href="https://appwrite.io/docs/advanced/platform/{slug}" target="{label} key" - on:click={() => goto(`${base}/project-${$page.params.project}/overview/${slug}/create`)} /> + on:click={() => goto(`${base}/project-${page.params.project}/overview/${slug}/create`)} /> {/if} From e420bab2fcc534b19f9aaafc0e7995f018749db6 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 24 Apr 2025 12:27:32 +0530 Subject: [PATCH 20/36] address comments: misc changes to logic, copy. --- package.json | 4 +-- pnpm-lock.yaml | 28 +++++++++--------- .../overview/(components)/create.svelte | 2 +- .../overview/(components)/table.svelte | 29 ++++++++++++++----- .../overview/dev-keys/[key]/header.svelte | 1 - .../overview/dev-keys/action.svelte | 14 ++++----- .../overview/keys/[key]/header.svelte | 1 - .../project-[project]/overview/store.ts | 2 ++ 8 files changed, 48 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 7d90753a5..82989cec4 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,9 @@ "dependencies": { "@appwrite.io/console": "https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7773939", "@appwrite.io/pink-icons": "0.25.0", - "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23", + "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f", + "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6c85487", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8081d4164..38d52105d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,14 +15,14 @@ importers: specifier: 0.25.0 version: 0.25.0 '@appwrite.io/pink-icons-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23 - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23(svelte@5.25.3) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487(svelte@5.25.3) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6c85487 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6c85487(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -221,14 +221,14 @@ packages: resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7773939} version: 1.2.1 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487cf9b15630ea5b7df69b56e02877dbdf1c': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487cf9b15630ea5b7df69b56e02877dbdf1c} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -242,8 +242,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6c85487': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6c85487} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 @@ -3536,11 +3536,11 @@ snapshots: '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@7773939': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487(svelte@5.25.3)': dependencies: svelte: 5.25.3 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6b17cb23(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487cf9b15630ea5b7df69b56e02877dbdf1c(svelte@5.25.3)': dependencies: svelte: 5.25.3 @@ -3553,9 +3553,9 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@6c85487(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27(svelte@5.25.3) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@6c85487cf9b15630ea5b7df69b56e02877dbdf1c(svelte@5.25.3) '@floating-ui/dom': 1.6.13 '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.25.3))(svelte@5.25.3) '@melt-ui/svelte': 0.86.6(svelte@5.25.3) diff --git a/src/routes/(console)/project-[project]/overview/(components)/create.svelte b/src/routes/(console)/project-[project]/overview/(components)/create.svelte index e4267b08d..a5ccdf3db 100644 --- a/src/routes/(console)/project-[project]/overview/(components)/create.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/create.svelte @@ -69,7 +69,7 @@ diff --git a/src/routes/(console)/project-[project]/overview/(components)/table.svelte b/src/routes/(console)/project-[project]/overview/(components)/table.svelte index 241f49a7e..c67cafb50 100644 --- a/src/routes/(console)/project-[project]/overview/(components)/table.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/table.svelte @@ -1,18 +1,19 @@ {#if keys.total} @@ -84,5 +92,12 @@ allowCreate={$canWriteKeys} href="https://appwrite.io/docs/advanced/platform/{slug}" target="{label} key" - on:click={() => goto(`${base}/project-${page.params.project}/overview/${slug}/create`)} /> + description={getDescription()} + on:click={() => { + if (isApiKey) { + goto(`${base}/project-${page.params.project}/overview/${slug}/create`); + } else { + $showDevKeysCreateModal = true; + } + }} /> {/if} diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte index fc36b5250..f2a19f346 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/[key]/header.svelte @@ -13,6 +13,5 @@ {$devKey?.name} - Dev key secret diff --git a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte index c32a1e46d..306188b52 100644 --- a/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte +++ b/src/routes/(console)/project-[project]/overview/dev-keys/action.svelte @@ -11,8 +11,8 @@ import { base } from '$app/paths'; import { addNotification } from '$lib/stores/notifications'; import { page } from '$app/state'; + import { showDevKeysCreateModal } from '$routes/(console)/project-[project]/overview/store'; - let showModal = false; let isSubmitting = false; let name = '', expire = ''; @@ -28,7 +28,7 @@ expire || undefined ); - showModal = false; + $showDevKeysCreateModal = false; trackEvent(Submit.DevKeyCreate); await goto(`${base}/project-${projectId}/overview/dev-keys/${$id}`); addNotification({ @@ -48,13 +48,13 @@ {#if $canWriteKeys} - - + Test your app without rate limits and more detailed error messages. @@ -63,7 +63,7 @@ @@ -71,7 +71,7 @@
- diff --git a/src/routes/(console)/project-[project]/overview/keys/[key]/header.svelte b/src/routes/(console)/project-[project]/overview/keys/[key]/header.svelte index 9bd9f3eb0..0d7411d60 100644 --- a/src/routes/(console)/project-[project]/overview/keys/[key]/header.svelte +++ b/src/routes/(console)/project-[project]/overview/keys/[key]/header.svelte @@ -13,6 +13,5 @@ {$key?.name} - API key secret diff --git a/src/routes/(console)/project-[project]/overview/store.ts b/src/routes/(console)/project-[project]/overview/store.ts index e0fd85cdc..94a931569 100644 --- a/src/routes/(console)/project-[project]/overview/store.ts +++ b/src/routes/(console)/project-[project]/overview/store.ts @@ -18,3 +18,5 @@ export const usage = cachedStore< }); export const selectedTab: Writable<'platforms' | 'keys' | 'dev-keys'> = writable('platforms'); + +export const showDevKeysCreateModal: Writable = writable(false); From c6ca1c101d03152960ae4070c873c7a84464e11d Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 24 Apr 2025 13:59:42 +0530 Subject: [PATCH 21/36] address comments: design review. --- src/lib/components/csvImportBox.svelte | 25 ++++++----- src/lib/components/filePicker.svelte | 43 ++++++++++++------- .../collection-[collection]/+page.svelte | 2 +- .../attributes/+page.svelte | 5 ++- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte index 78526d196..0a76b7ff0 100644 --- a/src/lib/components/csvImportBox.svelte +++ b/src/lib/components/csvImportBox.svelte @@ -125,15 +125,16 @@ } } - function text(status: string, collectionName: string = '') { - if (status === 'completed') { - return 'CSV import complete'; - } else if (status === 'failed') { - return 'CSV import failed'; - } else if (status === 'processing') { - return `Importing CSV file${collectionName ? ` to ${collectionName}` : ''}`; - } else { - return 'Preparing CSV for import...'; + function text(status: string, collectionName = '') { + const name = collectionName ? `${collectionName}` : ''; + switch (status) { + case 'completed': + case 'failed': + return `Import to ${name} ${status}`; + case 'processing': + return `Importing CSV file${name ? ` to ${name}` : ''}`; + default: + return 'Preparing CSV for import...'; } } @@ -169,9 +170,7 @@ class="upload-box-button" class:is-open={isOpen} aria-label="toggle upload box" - on:click={() => { - isOpen = !isOpen; - }}> + on:click={() => (isOpen = !isOpen)}> - + {:else} 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 index d2a546179..8a4ceac00 100644 --- 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 @@ -191,5 +191,5 @@ {#if showImportCSV} - + {/if} diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte index f71d0e829..298ea4ead 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte +++ b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte @@ -32,7 +32,8 @@ IconPencil, IconPlus, IconSwitchHorizontal, - IconTrash + IconTrash, + IconViewList } from '@appwrite.io/pink-icons-svelte'; import type { ComponentProps } from 'svelte'; import { Click, trackEvent } from '$lib/actions/analytics'; @@ -55,7 +56,7 @@ ip: IconLocationMarker, url: IconLink, email: IconLink, - enum: IconSwitchHorizontal + enum: IconViewList }; function getAttributeStatusBadge(status: string): ComponentProps['type'] { From ca8b32808a192bd00f3b71b472911e15b1bfaf0e Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 24 Apr 2025 14:05:24 +0530 Subject: [PATCH 22/36] fix: tabs state calculation. --- .../collection-[collection]/header.svelte | 86 ++++++++++--------- 1 file changed, 46 insertions(+), 40 deletions(-) diff --git a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/header.svelte b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/header.svelte index e4b58dfd1..4e6d36737 100644 --- a/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/header.svelte +++ b/src/routes/(console)/project-[project]/databases/database-[database]/collection-[collection]/header.svelte @@ -8,46 +8,52 @@ import { collection } from './store'; import { isTabletViewport } from '$lib/stores/viewport'; - $: projectId = page.params.project; - $: databaseId = page.params.database; - $: collectionId = page.params.collection; - $: path = `${base}/project-${projectId}/databases/database-${databaseId}/collection-${collectionId}`; - $: tabs = [ - { - href: path, - title: 'Documents', - event: 'documents', - hasChildren: true - }, - { - href: `${path}/attributes`, - title: 'Attributes', - event: 'attributes' - }, - { - href: `${path}/indexes`, - title: 'Indexes', - event: 'indexes' - }, - { - href: `${path}/activity`, - title: 'Activity', - event: 'activity', - hasChildren: true - }, - { - href: `${path}/usage`, - title: 'Usage', - event: 'usage', - hasChildren: true - }, - { - href: `${path}/settings`, - title: 'Settings', - event: 'settings', - disabled: !$canWriteCollections - } - ].filter((tab) => !tab.disabled); + const projectId = $derived(page.params.project); + const databaseId = $derived(page.params.database); + const collectionId = $derived(page.params.collection); + + const path = $derived( + `${base}/project-${projectId}/databases/database-${databaseId}/collection-${collectionId}` + ); + + const tabs = $derived.by(() => + [ + { + href: path, + title: 'Documents', + event: 'documents', + hasChildren: true + }, + { + href: `${path}/attributes`, + title: 'Attributes', + event: 'attributes' + }, + { + href: `${path}/indexes`, + title: 'Indexes', + event: 'indexes' + }, + { + href: `${path}/activity`, + title: 'Activity', + event: 'activity', + hasChildren: true + }, + { + href: `${path}/usage`, + title: 'Usage', + event: 'usage', + hasChildren: true + }, + { + href: `${path}/settings`, + title: 'Settings', + event: 'settings', + disabled: !$canWriteCollections + } + ].filter((tab) => !tab.disabled) + );
From b8da104150bfde1967b801fba880f7f8797bf10b Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 24 Apr 2025 15:02:58 +0530 Subject: [PATCH 23/36] update: batch delete to keys. --- .../overview/(components)/delete.svelte | 14 ++--- .../overview/(components)/deleteBatch.svelte | 63 +++++++++++++++++++ .../overview/(components)/table.svelte | 44 ++++++++++--- .../project-[project]/overview/store.ts | 14 ++++- 4 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 src/routes/(console)/project-[project]/overview/(components)/deleteBatch.svelte diff --git a/src/routes/(console)/project-[project]/overview/(components)/delete.svelte b/src/routes/(console)/project-[project]/overview/(components)/delete.svelte index 230adeb2a..74d068bde 100644 --- a/src/routes/(console)/project-[project]/overview/(components)/delete.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/delete.svelte @@ -1,19 +1,19 @@ + + +

+ Are you sure you want to delete {keyIds.length} + {label} key{keyIds.length > 1 ? 's' : ''}? +

+
diff --git a/src/routes/(console)/project-[project]/overview/(components)/table.svelte b/src/routes/(console)/project-[project]/overview/(components)/table.svelte index c67cafb50..e879facb8 100644 --- a/src/routes/(console)/project-[project]/overview/(components)/table.svelte +++ b/src/routes/(console)/project-[project]/overview/(components)/table.svelte @@ -3,15 +3,21 @@ import { page } from '$app/state'; import { goto } from '$app/navigation'; import { Empty } from '$lib/components'; + import { Button } from '$lib/elements/forms'; import { canWriteKeys } from '$lib/stores/roles'; import type { Models } from '@appwrite.io/console'; - import { showDevKeysCreateModal } from '../store'; - import { Badge, Layout, Table } from '@appwrite.io/pink-svelte'; import { diffDays, toLocaleDate, toLocaleDateTime } from '$lib/helpers/date'; + import { devKeyColumns, keyColumns, showDevKeysCreateModal } from '../store'; + import { Badge, FloatingActionBar, Layout, Table } from '@appwrite.io/pink-svelte'; + import DeleteBatch from './deleteBatch.svelte'; + import { capitalize } from '$lib/helpers/string'; export let keyType: 'api' | 'dev' = 'api'; export let keys: Models.KeyList | Models.DevKeyList; + let showDeleteModal = false; + let selectedRows: string[] = []; + const isApiKey = keyType === 'api'; const label = isApiKey ? 'API' : 'dev'; const slug = isApiKey ? 'keys' : 'dev-keys'; @@ -44,20 +50,19 @@ else return 'Dev keys allow bypassing rate limits and accessing more detailed error messages while in development.'; } + + const columns = isApiKey ? $keyColumns : $devKeyColumns; {#if keys.total} - + - Name - Last accessed - Expiration date - {#if isApiKey} - Scopes - {/if} + {#each columns as column} + {column.title} + {/each} {#each getKeys() as key (key.$id)} - + {key.name} @@ -101,3 +106,22 @@ } }} /> {/if} + +{#if selectedRows.length > 0} + + + + + {capitalize(label)} + {selectedRows.length > 1 ? 'keys' : 'key'} + selected + + + + + + + +{/if} + + diff --git a/src/routes/(console)/project-[project]/overview/store.ts b/src/routes/(console)/project-[project]/overview/store.ts index 94a931569..3adf1b9fc 100644 --- a/src/routes/(console)/project-[project]/overview/store.ts +++ b/src/routes/(console)/project-[project]/overview/store.ts @@ -1,7 +1,8 @@ import { sdk } from '$lib/stores/sdk'; import { cachedStore } from '$lib/helpers/cache'; -import { writable, type Writable } from 'svelte/store'; +import { get, readable, writable, type Writable } from 'svelte/store'; import type { Models, ProjectUsageRange } from '@appwrite.io/console'; +import type { Column } from '$lib/helpers/types'; export const usage = cachedStore< Models.UsageProject, @@ -20,3 +21,14 @@ export const usage = cachedStore< export const selectedTab: Writable<'platforms' | 'keys' | 'dev-keys'> = writable('platforms'); export const showDevKeysCreateModal: Writable = writable(false); + +export const devKeyColumns = readable([ + { id: 'name', title: 'Name', type: 'string', width: { min: 120 } }, + { id: 'last_accessed', title: 'Last accessed', type: 'datetime', width: { min: 120 } }, + { id: 'expiration', title: 'Expiration date', type: 'datetime', width: { min: 120 } } +]); + +export const keyColumns = readable([ + ...get(devKeyColumns), + { id: 'scopes', title: 'Scopes', type: 'string', width: { min: 120 } } +]); From bc5a31f3ace5238622f0857149c5f7c8679a71e4 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 24 Apr 2025 19:20:31 +0530 Subject: [PATCH 24/36] bump: lockfile. --- pnpm-lock.yaml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd1a4e68f..795347916 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@12075ba - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@12075ba(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -221,8 +221,8 @@ packages: resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9} version: 1.2.1 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@12075ba0a81ce1c8ef6f31a9951b42369eab478c': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@12075ba0a81ce1c8ef6f31a9951b42369eab478c} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -242,8 +242,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@12075ba': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@12075ba} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 @@ -3445,7 +3445,7 @@ snapshots: '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@12075ba0a81ce1c8ef6f31a9951b42369eab478c(svelte@5.27.0)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27(svelte@5.27.0)': dependencies: svelte: 5.27.0 @@ -3462,9 +3462,9 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@12075ba(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0)': + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@29b227f(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@12075ba0a81ce1c8ef6f31a9951b42369eab478c(svelte@5.27.0) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@29b227fb7ad99f66e5031701c457d89ac190cd27(svelte@5.27.0) '@floating-ui/dom': 1.6.13 '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.27.0))(svelte@5.27.0) '@melt-ui/svelte': 0.86.6(svelte@5.27.0) From e0d93a0cd9c020a5fd62582a097f0f3c58b7e23b Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 29 Apr 2025 15:08:53 +0530 Subject: [PATCH 25/36] fix: designs on file picker; update: misc. logic here and there. --- package.json | 2 +- pnpm-lock.yaml | 26 +- src/lib/components/csvImportBox.svelte | 19 +- src/lib/components/filePicker.svelte | 669 +++++++++++------- .../collection-[collection]/+page.svelte | 54 +- 5 files changed, 492 insertions(+), 278 deletions(-) diff --git a/package.json b/package.json index c8547862e..de203a8b9 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f", "@appwrite.io/pink-legacy": "^1.0.3", - "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@bd21ff7f", + "@appwrite.io/pink-svelte": "https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0", "@popperjs/core": "^2.11.8", "@sentry/sveltekit": "^8.38.0", "@stripe/stripe-js": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69f1af5b0..cd44cbe66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,13 +16,13 @@ importers: version: 0.25.0 '@appwrite.io/pink-icons-svelte': specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3) + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.27.0) '@appwrite.io/pink-legacy': specifier: ^1.0.3 version: 1.0.3 '@appwrite.io/pink-svelte': - specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@bd21ff7f - version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@bd21ff7f(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3) + specifier: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0 + version: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0) '@popperjs/core': specifier: ^2.11.8 version: 2.11.8 @@ -221,14 +221,14 @@ packages: resolution: {tarball: https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9} version: 1.2.1 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f1fe1b018f3ef6aa6091874b28cfc4554': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f1fe1b018f3ef6aa6091874b28cfc4554} + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f} version: 1.0.0-next.7 peerDependencies: svelte: ^4.0.0 @@ -242,8 +242,8 @@ packages: '@appwrite.io/pink-legacy@1.0.3': resolution: {integrity: sha512-GGde5fmPhs+s6/3aFeMPc/kKADG/gTFkYQSy6oBN8pK0y0XNCLrZZgBv+EBbdhwdtqVEWXa0X85Mv9w7jcIlwQ==} - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@bd21ff7f': - resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@bd21ff7f} + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0': + resolution: {tarball: https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0} version: 1.0.0-next.85 peerDependencies: react-dom: ^18.0.0 @@ -3445,11 +3445,11 @@ snapshots: '@appwrite.io/console@https://pkg.pr.new/appwrite/appwrite/@appwrite.io/console@61868a9': {} - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd(svelte@5.27.0)': dependencies: svelte: 5.27.0 - '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f1fe1b018f3ef6aa6091874b28cfc4554(svelte@5.25.3)': + '@appwrite.io/pink-icons-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f(svelte@5.27.0)': dependencies: svelte: 5.27.0 @@ -3462,9 +3462,9 @@ snapshots: '@appwrite.io/pink-icons': 1.0.0 the-new-css-reset: 1.11.3 - '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@bd21ff7f(react-dom@18.3.1(react@18.3.1))(svelte@5.25.3)': + '@appwrite.io/pink-svelte@https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-svelte@1c607c0(react-dom@18.3.1(react@18.3.1))(svelte@5.27.0)': dependencies: - '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@bd21ff7f1fe1b018f3ef6aa6091874b28cfc4554(svelte@5.25.3) + '@appwrite.io/pink-icons-svelte': https://pkg.pr.new/appwrite/pink/@appwrite.io/pink-icons-svelte@1c607c00c8ac325d51241066f9c74a9dfdfb8fcd(svelte@5.27.0) '@floating-ui/dom': 1.6.13 '@melt-ui/pp': 0.3.2(@melt-ui/svelte@0.86.6(svelte@5.27.0))(svelte@5.27.0) '@melt-ui/svelte': 0.86.6(svelte@5.27.0) diff --git a/src/lib/components/csvImportBox.svelte b/src/lib/components/csvImportBox.svelte index 0a76b7ff0..d3bd62888 100644 --- a/src/lib/components/csvImportBox.svelte +++ b/src/lib/components/csvImportBox.svelte @@ -29,15 +29,21 @@ async function showCompletionNotification( databaseId: string, collectionId: string, - status: string, - errors: string = '' + importData: Payload ) { const projectId = page.params.project; await invalidate(Dependencies.DOCUMENTS); const url = `${base}/project-${projectId}/databases/database-${databaseId}/collection-${collectionId}`; - const type = status === 'completed' ? 'success' : 'error'; - const message = status === 'completed' ? 'CSV import finished successfully.' : `${errors}`; + // extract clean message from nested backend error. + const match = importData.errors.join('').match(/message: '(.*)' Message:/i); + const actualMessage = match?.[1]; + + const type = importData.status === 'completed' ? 'success' : 'error'; + const message = + importData.status === 'completed' + ? 'CSV import finished successfully.' + : `${actualMessage}`; addNotification({ type, @@ -95,10 +101,7 @@ }); if (status === 'completed' || status === 'failed') { - // extract clean message from nested backend error. - const match = importData.errors.join('').match(/message: '(.*)' Message:/i); - const actualMessage = match?.[1]; - await showCompletionNotification(databaseId, collectionId, status, actualMessage); + await showCompletionNotification(databaseId, collectionId, importData); } } diff --git a/src/lib/components/filePicker.svelte b/src/lib/components/filePicker.svelte index 410973265..b090759e1 100644 --- a/src/lib/components/filePicker.svelte +++ b/src/lib/components/filePicker.svelte @@ -1,32 +1,34 @@ - + - + -