Browse Source

feat: confirm before deleting all faces and people (#2496)

Jason Rasmussen 2 years ago
parent
commit
a089d9891d
1 changed files with 33 additions and 6 deletions
  1. 33 6
      web/src/lib/components/admin-page/jobs/jobs-panel.svelte

+ 33 - 6
web/src/lib/components/admin-page/jobs/jobs-panel.svelte

@@ -8,17 +8,35 @@
 	import type { ComponentType } from 'svelte';
 	import type { ComponentType } from 'svelte';
 	import JobTile from './job-tile.svelte';
 	import JobTile from './job-tile.svelte';
 	import StorageMigrationDescription from './storage-migration-description.svelte';
 	import StorageMigrationDescription from './storage-migration-description.svelte';
+	import ConfirmDialogue from '../../shared-components/confirm-dialogue.svelte';
 
 
 	export let jobs: AllJobStatusResponseDto;
 	export let jobs: AllJobStatusResponseDto;
 
 
-	type JobDetails = {
+	interface JobDetails {
 		title: string;
 		title: string;
 		subtitle?: string;
 		subtitle?: string;
 		allowForceCommand?: boolean;
 		allowForceCommand?: boolean;
 		component?: ComponentType;
 		component?: ComponentType;
+		handleCommand?: (jobId: JobName, jobCommand: JobCommandDto) => Promise<void>;
+	}
+
+	let faceConfirm = false;
+
+	const handleFaceCommand = async (jobId: JobName, dto: JobCommandDto) => {
+		if (dto.force) {
+			faceConfirm = true;
+			return;
+		}
+
+		await handleCommand(jobId, dto);
+	};
+
+	const onFaceConfirm = () => {
+		faceConfirm = false;
+		handleCommand(JobName.RecognizeFacesQueue, { command: JobCommand.Start, force: true });
 	};
 	};
 
 
-	const jobDetails: { [Key in JobName]?: JobDetails } = {
+	const jobDetails: Partial<Record<JobName, JobDetails>> = {
 		[JobName.ThumbnailGenerationQueue]: {
 		[JobName.ThumbnailGenerationQueue]: {
 			title: 'Generate Thumbnails',
 			title: 'Generate Thumbnails',
 			subtitle: 'Regenerate JPEG and WebP thumbnails'
 			subtitle: 'Regenerate JPEG and WebP thumbnails'
@@ -38,7 +56,8 @@
 		},
 		},
 		[JobName.RecognizeFacesQueue]: {
 		[JobName.RecognizeFacesQueue]: {
 			title: 'Recognize Faces',
 			title: 'Recognize Faces',
-			subtitle: 'Run machine learning to recognize faces'
+			subtitle: 'Run machine learning to recognize faces',
+			handleCommand: handleFaceCommand
 		},
 		},
 		[JobName.VideoConversionQueue]: {
 		[JobName.VideoConversionQueue]: {
 			title: 'Transcode Videos',
 			title: 'Transcode Videos',
@@ -53,7 +72,7 @@
 
 
 	const jobDetailsArray = Object.entries(jobDetails) as [JobName, JobDetails][];
 	const jobDetailsArray = Object.entries(jobDetails) as [JobName, JobDetails][];
 
 
-	async function runJob(jobId: JobName, jobCommand: JobCommandDto) {
+	async function handleCommand(jobId: JobName, jobCommand: JobCommandDto) {
 		const title = jobDetails[jobId]?.title;
 		const title = jobDetails[jobId]?.title;
 
 
 		try {
 		try {
@@ -74,8 +93,16 @@
 	}
 	}
 </script>
 </script>
 
 
+{#if faceConfirm}
+	<ConfirmDialogue
+		prompt="Are you sure you want to reprocess all faces? This will also clear named people."
+		on:confirm={onFaceConfirm}
+		on:cancel={() => (faceConfirm = false)}
+	/>
+{/if}
+
 <div class="flex flex-col gap-7">
 <div class="flex flex-col gap-7">
-	{#each jobDetailsArray as [jobName, { title, subtitle, allowForceCommand, component }]}
+	{#each jobDetailsArray as [jobName, { title, subtitle, allowForceCommand, component, handleCommand: handleCommandOverride }]}
 		{@const { jobCounts, queueStatus } = jobs[jobName]}
 		{@const { jobCounts, queueStatus } = jobs[jobName]}
 		<JobTile
 		<JobTile
 			{title}
 			{title}
@@ -83,7 +110,7 @@
 			{allowForceCommand}
 			{allowForceCommand}
 			{jobCounts}
 			{jobCounts}
 			{queueStatus}
 			{queueStatus}
-			on:command={({ detail }) => runJob(jobName, detail)}
+			on:command={({ detail }) => (handleCommandOverride || handleCommand)(jobName, detail)}
 		>
 		>
 			<svelte:component this={component} />
 			<svelte:component this={component} />
 		</JobTile>
 		</JobTile>