UI fixes
This commit is contained in:
parent
d4f2f90b08
commit
e0b4cd589d
@ -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) => {
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user