INFRAIMPACT — Developer Setup
INFRAIMPACT — Developer Setup
Prasyarat
- Browser modern (Chrome/Edge/Firefox 2 versi terakhir).
- Git.
- Salah satu: Python 3.x atau Node.js 18+ (untuk local server).
Tidak ada build step. Tidak ada npm install.
Quick start
git clone https://github.com/<you>/<repo>.git
cd <repo>
# Pilih satu:
python -m http.server 5173 # → http://localhost:5173
# atau
npx http-server -p 5173 -c-1 # disable cache during dev
Browser → http://localhost:5173. Membuka index.html lewat file:// tidak akan bekerja: fetch() ke data/*.json di-block oleh CORS.
Struktur kode
assets/js/
store.js # state + pub/sub
data-loader.js # fetch JSON & GeoJSON
scoring.js # normalize, dimension, block, classify
aggregation.js # period, group, trajectory
map.js # Leaflet wrapper, drill-down
charts.js # D3 matrix + Chart.js trend/ranking
panels.js # render KPI, hover tooltip, detail panel, asset modal
story.js # 7-slide overlay
about.js # about modal
app.js # bootstrap, event wiring
Setiap modul memasang fungsinya di window.IFI.<namespace>. Tidak ada bundler; urutan script tag di index.html menentukan dependency order.
Pola umum
- Tambah indikator baru:
- Append entry ke
data/indicators.json(lihat schema diDATA_DICTIONARY.md). - Pastikan
observation_fieldcocok dengan field diyearly_observations.json. - Tambah bobot di
weights.json(sub-kunciindicator_weights). - Update versi di
data/scoring_versions.jsonjika mengubah semantik agregasi. - Bump
scoring_method_versiondimetadata.json.
- Append entry ke
- Tambah aset baru:
- Tambahkan entry di
data/assets.json. - Tambahkan observasi 2015–2024 di
data/yearly_observations.json(skip tahun pre-construction). - Pastikan
province_code&district_codevalid.
- Tambahkan entry di
- Ganti GeoJSON provinsi:
- Primary loader mencoba
cdn.jsdelivr.net/gh/superpikar/indonesia-geojson@master/indonesia-en-simple.geojson. - Untuk geometri presisi (BPS), unduh TopoJSON resmi, konversi ke GeoJSON, simplifikasi via mapshaper.org (target 5–10% simplification), letakkan di
geo/indonesia_provinces.geojson. map.jssetProvinceGeoJSON() mendeteksi propertikode,KODE_PROV,id, atau nama vialookupProvinceCode().
- Primary loader mencoba
- Tambah bahasa Inggris (MVP 2):
- Tambah
assets/js/i18n.js(sederhana: dictionary keyed by string). - Wire toggle di header.
- Pakai key
*_enyang sudah disediakan diprovinces.json&indicators.json.
- Tambah
Testing manual (smoke)
Buka dashboard, lalu verifikasi:
[ ]Peta nasional tampil dalam < 3 detik.[ ]Hover provinsi menampilkan tooltip dengan dispersi.[ ]Klik provinsi → drill ke kab/kota.[ ]Klik kab/kota → cluster marker aset.[ ]Klik aset → modal terbuka, semua 5 tab populated.[ ]Year slider 2015 → 2024 mengubah peta + chart.[ ]Aset dibangun 2022 menjadi hidden /not_yet_constructedsaat slider = 2018.[ ]Story mode 7 slide bisa di-navigate.[ ]Filter (jenis aset, kuadran) memperbarui semua view.[ ]Export CSV menghasilkan file dengan header kolom benar.[ ]Esc menutup modal.[ ]Layout responsive di < 1280px (sidebar collapse).
Debugging
- Buka DevTools → Console: setiap error fetch JSON tercetak dengan path.
window.IFI.store.getState()mengembalikan state penuh — gunakan untuk inspect filter & data.- Bila peta provinsi tidak muncul: cek tab Network — apakah jsDelivr GeoJSON 200? Jika diblokir, dashboard menggunakan
geo/indonesia_provinces.geojsonfallback otomatis.
Deploy ke GitHub Pages
Lihat README.md bagian “Quick deploy”. Pastikan:
- File
.nojekyllada di root (mencegah Jekyll mengabaikan folder yang diawali_). - Repo bernama
<username>.github.iountuk user-site, atau enable Pages di Settings → Pages untuk project-site. - Tidak ada secret/private data di commit.
Roadmap kontribusi
| Prioritas | Item | Modul |
|---|---|---|
| MVP 2 | Compare Years mode | charts.js, app.js |
| MVP 2 | Sensitivity BWM slider | scoring.js, panel baru |
| MVP 2 | Sankey perubahan kuadran | charts.js (d3-sankey) |
| MVP 2 | EN locale | new i18n.js |
| MVP 3 | PDF 1-page export | panels.js + jspdf |
| MVP 3 | Animated choropleth per tahun | map.js |
| MVP 4 | Restricted mode (auth) | hosting change (Netlify Access) |
