fix: Schiffs-Maße als Zahlen statt Strings speichern
Länge, Tiefgang und Höhe werden beim Speichern geparst und numerisch persistiert; Legacy-String-Werte beim Laden weiter unterstützt. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -13,6 +13,23 @@ interface VesselFormProps {
|
|||||||
preloadedData?: any
|
preloadedData?: any
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function metricInputFromStored(value: unknown): string {
|
||||||
|
if (value == null || value === '') return ''
|
||||||
|
if (typeof value === 'number' && Number.isFinite(value)) return String(value)
|
||||||
|
if (typeof value === 'string') return value.trim()
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseOptionalMetricMeters(input: string): number | undefined {
|
||||||
|
const trimmed = input.trim().replace(',', '.')
|
||||||
|
if (!trimmed) return undefined
|
||||||
|
const parsed = Number(trimmed)
|
||||||
|
if (!Number.isFinite(parsed) || parsed < 0) {
|
||||||
|
throw new Error('invalid_metric')
|
||||||
|
}
|
||||||
|
return parsed
|
||||||
|
}
|
||||||
|
|
||||||
export default function VesselForm({ logbookId, readOnly = false, preloadedData }: VesselFormProps) {
|
export default function VesselForm({ logbookId, readOnly = false, preloadedData }: VesselFormProps) {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const [name, setName] = useState('')
|
const [name, setName] = useState('')
|
||||||
@@ -48,9 +65,9 @@ export default function VesselForm({ logbookId, readOnly = false, preloadedData
|
|||||||
if (readOnly && preloadedData) {
|
if (readOnly && preloadedData) {
|
||||||
setName(preloadedData.name || '')
|
setName(preloadedData.name || '')
|
||||||
setVesselType(preloadedData.vesselType || '')
|
setVesselType(preloadedData.vesselType || '')
|
||||||
setLengthM(preloadedData.lengthM != null ? String(preloadedData.lengthM) : '')
|
setLengthM(metricInputFromStored(preloadedData.lengthM))
|
||||||
setDraftM(preloadedData.draftM != null ? String(preloadedData.draftM) : '')
|
setDraftM(metricInputFromStored(preloadedData.draftM))
|
||||||
setAirDraftM(preloadedData.airDraftM != null ? String(preloadedData.airDraftM) : '')
|
setAirDraftM(metricInputFromStored(preloadedData.airDraftM))
|
||||||
setHomePort(preloadedData.homePort || '')
|
setHomePort(preloadedData.homePort || '')
|
||||||
setCharterCompany(preloadedData.charterCompany || '')
|
setCharterCompany(preloadedData.charterCompany || '')
|
||||||
setOwner(preloadedData.owner || '')
|
setOwner(preloadedData.owner || '')
|
||||||
@@ -73,9 +90,9 @@ export default function VesselForm({ logbookId, readOnly = false, preloadedData
|
|||||||
if (decrypted) {
|
if (decrypted) {
|
||||||
setName(decrypted.name || '')
|
setName(decrypted.name || '')
|
||||||
setVesselType(decrypted.vesselType || '')
|
setVesselType(decrypted.vesselType || '')
|
||||||
setLengthM(decrypted.lengthM != null ? String(decrypted.lengthM) : '')
|
setLengthM(metricInputFromStored(decrypted.lengthM))
|
||||||
setDraftM(decrypted.draftM != null ? String(decrypted.draftM) : '')
|
setDraftM(metricInputFromStored(decrypted.draftM))
|
||||||
setAirDraftM(decrypted.airDraftM != null ? String(decrypted.airDraftM) : '')
|
setAirDraftM(metricInputFromStored(decrypted.airDraftM))
|
||||||
setHomePort(decrypted.homePort || '')
|
setHomePort(decrypted.homePort || '')
|
||||||
setCharterCompany(decrypted.charterCompany || '')
|
setCharterCompany(decrypted.charterCompany || '')
|
||||||
setOwner(decrypted.owner || '')
|
setOwner(decrypted.owner || '')
|
||||||
@@ -180,12 +197,25 @@ export default function VesselForm({ logbookId, readOnly = false, preloadedData
|
|||||||
const masterKey = await getLogbookKey(logbookId) || getActiveMasterKey()
|
const masterKey = await getLogbookKey(logbookId) || getActiveMasterKey()
|
||||||
if (!masterKey) throw new Error('Encryption key not found. Please log in.')
|
if (!masterKey) throw new Error('Encryption key not found. Please log in.')
|
||||||
|
|
||||||
|
let parsedLengthM: number | undefined
|
||||||
|
let parsedDraftM: number | undefined
|
||||||
|
let parsedAirDraftM: number | undefined
|
||||||
|
try {
|
||||||
|
parsedLengthM = parseOptionalMetricMeters(lengthM)
|
||||||
|
parsedDraftM = parseOptionalMetricMeters(draftM)
|
||||||
|
parsedAirDraftM = parseOptionalMetricMeters(airDraftM)
|
||||||
|
} catch {
|
||||||
|
setError(t('vessel.invalid_metric'))
|
||||||
|
setSaving(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const yachtData = {
|
const yachtData = {
|
||||||
name: name.trim(),
|
name: name.trim(),
|
||||||
vesselType: vesselType || undefined,
|
vesselType: vesselType || undefined,
|
||||||
lengthM: lengthM.trim() || undefined,
|
lengthM: parsedLengthM,
|
||||||
draftM: draftM.trim() || undefined,
|
draftM: parsedDraftM,
|
||||||
airDraftM: airDraftM.trim() || undefined,
|
airDraftM: parsedAirDraftM,
|
||||||
homePort: homePort.trim(),
|
homePort: homePort.trim(),
|
||||||
charterCompany: charterCompany.trim(),
|
charterCompany: charterCompany.trim(),
|
||||||
owner: owner.trim(),
|
owner: owner.trim(),
|
||||||
|
|||||||
@@ -83,6 +83,7 @@
|
|||||||
"length_m": "Länge (m)",
|
"length_m": "Länge (m)",
|
||||||
"draft_m": "Tiefgang (m)",
|
"draft_m": "Tiefgang (m)",
|
||||||
"air_draft_m": "Höhe (m)",
|
"air_draft_m": "Höhe (m)",
|
||||||
|
"invalid_metric": "Ungültiger Zahlenwert — bitte Meter als Dezimalzahl eingeben (z. B. 12,5).",
|
||||||
"port": "Heimathafen",
|
"port": "Heimathafen",
|
||||||
"owner": "Eigner",
|
"owner": "Eigner",
|
||||||
"charter": "Charterfirma",
|
"charter": "Charterfirma",
|
||||||
|
|||||||
@@ -83,6 +83,7 @@
|
|||||||
"length_m": "Length (m)",
|
"length_m": "Length (m)",
|
||||||
"draft_m": "Draft (m)",
|
"draft_m": "Draft (m)",
|
||||||
"air_draft_m": "Air draft (m)",
|
"air_draft_m": "Air draft (m)",
|
||||||
|
"invalid_metric": "Invalid number — please enter meters as a decimal (e.g. 12.5).",
|
||||||
"port": "Home Port",
|
"port": "Home Port",
|
||||||
"owner": "Owner",
|
"owner": "Owner",
|
||||||
"charter": "Charter Company",
|
"charter": "Charter Company",
|
||||||
|
|||||||
Reference in New Issue
Block a user