diff --git a/src/lib/flags.ts b/src/lib/flags.ts index 288091e79..b7f92c948 100644 --- a/src/lib/flags.ts +++ b/src/lib/flags.ts @@ -5,7 +5,6 @@ import type { Models } from '@appwrite.io/console'; // Parse feature flags from env as a string array (exact match only) const flagsRaw = (env.PUBLIC_CONSOLE_FEATURE_FLAGS ?? '').split(','); -// @ts-expect-error: unused method! function isFlagEnabled(name: string) { // loose generic to allow safe access while retaining type safety return (data: T) => { @@ -19,4 +18,6 @@ function isFlagEnabled(name: string) { }; } -export const flags = {}; +export const flags = { + multiDb: isFlagEnabled('multi-db') +}; diff --git a/src/routes/(console)/project-[region]-[project]/databases/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/+page.svelte index ffcb6b5ec..6b416106f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/+page.svelte @@ -1,10 +1,12 @@ + + + + + {#if !showCustomId} +
+ { + showCustomId = true; + }}> Database ID +
+ {/if} + + + + {#if isCloud} + {#if !$currentPlan?.backupsEnabled} + + Upgrade your plan to ensure your data stays safe and backed up. + + + + + {:else} + + {/if} + {/if} + + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/create/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/create/+page.svelte index 81b59b07e..2e27083e2 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/create/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/create/+page.svelte @@ -24,6 +24,9 @@ import type { PageProps } from './$types'; import { createDatabaseStore } from './store'; import { isTabletViewport } from '$lib/stores/viewport'; + import { flags } from '$lib/flags'; + import { user } from '$lib/stores/user'; + import { organization } from '$lib/stores/organization'; const { data }: PageProps = $props(); @@ -42,30 +45,36 @@ const isDark = $derived($app.themeInUse === 'dark'); const backupsImg = $derived(isDark ? EmptyDarkMobile : EmptyLightMobile); + const isMultiDb = $derived(flags.multiDb({ account: $user, organization: $organization })); + const databaseTypes: Array<{ type: DatabaseType; title: string; subtitle: string; - }> = [ + }> = $derived([ { - type: 'tablesdb', + type: 'tablesdb' as DatabaseType, title: 'TablesDB', subtitle: 'Structure your data in rows and columns. Best for relational data and advanced querying.' }, - { - type: 'documentsdb', - title: 'DocumentsDB', - subtitle: - 'Store flexible data without a fixed schema. Best for unstructured data and simple querying.' - }, - { - type: 'vectorsdb', - title: 'VectorsDB', - subtitle: - 'Store data as vectors to find similar results. Best for semantic search and recommendations.' - } - ]; + ...(isMultiDb + ? [ + { + type: 'documentsdb' as DatabaseType, + title: 'DocumentsDB', + subtitle: + 'Store flexible data without a fixed schema. Best for unstructured data and simple querying.' + }, + { + type: 'vectorsdb' as DatabaseType, + title: 'VectorsDB', + subtitle: + 'Store data as vectors to find similar results. Best for semantic search and recommendations.' + } + ] + : []) + ]); afterNavigate(({ from }) => (previousPage = from?.url?.pathname || previousPage)); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte index d2a3c98b9..bac7d84d6 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/indexes/createIndex.svelte @@ -132,10 +132,13 @@ } }); - // HNSW indexes: auto-fill embeddings, single field only + // HNSW indexes: auto-fill embeddings, single field only. + // When switching away to Key/Unique, reset stale `order: null` left over from HNSW. $effect(() => { if (isHnswType) { fieldList = [{ value: 'embeddings', order: null, length: null }]; + } else if (!isObjectType && fieldList.some((f) => f.order === null)) { + fieldList = [{ value: '', order: OrderBy.Asc, length: null }]; } }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/empty.svelte b/src/routes/(console)/project-[region]-[project]/databases/empty.svelte index 85a01d15b..eb4a25375 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/empty.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/empty.svelte @@ -19,6 +19,9 @@ import { isSmallViewport } from '$lib/stores/viewport'; import type { DatabaseType } from '$database/(entity)'; + import { flags } from '$lib/flags'; + import { user } from '$lib/stores/user'; + import { organization } from '$lib/stores/organization'; const { disabled, @@ -62,23 +65,25 @@ image: tablesDbImage })} - - {@render databaseTypeCard({ - type: 'documentsdb', - title: 'DocumentsDB', - subtitle: - 'Store flexible data without a fixed schema. Best for unstructured data and simple querying.', - image: documentsDbImage - })} + {#if flags.multiDb({ account: $user, organization: $organization })} + + {@render databaseTypeCard({ + type: 'documentsdb', + title: 'DocumentsDB', + subtitle: + 'Store flexible data without a fixed schema. Best for unstructured data and simple querying.', + image: documentsDbImage + })} - - {@render databaseTypeCard({ - type: 'vectorsdb', - title: 'VectorsDB', - subtitle: - 'Store data as vectors to find similar results. Best for semantic search and recommendations.', - image: vectorsDbImage - })} + + {@render databaseTypeCard({ + type: 'vectorsdb', + title: 'VectorsDB', + subtitle: + 'Store data as vectors to find similar results. Best for semantic search and recommendations.', + image: vectorsDbImage + })} + {/if} {/snippet}