fix(ui): die Pfad-Warnung sagt jetzt, was zu tun ist - und bietet einen Knopf
Ampel / ampel (push) Successful in 29s

Commander: "Das ist ja quatsch. Mein PC hat das Ziel als Worker direkt auf dem
PC eingebunden."

Nachgemessen: Die Warnung hatte SACHLICH recht, war aber unbrauchbar. Sein PC hat
die Freigabe wirklich als Netzlaufwerk (X:) gemountet - nur lag das
ARBEITSVERZEICHNIS darauf und die ABLAGE nicht. Das Ziel war weiter
/app/media/movies, also die VM-Platte, und dorthin kommt sein PC nicht. Beleg aus
der Worker-Meldung:

  pfad_map = /app/media/rippy=\192.168.178.62\rippy
  Ziel     = /app/media/movies        <- nicht abgedeckt, richtig gewarnt

Die alte Meldung nannte den Container-Pfad und die Mapping-Zeichenkette - also
genau die zwei Dinge, die ein Nicht-Entwickler nicht deuten kann. Jetzt steht der
Handgriff drin, mit dem NAMEN der Freigabe, die dieser Worker wirklich erreicht
("Einstellungen -> Ripping -> Ablage auf 'rippy' stellen").

Dazu ein Knopf, der das Ziel NUR FUER DIESEN RIP auf die Freigabe legt
(/app/media/movies -> /app/media/rippy/movies), ohne die globale Ablage
anzufassen. Wer den Rip jetzt starten will, will jetzt eine Loesung und keine
Wegbeschreibung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-26 15:38:31 +02:00
parent b4a0dd551a
commit a448ebc4de
2 changed files with 77 additions and 9 deletions
+30 -1
View File
@@ -4,7 +4,7 @@ import { api } from '../lib/api'
import { Modal } from './ui/Modal'
import { Button } from './ui/Button'
import { Input, Select } from './ui/Input'
import { automatikWarnung, externWarnung, sprachName } from '../lib/encoder'
import { automatikWarnung, externWarnung, freigabenAusMapping, sprachName } from '../lib/encoder'
interface TargetConfig {
id: string
@@ -244,6 +244,20 @@ export default function RipTargetModal({ isOpen, initialType, discTitle, deviceI
// erreicht (Punkt 6 des Savepoints v3.16). Am 26.07.2026 fiel genau das erst
// NACH dem Rip auf, weil nur der Worker selbst prüfte.
const gewaehlterWorker = workers.find(w => w.node === encoderNode)
/*
* Ein-Klick-Abhilfe: dasselbe Ziel, aber auf der Freigabe, die der gewählte
* Worker erreicht. Aus /app/media/movies wird /app/media/<freigabe>/movies.
*
* Nur wenn es überhaupt eine Freigabe gibt und das Ziel noch nicht darauf
* liegt — sonst stünde ein Knopf da, der nichts tut.
*/
const zielAufFreigabe = (() => {
const freigabe = freigabenAusMapping(gewaehlterWorker?.info?.pfad_map)[0]
if (!freigabe || !zielPfad) return ''
const unterordner = zielPfad.split('/').filter(Boolean).pop() || ''
const neu = `/app/media/${freigabe}/${unterordner}`
return neu === zielPfad ? '' : neu
})()
const pfadWarnung = selectedType === 'music'
? null
: encoderNode
@@ -411,6 +425,21 @@ export default function RipTargetModal({ isOpen, initialType, discTitle, deviceI
<div className="text-xs p-3 rounded-lg bg-amber-500/10 border border-amber-500/30 text-amber-700 dark:text-amber-300">
<strong> Dieser Encoder kann so nicht arbeiten.</strong>
<p className="mt-1">{pfadWarnung}</p>
{/* Ein Knopf statt einer Wegbeschreibung: Er legt das Ziel NUR FÜR
DIESEN RIP auf die Freigabe, die der Worker erreicht — ohne die
globale Ablage anzufassen. „Geh in die Einstellungen" mitten im
Dialog ist lästig, und wer den Rip jetzt starten will, will
jetzt eine Lösung. */}
{zielAufFreigabe && (
<Button
variant="secondary"
size="sm"
className="mt-2"
onClick={() => { setCustomPath(zielAufFreigabe); setBrowserOffen(false) }}
>
Ziel für diesen Rip auf die Freigabe legen
</Button>
)}
</div>
)}