mirror of
				https://github.com/immich-app/immich.git
				synced 2025-10-31 10:49:11 -04:00 
			
		
		
		
	fix(web): grid on people page (#5640)
* fix: grid on people page * pr feedback * wait before width is set * fix: animation * fix: use grid instead --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit is contained in:
		
							parent
							
								
									bf8e2966c4
								
							
						
					
					
						commit
						29b204de57
					
				| @ -46,7 +46,7 @@ | |||||||
|   role="group" |   role="group" | ||||||
| > | > | ||||||
|   <a href="{AppRoute.PEOPLE}/{person.id}?previousRoute={AppRoute.PEOPLE}" draggable="false"> |   <a href="{AppRoute.PEOPLE}/{person.id}?previousRoute={AppRoute.PEOPLE}" draggable="false"> | ||||||
|     <div class="h-48 w-48 rounded-xl brightness-95 filter"> |     <div class="w-full h-full rounded-xl brightness-95 filter"> | ||||||
|       <ImageThumbnail |       <ImageThumbnail | ||||||
|         shadow |         shadow | ||||||
|         {preload} |         {preload} | ||||||
|  | |||||||
| @ -16,10 +16,11 @@ | |||||||
| 
 | 
 | ||||||
|   export let showLoadingSpinner: boolean; |   export let showLoadingSpinner: boolean; | ||||||
|   export let toggleVisibility: boolean; |   export let toggleVisibility: boolean; | ||||||
|  |   export let screenHeight: number; | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <section | <section | ||||||
|   transition:fly={{ y: 500, duration: 100, easing: quintOut }} |   transition:fly={{ y: screenHeight, duration: 150, easing: quintOut, opacity: 1 }} | ||||||
|   class="absolute left-0 top-0 z-[9999] h-full w-full bg-immich-bg dark:bg-immich-dark-bg" |   class="absolute left-0 top-0 z-[9999] h-full w-full bg-immich-bg dark:bg-immich-dark-bg" | ||||||
| > | > | ||||||
|   <div |   <div | ||||||
|  | |||||||
| @ -45,6 +45,8 @@ | |||||||
|   let potentialMergePeople: PersonResponseDto[] = []; |   let potentialMergePeople: PersonResponseDto[] = []; | ||||||
|   let edittingPerson: PersonResponseDto | null = null; |   let edittingPerson: PersonResponseDto | null = null; | ||||||
| 
 | 
 | ||||||
|  |   let innerHeight: number; | ||||||
|  | 
 | ||||||
|   people.forEach((person: PersonResponseDto) => { |   people.forEach((person: PersonResponseDto) => { | ||||||
|     initialHiddenValues[person.id] = person.isHidden; |     initialHiddenValues[person.id] = person.isHidden; | ||||||
|   }); |   }); | ||||||
| @ -344,6 +346,8 @@ | |||||||
|   }; |   }; | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
|  | <svelte:window bind:innerHeight /> | ||||||
|  | 
 | ||||||
| {#if showMergeModal} | {#if showMergeModal} | ||||||
|   <FullScreenModal on:clickOutside={() => (showMergeModal = false)}> |   <FullScreenModal on:clickOutside={() => (showMergeModal = false)}> | ||||||
|     <MergeSuggestionModal |     <MergeSuggestionModal | ||||||
| @ -370,21 +374,19 @@ | |||||||
|   </svelte:fragment> |   </svelte:fragment> | ||||||
| 
 | 
 | ||||||
|   {#if countVisiblePeople > 0} |   {#if countVisiblePeople > 0} | ||||||
|     <div class="pl-4"> |     <div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 xl:grid-cols-7 2xl:grid-cols-9 gap-1"> | ||||||
|       <div class="flex flex-row flex-wrap gap-1"> |       {#each people as person, idx (person.id)} | ||||||
|         {#each people as person, idx (person.id)} |         {#if !person.isHidden} | ||||||
|           {#if !person.isHidden} |           <PeopleCard | ||||||
|             <PeopleCard |             {person} | ||||||
|               {person} |             preload={idx < 20} | ||||||
|               preload={idx < 20} |             on:change-name={() => handleChangeName(person)} | ||||||
|               on:change-name={() => handleChangeName(person)} |             on:set-birth-date={() => handleSetBirthDate(person)} | ||||||
|               on:set-birth-date={() => handleSetBirthDate(person)} |             on:merge-people={() => handleMergePeople(person)} | ||||||
|               on:merge-people={() => handleMergePeople(person)} |             on:hide-person={() => handleHidePerson(person)} | ||||||
|               on:hide-person={() => handleHidePerson(person)} |           /> | ||||||
|             /> |         {/if} | ||||||
|           {/if} |       {/each} | ||||||
|         {/each} |  | ||||||
|       </div> |  | ||||||
|     </div> |     </div> | ||||||
|   {:else} |   {:else} | ||||||
|     <div class="flex min-h-[calc(66vh_-_11rem)] w-full place-content-center items-center dark:text-white"> |     <div class="flex min-h-[calc(66vh_-_11rem)] w-full place-content-center items-center dark:text-white"> | ||||||
| @ -444,29 +446,32 @@ | |||||||
|     on:change={handleToggleVisibility} |     on:change={handleToggleVisibility} | ||||||
|     bind:showLoadingSpinner |     bind:showLoadingSpinner | ||||||
|     bind:toggleVisibility |     bind:toggleVisibility | ||||||
|  |     screenHeight={innerHeight} | ||||||
|   > |   > | ||||||
|     {#each people as person, idx (person.id)} |     <div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 xl:grid-cols-7 2xl:grid-cols-9 gap-1"> | ||||||
|       <button |       {#each people as person, idx (person.id)} | ||||||
|         class="relative h-36 w-36 md:h-48 md:w-48" |         <button | ||||||
|         on:click={() => (person.isHidden = !person.isHidden)} |           class="relative" | ||||||
|         on:mouseenter={() => (eyeColorMap[person.id] = 'black')} |           on:click={() => (person.isHidden = !person.isHidden)} | ||||||
|         on:mouseleave={() => (eyeColorMap[person.id] = 'white')} |           on:mouseenter={() => (eyeColorMap[person.id] = 'black')} | ||||||
|       > |           on:mouseleave={() => (eyeColorMap[person.id] = 'white')} | ||||||
|         <ImageThumbnail |         > | ||||||
|           preload={idx < 20} |           <ImageThumbnail | ||||||
|           bind:hidden={person.isHidden} |             preload={idx < 20} | ||||||
|           shadow |             bind:hidden={person.isHidden} | ||||||
|           url={api.getPeopleThumbnailUrl(person.id)} |             shadow | ||||||
|           altText={person.name} |             url={api.getPeopleThumbnailUrl(person.id)} | ||||||
|           widthStyle="100%" |             altText={person.name} | ||||||
|           bind:eyeColor={eyeColorMap[person.id]} |             widthStyle="100%" | ||||||
|         /> |             bind:eyeColor={eyeColorMap[person.id]} | ||||||
|         {#if person.name} |           /> | ||||||
|           <span class="absolute bottom-2 left-0 w-full select-text px-1 text-center font-medium text-white"> |           {#if person.name} | ||||||
|             {person.name} |             <span class="absolute bottom-2 left-0 w-full select-text px-1 text-center font-medium text-white"> | ||||||
|           </span> |               {person.name} | ||||||
|         {/if} |             </span> | ||||||
|       </button> |           {/if} | ||||||
|     {/each} |         </button> | ||||||
|  |       {/each} | ||||||
|  |     </div> | ||||||
|   </ShowHide> |   </ShowHide> | ||||||
| {/if} | {/if} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user