// Необходим 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(); } }); } });