`;
}
}
// --- СБОРКА ФОРМЫ ---
// --- ПРОВЕРКА ПРАВ НА ЗАГРУЗКУ ---
var canUploadFiles = false;
if (typeof ALLOW_FILES !== 'undefined' && ALLOW_FILES == '1') {
if (typeof UGROUP !== 'undefined' && UGROUP == '2') {
if (typeof ALLOW_FILES_ANON !== 'undefined' && ALLOW_FILES_ANON == '1') canUploadFiles = true;
} else {
canUploadFiles = true;
}
}
var uploadBlockHtml = '';
if (canUploadFiles) {
uploadBlockHtml = `
${ALLOWED_EXTENSIONS.replace(/,/g, ', ')} | до ${MAX_FILE_SIZE_KB} KB
`;
}
var editHtml = `
${starsEditBlock}
${existingImagesHtml !== '' ? `
${COMMENT_JS_LOADED_FILES}
${existingImagesHtml}
` : ''}
${uploadBlockHtml}
${COMMENT_JS_EDIT_BUT_LEFT}
`;
// Прячем текст комментария
$textBlock.hide();
// Прячем ВЕСЬ контейнер с файлами
$('#image_container_' + cid).attr('style', 'display: none !important;');
// Для надежности скрываем всё остальное
$wrapper.find('.mod_comment_attached_images, .comment-files').hide();
$textBlock.after(editHtml);
// --- НАКОПИТЕЛЬНОЕ ПРЕВЬЮ НОВЫХ ФАЙЛОВ ---
var pendingFiles = []; // Массив для хранения всех выбранных файлов
$wrapper.find('.edit-form-container').data('pendingFiles', pendingFiles);
// Проверяем права, прежде чем вешать обработчик
if (canUploadFiles) {
$('#new_file_' + cid).on('change', function() {
var files = this.files;
var $input = $(this);
var $currentEditForm = $input.closest('.edit-form-container');
var $errorDisplay = $currentEditForm.find('.js-file-error');
var maxLimit = parseInt(typeof MAX_FILES_COUNT !== 'undefined' ? MAX_FILES_COUNT : 5);
if (files) {
$errorDisplay.text('').hide();
$.each(files, function(i, file) {
var alreadyInPost = $currentEditForm.find('[id^="existing_wrapper_"]').length;
var inPending = pendingFiles.filter(f => f !== null).length;
if ((alreadyInPost + inPending) >= maxLimit) {
$errorDisplay.text(' ' + COMMENT_JS_LIMIT_AB + ' ' + maxLimit + ' ' + COMMENT_JS_LIMIT_ABC).show();
return false;
}
// ПРОВЕРКА ЧЕРЕЗ ФУНКЦИЮ (она берет ALLOWED_EXTENSIONS)
if (!checkFileConsistency(file, $errorDisplay)) return true;
pendingFiles.push(file);
var currentIndex = pendingFiles.length - 1;
var fileExt = file.name.split('.').pop().toLowerCase();
var isImage = ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(fileExt);
var reader = new FileReader();
reader.onload = function(e) {
var $previewContainer = $('#new_files_preview_' + cid);
if ($previewContainer.length === 0) {
$input.after(``);
$previewContainer = $('#new_files_preview_' + cid);
}
var content = isImage
? ``
: `
${fileExt}
`;
$previewContainer.append(`
${content}
`);
};
if (isImage) reader.readAsDataURL(file);
else reader.onload({target: {result: ''}});
});
}
});
}
// Обработчик удаления НОВОГО файла из превью (до сохранения)
$doc.off('click', '.remove-new-file').on('click', '.remove-new-file', function() {
var $item = $(this).closest('.new-file-item');
var index = $item.data('index');
pendingFiles[index] = null; // Помечаем как удаленный
$item.remove();
// Ищем через ближайший контейнер формы, чтобы точно попасть в нужный блок текста
$(this).closest('.edit-form-container').find('.js-file-error').hide().text('');
});
// --- КОНЕЦ ВСТАВКИ ---
// Добавил поддержку лимита символов
if ($.fn.limit) {
$('#ta_' + cid).limit(MAX_CHARS, '#charsLeft_' + cid);
}
$('#ta_' + cid).focus();
});
// КОНЕЦ $doc.off('click', '.mod_comment_edit')
$doc.on('click', '.remove-existing-img', function() {
var cid = $(this).data('id');
var imgPath = $(this).data('img-path');
var targetId = $(this).data('target');
// 1. Очищаем текст ошибки
$('#file_error_' + cid).addClass('d-none').text('');
var $deleteInput = $('#delete_files_' + cid);
var currentDeleteList = $deleteInput.val() ? $deleteInput.val().split(',') : [];
if (currentDeleteList.indexOf(imgPath) === -1) {
currentDeleteList.push(imgPath);
$deleteInput.val(currentDeleteList.join(','));
}
// 2. Скрываем и удвляем элемент, чтобы счетчик .length его больше не видел
$('#' + targetId).fadeOut(300, function() {
$(this).remove();
});
});
// Обработка выбора НОВОГО файла при редактировании
$doc.on('change', 'input[id^="new_file_"]', function() {
var cid = $(this).attr('id').replace('new_file_', '');
var input = this;
// 1. Сначала находим блок
var $errorBox = $('#file_error_' + cid);
var $previewWrapper = $('#edit_preview_wrapper_' + cid);
if (input.files && input.files.length > 0) {
$previewWrapper.find('.preview-item-new').remove();
$previewWrapper.removeClass('d-none');
Array.from(input.files).forEach(function(file) {
if (checkFileConsistency(file, $errorBox)) {
// Если файл прошел проверку - только тогда можно спрятать ошибку
$errorBox.addClass('d-none').text('');
var reader = new FileReader();
reader.onload = function(e) {
var item = `
`;
$previewWrapper.append(item);
}
reader.readAsDataURL(file);
}
});
}
});
// Удаление НОВОГО выбранного файла в режиме редактирования
$doc.on('click', '.remove-edit-new-img', function() {
var cid = $(this).data('id');
$('#new_file_' + cid).val('');
$('#edit_preview_wrapper_' + cid).addClass('d-none');
});
// Обработка кнопки "Отмена" при редактировании
$doc.on('click', '.cancelButton', function() {
var $container = $(this).closest('.edit-form-container');
var $wrapper = $container.closest('[id^="comment_wrapper_"]');
var cid = $container.data('cid'); // Берем ID для обращения к контейнеру файлов
// 1. Возвращаем текст
$wrapper.find('.mod_comment_text').show();
// 2. Возвращаем оригинальный блок с картинками
// СНАЧАЛА ЧИСТИМ ИНЛАЙН СТИЛЬ
$('#image_container_' + cid).attr('style', '');
// Затем стандартный показ
$wrapper.find('.mod_comment_attached_image, .mod_comment_attached_images, .comment-files, .attached-images').show();
// 3. Если мы скрывали изображения напрямую через $foundImgs.hide(), показываем их
$wrapper.find('img').show();
// И ссылки
$wrapper.find('a').show();
// 4. Удаляем форму редактирования
$container.remove();
});
// Кнопка сохранить редактирование
$doc.off('click', '.saveButton').on('click', '.saveButton', function() {
var $btn = $(this);
var cid = $btn.data('id');
var $container = $btn.closest('.edit-form-container');
// 1. Повторно определяем права внутри кнопки (чтобы избежать undefined)
var canUploadFilesLocal = false;
if (typeof ALLOW_FILES !== 'undefined' && ALLOW_FILES == '1') {
if (typeof UGROUP !== 'undefined' && UGROUP == '2') {
if (typeof ALLOW_FILES_ANON !== 'undefined' && ALLOW_FILES_ANON == '1') canUploadFilesLocal = true;
} else {
canUploadFilesLocal = true;
}
}
// 2. Достаем накопительный массив файлов
var pendingFiles = $container.data('pendingFiles') || [];
var fd = new FormData();
fd.append('module', 'comment');
fd.append('action', 'edit');
fd.append('Id', cid);
fd.append('text', $('#ta_' + cid).val());
var rInput = $('#rating_input_' + cid);
if (rInput.length) fd.append('user_rating', rInput.val());
fd.append('delete_files', $('#delete_files_' + cid).val());
// 3. Добавляем файлы из массива (используем локальную проверку прав)
if (canUploadFilesLocal && pendingFiles.length > 0) {
pendingFiles.forEach(function(file) {
if (file !== null) {
fd.append('comment_image[]', file);
}
});
}
$.ajax({
url: aveabspath + 'index.php?ajax=1',
type: 'POST',
data: fd,
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);
// Проверяем наличие контейнера прогресса, если его нет в HTML — создаем или пропускаем
var $pBar = $('#edit_progress_bar_' + cid);
if ($pBar.length) {
$('#edit_progress_container_' + cid).removeClass('d-none');
$pBar.css('width', pct + '%');
}
}
}, false);
return xhr;
},
beforeSend: function() {
$btn.prop('disabled', true).text('...');
},
success: function(response) {
// Если PHP вернул ошибку лимита, выведем её вместо перезагрузки
if (response === 'MAX_FILES_LIMIT_EXCEEDED') {
alert('Превышен лимит количества файлов!');
$btn.prop('disabled', false).text('Сохранить');
} else {
location.reload();
}
},
error: function() {
$btn.prop('disabled', false).text('Ошибка');
}
});
});
// Глобальный массив для файлов НОВОГО комментария
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');
// 1. Лимит из настроек
var maxLimit = parseInt(typeof MAX_FILES_COUNT !== 'undefined' ? MAX_FILES_COUNT : 5);
if (files) {
$errorDisplay.addClass('d-none').text(''); // Сбрасываем старые ошибки
$.each(files, function(i, file) {
// 2. Считаем, сколько сейчас РЕАЛЬНО файлов в очереди (не null)
var currentInQueue = newCommentPendingFiles.filter(function(f) { return f !== null; }).length;
// 3. ПРОВЕРКА ЛИМИТА: если уже достигли максимума
if (currentInQueue >= maxLimit) {
$errorDisplay.removeClass('d-none').text(COMMENT_JS_LIMIT_ABCD + maxLimit + ' ' + COMMENT_JS_LIMIT_ABCDE);
return false; // break - полностью выходим из цикла $.each
}
// 4. Валидация (размер, расширение)
if (typeof checkFileConsistency === 'function') {
if (!checkFileConsistency(file, $errorDisplay)) {
return true; // continue - этот файл плохой, идем к следующему
}
}
// Если прошли все проверки — добавляем в очередь
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;
// Определяем, что вставить: картинку или заглушку с текстом расширения
var fileExt = file.name.split('.').pop().toLowerCase();
var isImage = ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(fileExt);
// Формируем контент: либо твой оригинальный img, либо блок с расширением
var content = isImage
? ``
: `