This commit is contained in:
Linrador 2026-04-09 15:00:57 +02:00
parent d4f2f90b08
commit e0b4cd589d
2 changed files with 33 additions and 11 deletions

View File

@ -166,10 +166,11 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
const [assetsTask, setAssetsTask] = useState<TaskItem>({ const [assetsTask, setAssetsTask] = useState<TaskItem>({
id: 'generate-assets', id: 'generate-assets',
status: 'idle', status: 'idle',
title: 'Assets generieren', // oder '' wenn du es komplett weg willst title: 'Assets generieren',
text: '', text: '',
cancellable: true, cancellable: true,
fading: false, fading: false,
startedAtMs: 0,
}) })
const [cleanupTask, setCleanupTask] = useState<TaskItem>({ const [cleanupTask, setCleanupTask] = useState<TaskItem>({
@ -179,6 +180,7 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
text: '', text: '',
cancellable: true, cancellable: true,
fading: false, fading: false,
startedAtMs: 0,
}) })
const [regenerateAssetsTasks, setRegenerateAssetsTasks] = useState<TaskItem[]>([]) const [regenerateAssetsTasks, setRegenerateAssetsTasks] = useState<TaskItem[]>([])
@ -321,6 +323,11 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
const state = String(job?.state || '').trim().toLowerCase() const state = String(job?.state || '').trim().toLowerCase()
const error = String(job?.error || '').trim() const error = String(job?.error || '').trim()
const startedAtMs =
Number(job?.startedAt ?? 0) ||
Number(job?.enqueuedAt ?? 0) ||
Date.now()
const cancelled = const cancelled =
state === 'cancelled' || state === 'cancelled' ||
error.toLowerCase() === 'abgebrochen' || error.toLowerCase() === 'abgebrochen' ||
@ -377,12 +384,11 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
err: status === 'error' ? error || 'Fehler beim Regenerieren.' : undefined, err: status === 'error' ? error || 'Fehler beim Regenerieren.' : undefined,
cancellable: status === 'running', cancellable: status === 'running',
fading: false, fading: false,
startedAtMs,
} }
}) })
.filter(Boolean) as TaskItem[] .filter(Boolean) as TaskItem[]
nextTasks.sort((a, b) => a.title.localeCompare(b.title, undefined, { sensitivity: 'base' }))
setRegenerateAssetsTasks((prev) => { setRegenerateAssetsTasks((prev) => {
const nextById = new Map(nextTasks.map((t) => [t.id, t])) const nextById = new Map(nextTasks.map((t) => [t.id, t]))
const prevById = new Map(prev.map((t) => [t.id, t])) const prevById = new Map(prev.map((t) => [t.id, t]))
@ -419,9 +425,7 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
} }
} }
return merged.sort((a, b) => return merged
a.title.localeCompare(b.title, undefined, { sensitivity: 'base' })
)
}) })
const cleanup = data.cleanup const cleanup = data.cleanup
@ -654,7 +658,16 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
window.setTimeout(() => { window.setTimeout(() => {
setter((t) => ({ ...t, fading: true })) setter((t) => ({ ...t, fading: true }))
window.setTimeout(() => { window.setTimeout(() => {
setter((t) => ({ ...t, status: 'idle', text: '', err: undefined, done: 0, total: 0, fading: false })) setter((t) => ({
...t,
status: 'idle',
text: '',
err: undefined,
done: 0,
total: 0,
fading: false,
startedAtMs: 0,
}))
}, fadeMs) }, fadeMs)
}, delayMs) }, delayMs)
} }
@ -702,12 +715,13 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
setCleanupTask((t) => ({ setCleanupTask((t) => ({
...t, ...t,
status: 'running', status: 'running',
title: 'Aufräumen', // ✅ HINZUFÜGEN (reset) title: 'Aufräumen',
text: 'Räume auf…', text: 'Räume auf…',
err: undefined, err: undefined,
done: 0, done: 0,
total: 0, total: 0,
fading: false, fading: false,
startedAtMs: t.startedAtMs || Date.now(),
})) }))
try { try {
@ -917,6 +931,7 @@ export default function RecorderSettings({ onAssetsGenerated }: Props) {
total: 0, total: 0,
err: undefined, err: undefined,
fading: false, fading: false,
startedAtMs: t.startedAtMs || Date.now(),
})) }))
}} }}
onProgress={(p) => { onProgress={(p) => {

View File

@ -10,8 +10,9 @@ export type TaskItem = {
done?: number done?: number
total?: number total?: number
err?: string err?: string
cancellable?: boolean // zeigt X nur wenn true cancellable?: boolean
fading?: boolean // für sanftes Ausblenden fading?: boolean
startedAtMs?: number
} }
type Props = { type Props = {
@ -27,7 +28,13 @@ function pct(done?: number, total?: number) {
} }
export default function TaskList({ tasks, onCancel }: Props) { export default function TaskList({ tasks, onCancel }: Props) {
const visible = (tasks || []).filter((t) => t.status !== 'idle') const visible = [...(tasks || [])]
.filter((t) => t.status !== 'idle')
.sort((a, b) => {
const aMs = Number(a.startedAtMs ?? 0)
const bMs = Number(b.startedAtMs ?? 0)
return aMs - bMs
})
return ( return (
<div className="rounded-2xl border border-gray-200 bg-white p-4 shadow-sm dark:border-white/10 dark:bg-gray-950/40"> <div className="rounded-2xl border border-gray-200 bg-white p-4 shadow-sm dark:border-white/10 dark:bg-gray-950/40">