PDPA Features: ✅ Cookie consent banner ✅ Consent logging API ✅ Admin dashboard ✅ Privacy Policy ✅ Terms & Conditions Technical: ✅ Astro 5.x + Tailwind v4 ✅ Docker on port 80 ✅ SQLite database ✅ 15 pages built Ready for Easypanel deployment.
9 lines
5.1 KiB
HTML
9 lines
5.1 KiB
HTML
<!DOCTYPE html><html lang="th"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="บริษัท ดีล พลัส เทค จำกัด"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Kanit:wght@300;400;500;600;700&display=swap" rel="stylesheet"><meta property="og:title" content="Consent Logs Admin"><meta property="og:description" content="Deal Plus Tech"><title>Consent Logs Admin | ดีล พลัส เทค</title><link rel="stylesheet" href="/_astro/consent-logs.DinS5Xvv.css"></head> <body class="flex flex-col min-h-screen"> <main class="min-h-screen py-12"> <div class="container mx-auto px-4 max-w-7xl"> <div class="bg-white rounded-2xl shadow-lg p-8"> <h1 class="text-3xl font-bold mb-2">Consent Logs Admin</h1> <p class="text-secondary-600 mb-8">PDPA Compliance - User Consent Records</p> <div class="max-w-md mx-auto"> <form method="POST" class="bg-secondary-50 p-6 rounded-xl"> <input type="hidden" name="action" value="login"> <label class="block text-sm font-semibold mb-2">Password</label> <input type="password" name="password" class="w-full px-4 py-2 border-2 rounded-lg mb-4" required> <button type="submit" class="w-full bg-primary-600 text-white py-2 rounded-lg hover:bg-primary-700">Login</button> </form> </div> </div> </div> </main> <div id="cookie-consent-banner" class="fixed bottom-0 left-0 right-0 z-50 bg-white border-t-2 border-primary-600 shadow-2xl p-6 md:p-8 transform translate-y-full transition-transform duration-300" style="display: none;"> <div class="container mx-auto px-4 max-w-7xl"> <div class="flex flex-col lg:flex-row gap-6 items-start lg:items-center justify-between"> <div class="flex-1"> <h2 class="text-xl md:text-2xl font-bold text-secondary-900 mb-3">
|
|
เรายึดถือความเป็นส่วนตัวของคุณ
|
|
</h2> <p class="text-base md:text-lg text-secondary-700 mb-4">
|
|
เราใช้คุกกี้เพื่อปรับปรุงประสบการณ์การใช้งาน คุณสามารถเลือกยอมรับหรือปฏิเสธได้
|
|
</p> <div class="space-y-3 mt-4"> <div class="flex items-center gap-3 bg-secondary-50 p-3 rounded-lg"> <input type="checkbox" id="consent-essential" checked disabled class="w-5 h-5"> <label for="consent-essential" class="flex-1"> <span class="font-semibold">คุกกี้จำเป็น</span> <span class="text-sm text-secondary-600 block">ใช้สำหรับการทำงานของเว็บไซต์</span> </label> </div> <div class="flex items-center gap-3 bg-secondary-50 p-3 rounded-lg"> <input type="checkbox" id="consent-analytics" class="w-5 h-5"> <label for="consent-analytics" class="flex-1"> <span class="font-semibold">คุกกี้วิเคราะห์ข้อมูล</span> <span class="text-sm text-secondary-600 block">ช่วยให้เราเข้าใจการใช้งาน</span> </label> </div> </div> </div> <div class="flex gap-3"> <button id="consent-reject" class="bg-secondary-800 hover:bg-secondary-900 text-white px-6 py-3 rounded-lg font-semibold">
|
|
ปฏิเสธทั้งหมด
|
|
</button> <button id="consent-accept" class="bg-primary-600 hover:bg-primary-700 text-white px-6 py-3 rounded-lg font-semibold">
|
|
ยอมรับทั้งหมด
|
|
</button> </div> </div> </div> </div> <script type="module">const n="1.0.0";function a(){const e=localStorage.getItem("consent-preferences");return e?JSON.parse(e):null}async function s(e){localStorage.setItem("consent-preferences",JSON.stringify(e));try{let t=sessionStorage.getItem("consent_session_id");t||(t="ses_"+Math.random().toString(36).substring(2,15),sessionStorage.setItem("consent_session_id",t)),await fetch("/api/consent",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:t,consent:e,policyVersion:n})})}catch(t){console.error("Failed to log consent:",t)}}function i(){const e=document.getElementById("cookie-consent-banner");e&&(e.style.display="block",setTimeout(()=>e.classList.remove("translate-y-full"),10))}function o(){const e=document.getElementById("cookie-consent-banner");e&&(e.classList.add("translate-y-full"),setTimeout(()=>e.style.display="none",300))}function c(e){e.analytics}function r(){const e=a();if(e){document.getElementById("consent-analytics").checked=e.analytics,c(e);return}setTimeout(i,500)}document.addEventListener("DOMContentLoaded",()=>{r(),document.getElementById("consent-accept")?.addEventListener("click",()=>{const e=document.getElementById("consent-analytics").checked;s({essential:!0,analytics:e||!0,marketing:!1,timestamp:new Date().toISOString(),policyVersion:n}),c({analytics:!0}),o()}),document.getElementById("consent-reject")?.addEventListener("click",()=>{s({essential:!0,analytics:!1,marketing:!1,timestamp:new Date().toISOString(),policyVersion:n}),o()})});window.openConsentPreferences=()=>i();</script> </body></html> |