From be9e781de7be122d7e5ee95d23b447807d14cd30 Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 3 Jul 2025 13:21:58 +0530 Subject: [PATCH 1/4] add: lazy loading relationship support. --- .../collection-[collection]/+page.ts | 9 +++++++-- .../document-[document]/+layout.ts | 10 ++++++++-- .../attributes/relationship.svelte | 9 +++++---- .../document-[document]/attributes/store.ts | 17 ++++++++++++++++- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.ts index 107d096f6..6d7d7530c 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.ts @@ -4,9 +4,12 @@ import { sdk } from '$lib/stores/sdk'; import { Query } from '@appwrite.io/console'; import type { PageLoad } from './$types'; import { queries, queryParamToMap } from '$lib/components/filters'; +import { buildWildcardAttributesQuery } from './document-[document]/attributes/store'; -export const load: PageLoad = async ({ params, depends, url, route }) => { +export const load: PageLoad = async ({ params, depends, url, route, parent }) => { + const { collection } = await parent(); depends(Dependencies.DOCUMENTS); + const page = getPage(url); const limit = getLimit(url, route, PAGE_LIMIT); const view = getView(url, route, View.Grid); @@ -15,6 +18,7 @@ export const load: PageLoad = async ({ params, depends, url, route }) => { const paramQueries = url.searchParams.get('query'); const parsedQueries = queryParamToMap(paramQueries || '[]'); + queries.set(parsedQueries); return { @@ -28,7 +32,8 @@ export const load: PageLoad = async ({ params, depends, url, route }) => { Query.limit(limit), Query.offset(offset), Query.orderDesc(''), - ...parsedQueries.values() + ...parsedQueries.values(), + ...buildWildcardAttributesQuery(collection) ]) }; }; diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts index 0c83436f4..5e9479dc0 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/+layout.ts @@ -4,14 +4,20 @@ import type { LayoutLoad } from './$types'; import Breadcrumbs from './breadcrumbs.svelte'; import Header from './header.svelte'; import type { Attributes } from '../store'; +import { buildWildcardAttributesQuery } from './attributes/store'; export const load: LayoutLoad = async ({ params, parent, depends }) => { - depends(Dependencies.DOCUMENT); const { collection } = await parent(); + depends(Dependencies.DOCUMENT); const document = await sdk .forProject(params.region, params.project) - .databases.getDocument(params.database, params.collection, params.document); + .databases.getDocument( + params.database, + params.collection, + params.document, + buildWildcardAttributesQuery(collection) + ); /** * Sanitize DateTime to remove UTC Timezone section. diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/relationship.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/relationship.svelte index e63977b1b..0b5e826d3 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/relationship.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/relationship.svelte @@ -39,8 +39,6 @@ } } - documentList = await getDocuments(); - if (editing && $doc?.[attribute.key]) { if ($doc[attribute.key]?.length) { relatedList = @@ -59,7 +57,10 @@ }); async function getDocuments(search: string = null) { - const queries = search ? [Query.startsWith('$id', search), Query.orderDesc('')] : []; + const queries = search + ? [Query.select(['$id']), Query.startsWith('$id', search), Query.orderDesc('')] + : [Query.select(['$id'])]; + return await sdk .forProject(page.params.region, page.params.project) .databases.listDocuments(databaseId, attribute.relatedCollection, queries); @@ -103,7 +104,7 @@ showInput = false; } - //Reactive statements + // Reactive statements $: getDocuments(search).then((res) => (documentList = res)); $: paginatedItems = editing diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/store.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/store.ts index 3fb3c64de..a599246c4 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/store.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/store.ts @@ -1,4 +1,4 @@ -import type { Models } from '@appwrite.io/console'; +import { type Models, Query } from '@appwrite.io/console'; import type { Attributes } from '../../store'; export function isRelationshipToMany(attribute: Models.AttributeRelationship) { @@ -20,3 +20,18 @@ export function isString(attribute: Attributes): attribute is Models.AttributeSt if (!attribute) return false; return attribute?.type === 'string'; } + +/** + * Returns select queries for all main and related fields in a collection. + */ +export function buildWildcardAttributesQuery( + collection: Models.Collection | null = null +): string[] { + return [ + ...(collection?.attributes + ?.filter((attr) => isRelationship(attr)) + ?.map((attr) => Query.select([`${attr.key}.*`])) ?? []), + + Query.select(['*']) + ]; +} From fea2aaebca477c52db66472b63446a7c9b32f8cd Mon Sep 17 00:00:00 2001 From: Darshan Date: Tue, 8 Jul 2025 18:35:19 +0530 Subject: [PATCH 2/4] fix: display name checks. --- .../collection-[collection]/relationshipsModal.svelte | 10 +++++++--- .../settings/displayName.svelte | 4 +++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/relationshipsModal.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/relationshipsModal.svelte index 843644ccb..ed42e78a2 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/relationshipsModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/relationshipsModal.svelte @@ -23,7 +23,11 @@ selectedRelationship = null; } - $: tableColumns = [{ id: '$id', width: 200 }, ...args.map((id) => ({ id }))]; + $: tableColumns = [ + // take full width if no display names set + { id: '$id', width: args.length ? 200 : undefined }, + ...args.map((id) => ({ id })) + ]; @@ -33,7 +37,7 @@ Document ID - {#if args?.length} + {#if args.length} {#each args as arg} {arg} {/each} @@ -47,7 +51,7 @@ {doc.$id} - {#if args?.length} + {#if args.length} {#each args as arg} {doc[arg]} {/each} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte index 46b972b03..e4d909525 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/settings/displayName.svelte @@ -73,7 +73,9 @@ (names?.length && !last(names)) ); - const hasExhaustedOptions = $derived(getValidAttributes().length === names?.length); + const hasExhaustedOptions = $derived( + getValidAttributes().length === names.filter(Boolean).length + );
From 151b8f4e4da57c6816e64e56061f2a5fdd668b1d Mon Sep 17 00:00:00 2001 From: Darshan Date: Fri, 18 Jul 2025 15:11:02 +0530 Subject: [PATCH 3/4] fix: the nullable type on inputs. --- .../document-[document]/attributes/email.svelte | 2 +- .../document-[document]/attributes/integer.svelte | 2 +- .../document-[document]/attributes/string.svelte | 2 +- .../document-[document]/attributes/url.svelte | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte index cf93d4b5f..e5dc10095 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte @@ -7,7 +7,7 @@ export let value: string | null; export let attribute: Models.AttributeUrl; - $: nullable = attribute.required ? false : !value; + $: nullable = !attribute.required; {#if attribute.size >= 50} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte index d8c74bca7..5ddcdaf44 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte @@ -7,7 +7,7 @@ export let value: string | null; export let attribute: Models.AttributeUrl; - $: nullable = attribute.required ? false : !value; + $: nullable = !attribute.required; Date: Fri, 18 Jul 2025 15:17:33 +0530 Subject: [PATCH 4/4] update: inline the nullable prop value. --- .../document-[document]/attributes/boolean.svelte | 4 ++-- .../document-[document]/attributes/email.svelte | 6 ++---- .../document-[document]/attributes/integer.svelte | 10 ++++------ .../document-[document]/attributes/string.svelte | 14 ++++++-------- .../document-[document]/attributes/url.svelte | 6 ++---- 5 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte index a25e6f4c1..7be1202e2 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/boolean.svelte @@ -12,6 +12,7 @@ + ].filter(Boolean)} /> diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte index e5dc10095..5d7b9989f 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/email.svelte @@ -6,14 +6,12 @@ export let label: string; export let value: string | null; export let attribute: Models.AttributeUrl; - - $: nullable = !attribute.required; + nullable={!attribute.required} /> diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/integer.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/integer.svelte index 356930f99..a0725df98 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/integer.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/integer.svelte @@ -6,16 +6,14 @@ export let label: string; export let value: number; export let attribute: Models.AttributeInteger; - - $: nullable = !attribute.required; + required={attribute.required} + nullable={!attribute.required} + step={attribute.type === 'double' ? 'any' : 1} /> diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/string.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/string.svelte index c062f857e..901555a9b 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/string.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/string.svelte @@ -6,26 +6,24 @@ export let label: string; export let value: string; export let attribute: Models.AttributeString; - - $: nullable = !attribute.required; {#if attribute.size >= 50} + required={attribute.required} + nullable={!attribute.required} /> {:else} + required={attribute.required} + nullable={!attribute.required} /> {/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte index 5ddcdaf44..9a035a067 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/document-[document]/attributes/url.svelte @@ -6,14 +6,12 @@ export let label: string; export let value: string | null; export let attribute: Models.AttributeUrl; - - $: nullable = !attribute.required; + nullable={!attribute.required} />