diff --git a/src/lib/commandCenter/commands.ts b/src/lib/commandCenter/commands.ts index fdf0e6ebd..7c1a00c3f 100644 --- a/src/lib/commandCenter/commands.ts +++ b/src/lib/commandCenter/commands.ts @@ -19,7 +19,9 @@ const groups = [ 'webhooks', 'integrations', 'migrations', - 'users' + 'users', + 'collections', + 'attributes' ] as const; export type CommandGroup = (typeof groups)[number]; @@ -104,7 +106,7 @@ export const commandCenterKeyDownHandler = derived( const reset = debounce(() => { recentKeyCodes = []; validCommands = []; - }, 2000); + }, 1000); const getHighestPriorityCommand = () => { if (!validCommands.length) return; diff --git a/src/lib/commandCenter/panels/ai.svelte b/src/lib/commandCenter/panels/ai.svelte index 0b5b2b32a..3cc6a5409 100644 --- a/src/lib/commandCenter/panels/ai.svelte +++ b/src/lib/commandCenter/panels/ai.svelte @@ -6,8 +6,8 @@ import { useCompletion } from 'ai/svelte'; import { subPanels } from '../subPanels'; - import CoolerAppwrite from '$lib/images/appwrite-cooler.svg'; import { isLanguage, type Language } from '$lib/components/code.svelte'; + import CoolerAppwrite from '$lib/images/appwrite-cooler.svg'; import { VARS } from '$lib/system'; const { input, handleSubmit, completion, isLoading, complete } = useCompletion({ diff --git a/src/lib/commandCenter/panels/createAttribute.svelte b/src/lib/commandCenter/panels/createAttribute.svelte new file mode 100644 index 000000000..fe8587f22 --- /dev/null +++ b/src/lib/commandCenter/panels/createAttribute.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/lib/commandCenter/panels/index.ts b/src/lib/commandCenter/panels/index.ts index d3b8a87de..89da8f74a 100644 --- a/src/lib/commandCenter/panels/index.ts +++ b/src/lib/commandCenter/panels/index.ts @@ -36,3 +36,9 @@ export const DatabasesPanel: SubPanel = { name: 'Databases', component: Databases }; + +import Collections from './collections.svelte'; +export const CollectionsPanel: SubPanel = { + name: 'Collections', + component: Collections +}; diff --git a/src/lib/commandCenter/panels/organizations.svelte b/src/lib/commandCenter/panels/organizations.svelte index 3401f6b18..260933327 100644 --- a/src/lib/commandCenter/panels/organizations.svelte +++ b/src/lib/commandCenter/panels/organizations.svelte @@ -7,5 +7,5 @@ diff --git a/src/lib/commandCenter/panels/projects.svelte b/src/lib/commandCenter/panels/projects.svelte index 56120c7a9..faaed59a8 100644 --- a/src/lib/commandCenter/panels/projects.svelte +++ b/src/lib/commandCenter/panels/projects.svelte @@ -7,5 +7,5 @@ diff --git a/src/lib/commandCenter/searchers/collections.ts b/src/lib/commandCenter/searchers/collections.ts index 1328e8685..adeb0baac 100644 --- a/src/lib/commandCenter/searchers/collections.ts +++ b/src/lib/commandCenter/searchers/collections.ts @@ -1,22 +1,26 @@ import { goto } from '$app/navigation'; -import { sdk } from '$lib/stores/sdk'; +import { database } from '$routes/console/project-[project]/databases/database-[database]/store'; +import { project } from '$routes/console/project-[project]/store'; import { get } from 'svelte/store'; import type { Searcher } from '../commands'; -import { project } from '$routes/console/project-[project]/store'; +import { sdk } from '$lib/stores/sdk'; export const collectionsSearcher = (async (query: string) => { - const { databases } = await sdk.forProject.databases.list(); + const databaseId = get(database).$id; + const { collections } = await sdk.forProject.databases.listCollections(databaseId); const projectId = get(project).$id; - return databases - .filter((db) => db.name.toLowerCase().includes(query.toLowerCase())) + return collections + .filter((col) => col.name.toLowerCase().includes(query.toLowerCase())) .map( - (db) => + (col) => ({ - group: 'databases', - label: db.name, + group: 'collections', + label: col.name, callback: () => { - goto(`/console/project-${projectId}/databases/database-${db.$id}`); + goto( + `/console/project-${projectId}/databases/database-${databaseId}/collection-${col.$id}` + ); } } as const) ); diff --git a/src/routes/console/project-[project]/databases/+layout.svelte b/src/routes/console/project-[project]/databases/+layout.svelte index 287d4c667..1f72a2fdf 100644 --- a/src/routes/console/project-[project]/databases/+layout.svelte +++ b/src/routes/console/project-[project]/databases/+layout.svelte @@ -22,8 +22,8 @@ goto(`/console/project-${$project.$id}/databases/usage`); }, keys: ['g', 'u'], - disabled: $page.url.pathname.includes('usage'), - + disabled: + $page.url.pathname.includes('usage') || $page.url.pathname.includes('database-'), group: 'databases' } ]); diff --git a/src/routes/console/project-[project]/databases/database-[database]/+layout.svelte b/src/routes/console/project-[project]/databases/database-[database]/+layout.svelte index 0663ea0f6..6ac88a4f8 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/+layout.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/+layout.svelte @@ -6,6 +6,14 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { Dependencies } from '$lib/constants'; + import { + addSubPanel, + registerCommands, + registerSearchers, + updateCommandGroupRanks + } from '$lib/commandCenter'; + import { collectionsSearcher } from '$lib/commandCenter/searchers'; + import { CollectionsPanel } from '$lib/commandCenter/panels'; const project = $page.params.project; const databaseId = $page.params.database; @@ -17,6 +25,67 @@ `${base}/console/project-${project}/databases/database-${databaseId}/collection-${event.detail.$id}` ); } + + $: $registerCommands([ + { + label: 'Find Collections', + callback() { + addSubPanel(CollectionsPanel); + }, + keys: ['f', 'c'], + group: 'collections', + icon: 'search' + }, + { + label: 'Create Collection', + callback() { + $showCreate = true; + if (!$page.url.pathname.endsWith(databaseId)) { + goto(`/console/project-${project}/databases/database-${databaseId}`); + } + }, + keys: $page.url.pathname.endsWith(databaseId) ? ['c'] : ['c', 'c'], + disabled: $page.url.pathname.includes('collection-'), + group: 'collections', + icon: 'plus' + }, + { + label: 'Go to collections', + callback() { + goto(`/console/project-${project}/databases/database-${databaseId}`); + }, + disabled: + $page.url.pathname.endsWith(databaseId) || + $page.url.pathname.includes('collection-'), + keys: ['g', 'c'], + group: 'collections' + }, + { + label: 'Go to usage', + callback() { + goto(`/console/project-${project}/databases/database-${databaseId}/usage`); + }, + disabled: + $page.url.pathname.includes('/usage') || $page.url.pathname.includes('collection-'), + keys: ['g', 'u'], + group: 'collections' + }, + { + label: 'Go to settings', + callback() { + goto(`/console/project-${project}/databases/database-${databaseId}/settings`); + }, + disabled: + $page.url.pathname.includes('/settings') || + $page.url.pathname.includes('collection-'), + keys: ['g', 's'], + group: 'collections' + } + ]); + + $registerSearchers(collectionsSearcher); + + $: $updateCommandGroupRanks((p) => ({ ...p, collections: 10 })); diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte index e8c0d8ccc..024a9679e 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/+layout.svelte @@ -4,6 +4,7 @@ import { sdk } from '$lib/stores/sdk'; import { onDestroy, onMount } from 'svelte'; import { collection } from './store'; + import { registerCommands, updateCommandGroupRanks } from '$lib/commandCenter'; let unsubscribe: { (): void }; @@ -23,6 +24,25 @@ unsubscribe(); } }); + + $: $registerCommands([ + { + label: 'Create Attribute', + keys: ['c', 'a'], + callback() { + // no-op + }, + icon: 'plus', + group: 'attributes' + } + ]); + + $updateCommandGroupRanks((p) => ({ + ...p, + attributes: 1000, + documents: 900, + collections: 800 + }));