port-nimara-client-portal/composables/useMeasurementConversion.ts

73 lines
2.2 KiB
TypeScript

export const useMeasurementConversion = () => {
// Convert feet to meters (NocoDB uses this formula: imperial * 0.3048)
const feetToMeters = (feet: number): number => {
return feet * 0.3048;
};
// Convert meters to feet (reverse conversion for editing)
const metersToFeet = (meters: number): number => {
return meters / 0.3048;
};
// Format measurement for display (show both units)
const formatMeasurement = (imperial: number, unit: 'ft' | 'in' = 'ft') => {
const metric = feetToMeters(imperial);
return {
imperial: `${imperial}${unit}`,
metric: `${metric.toFixed(2)}m`,
display: `${metric.toFixed(2)}m / ${imperial}${unit}`,
imperialValue: imperial,
metricValue: parseFloat(metric.toFixed(2))
};
};
// Format just metric value with precision
const formatMetric = (meters: number): string => {
return `${meters.toFixed(2)}m`;
};
// Format just imperial value
const formatImperial = (feet: number, unit: 'ft' | 'in' = 'ft'): string => {
return `${feet}${unit}`;
};
// Parse user input and convert to imperial for database storage
const parseUserInput = (input: string): { imperial: number; metric: number } | null => {
// Remove any non-numeric characters except decimal points
const cleanInput = input.replace(/[^\d.]/g, '');
const numericValue = parseFloat(cleanInput);
if (isNaN(numericValue)) {
return null;
}
// Determine if input is likely metric (contains 'm') or imperial (contains 'ft' or just a number)
const isMetric = input.toLowerCase().includes('m') && !input.toLowerCase().includes('ft');
if (isMetric) {
// Convert metric to imperial for storage
const imperial = metersToFeet(numericValue);
return {
imperial: parseFloat(imperial.toFixed(2)),
metric: numericValue
};
} else {
// Assume imperial, convert to metric for display
const metric = feetToMeters(numericValue);
return {
imperial: numericValue,
metric: parseFloat(metric.toFixed(2))
};
}
};
return {
feetToMeters,
metersToFeet,
formatMeasurement,
formatMetric,
formatImperial,
parseUserInput
};
};