замена js алертов

This commit is contained in:
2026-01-12 11:17:49 +05:00
parent 88aa41f565
commit d0b2fdd3e8
2 changed files with 154 additions and 82 deletions

View File

@@ -206,8 +206,6 @@ if ($fileInput.length && $fileInput[0].files.length > 0) {
var $commentBlock = $btn.closest('.mod_comment_comment');
$commentBlock.fadeOut(300, function() { $(this).remove(); });
}
// показать / скрыть комментарий
// показать / скрыть комментарий
if (action === 'unlock' || action === 'lock') {
@@ -239,7 +237,7 @@ if (action === 'unlock' || action === 'lock') {
$card.removeClass('opacity-75 border-warning');
// Надежное скрытие: используем callback, чтобы после анимации точно убрать элемент
// используем callback, чтобы после анимации убрать элемент
$card.find('.alert-warning').stop(true, true).fadeOut(300, function() {
$(this).remove(); // Удаляем плашку из кода совсем, чтобы при следующем "скрыть" она создалась чисто
});
@@ -391,50 +389,85 @@ $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')) {
$(this).css('transform', 'scale(1.2)');
}
else {
$(this).prevAll().addBack().removeClass('bi-star').addClass('bi-star-fill');
$(this).nextAll().removeClass('bi-star-fill').addClass('bi-star');
}
});
// --- ГОЛОСОВАНИЕ (РЕЙТИНГ УЖЕ ОПУБЛИКОВАННЫХ) ---
$doc.on('mouseenter', '.star-item', function() {
var $parent = $(this).parent();
if ($parent.hasClass('comment-like')) {
$(this).css('transform', 'scale(1.2)');
} else {
$(this).prevAll().addBack().removeClass('bi-star').addClass('bi-star-fill');
$(this).nextAll().removeClass('bi-star-fill').addClass('bi-star');
}
});
$doc.on('mouseleave', '.star-item', function() {
var $parent = $(this).parent();
if ($parent.hasClass('comment-like')) { $(this).css('transform', 'scale(1)'); }
});
$doc.on('mouseleave', '.star-item', function() {
var $parent = $(this).parent();
if ($parent.hasClass('comment-like')) { $(this).css('transform', 'scale(1)'); }
});
$doc.on('click', '.star-item', function() {
var $container = $(this).closest('.comment-rating-container');
var commentId = $container.data('id');
var voteValue = $(this).data('value');
// Голосование
$(document).on('click', '.star-item', function() {
var $this = $(this);
// Находим основной контейнер звезд с рамкой
var $container = $this.closest('.comment-rating-container');
var commentId = $container.data('id');
var voteValue = $this.data('value');
$.ajax({
url: 'index.php?module=comment&action=vote&ajax=1',
type: 'POST',
data: { comment_id: commentId, vote: voteValue, ajax: 1 },
success: function(response) {
var res = response.toString().trim();
if (res.indexOf('success') !== -1) {
$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(COMMENT_JS_VOTE_A);
} else if (res.indexOf('own_comment') !== -1) {
alert(COMMENT_JS_VOTE_B);
} else if (res.indexOf('forbidden_anon') !== -1) {
alert(COMMENT_JS_VOTE_C);
} else {
alert(COMMENT_JS_VOTE_ERR);
}
},
error: function(xhr) {alert(COMMENT_JS_VOTE_ERR_A + ' ' + xhr.status);}
$.ajax({
url: 'index.php?module=comment&action=vote&ajax=1',
type: 'POST',
data: { comment_id: commentId, vote: voteValue, ajax: 1 },
success: function(response) {
var res = response.toString().trim();
// Функция для подмены блока на время
var showStatus = function(type, message, icon) {
var statusHtml =
'<div class="alert alert-' + type + ' alert-vote-status d-flex align-items-center fade show m-0" ' +
'style="font-size: 0.8rem; padding: 5px 15px; border-radius: 6px; border-left: 4px solid; min-height: 38px; width: fit-content; display: inline-flex !important;">' +
'<i class="bi ' + icon + ' me-2"></i>' +
'<span>' + message + '</span>' +
'</div>';
// 1. Создаем объект алерта
var $newAlert = $(statusHtml);
// 2. заменяем контейнер звезд на алерт
$container.replaceWith($newAlert);
// 3. Через 4 секунды возвращаем звезды обратно
setTimeout(function() {
$newAlert.fadeOut(400, function() {
// Заменяем алерт обратно на сохраненный контейнер звезд
$(this).replaceWith($container);
$container.hide().fadeIn(300);
});
});
}, 4000);
};
if (res.indexOf('success') !== -1) {
// При успехе заменяем содержимое на "Спасибо" и обновляем
$container.html('<span class="text-success small fw-bold px-2"><i class="bi bi-check2-circle me-1"></i>' + COMMENT_JS_THX + '</span>');
setTimeout(function(){ location.reload(); }, 1200);
}
else if (res.indexOf('already_voted') !== -1) {
showStatus('info', COMMENT_JS_VOTE_A, 'bi-info-circle-fill');
}
else if (res.indexOf('own_comment') !== -1) {
showStatus('warning', COMMENT_JS_VOTE_B, 'bi-exclamation-triangle-fill');
}
else if (res.indexOf('forbidden_anon') !== -1) {
showStatus('danger', COMMENT_JS_VOTE_C, 'bi-person-x-fill');
}
else {
showStatus('danger', COMMENT_JS_VOTE_ERR, 'bi-x-circle-fill');
}
},
error: function(xhr) {
showStatus('danger', COMMENT_JS_VOTE_ERR_A + ' (Код: ' + xhr.status + ')', 'bi-wifi-off', 5000);
}
});
});
$doc.on('click', '#mod_comment_close', function(e) { e.preventDefault(); cAction(this, 'close'); });
$doc.on('click', '#mod_comment_open', function(e) { e.preventDefault(); cAction(this, 'open'); });
@@ -459,11 +492,26 @@ $doc.on('mouseleave', '.rating-edit-block, #rating_wrapper', function() {
$('#in_message').focus();
});
// Удаление
$doc.off('click', '.mod_comment_delete').on('click', '.mod_comment_delete', function(e) {
e.preventDefault();
if (confirm(COMMENT_JS_DELDEL_CONFIRM)) cAction(this, 'delete');
});
// Удаление через модальное окно Bootstrap
$doc.off('click', '.mod_comment_delete').on('click', '.mod_comment_delete', function(e) {
e.preventDefault();
var deleteBtn = this; // Запоминаем кнопку, на которую нажали
// Инициализируем модальное окно Bootstrap
var modalElement = document.getElementById('deleteCommentModal');
var confirmModal = new bootstrap.Modal(modalElement);
// Показываем окно
confirmModal.show();
// Находим кнопку подтверждения внутри модалки
// Используем .one('click'), чтобы событие сработало только один раз
$('#confirmDeleteButton').off('click').one('click', function() {
cAction(deleteBtn, 'delete'); // Выполняем удаление
confirmModal.hide(); // Закрываем окно
});
});
// Универсальный обработчик для переключателя видимости
@@ -1037,7 +1085,28 @@ $doc.on('submit', '#mod_comment_new form', function(e) {
beforeSend: function() { $btn.prop('disabled', true).text(COMMENT_JS_LOADS_R); },
success: function(data) {
if (data.includes('wrong_securecode')) {
alert(COMMENT_JS_SEC_CODE_WRONG);
// Очищаем старую ошибку
$('#captcha_error_msg').empty();
$('#securecode').removeClass('is-invalid');
// Создаем простой алерт Bootstrap под инпутом
var $err = $('<div class="alert alert-danger alert-dismissible fade show mt-2 mb-0 py-2 d-flex align-items-center" role="alert" style="font-size: 0.85rem;">' +
'<i class="bi bi-exclamation-triangle-fill me-2"></i>' +
'<span>' + COMMENT_JS_SEC_CODE_WRONG + '</span>' +
'<button type="button" class="btn-close" data-bs-dismiss="alert" style="padding: 0.8rem;"></button>' +
'</div>');
// Вставляем и подсвечиваем
$('#captcha_error_msg').append($err);
$('#securecode').addClass('is-invalid').val('').focus();
// Автоудаление
setTimeout(function() {
$err.fadeOut(400, function() {
$(this).remove();
$('#securecode').removeClass('is-invalid');
});
}, 6000);
getCaptha();
$btn.prop('disabled', false).text(originalBtnText);
$('#upload_progress_container').addClass('d-none');

View File

@@ -183,23 +183,24 @@
{/if}
{/if}
{if $im}
<div class="row mb-3 align-items-center">
<div class="col-md-4">
<label for="securecode" class="form-label">{#COMMENT_FORM_CODE#}</label>
<div id="captcha_block">
<span id="captcha" class="d-block mb-1">
<img src="{$ABS_PATH}inc/captcha.php" alt="{#COMMENT_FORM_CODE#}" class="img-fluid border rounded" style="cursor: pointer;" width="120" height="60" border="0" />
</span>
<a href="javascript:void(0);" id="reload_captcha" class="small text-decoration-none text-muted"><i class="bi bi-arrow-clockwise"></i> {#COMMENT_CAPTCHA_UPD#}</a>
</div>
</div>
<div class="col-md-8">
<label for="securecode" class="form-label">{#COMMENT_FORM_CODE_ENTER#}*</label>
<input name="securecode" type="text" id="securecode" maxlength="10" class="form-control" placeholder="{#COMMENT_FORM_CODE_ENTER#}" />
</div>
</div>
{/if}
{if $im}
<div class="row mb-3 align-items-center">
<div class="col-md-4">
<label for="securecode" class="form-label">{#COMMENT_FORM_CODE#}</label>
<div id="captcha_block">
<span id="captcha" class="d-block mb-1">
<img src="{$ABS_PATH}inc/captcha.php" alt="{#COMMENT_FORM_CODE#}" class="img-fluid border rounded" style="cursor: pointer;" width="120" height="60" border="0" />
</span>
<a href="javascript:void(0);" id="reload_captcha" class="small text-decoration-none text-muted"><i class="bi bi-arrow-clockwise"></i> {#COMMENT_CAPTCHA_UPD#}</a>
</div>
</div>
<div class="col-md-8">
<label for="securecode" class="form-label">{#COMMENT_FORM_CODE_ENTER#}*</label>
<input name="securecode" type="text" id="securecode" maxlength="10" class="form-control" placeholder="{#COMMENT_FORM_CODE_ENTER#}" />
<div id="captcha_error_msg"></div>
</div>
</div>
{/if}
<div class="mt-4">
<button type="submit" class="btn btn-success me-2">
@@ -229,22 +230,24 @@
</div>
{/if}
{* Модальное окно удаления *}
<div class="modal fade" id="deleteCommentModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-danger text-white">
<h5 class="modal-title">{#COMMENT_MOD_DEL_CONFIRM#}</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">{#COMMENT_MOD_DEL_CONFIRM_A#}</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{#COMMENT_MOD_DEL_CANCEL#}</button>
<button type="button" class="btn btn-danger" id="confirmDeleteButton">{#COMMENT_MOD_DEL_DEL#}</button>
</div>
</div>
</div>
</div>
{* Модальное окно удаления *}
<div class="modal fade" id="deleteCommentModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-danger text-white">
<h5 class="modal-title">{#COMMENT_MOD_DEL_CONFIRM#}</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body text-center py-4">
{#COMMENT_MOD_DEL_CONFIRM_A#}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{#COMMENT_MOD_DEL_CANCEL#}</button>
<button type="button" class="btn btn-danger" id="confirmDeleteButton">{#COMMENT_MOD_DEL_DEL#}</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var COMMENT_SITE_CLOSE = '{#COMMENT_SITE_CLOSE#}';