mirror of
				https://github.com/KevinMidboe/immich.git
				synced 2025-10-29 17:40:28 +00:00 
			
		
		
		
	feat(web): job tile icons (#2546)
This commit is contained in:
		| @@ -1,4 +1,5 @@ | ||||
| <script lang="ts"> | ||||
| 	import type Icon from 'svelte-material-icons/AbTesting.svelte'; | ||||
| 	import SelectionSearch from 'svelte-material-icons/SelectionSearch.svelte'; | ||||
| 	import Play from 'svelte-material-icons/Play.svelte'; | ||||
| 	import Pause from 'svelte-material-icons/Pause.svelte'; | ||||
| @@ -17,6 +18,7 @@ | ||||
| 	export let jobCounts: JobCountsDto; | ||||
| 	export let queueStatus: QueueStatusDto; | ||||
| 	export let allowForceCommand = true; | ||||
| 	export let icon: typeof Icon; | ||||
|  | ||||
| 	$: waitingCount = jobCounts.waiting + jobCounts.paused + jobCounts.delayed; | ||||
| 	$: isIdle = !queueStatus.isActive && !queueStatus.isPaused; | ||||
| @@ -37,7 +39,10 @@ | ||||
| 			<div | ||||
| 				class="flex items-center gap-4 text-xl font-semibold text-immich-primary dark:text-immich-dark-primary" | ||||
| 			> | ||||
| 				<span>{title.toUpperCase()}</span> | ||||
| 				<span class="flex gap-2 items-center"> | ||||
| 					<svelte:component this={icon} size="1.25em" class="shrink-0 hidden sm:block" /> | ||||
| 					{title.toUpperCase()} | ||||
| 				</span> | ||||
| 				<div class="flex gap-2"> | ||||
| 					{#if jobCounts.failed > 0} | ||||
| 						<Badge color="primary"> | ||||
|   | ||||
| @@ -6,15 +6,24 @@ | ||||
| 	import { handleError } from '$lib/utils/handle-error'; | ||||
| 	import { AllJobStatusResponseDto, api, JobCommand, JobCommandDto, JobName } from '@api'; | ||||
| 	import type { ComponentType } from 'svelte'; | ||||
| 	import Icon from 'svelte-material-icons/DotsVertical.svelte'; | ||||
| 	import FaceRecognition from 'svelte-material-icons/FaceRecognition.svelte'; | ||||
| 	import FileJpgBox from 'svelte-material-icons/FileJpgBox.svelte'; | ||||
| 	import FolderMove from 'svelte-material-icons/FolderMove.svelte'; | ||||
| 	import Table from 'svelte-material-icons/Table.svelte'; | ||||
| 	import TagMultiple from 'svelte-material-icons/TagMultiple.svelte'; | ||||
| 	import VectorCircle from 'svelte-material-icons/VectorCircle.svelte'; | ||||
| 	import Video from 'svelte-material-icons/Video.svelte'; | ||||
| 	import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte'; | ||||
| 	import JobTile from './job-tile.svelte'; | ||||
| 	import StorageMigrationDescription from './storage-migration-description.svelte'; | ||||
| 	import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte'; | ||||
|  | ||||
| 	export let jobs: AllJobStatusResponseDto; | ||||
|  | ||||
| 	interface JobDetails { | ||||
| 		title: string; | ||||
| 		subtitle?: string; | ||||
| 		icon: typeof Icon; | ||||
| 		allowForceCommand?: boolean; | ||||
| 		component?: ComponentType; | ||||
| 		handleCommand?: (jobId: JobName, jobCommand: JobCommandDto) => Promise<void>; | ||||
| @@ -38,32 +47,39 @@ | ||||
|  | ||||
| 	const jobDetails: Partial<Record<JobName, JobDetails>> = { | ||||
| 		[JobName.ThumbnailGenerationQueue]: { | ||||
| 			icon: FileJpgBox, | ||||
| 			title: 'Generate Thumbnails', | ||||
| 			subtitle: 'Regenerate JPEG and WebP thumbnails' | ||||
| 		}, | ||||
| 		[JobName.MetadataExtractionQueue]: { | ||||
| 			icon: Table, | ||||
| 			title: 'Extract Metadata', | ||||
| 			subtitle: 'Extract metadata information i.e. GPS, resolution...etc' | ||||
| 		}, | ||||
| 		[JobName.ObjectTaggingQueue]: { | ||||
| 			icon: TagMultiple, | ||||
| 			title: 'Tag Objects', | ||||
| 			subtitle: | ||||
| 				'Run machine learning to tag objects\nNote that some assets may not have any objects detected' | ||||
| 		}, | ||||
| 		[JobName.ClipEncodingQueue]: { | ||||
| 			icon: VectorCircle, | ||||
| 			title: 'Encode Clip', | ||||
| 			subtitle: 'Run machine learning to generate clip embeddings' | ||||
| 		}, | ||||
| 		[JobName.RecognizeFacesQueue]: { | ||||
| 			icon: FaceRecognition, | ||||
| 			title: 'Recognize Faces', | ||||
| 			subtitle: 'Run machine learning to recognize faces', | ||||
| 			handleCommand: handleFaceCommand | ||||
| 		}, | ||||
| 		[JobName.VideoConversionQueue]: { | ||||
| 			icon: Video, | ||||
| 			title: 'Transcode Videos', | ||||
| 			subtitle: 'Transcode videos not in the desired format' | ||||
| 		}, | ||||
| 		[JobName.StorageTemplateMigrationQueue]: { | ||||
| 			icon: FolderMove, | ||||
| 			title: 'Storage Template Migration', | ||||
| 			allowForceCommand: false, | ||||
| 			component: StorageMigrationDescription | ||||
| @@ -102,9 +118,10 @@ | ||||
| {/if} | ||||
|  | ||||
| <div class="flex flex-col gap-7"> | ||||
| 	{#each jobDetailsArray as [jobName, { title, subtitle, allowForceCommand, component, handleCommand: handleCommandOverride }]} | ||||
| 	{#each jobDetailsArray as [jobName, { title, subtitle, allowForceCommand, icon, component, handleCommand: handleCommandOverride }]} | ||||
| 		{@const { jobCounts, queueStatus } = jobs[jobName]} | ||||
| 		<JobTile | ||||
| 			{icon} | ||||
| 			{title} | ||||
| 			{subtitle} | ||||
| 			{allowForceCommand} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user