function ticketFileUpload(inputId, nonce) {
var input = document.getElementById(inputId);
if (!input) return;
var wrapper = input.closest('.ticket-file-upload');
var previews = wrapper.querySelector('.ticket-file-upload__previews');
input.addEventListener('change', function () {
var file = this.files[0];
if (!file) return;
this.value = '';
var objectUrl = URL.createObjectURL(file);
var item = document.createElement('div');
item.className = 'ticket-file-upload__preview-item ticket-file-upload__preview-item--loading';
item.innerHTML =
'' +
'
' +
'' + file.name + '' +
'در حال آپلود...' +
'
' +
'';
previews.appendChild(item);
item.querySelector('.ticket-file-upload__preview-remove').addEventListener('click', function () {
URL.revokeObjectURL(objectUrl);
item.remove();
});
var fd = new FormData();
fd.append('action', 'upload_ticket_media');
fd.append('_wpnonce', nonce);
fd.append('file', file);
fetch(ajaxurl, { method: 'POST', body: fd })
.then(function (r) { return r.json(); })
.then(function (res) {
item.classList.remove('ticket-file-upload__preview-item--loading');
var statusEl = item.querySelector('.ticket-file-upload__preview-status');
if (res.success) {
item.classList.add('ticket-file-upload__preview-item--done');
statusEl.textContent = 'آپلود شد';
var hidden = document.createElement('input');
hidden.type = 'hidden';
hidden.name = 'file_ids[]';
hidden.value = res.data.file_id;
item.appendChild(hidden);
} else {
item.classList.add('ticket-file-upload__preview-item--error');
statusEl.textContent = (res.data && res.data.message) ? res.data.message : 'خطا در آپلود';
}
})
.catch(function () {
item.classList.remove('ticket-file-upload__preview-item--loading');
item.classList.add('ticket-file-upload__preview-item--error');
item.querySelector('.ticket-file-upload__preview-status').textContent = 'خطا در آپلود';
});
});
}
(function (window, document) {
'use strict';
var sections = [
{
prefix: 'dashboard',
label: 'پیشخوان وردپرس'
},
{
prefix: 'host_panel',
label: 'کنترل پنل هاست'
}
];
function showError(message) {
if (window.BasalamToast) {
window.BasalamToast.error(message);
}
}
function field(form, name) {
return form.querySelector('[name="' + name + '"]');
}
function validateAccess(form) {
for (var i = 0; i < sections.length; i++) {
var section = sections[i];
var loginUrl = field(form, section.prefix + '_login_url');
var username = field(form, section.prefix + '_username');
var password = field(form, section.prefix + '_password');
if (!loginUrl || !username || !password) continue;
var loginValue = loginUrl.value.trim();
var usernameValue = username.value.trim();
var passwordValue = password.value;
var hasAnyValue = loginValue !== '' || usernameValue !== '' || passwordValue !== '';
if (!hasAnyValue) continue;
if (usernameValue === '' || passwordValue === '') {
var missingField = usernameValue === '' ? username : password;
missingField.setAttribute('aria-invalid', 'true');
missingField.focus();
showError('برای ' + section.label + ' نام کاربری و رمز عبور را کامل وارد کنید.');
return false;
}
if (passwordValue.length > 1024 || /[\u0000-\u001F\u007F]/.test(passwordValue)) {
password.setAttribute('aria-invalid', 'true');
password.focus();
showError(passwordValue.length > 1024
? 'رمز عبور طولانیتر از حد مجاز است.'
: 'رمز عبور دارای نویسه کنترلی نامعتبر است.');
return false;
}
}
return true;
}
function setSubmitting(form, submitting) {
var submitButton = form.querySelector('button[type="submit"]');
if (!submitButton) return;
submitButton.disabled = submitting;
if (submitting) {
submitButton.dataset.originalText = submitButton.textContent;
submitButton.textContent = 'در حال ارسال...';
} else if (submitButton.dataset.originalText) {
submitButton.textContent = submitButton.dataset.originalText;
delete submitButton.dataset.originalText;
}
}
function rememberCreatedTicket(form, ticketId) {
if (!ticketId) return;
var input = field(form, 'existing_ticket_id');
if (!input) {
input = document.createElement('input');
input.type = 'hidden';
input.name = 'existing_ticket_id';
form.appendChild(input);
}
input.value = String(ticketId);
}
function submitCreateTicket(form) {
setSubmitting(form, true);
fetch(window.ajaxurl, {
method: 'POST',
body: new FormData(form),
credentials: 'same-origin'
})
.then(function (response) {
return response.json();
})
.then(function (response) {
var data = response && response.data ? response.data : {};
if (!response || !response.success) {
rememberCreatedTicket(form, data.ticket_id);
showError(data.message || 'خطایی در ثبت تیکت رخ داد. اطلاعات فرم حفظ شده است.');
return;
}
if (data.redirect_url) {
window.location.assign(data.redirect_url);
}
})
.catch(function () {
showError('ارتباط با سرور برقرار نشد. اطلاعات فرم حفظ شده است.');
})
.finally(function () {
setSubmitting(form, false);
});
}
document.addEventListener('DOMContentLoaded', function () {
var actionInputs = document.querySelectorAll(
'input[name="action"][value="create_ticket"], ' +
'input[name="action"][value="create_ticket_item"]'
);
for (var i = 0; i < actionInputs.length; i++) {
var form = actionInputs[i].closest('form');
if (!form || form.dataset.ticketAccessValidation === '1') continue;
form.dataset.ticketAccessValidation = '1';
form.addEventListener('submit', function (event) {
if (!validateAccess(event.currentTarget)) {
event.preventDefault();
return;
}
var action = field(event.currentTarget, 'action');
if (action && action.value === 'create_ticket') {
event.preventDefault();
submitCreateTicket(event.currentTarget);
}
});
}
});
})(window, document);