From 09791092dac03bf166e6b8d2e07131bec5f2bbf3 Mon Sep 17 00:00:00 2001 From: Alex Tran Date: Sat, 2 May 2026 15:43:12 -0500 Subject: [PATCH] feat: toggle show in timeline in partner's page --- .../[[assetId=id]]/+page.svelte | 23 +++++++++++++++++-- .../[[photos=photos]]/[[assetId=id]]/+page.ts | 9 ++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte index 6cb60bafbe..219f93f997 100644 --- a/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte +++ b/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.svelte @@ -8,8 +8,9 @@ import { assetMultiSelectManager } from '$lib/managers/asset-multi-select-manager.svelte'; import { Route } from '$lib/route'; import { getAssetBulkActions } from '$lib/services/asset.service'; - import { AssetVisibility } from '@immich/sdk'; - import { ActionButton, CommandPaletteDefaultProvider } from '@immich/ui'; + import { handleError } from '$lib/utils/handle-error'; + import { AssetVisibility, updatePartner } from '@immich/sdk'; + import { ActionButton, CommandPaletteDefaultProvider, Switch } from '@immich/ui'; import { mdiArrowLeft } from '@mdi/js'; import { t } from 'svelte-i18n'; import type { PageData } from './$types'; @@ -20,6 +21,8 @@ let { data }: Props = $props(); + let inTimeline = $derived(data.inTimeline); + const options = $derived({ userId: data.partner.id, visibility: AssetVisibility.Timeline, @@ -32,6 +35,16 @@ return; } }; + + const handleToggleInTimeline = async (status: boolean) => { + try { + await updatePartner({ id: data.partner.id, partnerUpdateDto: { inTimeline: status } }); + inTimeline = status; + } catch (error) { + handleError(error, $t('errors.unable_to_update_timeline_display_status')); + inTimeline = !status; + } + };
@@ -53,5 +66,11 @@ {$t('partner_list_user_photos', { values: { user: data.partner.name } })}

{/snippet} + {#snippet trailing()} + + {/snippet} {/if} diff --git a/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.ts b/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.ts index 3ba90a3d04..f5b78b64e8 100644 --- a/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.ts +++ b/web/src/routes/(user)/partners/[userId]/[[photos=photos]]/[[assetId=id]]/+page.ts @@ -1,4 +1,4 @@ -import { getUser } from '@immich/sdk'; +import { getPartners, getUser, PartnerDirection } from '@immich/sdk'; import { authenticate } from '$lib/utils/auth'; import { getFormatter } from '$lib/utils/i18n'; import type { PageLoad } from './$types'; @@ -6,11 +6,16 @@ import type { PageLoad } from './$types'; export const load = (async ({ params, url }) => { await authenticate(url); - const partner = await getUser({ id: params.userId }); + const [partner, sharedWith] = await Promise.all([ + getUser({ id: params.userId }), + getPartners({ direction: PartnerDirection.SharedWith }), + ]); + const inTimeline = sharedWith.find((p) => p.id === params.userId)?.inTimeline ?? false; const $t = await getFormatter(); return { partner, + inTimeline, meta: { title: $t('partner'), },