init commit
This commit is contained in:
18
smartsoltech/static/assets/js/get-csrf-token.js
Normal file
18
smartsoltech/static/assets/js/get-csrf-token.js
Normal file
@@ -0,0 +1,18 @@
|
||||
// Функция для получения CSRF токена из куков
|
||||
function getCookie(name) {
|
||||
let cookieValue = null;
|
||||
if (document.cookie && document.cookie !== '') {
|
||||
const cookies = document.cookie.split(';');
|
||||
for (let i = 0; i < cookies.length; i++) {
|
||||
const cookie = cookies[i].trim();
|
||||
if (cookie.substring(0, name.length + 1) === (name + '=')) {
|
||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cookieValue;
|
||||
}
|
||||
|
||||
// Инициализация переменной csrftoken, которая будет доступна глобально
|
||||
const csrftoken = getCookie('csrftoken');
|
||||
49
smartsoltech/static/assets/js/modal-init.js
Normal file
49
smartsoltech/static/assets/js/modal-init.js
Normal file
@@ -0,0 +1,49 @@
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
// Работа с модальным окном заявки
|
||||
var modalElement = document.getElementById('orderModal');
|
||||
if (modalElement) {
|
||||
var modal = new bootstrap.Modal(modalElement);
|
||||
|
||||
// Инициализация модального окна
|
||||
modalElement.addEventListener('show.bs.modal', function () {
|
||||
console.log("Модальное окно открыто");
|
||||
});
|
||||
|
||||
modalElement.addEventListener('hide.bs.modal', function () {
|
||||
console.log("Модальное окно закрыто");
|
||||
});
|
||||
}
|
||||
|
||||
// Открытие модального окна для заявки на услугу
|
||||
const openModalBtn = document.getElementById('openModalBtn');
|
||||
const serviceModal = document.getElementById('serviceModal');
|
||||
|
||||
if (openModalBtn && serviceModal) {
|
||||
openModalBtn.addEventListener('click', function (event) {
|
||||
event.preventDefault();
|
||||
const serviceId = openModalBtn.getAttribute('data-service-id');
|
||||
console.log("Service ID при открытии модального окна:", serviceId);
|
||||
|
||||
if (!serviceId) {
|
||||
alert("Идентификатор услуги не найден. Обновите страницу и попробуйте снова.");
|
||||
return;
|
||||
}
|
||||
|
||||
generateQrButton.dataset.serviceId = serviceId;
|
||||
|
||||
serviceModal.classList.add('show');
|
||||
serviceModal.style.display = 'block';
|
||||
});
|
||||
}
|
||||
|
||||
document.querySelectorAll('.close').forEach(closeBtn => {
|
||||
closeBtn.addEventListener('click', function () {
|
||||
if (serviceModal) {
|
||||
serviceModal.classList.remove('show');
|
||||
setTimeout(() => {
|
||||
serviceModal.style.display = 'none';
|
||||
}, 500);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
108
smartsoltech/static/assets/js/modern-scripts.js
Normal file
108
smartsoltech/static/assets/js/modern-scripts.js
Normal file
@@ -0,0 +1,108 @@
|
||||
// Modern Scripts for SmartSolTech Website
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
console.log('SmartSolTech: DOM loaded, initializing...');
|
||||
|
||||
// Hide loading screen
|
||||
const loadingScreen = document.getElementById('loading-screen');
|
||||
if (loadingScreen) {
|
||||
console.log('SmartSolTech: Loading screen found, hiding...');
|
||||
setTimeout(() => {
|
||||
loadingScreen.style.opacity = '0';
|
||||
loadingScreen.style.pointerEvents = 'none';
|
||||
setTimeout(() => {
|
||||
loadingScreen.style.display = 'none';
|
||||
loadingScreen.remove(); // Полностью удаляем элемент
|
||||
console.log('SmartSolTech: Loading screen removed');
|
||||
}, 300);
|
||||
}, 500); // Уменьшили время ожидания
|
||||
} else {
|
||||
console.log('SmartSolTech: Loading screen not found');
|
||||
}
|
||||
|
||||
// Theme Toggle Functionality
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const html = document.documentElement;
|
||||
|
||||
if (themeToggle) {
|
||||
// Check for saved theme preference
|
||||
const currentTheme = localStorage.getItem('theme') || 'light';
|
||||
html.setAttribute('data-theme', currentTheme);
|
||||
updateThemeIcon(currentTheme);
|
||||
|
||||
themeToggle.addEventListener('click', function() {
|
||||
const currentTheme = html.getAttribute('data-theme');
|
||||
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
|
||||
|
||||
html.setAttribute('data-theme', newTheme);
|
||||
localStorage.setItem('theme', newTheme);
|
||||
updateThemeIcon(newTheme);
|
||||
|
||||
// Add animation
|
||||
this.style.transform = 'scale(0.8)';
|
||||
setTimeout(() => {
|
||||
this.style.transform = 'scale(1)';
|
||||
}, 150);
|
||||
});
|
||||
}
|
||||
|
||||
function updateThemeIcon(theme) {
|
||||
if (!themeToggle) return;
|
||||
const icon = themeToggle.querySelector('i');
|
||||
if (icon) {
|
||||
if (theme === 'dark') {
|
||||
icon.className = 'fas fa-sun';
|
||||
themeToggle.setAttribute('aria-label', 'Переключить на светлую тему');
|
||||
} else {
|
||||
icon.className = 'fas fa-moon';
|
||||
themeToggle.setAttribute('aria-label', 'Переключить на темную тему');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Navbar scroll behavior
|
||||
const navbar = document.querySelector('.navbar-modern');
|
||||
if (navbar) {
|
||||
window.addEventListener('scroll', function() {
|
||||
if (window.scrollY > 50) {
|
||||
navbar.classList.add('scrolled');
|
||||
} else {
|
||||
navbar.classList.remove('scrolled');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Smooth scrolling for anchor links
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
if (target) {
|
||||
e.preventDefault();
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Intersection Observer for animations
|
||||
const observerOptions = {
|
||||
threshold: 0.1,
|
||||
rootMargin: '0px 0px -50px 0px'
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
entry.target.style.opacity = '1';
|
||||
entry.target.style.transform = 'translateY(0)';
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
// Observe cards and service items
|
||||
document.querySelectorAll('.card-modern, .service-card, .step-card').forEach(card => {
|
||||
observer.observe(card);
|
||||
});
|
||||
|
||||
console.log('SmartSolTech: All scripts loaded successfully');
|
||||
});
|
||||
1
smartsoltech/static/assets/js/script.min.js
vendored
Normal file
1
smartsoltech/static/assets/js/script.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
!function(){"use strict";var e=document.querySelector("#mainNav");if(e){var o=e.querySelector(".navbar-collapse");if(o){var n=new bootstrap.Collapse(o,{toggle:!1}),t=o.querySelectorAll("a");for(var a of t)a.addEventListener("click",(function(e){n.hide()}))}var r=function(){(void 0!==window.pageYOffset?window.pageYOffset:(document.documentElement||document.body.parentNode||document.body).scrollTop)>100?e.classList.add("navbar-shrink"):e.classList.remove("navbar-shrink")};r(),document.addEventListener("scroll",r);var d=document.querySelectorAll(".portfolio-modal");for(var s of d)s.addEventListener("shown.bs.modal",(function(o){e.classList.add("d-none")})),s.addEventListener("hidden.bs.modal",(function(o){e.classList.remove("d-none")}))}}();
|
||||
116
smartsoltech/static/assets/js/service_request.js
Normal file
116
smartsoltech/static/assets/js/service_request.js
Normal file
@@ -0,0 +1,116 @@
|
||||
// service-request.js
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
// Открытие модального окна
|
||||
const openModalBtn = document.getElementById('openModalBtn');
|
||||
const serviceModal = document.getElementById('serviceModal');
|
||||
const generateQrButton = document.getElementById('generateQrButton');
|
||||
|
||||
if (openModalBtn && serviceModal) {
|
||||
openModalBtn.addEventListener('click', function (event) {
|
||||
event.preventDefault();
|
||||
// Логирование значения serviceId при открытии модального окна
|
||||
const serviceId = openModalBtn.getAttribute('data-service-id');
|
||||
console.log("Service ID при открытии модального окна:", serviceId);
|
||||
|
||||
// Проверяем, если serviceId отсутствует
|
||||
if (!serviceId) {
|
||||
alert("Идентификатор услуги не найден. Обновите страницу и попробуйте снова.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Сохраняем serviceId для дальнейшего использования
|
||||
generateQrButton.dataset.serviceId = serviceId;
|
||||
|
||||
// Показываем модальное окно
|
||||
serviceModal.classList.add('show');
|
||||
serviceModal.style.display = 'block';
|
||||
});
|
||||
} else {
|
||||
console.error('Не удалось найти элемент с id openModalBtn или serviceModal.');
|
||||
}
|
||||
|
||||
// Закрытие модального окна
|
||||
document.querySelectorAll('.close').forEach(closeBtn => {
|
||||
closeBtn.addEventListener('click', function () {
|
||||
if (serviceModal) {
|
||||
serviceModal.classList.remove('show');
|
||||
setTimeout(() => {
|
||||
serviceModal.style.display = 'none';
|
||||
}, 500);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Обработчик кнопки "Создать заявку"
|
||||
if (generateQrButton) {
|
||||
generateQrButton.addEventListener('click', function () {
|
||||
// Получение значений полей
|
||||
const clientEmail = document.getElementById('clientEmail').value.trim();
|
||||
const clientPhone = document.getElementById('clientPhone').value.trim();
|
||||
const clientName = document.getElementById('clientName').value.trim();
|
||||
const description = document.getElementById('description').value.trim();
|
||||
|
||||
// Получаем serviceId из кнопки открытия модального окна
|
||||
const serviceId = generateQrButton.dataset.serviceId;
|
||||
|
||||
// Логируем для проверки значения serviceId перед отправкой
|
||||
console.log("Service ID перед отправкой запроса:", serviceId);
|
||||
|
||||
// Проверка заполненности полей
|
||||
if (!clientEmail || !clientPhone || !clientName || !description || !serviceId) {
|
||||
let errorMessage = 'Пожалуйста, заполните все поля формы перед продолжением.\n';
|
||||
if (!serviceId) {
|
||||
errorMessage += 'Идентификатор услуги не найден. Обновите страницу и попробуйте снова.\n';
|
||||
}
|
||||
alert(errorMessage);
|
||||
return;
|
||||
}
|
||||
|
||||
// Отправка POST запроса на создание заявки
|
||||
fetch(`/service/generate_qr_code/${serviceId}/`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-CSRFToken': csrftoken // Используем глобально инициализированный CSRF токен
|
||||
},
|
||||
body: JSON.stringify({
|
||||
client_email: clientEmail,
|
||||
client_phone: clientPhone,
|
||||
client_name: clientName,
|
||||
description: description
|
||||
})
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Ошибка при создании заявки');
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
if (data.qr_code_url) {
|
||||
// Обновляем src изображения QR-кода и показываем его
|
||||
const qrCodeImg = document.getElementById('qrCodeImg');
|
||||
if (qrCodeImg) {
|
||||
qrCodeImg.src = data.qr_code_url;
|
||||
qrCodeImg.style.display = 'block';
|
||||
}
|
||||
|
||||
// Начинаем проверку статуса заявки
|
||||
const interval = setInterval(() => {
|
||||
checkVerificationStatus(data.service_request_id, interval);
|
||||
}, 5000);
|
||||
} else if (data.status === 'existing_request') {
|
||||
alert(data.message);
|
||||
} else {
|
||||
alert('Неизвестная ошибка. Пожалуйста, попробуйте снова.');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Ошибка при создании заявки:', error);
|
||||
});
|
||||
});
|
||||
} else {
|
||||
console.error('Не удалось найти элемент с id generateQrButton.');
|
||||
}
|
||||
});
|
||||
37
smartsoltech/static/assets/js/verification_status.js
Normal file
37
smartsoltech/static/assets/js/verification_status.js
Normal file
@@ -0,0 +1,37 @@
|
||||
// verification-status.js
|
||||
|
||||
function checkVerificationStatus(serviceRequestId, interval) {
|
||||
console.log(`Проверка статуса для заявки с ID: ${serviceRequestId}`); // Лог для проверки
|
||||
|
||||
fetch(`/service/request_status/${serviceRequestId}/`)
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Ошибка при проверке статуса заявки');
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
if (data.is_verified) {
|
||||
// Закрываем форму и показываем окно подтверждения
|
||||
const serviceModal = document.getElementById('serviceModal');
|
||||
const confirmationModal = document.getElementById('confirmationModal');
|
||||
|
||||
if (serviceModal) {
|
||||
serviceModal.style.display = 'none';
|
||||
}
|
||||
|
||||
if (confirmationModal) {
|
||||
confirmationModal.style.display = 'block';
|
||||
}
|
||||
|
||||
// Останавливаем интервал проверки статуса
|
||||
clearInterval(interval);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Ошибка при проверке статуса заявки:', error);
|
||||
});
|
||||
}
|
||||
|
||||
// Делаем функцию доступной глобально
|
||||
window.checkVerificationStatus = checkVerificationStatus;
|
||||
Reference in New Issue
Block a user