(eta);
useEffect(() => {
- if (currentETA !== undefined && currentETA > 0) {
+ if (currentETA != null && currentETA > 0) {
const interval = setInterval(() => {
setCurrentETA((prevETA) => {
if (prevETA === undefined || prevETA <= 1000) return 0;
diff --git a/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx b/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx
index 9bf6a85d02ba..837dd0228b03 100644
--- a/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx
+++ b/interface/app/$libraryId/Layout/Sidebar/JobManager/index.tsx
@@ -121,7 +121,7 @@ export function JobManager() {
)}
- {t('recent_jobs')}
+ {t('recent_jobs')}
{toggleConfirmation ? (
diff --git a/packages/client/src/core.ts b/packages/client/src/core.ts
index d948acd2c7d1..2935c095135d 100644
--- a/packages/client/src/core.ts
+++ b/packages/client/src/core.ts
@@ -377,7 +377,7 @@ export type JobGroup = { id: string; running_job_id: string | null; action: stri
export type JobName = "Indexer" | "FileIdentifier" | "MediaProcessor" | "Copy" | "Move" | "Delete" | "Erase" | "FileValidator"
-export type JobProgressEvent = { id: string; library_id: string; task_count: number; completed_task_count: number; phase: string; message: string; estimated_completion: string }
+export type JobProgressEvent = { id: string; library_id: string; task_count: number; completed_task_count: number; phase: string; message: string; info: string; estimated_completion: string }
export type JsonValue = null | boolean | number | string | JsonValue[] | { [key in string]: JsonValue }
@@ -583,7 +583,7 @@ export type RenameMany = { from_pattern: FromPattern; to_pattern: string; from_f
export type RenameOne = { from_file_path_id: number; to: string }
-export type Report = { id: string; name: JobName; action: string | null; metadata: ReportMetadata[]; critical_error: string | null; non_critical_errors: NonCriticalError[]; created_at: string | null; started_at: string | null; completed_at: string | null; parent_id: string | null; status: Status; task_count: number; completed_task_count: number; phase: string; message: string; estimated_completion: string }
+export type Report = { id: string; name: JobName; action: string | null; metadata: ReportMetadata[]; critical_error: string | null; non_critical_errors: NonCriticalError[]; created_at: string | null; started_at: string | null; completed_at: string | null; parent_id: string | null; status: Status; task_count: number; completed_task_count: number; info: string; phase: string; message: string; estimated_completion: string }
export type ReportInputMetadata = { type: "location"; data: Location } | { type: "sub_path"; data: string }
diff --git a/packages/client/src/utils/jobs/useJobInfo.tsx b/packages/client/src/utils/jobs/useJobInfo.tsx
index 045447e22dff..3dcb7176e17a 100644
--- a/packages/client/src/utils/jobs/useJobInfo.tsx
+++ b/packages/client/src/utils/jobs/useJobInfo.tsx
@@ -1,6 +1,12 @@
import { TextItems } from '.';
-import { formatNumber, uint32ArrayToBigInt } from '../..';
-import { JobProgressEvent, Report, ReportOutputMetadata } from '../../core';
+import { formatNumber, humanizeSize, uint32ArrayToBigInt } from '../..';
+import {
+ JobName,
+ JobProgressEvent,
+ Report,
+ ReportMetadata,
+ ReportOutputMetadata
+} from '../../core';
interface JobNiceData {
name: string;
@@ -12,8 +18,8 @@ interface JobNiceData {
indexedPath?: any;
taskCount: number;
completedTaskCount: number;
- meta: any;
- output: any;
+ meta: ReportMetadata[];
+ output: ReportOutputMetadata[];
}
export function useJobInfo(job: Report, realtimeUpdate: JobProgressEvent | null): JobNiceData {
@@ -258,11 +264,16 @@ export function useJobInfo(job: Report, realtimeUpdate: JobProgressEvent | null)
case 'Copy':
return {
...data,
- name: `${isQueued ? 'Copy' : isRunning ? 'Copying' : 'Copied'} ${
- isRunning ? completedTaskCount + 1 : completedTaskCount
- } ${isRunning ? `of ${job.task_count}` : ``} ${plural(job.task_count, 'file')}`,
- textItems: [[{ text: job.status }]]
+ name: isQueued
+ ? `Duplicate ${taskCount} ${plural(taskCount, 'file')}`
+ : isRunning
+ ? `Duplicating ${completedTaskCount}% of ${realtimeUpdate?.info} ${plural(taskCount, 'file')} (${humanizeSize(parseInt(realtimeUpdate?.message || '0'))})`
+ : `Duplicated ${taskCount} ${plural(taskCount, 'file')}`,
+ textItems: realtimeUpdate
+ ? [[{ text: realtimeUpdate?.phase }]]
+ : [[{ text: job.status }]]
};
+
case 'Delete':
return {
...data,