Auto-commit before push to git.mycloud24.ru
This commit is contained in:
+79
-27
@@ -1,7 +1,9 @@
|
||||
let html5QrCode = null;
|
||||
let currentToken = null;
|
||||
let availableCameras = [];
|
||||
|
||||
const qrReader = document.getElementById("qr-reader");
|
||||
const cameraSelect = document.getElementById("camera-select");
|
||||
const startScanBtn = document.getElementById("start-scan");
|
||||
const stopScanBtn = document.getElementById("stop-scan");
|
||||
const searchInput = document.getElementById("search-input");
|
||||
@@ -12,6 +14,8 @@ const guestName = document.getElementById("guest-name");
|
||||
const guestDepartment = document.getElementById("guest-department");
|
||||
const guestPosition = document.getElementById("guest-position");
|
||||
const guestEmail = document.getElementById("guest-email");
|
||||
const guestEvent = document.getElementById("guest-event");
|
||||
const eventSelect = document.getElementById("event-select");
|
||||
const checkInStatus = document.getElementById("check-in-status");
|
||||
const checkInBtn = document.getElementById("check-in-btn");
|
||||
const resetBtn = document.getElementById("reset-btn");
|
||||
@@ -24,6 +28,7 @@ function resetGuestCard() {
|
||||
guestDepartment.textContent = "";
|
||||
guestPosition.textContent = "";
|
||||
guestEmail.textContent = "";
|
||||
if (guestEvent) guestEvent.textContent = "";
|
||||
checkInStatus.classList.add("d-none");
|
||||
checkInStatus.className = "alert d-none";
|
||||
checkInBtn.disabled = false;
|
||||
@@ -53,6 +58,9 @@ function showGuest(guest) {
|
||||
guestDepartment.textContent = guest.department;
|
||||
guestPosition.textContent = guest.position || "";
|
||||
guestEmail.textContent = guest.email;
|
||||
if (guestEvent) {
|
||||
guestEvent.textContent = guest.event_name ? `Мероприятие: ${guest.event_name}` : "";
|
||||
}
|
||||
|
||||
if (guest.checked_in) {
|
||||
checkInStatus.classList.remove("d-none", "alert-success", "alert-warning");
|
||||
@@ -79,39 +87,76 @@ function loadGuestByToken(token) {
|
||||
});
|
||||
}
|
||||
|
||||
// QR Scanner
|
||||
startScanBtn.addEventListener("click", () => {
|
||||
html5QrCode = new Html5Qrcode("qr-reader");
|
||||
// Camera selection
|
||||
function populateCameras() {
|
||||
Html5Qrcode.getCameras()
|
||||
.then(cameras => {
|
||||
if (cameras && cameras.length) {
|
||||
const cameraId = cameras[0].id;
|
||||
html5QrCode.start(
|
||||
cameraId,
|
||||
{ fps: 10, qrbox: { width: 250, height: 250 } },
|
||||
(decodedText) => {
|
||||
html5QrCode.stop();
|
||||
stopScanBtn.classList.add("d-none");
|
||||
startScanBtn.classList.remove("d-none");
|
||||
availableCameras = cameras || [];
|
||||
cameraSelect.innerHTML = '<option value="">-- Выберите камеру --</option>';
|
||||
|
||||
// Extract token from URL
|
||||
const url = new URL(decodedText);
|
||||
const token = url.searchParams.get("token");
|
||||
if (token) {
|
||||
loadGuestByToken(token);
|
||||
}
|
||||
},
|
||||
(errorMessage) => {}
|
||||
);
|
||||
startScanBtn.classList.add("d-none");
|
||||
stopScanBtn.classList.remove("d-none");
|
||||
} else {
|
||||
alert("Камеры не найдены");
|
||||
if (availableCameras.length === 0) {
|
||||
cameraSelect.innerHTML += '<option value="" disabled>Камеры не найдены</option>';
|
||||
return;
|
||||
}
|
||||
|
||||
availableCameras.forEach((camera, index) => {
|
||||
const option = document.createElement("option");
|
||||
option.value = camera.id;
|
||||
option.textContent = camera.label || `Камера ${index + 1}`;
|
||||
cameraSelect.appendChild(option);
|
||||
});
|
||||
|
||||
// Try to select back camera by default
|
||||
const backCamera = availableCameras.find(c =>
|
||||
c.label.toLowerCase().includes("back") ||
|
||||
c.label.toLowerCase().includes("задняя") ||
|
||||
c.label.toLowerCase().includes("environment")
|
||||
);
|
||||
if (backCamera) {
|
||||
cameraSelect.value = backCamera.id;
|
||||
} else if (availableCameras.length > 0) {
|
||||
cameraSelect.value = availableCameras[availableCameras.length - 1].id;
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
alert("Ошибка доступа к камере: " + err.message);
|
||||
console.error("Ошибка получения списка камер:", err);
|
||||
cameraSelect.innerHTML = '<option value="">Ошибка доступа к камерам</option>';
|
||||
});
|
||||
}
|
||||
|
||||
// QR Scanner
|
||||
startScanBtn.addEventListener("click", () => {
|
||||
const cameraId = cameraSelect.value;
|
||||
if (!cameraId) {
|
||||
alert("Сначала выберите камеру");
|
||||
return;
|
||||
}
|
||||
|
||||
html5QrCode = new Html5Qrcode("qr-reader");
|
||||
html5QrCode.start(
|
||||
cameraId,
|
||||
{ fps: 10, qrbox: { width: 250, height: 250 } },
|
||||
(decodedText) => {
|
||||
html5QrCode.stop();
|
||||
stopScanBtn.classList.add("d-none");
|
||||
startScanBtn.classList.remove("d-none");
|
||||
|
||||
// Extract token from URL
|
||||
try {
|
||||
const url = new URL(decodedText);
|
||||
const token = url.searchParams.get("token");
|
||||
if (token) {
|
||||
loadGuestByToken(token);
|
||||
}
|
||||
} catch (e) {
|
||||
// If decodedText is not a URL, treat it as token
|
||||
loadGuestByToken(decodedText);
|
||||
}
|
||||
},
|
||||
(errorMessage) => {}
|
||||
);
|
||||
startScanBtn.classList.add("d-none");
|
||||
stopScanBtn.classList.remove("d-none");
|
||||
});
|
||||
|
||||
stopScanBtn.addEventListener("click", () => {
|
||||
@@ -132,7 +177,12 @@ searchInput.addEventListener("input", (e) => {
|
||||
|
||||
clearTimeout(searchTimeout);
|
||||
searchTimeout = setTimeout(() => {
|
||||
fetch(`/api/guests/search?q=${encodeURIComponent(query)}`)
|
||||
const eventId = eventSelect ? eventSelect.value : "";
|
||||
let url = `/api/guests/search?q=${encodeURIComponent(query)}`;
|
||||
if (eventId) {
|
||||
url += `&event_id=${encodeURIComponent(eventId)}`;
|
||||
}
|
||||
fetch(url)
|
||||
.then(response => response.json())
|
||||
.then(guests => {
|
||||
searchResults.innerHTML = "";
|
||||
@@ -190,6 +240,8 @@ resetBtn.addEventListener("click", resetGuestCard);
|
||||
|
||||
// If token is in URL (scanned via external scanner)
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
populateCameras();
|
||||
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const token = urlParams.get("token");
|
||||
if (token) {
|
||||
|
||||
Reference in New Issue
Block a user