От </div> <div class="text-end"> Отчет сгенерирован нейросейтью </div> </div> <div class="offcanvas offcanvas-bottom" data-bs-scroll="true" data-bs-backdrop="false" tabindex="-1" id="offcanvasSendMessage" role="dialog" aria-labelledby="offcanvasSendMessageLabel"> <div class="offcanvas-header"> <h5 class="offcanvas-title" id="offcanvasSendMessageLabel">Запрос на добавление функционала / Обнаруженная ошибка</h5> <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button> </div> <div class="offcanvas-body"> <div class="input-group mb-2"> <textarea class="form-control" id="messageText" style="height: 100px"></textarea> </div> <span class="d-md-flex justify-content-md-end"><a href="javascript:void(0)" type="button" id="sendMessage" class="btn btn-primary">Отправить</a></span> </div> </div> <div class="toast-container position-fixed bottom-0 end-0 p-3" id="toastContainer"></div> <script> $("#sendMessage").click(function() { let sndurl = window.location.href; let user = 'Кто-то не авторизованный'; let message = $("#messageText").val(); if (message && message.trim()) { // Показать индикатор загрузки $("#sendMessage").prop('disabled', true).html('<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Отправка...'); $.ajax({ url: "/core/bot.php", method: "POST", data: { sendMessage: true, url: sndurl, user: user, message: message, }, success: function(response) { $("#offcanvasSendMessage").offcanvas("toggle"); $("#messageText").val(''); addAlert('success', 'Сообщение успешно отправлено!'); }, error: function(xhr, status, error) { addAlert('danger', 'Ошибка при отправке сообщения. Попробуйте позже.'); }, complete: function() { // Восстановить кнопку $("#sendMessage").prop('disabled', false).html('Отправить'); } }); }; }); function addAlert(type = 'success', message = 'Отправлено', autoRemove = true, timeout = 5000) { const toastId = 'toast-' + Date.now(); // Определяем заголовок и иконку в зависимости от типа let toastHeader = ''; let toastClass = ''; if (type === 'success') { toastHeader = '<strong class="me-auto text-success">Успех</strong>'; // toastClass = 'bg-success text-white'; } else if (type === 'danger') { toastHeader = '<strong class="me-auto text-danger">Ошибка</strong>'; // toastClass = 'bg-danger text-white'; } else { toastHeader = '<strong class="me-auto">Сообщение</strong>'; // toastClass = 'bg-info text-white'; } const toastHTML = ` <div id="${toastId}" class="toast ${toastClass}" role="alert" aria-live="assertive" aria-atomic="true"> <div class="toast-header ${toastClass}"> ${toastHeader} <small class="text-muted">только что</small> <button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Закрыть"></button> </div> <div class="toast-body"> ${message} </div> </div> `; document.getElementById('toastContainer').insertAdjacentHTML('beforeend', toastHTML); // Инициализируем и показываем тост const toastElement = document.getElementById(toastId); const toast = new bootstrap.Toast(toastElement, { autohide: autoRemove, delay: timeout }); toast.show(); // Удаляем тост после скрытия toastElement.addEventListener('hidden.bs.toast', function () { this.remove(); }); } </script> </main> <footer> <div class="container mt-4 mb-4"> <div class="d-flex flex-row justify-content-between"> <div> <a href data-bs-toggle="offcanvas" class="link-dark" data-bs-target="#offcanvasSendMessage" aria-controls="offcanvasSendMessage">Предложения/Ошибки/Пожелания по развитию</a> </div> <div> <a href="/payments/create/donat">Поддержать разработку проекта</a> </div> </div> </div> </footer> <!-- START Cookie-Alert --> <div id="cookie_note"> <p>Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, Вы соглашаетесь с условиями использования файлов cookies. Наша <a href="https://dartsbase.ru/private-policy" target="_blank">Политика конфиденциальности</a>.</p> <button class="cookie_accept base-btn-small">Я согласен</button> </div> <!-- END Cookie-Alert --> <script> function setCookie(name, value, days) { let expires = ""; if (days) { let date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } document.cookie = name + "=" + (value || "") + expires + "; path=/"; } function getCookie(name) { let matches = document.cookie.match(new RegExp("(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)")); return matches ? decodeURIComponent(matches[1]) : undefined; } function checkCookies() { let cookieNote = document.getElementById('cookie_note'); let cookieBtnAccept = cookieNote.querySelector('.cookie_accept'); // Если куки cookies_policy нет или она просрочена, то показываем уведомление if (!getCookie('cookies_policy')) { cookieNote.classList.add('show'); } // При клике на кнопку устанавливаем куку cookies_policy на один год cookieBtnAccept.addEventListener('click', function () { setCookie('cookies_policy', 'true', 365); cookieNote.classList.remove('show'); }); } checkCookies(); </script> <!-- Bootstrap JavaScript Libraries --> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js" integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3" crossorigin="anonymous"> </script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script> <!-- Bootstrap icons --> </body> </html>