136 lines
4.4 KiB
JavaScript
136 lines
4.4 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function() {
|
|
console.log('Flask app loaded successfully!');
|
|
// Timer functionality
|
|
const timer = document.getElementById('timer');
|
|
const arriveBtn = document.getElementById('arrive-btn');
|
|
const leaveBtn = document.getElementById('leave-btn');
|
|
const pauseBtn = document.getElementById('pause-btn');
|
|
|
|
let isPaused = false;
|
|
let timerInterval;
|
|
|
|
// Start timer if we're on a page with an active timer
|
|
if (timer) {
|
|
const startTime = parseInt(timer.dataset.start);
|
|
const totalBreakDuration = parseInt(timer.dataset.breaks || 0);
|
|
isPaused = timer.dataset.paused === 'true';
|
|
|
|
// Update the pause button text based on current state
|
|
if (pauseBtn) {
|
|
updatePauseButtonText();
|
|
}
|
|
|
|
// Update timer every second
|
|
function updateTimer() {
|
|
if (isPaused) return;
|
|
|
|
const now = Math.floor(Date.now() / 1000);
|
|
const diff = now - startTime - totalBreakDuration;
|
|
|
|
const hours = Math.floor(diff / 3600);
|
|
const minutes = Math.floor((diff % 3600) / 60);
|
|
const seconds = diff % 60;
|
|
|
|
timer.textContent = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
|
|
}
|
|
|
|
// Initial update
|
|
updateTimer();
|
|
|
|
// Set interval for updates
|
|
timerInterval = setInterval(updateTimer, 1000);
|
|
}
|
|
|
|
function updatePauseButtonText() {
|
|
if (pauseBtn) {
|
|
if (isPaused) {
|
|
pauseBtn.textContent = 'Resume Work';
|
|
pauseBtn.classList.add('resume-btn');
|
|
pauseBtn.classList.remove('pause-btn');
|
|
} else {
|
|
pauseBtn.textContent = 'Pause';
|
|
pauseBtn.classList.add('pause-btn');
|
|
pauseBtn.classList.remove('resume-btn');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Handle arrive button click
|
|
if (arriveBtn) {
|
|
arriveBtn.addEventListener('click', function() {
|
|
fetch('/api/arrive', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
// Reload the page to show the active timer
|
|
window.location.reload();
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
alert('Failed to record arrival time. Please try again.');
|
|
});
|
|
});
|
|
}
|
|
|
|
// Handle pause/resume button click
|
|
if (pauseBtn) {
|
|
pauseBtn.addEventListener('click', function() {
|
|
const entryId = pauseBtn.dataset.id;
|
|
|
|
fetch(`/api/toggle-pause/${entryId}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
isPaused = data.is_paused;
|
|
updatePauseButtonText();
|
|
|
|
// Show a notification
|
|
const notification = document.createElement('div');
|
|
notification.className = 'notification';
|
|
notification.textContent = data.message;
|
|
document.body.appendChild(notification);
|
|
|
|
// Remove notification after 3 seconds
|
|
setTimeout(() => {
|
|
notification.remove();
|
|
}, 3000);
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
alert('Failed to pause/resume. Please try again.');
|
|
});
|
|
});
|
|
}
|
|
|
|
// Handle leave button click
|
|
if (leaveBtn) {
|
|
leaveBtn.addEventListener('click', function() {
|
|
const entryId = leaveBtn.dataset.id;
|
|
|
|
fetch(`/api/leave/${entryId}`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
}
|
|
})
|
|
.then(response => response.json())
|
|
.then(data => {
|
|
// Reload the page to update the UI
|
|
window.location.reload();
|
|
})
|
|
.catch(error => {
|
|
console.error('Error:', error);
|
|
alert('Failed to record departure time. Please try again.');
|
|
});
|
|
});
|
|
}
|
|
});
|