Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
b7e3b48
- pass available album users along to the thumbnail through the asset…
xCJPECKOVERx Aug 22, 2025
104f3df
- change owner to their name in white text instead of the avatar
xCJPECKOVERx Aug 23, 2025
a02635f
cleanup
xCJPECKOVERx Aug 23, 2025
251e644
- cleanup albumUsers creation
xCJPECKOVERx Aug 23, 2025
8896b2d
fix lint
xCJPECKOVERx Aug 23, 2025
d0b4984
format
xCJPECKOVERx Aug 23, 2025
55a196b
Merge branch 'immich-main' into feat/shared-album-owner-labels
xCJPECKOVERx Aug 25, 2025
6e0005a
- add toggle to show/hide asset owner names
xCJPECKOVERx Aug 25, 2025
d227077
Merge branch 'immich-main' into feat/shared-album-owner-labels
xCJPECKOVERx Nov 24, 2025
ff19cd0
update new Timeline with albumUsers
xCJPECKOVERx Nov 24, 2025
c0afde9
add @idubnori suggestion for the name font
xCJPECKOVERx Nov 24, 2025
f353c99
Don't show 'view owners' button if the album doesn't have editors
xCJPECKOVERx Nov 24, 2025
e75d9f5
add missing import
xCJPECKOVERx Nov 24, 2025
b687237
format
xCJPECKOVERx Nov 24, 2025
4c33fbb
Merge branch 'immich-main' into feat/shared-album-owner-labels
xCJPECKOVERx Nov 26, 2025
851baa4
Merge branch 'immich-main' into feat/shared-album-owner-labels
xCJPECKOVERx Nov 28, 2025
49091d6
fix(web): #21171 (#24298)
idubnori Nov 30, 2025
54b7427
Merge branch 'immich-main' into feat/shared-album-owner-labels
xCJPECKOVERx Nov 30, 2025
73fe504
Merge branch 'feat/shared-album-owner-labels' of https://github.com/i…
xCJPECKOVERx Nov 30, 2025
2f82867
Merge branch 'main' into feat/shared-album-owner-labels
alextran1502 Nov 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion web/src/lib/components/assets/thumbnail/thumbnail.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import { getAssetOriginalUrl, getAssetPlaybackUrl, getAssetThumbnailUrl } from '$lib/utils';
import { timeToSeconds } from '$lib/utils/date-time';
import { getAltText } from '$lib/utils/thumbnail-util';
import { AssetMediaSize, AssetVisibility } from '@immich/sdk';
import { AssetMediaSize, AssetVisibility, type UserResponseDto } from '@immich/sdk';
import {
mdiArchiveArrowDownOutline,
mdiCameraBurst,
Expand Down Expand Up @@ -46,6 +46,7 @@
imageClass?: ClassValue;
brokenAssetClass?: ClassValue;
dimmed?: boolean;
albumUsers?: UserResponseDto[];
onClick?: (asset: TimelineAsset) => void;
onSelect?: (asset: TimelineAsset) => void;
onMouseEvent?: (event: { isMouseOver: boolean; selectedGroupIndex: number }) => void;
Expand All @@ -64,6 +65,7 @@
readonly = false,
showArchiveIcon = false,
showStackedIcon = true,
albumUsers = [],
onClick = undefined,
onSelect = undefined,
onMouseEvent = undefined,
Expand All @@ -85,6 +87,8 @@
let width = $derived(thumbnailSize || thumbnailWidth || 235);
let height = $derived(thumbnailSize || thumbnailHeight || 235);

let assetOwner = $derived(albumUsers?.find((user) => user.id === asset.ownerId) ?? null);

const onIconClickedHandler = (e?: MouseEvent) => {
e?.stopPropagation();
e?.preventDefault();
Expand Down Expand Up @@ -268,6 +272,14 @@
</div>
{/if}

{#if !!assetOwner}
<div class="absolute bottom-1 end-2 max-w-[50%]">
<p class="text-xs font-medium text-white drop-shadow-lg max-w-[100%] truncate">
{assetOwner.name}
</p>
</div>
{/if}

{#if !authManager.isSharedLink && showArchiveIcon && asset.visibility === AssetVisibility.Archive}
<div class={['absolute start-2', asset.isFavorite ? 'bottom-10' : 'bottom-2']}>
<Icon data-icon-archive icon={mdiArchiveArrowDownOutline} size="24" class="text-white" />
Expand Down
5 changes: 4 additions & 1 deletion web/src/lib/components/timeline/Timeline.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import { mobileDevice } from '$lib/stores/mobile-device.svelte';
import { isAssetViewerRoute, navigate } from '$lib/utils/navigation';
import { getTimes, type ScrubberListener } from '$lib/utils/timeline-util';
import { type AlbumResponseDto, type PersonResponseDto } from '@immich/sdk';
import { type AlbumResponseDto, type PersonResponseDto, type UserResponseDto } from '@immich/sdk';
import { DateTime } from 'luxon';
import { onDestroy, onMount, type Snippet } from 'svelte';
import type { UpdatePayload } from 'vite';
Expand All @@ -49,6 +49,7 @@
showArchiveIcon?: boolean;
isShared?: boolean;
album?: AlbumResponseDto | null;
albumUsers?: UserResponseDto[];
person?: PersonResponseDto | null;
isShowDeleteConfirmation?: boolean;
onSelect?: (asset: TimelineAsset) => void;
Expand Down Expand Up @@ -81,6 +82,7 @@
showArchiveIcon = false,
isShared = false,
album = null,
albumUsers = [],
person = null,
isShowDeleteConfirmation = $bindable(false),
onSelect = () => {},
Expand Down Expand Up @@ -702,6 +704,7 @@
showStackedIcon={withStacked}
{showArchiveIcon}
{asset}
{albumUsers}
{groupIndex}
onClick={(asset) => {
if (typeof onThumbnailClick === 'function') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
} from '@immich/sdk';
import { Button, Icon, IconButton, modalManager, toastManager } from '@immich/ui';
import {
mdiAccountEyeOutline,
mdiArrowLeft,
mdiCogOutline,
mdiDeleteOutline,
Expand Down Expand Up @@ -100,6 +101,7 @@
let isCreatingSharedAlbum = $state(false);
let isShowActivity = $state(false);
let albumOrder: AssetOrder | undefined = $state(data.album.order);
let showAlbumUsers = $state(false);

const assetInteraction = new AssetInteraction();
const timelineInteraction = new AssetInteraction();
Expand Down Expand Up @@ -290,6 +292,11 @@
let album = $derived(data.album);
let albumId = $derived(album.id);

const containsEditors = $derived(album?.shared && album.albumUsers.some(({ role }) => role === AlbumUserRole.Editor));
const albumUsers = $derived(
showAlbumUsers && containsEditors ? [album.owner, ...album.albumUsers.map(({ user }) => user)] : [],
);

$effect(() => {
if (!album.isActivityEnabled && activityManager.commentCount === 0) {
isShowActivity = false;
Expand Down Expand Up @@ -418,6 +425,7 @@
<Timeline
enableRouting={viewMode === AlbumPageViewMode.SELECT_ASSETS ? false : true}
{album}
{albumUsers}
bind:timelineManager
{options}
assetInteraction={currentAssetIntersection}
Expand Down Expand Up @@ -597,6 +605,17 @@
{#snippet trailing()}
<CastButton />

{#if containsEditors}
<IconButton
variant="ghost"
shape="round"
color="secondary"
aria-label="view asset owners"
icon={mdiAccountEyeOutline}
onclick={() => (showAlbumUsers = !showAlbumUsers)}
/>
{/if}

{#if isEditor}
<IconButton
variant="ghost"
Expand Down
Loading