0.13.1-8 Fix Analysis

This commit is contained in:
2026-04-14 19:25:07 +00:00
parent c89a93ed05
commit 717bb305c0
11 changed files with 184 additions and 20 deletions
+8
View File
@@ -625,6 +625,14 @@ export const api = {
afterMutationInvalidate(['/history', '/pipeline/queue']);
return result;
},
async submitRawDecision(jobId, decision) {
const result = await request(`/pipeline/jobs/${jobId}/raw-decision`, {
method: 'POST',
body: JSON.stringify({ decision })
});
afterMutationInvalidate(['/history', '/pipeline/queue']);
return result;
},
async startJob(jobId) {
const result = await request(`/pipeline/start/${jobId}`, {
method: 'POST'
+38 -1
View File
@@ -1126,6 +1126,7 @@ export default function PipelineStatusCard({
onConfirmReview,
onSelectPlaylist,
onSelectHandBrakeTitle,
onSubmitRawDecision,
onCancel,
onRetry,
onDeleteJob,
@@ -2131,7 +2132,9 @@ export default function PipelineStatusCard({
};
}, [running, retryJobId]);
const playlistDecisionRequiredBeforeStart = state === 'WAITING_FOR_USER_DECISION' && !handBrakeTitleDecisionRequired;
const manualDecisionState = pipeline?.context?.manualDecisionState || null;
const rawDecisionRequiredBeforeStart = state === 'WAITING_FOR_USER_DECISION' && manualDecisionState === 'waiting_for_raw_decision';
const playlistDecisionRequiredBeforeStart = state === 'WAITING_FOR_USER_DECISION' && !handBrakeTitleDecisionRequired && !rawDecisionRequiredBeforeStart;
const isSeriesDvdReview = useMemo(() => {
if (jobMediaProfile !== 'dvd') {
return false;
@@ -3103,6 +3106,40 @@ export default function PipelineStatusCard({
</div>
) : null}
{rawDecisionRequiredBeforeStart && !queueLocked ? (
<div className="playlist-decision-block">
<h3>RAW Entscheidung erforderlich</h3>
<small>
Vorhandenes Raw zur Disk gefunden. Wie soll weiter verfahren werden?
</small>
<div className="actions-row mt-3">
<Button
label="mit RAW weiter machen"
icon="pi pi-check"
severity="success"
onClick={() => onSubmitRawDecision?.(retryJobId, 'continue')}
loading={busy}
/>
<Button
label="RAW löschen und Rip erneut starten"
icon="pi pi-trash"
severity="danger"
outlined
onClick={() => onSubmitRawDecision?.(retryJobId, 'delete')}
loading={busy}
/>
<Button
label="abbrechen"
icon="pi pi-times"
severity="secondary"
outlined
onClick={() => onSubmitRawDecision?.(retryJobId, 'cancel')}
loading={busy}
/>
</div>
</div>
) : null}
{playlistDecisionRequiredBeforeStart && !queueLocked ? (
<div className="playlist-decision-block">
<h3>Playlist-Auswahl erforderlich</h3>
+16
View File
@@ -1906,6 +1906,21 @@ export default function RipperPage({
}
};
const handleSubmitRawDecision = async (jobId, decision) => {
const normalizedJobId = normalizeJobId(jobId);
if (normalizedJobId) setJobBusy(normalizedJobId, true);
try {
await api.submitRawDecision(jobId, decision);
await refreshPipeline();
await loadRipperJobs();
setExpandedJobId(normalizedJobId);
} catch (error) {
showError(error);
} finally {
if (normalizedJobId) setJobBusy(normalizedJobId, false);
}
};
const handleRetry = async (jobId) => {
const normalizedJobId = normalizeJobId(jobId);
if (normalizedJobId) setJobBusy(normalizedJobId, true);
@@ -3097,6 +3112,7 @@ export default function RipperPage({
onConfirmReview={handleConfirmReview}
onSelectPlaylist={handleSelectPlaylist}
onSelectHandBrakeTitle={handleSelectHandBrakeTitle}
onSubmitRawDecision={handleSubmitRawDecision}
onCancel={handleCancel}
onRetry={handleRetry}
onDeleteJob={handleDeleteRipperJob}