From d28a5e6795cf8be718d09f028cd4704fad7d691e Mon Sep 17 00:00:00 2001 From: Darshan Date: Thu, 15 Jan 2026 16:54:48 +0530 Subject: [PATCH] Merge branch '8.x' into 'feat-documentsdb'. --- src/lib/components/columnSelector.svelte | 39 +++++- src/lib/components/viewSelector.svelte | 5 +- src/lib/helpers/types.ts | 1 + .../(components)/customColumnsEditor.svelte | 76 +++++++++++ .../collection-[collection]/+page.svelte | 128 ++++++++++++++---- .../settings/displayName.svelte | 88 ++++-------- .../spreadsheet.svelte | 11 +- 7 files changed, 246 insertions(+), 102 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/customColumnsEditor.svelte diff --git a/src/lib/components/columnSelector.svelte b/src/lib/components/columnSelector.svelte index 506735df3..9bb6c23c0 100644 --- a/src/lib/components/columnSelector.svelte +++ b/src/lib/components/columnSelector.svelte @@ -10,8 +10,10 @@ Layout, Popover, Selector, - Typography + Typography, + Icon } from '@appwrite.io/pink-svelte'; + import { IconPlus } from '@appwrite.io/pink-icons-svelte'; import { Button } from '$lib/elements/forms'; let { @@ -21,7 +23,8 @@ allowNoColumns = false, showAnyway = false, children, - onPreferencesUpdated = null + onPreferencesUpdated = null, + onCustomOptionClick = null }: { columns: Writable; isCustomTable?: boolean; @@ -30,6 +33,7 @@ showAnyway?: boolean; children: Snippet<[toggle: () => void, selectedColumnsNumber: number]>; onPreferencesUpdated?: () => void; + onCustomOptionClick?: () => void; } = $props(); let search = $state(''); @@ -115,7 +119,7 @@ cols.map((col) => col.exclude ? col - : filteredColumns.some((fc) => fc.id === col.id) + : filteredColumns.some((fc) => fc.id === col.id && !col.disable) ? { ...col, hide: false } : col ) @@ -126,7 +130,9 @@ function deselectAll() { columns.update((cols) => { const realColumns = cols.filter((col) => !col.exclude && !col.isAction); - const filtered = filteredColumns.filter((col) => !col.exclude && !col.isAction); + const filtered = filteredColumns.filter( + (col) => !col.exclude && !col.isAction && !col.disable + ); if (filtered.length === 0) return cols; @@ -187,7 +193,7 @@ {@const placement = isNewStyle ? 'bottom-start' : 'bottom-end'} {@render children(toggle, selectedColumnsNumber)} - +
{#if isNewStyle && showActions} @@ -231,7 +237,8 @@ on:click={() => toggleColumn(column)} disabled={allowNoColumns ? false - : visibleRealColumns.length <= 1 && !column.hide}> + : (visibleRealColumns.length <= 1 && !column.hide) || + column.disable}> + + {#if onCustomOptionClick && isCustomTable} + + + + + {/if}
diff --git a/src/lib/components/viewSelector.svelte b/src/lib/components/viewSelector.svelte index e20b8ca1f..ec2be986f 100644 --- a/src/lib/components/viewSelector.svelte +++ b/src/lib/components/viewSelector.svelte @@ -22,6 +22,7 @@ allowNoColumns?: boolean; showAnyway?: boolean; disableButton?: boolean; + onCustomOptionClick?: () => void; } let { @@ -34,7 +35,8 @@ hideColumns = false, allowNoColumns = false, showAnyway = false, - disableButton = false + disableButton = false, + onCustomOptionClick = null }: Props = $props(); let showCountBadge = $state(false); @@ -65,6 +67,7 @@ {showAnyway} {isCustomTable} {allowNoColumns} + {onCustomOptionClick} onPreferencesUpdated={updateBadgeState}> {#snippet children(toggle, selectedColumnsNumber)} + import { InputTags } from '$lib/elements/forms'; + import { symmetricDifference } from '$lib/helpers/array'; + import { preferences } from '$lib/stores/preferences'; + import { Input, Layout } from '@appwrite.io/pink-svelte'; + import { organization } from '$lib/stores/organization'; + + let { + collectionId, + databaseType, + inModal = false, + onSuccess = null, + onFailure = null + }: { + collectionId: string; + databaseType: string; + inModal?: boolean; + onSuccess?: () => Promise | void; + onFailure?: (error: Error) => Promise | void; + } = $props(); + + let names = $state(getDisplayNames()); + + const isDisabled = $derived( + !symmetricDifference(names, getDisplayNames()).length || names.length > 5 + ); + + function getDisplayNames() { + const displayNames = preferences.getDisplayNames(collectionId, databaseType) ?? []; + return displayNames.filter((name) => !name.startsWith('$')); + } + + export function hasChanged() { + return isDisabled; + } + + export async function updateDisplayNames() { + try { + const regularArray = [...names]; + + await preferences.setDisplayNames( + $organization.$id, + collectionId, + regularArray, + databaseType + ); + + await onSuccess?.(); + + // reset with new values! + names = getDisplayNames(); + } catch (error) { + await onFailure?.(error); + } + } + + $effect(() => { + names = getDisplayNames(); + }); + + + + + {#key names.length} + + {/key} + + + ID, createdAt, and updatedAt are always included and cannot be modified + + + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte index 6ca6d18a6..9514fc1ad 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/+page.svelte @@ -1,9 +1,10 @@ -
+ { + await customColumnsEditor?.updateDisplayNames(); + }}> Display name Add up to 5 document fields to display as columns in the collection view. - - {#key names.length} - - {/key} - - ID, createdAt, and updatedAt are always included and cannot be modified - - + { + await invalidate(Dependencies.TEAM); + addNotification({ + message: 'Display names have been updated', + type: 'success' + }); + trackEvent(Submit.CollectionUpdateDisplayNames); + }} + onFailure={(error) => { + addNotification({ + message: error.message, + type: 'error' + }); + trackError(error, Submit.CollectionUpdateDisplayNames); + }} /> - +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/spreadsheet.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/spreadsheet.svelte index 9c2da79e2..e0b3b6903 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/spreadsheet.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/spreadsheet.svelte @@ -171,7 +171,7 @@ type: 'dynamic', icon: IconCode /* fuzzy search based Icon later */, isEditable: false, - hide: false + hide: !!selectedColumnsToHide?.includes(key) })); const staticColumns: Column[] = [ @@ -185,7 +185,8 @@ icon: IconFingerPrint, isEditable: false, isPrimary: false, - hide: !!selectedColumnsToHide?.includes('$id') + hide: false, + disable: true }, ...customColumns, { @@ -197,7 +198,8 @@ type: 'datetime', icon: IconCalendar, isEditable: false, - hide: !!selectedColumnsToHide?.includes('$createdAt') + hide: false, + disable: true }, { id: '$updatedAt', @@ -208,7 +210,8 @@ type: 'datetime', icon: IconCalendar, isEditable: false, - hide: !!selectedColumnsToHide?.includes('$updatedAt') + hide: false, + disable: true }, { id: 'actions',