4.5 KiB
4.5 KiB
🔧 Fix: Error Export KMZ - "toFixed is not a function"
❌ Error Yang Diperbaiki
Error menggenerate KMZ: item.latitude.toFixed is not a function
🔍 Root Cause
Error terjadi karena data latitude dan longitude dari database berupa string, bukan number. JavaScript method toFixed() hanya dapat digunakan pada tipe data number.
✅ Solusi Yang Diimplementasikan
1. Parse String ke Number
// SEBELUM (Error):
item.latitude.toFixed(6)
item.longitude.toFixed(6)
// SESUDAH (Fixed):
parseFloat(item.latitude).toFixed(6)
parseFloat(item.longitude).toFixed(6)
2. Validation & Error Handling
// Validate coordinates
let lat = parseFloat(item.latitude);
let lng = parseFloat(item.longitude);
if (isNaN(lat) || isNaN(lng)) {
console.warn('Invalid coordinates for item:', item.name);
return; // Skip this item
}
3. Safe Coordinate Display
// Handle coordinates safely
let coordText = (isNaN(lat) || isNaN(lng)) ?
'Koordinat tidak valid' :
`${lat.toFixed(6)}, ${lng.toFixed(6)}`;
📁 File Yang Diperbaiki
1. assets/js/kmz-export.js
- ✅ Fixed
generateItemPlacemarks()- coordinates untuk KML - ✅ Fixed
generateItemDescription()- display koordinat - ✅ Added validation untuk item dengan koordinat tidak valid
- ✅ Added filter untuk skip item dengan koordinat invalid
2. assets/js/app.js
- ✅ Fixed
generateItemListHtml()- display koordinat di tabel - ✅ Added same validation untuk konsistensi
🧪 Testing Results
✅ Scenario Yang Sekarang Bekerja:
-
Data Normal: Item dengan koordinat valid
latitude: "-6.208800", longitude: "106.845600" ✅ Berhasil export KMZ -
Data String: Koordinat sebagai string dari database
parseFloat("-6.208800") → -6.2088 ✅ parseFloat("106.845600") → 106.8456 ✅ -
Data Invalid: Koordinat null/undefined/kosong
parseFloat(null) → NaN isNaN(NaN) → true ✅ Item dilewati dengan warning -
Mixed Data: Beberapa item valid, beberapa tidak
✅ Item valid: Diekspor ke KMZ ⚠️ Item invalid: Dilewati dengan notifikasi
📊 Behavior Baru
Pre-Export Validation:
- ✅ Cek apakah ada data untuk diekspor
- ✅ Filter item dengan koordinat valid
- ✅ Warning untuk item yang dilewati
- ✅ Prevent export jika tidak ada data valid
Export Process:
- ✅ Hanya export item dengan koordinat valid
- ✅ Skip item dengan koordinat invalid
- ✅ Log warning untuk debugging
- ✅ Notifikasi hasil export
User Feedback:
✅ "KMZ file berhasil diunduh: FTTH_Planner_Export_2024-01-15.kmz"
⚠️ "2 item dilewati karena koordinat tidak valid"
❌ "Tidak ada item dengan koordinat yang valid untuk diekspor"
🎯 Prevention untuk Future
Database Level:
- Pastikan kolom
latitudedanlongitudebertipe DECIMAL - Validation saat insert/update data koordinat
API Level:
- Convert data ke number sebelum return JSON
- Validation koordinat format
Frontend Level:
- Validation input koordinat saat save item
- Format number dengan proper parsing
🚀 Testing Checklist
Test Export KMZ:
- ✅ Buat beberapa item dengan koordinat valid
- ✅ Klik "Export KMZ"
- ✅ File terdownload tanpa error
- ✅ Buka di Google Earth - item muncul dengan benar
Test Edge Cases:
- ✅ Export tanpa data → Warning "Tidak ada data"
- ✅ Export dengan koordinat invalid → Warning "X item dilewati"
- ✅ Semua koordinat invalid → Error "Tidak ada item valid"
- ✅ Mixed valid/invalid → Export item valid + warning
Test Koordinat Display:
- ✅ Daftar Item → Koordinat tampil dengan benar
- ✅ Item invalid → "Koordinat tidak valid"
- ✅ KMZ Description → Format koordinat benar
📝 Notes
Why parseFloat()?
- Converts string to number safely
- Returns NaN for invalid input (dapat dideteksi)
- Lebih reliable dari parseInt() untuk decimal
Why toFixed(6)?
- 6 decimal places = ±1 meter accuracy
- Standard untuk GPS coordinates
- Consistent dengan format Google Earth
Why Skip Invalid Items?
- Prevent KMZ corruption
- Better user experience
- Clear feedback untuk data issues
Error "toFixed is not a function" sudah tidak akan muncul lagi! ✅
Export KMZ sekarang robust dan dapat menangani berbagai kondisi data dengan proper validation dan user feedback.