Update check-in Location Services requirement

This commit is contained in:
Nguyen Ngo
2025-09-11 16:00:10 -04:00
parent 86d701a86f
commit 04d51144cb
2 changed files with 267 additions and 71 deletions
+104
View File
@@ -844,3 +844,107 @@ body {
--gray-800: #1e293b !important; --gray-800: #1e293b !important;
--gray-900: #0f172a !important; --gray-900: #0f172a !important;
} }
.location-warning-banner {
background: linear-gradient(135deg, #ff6b6b, #ee5a24);
color: white;
padding: 15px;
margin-bottom: 20px;
border-radius: 8px;
box-shadow: 0 4px 12px rgba(238, 90, 36, 0.3);
animation: slideDown 0.3s ease-out;
}
.warning-content {
display: flex;
align-items: flex-start;
gap: 12px;
}
.warning-icon {
font-size: 24px;
color: #fff;
margin-top: 2px;
}
.warning-text {
flex: 1;
}
.warning-message {
display: block;
font-size: 14px;
line-height: 1.4;
margin-bottom: 12px;
}
.warning-actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.warning-retry-btn,
.warning-dismiss-btn {
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
color: white;
padding: 8px 12px;
border-radius: 5px;
cursor: pointer;
font-size: 12px;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 5px;
}
.warning-retry-btn:hover,
.warning-dismiss-btn:hover {
background: rgba(255, 255, 255, 0.3);
transform: translateY(-1px);
}
/* Blocked Form Styling */
.location-blocked {
opacity: 0.6;
pointer-events: none;
position: relative;
}
.location-blocked::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 107, 107, 0.1);
border-radius: 8px;
z-index: 1;
}
/* Animation for warning banner */
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Mobile responsive adjustments */
@media (max-width: 768px) {
.warning-actions {
flex-direction: column;
}
.warning-retry-btn,
.warning-dismiss-btn {
width: 100%;
justify-content: center;
}
}
+119 -27
View File
@@ -144,6 +144,24 @@ function handleFormSubmit(event) {
return; return;
} }
// STEP 1: Check Location Services FIRST
console.log("🔍 Step 1: Validating Location Services...");
checkLocationServicesStatus()
.then(() => {
// Location services are working, proceed with check-in
console.log("✅ Location Services validated successfully");
proceedWithCheckin();
})
.catch((error) => {
// Location services are not working, block check-in
console.log("❌ Location Services validation failed:", error);
showLocationServicesBlockedMessage();
return;
});
}
function proceedWithCheckin() {
const employeeId = document.getElementById("employee_id")?.value?.trim(); const employeeId = document.getElementById("employee_id")?.value?.trim();
if (!employeeId) { if (!employeeId) {
@@ -166,6 +184,21 @@ function handleFormSubmit(event) {
submitCheckin(); submitCheckin();
} }
/**
* Show message when check-in is blocked due to location services
*/
function showLocationServicesBlockedMessage() {
const messages = {
en: "Check-in blocked: Location Services must be enabled to continue.",
es: "Registro bloqueado: Los Servicios de Ubicación deben estar habilitados para continuar."
};
const currentLang = currentLanguage || "en";
const message = messages[currentLang];
showCustomStatusMessage(message, "error");
}
// ENHANCED CHECK-IN SUBMISSION WITH MULTIPLE CHECK-IN SUPPORT // ENHANCED CHECK-IN SUBMISSION WITH MULTIPLE CHECK-IN SUPPORT
function submitCheckin() { function submitCheckin() {
if (isSubmitting) { if (isSubmitting) {
@@ -713,45 +746,107 @@ function checkLocationServicesStatus() {
// Check if geolocation is supported // Check if geolocation is supported
if (!navigator.geolocation) { if (!navigator.geolocation) {
showLocationServicesWarning("not_supported"); showLocationServicesWarning("not_supported");
return; blockCheckInProcess(true);
return Promise.reject("Location services not supported");
} }
return new Promise((resolve, reject) => {
// Test location access with a quick check // Test location access with a quick check
const timeoutId = setTimeout(() => { const timeoutId = setTimeout(() => {
showLocationServicesWarning("timeout"); showLocationServicesWarning("timeout");
}, 3000); // 3 second timeout blockCheckInProcess(true);
reject("Location services timeout");
}, 5000); // 5 second timeout
navigator.geolocation.getCurrentPosition( navigator.geolocation.getCurrentPosition(
(position) => { (position) => {
// Success - location services are working // Success - location services are working
clearTimeout(timeoutId); clearTimeout(timeoutId);
hideLocationServicesWarning(); hideLocationServicesWarning();
blockCheckInProcess(false);
// Log successful location access
console.log("✅ Location Services: ENABLED and working");
resolve(position);
}, },
(error) => { (error) => {
// Error - location services may be disabled // Error - location services may be disabled
clearTimeout(timeoutId); clearTimeout(timeoutId);
blockCheckInProcess(true);
switch (error.code) { switch (error.code) {
case error.PERMISSION_DENIED: case error.PERMISSION_DENIED:
showLocationServicesWarning("permission_denied"); showLocationServicesWarning("permission_denied");
console.log("❌ Location Services: PERMISSION DENIED");
break; break;
case error.POSITION_UNAVAILABLE: case error.POSITION_UNAVAILABLE:
showLocationServicesWarning("position_unavailable"); showLocationServicesWarning("position_unavailable");
console.log("❌ Location Services: POSITION UNAVAILABLE");
break; break;
case error.TIMEOUT: case error.TIMEOUT:
showLocationServicesWarning("timeout"); showLocationServicesWarning("timeout");
console.log("❌ Location Services: TIMEOUT");
break; break;
default: default:
showLocationServicesWarning("unknown_error"); showLocationServicesWarning("unknown_error");
console.log("❌ Location Services: UNKNOWN ERROR");
break; break;
} }
reject(error);
}, },
{ {
enableHighAccuracy: false, enableHighAccuracy: false,
timeout: 2500, timeout: 4000,
maximumAge: 60000, maximumAge: 30000,
} }
); );
});
}
function blockCheckInProcess(shouldBlock) {
const submitButton = document.getElementById("submitCheckin");
const employeeIdInput = document.getElementById("employee_id");
const form = document.getElementById("checkinForm");
if (shouldBlock) {
// Block check-in process
if (submitButton) {
submitButton.disabled = true;
submitButton.style.opacity = "0.5";
submitButton.style.cursor = "not-allowed";
}
if (employeeIdInput) {
employeeIdInput.disabled = true;
employeeIdInput.style.opacity = "0.7";
}
if (form) {
form.classList.add("location-blocked");
}
console.log("🚫 Check-in process BLOCKED - Location Services required");
} else {
// Unblock check-in process
if (submitButton) {
submitButton.disabled = false;
submitButton.style.opacity = "1";
submitButton.style.cursor = "pointer";
}
if (employeeIdInput) {
employeeIdInput.disabled = false;
employeeIdInput.style.opacity = "1";
}
if (form) {
form.classList.remove("location-blocked");
}
console.log("✅ Check-in process UNBLOCKED - Location Services working");
}
} }
/** /**
@@ -764,27 +859,27 @@ function showLocationServicesWarning(errorType) {
const warningMessages = { const warningMessages = {
en: { en: {
not_supported: not_supported:
"Location services are not supported by your browser.<br>Los servicios de ubicación no son compatibles con su navegador.", "⚠️ Location Services Not Supported<br><strong>Check-in is currently blocked.</strong><br>Your browser does not support location services required for check-in.<br><br>Los servicios de ubicación no son compatibles. El registro está bloqueado.",
permission_denied: permission_denied:
"Location access has been denied. Please enable location services for accurate check-in.<br>Se ha denegado el acceso a la ubicación. Habilite los servicios de ubicación para un registro preciso.", "⚠️ Location Access Denied<br><strong>Check-in is currently blocked.</strong><br>Please enable location access in your browser settings to continue with check-in.<br><br>Acceso a ubicación denegado. Habilite el acceso para continuar.",
position_unavailable: position_unavailable:
"Location services appear to be disabled. Please turn on location services for accurate check-in.<br>Los servicios de ubicación parecen estar deshabilitados. Active los servicios de ubicación para un registro preciso.", "⚠️ Location Services Disabled<br><strong>Check-in is currently blocked.</strong><br>Please turn on Location Services in your device settings and refresh the page.<br><br>Servicios de ubicación deshabilitados. Active los servicios y actualice la página.",
timeout: timeout:
"Location services may be disabled. Please check your location settings for accurate check-in.<br>Los servicios de ubicación pueden estar deshabilitados. Verifique su configuración de ubicación para un registro preciso.", "⚠️ Location Services Not Responding<br><strong>Check-in is currently blocked.</strong><br>Location services may be disabled. Please check your device settings.<br><br>Los servicios de ubicación no responden. Verifique la configuración.",
unknown_error: unknown_error:
"Unable to access location services. Please check your location settings.<br>No se puede acceder a los servicios de ubicación. Verifique su configuración de ubicación.", "⚠️ Location Services Error<br><strong>Check-in is currently blocked.</strong><br>Unable to access location services. Please check your settings and try again.<br><br>Error de servicios de ubicación. Verifique la configuración.",
}, },
es: { es: {
not_supported: not_supported:
"Los servicios de ubicación no son compatibles con su navegador.", "⚠️ Servicios de Ubicación No Compatibles<br><strong>El registro está bloqueado.</strong><br>Su navegador no es compatible con los servicios de ubicación requeridos.",
permission_denied: permission_denied:
"Se ha denegado el acceso a la ubicación. Habilite los servicios de ubicación para un registro preciso.", "⚠️ Acceso a Ubicación Denegado<br><strong>El registro está bloqueado.</strong><br>Habilite el acceso a la ubicación en la configuración de su navegador.",
position_unavailable: position_unavailable:
"Los servicios de ubicación parecen estar deshabilitados. Active los servicios de ubicación para un registro preciso.", "⚠️ Servicios de Ubicación Deshabilitados<br><strong>El registro está bloqueado.</strong><br>Active los Servicios de Ubicación en la configuración y actualice la página.",
timeout: timeout:
"Los servicios de ubicación pueden estar deshabilitados. Verifique su configuración de ubicación para un registro preciso.", "⚠️ Servicios de Ubicación No Responden<br><strong>El registro está bloqueado.</strong><br>Los servicios pueden estar deshabilitados. Verifique la configuración.",
unknown_error: unknown_error:
"No se puede acceder a los servicios de ubicación. Verifique su configuración de ubicación.", "⚠️ Error de Servicios de Ubicación<br><strong>El registro está bloqueado.</strong><br>No se puede acceder a los servicios. Verifique la configuración.",
}, },
}; };
@@ -841,20 +936,17 @@ function hideLocationServicesWarning() {
* Add this to your existing initialization * Add this to your existing initialization
*/ */
function initializeLocationServicesCheck() { function initializeLocationServicesCheck() {
// Check location services status when page loads // Check location services status when page loads and block if necessary
setTimeout(() => { setTimeout(() => {
checkLocationServicesStatus(); console.log("🔍 Initializing Location Services check...");
checkLocationServicesStatus()
.then(() => {
console.log("✅ Initial Location Services check passed");
})
.catch(() => {
console.log("❌ Initial Location Services check failed - Check-in blocked");
});
}, 1000); // Small delay to ensure page is fully loaded }, 1000); // Small delay to ensure page is fully loaded
// Also check before form submission // Remove the override of handleFormSubmit since we've updated it directly
const originalHandleFormSubmit = handleFormSubmit;
window.handleFormSubmit = function (event) {
// Quick location check before submission
checkLocationServicesStatus();
// Continue with original form submission after brief delay
setTimeout(() => {
originalHandleFormSubmit.call(this, event);
}, 500);
};
} }