first
This commit is contained in:
commit
fa9d154db9
260 files changed
+17643
No files matched your search
@@ -0,0 +1,38 @@
|
||||
document.querySelectorAll('[data-location-picker]').forEach(async picker=>{
|
||||
const province=picker.querySelector('[data-province-input]');
|
||||
const city=picker.querySelector('[data-city-input]');
|
||||
const provinceList=picker.querySelector('[data-province-options]')||(province?.matches('select')?province:null);
|
||||
const cityList=picker.querySelector('[data-city-options]')||(city?.matches('select')?city:null);
|
||||
const hint=picker.querySelector('[data-location-hint]');
|
||||
if(!province||!city||!provinceList||!cityList)return;
|
||||
|
||||
const normalize=value=>(value||'').trim().replace(/ي/g,'ی').replace(/ك/g,'ک');
|
||||
const setHint=(text,error=false)=>{if(!hint)return;hint.textContent=text;hint.classList.toggle('is-error',error)};
|
||||
const fill=(list,values,placeholder='')=>{
|
||||
const selected=normalize(list.value);
|
||||
const options=values.map(value=>{const option=document.createElement('option');option.value=value;option.textContent=value;return option});
|
||||
if(list.matches('select')){const empty=document.createElement('option');empty.value='';empty.textContent=placeholder;options.unshift(empty)}
|
||||
list.replaceChildren(...options);
|
||||
if(values.includes(selected))list.value=selected;
|
||||
};
|
||||
try{
|
||||
const response=await fetch(picker.dataset.locationsUrl,{cache:'force-cache'});
|
||||
if(!response.ok)throw new Error('location data unavailable');
|
||||
const rows=await response.json();
|
||||
const locations=new Map(rows.map(row=>[normalize(row.province),row.cities]));
|
||||
fill(provinceList,rows.map(row=>row.province),'انتخاب استان');
|
||||
const syncCities=(clearInvalid=false)=>{
|
||||
const cities=locations.get(normalize(province.value))||[];
|
||||
fill(cityList,cities,'انتخاب شهر');
|
||||
city.disabled=!cities.length;
|
||||
if(clearInvalid&&city.value&&!cities.includes(normalize(city.value)))city.value='';
|
||||
setHint(cities.length?`${cities.length.toLocaleString('fa-IR')} شهر برای این استان در دسترس است.`:'برای نمایش شهرها، یک استان معتبر انتخاب کنید.',Boolean(province.value&&!cities.length));
|
||||
};
|
||||
province.addEventListener('input',()=>syncCities(true));
|
||||
province.addEventListener('change',()=>syncCities(true));
|
||||
city.addEventListener('change',()=>{const cities=locations.get(normalize(province.value))||[];setHint(!city.value||cities.includes(normalize(city.value))?'موقعیت انتخابی برای همین تیکت استفاده میشود.':'شهر را از فهرست همین استان انتخاب کنید.',Boolean(city.value&&!cities.includes(normalize(city.value))))});
|
||||
syncCities(false);
|
||||
}catch(error){
|
||||
province.disabled=true;city.disabled=true;setHint('فهرست شهرها بارگذاری نشد؛ صفحه را دوباره باز کنید.',true);
|
||||
}
|
||||
});
|
||||
Reference in new issue
Block a user