+++ lang files
This commit is contained in:
123
js/comment.js
123
js/comment.js
@@ -31,23 +31,22 @@ function initCommentTimers() {
|
||||
if (timeLeft <= 0) {
|
||||
clearInterval(countdown);
|
||||
|
||||
// --- ИЗМЕНЕНИЕ 1: Проверка режима редактирования ---
|
||||
// --- Проверка режима редактирования ---
|
||||
var isEditing = $('#comment_wrapper_' + cid).find('.edit-form-container').length > 0;
|
||||
|
||||
if (!isEditing) {
|
||||
// Находим кнопки управления
|
||||
var $controls = $('#controls_' + cid); // Убедитесь, что у контейнера кнопок есть такой ID
|
||||
var $controls = $('#controls_' + cid);
|
||||
if ($controls.length) {
|
||||
$controls.fadeOut(300, function() { $(this).remove(); });
|
||||
}
|
||||
|
||||
// Обновляем статус визуально
|
||||
$('#timer_container_' + cid).html('<span class="text-danger small"><i class="bi bi-clock-history"></i> Время на правку истекло</span>');
|
||||
$('#timer_container_' + cid).html('<span class="text-danger small"><i class="bi bi-clock-history"></i>' + COMMENT_JS_TIMER_OFF + '</span>');
|
||||
} else {
|
||||
// Если открыта форма редактирования, просто меняем текст, не удаляя кнопки
|
||||
$('#timer_container_' + cid).html('<span class="text-warning small fw-bold"><i class="bi bi-exclamation-triangle"></i> Время вышло! Завершите правку.</span>');
|
||||
$('#timer_container_' + cid).html('<span class="text-warning small fw-bold"><i class="bi bi-exclamation-triangle"></i>' + COMMENT_JS_TIMER_OFF_A + '</span>');
|
||||
}
|
||||
// --- КОНЕЦ ИЗМЕНЕНИЯ 1 ---
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -93,8 +92,8 @@ function initCommentTimers() {
|
||||
function checkFileConsistency(file, $errorDisplay) {
|
||||
if (!file) return true;
|
||||
|
||||
// Получаем настройки из шаблона (те переменные, что мы добавили в тег script)
|
||||
var allowedExts = (typeof ALLOWED_EXTENSIONS !== 'undefined') ? ALLOWED_EXTENSIONS.toLowerCase().split(',') : ['jpg', 'jpeg', 'png', 'gif'];
|
||||
// Получаем настройки из шаблона
|
||||
var allowedExts = (typeof ALLOWED_EXTENSIONS !== 'undefined') ? ALLOWED_EXTENSIONS.toLowerCase().split(',') : ['jpg', 'jpeg', 'png', 'gif, webp'];
|
||||
var maxSizeKb = (typeof MAX_FILE_SIZE_KB !== 'undefined') ? parseInt(MAX_FILE_SIZE_KB) : 2048;
|
||||
|
||||
var fileName = file.name.toLowerCase();
|
||||
@@ -103,13 +102,13 @@ function initCommentTimers() {
|
||||
|
||||
// Проверка расширения
|
||||
if ($.inArray(fileExt, allowedExts) === -1) {
|
||||
$errorDisplay.text('Тип файла .' + fileExt + ' не разрешен.').removeClass('d-none');
|
||||
$errorDisplay.text(COMMENT_JS_FILE_TYPE + ' .' + fileExt + ' ' + COMMENT_JS_FILE_TYPE_A).removeClass('d-none');
|
||||
return false;
|
||||
}
|
||||
|
||||
// Проверка размера
|
||||
if (fileSizeKb > maxSizeKb) {
|
||||
$errorDisplay.text('Файл слишком большой (' + Math.round(fileSizeKb) + ' Кб). Максимум: ' + maxSizeKb + ' Кб').removeClass('d-none');
|
||||
$errorDisplay.text(COMMENT_JS_FILE_SIZE + ' (' + Math.round(fileSizeKb) + COMMENT_JS_FILE_SIZE_KB + '). ' + COMMENT_JS_FILE_SIZE_MAX + ' ' + maxSizeKb + COMMENT_JS_FILE_SIZE_KB).removeClass('d-none');
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -135,25 +134,25 @@ function initCommentTimers() {
|
||||
}
|
||||
|
||||
// Проверка Имени
|
||||
setInvalid($(form.comment_author_name), !form.comment_author_name.value.trim(), "Введите ваше имя");
|
||||
setInvalid($(form.comment_author_name), !form.comment_author_name.value.trim(), COMMENT_JS_CHECK_NAME);
|
||||
|
||||
// Проверка Email
|
||||
setInvalid($(form.comment_author_email), !form.comment_author_email.value.trim(), "Введите корректный Email");
|
||||
setInvalid($(form.comment_author_email), !form.comment_author_email.value.trim(), COMMENT_JS_CHECK_EMAIL);
|
||||
|
||||
// Проверка Доп. поля №1 (если оно обязательное)
|
||||
if (typeof REQ_F1 !== 'undefined' && REQ_F1 == '1') {
|
||||
var f1 = $('#in_author_website');
|
||||
setInvalid(f1, !f1.val().trim(), "Заполните: " + NAME_F1);
|
||||
setInvalid(f1, !f1.val().trim(), COMMENT_JS_FILL + " " + NAME_F1);
|
||||
}
|
||||
|
||||
// Проверка Доп. поля №2 (если оно обязательное)
|
||||
if (typeof REQ_F2 !== 'undefined' && REQ_F2 == '1') {
|
||||
var f2 = $('#in_author_city');
|
||||
setInvalid(f2, !f2.val().trim(), "Заполните: " + NAME_F2);
|
||||
setInvalid(f2, !f2.val().trim(), COMMENT_JS_FILL + " " + NAME_F2);
|
||||
}
|
||||
|
||||
// Проверка Текста
|
||||
setInvalid($(form.comment_text), !form.comment_text.value.trim(), "Введите текст комментария");
|
||||
setInvalid($(form.comment_text), !form.comment_text.value.trim(), COMMENT_JS_ADD_COMMENT_TEXT);
|
||||
|
||||
// Проверка файлов в основной форме (Мультизагрузка)
|
||||
var $fileInput = $(form).find('#comment_image');
|
||||
@@ -214,11 +213,11 @@ if (action === 'unlock' || action === 'lock') {
|
||||
if (action === 'lock') {
|
||||
// Статус 0: СКРЫТО. Ставим красный перечеркнутый глаз.
|
||||
$icon.attr('class', 'bi bi-eye-slash');
|
||||
$btn.removeClass('text-success text-muted').addClass('text-danger').attr('title', 'Показать');
|
||||
$btn.removeClass('text-success text-muted').addClass('text-danger').attr('title', COMMENT_ICON_SHOW);
|
||||
} else {
|
||||
// Статус 1: ВИДИМО. Ставим зеленый открытый глаз.
|
||||
$icon.attr('class', 'bi bi-eye');
|
||||
$btn.removeClass('text-danger text-muted').addClass('text-success').attr('title', 'Скрыть');
|
||||
$btn.removeClass('text-danger text-muted').addClass('text-success').attr('title', COMMENT_ICON_HIDE);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -265,7 +264,7 @@ $doc.on('change', '#comment_image', function() {
|
||||
<div class="position-relative preview-item">
|
||||
<img src="${e.target.result}" class="img-thumbnail" style="max-height: 100px; min-width: 100px; object-fit: cover;">
|
||||
<button type="button" class="btn btn-danger btn-sm position-absolute top-0 end-0 remove-new-img"
|
||||
style="padding: 0 5px; margin: 2px;" title="Удалить">
|
||||
style="padding: 0 5px; margin: 2px;" title="${COMMENT_MOD_DEL_DEL}">
|
||||
<i class="bi bi-x-lg"></i>
|
||||
</button>
|
||||
</div>`;
|
||||
@@ -280,11 +279,10 @@ $doc.on('change', '#comment_image', function() {
|
||||
}
|
||||
});
|
||||
|
||||
// старый обработчик, доработанный под мультизагрузку
|
||||
// обработчик, доработанный под мультизагрузку
|
||||
$doc.on('click', '#remove_image_btn', function() {
|
||||
$('#comment_image').val(''); // Очищаем выбор файлов
|
||||
$('#image_preview_wrapper').addClass('d-none').empty(); // Скрываем и полностью очищаем блок превью
|
||||
// Строка с #image_preview_img больше не нужна, так как картинок теперь много
|
||||
});
|
||||
|
||||
// удаление картинок по одной (крестиком на самой картинке)
|
||||
@@ -298,7 +296,7 @@ $doc.on('click', '.remove-new-img', function() {
|
||||
}
|
||||
});
|
||||
|
||||
// --- ЛОГИКА ВЫБОРА РЕЙТИНГА В ФОРМЕ ---
|
||||
// --- ВЫБОР РЕЙТИНГА В ФОРМЕ ---
|
||||
$doc.on('mouseenter', '.star-choice', function() {
|
||||
var val = $(this).data('value');
|
||||
$(this).parent().find('.star-choice').each(function() {
|
||||
@@ -366,7 +364,7 @@ $doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() {
|
||||
$('#user_rating_stars_' + cid + ' .star-choice').removeClass('bi-star-fill').addClass('bi-star');
|
||||
});
|
||||
|
||||
// --- ЛОГИКА ГОЛОСОВАНИЯ (РЕЙТИНГ УЖЕ ОПУБЛИКОВАННЫХ) ---
|
||||
// --- ГОЛОСОВАНИЕ (РЕЙТИНГ УЖЕ ОПУБЛИКОВАННЫХ) ---
|
||||
$doc.on('mouseenter', '.star-item', function() {
|
||||
var $parent = $(this).parent();
|
||||
if ($parent.hasClass('comment-like')) {
|
||||
@@ -395,19 +393,19 @@ $doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() {
|
||||
success: function(response) {
|
||||
var res = response.toString().trim();
|
||||
if (res.indexOf('success') !== -1) {
|
||||
$container.html('<span class="text-success small fw-bold">Спасибо!</span>');
|
||||
$container.html('<span class="text-success small fw-bold">' + COMMENT_JS_THX + '</span>');
|
||||
setTimeout(function(){ location.reload(); }, 1000);
|
||||
} else if (res.indexOf('already_voted') !== -1) {
|
||||
alert('Вы уже голосовали за этот комментарий.');
|
||||
alert(COMMENT_JS_VOTE_A);
|
||||
} else if (res.indexOf('own_comment') !== -1) {
|
||||
alert('Нельзя голосовать за свой собственный комментарий.');
|
||||
alert(COMMENT_JS_VOTE_B);
|
||||
} else if (res.indexOf('forbidden_anon') !== -1) {
|
||||
alert('Голосование доступно только зарегистрированным пользователям.');
|
||||
alert('COMMENT_JS_VOTE_C');
|
||||
} else {
|
||||
alert('Ошибка при обработке голоса сервером.');
|
||||
alert(COMMENT_JS_VOTE_ERR);
|
||||
}
|
||||
},
|
||||
error: function(xhr) { alert('Ошибка связи с сервером. Статус: ' + xhr.status); }
|
||||
error: function(xhr) {alert(COMMENT_JS_VOTE_ERR_A + ' ' + xhr.status);}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -424,12 +422,12 @@ $doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() {
|
||||
// --- СКРЫТИЕ РЕЙТИНГА ДЛЯ ОТВЕТОВ ---
|
||||
if (typeof SHOW_USER_RATING_REPLIES !== 'undefined' && SHOW_USER_RATING_REPLIES == '0') {
|
||||
$('#rating_wrapper').hide(); // Скрываем весь блок рейтинга
|
||||
$('#comment_user_rating').val(0); // Сбрасываем значение на всякий случай
|
||||
$('#comment_user_rating').val(0); // Сбрасываем значение
|
||||
$('#user_rating_stars .star-choice').removeClass('bi-star-fill').addClass('bi-star');
|
||||
} else {
|
||||
$('#rating_wrapper').show();
|
||||
}
|
||||
// --- КОНЕЦ ЛОГИКИ ---
|
||||
// --- КОНЕЦ ---
|
||||
$('html, body').animate({ scrollTop: $form.offset().top - 150 }, 500);
|
||||
$('#in_message').focus();
|
||||
});
|
||||
@@ -437,7 +435,7 @@ $doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() {
|
||||
// Удаление
|
||||
$doc.off('click', '.mod_comment_delete').on('click', '.mod_comment_delete', function(e) {
|
||||
e.preventDefault();
|
||||
if (confirm('Удалить этот комментарий?')) cAction(this, 'delete');
|
||||
if (confirm(COMMENT_JS_DELDEL_CONFIRM)) cAction(this, 'delete');
|
||||
});
|
||||
|
||||
|
||||
@@ -498,7 +496,7 @@ $doc.off('click', '.mod_comment_edit').on('click', '.mod_comment_edit', function
|
||||
var existingImagesHtml = '';
|
||||
var $imageContainer = $('#image_container_' + cid);
|
||||
|
||||
// Ищем именно "карточки" из твоего шаблона (класс .comment-image-item)
|
||||
// Ищем именно "карточки" из шаблона (класс .comment-image-item)
|
||||
var $foundItems = $imageContainer.find('.comment-image-item');
|
||||
|
||||
if ($foundItems.length > 0) {
|
||||
@@ -514,7 +512,7 @@ if ($foundItems.length > 0) {
|
||||
var fileExt = fileName.split('.').pop().toLowerCase();
|
||||
var isImg = ['jpg', 'jpeg', 'png', 'gif', 'webp'].includes(fileExt);
|
||||
|
||||
// Используем твой же стиль превью
|
||||
// Используем стиль превью
|
||||
var previewContent = isImg
|
||||
? `<img src="${fileUrl}" class="img-thumbnail" style="width: 80px; height: 80px; object-fit: cover;">`
|
||||
: `<div class="d-flex align-items-center justify-content-center bg-light text-dark rounded border small fw-bold"
|
||||
@@ -533,7 +531,7 @@ if ($foundItems.length > 0) {
|
||||
existingImagesHtml += '</div>';
|
||||
}
|
||||
|
||||
// --- РЕЙТИНГ (ВОЗВРАЩЕНА ПОЛНАЯ ОРИГИНАЛЬНАЯ ЛОГИКА) ---
|
||||
// --- РЕЙТИНГ ---
|
||||
var starsEditBlock = '';
|
||||
var parentIdVal = parseInt($wrapper.attr('data-parent')) || 0;
|
||||
var isReply = parentIdVal > 0;
|
||||
@@ -548,11 +546,11 @@ if ($foundItems.length > 0) {
|
||||
}
|
||||
starsEditBlock = `
|
||||
<div class="mb-2 rating-edit-block">
|
||||
<label class="small text-muted d-block mb-1">Ваша оценка:</label>
|
||||
<label class="small text-muted d-block mb-1">${COMMENT_JS_RATING_ST_EDIT}</label>
|
||||
<div class="d-flex align-items-center">
|
||||
<div id="user_rating_stars_${cid}">${starsHtml}</div>
|
||||
<a href="javascript:void(0);" class="reset-edit-stars ms-3 text-decoration-none small text-muted" data-id="${cid}">
|
||||
<i class="bi bi-x-circle"></i> Сбросить
|
||||
<i class="bi bi-x-circle"></i> ${COMMENT_JS_RATING_ST_EDIT_A}
|
||||
</a>
|
||||
</div>
|
||||
<input type="hidden" name="comment_user_rating" id="rating_input_${cid}" value="${currentRating}" />
|
||||
@@ -566,27 +564,27 @@ var editHtml = `
|
||||
<textarea rows="5" id="ta_${cid}" class="form-control mb-3">${cleanText}</textarea>
|
||||
${starsEditBlock}
|
||||
|
||||
<p class="small text-muted mb-1">Загруженные файлы:</p>
|
||||
<p class="small text-muted mb-1">${COMMENT_JS_LOADED_FILES}</p>
|
||||
${existingImagesHtml}
|
||||
|
||||
<div class="mb-2">
|
||||
<label class="small text-muted mb-1">Добавить новые:</label>
|
||||
<label class="small text-muted mb-1">${COMMENT_JS_ADD_NEW_FILES}</label>
|
||||
<div id="file_error_${cid}" class="js-file-error text-danger small fw-bold mb-1" style="display:none;"></div>
|
||||
<input type="file" name="comment_image[]" id="new_file_${cid}" class="form-control form-control-sm" multiple>
|
||||
</div>
|
||||
<input type="hidden" name="delete_files" id="delete_files_${cid}" value="">
|
||||
|
||||
<div class="d-flex gap-2 mt-3 align-items-center">
|
||||
<button type="button" class="btn btn-sm btn-primary saveButton" data-id="${cid}">Сохранить</button>
|
||||
<button type="button" class="btn btn-sm btn-secondary cancelButton">Отмена</button>
|
||||
<small class="ms-auto text-muted">Осталось: <span id="charsLeft_${cid}"></span></small>
|
||||
<button type="button" class="btn btn-sm btn-primary saveButton" data-id="${cid}">${COMMENT_JS_EDIT_BUT_SAVE}</button>
|
||||
<button type="button" class="btn btn-sm btn-secondary cancelButton">${COMMENT_JS_EDIT_BUT_CANCEL}</button>
|
||||
<small class="ms-auto text-muted">${COMMENT_JS_EDIT_BUT_LEFT} <span id="charsLeft_${cid}"></span></small>
|
||||
</div>
|
||||
</div>`;
|
||||
|
||||
// Прячем текст комментария
|
||||
$textBlock.hide();
|
||||
|
||||
// Прячем ВЕСЬ контейнер с оригиналами (и картинки, и упрямый ZIP)
|
||||
// Прячем ВЕСЬ контейнер с файлами
|
||||
$('#image_container_' + cid).attr('style', 'display: none !important;');
|
||||
|
||||
// Для надежности скрываем всё остальное
|
||||
@@ -614,11 +612,11 @@ $('#new_file_' + cid).on('change', function() {
|
||||
var inPending = pendingFiles.filter(f => f !== null).length;
|
||||
|
||||
if ((alreadyInPost + inPending) >= maxLimit) {
|
||||
$errorDisplay.text(' Лимит: ' + maxLimit + ' шт.').show();
|
||||
$errorDisplay.text(' ' + COMMENT_JS_LIMIT_AB + ' ' + maxLimit + ' ' + COMMENT_JS_LIMIT_ABC).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
// ПРОВЕРКА ЧЕРЕЗ ФУНКЦИЮ (она теперь берет ALLOWED_EXTENSIONS)
|
||||
// ПРОВЕРКА ЧЕРЕЗ ФУНКЦИЮ (она берет ALLOWED_EXTENSIONS)
|
||||
if (!checkFileConsistency(file, $errorDisplay)) return true;
|
||||
|
||||
pendingFiles.push(file);
|
||||
@@ -662,7 +660,6 @@ $doc.off('click', '.remove-new-file').on('click', '.remove-new-file', function()
|
||||
pendingFiles[index] = null; // Помечаем как удаленный
|
||||
$item.remove();
|
||||
|
||||
// ЗАМЕНЯЕМ СТАРУЮ СТРОКУ НА ЭТУ:
|
||||
// Ищем через ближайший контейнер формы, чтобы точно попасть в нужный блок текста
|
||||
$(this).closest('.edit-form-container').find('.js-file-error').hide().text('');
|
||||
});
|
||||
@@ -684,7 +681,7 @@ $doc.on('click', '.remove-existing-img', function() {
|
||||
var imgPath = $(this).data('img-path');
|
||||
var targetId = $(this).data('target');
|
||||
|
||||
// 1. Очищаем текст ошибки, так как место освободилось
|
||||
// 1. Очищаем текст ошибки
|
||||
$('#file_error_' + cid).addClass('d-none').text('');
|
||||
|
||||
var $deleteInput = $('#delete_files_' + cid);
|
||||
@@ -695,7 +692,7 @@ $doc.on('click', '.remove-existing-img', function() {
|
||||
$deleteInput.val(currentDeleteList.join(','));
|
||||
}
|
||||
|
||||
// 2. Скрываем и УДАЛЯЕМ элемент, чтобы счетчик .length его больше не видел
|
||||
// 2. Скрываем и удвляем элемент, чтобы счетчик .length его больше не видел
|
||||
$('#' + targetId).fadeOut(300, function() {
|
||||
$(this).remove();
|
||||
});
|
||||
@@ -706,19 +703,17 @@ $doc.on('change', 'input[id^="new_file_"]', function() {
|
||||
var cid = $(this).attr('id').replace('new_file_', '');
|
||||
var input = this;
|
||||
|
||||
// 1. Сначала находим блок (БЕЗ ОШИБОК В ПЕРЕМЕННЫХ)
|
||||
// 1. Сначала находим блок
|
||||
var $errorBox = $('#file_error_' + cid);
|
||||
var $previewWrapper = $('#edit_preview_wrapper_' + cid);
|
||||
|
||||
if (input.files && input.files.length > 0) {
|
||||
// 2. НЕ ОЧИЩАЕМ ТЕКСТ СРАЗУ, даем checkFileConsistency шанс вывести ошибку
|
||||
$previewWrapper.find('.preview-item-new').remove();
|
||||
$previewWrapper.removeClass('d-none');
|
||||
|
||||
Array.from(input.files).forEach(function(file) {
|
||||
// 3. Передаем именно найденный объект
|
||||
if (checkFileConsistency(file, $errorBox)) {
|
||||
// Если файл прошел проверку - только тогда можно спрятать старую ошибку
|
||||
// Если файл прошел проверку - только тогда можно спрятать ошибку
|
||||
$errorBox.addClass('d-none').text('');
|
||||
|
||||
var reader = new FileReader();
|
||||
@@ -752,7 +747,7 @@ $doc.on('click', '.cancelButton', function() {
|
||||
$wrapper.find('.mod_comment_text').show();
|
||||
|
||||
// 2. Возвращаем оригинальный блок с картинками
|
||||
// СНАЧАЛА ЧИСТИМ ИНЛАЙН СТИЛЬ (тот самый !important)
|
||||
// СНАЧАЛА ЧИСТИМ ИНЛАЙН СТИЛЬ
|
||||
$('#image_container_' + cid).attr('style', '');
|
||||
|
||||
// Затем стандартный показ
|
||||
@@ -760,7 +755,7 @@ $doc.on('click', '.cancelButton', function() {
|
||||
|
||||
// 3. Если мы скрывали изображения напрямую через $foundImgs.hide(), показываем их
|
||||
$wrapper.find('img').show();
|
||||
// И ссылки (наш ZIP) тоже на всякий случай
|
||||
// И ссылки
|
||||
$wrapper.find('a').show();
|
||||
|
||||
// 4. Удаляем форму редактирования
|
||||
@@ -772,7 +767,7 @@ $doc.on('click', '.saveButton', function() {
|
||||
var cid = $btn.data('id');
|
||||
var $container = $btn.closest('.edit-form-container');
|
||||
|
||||
// Достаем наш накопительный массив файлов
|
||||
// Достаем накопительный массив файлов
|
||||
var pendingFiles = $container.data('pendingFiles') || [];
|
||||
|
||||
var fd = new FormData();
|
||||
@@ -786,7 +781,7 @@ $doc.on('click', '.saveButton', function() {
|
||||
|
||||
fd.append('delete_files', $('#delete_files_' + cid).val());
|
||||
|
||||
// --- ОБНОВЛЕННЫЙ БЛОК: берем файлы из массива, а не из инпута ---
|
||||
// --- берем файлы из массива ---
|
||||
pendingFiles.forEach(function(file) {
|
||||
if (file !== null) { // Проверяем, что файл не был удален крестиком
|
||||
fd.append('comment_image[]', file);
|
||||
@@ -805,7 +800,6 @@ $doc.on('click', '.saveButton', function() {
|
||||
xhr.upload.addEventListener("progress", function(evt) {
|
||||
if (evt.lengthComputable) {
|
||||
var pct = Math.round((evt.loaded / evt.total) * 100);
|
||||
// Проверь, есть ли у тебя эти ID в HTML, если нет - прогресс-бар просто не покажется
|
||||
$('#edit_progress_container_' + cid).removeClass('d-none');
|
||||
$('#edit_progress_bar_' + cid).css('width', pct + '%');
|
||||
}
|
||||
@@ -823,7 +817,7 @@ $doc.on('click', '.saveButton', function() {
|
||||
var newCommentPendingFiles = [];
|
||||
|
||||
// Обработка выбора файлов в основной форме
|
||||
// ДОБАВИЛИ .off('change') чтобы не было дублей
|
||||
// .off('change') чтобы не было дублей
|
||||
$doc.off('change', '#comment_image').on('change', '#comment_image', function() {
|
||||
var files = this.files;
|
||||
var $previewWrapper = $('#image_preview_wrapper');
|
||||
@@ -841,11 +835,11 @@ $doc.off('change', '#comment_image').on('change', '#comment_image', function() {
|
||||
|
||||
// 3. ПРОВЕРКА ЛИМИТА: если уже достигли максимума
|
||||
if (currentInQueue >= maxLimit) {
|
||||
$errorDisplay.removeClass('d-none').text('Достигнут лимит (' + maxLimit + ' шт.). Лишние файлы проигнорированы.');
|
||||
$errorDisplay.removeClass('d-none').text(COMMENT_JS_LIMIT_ABCD + maxLimit + ' ' + COMMENT_JS_LIMIT_ABCDE);
|
||||
return false; // break - полностью выходим из цикла $.each
|
||||
}
|
||||
|
||||
// 4. Твоя существующая валидация (размер, расширение)
|
||||
// 4. Валидация (размер, расширение)
|
||||
if (typeof checkFileConsistency === 'function') {
|
||||
if (!checkFileConsistency(file, $errorDisplay)) {
|
||||
return true; // continue - этот файл плохой, идем к следующему
|
||||
@@ -905,7 +899,7 @@ $doc.on('click', '.remove-new-comment-img', function() {
|
||||
$doc.on('click', '#buttonReset', function() {
|
||||
newCommentPendingFiles = [];
|
||||
$('#image_preview_wrapper').empty().addClass('d-none');
|
||||
// Добавляем вот эту строку, чтобы убрать текст ошибки
|
||||
// убрать текст ошибки
|
||||
$('#file_error').addClass('d-none').text('');
|
||||
});
|
||||
|
||||
@@ -917,8 +911,6 @@ $doc.on('submit', '#mod_comment_new form', function(e) {
|
||||
var $form = $(this);
|
||||
var $btn = $form.find('[type="submit"]');
|
||||
var originalBtnText = $btn.text();
|
||||
|
||||
// --- ВОТ ЭТОТ БЛОК МЫ ЗАМЕНИЛИ ---
|
||||
var formData = new FormData(this);
|
||||
|
||||
// 1. Удаляем стандартные значения, чтобы они не дублировались из инпута
|
||||
@@ -933,7 +925,6 @@ $doc.on('submit', '#mod_comment_new form', function(e) {
|
||||
}
|
||||
});
|
||||
}
|
||||
// ---------------------------------
|
||||
|
||||
$.ajax({
|
||||
url: aveabspath + 'index.php?ajax=1',
|
||||
@@ -948,15 +939,15 @@ $doc.on('submit', '#mod_comment_new form', function(e) {
|
||||
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 + '%');
|
||||
$('#upload_status_text').text(COMMENT_JS_LOADS_F + ' ' + pct + '%');
|
||||
}
|
||||
}, false);
|
||||
return xhr;
|
||||
},
|
||||
beforeSend: function() { $btn.prop('disabled', true).text('Отправка...'); },
|
||||
beforeSend: function() { $btn.prop('disabled', true).text(COMMENT_JS_LOADS_R); },
|
||||
success: function(data) {
|
||||
if (data.includes('wrong_securecode')) {
|
||||
alert("Код капчи введен неверно!");
|
||||
alert(COMMENT_JS_SEC_CODE_WRONG);
|
||||
getCaptha();
|
||||
$btn.prop('disabled', false).text(originalBtnText);
|
||||
$('#upload_progress_container').addClass('d-none');
|
||||
@@ -969,7 +960,7 @@ $doc.on('submit', '#mod_comment_new form', function(e) {
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
alert("Ошибка связи с сервером");
|
||||
alert(COMMENT_JS_ERR_SRV);
|
||||
$btn.prop('disabled', false).text(originalBtnText);
|
||||
$('#upload_progress_container').addClass('d-none');
|
||||
}
|
||||
|
||||
35
lang/ru.txt
35
lang/ru.txt
@@ -86,6 +86,41 @@ COMMENT_ICON_HIDE = "Скрыть комментарий"
|
||||
COMMENT_ICON_SHOW = "Показать комментарий"
|
||||
COMMENT_ANSWER_AJAX_BUTTON = "Показать еще"
|
||||
COMMENT_ANSWER_AJAX_TEXT = "ответов"
|
||||
COMMENT_JS_TIMER_OFF = " Время на правку истекло"
|
||||
COMMENT_JS_TIMER_OFF_A = " Время вышло! Завершите правку."
|
||||
COMMENT_JS_FILE_TYPE = " Тип файла"
|
||||
COMMENT_JS_FILE_TYPE_A = " не разрешен."
|
||||
COMMENT_JS_FILE_SIZE = " Файл слишком большой"
|
||||
COMMENT_JS_FILE_SIZE_KB = " Кб"
|
||||
COMMENT_JS_FILE_SIZE_MAX = " Максимум:"
|
||||
COMMENT_JS_CHECK_NAME = " Введите ваше имя"
|
||||
COMMENT_JS_CHECK_EMAIL = " Введите корректный Email"
|
||||
COMMENT_JS_FILL = " Заполните:"
|
||||
COMMENT_JS_ADD_COMMENT_TEXT = " Введите текст комментария"
|
||||
COMMENT_JS_THX = "Спасибо!"
|
||||
COMMENT_JS_VOTE_A = "Вы уже голосовали за этот комментарий."
|
||||
COMMENT_JS_VOTE_B = "Нельзя голосовать за свой собственный комментарий."
|
||||
COMMENT_JS_VOTE_C = "Голосование доступно только зарегистрированным пользователям."
|
||||
COMMENT_JS_VOTE_ERR = "Ошибка при обработке голоса сервером."
|
||||
COMMENT_JS_VOTE_ERR_A = "Ошибка связи с сервером. Статус:"
|
||||
COMMENT_JS_DELDEL_CONFIRM = "Удалить этот комментарий?"
|
||||
COMMENT_JS_RATING_ST_EDIT = "Ваша оценка:"
|
||||
COMMENT_JS_RATING_ST_EDIT_A = "Сбросить"
|
||||
COMMENT_JS_LOADED_FILES = "Загруженные файлы:"
|
||||
COMMENT_JS_ADD_NEW_FILES = "Добавить новые:"
|
||||
COMMENT_JS_EDIT_BUT_SAVE = "Сохранить"
|
||||
COMMENT_JS_EDIT_BUT_CANCEL = "Отмена"
|
||||
COMMENT_JS_EDIT_BUT_LEFT = "Осталось: "
|
||||
COMMENT_JS_LIMIT_AB = "Лимит:"
|
||||
COMMENT_JS_LIMIT_ABC = "шт."
|
||||
COMMENT_JS_LIMIT_ABCD = "Достигнут лимит ("
|
||||
COMMENT_JS_LIMIT_ABCDE = "шт.). Лишние файлы проигнорированы."
|
||||
COMMENT_JS_LOADS_F = "Загрузка:"
|
||||
COMMENT_JS_LOADS_R = "Отправка..."
|
||||
COMMENT_JS_SEC_CODE_WRONG = "Код капчи введен неверно!"
|
||||
COMMENT_JS_ERR_SRV = "Ошибка связи с сервером"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -263,6 +263,43 @@
|
||||
var COMMENT_DATE_TIME_FORMAT = '{#COMMENT_DATE_TIME_FORMAT#}';
|
||||
var COMMENT_TEXT_CHANGED = '{#COMMENT_TEXT_CHANGED#}';
|
||||
var COMMENT_WRONG_CODE = '{#COMMENT_WRONG_CODE#}';
|
||||
var COMMENT_JS_TIMER_OFF = '{#COMMENT_JS_TIMER_OFF#}';
|
||||
var COMMENT_JS_TIMER_OFF_A = '{#COMMENT_JS_TIMER_OFF_A#}';
|
||||
var COMMENT_JS_FILE_TYPE = '{#COMMENT_JS_FILE_TYPE#}';
|
||||
var COMMENT_JS_FILE_TYPE_A = '{#COMMENT_JS_FILE_TYPE_A#}';
|
||||
var COMMENT_JS_FILE_SIZE = '{#COMMENT_JS_FILE_SIZE#}';
|
||||
var COMMENT_JS_FILE_SIZE_KB = '{#COMMENT_JS_FILE_SIZE_KB#}';
|
||||
var COMMENT_JS_FILE_SIZE_MAX = '{#COMMENT_JS_FILE_SIZE_MAX#}';
|
||||
var COMMENT_JS_CHECK_NAME = '{#COMMENT_JS_CHECK_NAME#}';
|
||||
var COMMENT_JS_CHECK_EMAIL = '{#COMMENT_JS_CHECK_EMAIL#}';
|
||||
var COMMENT_JS_FILL = '{#COMMENT_JS_FILL#}';
|
||||
var COMMENT_JS_ADD_COMMENT_TEXT = '{#COMMENT_JS_ADD_COMMENT_TEXT#}';
|
||||
var COMMENT_ICON_SHOW = '{#COMMENT_ICON_SHOW#}';
|
||||
var COMMENT_ICON_HIDE = '{#COMMENT_ICON_HIDE#}';
|
||||
var COMMENT_MOD_DEL_DEL = '{#COMMENT_MOD_DEL_DEL#}';
|
||||
var COMMENT_JS_THX = '{#COMMENT_JS_THX#}';
|
||||
var COMMENT_JS_VOTE_A = '{#COMMENT_JS_VOTE_A#}';
|
||||
var COMMENT_JS_VOTE_B = '{#COMMENT_JS_VOTE_B#}';
|
||||
var COMMENT_JS_VOTE_C = '{#COMMENT_JS_VOTE_C#}';
|
||||
var COMMENT_JS_VOTE_ERR = '{#COMMENT_JS_VOTE_ERR#}';
|
||||
var COMMENT_JS_VOTE_ERR_A = '{#COMMENT_JS_VOTE_ERR_A#}';
|
||||
var COMMENT_JS_DELDEL_CONFIRM = '{#COMMENT_JS_DELDEL_CONFIRM#}';
|
||||
var COMMENT_JS_RATING_ST_EDIT = '{#COMMENT_JS_RATING_ST_EDIT#}';
|
||||
var COMMENT_JS_RATING_ST_EDIT_A = '{#COMMENT_JS_RATING_ST_EDIT_A#}';
|
||||
var COMMENT_JS_LOADED_FILES = '{#COMMENT_JS_LOADED_FILES#}';
|
||||
var COMMENT_JS_ADD_NEW_FILES = '{#COMMENT_JS_ADD_NEW_FILES#}';
|
||||
var COMMENT_JS_EDIT_BUT_SAVE = '{#COMMENT_JS_EDIT_BUT_SAVE#}';
|
||||
var COMMENT_JS_EDIT_BUT_CANCEL = '{#COMMENT_JS_EDIT_BUT_CANCEL#}';
|
||||
var COMMENT_JS_EDIT_BUT_LEFT = '{#COMMENT_JS_EDIT_BUT_LEFT#}';
|
||||
var COMMENT_JS_LIMIT_AB = '{#COMMENT_JS_LIMIT_AB#}';
|
||||
var COMMENT_JS_LIMIT_ABC = '{#COMMENT_JS_LIMIT_ABC#}';
|
||||
var COMMENT_JS_LIMIT_ABCD = '{#COMMENT_JS_LIMIT_ABCD#}';
|
||||
var COMMENT_JS_LIMIT_ABCDE = '{#COMMENT_JS_LIMIT_ABCDE#}';
|
||||
var COMMENT_JS_LOADS_F = '{#COMMENT_JS_LOADS_F#}';
|
||||
var COMMENT_JS_LOADS_R = '{#COMMENT_JS_LOADS_R#}';
|
||||
var COMMENT_JS_SEC_CODE_WRONG = '{#COMMENT_JS_SEC_CODE_WRONG#}';
|
||||
var COMMENT_JS_ERR_SRV = '{#COMMENT_JS_ERR_SRV#}';
|
||||
|
||||
|
||||
var REQ_F1 = '{$comment_req_f1}';
|
||||
var REQ_F2 = '{$comment_req_f2}';
|
||||
|
||||
Reference in New Issue
Block a user