Files
kapteins-daagbok/client/src/utils/vesselFormUtils.ts
T
elpatron 3cab735754 refactor: replace parseFloat with parseAppDecimal and formatAppDecimal for improved number handling
Updated various components to utilize parseAppDecimal and formatAppDecimal for consistent decimal parsing and formatting. This change enhances the handling of numeric inputs across the application, ensuring better accuracy and user experience in forms and displays.
2026-06-03 18:07:22 +02:00

94 lines
3.2 KiB
TypeScript

import { parseOptionalTankLiters, tankCapacityInputFromStored } from './tankCapacity.js'
import { formatAppDecimal, parseAppDecimal } from './numberFormat.js'
import type { VesselData } from '../types/vessel.js'
export function metricInputFromStored(value: unknown): string {
if (value == null || value === '') return ''
if (typeof value === 'number' && Number.isFinite(value)) {
return formatAppDecimal(value, { maximumFractionDigits: 6 })
}
if (typeof value === 'string') return value.trim()
return ''
}
export function parseOptionalMetricMeters(input: string): number | undefined {
const trimmed = input.trim()
if (!trimmed) return undefined
const parsed = parseAppDecimal(trimmed)
if (parsed == null || parsed < 0) {
throw new Error('invalid_metric')
}
return parsed
}
export interface VesselFormInputs {
name: string
vesselType: string
lengthM: string
draftM: string
airDraftM: string
homePort: string
charterCompany: string
owner: string
registrationNumber: string
callSign: string
atis: string
mmsi: string
sails: string[]
photo: string | null
freshwaterCapacityL: string
fuelCapacityL: string
greywaterCapacityL: string
}
export function vesselDataToFormInputs(data: Partial<VesselData>): VesselFormInputs {
return {
name: data.name || '',
vesselType: data.vesselType || '',
lengthM: metricInputFromStored(data.lengthM),
draftM: metricInputFromStored(data.draftM),
airDraftM: metricInputFromStored(data.airDraftM),
homePort: data.homePort || '',
charterCompany: data.charterCompany || '',
owner: data.owner || '',
registrationNumber: data.registrationNumber || '',
callSign: data.callSign || '',
atis: data.atis || '',
mmsi: data.mmsi || '',
sails: data.sails || [],
photo: data.photo ?? null,
freshwaterCapacityL: tankCapacityInputFromStored(data.freshwaterCapacityL),
fuelCapacityL: tankCapacityInputFromStored(data.fuelCapacityL),
greywaterCapacityL: tankCapacityInputFromStored(data.greywaterCapacityL)
}
}
export function parseVesselFormInputs(inputs: VesselFormInputs): VesselData {
const parsedLengthM = parseOptionalMetricMeters(inputs.lengthM)
const parsedDraftM = parseOptionalMetricMeters(inputs.draftM)
const parsedAirDraftM = parseOptionalMetricMeters(inputs.airDraftM)
const parsedFreshwaterCapacityL = parseOptionalTankLiters(inputs.freshwaterCapacityL)
const parsedFuelCapacityL = parseOptionalTankLiters(inputs.fuelCapacityL)
const parsedGreywaterCapacityL = parseOptionalTankLiters(inputs.greywaterCapacityL)
return {
name: inputs.name.trim(),
vesselType: inputs.vesselType || undefined,
lengthM: parsedLengthM,
draftM: parsedDraftM,
airDraftM: parsedAirDraftM,
freshwaterCapacityL: parsedFreshwaterCapacityL,
fuelCapacityL: parsedFuelCapacityL,
greywaterCapacityL: parsedGreywaterCapacityL,
homePort: inputs.homePort.trim(),
charterCompany: inputs.charterCompany.trim(),
owner: inputs.owner.trim(),
registrationNumber: inputs.registrationNumber.trim(),
callSign: inputs.callSign.trim(),
atis: inputs.atis.trim(),
mmsi: inputs.mmsi.trim(),
sails: inputs.sails,
photo: inputs.photo
}
}