diff --git a/src/server/generate_form.py b/src/server/generate_form.py index 4d28a65..989bcb7 100644 --- a/src/server/generate_form.py +++ b/src/server/generate_form.py @@ -15,8 +15,6 @@ import sys from datetime import datetime from pathlib import Path -import boto3 - PROJECT_ROOT = Path(__file__).resolve().parents[2] OUTPUT_DIR = PROJECT_ROOT / "output" CONFIG_PATH = PROJECT_ROOT / "config.json" @@ -45,15 +43,15 @@ def generate_form( company_subsidy: float = 0, google_client_id: str = "", ) -> str: - meals_json = json.dumps(menu["meals"]) - roster_json = json.dumps(config.get("roster", [])) + meals_json = json.dumps(menu["meals"]).replace("", "<\\/") + roster_json = json.dumps(config.get("roster", [])).replace("", "<\\/") deadline = config.get("order_deadline", "Thursday 11:59 PM") week = datetime.now().strftime("%Y-W%U") scraped_at = menu.get("scraped_at", "unknown") submit_url = f"{api_url}/api/submit-order" if api_url else "/api/submit-order" status_url = f"{api_url}/api/form-status/{week}" if api_url else f"/api/form-status/{week}" roster_url = f"{api_url}/api/roster" if api_url else "/api/roster" - api_key_json = json.dumps(api_key) + api_key_json = json.dumps(api_key).replace("", "<\\/") has_discount = bulk_discount > 0 or company_subsidy > 0 use_google_auth = bool(google_client_id) google_client_id_json = json.dumps(google_client_id) @@ -103,7 +101,8 @@ function initGoogleAuth() { function handleCredentialResponse(response) { googleCredential = response.credential; - const payload = JSON.parse(atob(response.credential.split('.')[1])); + const b64 = response.credential.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'); + const payload = JSON.parse(atob(b64)); googleUser = { name: payload.name, email: payload.email }; document.getElementById('auth-overlay').style.display = 'none'; @@ -119,6 +118,7 @@ function handleCredentialResponse(response) { } updateTotal(); + checkDuplicateOrder(); } function signOut() { @@ -137,6 +137,7 @@ function signOut() { if use_google_auth: submit_order_js = """ async function submitOrder() { + if (formClosed) { alert('Orders are closed.'); return; } if (!googleCredential || !googleUser) { alert('Please sign in with Google first.'); return; } const items = Object.entries(quantities).map(([i, qty]) => ({ @@ -161,8 +162,9 @@ async function submitOrder() { if (res.ok) { for (const el of document.getElementById('app').children) { if (el.id !== 'success') el.style.display = 'none'; } document.getElementById('success').style.display = 'block'; - document.getElementById('success-detail').textContent = `${googleUser.name} — $${data.total.toFixed(2)} total. You're all set!`; + document.getElementById('success-detail').textContent = `${googleUser.name} — $${(data.total || 0).toFixed(2)} total. You're all set!`; document.querySelector('.sticky-footer').style.display = 'none'; + try { localStorage.setItem('lastOrderWeek', WEEK); } catch (e) {} } else { alert(data.error || 'Something went wrong.'); btn.disabled = false; @@ -178,6 +180,7 @@ async function submitOrder() { else: submit_order_js = """ async function submitOrder() { + if (formClosed) { alert('Orders are closed.'); return; } const name = document.getElementById('emp-name').value.trim(); const email = document.getElementById('emp-email').value.trim(); if (!name) { alert('Please enter your name.'); return; } @@ -205,8 +208,9 @@ async function submitOrder() { if (res.ok) { for (const el of document.getElementById('app').children) { if (el.id !== 'success') el.style.display = 'none'; } document.getElementById('success').style.display = 'block'; - document.getElementById('success-detail').textContent = `${name} — $${data.total.toFixed(2)} total. You're all set!`; + document.getElementById('success-detail').textContent = `${name} — $${(data.total || 0).toFixed(2)} total. You're all set!`; document.querySelector('.sticky-footer').style.display = 'none'; + try { localStorage.setItem('lastOrderWeek', WEEK); } catch (e) {} } else { alert(data.error || 'Something went wrong.'); btn.disabled = false; @@ -226,6 +230,7 @@ async function submitOrder() {