Spaces:
Runtime error
Runtime error
Update templates/menu.html
Browse files- templates/menu.html +115 -101
templates/menu.html
CHANGED
|
@@ -470,119 +470,133 @@ form.text-center.mb-4 {
|
|
| 470 |
</a>
|
| 471 |
</div>
|
| 472 |
|
| 473 |
-
|
| 474 |
-
|
| 475 |
-
|
| 476 |
-
|
| 477 |
-
|
| 478 |
-
|
| 479 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 480 |
</div>
|
| 481 |
-
<div class="
|
| 482 |
-
|
| 483 |
-
<
|
| 484 |
-
<!-- Item Name -->
|
| 485 |
-
<h5 id="modal-name" class="fw-bold text-center"></h5>
|
| 486 |
-
<!-- Item Price -->
|
| 487 |
-
<p id="modal-price" class="text-muted text-center"></p>
|
| 488 |
-
<!-- Item Description -->
|
| 489 |
-
<p id="modal-description" class="text-secondary"></p>
|
| 490 |
-
<!-- Add-ons -->
|
| 491 |
-
<div id="modal-addons" class="modal-addons mt-4">
|
| 492 |
-
<h6>Customization Options</h6>
|
| 493 |
-
<div id="addons-list" class="addons-container">Loading customization options...</div>
|
| 494 |
-
</div>
|
| 495 |
-
|
| 496 |
-
|
| 497 |
-
<div class="mt-4">
|
| 498 |
-
<h6>Custom Request</h6>
|
| 499 |
-
<textarea id="modal-instructions" class="form-control" placeholder="Enter any special instructions here..."></textarea>
|
| 500 |
-
</div>
|
| 501 |
-
<span id="modal-section" data-section="" data-category="" style="display: none;"></span>
|
| 502 |
-
|
| 503 |
</div>
|
| 504 |
-
|
| 505 |
-
|
| 506 |
-
|
| 507 |
-
|
| 508 |
-
|
| 509 |
-
|
| 510 |
-
|
| 511 |
-
|
| 512 |
-
|
| 513 |
-
<!-- Add to Cart Button -->
|
| 514 |
-
<button type="button" class="btn btn-primary" onclick="addToCartFromModal()">Add to Cart</button>
|
| 515 |
-
</div>
|
| 516 |
-
|
| 517 |
-
|
| 518 |
</div>
|
|
|
|
|
|
|
| 519 |
</div>
|
| 520 |
</div>
|
| 521 |
</div>
|
|
|
|
| 522 |
|
| 523 |
-
|
| 524 |
-
|
| 525 |
-
|
| 526 |
-
|
| 527 |
-
|
| 528 |
-
|
| 529 |
-
|
| 530 |
-
|
| 531 |
-
|
| 532 |
-
|
| 533 |
-
|
| 534 |
-
|
| 535 |
-
|
| 536 |
-
|
| 537 |
-
|
| 538 |
-
// Set the default quantity to 1
|
| 539 |
-
document.getElementById('quantityInput').value = 1;
|
| 540 |
-
|
| 541 |
-
// Fetch customization options based on the section
|
| 542 |
-
fetch(`/api/addons?item_name=${encodeURIComponent(name)}&item_section=${encodeURIComponent(section)}`)
|
| 543 |
-
.then(response => response.json())
|
| 544 |
-
.then(data => {
|
| 545 |
-
const addonsList = document.getElementById('addons-list');
|
| 546 |
-
addonsList.innerHTML = ''; // Clear previous content
|
| 547 |
|
| 548 |
-
|
| 549 |
-
|
| 550 |
-
|
| 551 |
-
|
| 552 |
-
|
| 553 |
-
|
| 554 |
-
|
| 555 |
-
|
| 556 |
-
|
| 557 |
-
|
| 558 |
-
|
| 559 |
-
|
| 560 |
-
|
| 561 |
-
|
| 562 |
-
|
| 563 |
-
|
| 564 |
-
|
| 565 |
-
|
| 566 |
-
|
| 567 |
-
|
| 568 |
-
|
| 569 |
-
|
| 570 |
-
|
| 571 |
-
|
| 572 |
-
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 578 |
});
|
| 579 |
-
|
| 580 |
-
|
| 581 |
-
console.error('Error fetching add-ons:', err);
|
| 582 |
-
document.getElementById('addons-list').innerHTML = '<p>Error loading customization options.</p>';
|
| 583 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 584 |
}
|
|
|
|
| 585 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 586 |
function filterMenu() {
|
| 587 |
let input = document.getElementById('searchBar').value.toLowerCase(); // Get the value from search bar
|
| 588 |
let sections = document.querySelectorAll('h3'); // Select section headers
|
|
|
|
| 470 |
</a>
|
| 471 |
</div>
|
| 472 |
|
| 473 |
+
<!-- Modal for Item Details -->
|
| 474 |
+
<div class="modal fade" id="itemModal" tabindex="-1" aria-labelledby="itemModalLabel" aria-hidden="true">
|
| 475 |
+
<div class="modal-dialog modal-dialog-centered">
|
| 476 |
+
<div class="modal-content">
|
| 477 |
+
<div class="modal-header">
|
| 478 |
+
<h5 class="modal-title" id="itemModalLabel">Item Details</h5>
|
| 479 |
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
| 480 |
+
</div>
|
| 481 |
+
<div class="modal-body">
|
| 482 |
+
<!-- Item Image -->
|
| 483 |
+
<img id="modal-img" class="img-fluid rounded mb-3 d-block mx-auto" alt="Item Image" style="max-height: 200px; object-fit: cover;">
|
| 484 |
+
<!-- Item Name -->
|
| 485 |
+
<h5 id="modal-name" class="fw-bold text-center"></h5>
|
| 486 |
+
<!-- Item Price -->
|
| 487 |
+
<p id="modal-price" class="text-muted text-center"></p>
|
| 488 |
+
<!-- Item Description -->
|
| 489 |
+
<p id="modal-description" class="text-secondary"></p>
|
| 490 |
+
<!-- Add-ons -->
|
| 491 |
+
<div id="modal-addons" class="modal-addons mt-4">
|
| 492 |
+
<h6>Customization Options</h6>
|
| 493 |
+
<div id="addons-list" class="addons-container">Loading customization options...</div>
|
| 494 |
</div>
|
| 495 |
+
<div class="mt-4">
|
| 496 |
+
<h6>Custom Request</h6>
|
| 497 |
+
<textarea id="modal-instructions" class="form-control" placeholder="Enter any special instructions here..."></textarea>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 498 |
</div>
|
| 499 |
+
<span id="modal-section" data-section="" data-category="" style="display: none;"></span>
|
| 500 |
+
</div>
|
| 501 |
+
<!-- Quantity Controls and Add to Cart Button -->
|
| 502 |
+
<div class="modal-footer d-flex align-items-center justify-content-between">
|
| 503 |
+
<!-- Quantity Controls -->
|
| 504 |
+
<div class="d-flex align-items-center gap-2">
|
| 505 |
+
<button type="button" class="btn btn-outline-secondary" id="decreaseQuantity">-</button>
|
| 506 |
+
<input type="text" class="form-control text-center" id="quantityInput" value="1" readonly style="width: 50px;"/>
|
| 507 |
+
<button type="button" class="btn btn-outline-secondary" id="increaseQuantity">+</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 508 |
</div>
|
| 509 |
+
<!-- Add to Cart Button -->
|
| 510 |
+
<button type="button" class="btn btn-primary" onclick="addToCartFromModal()">Add to Cart</button>
|
| 511 |
</div>
|
| 512 |
</div>
|
| 513 |
</div>
|
| 514 |
+
</div>
|
| 515 |
|
| 516 |
+
<!-- JavaScript -->
|
| 517 |
+
<script>
|
| 518 |
+
// Show item details and fetch customization options
|
| 519 |
+
function showItemDetails(name, price, image, description, section, selectedCategory) {
|
| 520 |
+
document.getElementById('modal-name').innerText = name;
|
| 521 |
+
document.getElementById('modal-price').innerText = `$${price}`;
|
| 522 |
+
document.getElementById('modal-img').src = image || '/static/placeholder.jpg';
|
| 523 |
+
document.getElementById('modal-description').innerText = description || 'No description available.';
|
| 524 |
+
document.getElementById('addons-list').innerHTML = 'Loading customization options...';
|
| 525 |
+
document.getElementById('modal-instructions').value = '';
|
| 526 |
+
|
| 527 |
+
const modalSectionEl = document.getElementById('modal-section');
|
| 528 |
+
modalSectionEl.setAttribute('data-section', section);
|
| 529 |
+
modalSectionEl.setAttribute('data-category', selectedCategory);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 530 |
|
| 531 |
+
// Fetch customization options based on the section
|
| 532 |
+
fetch(`/api/addons?item_name=${encodeURIComponent(name)}&item_section=${encodeURIComponent(section)}`)
|
| 533 |
+
.then(response => response.json())
|
| 534 |
+
.then(data => {
|
| 535 |
+
const addonsList = document.getElementById('addons-list');
|
| 536 |
+
addonsList.innerHTML = ''; // Clear previous content
|
| 537 |
+
|
| 538 |
+
if (!data.success || !data.addons || data.addons.length === 0) {
|
| 539 |
+
addonsList.innerHTML = '<p>No customization options available.</p>';
|
| 540 |
+
return;
|
| 541 |
+
}
|
| 542 |
+
|
| 543 |
+
// Display customization options inside styled divs
|
| 544 |
+
data.addons.forEach(addon => {
|
| 545 |
+
const sectionDiv = document.createElement('div');
|
| 546 |
+
sectionDiv.classList.add('addon-section'); // Add styling class
|
| 547 |
+
|
| 548 |
+
// Add section title
|
| 549 |
+
const title = document.createElement('h6');
|
| 550 |
+
title.innerText = addon.name;
|
| 551 |
+
sectionDiv.appendChild(title);
|
| 552 |
+
|
| 553 |
+
// Create options list
|
| 554 |
+
const optionsContainer = document.createElement('div');
|
| 555 |
+
addon.options.forEach((option, index) => {
|
| 556 |
+
const optionId = `addon-${addon.name.replace(/\s+/g, '')}-${index}`;
|
| 557 |
+
const listItem = document.createElement('div');
|
| 558 |
+
listItem.classList.add('form-check');
|
| 559 |
+
listItem.innerHTML = `
|
| 560 |
+
<input type="checkbox" class="form-check-input addon-option" id="${optionId}" value="${option}"
|
| 561 |
+
data-name="${option}" data-group="${addon.name}" data-price="${addon.extra_charge ? addon.extra_charge_amount : 0}">
|
| 562 |
+
<label class="form-check-label" for="${optionId}">
|
| 563 |
+
${option} ${addon.extra_charge ? `($${addon.extra_charge_amount})` : ''}
|
| 564 |
+
</label>
|
| 565 |
+
`;
|
| 566 |
+
optionsContainer.appendChild(listItem);
|
| 567 |
});
|
| 568 |
+
sectionDiv.appendChild(optionsContainer);
|
| 569 |
+
addonsList.appendChild(sectionDiv);
|
|
|
|
|
|
|
| 570 |
});
|
| 571 |
+
})
|
| 572 |
+
.catch(err => {
|
| 573 |
+
console.error('Error fetching add-ons:', err);
|
| 574 |
+
document.getElementById('addons-list').innerHTML = '<p>Error loading customization options.</p>';
|
| 575 |
+
});
|
| 576 |
+
}
|
| 577 |
+
|
| 578 |
+
// Handle single-select/deselect logic for checkbox groups in all modals
|
| 579 |
+
document.addEventListener('click', function(event) {
|
| 580 |
+
if (event.target.classList.contains('addon-option')) {
|
| 581 |
+
handleAddonClick(event.target);
|
| 582 |
}
|
| 583 |
+
});
|
| 584 |
|
| 585 |
+
// Handle checkbox selection logic
|
| 586 |
+
function handleAddonClick(checkbox) {
|
| 587 |
+
const groupName = checkbox.getAttribute('data-group');
|
| 588 |
+
const isMultiSelectGroup = ["Extra Toppings", "Choose Raita/Sides","Select Dip/Sauce","Extra Add-ons","Make it a Combo"].includes(groupName);
|
| 589 |
+
|
| 590 |
+
// If it's not multi-select, uncheck all other checkboxes in the same group
|
| 591 |
+
if (!isMultiSelectGroup) {
|
| 592 |
+
const checkboxes = document.querySelectorAll(`.addon-option[data-group="${groupName}"]`);
|
| 593 |
+
checkboxes.forEach(otherCheckbox => {
|
| 594 |
+
if (otherCheckbox !== checkbox) {
|
| 595 |
+
otherCheckbox.checked = false;
|
| 596 |
+
}
|
| 597 |
+
});
|
| 598 |
+
}
|
| 599 |
+
}
|
| 600 |
function filterMenu() {
|
| 601 |
let input = document.getElementById('searchBar').value.toLowerCase(); // Get the value from search bar
|
| 602 |
let sections = document.querySelectorAll('h3'); // Select section headers
|