Update Koperasi
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
'use strict';
|
||||
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
document.querySelectorAll('[data-koperasi-wilayah], #koperasi-filter-form').forEach(container => {
|
||||
const levels = ['provinsi', 'kabupaten', 'kecamatan', 'desa']
|
||||
.map(name => ({ name, input: container.querySelector(`[data-wilayah-${name}]`) }))
|
||||
.filter(level => level.input);
|
||||
const controllers = new Map();
|
||||
const updateRequired = () => {
|
||||
if (!container.matches('[data-koperasi-wilayah]')) return;
|
||||
const hasSelection = levels.some(level => level.input.value);
|
||||
levels.forEach(level => { level.input.required = hasSelection; });
|
||||
};
|
||||
const reset = level => {
|
||||
controllers.get(level.name)?.abort();
|
||||
level.input.replaceChildren(new Option(level.input.options[0].textContent, ''));
|
||||
level.input.disabled = true;
|
||||
};
|
||||
levels.forEach((level, index) => {
|
||||
if (index === levels.length - 1) return;
|
||||
level.input.addEventListener('change', async () => {
|
||||
levels.slice(index + 1).forEach(reset);
|
||||
updateRequired();
|
||||
if (!level.input.value) return;
|
||||
const child = levels[index + 1];
|
||||
const controller = new AbortController();
|
||||
controllers.set(child.name, controller);
|
||||
const url = new URL(container.dataset[`${child.name}Url`].replace(':id', encodeURIComponent(level.input.value)), window.location.href);
|
||||
url.searchParams.set('all_wilayah', '1');
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
signal: controller.signal,
|
||||
headers: { 'Accept': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.content || '' }
|
||||
});
|
||||
if (!response.ok) throw new Error('Wilayah gagal dimuat');
|
||||
const options = await response.json();
|
||||
if (controller.signal.aborted) return;
|
||||
options.forEach(option => child.input.add(new Option(option.nama, option.id)));
|
||||
child.input.disabled = false;
|
||||
updateRequired();
|
||||
} catch (error) {
|
||||
if (error.name === 'AbortError') return;
|
||||
child.input.add(new Option('Gagal memuat wilayah, pilih ulang wilayah induk', '', false, true));
|
||||
}
|
||||
});
|
||||
});
|
||||
updateRequired();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user