// Необходим jQuery
// Использование:
//
//
//
// TODO: Описать, как прописываются кнопки открытия модального окна и параметрами контента (тип контента и норер).
$(document).ready(function () {
// ------------------
// ------------------
// Начальная инициализаци:
// Загрузка модального окна и помещение его в теле странцы
// ------------------
// ------------------
function serveFeedbackModal() {
const csrf_token = window.csrf_token;
$.ajax({
url: 'user-interaction.feedback-init',
method: 'POST',
data: {
csrf_token: csrf_token
},
success: function (response) {
// если ошибка, все подробности в консоле, ничего другого не делать
if (response.hasError) {
console.error("Ошибка инициализации feedback:", response.message);
return;
}
// Вставляем html модального окна в конец
const html = response.html;
$('body').append(html);
// init Feedback Modal
addListenerToFeedbackForm();
},
error: function (jqXHR, textStatus, errorThrown) {
console.error("Ошибка AJAX при инициализации feedback:", textStatus, errorThrown);
}
});
};
// ------------------
// ------------------
// Поиск и активация кнопок Feedback на странице
// ------------------
// ------------------
function activateFeedback() {
$(".sl-user-interaction .sl-feedback").each(function () { activateFeedbackButton(this) });
}
function activateFeedbackButton(feedback) {
var $feedback = $(feedback);
// Проверяем, загружены ли данные (data-loaded)
if ($feedback.attr("data-loaded") === "1") {
return; // Уже загружено, пропускаем
}
//
$feedback.data("data-loaded", 1).attr("data-loaded", 1);
}
// ------------------
// ------------------
serveFeedbackModal(); // грузим модальное окно из сервера и помещаем его на странице
activateFeedback(); // активируем кнопки (до загрузки они деактивированы)
// ------------------
// ------------------
$(document).on("click", ".sl-feedback .sl-open-feedback", function (e) {
e.preventDefault();
const $container = $(this).closest(".sl-user-interaction");
const contentType = $container.data("content-type");
const contentId = $container.data("content-id");
// -- Подготовить данные для показа модального окна
const $form = $('#feedbackForm');
const $titleField = $form.find('#feedbackContentTitle');
const $typeField = $form.find('#feedbackContentType');
const $idField = $form.find('#feedbackContentId');
const $messageArea = $form.find('#feedbackMessage');
// клик из другой кнопки feedbak, чем предыдущий вызов
if (contentType !== $typeField.val() || contentId !== $idField.val()) {
// очистка предыдущих значений, обновление данных контента
$titleField.text(null); // clear
$typeField.val(contentType);
$idField.val(contentId);
$messageArea.val(''); // clear
// запрос заголовка
const csrf_token = window.csrf_token;
$.ajax({
url: "user-interaction.feedback",
method: "POST",
data: {
csrf_token: csrf_token,
action: 'contentInfo',
content_type: contentType,
content_id: contentId,
},
success: function (response) {
if (response.hasError) {
showToast(response.message, "danger");
console.error("Ошибка загрузки данных - title:", response.message);
return;
}
var responseTitle = response.data.contentTitle;
$titleField.text(responseTitle);
},
error: function (jqXHR, textStatus, errorThrown) {
console.error("Ошибка AJAX:", textStatus, errorThrown);
}
});
}
// Показываем модалку
const modalEl = document.getElementById('feedbackModal');
//new bootstrap.Modal(modalEl).show();
bootstrap.Modal.getOrCreateInstance(modalEl).show();
});
// ------------------
// отправка данных
// ------------------
function addListenerToFeedbackForm() {
$('#feedbackModal').on("submit", '#feedbackForm', function (e) {
e.preventDefault();
handleSaveFeedback(e);
});
}
function handleSaveFeedback(e) {
// собираем данные
// old // var formData = $(this).serializeArray();
var formData = $(e.target).serializeArray();
const csrf_token = window.csrf_token;
// var recaptchaResponse = grecaptcha.getResponse();
// добавить данные
// formData.push({ name: 'g-recaptcha-response', value: recaptchaResponse });
formData.push({ name: 'csrf_token', value: csrf_token });
formData.push({ name: 'action', value: 'save' });
// alert(JSON.stringify(formData, null, 2));
$.ajax({
url: "user-interaction.feedback",
method: "POST",
data: $.param(formData),
beforeSend: function () {
// заблокировать кнопку (опционально)
$('#feedbackForm button[type=submit]').prop('disabled', true);
},
success: function (response) {
if (response.hasError) {
showToast(response.message, "danger");
return;
}
var responseMessage = response.message;
$('#feedbackModal').modal('hide');
$('#feedbackMessage').val(''); // очистить поле ввода
// Выводим сообщение в тостере (если есть)
if (responseMessage != null && responseMessage !== '') {
showToast(responseMessage, "success");
}
},
error: function (jqXHR, textStatus, errorThrown) {
console.error("AJAX Error:", textStatus, errorThrown); // Логируем текст ошибки
showToast("Произошла ошибка при отправке. Попробуйте позже.", "danger");
},
complete: function () {
$('#feedbackForm button[type=submit]').prop('disabled', false);
// если используется капча, сбросить виджет: grecaptcha.reset();
}
});
}
});