dropdown action

This commit is contained in:
='fauz 2025-06-30 12:47:53 +07:00
parent 3e2b383e87
commit f480216e5c
5 changed files with 154 additions and 41 deletions

View File

@ -13,18 +13,37 @@ class apiController:
return result
@staticmethod
def kabkota(conn):
def kabkota(conn, provinsi_id=None):
cur = conn.cursor()
SQL = "SELECT id,nama FROM wil_kabupatenkota ORDER BY nama"
if provinsi_id:
SQL = """
SELECT id, nama
FROM wil_kabupatenkota
WHERE provinsi_id = %s
ORDER BY nama
"""
cur.execute(SQL, (provinsi_id,))
else:
SQL = "SELECT id,nama FROM wil_kabupatenkota ORDER BY nama"
cur.execute(SQL)
cur.execute(SQL)
result = cur.fetchall()
return result
@staticmethod
def kecamatan(conn):
def kecamatan(conn, kabkota_id):
cur = conn.cursor()
SQL = "SELECT id,nama FROM wil_kecamatan ORDER BY nama"
cur.execute(SQL)
if kabkota_id:
SQL = """
SELECT id, nama
FROM wil_kecamatan
WHERE kabupatenkota_id = %s
ORDER BY nama
"""
cur.execute(SQL, (kabkota_id,))
else:
SQL = "SELECT id,nama FROM wil_kecamatan ORDER BY nama"
cur.execute(SQL)
result = cur.fetchall()
return result
@ -147,20 +166,13 @@ class apiController:
kode_provinsi,
kabupaten_kota_kode,
kabupaten_kota_nama,
COUNT(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)"
COUNT(DISTINCT kelurahan_desa_id) AS jumlah_desa
FROM (
SELECT
wp.id AS provinsi_id,
wp.kode AS kode_provinsi,
wkk.id AS kabupaten_kota_id,
wkk.kode AS kabupaten_kota_kode,
wkk.nama AS kabupaten_kota_nama,
wk.id AS kecamatan_id,
wk.kode AS kecamatan_kode,
wk.nama AS kecamatan_nama,
wkd.id AS kelurahan_desa_id,
wkd.kode AS kelurahan_desa_kode,
wkd.nama AS kelurahan_desa_nama,
mid.status,
mid.tahun
FROM metrik_indeks_desa mid
@ -169,11 +181,10 @@ class apiController:
INNER JOIN wil_kabupatenkota wkk ON wk.kabupatenkota_id = wkk.id
INNER JOIN wil_provinsi wp ON wkk.provinsi_id = wp.id
WHERE mid.tahun = (SELECT MAX(tahun) FROM metrik_indeks_desa)
) AS virtual_table
WHERE kode_provinsi = %s
AND kabupaten_kota_kode = %s
GROUP BY tahun, status, kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama
ORDER BY status, kabupaten_kota_kode DESC;
AND wp.kode = %s
AND wkk.kode = %s
) AS filtered_data
GROUP BY tahun, status, kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama;
"""
cur.execute(SQL, (kode_prov, kode_kabkota))
result = cur.fetchall()
@ -708,24 +719,19 @@ class apiController:
def getTotalSerapanKab(conn, kode_kab):
cur = conn.cursor()
SQL = """
SELECT
SUM(serapan) / 1000000000 AS serapan_per_1M,
(SUM(serapan) / NULLIF(SUM(pagu), 0)) * 100 AS persentase_serapan
FROM (
WITH latest_year AS (
SELECT MAX(tahun) AS tahun FROM metrik_dana_desa
)
SELECT
wp.id provinsi_id, wp.kode provinsi_kode, wp.nama provinsi_nama,
wkk.id kabupaten_kota_id, wkk.kode kabupaten_kota_kode, wkk.nama kabupaten_kota_nama,
wk.id kecamatan_id, wk.kode kecamatan_kode, wk.nama kecamatan_nama,
wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.nama kelurahan_desa_nama,
mdd.pagu, salur_pagu, mdd.persen_serapan, mdd.tahun_anggaran
FROM metrik_dana_desa mdd
INNER JOIN wil_desa wkd ON mdd.kelurahan_desa_id = wkd.id
SUM(mdd.salur_pagu) / 1000000000 AS serapan_per_1M,
(SUM(mdd.salur_pagu) / NULLIF(SUM(mdd.pagu), 0)) * 100 AS persentase_serapan
FROM metrik_dana_desa mdd
INNER JOIN wil_desa wkd ON mdd.desa_id = wkd.id
INNER JOIN wil_kecamatan wk ON wkd.kecamatan_id = wk.id
INNER JOIN wil_kabupatenkota wkk ON wk.kabupatenkota_id = wkk.id
INNER JOIN wil_provinsi wp ON wkk.provinsi_id = wp.id
WHERE wkk.kode = %s
) AS virtual_table
WHERE tahun_anggaran = 2024;
WHERE mdd.tahun = (SELECT tahun FROM latest_year) AND
wkk.kode = %s
"""
try:
cur.execute(SQL, (kode_kab,))

View File

@ -1,5 +1,4 @@
from flask import Blueprint, jsonify, render_template
import psycopg2
from flask import Blueprint, jsonify, render_template, request
from app import mapController
from app.apiController import apiController
from app.utils import toRupiah
@ -272,14 +271,16 @@ def get_master_provinsi():
data = apiController.provinsi(conn)
return data
@main.route('/api/master/kabkota')
@main.route('/api/master/kabkota/')
def get_master_kabkota():
provinsi_id = request.args.get('provinsi_id')
with get_connection() as conn:
data = apiController.kabkota
data = apiController.kabkota(conn, provinsi_id)
return jsonify(data)
@main.route('/api/master/kecamatan')
def get_master_kecamatan():
kabkota_id = request.args.get('kabkota_id')
with get_connection() as conn:
data = apiController.kecamatan(conn)
data = apiController.kecamatan(conn,kabkota_id)
return jsonify(data)

View File

@ -583,7 +583,7 @@
}
$('#provinsiDropdown').on('change', function (e) {
const kodeProvinsi = $(this).val(); // lebih aman daripada e.target.value
const kodeProvinsi = $(this).val();
console.log("Provinsi dipilih:", kodeProvinsi);
if (!kodeProvinsi) {
@ -593,6 +593,29 @@
localStorage.setItem('kode_provinsi', kodeProvinsi);
$('#kabkotaDropdown').empty().trigger('change');
// Ambil kabupaten berdasarkan provinsi
const kabkotaURL = "{{ url_for('main.get_master_kabkota') }}";
$.ajax({
url: kabkotaURL,
data: { provinsi_id: kodeProvinsi },
dataType: 'json',
success: function (data) {
const results = data.map(kabupaten => ({
id: kabupaten[0],
text: kabupaten[1]
}));
// Tambahkan ke dropdown kabupaten
$('#kabkotaDropdown').select2({
data: results,
placeholder: 'Pilih Kabupaten/Kota',
allowClear: true
});
}
});
console.log(`Memuat kabupaten dari /geojson/kabupaten/${kodeProvinsi}`);
loadLayer(`/geojson/kabupaten/${kodeProvinsi}`, () => {
console.log("Layer kabupaten dimuat.");
@ -600,9 +623,36 @@
});
$('#kabkotaDropdown').on('change', function (e) {
const kodeKabupaten = e.target.value;
const kodeKabupaten = $(this).val();
if (!kodeKabupaten) {
console.warn("Tidak ada kode provinsi yang dipilih!");
return;
}
localStorage.setItem('kode_kabupatenkota', kodeKabupaten);
$('#kecamatanDropdown').empty().trigger('change');
// Ambil kabupaten berdasarkan provinsi
const kabkotaURL = "{{ url_for('main.get_master_kecamatan') }}";
$.ajax({
url: kabkotaURL,
data: { kabkota_id: kodeKabupaten },
dataType: 'json',
success: function (data) {
const results = data.map(kecamatan => ({
id: kecamatan[0],
text: kecamatan[1]
}));
// Tambahkan ke dropdown kabupaten
$('#kecamatanDropdown').select2({
data: results,
placeholder: 'Pilih Kabupaten/Kota',
allowClear: true
});
}
});
loadLayer(`/geojson/kecamatan/${kodeKabupaten}`, () => {}, 'kecamatan');
}).select2();
@ -611,10 +661,66 @@
localStorage.setItem('kode_kecamatan', kodeKecamatan);
loadLayer(`/geojson/desa/${kodeKecamatan}`, () => {}, 'desa');
});
</script>
<script>
$(document).ready(function () {
console.log("ready for fetching data")
const provinsiURL = "{{ url_for('main.get_master_provinsi') }}";
$('#kabkotaDropdown').empty().trigger('change');
$('#provinsiDropdown').select2({
placeholder: 'Pilih Provinsi',
allowClear: true,
ajax: {
url: provinsiURL,
dataType: 'json',
delay: 250,
data: function (params) {
return {
q: params.term
};
},
processResults: function (data) {
console.log(data)
return {
results: data.map(provinsi => ({
id: provinsi[0],
text: provinsi[1]
}))
};
},
cache: true
},
minimumInputLength: 0
});
$('#kabkotaDropdown').select2({
placeholder: 'Pilih Kabkota',
allowClear: true,
ajax: {
url: provinsiURL,
dataType: 'json',
delay: 250,
data: function (params) {
return {
q: params.term
};
},
processResults: function (data) {
console.log(data)
return {
results: data.map(provinsi => ({
id: provinsi[0],
text: provinsi[1]
}))
};
},
cache: true
},
minimumInputLength: 0
});
$('#provinsiDropdown').select2({
placeholder: 'Pilih Desa',
allowClear: true,