From f6f2d943901bee98871723c1327f7fa3384781fe Mon Sep 17 00:00:00 2001 From: Darshan Date: Sun, 28 Sep 2025 17:16:40 +0530 Subject: [PATCH 01/48] feat: multi-terminology support [wip]. --- src/lib/actions/analytics.ts | 22 ++-- src/lib/helpers/string.ts | 37 +++++++ src/lib/stores/navigation.ts | 21 ++++ src/lib/stores/sdk.ts | 4 +- .../security/updateSessionInvalidation.svelte | 4 +- .../(entity)/helpers/analytics.ts | 51 +++++++++ .../(entity)/helpers/dependencies.ts | 24 +++++ .../(entity)/helpers/index.ts | 4 + .../(entity)/helpers/terminology.ts | 67 ++++++++++++ .../(entity)/helpers/types.ts | 66 ++++++++++++ .../database-[database]/(entity)/index.ts | 4 + .../(entity)/settings/danger.svelte | 100 ++++++++++++++++++ .../(entity)/settings/index.ts | 5 + .../(entity)/settings/name.svelte | 65 ++++++++++++ .../(entity)/settings/permissions.svelte | 77 ++++++++++++++ .../(entity)/settings/security.svelte | 79 ++++++++++++++ .../(entity)/settings/status.svelte | 67 ++++++++++++ .../(entity)/usage/view.svelte | 37 +++++++ .../(entity)/view/container.svelte | 24 +++++ .../table-[table]/settings/+page.svelte | 59 +++++++++-- .../table-[table]/settings/dangerZone.svelte | 34 ------ .../table-[table]/settings/deleteTable.svelte | 61 ----------- .../table-[table]/settings/updateName.svelte | 68 ------------ .../settings/updatePermissions.svelte | 72 ------------- .../settings/updateSecurity.svelte | 66 ------------ .../settings/updateStatus.svelte | 66 ------------ .../table-[table]/spreadsheet.svelte | 4 +- .../usage/[[period]]/+page.svelte | 25 ++--- svelte.config.js | 4 +- 29 files changed, 806 insertions(+), 411 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/analytics.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/dependencies.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/danger.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/index.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/name.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/permissions.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/security.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/status.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/usage/view.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/view/container.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/dangerZone.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/deleteTable.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateName.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updatePermissions.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateSecurity.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateStatus.svelte diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index b511e59c8d..985ea5a126 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -148,11 +148,14 @@ export enum Click { ConnectRepositoryClick = 'click_connect_repository', CreditsRedeemClick = 'click_credits_redeem', CloudSignupClick = 'click_cloud_signup', + DatabaseColumnDelete = 'click_column_delete', DatabaseIndexDelete = 'click_index_delete', DatabaseTableDelete = 'click_table_delete', + DatabaseRowDelete = 'click_row_delete', DatabaseDatabaseDelete = 'click_database_delete', DatabaseImportCsv = 'click_database_import_csv', + DomainCreateClick = 'click_domain_create', DomainDeleteClick = 'click_domain_delete', DomainRetryDomainVerificationClick = 'click_domain_retry_domain_verification', @@ -265,7 +268,7 @@ export enum Submit { AuthSessionAlertsUpdate = 'submit_auth_session_alerts_update', AuthMembershipPrivacyUpdate = 'submit_auth_membership_privacy_update', AuthMockNumbersUpdate = 'submit_auth_mock_numbers_update', - AuthInvalidateSesssion = 'submit_auth_invalidate_session', + AuthInvalidateSession = 'submit_auth_invalidate_session', SessionsLengthUpdate = 'submit_sessions_length_update', SessionsLimitUpdate = 'submit_sessions_limit_update', SessionDelete = 'submit_session_delete', @@ -284,15 +287,18 @@ export enum Submit { RowDelete = 'submit_row_delete', RowUpdate = 'submit_row_update', RowUpdatePermissions = 'submit_row_update_permissions', + IndexCreate = 'submit_index_create', IndexDelete = 'submit_index_delete', - TableCreate = 'submit_row_create', - TableDelete = 'submit_row_delete', - TableUpdateName = 'submit_row_update_name', - TableUpdatePermissions = 'submit_row_update_permissions', - TableUpdateSecurity = 'submit_row_update_security', - TableUpdateEnabled = 'submit_row_update_enabled', - TableUpdateDisplayNames = 'submit_row_update_display_names', + + TableCreate = 'submit_table_create', + TableDelete = 'submit_table_delete', + TableUpdateName = 'submit_table_update_name', + TableUpdatePermissions = 'submit_table_update_permissions', + TableUpdateSecurity = 'submit_table_update_security', + TableUpdateEnabled = 'submit_table_update_enabled', + TableUpdateDisplayNames = 'submit_table_update_display_names', + FunctionCreate = 'submit_function_create', FunctionDelete = 'submit_function_delete', FunctionUpdateName = 'submit_function_update_name', diff --git a/src/lib/helpers/string.ts b/src/lib/helpers/string.ts index 91dd9a37cb..9f9151435b 100644 --- a/src/lib/helpers/string.ts +++ b/src/lib/helpers/string.ts @@ -21,6 +21,43 @@ export function singular(str: string): string { return str.replace(/s$/, ''); } +/** + * Given a string, returns the plural version of it. + * + * Handles common English pluralization rules: + * - Words ending in consonant + y → ies + * - Words ending in vowel + y → s + * - Words ending in sibilants (s, sh, ch, x, z) → es + * - Regular words → s + * + * @export + * @param {string} str + * @returns {string} + */ +export function plural(str: string): string { + if (!str) return str; + + const lower = str.toLowerCase(); + + // Words ending in sibilants: s, sh, ch, x, z + if (/[sxz]$/.test(lower) || /[cs]h$/.test(lower)) { + return str + 'es'; + } + + // Words ending in consonant + y → ies + // Words ending in vowel + y → s + if (str.endsWith('y')) { + const beforeY = str.slice(-2, -1).toLowerCase(); + if (beforeY && !['a', 'e', 'i', 'o', 'u'].includes(beforeY)) { + return str.slice(0, -1) + 'ies'; + } + return str + 's'; + } + + // Default: add 's' + return str + 's'; +} + /** * Convert a dash/underscore/space separated string to camelCase. * diff --git a/src/lib/stores/navigation.ts b/src/lib/stores/navigation.ts index f35211058d..fc598a6724 100644 --- a/src/lib/stores/navigation.ts +++ b/src/lib/stores/navigation.ts @@ -1,3 +1,24 @@ +import { resolve } from '$app/paths'; +import { goto } from '$app/navigation'; import { writable } from 'svelte/store'; +import type { Pathname, RouteId, RouteParams } from '$app/types'; export const navigationCancelled = writable(false); + +// taken directly from svelte's source! +type ResolveArgs = T extends RouteId + ? RouteParams extends Record + ? [route: T] + : [route: T, params: RouteParams] + : [route: T]; + +export function navigate( + route: T, + params?: Record +): Promise { + // type cast is necessary here! + const resolveArgs = params ? ([route, params] as [T, RouteParams]) : [route]; + const resolvedPathname = resolve(...(resolveArgs as ResolveArgs)); + + return goto(resolvedPathname); +} diff --git a/src/lib/stores/sdk.ts b/src/lib/stores/sdk.ts index 2ae897822e..a6556da10a 100644 --- a/src/lib/stores/sdk.ts +++ b/src/lib/stores/sdk.ts @@ -21,7 +21,8 @@ import { Sites, Tokens, TablesDB, - Domains + Domains, + Databases // DocumentsDB later } from '@appwrite.io/console'; import { Billing } from '../sdk/billing'; import { Backups } from '../sdk/backups'; @@ -131,6 +132,7 @@ const sdkForProject = { migrations: new Migrations(clientProject), sites: new Sites(clientProject), tablesDB: new TablesDB(clientProject), + documentsDB: new Databases(clientProject), // documentsDB later console: new Console(clientProject) // for suggestions API }; diff --git a/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionInvalidation.svelte b/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionInvalidation.svelte index c2c449e3eb..ab79a35c29 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionInvalidation.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/security/updateSessionInvalidation.svelte @@ -22,13 +22,13 @@ type: 'success', message: 'Updated session invalidation check.' }); - trackEvent(Submit.AuthInvalidateSesssion); + trackEvent(Submit.AuthInvalidateSession); } catch (error) { addNotification({ type: 'error', message: error.message }); - trackError(error, Submit.AuthInvalidateSesssion); + trackError(error, Submit.AuthInvalidateSession); } } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/analytics.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/analytics.ts new file mode 100644 index 0000000000..3e735015fa --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/analytics.ts @@ -0,0 +1,51 @@ +import type { Page } from '@sveltejs/kit'; +import { page as pageState } from '$app/state'; + +import { useTerminology } from './terminology'; +import { Submit, Click } from '$lib/actions/analytics'; +import type { AnalyticsResult, TerminologyResult, TerminologyShape } from './types'; + +export function useAnalytics(pageOrTerms: Page | TerminologyResult = pageState): AnalyticsResult { + const terminology = 'source' in pageOrTerms ? pageOrTerms : useTerminology(pageOrTerms); + + const createSubmitHandler = (termType: keyof TerminologyShape) => { + return (action: TAction) => { + const term = terminology.source[termType]; + if (!term) { + throw new Error(`No ${termType} terminology found`); + } + const enumKey = `${term.title.singular}${action}`; + return Submit[enumKey as keyof typeof Submit]; + }; + }; + + const createClickHandler = (termType: keyof TerminologyShape) => { + return (action: TAction) => { + const term = terminology.source[termType]; + if (!term) { + throw new Error(`No ${termType} terminology found`); + } + const enumKey = `Database${term.title.singular}${action}`; + return Click[enumKey as keyof typeof Click]; + }; + }; + + const result: AnalyticsResult = { submit: {}, click: {} }; + + if (terminology.entity) { + result.click.entity = createClickHandler('entity'); + result.submit.entity = createSubmitHandler('entity'); + } + + if (terminology.field) { + result.click.field = createClickHandler('field'); + result.submit.field = createSubmitHandler('field'); + } + + if (terminology.record) { + result.click.record = createClickHandler('record'); + result.submit.record = createSubmitHandler('record'); + } + + return result; +} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/dependencies.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/dependencies.ts new file mode 100644 index 0000000000..adc27f5935 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/dependencies.ts @@ -0,0 +1,24 @@ +import type { Page } from '@sveltejs/kit'; +import { page as pageState } from '$app/state'; + +import { useTerminology } from './terminology'; +import { Dependencies } from '$lib/constants'; +import type { DependenciesResult, Term, TerminologyResult } from './types'; + +export function useDependencies( + pageOrTerms: Page | TerminologyResult = pageState +): DependenciesResult { + // source is in `TerminologyResult`. + const terminology = 'source' in pageOrTerms ? pageOrTerms : useTerminology(pageOrTerms); + + const getDependencies = (term: { title: Term }) => ({ + singular: Dependencies[term.title.singular.toUpperCase() as keyof typeof Dependencies], + plural: Dependencies[term.title.plural.toUpperCase() as keyof typeof Dependencies] + }); + + return { + entity: terminology.entity ? getDependencies(terminology.entity) : undefined, + field: terminology.field ? getDependencies(terminology.field) : undefined, + record: terminology.record ? getDependencies(terminology.record) : undefined + }; +} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts new file mode 100644 index 0000000000..704e7eed5e --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts @@ -0,0 +1,4 @@ +export * from './types'; +export * from './analytics'; +export * from './terminology'; +export * from './dependencies'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts new file mode 100644 index 0000000000..77c4975278 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts @@ -0,0 +1,67 @@ +import type { Page } from '@sveltejs/kit'; +import { page as pageStage } from '$app/state'; + +import { type Models } from '@appwrite.io/console'; +import { capitalize, plural } from '$lib/helpers/string'; +import type { Columns } from '$database/table-[table]/store'; +import type { Term, TerminologyResult, TerminologyShape } from '$database/(entity)/helpers/types'; + +export type DatabaseType = 'legacy' | 'tablesdb' | 'documentsdb' | 'vectordb'; +export type Entity = Partial; +export type Field = Partial; + +export const baseTerminology = { + tablesdb: { + entity: 'table', + field: 'column', + record: 'row' + }, + documentsdb: { + entity: 'collection', + record: 'document' + }, + legacy: { + entity: 'collection', + field: 'attribute', + record: 'document' + }, + vectordb: {} +} as const; + +const createTerm = (singular: string, pluralForm: string): Term => { + return { singular, plural: pluralForm }; +}; + +// transforms a base into lower/title variants +const createTermVariants = (baseTerm: string) => ({ + lower: createTerm(baseTerm, plural(baseTerm)), + title: createTerm(capitalize(baseTerm), plural(capitalize(baseTerm))) +}); + +// transforms terminology for a database type +const transformDatabaseTerms = (terms: Partial) => + Object.fromEntries( + Object.entries(terms).map(([key, term]) => [ + key, + term ? createTermVariants(term) : undefined + ]) + ); + +// build the terminology data +const terminologyData = Object.fromEntries( + Object.entries(baseTerminology).map(([dbType, terms]) => [ + dbType, + transformDatabaseTerms(terms) + ]) +); + +export function useTerminology(page: Page = pageStage): TerminologyResult { + const type = page.data?.database?.type as DatabaseType; + const dbTerminologies = terminologyData[type] || {}; + return { + source: dbTerminologies, + field: dbTerminologies.field, + record: dbTerminologies.record, + entity: dbTerminologies.entity + }; +} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts new file mode 100644 index 0000000000..309c076e1e --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts @@ -0,0 +1,66 @@ +import { Click, Submit } from '$lib/actions/analytics'; +import type { baseTerminology } from './terminology'; +import { Dependencies } from '$lib/constants'; + +export type TerminologyShape = { + entity: string; + field?: string; + record?: string; +}; + +export type Term = { singular: string; plural: string }; + +export type TerminologyResult = { + source: { + entity?: { lower: Term; title: Term }; + field?: { lower: Term; title: Term }; + record?: { lower: Term; title: Term }; + }; + entity: { lower: Term; title: Term }; + field?: { lower: Term; title: Term }; + record?: { lower: Term; title: Term }; +}; + +// for derived analytics! +type ExtractActionsForPrefix = { + [K in keyof typeof Submit]: K extends `${TPrefix}${infer Action}` ? Action : never; +}[keyof typeof Submit]; + +type ExtractClickActionsForPrefix = { + [K in keyof typeof Click]: K extends `Database${TPrefix}${infer Action}` ? Action : never; +}[keyof typeof Click]; + +type TermValuesForKey = { + [K in keyof typeof baseTerminology]: TKey extends keyof (typeof baseTerminology)[K] + ? (typeof baseTerminology)[K][TKey] + : never; +}[keyof typeof baseTerminology]; + +type SubmitActionsFor = ExtractActionsForPrefix< + Capitalize> +>; + +type ClickActionsFor = ExtractClickActionsForPrefix< + Capitalize> +>; + +export type AnalyticsResult = { + submit: { + entity?: (action: SubmitActionsFor<'entity'>) => Submit; + field?: (action: SubmitActionsFor<'field'>) => Submit; + record?: (action: SubmitActionsFor<'record'>) => Submit; + }; + click: { + entity?: (action: ClickActionsFor<'entity'>) => Click; + field?: (action: ClickActionsFor<'field'>) => Click; + record?: (action: ClickActionsFor<'record'>) => Click; + }; +}; + +// for derived dependencies! +export type DependenciesResult = { + [K in keyof Omit]: { + singular: Dependencies; + plural: Dependencies; + }; +}; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts new file mode 100644 index 0000000000..a2ff12e5b6 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -0,0 +1,4 @@ +export * from './helpers'; +export * from './settings'; +export { default as Usage } from './usage/view.svelte'; +export { default as EntityContainer } from './view/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/danger.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/danger.svelte new file mode 100644 index 0000000000..308c0b31d4 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/danger.svelte @@ -0,0 +1,100 @@ + + + + {#snippet children(analytics, dependencies, terminology)} + {@const type = terminology.entity.lower.singular} + {@const records = terminology.record.lower.plural} + + Delete {type} + The {type} will be permanently deleted, including all the {records} within it. This action + is irreversible. + + + +
{entity.name}
+
+

Last updated: {toLocaleDateTime(entity.$updatedAt)}

+
+
+ + + + +
+ + {#if show} + await deleteEntity(analytics, dependencies)} + title="Delete {type}" + bind:open={show} + bind:error> + + Are you sure you want to delete {entity.name}? + + + {/if} + {/snippet} +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/index.ts new file mode 100644 index 0000000000..24fe556518 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/index.ts @@ -0,0 +1,5 @@ +export { default as DangerZone } from './danger.svelte'; +export { default as UpdateName } from './name.svelte'; +export { default as UpdatePermissions } from './permissions.svelte'; +export { default as UpdateSecurity } from './security.svelte'; +export { default as UpdateStatus } from './status.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/name.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/name.svelte new file mode 100644 index 0000000000..df7ce1b32f --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/name.svelte @@ -0,0 +1,65 @@ + + + + {#snippet children(analytics, dependencies)} +
updateName(analytics, dependencies)}> + + Name + + + + + + + + +
+ {/snippet} +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/permissions.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/permissions.svelte new file mode 100644 index 0000000000..0617fe25aa --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/permissions.svelte @@ -0,0 +1,77 @@ + + + + {#snippet children(analytics, dependencies, { entity, record })} + {@const type = entity.lower.plural} + {@const records = record.lower.plural} + + Permissions + Choose who can access your {type} and {records}. + Learn more + . + + {#if entityPermissions} + + {/if} + + + + + + {/snippet} + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/security.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/security.svelte new file mode 100644 index 0000000000..fa96438d0e --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/security.svelte @@ -0,0 +1,79 @@ + + + + {#snippet children(analytics, dependencies, terminology)} + {@const title = terminology.record.title.singular} + {@const recordLower = terminology.record.lower.singular} + {@const recordsLower = terminology.record.lower.plural} + {@const entityLower = terminology.entity.lower.singular} + + + {title} security + + + +

+ When {recordLower} security is enabled, users will be able to access {recordsLower} + for which they have been granted + either {recordLower} or {entityLower} permissions. +

+

+ If {recordLower} security is disabled, users can access rows + only if they have {entityLower} permissions. Row permissions will be + ignored. +

+
+ + + +
+ {/snippet} +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/status.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/status.svelte new file mode 100644 index 0000000000..b04ffee116 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/status.svelte @@ -0,0 +1,67 @@ + + + + {#snippet children(analytics, dependencies)} + + {entity.name} + +
    + +
+
+

Created: {toLocaleDateTime(entity.$createdAt)}

+

Last updated: {toLocaleDateTime(entity.$updatedAt)}

+
+
+ + + + +
+ {/snippet} +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/usage/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/usage/view.svelte new file mode 100644 index 0000000000..0e74733366 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/usage/view.svelte @@ -0,0 +1,37 @@ + + + + {#snippet children(_, __, terminology)} + {@const records = terminology.record.lower.plural} + {@const entity = terminology.entity.lower.singular} +
+ + + + +
+ {/snippet} +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/view/container.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/view/container.svelte new file mode 100644 index 0000000000..fc5852dad0 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/view/container.svelte @@ -0,0 +1,24 @@ + + +{@render children(analytics, dependencies, terminology)} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte index 20abb285b4..ead1b079c4 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte @@ -1,23 +1,60 @@
{#if $table} - - + updateTable({ enabled })} /> + + updateTable({ name })} /> + - - - + + updateTable({ permissions })} /> + + updateTable({ rowSecurity })} /> + + {/if}
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/dangerZone.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/dangerZone.svelte deleted file mode 100644 index fa75976966..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/dangerZone.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - - - Delete table - The table will be permanently deleted, including all the rows within it. This action is irreversible. - - - -
{$table.name}
-
-

Last updated: {toLocaleDateTime($table.$updatedAt)}

-
-
- - - - -
- - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/deleteTable.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/deleteTable.svelte deleted file mode 100644 index 697dd79622..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/deleteTable.svelte +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Are you sure you want to delete {$table.name}? - - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateName.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateName.svelte deleted file mode 100644 index 45ad32ed0d..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateName.svelte +++ /dev/null @@ -1,68 +0,0 @@ - - -
- - Name - - - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updatePermissions.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updatePermissions.svelte deleted file mode 100644 index 8041cb2c2f..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updatePermissions.svelte +++ /dev/null @@ -1,72 +0,0 @@ - - - - Permissions - Choose who can access your tables and rows. - Learn more - . - - {#if tablePermissions} - - {/if} - - - - - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateSecurity.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateSecurity.svelte deleted file mode 100644 index 1b92ad0596..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateSecurity.svelte +++ /dev/null @@ -1,66 +0,0 @@ - - - - Row security - - - -

- When row security is enabled, users will be able to access rows for which they have been - granted either row or table permissions. -

-

- If row security is disabled, users can access rows only if they have table permissions. Row permissions will be ignored. -

-
- - - -
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateStatus.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateStatus.svelte deleted file mode 100644 index 8d91f266e7..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/updateStatus.svelte +++ /dev/null @@ -1,66 +0,0 @@ - - - - {$table.name} - -
    - -
-
-

Created: {toLocaleDateTime($table.$createdAt)}

-

Last updated: {toLocaleDateTime($table.$updatedAt)}

-
-
- - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index ee2b81bb49..9fea5d2a6f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -1,7 +1,7 @@ -
- - - -
+ diff --git a/svelte.config.js b/svelte.config.js index 18b6687901..831de20405 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -19,7 +19,9 @@ const config = { kit: { alias: { $routes: './src/routes', - $themes: './src/themes' + $themes: './src/themes', + $database: + './src/routes/(console)/project-[region]-[project]/databases/database-[database]' }, adapter: adapter({ fallback: 'index.html', From 3fae9d611c414593162ad1490f839a68b7148e8a Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 29 Sep 2025 12:57:49 +0530 Subject: [PATCH 02/48] update: restructure dirs. --- .../databases/database-[database]/(entity)/index.ts | 6 +++--- .../(entity)/{view => views}/container.svelte | 0 .../(entity)/{ => views}/settings/danger.svelte | 0 .../(entity)/{ => views}/settings/index.ts | 0 .../(entity)/{ => views}/settings/name.svelte | 0 .../(entity)/{ => views}/settings/permissions.svelte | 0 .../(entity)/{ => views}/settings/security.svelte | 0 .../(entity)/{ => views}/settings/status.svelte | 0 .../(entity)/{ => views}/usage/view.svelte | 0 9 files changed, 3 insertions(+), 3 deletions(-) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{view => views}/container.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/settings/danger.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/settings/index.ts (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/settings/name.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/settings/permissions.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/settings/security.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/settings/status.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/{ => views}/usage/view.svelte (100%) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index a2ff12e5b6..a7558f5593 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -1,4 +1,4 @@ export * from './helpers'; -export * from './settings'; -export { default as Usage } from './usage/view.svelte'; -export { default as EntityContainer } from './view/container.svelte'; +export * from './views/settings'; +export { default as Usage } from './views/usage/view.svelte'; +export { default as EntityContainer } from './views/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/view/container.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/container.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/view/container.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/container.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/danger.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/danger.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/danger.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/danger.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/index.ts similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/index.ts rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/index.ts diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/name.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/name.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/name.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/name.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/permissions.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/permissions.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/permissions.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/permissions.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/security.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/security.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/security.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/security.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/status.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/status.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/settings/status.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/settings/status.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/usage/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/usage/view.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/usage/view.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/usage/view.svelte From bc16dea7b063ba0ee9f39b47fb6058c2e87b687e Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 29 Sep 2025 19:49:48 +0530 Subject: [PATCH 03/48] update: abstracted indexes for base views. --- src/lib/stores/navigation.ts | 16 +- .../(entity)/helpers/terminology.ts | 1 + .../database-[database]/(entity)/index.ts | 1 + .../(entity)/views/(layouts)/index.ts | 2 + .../(entity)/views/(layouts)/sidesheet.svelte | 174 ++++++++++ .../views/(layouts)/spreadsheet.svelte | 123 +++++++ .../(entity)/views/(layouts)/store.ts | 5 + .../(entity)/views/failedModal.svelte | 34 ++ .../views/indexes/create.svelte} | 148 ++++---- .../views/indexes/delete.svelte} | 56 +-- .../(entity)/views/indexes/index.ts | 2 + .../views/indexes/overview.svelte} | 8 +- .../views}/indexes/select.svelte | 2 + .../(entity)/views/indexes/view.svelte | 308 +++++++++++++++++ .../table-[table]/+layout.svelte | 34 +- .../table-[table]/columns/+page.svelte | 2 +- .../table-[table]/indexes/+page.svelte | 326 +++--------------- .../table-[table]/settings/+page.svelte | 5 +- 18 files changed, 875 insertions(+), 372 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/index.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/sidesheet.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/spreadsheet.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/store.ts create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/{table-[table]/indexes/createIndex.svelte => (entity)/views/indexes/create.svelte} (60%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/{table-[table]/indexes/deleteIndex.svelte => (entity)/views/indexes/delete.svelte} (58%) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/index.ts rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/{table-[table]/indexes/overviewIndex.svelte => (entity)/views/indexes/overview.svelte} (82%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/{table-[table] => (entity)/views}/indexes/select.svelte (96%) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte diff --git a/src/lib/stores/navigation.ts b/src/lib/stores/navigation.ts index fc598a6724..598bcdb855 100644 --- a/src/lib/stores/navigation.ts +++ b/src/lib/stores/navigation.ts @@ -12,13 +12,21 @@ type ResolveArgs = T extends RouteId : [route: T, params: RouteParams] : [route: T]; +export function withPath(base: string, ...parts: string[]) { + return [base.replace(/\/+$/, ''), ...parts].join('/'); +} + +export function resolveRoute(route: T, params?: Record) { + // type cast is necessary here! + const resolveArgs = params ? ([route, params] as [T, RouteParams]) : [route]; + + return resolve(...(resolveArgs as ResolveArgs)); +} + export function navigate( route: T, params?: Record ): Promise { // type cast is necessary here! - const resolveArgs = params ? ([route, params] as [T, RouteParams]) : [route]; - const resolvedPathname = resolve(...(resolveArgs as ResolveArgs)); - - return goto(resolvedPathname); + return goto(resolveRoute(route, params)); } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts index 77c4975278..00f289cddc 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts @@ -9,6 +9,7 @@ import type { Term, TerminologyResult, TerminologyShape } from '$database/(entit export type DatabaseType = 'legacy' | 'tablesdb' | 'documentsdb' | 'vectordb'; export type Entity = Partial; export type Field = Partial; +export type Index = Partial; export const baseTerminology = { tablesdb: { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index a7558f5593..ec2d76f1d3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -1,4 +1,5 @@ export * from './helpers'; +export * from './views/indexes'; export * from './views/settings'; export { default as Usage } from './views/usage/view.svelte'; export { default as EntityContainer } from './views/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/index.ts new file mode 100644 index 0000000000..432635bffe --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/index.ts @@ -0,0 +1,2 @@ +export { default as SideSheet } from './sidesheet.svelte'; +export { default as SpreadsheetContainer } from './spreadsheet.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/sidesheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/sidesheet.svelte new file mode 100644 index 0000000000..68b981d3af --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/sidesheet.svelte @@ -0,0 +1,174 @@ + + +
+ +
+ + + {title} + {#if titleBadge} + + {/if} + + {#if topAction && topAction.text && topAction.show} + {#if topAction.mode === 'copy-tag'} + + + {topAction.text} + + + {:else} + + {/if} + {/if} + + +
+ + +
{ + try { + const keepOpen = await submit?.onClick?.(); + if (!keepOpen) { + show = false; + } + } catch (error) { + // error occurred, dont close the sidebar + } + }}> + + {@render children?.()} + +
+ + {#if submit} + + {/if} +
+
+
+ + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/spreadsheet.svelte new file mode 100644 index 0000000000..30483eb680 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/spreadsheet.svelte @@ -0,0 +1,123 @@ + + +
+ {@render children()} +
+ + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/store.ts new file mode 100644 index 0000000000..b1d1ca96f5 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/store.ts @@ -0,0 +1,5 @@ +import { writable } from 'svelte/store'; + +export const scrollStore = writable(null); + +export const sheetHeightStore = writable('74.5vh'); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte new file mode 100644 index 0000000000..e177e613eb --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte @@ -0,0 +1,34 @@ + + + + +
+

+ + + {header} +

+

{error}

+
+ + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/createIndex.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte similarity index 60% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/createIndex.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte index 85c5b518a5..931c04709d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/createIndex.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte @@ -1,5 +1,14 @@ + + @@ -183,10 +207,12 @@ bind:value={key} autofocus /> - + - {#each columnList as column, index} + {@const fieldType = terminology.field.title.singular} + {@const fieldTypeLower = terminology.field.lower.singular} + {#each fieldList as field, index} {@const direction = $isSmallViewport ? 'column' : 'row'} + id={`field-${index}`} + label={index === 0 ? fieldType : undefined} + placeholder="Select {fieldType}" + bind:value={field.value} /> {#if selectedType === IndexType.Key} @@ -220,7 +246,7 @@ id={`length-${index}`} label={index === 0 ? 'Length' : undefined} placeholder="Enter length" - bind:value={column.length} /> + bind:value={field.length} /> {/if} {#if $isSmallViewport} @@ -228,9 +254,9 @@ @@ -241,9 +267,9 @@ icon size="s" secondary - disabled={columnList.length <= 1} + disabled={fieldList.length <= 1} on:click={() => { - columnList = remove(columnList, index); + fieldList = remove(fieldList, index); }}> @@ -252,9 +278,9 @@ {/each}
-
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/deleteIndex.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte similarity index 58% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/deleteIndex.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte index 956bb1b6a7..3aabefa4db 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/deleteIndex.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte @@ -1,49 +1,57 @@ + {#if selectedIndex?.columns?.length} {#each selectedIndex.columns as column, i} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/select.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/select.svelte similarity index 96% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/select.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/select.svelte index e356097a5e..fb91f3a7ae 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/select.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/select.svelte @@ -3,6 +3,8 @@ import { Icon } from '@appwrite.io/pink-svelte'; import { IconChevronDown } from '@appwrite.io/pink-icons-svelte'; + // TODO: @itznotabug: svelte5 + export let value: string; export let id: string; export let label: string; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte new file mode 100644 index 0000000000..4a2873d125 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -0,0 +1,308 @@ + + + + {#snippet children(_, dependencies, terminology)} + + + {#if $canWriteTables} + + {/if} + + + +
+ {#if entity.columns?.length} + {#if entity.indexes.length} + + (showCreateIndex = true)}> + + Key + Type + Columns + + + Lengths + + + + {#each entity.indexes as index (index.key)} + + + + {index.key} + {#if index.status !== 'available'} + + {#if index.error} + { + e.preventDefault(); + error = index.error; + showFailed = true; + }}>Details + {/if} + {/if} + + + {index.type} + + {index.columns.join(', ')} + + + + + + {index.lengths} + + + + + + { + toggle(); + selectedIndex = index; + showOverview = true; + }}>Overview + +
+ +
+ + { + toggle(); + showDelete = true; + selectedIndex = index; + trackEvent(Click.DatabaseIndexDelete); + }}>Delete +
+
+
+
+ {/each} + + + + + {@const length = entity.indexes.length} + {length} + {length === 1 ? 'index' : 'indexes'} + + + +
+
+ {:else} + {@render emptyIndexesSheetView(() => (showCreateIndex = true))} + {/if} + {:else} + {@render emptyColumnsSheetView(() => (showCreateColumnSheet = true))} + {/if} + + {#if selectedIndexes.length > 0} +
+ + +
+ + + + {selectedIndexes.length > 1 ? 'indexes' : 'index'} + selected + + +
+
+ + + + +
+
+ {/if} +
+ + await createIndex.create() + }}> + + + + {#if selectedIndex} + + {:else if selectedIndexes && selectedIndexes.length} + + {/if} + + + + + + + {/snippet} +
+ + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index fcc995b71b..6c8a262c24 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -57,13 +57,15 @@ import { generateFakeRecords, generateColumns } from '$lib/helpers/faker'; import { addNotification } from '$lib/stores/notifications'; import { sleep } from '$lib/helpers/promises'; - import CreateIndex from './indexes/createIndex.svelte'; import { hash } from '$lib/helpers/string'; import { preferences } from '$lib/stores/preferences'; import { buildRowUrl, isRelationship } from './rows/store'; import { chunks } from '$lib/helpers/array'; import { Submit, trackEvent } from '$lib/actions/analytics'; + import { CreateIndex } from '$database/(entity)'; + import { EntityContainer } from '$database/(entity)/index.js'; + let editRow: EditRow; let editRelatedRow: EditRelatedRow; let editRowPermissions: EditRowPermissions; @@ -431,10 +433,32 @@ await createIndex.create(); } }}> - + + + + {#snippet children(_, dependencies, terminology)} + { + await sdk + .forProject(page.params.region, page.params.project) + .tablesDB.createIndex({ + databaseId: page.params.database, + tableId: page.params.table, + key: index.key, + type: index.type, + columns: index.fields, + lengths: index.lengths, + orders: index.orders + }); + }} /> + {/snippet} + {#if showFailed} - + {/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte index 53a4327e96..fe838a1faa 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte @@ -1,288 +1,68 @@ - - - {#if $canWriteTables} - - {/if} - - - -
- {#if data.table?.columns?.length} - {#if data.table.indexes.length} - - (showCreateIndex = true)}> - - Key - Type - Columns - - - Lengths - - - - {#each data.table.indexes as index} - - - - {index.key} - {#if index.status !== 'available'} - - {#if index.error} - { - e.preventDefault(); - error = index.error; - showFailed = true; - }}>Details - {/if} - {/if} - - - {index.type} - - {index.columns.join(', ')} - - - - - - {index.lengths} - - - - - - { - toggle(); - selectedIndex = index; - showOverview = true; - }}>Overview - -
- -
- - { - toggle(); - showDelete = true; - selectedIndex = index; - trackEvent(Click.DatabaseIndexDelete); - }}>Delete -
-
-
-
- {/each} + + {#snippet emptyIndexesSheetView(toggle)} + + {/snippet} - - - - {@const length = data.table.indexes.length} - {length} - {length === 1 ? 'index' : 'indexes'} - - - -
-
- {:else} - (showCreateIndex = true), - disabled: !$table?.columns?.length - } - }} /> - {/if} - {:else} + {#snippet emptyColumnsSheetView(toggle)} { - $showCreateColumnSheet.show = true; - } + onClick: toggle } }} /> - {/if} - - {#if selectedIndexes.length > 0} -
- - -
- - - - {selectedIndexes.length > 1 ? 'indexes' : 'index'} - selected - - -
-
- - - - -
-
- {/if} -
- - await createIndex.create() - }}> - - - -{#if selectedIndex} - -{:else if selectedIndexes && selectedIndexes.length} - -{/if} - - - - - - - - + {/snippet} + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte index ead1b079c4..90d4eb3c05 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte @@ -12,7 +12,6 @@ UpdateStatus } from '$database/(entity)'; - const tablesDB = sdk.forProject(page.params.region, page.params.project).tablesDB; const params = $derived.by(() => { return { name: $table.name, @@ -22,7 +21,7 @@ }); async function deleteTable() { - await tablesDB.deleteTable({ ...params }); + await sdk.forProject(page.params.region, page.params.project).tablesDB.deleteTable({ ...params }); } async function updateTable( @@ -33,7 +32,7 @@ rowSecurity: boolean; }> ) { - await tablesDB.updateTable({ ...params, ...updates }); + await sdk.forProject(page.params.region, page.params.project).tablesDB.updateTable({ ...params, ...updates }); } From cd5c781e5fc22ae7e8971c44b20dc8fca64357fa Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 29 Sep 2025 20:02:28 +0530 Subject: [PATCH 04/48] remove: duplicate components. --- .../(entity)/views/indexes/view.svelte | 10 +- .../(suggestions)/empty.svelte | 2 +- .../(suggestions)/options.svelte | 2 +- .../table-[table]/+layout.svelte | 2 +- .../table-[table]/columns/+page.svelte | 3 +- .../table-[table]/indexes/+page.svelte | 13 +- .../table-[table]/layout/emptySheet.svelte | 2 +- .../table-[table]/layout/sidesheet.svelte | 174 ------------------ .../table-[table]/layout/spreadsheet.svelte | 123 ------------- .../table-[table]/rows/create.svelte | 2 +- .../table-[table]/settings/+page.svelte | 8 +- .../table-[table]/spreadsheet.svelte | 2 +- 12 files changed, 22 insertions(+), 321 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/sidesheet.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/spreadsheet.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index 4a2873d125..1b06399dc9 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -25,7 +25,7 @@ IconPlus, IconTrash } from '@appwrite.io/pink-icons-svelte'; - import { type ComponentProps, onDestroy, type Snippet } from 'svelte'; + import { type ComponentProps, type Snippet } from 'svelte'; import { Click, trackEvent } from '$lib/actions/analytics'; import { isSmallViewport } from '$lib/stores/viewport'; import { type Entity, EntityContainer } from '$database/(entity)'; @@ -36,18 +36,16 @@ let { entity, - showCreateColumnSheet = $bindable(), onCreateIndex, onDeleteIndexes, emptyIndexesSheetView, emptyColumnsSheetView }: { entity: Entity; - showCreateColumnSheet: boolean; onCreateIndex: (index: CreateIndexesCallbackType) => Promise; onDeleteIndexes: (indexKeys: string[]) => Promise; emptyIndexesSheetView: Snippet<[() => void]>; - emptyColumnsSheetView?: Snippet<[() => void]>; + emptyColumnsSheetView?: Snippet; } = $props(); let showCreateIndex = $state(false); @@ -83,8 +81,6 @@ } } - onDestroy(() => (showCreateColumnSheet = false)); - const emptyCellsLimit = $derived($isSmallViewport ? 14 : 17); const emptyCellsCount = $derived( entity.indexes.length >= emptyCellsLimit ? 0 : emptyCellsLimit - entity.indexes.length @@ -237,7 +233,7 @@ {@render emptyIndexesSheetView(() => (showCreateIndex = true))} {/if} {:else} - {@render emptyColumnsSheetView(() => (showCreateColumnSheet = true))} + {@render emptyColumnsSheetView()} {/if} {#if selectedIndexes.length > 0} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte index 38ee34a9a0..2fce68c9dc 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte @@ -14,7 +14,7 @@ import { isSmallViewport, isTabletViewport } from '$lib/stores/viewport'; import type { Column } from '$lib/helpers/types'; import { expandTabs } from '../table-[table]/store'; - import SpreadsheetContainer from '../table-[table]/layout/spreadsheet.svelte'; + import { SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; import { onDestroy, onMount, tick } from 'svelte'; import { sdk } from '$lib/stores/sdk'; import { page } from '$app/state'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte index 9f6ca1691a..5f77a5b35a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte @@ -2,7 +2,7 @@ import type { Snippet } from 'svelte'; import { Popover } from '@appwrite.io/pink-svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import SideSheet from '../table-[table]/layout/sidesheet.svelte'; + import { SideSheet } from '$database/(entity)/views/(layouts)'; let { children, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index 6c8a262c24..5f475cc9eb 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -46,7 +46,7 @@ import { base } from '$app/paths'; import { canWriteTables } from '$lib/stores/roles'; import { IconEye, IconLockClosed, IconPlus, IconPuzzle } from '@appwrite.io/pink-icons-svelte'; - import SideSheet from './layout/sidesheet.svelte'; + import { SideSheet } from '$database/(entity)/views/(layouts)'; import EditRow from './rows/edit.svelte'; import EditRelatedRow from './rows/editRelated.svelte'; import EditColumn from './columns/edit.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index fc6e021ca4..1694c7f1c3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -45,8 +45,7 @@ import { Click, trackEvent } from '$lib/actions/analytics'; import CsvDisabled from '../csvDisabled.svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import SideSheet from '../layout/sidesheet.svelte'; - import SpreadsheetContainer from '../layout/spreadsheet.svelte'; + import { SideSheet, SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; import { showCreateColumnSheet } from '../store'; import { type Models } from '@appwrite.io/console'; import { preferences } from '$lib/stores/preferences'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte index fe838a1faa..c6a047835c 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/indexes/+page.svelte @@ -5,6 +5,7 @@ import EmptySheet from '../layout/emptySheet.svelte'; import { showCreateColumnSheet } from '$database/table-[table]/store'; import { type CreateIndexesCallbackType, Indexes } from '$database/(entity)'; + import { onDestroy } from 'svelte'; let { data }: PageProps = $props(); @@ -36,13 +37,11 @@ ) ); } + + onDestroy(() => ($showCreateColumnSheet.show = false)); - + {#snippet emptyIndexesSheetView(toggle)} {/snippet} - {#snippet emptyColumnsSheetView(toggle)} + {#snippet emptyColumnsSheetView()} ($showCreateColumnSheet.show = true) } }} /> {/snippet} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte index bdc92fb75f..440bebdc83 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte @@ -18,7 +18,7 @@ spreadsheetLoading, expandTabs } from '../store'; - import SpreadsheetContainer from './spreadsheet.svelte'; + import { SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; import { onDestroy, onMount } from 'svelte'; import { debounce } from '$lib/helpers/debounce'; import { columnOptions } from '../columns/store'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/sidesheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/sidesheet.svelte deleted file mode 100644 index 68b981d3af..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/sidesheet.svelte +++ /dev/null @@ -1,174 +0,0 @@ - - -
- -
- - - {title} - {#if titleBadge} - - {/if} - - {#if topAction && topAction.text && topAction.show} - {#if topAction.mode === 'copy-tag'} - - - {topAction.text} - - - {:else} - - {/if} - {/if} - - -
- - -
{ - try { - const keepOpen = await submit?.onClick?.(); - if (!keepOpen) { - show = false; - } - } catch (error) { - // error occurred, dont close the sidebar - } - }}> - - {@render children?.()} - -
- - {#if submit} - - {/if} -
-
-
- - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/spreadsheet.svelte deleted file mode 100644 index 185f2aec78..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/spreadsheet.svelte +++ /dev/null @@ -1,123 +0,0 @@ - - -
- {@render children()} -
- - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte index b1fa02ce48..c665fb50aa 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte @@ -10,7 +10,7 @@ import { type Columns, spreadsheetRenderKey } from '../store'; import { ID, type Models } from '@appwrite.io/console'; import { Alert, Layout, Typography, Selector } from '@appwrite.io/pink-svelte'; - import SideSheet from '../layout/sidesheet.svelte'; + import { SideSheet } from '$database/(entity)/views/(layouts)'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { tick } from 'svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte index 90d4eb3c05..fb37af442f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/settings/+page.svelte @@ -21,7 +21,9 @@ }); async function deleteTable() { - await sdk.forProject(page.params.region, page.params.project).tablesDB.deleteTable({ ...params }); + await sdk + .forProject(page.params.region, page.params.project) + .tablesDB.deleteTable({ ...params }); } async function updateTable( @@ -32,7 +34,9 @@ rowSecurity: boolean; }> ) { - await sdk.forProject(page.params.region, page.params.project).tablesDB.updateTable({ ...params, ...updates }); + await sdk + .forProject(page.params.region, page.params.project) + .tablesDB.updateTable({ ...params, ...updates }); } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index 9fea5d2a6f..3cbad674c0 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -83,7 +83,7 @@ import type { HeaderCellAction, RowCellAction } from './sheetOptions.svelte'; import SheetOptions from './sheetOptions.svelte'; import { isSmallViewport, isTabletViewport } from '$lib/stores/viewport'; - import SpreadsheetContainer from './layout/spreadsheet.svelte'; + import { SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; import EditRowCell from './rows/cell/edit.svelte'; import { copy } from '$lib/helpers/copy'; import { writable } from 'svelte/store'; From a3eb1c880cfc69d0b074cfc24f0fbafc5470c718 Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 30 Sep 2025 09:01:28 +0530 Subject: [PATCH 05/48] fix: import. --- .../databases/database-[database]/(suggestions)/indexes.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte index a4cb50b9ff..1744471367 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte @@ -9,7 +9,7 @@ type SuggestedIndexSchema } from './store'; import { Modal, Confirm } from '$lib/components'; - import SideSheet from '../table-[table]/layout/sidesheet.svelte'; + import { SideSheet } from '$database/(entity)/views/(layouts)'; import { isSmallViewport } from '$lib/stores/viewport'; import { IndexType, type Models } from '@appwrite.io/console'; import { capitalize } from '$lib/helpers/string'; From 5eca86ed3cf24d5c8068b52d5047c5a20ac8b9df Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 30 Sep 2025 09:03:55 +0530 Subject: [PATCH 06/48] update: imports and folder structure. --- .../databases/database-[database]/(entity)/index.ts | 1 + .../database-[database]/(entity)/views/indexes/view.svelte | 4 +--- .../(entity)/views/{(layouts) => layouts}/index.ts | 0 .../(entity)/views/{(layouts) => layouts}/sidesheet.svelte | 0 .../(entity)/views/{(layouts) => layouts}/spreadsheet.svelte | 0 .../(entity)/views/{(layouts) => layouts}/store.ts | 0 .../databases/database-[database]/(suggestions)/empty.svelte | 2 +- .../database-[database]/(suggestions)/indexes.svelte | 2 +- .../database-[database]/(suggestions)/options.svelte | 2 +- .../database-[database]/table-[table]/+layout.svelte | 2 +- .../database-[database]/table-[table]/columns/+page.svelte | 2 +- .../table-[table]/layout/emptySheet.svelte | 2 +- .../database-[database]/table-[table]/rows/create.svelte | 2 +- .../database-[database]/table-[table]/spreadsheet.svelte | 2 +- 14 files changed, 10 insertions(+), 11 deletions(-) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/{(layouts) => layouts}/index.ts (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/{(layouts) => layouts}/sidesheet.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/{(layouts) => layouts}/spreadsheet.svelte (100%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/{(layouts) => layouts}/store.ts (100%) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index ec2d76f1d3..15a4a899b5 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -1,5 +1,6 @@ export * from './helpers'; export * from './views/indexes'; +export * from './views/layouts'; export * from './views/settings'; export { default as Usage } from './views/usage/view.svelte'; export { default as EntityContainer } from './views/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index 1b06399dc9..294009ef67 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -28,9 +28,7 @@ import { type ComponentProps, type Snippet } from 'svelte'; import { Click, trackEvent } from '$lib/actions/analytics'; import { isSmallViewport } from '$lib/stores/viewport'; - import { type Entity, EntityContainer } from '$database/(entity)'; - import { SpreadsheetContainer, SideSheet } from '$database/(entity)/views/(layouts)'; - import type { CreateIndexesCallbackType } from '$database/(entity)/views/indexes/create.svelte'; + import { type Entity, type CreateIndexesCallbackType, EntityContainer, SpreadsheetContainer, SideSheet } from '$database/(entity)'; // TODO: change `column` to `entity`! diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/index.ts similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/index.ts rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/index.ts diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/sidesheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/sidesheet.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/sidesheet.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/sidesheet.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/spreadsheet.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/spreadsheet.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/spreadsheet.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/store.ts similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/(layouts)/store.ts rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/store.ts diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte index 4eb8288389..9e9b62958a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/empty.svelte @@ -14,7 +14,7 @@ import { isSmallViewport, isTabletViewport } from '$lib/stores/viewport'; import type { Column } from '$lib/helpers/types'; import { expandTabs } from '../table-[table]/store'; - import { SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; + import { SpreadsheetContainer } from '$database/(entity)'; import { onDestroy, onMount, tick } from 'svelte'; import { sdk } from '$lib/stores/sdk'; import { page } from '$app/state'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte index 1744471367..d12198e57d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/indexes.svelte @@ -9,7 +9,7 @@ type SuggestedIndexSchema } from './store'; import { Modal, Confirm } from '$lib/components'; - import { SideSheet } from '$database/(entity)/views/(layouts)'; + import { SideSheet } from '$database/(entity)'; import { isSmallViewport } from '$lib/stores/viewport'; import { IndexType, type Models } from '@appwrite.io/console'; import { capitalize } from '$lib/helpers/string'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte index 5f77a5b35a..34e2288472 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/options.svelte @@ -2,7 +2,7 @@ import type { Snippet } from 'svelte'; import { Popover } from '@appwrite.io/pink-svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import { SideSheet } from '$database/(entity)/views/(layouts)'; + import { SideSheet } from '$database/(entity)'; let { children, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index 30b41de551..3d5a5af825 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -46,7 +46,7 @@ import { base } from '$app/paths'; import { canWriteTables } from '$lib/stores/roles'; import { IconEye, IconLockClosed, IconPlus, IconPuzzle } from '@appwrite.io/pink-icons-svelte'; - import { SideSheet } from '$database/(entity)/views/(layouts)'; + import { SideSheet } from '$database/(entity)'; import EditRow from './rows/edit.svelte'; import EditRelatedRow from './rows/editRelated.svelte'; import EditColumn from './columns/edit.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index 9a533a72c9..4805083040 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -45,7 +45,7 @@ import { Click, trackEvent } from '$lib/actions/analytics'; import CsvDisabled from '../csvDisabled.svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import { SideSheet, SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; + import { SideSheet, SpreadsheetContainer } from '$database/(entity)'; import { showCreateColumnSheet } from '../store'; import { type Models } from '@appwrite.io/console'; import { preferences } from '$lib/stores/preferences'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte index 440bebdc83..def95ec905 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte @@ -18,7 +18,7 @@ spreadsheetLoading, expandTabs } from '../store'; - import { SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; + import { SpreadsheetContainer } from '$database/(entity)'; import { onDestroy, onMount } from 'svelte'; import { debounce } from '$lib/helpers/debounce'; import { columnOptions } from '../columns/store'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte index c665fb50aa..f49ef0d2b0 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/rows/create.svelte @@ -10,7 +10,7 @@ import { type Columns, spreadsheetRenderKey } from '../store'; import { ID, type Models } from '@appwrite.io/console'; import { Alert, Layout, Typography, Selector } from '@appwrite.io/pink-svelte'; - import { SideSheet } from '$database/(entity)/views/(layouts)'; + import { SideSheet } from '$database/(entity)'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; import { tick } from 'svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index 3cbad674c0..a20847921d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -83,7 +83,7 @@ import type { HeaderCellAction, RowCellAction } from './sheetOptions.svelte'; import SheetOptions from './sheetOptions.svelte'; import { isSmallViewport, isTabletViewport } from '$lib/stores/viewport'; - import { SpreadsheetContainer } from '$database/(entity)/views/(layouts)'; + import { SpreadsheetContainer } from '$database/(entity)'; import EditRowCell from './rows/cell/edit.svelte'; import { copy } from '$lib/helpers/copy'; import { writable } from 'svelte/store'; From aca5241dd72645a0f3e484e6f7f65e13f05dda29 Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 30 Sep 2025 09:05:28 +0530 Subject: [PATCH 07/48] lint. --- .../(entity)/views/indexes/view.svelte | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index 294009ef67..2dde1e5b6a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -28,7 +28,13 @@ import { type ComponentProps, type Snippet } from 'svelte'; import { Click, trackEvent } from '$lib/actions/analytics'; import { isSmallViewport } from '$lib/stores/viewport'; - import { type Entity, type CreateIndexesCallbackType, EntityContainer, SpreadsheetContainer, SideSheet } from '$database/(entity)'; + import { + type Entity, + type CreateIndexesCallbackType, + EntityContainer, + SpreadsheetContainer, + SideSheet + } from '$database/(entity)'; // TODO: change `column` to `entity`! From d00e280bdf5e9c9ee7d79959ba1ecb562d2ca366 Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 30 Sep 2025 13:57:59 +0530 Subject: [PATCH 08/48] misc: changes, docs update, svelte5 migration. --- src/lib/components/backupRestoreBox.svelte | 15 ++++++++------- .../table-[table]/+layout.svelte | 4 ++-- .../table-[table]/activity/+page.svelte | 6 +++++- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/lib/components/backupRestoreBox.svelte b/src/lib/components/backupRestoreBox.svelte index 2f660985e0..bee8da2940 100644 --- a/src/lib/components/backupRestoreBox.svelte +++ b/src/lib/components/backupRestoreBox.svelte @@ -57,21 +57,22 @@ } function updateOrAddItem(payload: Payload) { - // todo: @itznotabug - might need a change to $table? - const { $id, status, $collection, policyId } = payload; - if ($collection === 'archives' && policyId !== null) { + // the internal structure still uses `$collection`, + // and is basically an identifier of the op. type here! + const { $id, status, $collection: type, policyId } = payload; + if (type === 'archives' && policyId !== null) { return; } - if ($collection in backupRestoreItems) { - const collectionMap = backupRestoreItems[$collection]; + if (type in backupRestoreItems) { + const collectionMap = backupRestoreItems[type]; if (collectionMap.has($id)) { collectionMap.get($id).status = status; if (status === 'completed') { invalidate(Dependencies.BACKUPS); - if ($collection === 'restorations') { + if (type === 'restorations') { const { newId, newName } = collectionMap.get($id).options?.['databases']?.['database'][0] || {}; @@ -81,7 +82,7 @@ } else if (status === 'pending' || status === 'processing' || status === 'uploading') { collectionMap.set($id, payload); } - backupRestoreItems[$collection] = collectionMap; + backupRestoreItems[type] = collectionMap; } } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index 3d5a5af825..12feaa8076 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -94,8 +94,8 @@ ) { // don't invalidate when - // 1. from faker - // 2. ai columns creation - // 3. ai indexes creation + // 2. ai indexes creation + // 3. ai columns creation if ( !isWaterfallFromFaker && !$showIndexesSuggestions && diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/activity/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/activity/+page.svelte index 1161bb56d8..849d38953b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/activity/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/activity/+page.svelte @@ -2,7 +2,11 @@ import { Activity } from '$lib/layout'; import type { PageData } from './$types'; - export let data: PageData; + const { + data + }: { + data: PageData; + } = $props();
From 8f5f4c138b3f632933e4bcffb792518ae4745bae Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 3 Oct 2025 13:46:19 +0530 Subject: [PATCH 09/48] simplify. --- .../(entity)/views/layouts/sidesheet.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/sidesheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/sidesheet.svelte index c4d8041b2e..e28e99a905 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/sidesheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/sidesheet.svelte @@ -55,9 +55,9 @@ let submitting = $state(writable(false)); let copyText = $state(undefined); - beforeNavigate(() => { - show = false; - }); + + // hide on a nav trigger! + beforeNavigate(() => (show = false));
From 645ae628f7b908a304fa869b44b56b698e1d002d Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 3 Oct 2025 16:55:01 +0530 Subject: [PATCH 10/48] update: migrate empty sheet as a reusable component. update: make `createTable` as a reusable component like `createEntity`. --- .../database-[database]/(entity)/index.ts | 1 + .../views/create.svelte} | 92 ++++++++++--------- .../views/layouts/empty.svelte} | 31 +++---- .../(entity)/views/layouts/index.ts | 1 + .../database-[database]/+layout.svelte | 31 ++++--- .../database-[database]/+page.svelte | 10 +- .../databases/database-[database]/store.ts | 2 +- .../database-[database]/subNavigation.svelte | 4 +- .../table-[table]/+layout.svelte | 4 +- .../table-[table]/+page.svelte | 15 ++- .../table-[table]/indexes/+page.svelte | 3 +- 11 files changed, 104 insertions(+), 90 deletions(-) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/{createTable.svelte => (entity)/views/create.svelte} (57%) rename src/routes/(console)/project-[region]-[project]/databases/database-[database]/{table-[table]/layout/emptySheet.svelte => (entity)/views/layouts/empty.svelte} (94%) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index 15a4a899b5..68c25502b1 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -3,4 +3,5 @@ export * from './views/indexes'; export * from './views/layouts'; export * from './views/settings'; export { default as Usage } from './views/usage/view.svelte'; +export { default as CreateEntity } from './views/create.svelte'; export { default as EntityContainer } from './views/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/createTable.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte similarity index 57% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/createTable.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte index 78f6923444..7dd0ba7888 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/createTable.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte @@ -1,68 +1,68 @@ - + { if (!touchedId) { touchedId = true; } }} /> - + {#if useSuggestions} + + {/if} - - + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/empty.svelte similarity index 94% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/empty.svelte index def95ec905..bda5e2c65d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/layout/emptySheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/layouts/empty.svelte @@ -11,17 +11,10 @@ import { isSmallViewport, isTabletViewport } from '$lib/stores/viewport'; import { SortButton } from '$lib/components'; import type { Column } from '$lib/helpers/types'; - import { - tableColumns, - columnsOrder, - showCreateColumnSheet, - spreadsheetLoading, - expandTabs - } from '../store'; import { SpreadsheetContainer } from '$database/(entity)'; import { onDestroy, onMount } from 'svelte'; import { debounce } from '$lib/helpers/debounce'; - import { columnOptions } from '../columns/store'; + import { expandTabs, spreadsheetLoading } from '$database/table-[table]/store'; type Mode = 'rows' | 'rows-filtered' | 'indexes'; @@ -33,20 +26,22 @@ const { mode, + title, + actions, showActions = true, customColumns = [], - title, - actions - } = $props<{ + onOpenCreateColumn + }: { mode: Mode; - showActions?: boolean; - customColumns?: Column[]; title?: string; + showActions?: boolean; + customColumns?: Column[]; // these are filtered with `hide` + onOpenCreateColumn?: () => Promise | void; actions?: { primary?: Action; random?: Action; }; - }>(); + } = $props(); let spreadsheetContainer: HTMLElement; let headerElement: HTMLElement | null = null; @@ -96,7 +91,6 @@ ...col, width: 180, hide: false, - icon: columnOptions.find((colOpt) => colOpt.type === col?.type)?.icon, ...baseColProps })); @@ -184,13 +178,10 @@
{ if (columnActionsById && mode === 'rows') { - $showCreateColumnSheet.show = true; - $showCreateColumnSheet.title = 'Create column'; - $showCreateColumnSheet.columns = $tableColumns; - $showCreateColumnSheet.columnsOrder = $columnsOrder; + onOpenCreateColumn?.(); } }}> @@ -143,11 +159,4 @@ - { - await invalidate(Dependencies.DATABASE); - await goto( - `${base}/project-${page.params.region}-${project}/databases/database-${databaseId}/table-${table.$id}` - ); - }} /> + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte index 8234805e3a..2ac98fa427 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte @@ -2,7 +2,7 @@ import { EmptySearch, PaginationWithLimit, SearchQuery, ViewSelector } from '$lib/components'; import { Button } from '$lib/elements/forms'; import { Container } from '$lib/layout'; - import { showCreateTable, tableViewColumns } from './store'; + import { showCreateEntity, tableViewColumns } from './store'; import Table from './table.svelte'; import Grid from './grid.svelte'; import type { PageData } from './$types'; @@ -33,7 +33,7 @@ hideView={!data.tables.total} /> {#if $canWriteTables} - @@ -43,7 +43,7 @@ {#if data.tables.total} {#if data.view === 'grid'} - + {:else} {/if} @@ -82,9 +82,7 @@ {#if $canWriteTables} {/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts index 36e755d77e..6b5e1d7495 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/store.ts @@ -5,7 +5,7 @@ import { derived, writable } from 'svelte/store'; import { IconChartBar, IconCloudUpload, IconCog } from '@appwrite.io/pink-icons-svelte'; export const database = derived(page, ($page) => $page.data.database as Models.Database); -export const showCreateTable = writable(false); +export const showCreateEntity = writable(false); export const tableViewColumns = writable([ { id: '$id', title: 'Table ID', type: 'string', width: 200 }, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte index 8bbeee5209..542413ae6d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte @@ -4,7 +4,7 @@ import type { PageData } from './$types'; import { showSubNavigation } from '$lib/stores/layout'; import { bannerSpacing } from '$lib/layout/headerAlert.svelte'; - import { showCreateTable, databaseSubNavigationItems } from './store'; + import { showCreateEntity, databaseSubNavigationItems } from './store'; import { Icon, @@ -146,7 +146,7 @@ {#if $canWriteTables} - {/if} From 4354c909e7887de5830286471d5c5d3fa8816e91 Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 3 Oct 2025 17:13:28 +0530 Subject: [PATCH 12/48] update: misc, address a todo. --- .../database-[database]/(entity)/index.ts | 1 + .../(entity)/views/failedModal.svelte | 17 +++--------- .../(entity)/views/indexes/view.svelte | 20 +++++--------- .../table-[table]/columns/+page.svelte | 7 ++--- .../table-[table]/failedModal.svelte | 26 ------------------- .../table-[table]/indexes/+page.svelte | 2 +- 6 files changed, 15 insertions(+), 58 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/failedModal.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index 68c25502b1..1886fdc087 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -4,4 +4,5 @@ export * from './views/layouts'; export * from './views/settings'; export { default as Usage } from './views/usage/view.svelte'; export { default as CreateEntity } from './views/create.svelte'; +export { default as FailedModal } from './views/failedModal.svelte'; export { default as EntityContainer } from './views/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte index e177e613eb..44914f7bab 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/failedModal.svelte @@ -1,8 +1,7 @@ - - -
-

- - - {header} -

-

{error}

-
+ + {error} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index 2dde1e5b6a..f24cca7e9c 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -36,20 +36,18 @@ SideSheet } from '$database/(entity)'; - // TODO: change `column` to `entity`! - let { entity, onCreateIndex, onDeleteIndexes, emptyIndexesSheetView, - emptyColumnsSheetView + emptyEntitiesSheetView }: { entity: Entity; onCreateIndex: (index: CreateIndexesCallbackType) => Promise; onDeleteIndexes: (indexKeys: string[]) => Promise; emptyIndexesSheetView: Snippet<[() => void]>; - emptyColumnsSheetView?: Snippet; + emptyEntitiesSheetView?: Snippet; } = $props(); let showCreateIndex = $state(false); @@ -63,7 +61,7 @@ let showDelete = $state(false); let showOverview = $state(false); - let columns = $state([ + let entities = $state([ { id: 'key' }, { id: 'type' }, { id: 'columns' }, @@ -72,7 +70,7 @@ { id: 'actions', width: 40, isAction: true } ]); - function getColumnStatusBadge(status: string): ComponentProps['type'] { + function getEntityStatusBadge(status: string): ComponentProps['type'] { switch (status) { case 'processing': return 'warning'; @@ -89,10 +87,6 @@ const emptyCellsCount = $derived( entity.indexes.length >= emptyCellsLimit ? 0 : emptyCellsLimit - entity.indexes.length ); - - $effect(() => { - console.log(`$effect > selectedIndexes`, $state.snapshot(selectedIndexes)); - }); @@ -121,7 +115,7 @@ + type={getEntityStatusBadge(index.status)} /> {#if index.error} (showCreateIndex = true))} {/if} {:else} - {@render emptyColumnsSheetView()} + {@render emptyEntitiesSheetView()} {/if} {#if selectedIndexes.length > 0} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index 8f9b75f1f3..78a426dd69 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -16,7 +16,6 @@ Typography } from '@appwrite.io/pink-svelte'; import { isRelationship, isSpatialType, isString } from '../rows/store'; - import FailedModal from '../failedModal.svelte'; import { columns, type Columns, @@ -45,7 +44,7 @@ import { Click, trackEvent } from '$lib/actions/analytics'; import CsvDisabled from '../csvDisabled.svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import { SideSheet, SpreadsheetContainer } from '$database/(entity)'; + import { SideSheet, SpreadsheetContainer, FailedModal } from '$database/(entity)'; import { showCreateColumnSheet } from '../store'; import { type Models } from '@appwrite.io/console'; import { preferences } from '$lib/stores/preferences'; @@ -481,9 +480,7 @@ -{#if showFailed} - -{/if} + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts index 2a34aa22f1..ca04bd66e6 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts @@ -1,8 +1,8 @@ import { sdk } from '$lib/stores/sdk'; import { Dependencies } from '$lib/constants'; import type { LayoutLoad } from './$types'; -import Breadcrumbs from './breadcrumbs.svelte'; import Header from './header.svelte'; +import { Breadcrumbs } from '$database/(entity)'; export const load: LayoutLoad = async ({ params, depends }) => { depends(Dependencies.TABLE); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/breadcrumbs.svelte deleted file mode 100644 index 0b27f2fd07..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/breadcrumbs.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte index 78a426dd69..1e808fac93 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/+page.svelte @@ -42,9 +42,8 @@ } from '@appwrite.io/pink-icons-svelte'; import { type ComponentProps, onDestroy, onMount } from 'svelte'; import { Click, trackEvent } from '$lib/actions/analytics'; - import CsvDisabled from '../csvDisabled.svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import { SideSheet, SpreadsheetContainer, FailedModal } from '$database/(entity)'; + import { SideSheet, SpreadsheetContainer, FailedModal, CsvDisabled } from '$database/(entity)'; import { showCreateColumnSheet } from '../store'; import { type Models } from '@appwrite.io/console'; import { preferences } from '$lib/stores/preferences'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/createColumnDropdown.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/createColumnDropdown.svelte index 172d5f42c6..7f464ebd2a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/createColumnDropdown.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/createColumnDropdown.svelte @@ -3,8 +3,8 @@ import { ActionMenu, Icon, Popover } from '@appwrite.io/pink-svelte'; import { columnOptions, type Option } from './store'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; - import CsvDisabled from '../csvDisabled.svelte'; import { isCsvImportInProgress } from '../store'; + import { CsvDisabled } from '$database/(entity)'; export let showCreate = false; export let selectedOption: Option['name'] = null; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/csvDisabled.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/csvDisabled.svelte deleted file mode 100644 index 1ebac31832..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/csvDisabled.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - -
- -
- -
This action is disabled during import.
-
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte index 2e52e82f96..7233488c30 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/header.svelte @@ -1,17 +1,12 @@
- - - - - {$table?.name} - - - {#key $table?.$id} - {$table?.$id} - {/key} - - - -
- - {#each tabs as tab} - - {tab.title} - - {/each} - -
-
+
From ef7d6d46d6dc23752c20224a8a555c286450d042 Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 3 Oct 2025 19:00:53 +0530 Subject: [PATCH 14/48] update: improved context and terminology sharing. --- .../(entity)/helpers/index.ts | 1 + .../(entity)/helpers/init.ts | 35 ++ .../database-[database]/(entity)/index.ts | 1 - .../(entity)/views/container.svelte | 24 -- .../(entity)/views/indexes/create.svelte | 8 +- .../(entity)/views/indexes/delete.svelte | 6 +- .../(entity)/views/indexes/overview.svelte | 5 +- .../(entity)/views/indexes/view.svelte | 355 ++++++++---------- .../(entity)/views/settings/danger.svelte | 84 ++--- .../(entity)/views/settings/name.svelte | 54 ++- .../views/settings/permissions.svelte | 62 ++- .../(entity)/views/settings/security.svelte | 67 ++-- .../(entity)/views/settings/status.svelte | 58 ++- .../(entity)/views/usage/view.svelte | 39 +- .../database-[database]/+layout.svelte | 4 +- .../table-[table]/+layout.svelte | 46 +-- 16 files changed, 397 insertions(+), 452 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts delete mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/container.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts index 704e7eed5e..6293e2541f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/index.ts @@ -1,3 +1,4 @@ +export * from './init'; export * from './types'; export * from './analytics'; export * from './terminology'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts new file mode 100644 index 0000000000..c8bf27cba2 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts @@ -0,0 +1,35 @@ +import type { Page } from '@sveltejs/kit'; +import { getContext, setContext } from 'svelte'; +import { + type AnalyticsResult, + type DependenciesResult, + type TerminologyResult, + useAnalytics, + useDependencies, + useTerminology +} from '$database/(entity)'; + +const TERMINOLOGIES_KEY = Symbol('terminologies'); + +export type Terminologies = { + analytics: AnalyticsResult; + terminology: TerminologyResult; + dependencies: DependenciesResult; +}; + +export function getTerminologies(): Terminologies { + return getContext(TERMINOLOGIES_KEY); +} + +export function setTerminologies(page: Page) { + setContext(TERMINOLOGIES_KEY, buildTerminologies(page)); +} + +function buildTerminologies(page: Page) { + const terminology = useTerminology(page); + return { + terminology, + analytics: useAnalytics(terminology), + dependencies: useDependencies(terminology) + }; +} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts index 2b336dfeed..8437673d36 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/index.ts @@ -10,4 +10,3 @@ export { default as Breadcrumbs } from './views/breadcrumbs.svelte'; export { default as Usage } from './views/usage/view.svelte'; export { default as CreateEntity } from './views/create.svelte'; export { default as FailedModal } from './views/failedModal.svelte'; -export { default as EntityContainer } from './views/container.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/container.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/container.svelte deleted file mode 100644 index fc5852dad0..0000000000 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/container.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - -{@render children(analytics, dependencies, terminology)} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte index fa45cf6760..7fb716099d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/create.svelte @@ -20,22 +20,18 @@ import { Icon, Layout } from '@appwrite.io/pink-svelte'; import { IconCalendar, IconFingerPrint, IconPlus, IconX } from '@appwrite.io/pink-icons-svelte'; import { isSmallViewport } from '$lib/stores/viewport'; - import type { DependenciesResult, Entity, TerminologyResult } from '$database/(entity)'; + import { type Entity, getTerminologies } from '$database/(entity)'; import { resolveRoute, withPath } from '$lib/stores/navigation'; import { IndexType } from '@appwrite.io/console'; import { columnOptions as baseColumnOptions } from '$database/table-[table]/columns/store'; let { entity, - terminology, - dependencies, showCreateIndex = $bindable(false), externalFieldKey = null, onCreateIndex }: { entity: Entity; - terminology: TerminologyResult; - dependencies: DependenciesResult; showCreateIndex: boolean; externalFieldKey?: string; onCreateIndex: (index: CreateIndexesCallbackType) => Promise; @@ -45,6 +41,8 @@ let selectedType = $state(IndexType.Key); + const { dependencies, terminology } = getTerminologies(); + const fieldOptions = $derived( // TODO: could be columns or attributes! entity.columns diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte index d360116ba3..9bf9a57d77 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/delete.svelte @@ -4,15 +4,13 @@ import { Submit, trackEvent, trackError } from '$lib/actions/analytics'; import { invalidate } from '$app/navigation'; import Confirm from '$lib/components/confirm.svelte'; - import type { DependenciesResult } from '$database/(entity)'; + import { getTerminologies } from '$database/(entity)'; let { - dependencies, showDelete = $bindable(false), selectedIndex = $bindable(null), onDeleteIndexes }: { - dependencies: DependenciesResult; showDelete: boolean; selectedIndex: Models.ColumnIndex | string[] | null; onDeleteIndexes: (selectedKeys: string[]) => Promise; @@ -21,6 +19,8 @@ let error: string = $state(null); let selectedKeys = $derived(getKeys(selectedIndex)); + const { dependencies } = getTerminologies(); + function getKeys(selected: Models.ColumnIndex | string[]): string[] { return Array.isArray(selected) ? selected : [selected.key]; } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/overview.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/overview.svelte index 652b1a9f91..710693ff7b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/overview.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/overview.svelte @@ -2,16 +2,15 @@ import { InputText } from '$lib/elements/forms'; import { Layout } from '@appwrite.io/pink-svelte'; import type { Models } from '@appwrite.io/console'; - import type { TerminologyResult } from '$database/(entity)'; + import { getTerminologies } from '$database/(entity)'; let { - terminology, selectedIndex = null }: { - terminology: TerminologyResult; selectedIndex: Models.ColumnIndex; } = $props(); + const { terminology } = getTerminologies(); const entityType = terminology.entity.title.singular; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index f24cca7e9c..bc71a709d7 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -31,7 +31,6 @@ import { type Entity, type CreateIndexesCallbackType, - EntityContainer, SpreadsheetContainer, SideSheet } from '$database/(entity)'; @@ -89,207 +88,181 @@ ); - - {#snippet children(_, dependencies, terminology)} - - - {#if $canWriteTables} - - {/if} - - + + + {#if $canWriteTables} + + {/if} + + -
- {#if entity.columns?.length} - {#if entity.indexes.length} - - (showCreateIndex = true)}> - - Key - Type - Columns - - - Lengths - - +
+ {#if entity.columns?.length} + {#if entity.indexes.length} + + (showCreateIndex = true)}> + + Key + Type + Columns + + + Lengths + + - {#each entity.indexes as index (index.key)} - - - - {index.key} - {#if index.status !== 'available'} - - {#if index.error} - { - e.preventDefault(); - error = index.error; - showFailed = true; - }}>Details - {/if} - {/if} - - - {index.type} - - {index.columns.join(', ')} - - - - - - {index.lengths} - - - - - - { - toggle(); - selectedIndex = index; - showOverview = true; - }}>Overview + {#each entity.indexes as index (index.key)} + + + + {index.key} + {#if index.status !== 'available'} + + {#if index.error} + { + e.preventDefault(); + error = index.error; + showFailed = true; + }}>Details + {/if} + {/if} + + + {index.type} + + {index.columns.join(', ')} + + + + + + {index.lengths} + + + + + + { + toggle(); + selectedIndex = index; + showOverview = true; + }}>Overview -
- -
+
+ +
- { - toggle(); - showDelete = true; - selectedIndex = index; - trackEvent(Click.DatabaseIndexDelete); - }}>Delete -
-
-
-
- {/each} + { + toggle(); + showDelete = true; + selectedIndex = index; + trackEvent(Click.DatabaseIndexDelete); + }}>Delete +
+
+
+
+ {/each} - - - - {@const length = entity.indexes.length} - {length} - {length === 1 ? 'index' : 'indexes'} - - - -
-
- {:else} - {@render emptyIndexesSheetView(() => (showCreateIndex = true))} - {/if} - {:else} - {@render emptyEntitiesSheetView()} - {/if} + + + + {@const length = entity.indexes.length} + {length} + {length === 1 ? 'index' : 'indexes'} + + + + + + {:else} + {@render emptyIndexesSheetView(() => (showCreateIndex = true))} + {/if} + {:else} + {@render emptyEntitiesSheetView()} + {/if} - {#if selectedIndexes.length > 0} -
- - -
- - - - {selectedIndexes.length > 1 ? 'indexes' : 'index'} - selected - - -
-
- - - - -
-
- {/if} + {#if selectedIndexes.length > 0} +
+ + +
+ + + + {selectedIndexes.length > 1 ? 'indexes' : 'index'} + selected + + +
+
+ + + + +
+ {/if} +
- await createIndex.create() - }}> - - + await createIndex.create() + }}> + + - {#if selectedIndex} - - {:else if selectedIndexes && selectedIndexes.length} - - {/if} +{#if selectedIndex} + +{:else if selectedIndexes && selectedIndexes.length} + +{/if} - - - + + + - - {/snippet} - + +
From aea5e821a1306b43eff75713518255a49bc22088 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 9 Oct 2025 17:39:22 +0530 Subject: [PATCH 31/48] misc. --- .../databases/database-[database]/backups/+page.svelte | 2 +- .../databases/database-[database]/backups/table.svelte | 5 ++++- .../databases/database-[database]/delete.svelte | 5 +++++ .../databases/database-[database]/settings/+page.svelte | 2 +- .../database-[database]/table-[table]/+layout.svelte | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte index 2a4472199b..9b79d25f7c 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/+page.svelte @@ -27,7 +27,7 @@ const { data }: PageProps = $props(); - let policyCreateError: string = $state(null); + let policyCreateError: string | null = $state(null); let totalPolicies: UserBackupPolicy[] = $state([]); const isDisabled = $derived(isSelfHosted || (isCloud && !$currentPlan.backupsEnabled)); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte index 8e91306d21..f4e5981d3f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/backups/table.svelte @@ -57,7 +57,10 @@ let showRestore = $state(false); let showCustomId = $state(false); - let newDatabaseInfo: { name: string; id: string } = $state({ name: null, id: null }); + let newDatabaseInfo: { name: string | null; id: string | null } = $state({ + name: null, + id: null + }); let confirmSameDbRestore = $state(false); let selectedRestoreOption = $state('new'); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte index 5032be2031..54ecb1fd5e 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte @@ -73,9 +73,11 @@ const handleDelete = async () => { try { + // TODO: namespace as per database type! await sdk.forProject(page.params.region, page.params.project).tablesDB.delete({ databaseId: page.params.database }); + showDelete = false; addNotification({ @@ -102,6 +104,9 @@ if (!showDelete) { tables = null; tableItems = []; + + error = false; + confirmedDeletion = false; } }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte index 583aa99bc8..2f78af6c22 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte @@ -20,7 +20,7 @@ const database = $derived(data.database); let showDelete = $state(false); - let databaseName: string = $state(null); + let databaseName: string | null = $state(null); let errorMessage: string = $state('Something went wrong'); let errorType: 'error' | 'warning' | 'success' = $state('error'); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index e9c50cce91..a514a08df1 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -142,7 +142,7 @@ callback() { goto(basePath); }, - disabled: page.url.pathname.endsWith(table.$id), + disabled: page.url.pathname.endsWith(table?.$id), group: 'tables' }, { From 2abb2bc973c28033839b3ca6446b3a87a2328318 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 9 Oct 2025 17:49:53 +0530 Subject: [PATCH 32/48] address comment with hardcoded paths for `nonSheetPages` checks. --- .../database-[database]/(entity)/views/header.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte index 7edcfbe4d6..1f954183aa 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte @@ -48,7 +48,12 @@ }); const nonSheetPages = $derived.by(() => { - const endings = ['table-[table]', 'table-[table]/columns', 'table-[table]/indexes']; + const field = terminology.field.lower.plural; + const entityType = terminology.entity.lower.singular; + + const resourceSeg = `${entityType}-[${entityType}]`; + + const endings = [resourceSeg, `${resourceSeg}/${field}`, `${resourceSeg}/indexes`]; const isSpreadsheetPage = endings.some((end) => page.route.id?.endsWith(end)); return !isSpreadsheetPage; }); From 9d1f4ce527f493ef429051742db188e543a40564 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 9 Oct 2025 17:54:44 +0530 Subject: [PATCH 33/48] misc: fixes. --- .../database-[database]/(entity)/views/indexes/view.svelte | 3 ++- .../databases/database-[database]/table-[table]/+layout.svelte | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index 236117e9d5..573f7e05db 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -37,6 +37,7 @@ import { preferences } from '$lib/stores/preferences'; import { debounce } from '$lib/helpers/debounce'; import { page } from '$app/state'; + import type { ColumnsWidth } from '$database/table-[table]/store'; let { entity, @@ -63,7 +64,7 @@ let showDelete = $state(false); let showOverview = $state(false); - let columnsWidth = $state(null); + let columnsWidth: ColumnsWidth | null = $state(null); const organizationId = $derived(page.data.organization?.$id ?? page.data.project?.teamId); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte index a514a08df1..2deb9aae68 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.svelte @@ -167,7 +167,7 @@ label: 'Go to activity', keys: ['g', 'c'], callback() { - goto(withPath(basePath, '/indexes')); + goto(withPath(basePath, '/activity')); }, disabled: page.url.pathname.endsWith('activity'), group: 'tables' From ea665d7cc5424dc9ce59ff5e8e51a3335d8f47ee Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 9 Oct 2025 17:57:19 +0530 Subject: [PATCH 34/48] misc: fixes. --- .../databases/database-[database]/(entity)/views/header.svelte | 3 +-- .../database-[database]/(entity)/views/indexes/view.svelte | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte index 1f954183aa..f8edd878e1 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/header.svelte @@ -37,13 +37,12 @@ const basePath = $derived.by(() => { const entityType = terminology.entity.lower.singular; - const entityId = page.params[entityType]; return withPath( resolveRoute( `/(console)/project-[region]-[project]/databases/database-[database]`, page.params ), - `${entityType}-${entityId}` + `${entityType}-${entity.$id}` ); }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte index 573f7e05db..8f68ba2c6e 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/indexes/view.svelte @@ -294,7 +294,7 @@ {@render emptyIndexesSheetView(() => (showCreateIndex = true))} {/if} {:else} - {@render emptyEntitiesSheetView()} + {@render emptyEntitiesSheetView?.()} {/if} {#if selectedIndexes.length > 0} From 8a449d587c3e4368ede5f69274430abe3b5a2b76 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 9 Oct 2025 20:04:45 +0530 Subject: [PATCH 35/48] update: moreee changes! --- .../(entity)/helpers/terminology.ts | 6 + .../(entity)/helpers/types.ts | 7 +- .../(suggestions)/input.svelte | 12 +- .../databases/database-[database]/+layout.ts | 3 + .../database-[database]/+page.svelte | 61 +++++---- .../databases/database-[database]/+page.ts | 36 +++++- .../database-[database]/delete.svelte | 79 +++++++----- .../databases/database-[database]/grid.svelte | 32 +++-- .../database-[database]/header.svelte | 6 +- .../database-[database]/settings/+page.svelte | 40 ++++-- .../databases/database-[database]/store.ts | 12 ++ .../database-[database]/subNavigation.svelte | 119 +++++++++++------- .../database-[database]/table.svelte | 40 +++--- 13 files changed, 302 insertions(+), 151 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts index 8cf0c2ff7b..f58b1d3f6d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts @@ -21,6 +21,11 @@ export type Index = Partial & { fields: Models.Index['attributes'] | Models.ColumnIndex['columns']; }; +export type EntityList = { + total: number; + entities: Entity[]; +}; + export const baseTerminology = { tablesdb: { entity: 'table', @@ -103,6 +108,7 @@ export function useTerminology(page: Page): TerminologyResult { const dbTerminologies = terminologyData[type] || {}; return { + type, source: dbTerminologies, field: dbTerminologies.field, record: dbTerminologies.record, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts index 309c076e1e..8cdb4b73eb 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/types.ts @@ -1,6 +1,6 @@ -import { Click, Submit } from '$lib/actions/analytics'; -import type { baseTerminology } from './terminology'; import { Dependencies } from '$lib/constants'; +import { Click, Submit } from '$lib/actions/analytics'; +import type { baseTerminology, DatabaseType } from './terminology'; export type TerminologyShape = { entity: string; @@ -11,6 +11,7 @@ export type TerminologyShape = { export type Term = { singular: string; plural: string }; export type TerminologyResult = { + type: DatabaseType; source: { entity?: { lower: Term; title: Term }; field?: { lower: Term; title: Term }; @@ -59,7 +60,7 @@ export type AnalyticsResult = { // for derived dependencies! export type DependenciesResult = { - [K in keyof Omit]: { + [K in keyof Omit]: { singular: Dependencies; plural: Dependencies; }; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/input.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/input.svelte index 31272972cf..16666a9042 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/input.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(suggestions)/input.svelte @@ -4,6 +4,7 @@ import IconAI from './icon/ai.svelte'; import { slide } from 'svelte/transition'; import { tableColumnSuggestions } from './store'; + import { getTerminologies } from '$database/(entity)'; import { Button, InputTextarea } from '$lib/elements/forms'; import { Card, Layout, Selector, Typography } from '@appwrite.io/pink-svelte'; @@ -14,17 +15,20 @@ }); const featureActive = $derived(isCloud); + const { terminology } = getTerminologies(); + const field = terminology.field.lower; + const entity = terminology.entity.lower.singular; const title = $derived.by(() => { return featureActive - ? 'Smart column suggestions' - : 'Smart column suggestions available on Cloud'; + ? `Smart ${field.singular} suggestions` + : `Smart ${field.singular} suggestions available on Cloud`; }); const subtitle = $derived.by(() => { return featureActive - ? 'Enable AI to suggest useful columns based on your table name' - : 'Sign up for Cloud to generate columns based on your table name'; + ? `Enable AI to suggest useful ${field.plural} based on your ${entity} name` + : `Sign up for Cloud to generate ${field.plural} based on your ${entity} name`; }); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts index 49b60c099b..d469b86b39 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+layout.ts @@ -12,6 +12,9 @@ export const load: LayoutLoad = async ({ params, depends }) => { databaseId: params.database }); + // only for tests + // database.type = 'documentsdb'; + return { database, header: Header, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte index a3623af1b6..90066c9f96 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.svelte @@ -5,17 +5,35 @@ import { showCreateEntity, tableViewColumns } from './store'; import Table from './table.svelte'; import Grid from './grid.svelte'; - import type { PageData } from './$types'; + import type { PageProps } from './$types'; import { Card, Empty, Icon, Layout } from '@appwrite.io/pink-svelte'; - import { base } from '$app/paths'; import { app } from '$lib/stores/app'; import { canWriteTables } from '$lib/stores/roles'; import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { page } from '$app/state'; + import { resolveRoute } from '$lib/stores/navigation'; + import { getTerminologies } from '$database/(entity)'; + import { withPath } from '$lib/stores/navigation.js'; - export let data: PageData; + const { data }: PageProps = $props(); - const databaseId = page.params.database; + const { terminology } = getTerminologies(); + const entityTitle = terminology.entity.title; + const entityLower = terminology.entity.lower; + + /** + * init update because `getContext` + * doesn't work on typescript context! + */ + tableViewColumns.update((columns) => { + /* $id */ + columns[0].title = `${entityTitle.singular} ID`; + return columns; + }); + + function getImageRoute(type: 'light' | 'dark'): string { + return withPath(resolveRoute('/'), `/images/empty-database-${type}.svg`); + } @@ -29,8 +47,8 @@ ui="new" view={data.view} columns={tableViewColumns} - hideColumns={!data.tables.total} - hideView={!data.tables.total} /> + hideColumns={!data.entities.total} + hideView={!data.entities.total} /> {#if $canWriteTables}
+
{/if} + total={data.entities.total} + name={entityTitle.plural} /> {:else if data.search} - + + href={resolveRoute( + '/(console)/project-[region]-[project]/databases/database-[database]', + page.params + )}>Clear Search {:else} + src={getImageRoute($app.themeInUse)} + title="Create your first {entityLower.singular}"> - Create, organize, and query structured data with Tables. + Create, organize, and query structured data with {entityTitle.plural}. + + ariaLabel="create {entityLower.singular}">Documentation {#if $canWriteTables} {/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts index 475ed13fee..b0745180c0 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts @@ -3,8 +3,10 @@ import { sdk } from '$lib/stores/sdk'; import { getLimit, getPage, getSearch, getView, pageToOffset, View } from '$lib/helpers/load'; import type { PageLoad } from './$types'; import { CARD_LIMIT, Dependencies } from '$lib/constants'; +import { type DatabaseType, type EntityList, toSupportiveEntity } from '$database/(entity)'; -export const load: PageLoad = async ({ params, url, route, depends }) => { +export const load: PageLoad = async ({ params, url, route, depends, parent }) => { + const { database } = await parent(); depends(Dependencies.TABLES); const page = getPage(url); @@ -13,17 +15,39 @@ export const load: PageLoad = async ({ params, url, route, depends }) => { const view = getView(url, route, View.Grid); const offset = pageToOffset(page, limit); - const tables = await sdk.forProject(params.region, params.project).tablesDB.listTables({ + let entities: EntityList; + const databaseType = database.type as DatabaseType; + + const searchQuery = search || undefined; + const queries = [Query.limit(limit), Query.offset(offset), Query.orderDesc('')]; + + const projectSdk = sdk.forProject(params.region, params.project); + const methodParams = { + queries, databaseId: params.database, - queries: [Query.limit(limit), Query.offset(offset), Query.orderDesc('')], - search: search || undefined - }); + ...(searchQuery && { search: searchQuery }) + }; + + switch (databaseType) { + case 'tablesdb': { + const { total, tables } = await projectSdk.tablesDB.listTables(methodParams); + entities = { total, entities: tables.map(toSupportiveEntity) }; + break; + } + + case 'documentsdb': { + const { total, collections } = + await projectSdk.documentsDB.listCollections(methodParams); + entities = { total, entities: collections.map(toSupportiveEntity) }; + break; + } + } return { offset, limit, search, view, - tables + entities }; }; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte index 54ecb1fd5e..c98b524558 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/delete.svelte @@ -7,9 +7,10 @@ import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import DualTimeView from '$lib/components/dualTimeView.svelte'; - import { type Models, Query } from '@appwrite.io/console'; + import { Query } from '@appwrite.io/console'; import { Spinner, Table } from '@appwrite.io/pink-svelte'; import { resolveRoute } from '$lib/stores/navigation'; + import { type EntityList, getTerminologies, toSupportiveEntity } from '$database/(entity)'; let { showDelete = $bindable(false) @@ -21,17 +22,20 @@ let confirmedDeletion = $state(false); let isLoadingRowsCount = $state(false); - let tableItems = $state([]); - let tables: Models.TableList | null = $state(null); + let entityItems = $state([]); + let entities: EntityList | null = $state(null); + const { terminology } = getTerminologies(); const database = $derived(page.data.database); + const projectSdk = $derived(sdk.forProject(page.params.region, page.params.project)); + function buildQueries(): string[] { const queries = [Query.orderDesc('$updatedAt')]; - if (tableItems.length > 0) { + if (entityItems.length > 0) { queries.push(Query.limit(25)); - queries.push(Query.offset(tableItems.length)); + queries.push(Query.offset(entityItems.length)); } else { queries.push(Query.limit(3)); } @@ -47,23 +51,31 @@ try { const queries = buildQueries(); - - tables = await sdk - .forProject(page.params.region, page.params.project) - .tablesDB.listTables({ - databaseId: page.params.database, - queries - }); - - const tablePromises = tables.tables.map(async (table) => { + const params = { databaseId: page.params.database, queries }; + + switch (terminology.type) { + case 'tablesdb': { + const { total, tables } = await projectSdk.tablesDB.listTables(params); + entities = { total, entities: tables.map(toSupportiveEntity) }; + break; + } + case 'documentsdb': { + const { total, collections } = + await projectSdk.documentsDB.listCollections(params); + entities = { total, entities: collections.map(toSupportiveEntity) }; + break; + } + } + + const entityPromises = entities.entities.map(async (entity) => { return { - id: table.$id, - name: table.name, - updatedAt: table.$updatedAt + id: entity.$id, + name: entity.name, + updatedAt: entity.$updatedAt }; }); - tableItems = [...tableItems, ...(await Promise.all(tablePromises))]; + entityItems = [...entityItems, ...(await Promise.all(entityPromises))]; } catch (err) { error = true; } finally { @@ -73,10 +85,17 @@ const handleDelete = async () => { try { - // TODO: namespace as per database type! - await sdk.forProject(page.params.region, page.params.project).tablesDB.delete({ - databaseId: page.params.database - }); + const params = { databaseId: page.params.database }; + + switch (terminology.type) { + case 'tablesdb': + await projectSdk.tablesDB.delete(params); + break; + + case 'documentsdb': + await projectSdk.documentsDB.delete(params); + break; + } showDelete = false; @@ -102,8 +121,8 @@ /* reset data on modal close */ $effect(() => { if (!showDelete) { - tables = null; - tableItems = []; + entities = null; + entityItems = []; error = false; confirmedDeletion = false; @@ -119,7 +138,7 @@

- {#if tableItems.length > 0} + {#if entityItems.length > 0} The following tables and all data associated with {database.name}, will be permanently deleted. {:else} @@ -135,14 +154,14 @@

Are you sure you want to delete {database.name}?

- {:else if tableItems.length > 0} + {:else if entityItems.length > 0}
Table Last Updated - {#each tableItems as table} + {#each entityItems as table} {table.name} @@ -152,7 +171,7 @@ {/each} - {#if tableItems.length < tables.total} + {#if entityItems.length < entities.total}
- {:else if tableItems.length > 25} + {:else if entityItems.length > 25} From 0e7938a5d5df5120dd7d9f708bc2e66283fa188c Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 10 Oct 2025 20:02:01 +0530 Subject: [PATCH 44/48] fix: `$derived` overuse. --- .../databases/database-[database]/header.svelte | 17 ++++++----------- .../database-[database]/subNavigation.svelte | 15 ++++++--------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte index 5685860d2f..bf4628216a 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte @@ -7,19 +7,13 @@ import { resolveRoute, withPath } from '$lib/stores/navigation'; import { useTerminology } from '$database/(entity)'; - const database = $derived(page.data.database); - const terminology = $derived(useTerminology(page)); - - const baseDatabasesPath = $derived( - resolveRoute('/(console)/project-[region]-[project]/databases', page.params) + const terminology = useTerminology(page); + const baseDatabasePath = resolveRoute( + '/(console)/project-[region]-[project]/databases/database-[database]', + page.params ); - const baseDatabasePath = $derived( - resolveRoute( - '/(console)/project-[region]-[project]/databases/database-[database]', - page.params - ) - ); + const database = $derived(page.data.database); const tabs = $derived( [ @@ -52,6 +46,7 @@ + {@const baseDatabasesPath = resolveRoute('/(console)/project-[region]-[project]/databases', page.params)} {database?.name} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte index 76f1172d30..e738cc0666 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte @@ -38,13 +38,12 @@ const data = $derived(page.data) as PageData; // terminologies - const terminology = $derived(useTerminology(page)); - const databasesSdk = $derived(useDatabasesSdk(page, terminology)); + const terminology = useTerminology(page); + const databasesSdk = useDatabasesSdk(page, terminology); const entityTypePlural = $derived(terminology.entity.lower.plural); const entityTypeSingular = $derived(terminology.entity.lower.singular); - const databaseId = $derived(page.params.database); const entityId = $derived(page.params[entityTypeSingular]); let openBottomSheet = $state(false); @@ -71,16 +70,14 @@ const bottomNavOffset = $derived($bannerSpacing ? '70.5px' : '0px'); const entityContentPadding = $derived($bannerSpacing ? '210px' : '140px'); - const databaseBaseRoute = $derived( - resolveRoute( - '/(console)/project-[region]-[project]/databases/database-[database]', - page.params - ) + const databaseBaseRoute = resolveRoute( + '/(console)/project-[region]-[project]/databases/database-[database]', + page.params ); async function loadEntities() { entities = await databasesSdk.listEntities({ - databaseId, + databaseId: page.params.database, queries: [Query.orderDesc(''), Query.limit(100)] }); } From 222eb9a96fe1bc58326bac8e52751fb75eeabfb9 Mon Sep 17 00:00:00 2001 From: Darshan Date: Sat, 11 Oct 2025 11:32:55 +0530 Subject: [PATCH 45/48] fix: relationships. --- .../databases/+page.ts | 2 + .../(entity)/helpers/init.ts | 2 +- .../(entity)/helpers/sdk.ts | 26 +++++- .../(entity)/views/create.svelte | 4 +- .../databases/database-[database]/+page.ts | 4 +- .../database-[database]/header.svelte | 5 +- .../table-[table]/+layout.ts | 20 +++-- .../table-[table]/columns/relationship.svelte | 18 ++-- .../rows/columns/types/relationship.svelte | 5 ++ .../table-[table]/rows/editRelated.svelte | 87 ++++++++++--------- .../table-[table]/spreadsheet.svelte | 2 +- 11 files changed, 108 insertions(+), 67 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/+page.ts index fcb828ff80..0d36bb17ba 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/+page.ts @@ -52,6 +52,7 @@ async function fetchDatabasesAndBackups( const projectSDK = sdk.forProject(params.region, params.project); + // TODO: make use of `useDatabasesSdk`; const databases = await projectSDK.tablesDB.list({ queries: [Query.limit(limit), Query.offset(offset), Query.orderDesc('$createdAt')], search: search || undefined @@ -61,6 +62,7 @@ async function fetchDatabasesAndBackups( await Promise.all( // TODO: backend should allow `Query.select` for perf! + // TODO: make use of `useDatabasesSdk`; databases.databases.map(async ({ $id }) => { const res = await projectSDK.tablesDB.listTables({ databaseId: $id, diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts index 62ac939bdf..739e074344 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/init.ts @@ -34,6 +34,6 @@ function buildTerminologies(page: Page) { terminology, analytics: useAnalytics(terminology), dependencies: useDependencies(terminology), - databaseSdk: useDatabasesSdk(page, terminology) + databasesSdk: useDatabasesSdk(page, terminology) }; } diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts index b795bf2fd9..7d7126b8ef 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts @@ -1,9 +1,10 @@ import { sdk } from '$lib/stores/sdk'; import type { Page } from '@sveltejs/kit'; import type { TerminologyResult } from './types'; -import { type DatabaseType, type EntityList, toSupportiveEntity } from './terminology'; +import { type DatabaseType, type Entity, type EntityList, toSupportiveEntity } from './terminology'; export type DatabaseSdkResult = { + getEntity: (params: { databaseId: string; entityId: string }) => Promise; listEntities: (params: { databaseId: string; queries?: string[]; @@ -34,6 +35,29 @@ export function useDatabasesSdk( const baseSdk = sdk.forProject(region, project); return { + async getEntity(params) { + switch (type) { + case 'legacy': /* databases api */ + case 'tablesdb': { + const table = await baseSdk.tablesDB.getTable({ + databaseId: params.databaseId, + tableId: params.entityId + }); + return toSupportiveEntity(table); + } + case 'documentsdb': { + const table = await baseSdk.documentsDB.getCollection({ + databaseId: params.databaseId, + collectionId: params.entityId + }); + return toSupportiveEntity(table); + } + case 'vectordb': + throw new Error(`Database type not supported yet`); + default: + throw new Error(`Unknown database type`); + } + }, async listEntities(params) { switch (type) { case 'legacy': /* databases api */ diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte index 668bf9be73..c8830a36e9 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/views/create.svelte @@ -86,9 +86,9 @@ trackEvent(analyticsCreateSubmit, { customId: !!id }); - // reset vars! + id = null; + name = ''; show = false; - name = id = null; } function toIdFormat(str: string): string { diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts index 4215983d4e..731d7a06fe 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/+page.ts @@ -16,8 +16,8 @@ export const load: PageLoad = async ({ params, url, route, depends, parent }) => const databaseType = database.type as DatabaseType; - const databaseSdk = useDatabasesSdk(params.region, params.project, databaseType); - const entities = await databaseSdk.listEntities({ + const databasesSdk = useDatabasesSdk(params.region, params.project, databaseType); + const entities = await databasesSdk.listEntities({ databaseId: database.$id, search: search || undefined, queries: [Query.limit(limit), Query.offset(offset), Query.orderDesc('')] diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte index bf4628216a..37671efad9 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/header.svelte @@ -14,6 +14,10 @@ ); const database = $derived(page.data.database); + const baseDatabasesPath = resolveRoute( + '/(console)/project-[region]-[project]/databases', + page.params + ); const tabs = $derived( [ @@ -46,7 +50,6 @@ - {@const baseDatabasesPath = resolveRoute('/(console)/project-[region]-[project]/databases', page.params)} {database?.name} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts index fe3e5cd033..a51bf2e506 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/+layout.ts @@ -1,20 +1,22 @@ -import { sdk } from '$lib/stores/sdk'; -import { Dependencies } from '$lib/constants'; -import type { LayoutLoad } from './$types'; import Header from './header.svelte'; -import { Breadcrumbs, toSupportiveEntity } from '$database/(entity)'; +import type { LayoutLoad } from './$types'; +import { Dependencies } from '$lib/constants'; +import { Breadcrumbs, useDatabasesSdk } from '$database/(entity)'; -export const load: LayoutLoad = async ({ params, depends }) => { +export const load: LayoutLoad = async ({ params, depends, parent }) => { + const { database } = await parent(); depends(Dependencies.TABLE); - const table = await sdk.forProject(params.region, params.project).tablesDB.getTable({ + const databasesSdk = useDatabasesSdk(params.region, params.project, database.type); + + const table = await databasesSdk.getEntity({ databaseId: params.database, - tableId: params.table + entityId: params.table }); return { + table, header: Header, - breadcrumbs: Breadcrumbs, - table: toSupportiveEntity(table) + breadcrumbs: Breadcrumbs }; }; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/relationship.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/relationship.svelte index c604d3e19b..521788af5d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/relationship.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/columns/relationship.svelte @@ -56,19 +56,17 @@ {#if loading} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index 434019808b..c5a75788c1 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -910,7 +910,7 @@ variant="muted" on:click={() => { $databaseRelatedRowSheetOptions.tableId = - row[columnId]?.['tableId']; + row[columnId]?.['$tableId']; $databaseRelatedRowSheetOptions.rows = row[columnId]?.['$id']; $databaseRelatedRowSheetOptions.show = true; From 7c4c256104ca4524b46c82cc1c1b4572ba0fa894 Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 13 Oct 2025 10:28:24 +0530 Subject: [PATCH 46/48] address: pending todo. --- .../databases/+page.svelte | 47 ++++++------ .../databases/+page.ts | 23 +++--- .../databases/breadcrumbs.svelte | 40 ++++++----- .../(entity)/helpers/sdk.ts | 71 +++++++++++++------ .../(entity)/helpers/terminology.ts | 22 ++++-- .../database-[database]/subNavigation.svelte | 9 ++- .../databases/table.svelte | 38 +++++++--- 7 files changed, 157 insertions(+), 93 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/+page.svelte index e95c01ccae..6044cf62f6 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/+page.svelte @@ -1,48 +1,53 @@ @@ -74,7 +79,7 @@ {:else if data.search} diff --git a/src/routes/(console)/project-[region]-[project]/databases/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/+page.ts index 0d36bb17ba..2618891ff2 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/+page.ts @@ -8,6 +8,7 @@ import type { BackupPolicy } from '$lib/sdk/backups'; import { isSelfHosted } from '$lib/system'; import { isCloud } from '$lib/system'; import type { Plan } from '$lib/sdk/billing'; +import { useDatabasesSdk } from '$database/(entity)'; export const load: PageLoad = async ({ url, route, depends, params, parent }) => { depends(Dependencies.DATABASES); @@ -21,7 +22,7 @@ export const load: PageLoad = async ({ url, route, depends, params, parent }) => // already loaded by parent. const { currentPlan } = await parent(); - const { databases, tables, policies, lastBackups } = await fetchDatabasesAndBackups( + const { databases, entities, policies, lastBackups } = await fetchDatabasesAndBackups( limit, offset, params, @@ -34,7 +35,7 @@ export const load: PageLoad = async ({ url, route, depends, params, parent }) => limit, view, search, - tables, + entities, policies, databases, lastBackups @@ -50,26 +51,24 @@ async function fetchDatabasesAndBackups( ) { const backupsEnabled = currentPlan?.backupsEnabled ?? true; - const projectSDK = sdk.forProject(params.region, params.project); - - // TODO: make use of `useDatabasesSdk`; - const databases = await projectSDK.tablesDB.list({ + const databasesSdk = useDatabasesSdk(params.region, params.project); + const databases = await databasesSdk.list({ queries: [Query.limit(limit), Query.offset(offset), Query.orderDesc('$createdAt')], search: search || undefined }); - const tables: Record = {}; + const entities: Record = {}; await Promise.all( // TODO: backend should allow `Query.select` for perf! - // TODO: make use of `useDatabasesSdk`; - databases.databases.map(async ({ $id }) => { - const res = await projectSDK.tablesDB.listTables({ + databases.databases.map(async ({ $id, type }) => { + const res = await databasesSdk.listEntities({ databaseId: $id, + databaseType: type, queries: [Query.limit(1), Query.orderDesc('')] }); - tables[$id] = res.tables?.[0]?.$id ?? null; + entities[$id] = res.entities?.[0]?.$id ?? null; }) ); @@ -82,7 +81,7 @@ async function fetchDatabasesAndBackups( ]); } - return { databases, tables, policies, lastBackups }; + return { databases, entities, policies, lastBackups }; } async function fetchPolicies(databases: Models.DatabaseList, params: RouteParams) { diff --git a/src/routes/(console)/project-[region]-[project]/databases/breadcrumbs.svelte b/src/routes/(console)/project-[region]-[project]/databases/breadcrumbs.svelte index 056141e765..4202af6079 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/breadcrumbs.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/breadcrumbs.svelte @@ -1,24 +1,30 @@ diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts index 7d7126b8ef..54220872ac 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/sdk.ts @@ -2,21 +2,28 @@ import { sdk } from '$lib/stores/sdk'; import type { Page } from '@sveltejs/kit'; import type { TerminologyResult } from './types'; import { type DatabaseType, type Entity, type EntityList, toSupportiveEntity } from './terminology'; +import type { Models } from '@appwrite.io/console'; export type DatabaseSdkResult = { - getEntity: (params: { databaseId: string; entityId: string }) => Promise; + list: (params: { queries?: string[]; search?: string }) => Promise; + getEntity: (params: { + databaseId: string; + entityId: string; + databaseType?: DatabaseType; + }) => Promise; listEntities: (params: { databaseId: string; queries?: string[]; search?: string; + databaseType?: DatabaseType; }) => Promise; - delete: (params: { databaseId: string }) => Promise<{}>; + delete: (params: { databaseId: string; databaseType?: DatabaseType }) => Promise<{}>; }; export function useDatabasesSdk( regionOrPage: string | Page, projectOrTerminology: string | TerminologyResult, - databaseType?: DatabaseType + databaseType?: DatabaseType /* nullable for use at top `databases` level */ ): DatabaseSdkResult { let region: string; let project: string; @@ -35,22 +42,34 @@ export function useDatabasesSdk( const baseSdk = sdk.forProject(region, project); return { - async getEntity(params) { - switch (type) { + async list(params): Promise { + const results = await Promise.all([ + baseSdk.tablesDB.list(params) + + // not available just yet! + // baseSdk.documentsDB.list(params), + ]); + + return results.reduce( + (acc, curr) => ({ + total: acc.total + curr.total, + databases: [...acc.databases, ...curr.databases] + }), + { total: 0, databases: [] as Models.Database[] } + ); + }, + + async listEntities(params) { + switch (type ?? params.databaseType) { case 'legacy': /* databases api */ case 'tablesdb': { - const table = await baseSdk.tablesDB.getTable({ - databaseId: params.databaseId, - tableId: params.entityId - }); - return toSupportiveEntity(table); + const { total, tables } = await baseSdk.tablesDB.listTables(params); + return { total, entities: tables.map(toSupportiveEntity) }; } case 'documentsdb': { - const table = await baseSdk.documentsDB.getCollection({ - databaseId: params.databaseId, - collectionId: params.entityId - }); - return toSupportiveEntity(table); + const { total, collections } = + await baseSdk.documentsDB.listCollections(params); + return { total, entities: collections.map(toSupportiveEntity) }; } case 'vectordb': throw new Error(`Database type not supported yet`); @@ -58,17 +77,23 @@ export function useDatabasesSdk( throw new Error(`Unknown database type`); } }, - async listEntities(params) { - switch (type) { + + async getEntity(params) { + switch (type ?? params.databaseType) { case 'legacy': /* databases api */ case 'tablesdb': { - const { total, tables } = await baseSdk.tablesDB.listTables(params); - return { total, entities: tables.map(toSupportiveEntity) }; + const table = await baseSdk.tablesDB.getTable({ + databaseId: params.databaseId, + tableId: params.entityId + }); + return toSupportiveEntity(table); } case 'documentsdb': { - const { total, collections } = - await baseSdk.documentsDB.listCollections(params); - return { total, entities: collections.map(toSupportiveEntity) }; + const table = await baseSdk.documentsDB.getCollection({ + databaseId: params.databaseId, + collectionId: params.entityId + }); + return toSupportiveEntity(table); } case 'vectordb': throw new Error(`Database type not supported yet`); @@ -78,7 +103,7 @@ export function useDatabasesSdk( }, async delete(params) { - switch (type) { + switch (type ?? params.databaseType) { case 'legacy': /* databases api */ case 'tablesdb': return await baseSdk.tablesDB.delete(params); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts index 29a77c2019..6fff779c4e 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/(entity)/helpers/terminology.ts @@ -25,6 +25,16 @@ export type EntityList = { }; export const baseTerminology = { + /** + * this is no longer used on console so + * we don't really show old terminology for older databases and, + * therefore we use the new routes, terms and sdk for these databases. + */ + legacy: { + entity: 'table', + field: 'column', + record: 'row' + }, tablesdb: { entity: 'table', field: 'column', @@ -35,11 +45,6 @@ export const baseTerminology = { field: 'attribute', record: 'document' }, - legacy: { - entity: 'collection', - field: 'attribute', - record: 'document' - }, vectordb: {} } as const; @@ -101,8 +106,11 @@ export function toRelationalField(raw: Field): Columns { * @internal * Use `getTerminologies()` instead when in `database-[database]` routes where context is available. */ -export function useTerminology(page: Page): TerminologyResult { - const type = page.data?.database?.type as DatabaseType; +export function useTerminology(pageOrType: Page | DatabaseType): TerminologyResult { + const type = + typeof pageOrType === 'object' + ? (pageOrType.data?.database?.type as DatabaseType) + : pageOrType; if (!type) { // strict check because this should always be available! throw new AppwriteException('Database type is required', 500); diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte index e738cc0666..9ae9b9850d 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte @@ -41,8 +41,8 @@ const terminology = useTerminology(page); const databasesSdk = useDatabasesSdk(page, terminology); - const entityTypePlural = $derived(terminology.entity.lower.plural); - const entityTypeSingular = $derived(terminology.entity.lower.singular); + const entityTypePlural = terminology.entity.lower.plural; + const entityTypeSingular = terminology.entity.lower.singular; const entityId = $derived(page.params[entityTypeSingular]); @@ -114,7 +114,10 @@ {@const isFirst = index === 0} {@const isSelected = entityId === entity.$id} {@const isLast = index === sortedEntities.length - 1} - {@const href = buildEntityRoute(page, entityTypeSingular, entity.$id)} + {@const href = withPath( + databaseBaseRoute, + `/${entityTypeSingular}-${entityId}` + )}
  • - import { base } from '$app/paths'; import { page } from '$app/state'; + import { columns } from './store'; import { Id } from '$lib/components'; + import type { PageData } from './$types'; + import type { Models } from '@appwrite.io/console'; + import { useTerminology } from '$database/(entity)'; import { toLocaleDateTime } from '$lib/helpers/date'; - import { columns } from './store'; + import type { BackupPolicy } from '$lib/sdk/backups'; + import { resolveRoute, withPath } from '$lib/stores/navigation'; import { IconExclamation } from '@appwrite.io/pink-icons-svelte'; import { Layout, Tooltip, Table, Icon } from '@appwrite.io/pink-svelte'; - import type { BackupPolicy } from '$lib/sdk/backups'; - export let data; - const tables = data.tables; + const { + data + }: { + data: PageData; + } = $props(); function getPolicyDescription(cron: string): string { const [minute, hour, dayOfMonth, , dayOfWeek] = cron.split(' '); @@ -19,6 +25,19 @@ if (minute !== '*' && hour === '*') return 'Hourly'; if (hour !== '*') return 'Daily'; } + + function getEntityUrl(database: Models.Database, entityId: string) { + const terminology = useTerminology(database.type); + const entityType = terminology.entity.lower.singular; + + return withPath( + resolveRoute('/(console)/project-[region]-[project]/databases/database-[database]', { + ...page.params, + database: database.$id + }), + entityId ? `/${entityType}-${entityId}` : '' + ); + } @@ -27,13 +46,12 @@ {title} {/each} + + {@const entities = data.entities} {#each data.databases.databases as database (database.$id)} - {@const tableId = tables[database?.$id] ?? null} - {@const tableHref = tableId ? `/table-${tableId}` : ''} - + {@const entityId = entities[database?.$id] ?? null} + {#each $columns as column} {#if column.id === '$id'} From 83a887001e58979a9f765d0459233520db1b9bac Mon Sep 17 00:00:00 2001 From: Darshan Date: Mon, 13 Oct 2025 10:38:31 +0530 Subject: [PATCH 47/48] address rabbits comment. --- .../overview/onboard.svelte | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte b/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte index c1c3811e4b..c3e539d4a5 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/onboard.svelte @@ -39,6 +39,7 @@ import { Click, trackEvent } from '$lib/actions/analytics'; import { goto } from '$app/navigation'; import { page } from '$app/state'; + import { Platform } from './platforms/+page.svelte'; function createKey() { trackEvent(Click.KeyCreateClick, { @@ -52,10 +53,10 @@ ); } - export let platforms: Models.Platform[] = []; export let pingCount = 0; + export let platforms: Models.Platform[] = []; - function openPlatformWizard(type: number, platform?: Models.Platform) { + function openPlatformWizard(type: Platform, platform?: Models.Platform) { if (platform) { continuePlatform(type, platform.name, platform.key, platform.type); } else { @@ -106,7 +107,10 @@ { - openPlatformWizard(0, platformMap.get('Web')); + openPlatformWizard( + Platform.Web, + platformMap.get('Web') + ); }} padding="s" > { - openPlatformWizard(4, platformMap.get('React Native')); + openPlatformWizard( + Platform.ReactNative, + platformMap.get('React Native') + ); }} padding="s" > { - openPlatformWizard(3, platformMap.get('Apple')); + openPlatformWizard( + Platform.Apple, + platformMap.get('Apple') + ); }} padding="s"> { - openPlatformWizard(2, platformMap.get('Android')); + openPlatformWizard( + Platform.Android, + platformMap.get('Android') + ); }} padding="s"> { - openPlatformWizard(1, platformMap.get('Flutter')); + openPlatformWizard( + Platform.Flutter, + platformMap.get('Flutter') + ); }} padding="s"> Date: Mon, 13 Oct 2025 10:43:28 +0530 Subject: [PATCH 48/48] address rabbits comment. --- .../databases/database-[database]/subNavigation.svelte | 2 +- .../database-[database]/table-[table]/spreadsheet.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte index 9ae9b9850d..abb6203d21 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/subNavigation.svelte @@ -116,7 +116,7 @@ {@const isLast = index === sortedEntities.length - 1} {@const href = withPath( databaseBaseRoute, - `/${entityTypeSingular}-${entityId}` + `/${entityTypeSingular}-${entity.$id}` )} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte index c5a75788c1..95d946eeed 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/table-[table]/spreadsheet.svelte @@ -375,7 +375,7 @@ }); } else { if (selectedRows.length) { - const hasAnyRelationships = table.fields.some(isRelationship); + const hasAnyRelationships = table.fields.some(isRelationship) ?? false; const tablesSDK = sdk.forProject( page.params.region,