22 lines
5.5 KiB
JavaScript
22 lines
5.5 KiB
JavaScript
document.addEventListener('DOMContentLoaded',()=>{
|
|
const root=document.querySelector('[data-customer-picker]');if(!root)return;
|
|
const search=root.querySelector('[data-customer-search]'),results=root.querySelector('[data-customer-results]'),status=root.querySelector('[data-customer-status]');
|
|
const idInput=root.querySelector('[data-customer-id]'),mobile=root.querySelector('#id_customer_mobile'),first=root.querySelector('#id_first_name'),last=root.querySelector('#id_last_name'),province=root.querySelector('#id_province'),city=root.querySelector('#id_city');
|
|
const selected=root.querySelector('[data-selected-customer]');let timer,requestToken=0;
|
|
const identityRows=[first?.closest('[data-new-customer-field]'),last?.closest('[data-new-customer-field]')].filter(Boolean);
|
|
const summaryCustomer=root.querySelector('[data-summary-customer]'),summarySubject=root.querySelector('[data-summary-subject]'),summaryCategory=root.querySelector('[data-summary-category]'),subject=root.querySelector('#id_subject'),category=root.querySelector('#id_category');
|
|
const escapeHtml=value=>String(value??'').replace(/[&<>'"]/g,char=>({'&':'&','<':'<','>':'>',"'":''','"':'"'}[char]));
|
|
function setNewCustomer(isNew){identityRows.forEach(row=>row.hidden=!isNew);status.className=`customer-lookup-status ${isNew?'is-new':'is-found'}`;status.textContent=isNew?'این شماره در سامانه ثبت نشده است؛ نام و نام خانوادگی مشتری جدید را تکمیل کنید.':'مشتری موجود انتخاب شد؛ مشخصات ثبتشده در بالا نمایش داده شده است.'}
|
|
function selectCustomer(customer){idInput.value=customer.id;mobile.value=customer.mobile;first.value=customer.first_name;last.value=customer.last_name;province.value=customer.province;city.value=customer.city;selected.hidden=false;selected.querySelector('[data-selected-name]').textContent=customer.name;selected.querySelector('[data-selected-mobile]').textContent=customer.mobile;selected.querySelector('[data-selected-location]').textContent=[customer.city,customer.province].filter(Boolean).join('، ')||'موقعیت ثبت نشده';selected.querySelector('[data-selected-stats]').textContent=`${customer.ticket_count} تیکت، ${customer.active_count} فعال`;summaryCustomer.textContent=customer.name;results.hidden=true;search.value='';setNewCustomer(false);province.dispatchEvent(new Event('input',{bubbles:true}))}
|
|
function clearCustomer(clearMobile=true){idInput.value='';selected.hidden=true;identityRows.forEach(row=>row.hidden=false);if(clearMobile)mobile.value='';first.value='';last.value='';province.value='';city.value='';summaryCustomer.textContent='هنوز انتخاب نشده';status.className='customer-lookup-status';status.textContent='شماره موبایل را وارد کنید تا عضویت مشتری بررسی شود.'}
|
|
async function lookup(params,showList=false){const token=++requestToken;try{const response=await fetch(`${root.dataset.searchUrl}?${params}`,{headers:{'Accept':'application/json'}});if(!response.ok)throw new Error();const data=await response.json();if(token!==requestToken)return;if(showList){results.innerHTML=data.results.length?data.results.map(item=>`<button type="button" data-customer-result='${escapeHtml(JSON.stringify(item))}'><b>${escapeHtml(item.name)}</b><span dir="ltr">${escapeHtml(item.mobile)}</span><small>${escapeHtml([item.city,item.province].filter(Boolean).join('، ')||'موقعیت ثبت نشده')} · ${item.ticket_count} تیکت</small></button>`).join(''):'<p>مشتریای با این عبارت پیدا نشد.</p>';results.hidden=false}else if(data.results.length&&data.results[0].mobile.replace(/\D/g,'')===mobile.value.replace(/\D/g,'').replace(/^98(?=9)/,'0'))selectCustomer(data.results[0]);else{if(idInput.value)clearCustomer(false);setNewCustomer(true)}}catch{status.className='customer-lookup-status is-error';status.textContent='بررسی مشتری ممکن نشد؛ اتصال را بررسی و دوباره تلاش کنید.'}}
|
|
search.addEventListener('input',()=>{clearTimeout(timer);const value=search.value.trim();if(value.length<2){results.hidden=true;return}timer=setTimeout(()=>lookup(`q=${encodeURIComponent(value)}`,true),300)});
|
|
results.addEventListener('click',event=>{const button=event.target.closest('[data-customer-result]');if(button)selectCustomer(JSON.parse(button.dataset.customerResult))});
|
|
root.querySelector('[data-clear-customer]').addEventListener('click',()=>{clearCustomer();search.focus()});
|
|
mobile.addEventListener('input',()=>{if(idInput.value&&mobile.value!==selected.querySelector('[data-selected-mobile]').textContent)clearCustomer(false);clearTimeout(timer);const digits=mobile.value.replace(/\D/g,'');if(digits.length<10){status.className='customer-lookup-status';status.textContent='شماره موبایل را کامل وارد کنید.';return}status.textContent='در حال بررسی شماره…';timer=setTimeout(()=>lookup(`q=${encodeURIComponent(mobile.value)}`),350)});
|
|
if(idInput.value)lookup(`id=${encodeURIComponent(idInput.value)}`);else if(mobile.value)mobile.dispatchEvent(new Event('input'));
|
|
subject?.addEventListener('input',()=>summarySubject.textContent=subject.value.trim()||'هنوز وارد نشده');
|
|
category?.addEventListener('change',()=>summaryCategory.textContent=category.selectedOptions[0]?.text||'انتخاب نشده');
|
|
if(subject?.value)summarySubject.textContent=subject.value;if(category?.value)summaryCategory.textContent=category.selectedOptions[0]?.text;
|
|
});
|