asset-selection.svelte 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <script lang="ts">
  2. import {
  3. assetInteractionStore,
  4. assetsInAlbumStoreState,
  5. selectedAssets
  6. } from '$lib/stores/asset-interaction.store';
  7. import { locale } from '$lib/stores/preferences.store';
  8. import { openFileUploadDialog } from '$lib/utils/file-uploader';
  9. import type { AssetResponseDto } from '@api';
  10. import { createEventDispatcher, onMount } from 'svelte';
  11. import { quintOut } from 'svelte/easing';
  12. import { fly } from 'svelte/transition';
  13. import Button from '../elements/buttons/button.svelte';
  14. import AssetGrid from '../photos-page/asset-grid.svelte';
  15. import ControlAppBar from '../shared-components/control-app-bar.svelte';
  16. const dispatch = createEventDispatcher();
  17. export let albumId: string;
  18. export let assetsInAlbum: AssetResponseDto[];
  19. onMount(() => {
  20. $assetsInAlbumStoreState = assetsInAlbum;
  21. });
  22. const addSelectedAssets = async () => {
  23. dispatch('create-album', {
  24. assets: Array.from($selectedAssets)
  25. });
  26. assetInteractionStore.clearMultiselect();
  27. };
  28. const handleSelectFromComputerClicked = async () => {
  29. await openFileUploadDialog(albumId, '');
  30. assetInteractionStore.clearMultiselect();
  31. dispatch('go-back');
  32. };
  33. </script>
  34. <section
  35. transition:fly={{ y: 500, duration: 100, easing: quintOut }}
  36. class="absolute top-0 left-0 w-full h-full bg-immich-bg dark:bg-immich-dark-bg z-[9999]"
  37. >
  38. <ControlAppBar
  39. on:close-button-click={() => {
  40. assetInteractionStore.clearMultiselect();
  41. dispatch('go-back');
  42. }}
  43. >
  44. <svelte:fragment slot="leading">
  45. {#if $selectedAssets.size == 0}
  46. <p class="text-lg dark:text-immich-dark-fg">Add to album</p>
  47. {:else}
  48. <p class="text-lg dark:text-immich-dark-fg">
  49. {$selectedAssets.size.toLocaleString($locale)} selected
  50. </p>
  51. {/if}
  52. </svelte:fragment>
  53. <svelte:fragment slot="trailing">
  54. <button
  55. on:click={handleSelectFromComputerClicked}
  56. class="text-immich-primary dark:text-immich-dark-primary text-sm hover:bg-immich-primary/10 dark:hover:bg-immich-dark-primary/25 transition-all px-6 py-2 rounded-lg font-medium"
  57. >
  58. Select from computer
  59. </button>
  60. <Button
  61. size="sm"
  62. rounded="lg"
  63. disabled={$selectedAssets.size === 0}
  64. on:click={addSelectedAssets}
  65. >
  66. Done
  67. </Button>
  68. </svelte:fragment>
  69. </ControlAppBar>
  70. <section class="pt-[100px] pl-[70px] grid h-screen bg-immich-bg dark:bg-immich-dark-bg">
  71. <AssetGrid isAlbumSelectionMode={true} />
  72. </section>
  73. </section>