From 87b1b1c8809960ad5153f79f8aad23ede846c144 Mon Sep 17 00:00:00 2001 From: Repellent Date: Tue, 30 Dec 2025 13:22:18 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=B8=D0=B4=D0=B6=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/comment.js | 181 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 127 insertions(+), 54 deletions(-) diff --git a/js/comment.js b/js/comment.js index 6eda360..5ad4d6e 100644 --- a/js/comment.js +++ b/js/comment.js @@ -438,7 +438,7 @@ $doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() { -// НАЧАЛО $doc.off('click', '.mod_comment_edit') +// НАЧАЛО $doc.off('click', '.mod_comment_edit') РЕДАКТИРОВАНИЕ КОММЕНТАРИЯ $doc.off('click', '.mod_comment_edit').on('click', '.mod_comment_edit', function(e) { e.preventDefault(); @@ -750,63 +750,136 @@ $doc.on('click', '.saveButton', function() { }); }); +// Глобальный массив для файлов НОВОГО комментария +var newCommentPendingFiles = []; + +// Обработка выбора файлов в основной форме +// ДОБАВИЛИ .off('change') чтобы не было дублей +$doc.off('change', '#comment_image').on('change', '#comment_image', function() { + var files = this.files; + var $previewWrapper = $('#image_preview_wrapper'); + var $errorDisplay = $('#file_error'); // добавили переменную для ошибок + + if (files) { + $.each(files, function(i, file) { + // --- ТВОЯ ВАЛИДАЦИЯ (Screenshot 7 и 8) --- + if (typeof checkFileConsistency === 'function') { + if (!checkFileConsistency(file, $errorDisplay)) { + return true; // если файл плохой - пропускаем его + } + } + // ------------------------------------------ + + newCommentPendingFiles.push(file); + var currentIndex = newCommentPendingFiles.length - 1; + + var reader = new FileReader(); + reader.onload = function(e) { + // ПРОВЕРКА: если превью для этого файла уже есть - не добавляем второе + if ($previewWrapper.find(`[data-index="${currentIndex}"]`).length > 0) return; + + $previewWrapper.removeClass('d-none'); // показываем только когда есть что показать + $previewWrapper.append(` +
+ + +
`); + }; + reader.readAsDataURL(file); + }); + } + // Очищаем инпут + $(this).val(''); +}); + +// Удаление выбранного файла из очереди в новой форме +$doc.on('click', '.remove-new-comment-img', function() { + var $item = $(this).closest('.new-comment-file-item'); + var index = $item.data('index'); + newCommentPendingFiles[index] = null; // Помечаем удаленным + $item.fadeOut(200, function() { + $(this).remove(); + if ($('#image_preview_wrapper').children().length === 0) { + $('#image_preview_wrapper').addClass('d-none'); + } + }); +}); + +// Очистка при нажатии кнопки "Сбросить" (reset) +$doc.on('click', '#buttonReset', function() { + newCommentPendingFiles = []; + $('#image_preview_wrapper').empty().addClass('d-none'); + // Добавляем вот эту строку, чтобы убрать текст ошибки + $('#file_error').addClass('d-none').text(''); +}); + // Отправка новой формы (или ответа) - $doc.on('submit', '#mod_comment_new form', function(e) { - e.preventDefault(); - if (!validate(this)) return false; +$doc.on('submit', '#mod_comment_new form', function(e) { + e.preventDefault(); + if (!validate(this)) return false; - var $form = $(this); - var $btn = $form.find('[type="submit"]'); - var originalBtnText = $btn.text(); + var $form = $(this); + var $btn = $form.find('[type="submit"]'); + var originalBtnText = $btn.text(); - // --- ДОБАВЛЕНА ЛОГИКА ДЛЯ МНОЖЕСТВЕННЫХ ФАЙЛОВ --- - var formData = new FormData(this); - var fileInput = $form.find('#comment_image')[0]; - - if (fileInput && fileInput.files.length > 0) { - // Удаляем одиночное поле, чтобы заменить его массивом - formData.delete('comment_image'); - // Добавляем каждый файл в массив comment_image[] - for (var i = 0; i < fileInput.files.length; i++) { - formData.append('comment_image[]', fileInput.files[i]); - } - } - // ------------------------------------------------ + // --- ВОТ ЭТОТ БЛОК МЫ ЗАМЕНИЛИ --- + var formData = new FormData(this); - $.ajax({ - url: aveabspath + 'index.php?ajax=1', - type: 'POST', - data: formData, // Используем formData с поддержкой нескольких файлов - processData: false, - contentType: false, - xhr: function() { - var xhr = new window.XMLHttpRequest(); - xhr.upload.addEventListener("progress", function(evt) { - if (evt.lengthComputable) { - var pct = Math.round((evt.loaded / evt.total) * 100); - $('#upload_progress_container').removeClass('d-none'); - $('#upload_progress_bar').css('width', pct + '%'); - $('#upload_status_text').text('Загрузка: ' + pct + '%'); - } - }, false); - return xhr; - }, - beforeSend: function() { $btn.prop('disabled', true).text('Отправка...'); }, - success: function(data) { - if (data.includes('wrong_securecode')) { - alert("Код капчи введен неверно!"); - getCaptha(); - $btn.prop('disabled', false).text(originalBtnText); - $('#upload_progress_container').addClass('d-none'); - } else { location.reload(); } - }, - error: function() { - alert("Ошибка связи с сервером"); - $btn.prop('disabled', false).text(originalBtnText); - $('#upload_progress_container').addClass('d-none'); - } - }); - }); + // 1. Удаляем стандартные значения, чтобы они не дублировались из инпута + formData.delete('comment_image'); + formData.delete('comment_image[]'); + + // 2. Добавляем файлы из нашего накопленного массива newCommentPendingFiles + if (newCommentPendingFiles && newCommentPendingFiles.length > 0) { + newCommentPendingFiles.forEach(function(file) { + if (file !== null) { + formData.append('comment_image[]', file); + } + }); + } + // --------------------------------- + + $.ajax({ + url: aveabspath + 'index.php?ajax=1', + type: 'POST', + data: formData, + processData: false, + contentType: false, + xhr: function() { + var xhr = new window.XMLHttpRequest(); + xhr.upload.addEventListener("progress", function(evt) { + if (evt.lengthComputable) { + var pct = Math.round((evt.loaded / evt.total) * 100); + $('#upload_progress_container').removeClass('d-none'); + $('#upload_progress_bar').css('width', pct + '%'); + $('#upload_status_text').text('Загрузка: ' + pct + '%'); + } + }, false); + return xhr; + }, + beforeSend: function() { $btn.prop('disabled', true).text('Отправка...'); }, + success: function(data) { + if (data.includes('wrong_securecode')) { + alert("Код капчи введен неверно!"); + getCaptha(); + $btn.prop('disabled', false).text(originalBtnText); + $('#upload_progress_container').addClass('d-none'); + } else { + // Очищаем массив перед перезагрузкой + newCommentPendingFiles = []; + location.reload(); + } + }, + error: function() { + alert("Ошибка связи с сервером"); + $btn.prop('disabled', false).text(originalBtnText); + $('#upload_progress_container').addClass('d-none'); + } + }); +}); $doc.on('click', '#captcha img, #reload_captcha', function(e) { e.preventDefault(); getCaptha(); }); });