immich/web/src/lib/components/SchemaAlbumPicker.svelte
Jason Rasmussen 3d075f2bf8
feat: workflows & plugins (#26727)
feat: plugins

chore: better types

feat: plugins
2026-05-18 11:09:33 -04:00

59 lines
1.6 KiB
Svelte

<script lang="ts">
import AlbumThumbnail from '$lib/components/album-page/AlbumThumbnail.svelte';
import { Button, Text, Label, modalManager } from '@immich/ui';
import AlbumPickerModal from '$lib/modals/AlbumPickerModal.svelte';
import { t } from 'svelte-i18n';
type Props = {
label: string;
description?: string;
albumIds: string[];
array?: boolean;
};
let { array, label, description, albumIds = $bindable([]) }: Props = $props();
const onAlbums = async () => {
const albums = await modalManager.show(AlbumPickerModal);
if (!albums || albums.length === 0) {
return;
}
albumIds = array ? [...albumIds, ...albums.map((album) => album.id)] : [albums[0].id];
};
</script>
{#snippet button()}
<Button size="small" shape="round" color="secondary" onclick={() => onAlbums()}>{$t('choose')}</Button>
{/snippet}
<div class="flex flex-col gap-2">
<div class="flex flex-col gap-0.5">
<Label for="album-picker" size="small" class="font-medium" {label} />
{#if description}
<Text color="muted" size="small">{description}</Text>
{/if}
</div>
{#if array}
<div class="flex flex-col gap-2">
{#each albumIds as albumId, i (i)}
<AlbumThumbnail
{albumId}
onDelete={() => {
albumIds.splice(i, 1);
albumIds = [...albumIds];
}}
/>
{/each}
{@render button()}
</div>
{:else}
{@const albumId = albumIds[0]}
{#if albumId}
<AlbumThumbnail {albumId} onDelete={() => (albumIds = [])} />
{:else}
{@render button()}
{/if}
{/if}
</div>