diff --git a/i18n/en.json b/i18n/en.json index 5903d7850e..75d5f1dd62 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -721,6 +721,7 @@ "check_logs": "Check Logs", "checksum": "Checksum", "choose_matching_people_to_merge": "Choose matching people to merge", + "choose_people_to_unselect": "Choose people to unselect", "city": "City", "clear": "Clear", "clear_all": "Clear all", @@ -1401,7 +1402,6 @@ "menu": "Menu", "merge": "Merge", "merge_people": "Merge people", - "merge_people_limit": "You can only merge up to 5 faces at a time", "merge_people_prompt": "Do you want to merge these people? This action is irreversible.", "merge_people_successfully": "Merge people successfully", "merged_people_count": "Merged {count, plural, one {# person} other {# people}}", @@ -1854,6 +1854,7 @@ "selected": "Selected", "selected_count": "{count, plural, other {# selected}}", "selected_gps_coordinates": "Selected GPS Coordinates", + "selected_people_to_merge": "Selected people to merge", "send_message": "Send message", "send_welcome_email": "Send welcome email", "server_endpoint": "Server Endpoint", @@ -1970,6 +1971,7 @@ "show_album_options": "Show album options", "show_albums": "Show albums", "show_all_people": "Show all people", + "show_all_selected_people": "Show all selected people", "show_and_hide_people": "Show & hide people", "show_file_location": "Show file location", "show_gallery": "Show gallery", diff --git a/web/src/lib/components/faces-page/merge-face-selector.svelte b/web/src/lib/components/faces-page/merge-face-selector.svelte index efec16173b..92ecfb8f77 100644 --- a/web/src/lib/components/faces-page/merge-face-selector.svelte +++ b/web/src/lib/components/faces-page/merge-face-selector.svelte @@ -5,7 +5,7 @@ import { handleError } from '$lib/utils/handle-error'; import { getAllPeople, getPerson, mergePerson, type PersonResponseDto } from '@immich/sdk'; import { Button, Icon, IconButton, modalManager, toastManager } from '@immich/ui'; - import { mdiCallMerge, mdiMerge, mdiSwapHorizontal } from '@mdi/js'; + import { mdiCallMerge, mdiMerge, mdiPlus, mdiSwapHorizontal } from '@mdi/js'; import { onMount } from 'svelte'; import { t } from 'svelte-i18n'; import { flip } from 'svelte/animate'; @@ -14,6 +14,7 @@ import ControlAppBar from '../shared-components/control-app-bar.svelte'; import FaceThumbnail from './face-thumbnail.svelte'; import PeopleList from './people-list.svelte'; + import PeopleViewModal from "$lib/modals/PeopleViewModal.svelte"; interface Props { person: PersonResponseDto; @@ -49,11 +50,6 @@ return; } - if (selectedPeople.length >= 5) { - toastManager.warning($t('merge_people_limit')); - return; - } - selectedPeople = [selected, ...selectedPeople]; if (selectedPeople.length === 1 && !person.name && selected.name) { @@ -80,6 +76,15 @@ handleError(error, $t('cannot_merge_people')); } }; + + const showPeopleViewModal = async () => { + // Sets the selected people that remained after closing the modal. + selectedPeople = await modalManager.show(PeopleViewModal, { + people: selectedPeople, + peopleToNotShow: [person], + screenHeight + }); + }; @@ -109,7 +114,7 @@

{$t('choose_matching_people_to_merge')}

- {#each selectedPeople as person (person.id)} + {#each selectedPeople.slice(0, 5) as person, _ (person.id)}
onSelect(person)} />
@@ -119,6 +124,18 @@
+ {#if selectedPeople.length > 5} +
+ +
+ {/if}
{#if selectedPeople.length === 1} diff --git a/web/src/lib/components/faces-page/people-list.svelte b/web/src/lib/components/faces-page/people-list.svelte index 7a401fefa3..6e8fb2f4c2 100644 --- a/web/src/lib/components/faces-page/people-list.svelte +++ b/web/src/lib/components/faces-page/people-list.svelte @@ -16,7 +16,7 @@ let { screenHeight, people, peopleToNotShow, onSelect, handleSearch }: Props = $props(); let searchedPeopleLocal: PersonResponseDto[] = $state([]); - let sortBySimilarirty = $state(false); + let sortBySimilarity = $state(false); let name = $state(''); const showPeople = $derived( @@ -27,19 +27,19 @@
-
- -
- {#if handleSearch} +
+ +
+ { - sortBySimilarirty = !sortBySimilarirty; - handleSearch(sortBySimilarirty); + sortBySimilarity = !sortBySimilarity; + handleSearch(sortBySimilarity); }} aria-label={$t('sort_people_by_similarity')} /> diff --git a/web/src/lib/modals/PeopleViewModal.svelte b/web/src/lib/modals/PeopleViewModal.svelte new file mode 100644 index 0000000000..48bd14770d --- /dev/null +++ b/web/src/lib/modals/PeopleViewModal.svelte @@ -0,0 +1,31 @@ + + + onClose(people)}> + +

{$t('choose_people_to_unselect')}

+ +
+