66 lines
4.1 KiB
JavaScript
66 lines
4.1 KiB
JavaScript
/* Server calculates the identifier from the selected customer's stored mobile.
|
|
Manual values remain editable. Changing customer clears an unchanged auto value. */
|
|
(() => {
|
|
const button = document.querySelector('#generate-deposit-identifier');
|
|
if (!button) return;
|
|
const form = button.closest('form');
|
|
const customer = form.elements.namedItem('customer');
|
|
const input = form.elements.namedItem('deposit_id');
|
|
const status = document.querySelector('#identifier-generation-status');
|
|
const replacement = document.querySelector('#identifier-replacement');
|
|
const candidate = document.querySelector('#identifier-candidate');
|
|
const originalLabel = button.innerHTML;
|
|
let activeCustomer = customer.value, generated = '', pending = '', controller = null;
|
|
function customerChanged() {
|
|
if (activeCustomer !== customer.value) {
|
|
controller?.abort(); controller = null;
|
|
if (generated && input.value === generated) input.value = '';
|
|
generated = ''; pending = ''; replacement.hidden = true;
|
|
activeCustomer = customer.value;
|
|
}
|
|
button.disabled = !customer.value;
|
|
button.innerHTML = originalLabel;
|
|
status.textContent = customer.value ? 'شناسه بر اساس شماره موبایل مشتری انتخابشده تولید میشود.' : 'ابتدا مشتری را انتخاب کنید؛ شناسه بر اساس شماره موبایل او تولید میشود.';
|
|
}
|
|
function applyIdentifier(value) {
|
|
input.value = value; generated = value; pending = '';
|
|
replacement.hidden = true;
|
|
input.dispatchEvent(new Event('input', {bubbles:true}));
|
|
input.dispatchEvent(new Event('change', {bubbles:true}));
|
|
input.focus();
|
|
status.textContent = 'شناسه تولید و در فیلد وارد شد؛ قبل از صدور اعلامیه آن را بررسی کنید.';
|
|
}
|
|
customer.addEventListener('change', customerChanged);
|
|
button.addEventListener('click', async () => {
|
|
if (!customer.value) return;
|
|
const selectedCustomer = customer.value;
|
|
const request = new AbortController(); controller = request;
|
|
button.disabled = true; button.textContent = 'در حال تولید…';
|
|
replacement.hidden = true;
|
|
status.textContent = 'در حال دریافت شناسه از سیستم…';
|
|
let failureMessage = 'شناسه دریافت نشد؛ اتصال را بررسی کنید و دوباره تلاش کنید.';
|
|
try {
|
|
const response = await fetch(button.dataset.url, {
|
|
method: 'POST', credentials: 'same-origin', cache: 'no-store', signal: request.signal,
|
|
headers: {'X-CSRFToken': form.elements.namedItem('csrfmiddlewaretoken').value},
|
|
body: new URLSearchParams({customer: selectedCustomer})
|
|
});
|
|
const data = await response.json();
|
|
if (request !== controller || customer.value !== selectedCustomer) return;
|
|
if (!response.ok) {failureMessage = data.error || 'شناسه تولید نشد؛ دوباره تلاش کنید.'; throw new Error('generation');}
|
|
if (data.customer !== selectedCustomer || !/^9[0-9]{11}$/.test(data.identifier)) {failureMessage = 'پاسخ سیستم معتبر نیست؛ دوباره تلاش کنید.'; throw new Error('generation');}
|
|
if (input.value.trim() && input.value !== data.identifier) {
|
|
pending = data.identifier; candidate.textContent = pending; replacement.hidden = false;
|
|
status.textContent = 'شناسه آماده است؛ برای جایگزینی مقدار فعلی، دکمه جایگزینی را بزنید.';
|
|
} else applyIdentifier(data.identifier);
|
|
} catch (error) {
|
|
if (error.name !== 'AbortError' && request === controller) status.textContent = failureMessage;
|
|
} finally {
|
|
if (request === controller) {controller = null; button.disabled = !customer.value; button.innerHTML = originalLabel;}
|
|
}
|
|
});
|
|
document.querySelector('#apply-deposit-identifier').addEventListener('click', () => {if (pending) applyIdentifier(pending);});
|
|
document.querySelector('#cancel-deposit-identifier').addEventListener('click', () => {pending = ''; replacement.hidden = true; status.textContent = 'شناسه فعلی حفظ شد.'; button.focus();});
|
|
customerChanged();
|
|
})();
|