This commit is contained in:
Dvorinka
2025-06-20 11:50:49 +02:00
parent 888d1b222e
commit b0cf7b77d5
3 changed files with 120 additions and 95 deletions
+13
View File
@@ -155,6 +155,16 @@
</div> </div>
</div> </div>
<!-- Reservation Details (Hidden by default) -->
<div id="reservationDetails" class="hidden space-y-4">
<div class="bg-blue-50 p-4 rounded-lg">
<h3 class="text-blue-700 font-semibold mb-2">Informace o rezervaci:</h3>
<div id="reservationInfo" class="space-y-2">
<!-- Reservation info will be populated here -->
</div>
</div>
</div>
<!-- Date and Time Fields - Departure --> <!-- Date and Time Fields - Departure -->
<div class="grid md:grid-cols-2 gap-5"> <div class="grid md:grid-cols-2 gap-5">
<div class="space-y-2"> <div class="space-y-2">
@@ -359,6 +369,9 @@
const timeEnd = document.getElementById('time_end'); const timeEnd = document.getElementById('time_end');
const dateStart = document.getElementById('date_start'); const dateStart = document.getElementById('date_start');
const dateEnd = document.getElementById('date_end'); const dateEnd = document.getElementById('date_end');
const reservationDetails = document.getElementById('reservationDetails');
const reservationInfo = document.getElementById('reservationInfo');
const currentReservationId = new URLSearchParams(window.location.search).get('reservationId');
let debounceTimer; let debounceTimer;
+4 -4
View File
@@ -1423,11 +1423,11 @@ func handleSubmit(w http.ResponseWriter, r *http.Request) {
} }
func sendEmail(entry TripEntry, parsedDateStart, parsedDateEnd time.Time, czechMonths []string) error { func sendEmail(entry TripEntry, parsedDateStart, parsedDateEnd time.Time, czechMonths []string) error {
smtpHost := "smtp.purelymail.com" smtpHost := "mail.pp-kunovice.cz"
smtpPort := 465 smtpPort := 465
sender := "info@tdvorak.dev" sender := "sluzebnicek@pp-kunovice.cz"
password := "%8s3Yad*!b3*t" password := "7g}qznB5bj"
recipient := "info@tdvorak.dev" recipient := "sluzebnicek@pp-kunovice.cz"
m := gomail.NewMessage() m := gomail.NewMessage()
m.SetHeader("From", sender) m.SetHeader("From", sender)
+88 -76
View File
@@ -1092,6 +1092,10 @@
class="bg-brand-blue hover:bg-brand-light-blue text-white font-bold py-2 px-6 rounded-lg shadow transition-all duration-200"> class="bg-brand-blue hover:bg-brand-light-blue text-white font-bold py-2 px-6 rounded-lg shadow transition-all duration-200">
Vytvořit rezervaci Vytvořit rezervaci
</button> </button>
<button type="button" id="createEvidence"
class="bg-brand-light-blue hover:bg-brand-blue text-white font-bold py-2 px-6 rounded-lg shadow transition-all duration-200 ml-4">
Vytvořit záznam jízdy
</button>
</div> </div>
</form> </form>
@@ -1345,46 +1349,33 @@
reservationForm.addEventListener('submit', async function(e) { reservationForm.addEventListener('submit', async function(e) {
e.preventDefault(); e.preventDefault();
// Get form values
const driverName = document.getElementById('driverName').value; const driverName = document.getElementById('driverName').value;
const vehicle = document.getElementById('vehicle').value;
const startDate = document.getElementById('startDate').value;
const startTime = document.getElementById('startTime').value;
const endDate = document.getElementById('endDate').value;
const endTime = document.getElementById('endTime').value;
const purpose = document.getElementById('purpose').value;
// Validate form
if (!validateDriverName(driverName)) { if (!validateDriverName(driverName)) {
showMessage('Prosím zadejte platné jméno a příjmení', 'error'); showMessage('Prosím zadejte platné jméno a příjmení', 'error');
return; return;
} }
const startDateInput = document.getElementById('startDate'); try {
const startTimeInput = document.getElementById('startTime');
const endDateInput = document.getElementById('endDate');
const endTimeInput = document.getElementById('endTime');
const startDateTime = parseDateTimeInputs(startDateInput, startTimeInput);
const endDateTime = parseDateTimeInputs(endDateInput, endTimeInput);
// Validate dates
if (endDateTime <= startDateTime) {
showMessage('Konec rezervace musí být po začátku', 'error');
return;
}
// Check availability one last time
const isAvailable = await checkAvailabilityAndTraffic();
if (!isAvailable) {
showMessage('Vozidlo již není k dispozici v tomto čase', 'error');
return;
}
// Prepare reservation data // Prepare reservation data
const reservationData = { const reservationData = {
driverName: document.getElementById('driverName').value, driverName: driverName,
vehicle: document.getElementById('vehicle').value, vehicle: vehicle,
startDate: formatDateForAPI(startDateTime), startDate: startDate,
startTime: formatTimeForAPI(startDateTime), startTime: startTime,
endDate: formatDateForAPI(endDateTime), endDate: endDate,
endTime: formatTimeForAPI(endDateTime), endTime: endTime,
purpose: document.getElementById('purpose')?.value || '' purpose: purpose
}; };
try {
const response = await fetch('/api/reservations', { const response = await fetch('/api/reservations', {
method: 'POST', method: 'POST',
headers: { headers: {
@@ -1925,68 +1916,89 @@
const startTime = document.getElementById('startTime').value; const startTime = document.getElementById('startTime').value;
const endDate = document.getElementById('endDate').value; const endDate = document.getElementById('endDate').value;
const endTime = document.getElementById('endTime').value; const endTime = document.getElementById('endTime').value;
const purpose = document.getElementById('purpose')?.value || ''; const purpose = document.getElementById('purpose').value;
// Validate form // Validate required fields
if (!validateDriverName(driverName)) { if (!driverName || !vehicle || !startDate || !startTime || !endDate || !endTime) {
showMessage('Prosím zadejte platné jméno a příjmení', 'error'); showMessage('Prosím vyplňte všechna povinná pole.', 'error');
return; return;
} }
try { // Check if end time is after start time
// Prepare reservation data const startDateTime = new Date(`${startDate}T${startTime}`);
const endDateTime = new Date(`${endDate}T${endTime}`);
if (endDateTime <= startDateTime) {
showMessage('Datum a čas příjezdu musí být pozdější než datum a čas odjezdu.', 'error');
return;
}
// Save to localStorage
const reservationData = { const reservationData = {
driverName: driverName, id: Date.now().toString(),
vehicle: vehicle, driverName,
startDate: startDate, vehicle,
startTime: startTime, startDate,
endDate: endDate, startTime,
endTime: endTime, endDate,
purpose: purpose endTime,
purpose,
created: new Date().toISOString()
}; };
const response = await fetch('/api/reservations', { // Get existing reservations or initialize empty array
method: 'POST', let reservations = JSON.parse(localStorage.getItem('reservations') || '[]');
headers: {
'Content-Type': 'application/json', // Add new reservation
}, reservations.push(reservationData);
body: JSON.stringify(reservationData) localStorage.setItem('reservations', JSON.stringify(reservations));
// Show success message
showMessage('Rezervace byla úspěšně vytvořena!', 'success');
// Close modal
document.getElementById('reservationModal').style.display = 'none';
// Refresh calendar
calendar.refetchEvents();
updateReservationsList();
}); });
if (!response.ok) { // Handle evidence creation button
throw new Error('Network response was not ok'); document.getElementById('createEvidence').addEventListener('click', async function() {
} const driverName = document.getElementById('driverName').value;
const vehicle = document.getElementById('vehicle').value;
const result = await response.json(); const startDate = document.getElementById('startDate').value;
const startTime = document.getElementById('startTime').value;
const endDate = document.getElementById('endDate').value;
const endTime = document.getElementById('endTime').value;
// Store reservation ID in localStorage // Store reservation ID in localStorage
const reservations = JSON.parse(localStorage.getItem('reservations') || '[]');
const latestReservation = reservations[reservations.length - 1];
if (!latestReservation) {
showMessage('Nejdřív vytvořte rezervaci.', 'error');
return;
}
// Check if current user owns this reservation
const userReservations = JSON.parse(localStorage.getItem('userReservations') || '[]'); const userReservations = JSON.parse(localStorage.getItem('userReservations') || '[]');
userReservations.push(result.id); if (!userReservations.includes(latestReservation.id)) {
localStorage.setItem('userReservations', JSON.stringify(userReservations)); showMessage('Tuto rezervaci nemůžete použít pro vytvoření záznamu jízdy.', 'error');
return;
// Add the new event to the calendar
calendar.addEvent({
id: result.id,
title: `${result.vehicle} - ${result.driverName}`,
start: `${result.startDate}T${result.startTime}`,
end: `${result.endDate}T${result.endTime}`,
extendedProps: {
driverName: result.driverName,
vehicle: result.vehicle,
purpose: result.purpose
} }
// Store reservation ID in localStorage
localStorage.setItem('currentReservationId', latestReservation.id);
// Redirect to evidence page with prefilled data
window.location.href = `evidence-aut.html?reservationId=${latestReservation.id}`;
}); });
// Reset form and close modal // Initialize userReservations in localStorage if not exists
reservationForm.reset(); if (!localStorage.getItem('userReservations')) {
document.getElementById('reservationModal').style.display = 'none'; localStorage.setItem('userReservations', JSON.stringify([]));
showMessage('Rezervace byla úspěšně vytvořena', 'success');
} catch (error) {
console.error('Error:', error);
showMessage('Nepodařilo se vytvořit rezervaci', 'error');
} }
});
// Make calendar events clickable // Make calendar events clickable
calendar.on('eventClick', function(info) { calendar.on('eventClick', function(info) {