File manager - Edit - /home/webapp69.cm.in.th/u69319090006/shop/app.js
Back
// ========================================================================== // 3. SPA ROUTING ENGINE // ========================================================================== function initNavigation() { document.querySelectorAll("#clientHeader [data-page]").forEach(link => { link.addEventListener("click", (e) => { e.preventDefault(); const targetPage = link.getAttribute("data-page"); navigateTo(targetPage); }); }); document.querySelectorAll(".bottom-nav-item").forEach(link => { link.addEventListener("click", (e) => { e.preventDefault(); const targetPage = link.getAttribute("data-page"); navigateTo(targetPage); // อัปเดตสถานะ Active ของเมนูด้านล่าง document.querySelectorAll(".bottom-nav-item").forEach(item => item.classList.remove("active")); link.classList.add("active"); }); }); document.querySelectorAll("#adminHeader [data-admin-page]").forEach(link => { link.addEventListener("click", (e) => { e.preventDefault(); const targetPage = link.getAttribute("data-admin-page"); navigateAdminTo(targetPage); }); }); document.querySelectorAll("#sellerHeader [data-seller-page]").forEach(link => { link.addEventListener("click", (e) => { e.preventDefault(); const targetPage = link.getAttribute("data-seller-page"); navigateSellerTo(targetPage); }); }); const logoLink = document.getElementById("logoLink"); if (logoLink) { logoLink.addEventListener("click", (e) => { e.preventDefault(); navigateTo("home"); }); } const accepted = localStorage.getItem("sk_pdpa_agreed"); if (!accepted) { const pdpa = document.getElementById("pdpaBanner"); if (pdpa) pdpa.style.display = "block"; } const acceptPdpaBtn = document.getElementById("acceptPdpaBtn"); if (acceptPdpaBtn) { acceptPdpaBtn.addEventListener("click", () => { localStorage.setItem("sk_pdpa_agreed", "true"); const pdpa = document.getElementById("pdpaBanner"); if (pdpa) pdpa.style.display = "none"; }); } } function setRole(role) { const label = document.getElementById("currentRoleLabel"); const clientHeader = document.getElementById("clientHeader"); const adminHeader = document.getElementById("adminHeader"); const sellerHeader = document.getElementById("sellerHeader"); state.currentRole = role; document.body.setAttribute("data-role", role); const bottomNav = document.querySelector(".mobile-bottom-nav"); if (bottomNav) { if (role === "client") { bottomNav.style.display = ""; // ให้แสดงผลตาม CSS } else { bottomNav.style.display = "none"; // ซ่อนเด็ดขาดใน Admin / Seller } } if (role === "admin") { if (label) label.innerHTML = `<span class="text-success"><i class="fa-solid fa-lock"></i> แอดมิน (Admin)</span>`; if (clientHeader) clientHeader.style.display = "none"; if (sellerHeader) sellerHeader.style.display = "none"; if (adminHeader) adminHeader.style.display = "block"; navigateAdminTo("dashboard"); } else if (role === "seller") { const sellerName = state.currentUser ? state.currentUser.name : "ผู้ขาย"; if (label) label.innerHTML = `<span class="text-info" style="color: #0d9488;"><i class="fa-solid fa-store"></i> ผู้ขาย (${sellerName})</span>`; if (clientHeader) clientHeader.style.display = "none"; if (adminHeader) adminHeader.style.display = "none"; if (sellerHeader) sellerHeader.style.display = "block"; navigateSellerTo("dashboard"); } else { if (label) label.innerHTML = `<span>ลูกค้า (Client)</span>`; if (adminHeader) adminHeader.style.display = "none"; if (sellerHeader) sellerHeader.style.display = "none"; if (clientHeader) clientHeader.style.display = "block"; navigateTo("home"); } } function navigateTo(pageId) { const clientHeader = document.getElementById("clientHeader"); const adminHeader = document.getElementById("adminHeader"); const sellerHeader = document.getElementById("sellerHeader"); if (pageId === "auth") { if (clientHeader) clientHeader.style.display = "none"; } else { if (state.currentRole === "admin") { if (clientHeader) clientHeader.style.display = "none"; if (sellerHeader) sellerHeader.style.display = "none"; if (adminHeader) adminHeader.style.display = "block"; } else if (state.currentRole === "seller") { if (clientHeader) clientHeader.style.display = "none"; if (adminHeader) adminHeader.style.display = "none"; if (sellerHeader) sellerHeader.style.display = "block"; } else { if (adminHeader) adminHeader.style.display = "none"; if (sellerHeader) sellerHeader.style.display = "none"; if (clientHeader) clientHeader.style.display = "block"; } } if (pageId === "checkout") { if (state.cart.length === 0) { showToast("กรุณาเลือกสินค้าลงตะกร้าก่อนค่ะ", "danger"); navigateTo("home"); return; } } if (pageId === "history" || pageId === "checkout" || pageId === "wishlist" || pageId === "profile") { if (!state.currentUser) { showToast("กรุณาเข้าสู่ระบบเพื่อดำเนินการต่อ", "danger"); state.postLoginRedirect = pageId; document.querySelectorAll(".page-section").forEach(sec => { sec.style.display = "none"; }); const authSection = document.getElementById("page-auth"); if (authSection) authSection.style.display = "block"; document.querySelectorAll("#clientHeader .nav-link").forEach(link => { link.classList.remove("active"); }); if (clientHeader) clientHeader.style.display = "none"; return; } } document.querySelectorAll(".page-section").forEach(sec => { sec.style.display = "none"; }); document.querySelectorAll("#clientHeader .nav-link").forEach(link => { if (link.getAttribute("data-page") === pageId) { link.classList.add("active"); } else { link.classList.remove("active"); } }); document.querySelectorAll(".bottom-nav-item").forEach(item => { if (item.getAttribute("data-page") === pageId) { item.classList.add("active"); } else { item.classList.remove("active"); } }); const targetSection = document.getElementById(`page-${pageId}`); if (targetSection) { targetSection.style.display = "block"; } if (pageId === "home") { if (typeof renderHeroSlider === "function") { renderHeroSlider(); } if (typeof renderCatalog === "function") { renderCatalog(); } if (typeof renderCouponShowcase === "function") { renderCouponShowcase(); } if (typeof updateHeroWidgets === "function") { updateHeroWidgets(); } } else if (pageId === "cart") { renderCart(); } else if (pageId === "checkout") { renderCheckout(); } else if (pageId === "history") { renderOrderHistory(); } else if (pageId === "wishlist") { renderWishlist(); } else if (pageId === "profile") { renderClientProfile(); } else if (pageId === "success") { renderOrderSuccess(); } } function routeTo(pageId) { navigateTo(pageId); } function navigateAdminTo(adminPageId) { if (state.currentRole !== "admin") { showToast("คุณไม่มีสิทธิ์เข้าถึงหน้าผู้ดูแลระบบ", "danger"); setRole("client"); return; } document.querySelectorAll(".page-section").forEach(sec => { sec.style.display = "none"; }); document.querySelectorAll("#adminHeader .nav-link").forEach(link => { if (link.getAttribute("data-admin-page") === adminPageId) { link.classList.add("active"); } else { link.classList.remove("active"); } }); const targetSection = document.getElementById(`admin-page-${adminPageId}`); if (targetSection) { targetSection.style.display = "block"; } if (adminPageId === "dashboard") { renderAdminDashboard(); } else if (adminPageId === "stock") { renderAdminStock(); } else if (adminPageId === "orders") { renderAdminOrders(); } else if (adminPageId === "coupons") { renderAdminCoupons(); } else if (adminPageId === "sellers") { if (typeof renderAdminPendingSellerApps === "function") renderAdminPendingSellerApps(); renderAdminClients(); renderAdminSellers(); renderAdminBannedUsers(); } else if (adminPageId === "reviews") { if (typeof renderAdminReviews === "function") renderAdminReviews(); } else if (adminPageId === "financials") { if (typeof renderAdminFinancials === "function") renderAdminFinancials(); } else if (adminPageId === "banners") { if (typeof renderAdminBanners === "function") renderAdminBanners(); if (typeof renderAdminAnnouncements === "function") renderAdminAnnouncements(); } else if (adminPageId === "sales-report") { if (typeof renderAdminSalesReport === "function") renderAdminSalesReport(); } else if (adminPageId === "orders-report") { if (typeof renderAdminOrdersReport === "function") renderAdminOrdersReport(); } } function navigateSellerTo(sellerPageId) { if (state.currentRole !== "seller") { alert("คุณไม่มีสิทธิ์เข้าถึงหน้าผู้ขาย"); setRole("client"); return; } document.querySelectorAll(".page-section").forEach(sec => { sec.style.display = "none"; }); document.querySelectorAll("#sellerHeader .nav-link").forEach(link => { if (link.getAttribute("data-seller-page") === sellerPageId) { link.classList.add("active"); } else { link.classList.remove("active"); } }); const targetSection = document.getElementById(`seller-page-${sellerPageId}`); if (targetSection) { targetSection.style.display = "block"; } if (sellerPageId === "dashboard") { renderSellerDashboard(); } else if (sellerPageId === "stock") { renderSellerStock(); } else if (sellerPageId === "orders") { renderSellerOrders(); } else if (sellerPageId === "profile") { renderSellerProfile(); } } // ========================================================================== // ========================================================================== // 13. APPLICATION BOOTSTRAP INITIALIZER // ========================================================================== function bootApp() { const savedUser = db.getCurrentUser(); if (savedUser) { state.currentUser = savedUser; setRole(savedUser.role); } else { state.currentUser = null; setRole("client"); } // CLEANUP LOCALSTORAGE QUOTA BLOAT try { const existingOrders = db.getOrders(); let cleaned = false; existingOrders.forEach(o => { // Delete slip images if the order is already Success or Failed, or if the string is huge if ((o.status === "Success" || o.status === "Failed") && o.paymentSlip) { o.paymentSlip = ""; cleaned = true; } if (o.slipImage && o.slipImage.length > 50000) { o.slipImage = ""; cleaned = true; } }); if (cleaned) { localStorage.setItem("sk_orders", JSON.stringify(existingOrders)); state.orders = existingOrders; } // Wipe bloated uncompressed product images that were uploaded before the compression fix const existingProducts = db.getProducts(); let cleanedProds = false; existingProducts.forEach(p => { if (p.image && p.image.length > 500000) { // If image is larger than ~500kb base64, delete it p.image = ""; cleanedProds = true; } }); if (cleanedProds) { localStorage.setItem("sk_products", JSON.stringify(existingProducts)); state.products = existingProducts; } } catch (e) { } initTheme(); updateAuthHeader(); if (typeof updateWishlistBadge === "function") { updateWishlistBadge(); } if (typeof initPasswordToggle === "function") { initPasswordToggle(); } // Setup Simulated Role Switcher (bottom control widget) const toggleRBtn = document.getElementById("toggleRBtn"); if (toggleRBtn) { toggleRBtn.addEventListener("click", (e) => { e.preventDefault(); e.stopPropagation(); if (state.currentRole === "client") { setRole("seller"); } else if (state.currentRole === "seller") { setRole("admin"); } else { setRole("client"); } updateAuthHeader(); }); } const safeInit = (name, fn) => { try { fn(); } catch (e) { console.error(`Error initializing ${name}:`, e); } }; // Initialize these visually important components first safeInit("renderCouponShowcase", renderCouponShowcase); if (typeof renderHeroSlider === "function") { safeInit("renderHeroSlider", renderHeroSlider); } else { safeInit("initHeroSlider", initHeroSlider); } safeInit("initNavigation", initNavigation); safeInit("initAuth", initAuth); safeInit("initFilters", initFilters); safeInit("renderCatalog", renderCatalog); safeInit("initCouponHandler", initCouponHandler); safeInit("initCheckoutFlow", initCheckoutFlow); safeInit("initOrderHistoryTabs", initOrderHistoryTabs); safeInit("initCancelModals", initCancelModals); // Setup Order Tracking Modal Close Handlers const closeTrackingBtn = document.getElementById("closeOrderTrackingModalBtn"); if (closeTrackingBtn) { closeTrackingBtn.addEventListener("click", () => { const modal = document.getElementById("orderTrackingModal"); if (modal) modal.style.display = "none"; }); } const orderTrackingModal = document.getElementById("orderTrackingModal"); if (orderTrackingModal) { orderTrackingModal.addEventListener("click", (e) => { if (e.target === orderTrackingModal) { orderTrackingModal.style.display = "none"; } }); } // Admin & Profile setups safeInit("initAddProductFlow", initAddProductFlow); safeInit("initEditProductFlow", initEditProductFlow); safeInit("initCouponsFlow", initCouponsFlow); safeInit("initAddSellerFlow", initAddSellerFlow); safeInit("initClientProfileFlow", initClientProfileFlow); safeInit("initSellerProfileFlow", initSellerProfileFlow); safeInit("initSwitchAccountModalHandlers", initSwitchAccountModalHandlers); safeInit("initQuickSwitchAccountModalHandlers", initQuickSwitchAccountModalHandlers); safeInit("initFooterModals", initFooterModals); safeInit("initPasswordPromptFlow", initPasswordPromptFlow); // Enterprise Admin Setups safeInit("initFinancialsFlow", initFinancialsFlow); safeInit("initBannersFlow", initBannersFlow); safeInit("initAnnouncementFlow", initAnnouncementFlow); safeInit("initCsvExportFlow", initCsvExportFlow); if (typeof renderGlobalAnnouncementBar === "function") renderGlobalAnnouncementBar(); // Setup Review Modal Handlers const closeReviewBtn = document.getElementById("closeProductReviewModalBtn"); if (closeReviewBtn) { closeReviewBtn.addEventListener("click", () => { const modal = document.getElementById("productReviewModal"); if (modal) modal.style.display = "none"; }); } const cancelReviewBtn = document.getElementById("cancelReviewBtn"); if (cancelReviewBtn) { cancelReviewBtn.addEventListener("click", () => { const modal = document.getElementById("productReviewModal"); if (modal) modal.style.display = "none"; }); } const productReviewModal = document.getElementById("productReviewModal"); if (productReviewModal) { productReviewModal.addEventListener("click", (e) => { if (e.target === productReviewModal) { productReviewModal.style.display = "none"; } }); } const reviewForm = document.getElementById("productReviewForm"); if (reviewForm) { reviewForm.addEventListener("submit", (e) => { e.preventDefault(); if (!state.currentUser) { showToast("กรุณาเข้าสู่ระบบก่อนดำเนินการค่ะ", "danger"); document.querySelectorAll(".modal-overlay").forEach(m => m.style.display = "none"); state.postLoginRedirect = "home"; navigateTo("auth"); return; } const productId = document.getElementById("reviewProductId").value; const comment = document.getElementById("reviewComment").value.trim(); const ratingVal = document.querySelector("input[name='reviewRating']:checked"); if (!ratingVal || !comment) { showToast("กรุณากรอกคะแนนและข้อความรีวิวให้ครบถ้วน", "danger"); return; } const rating = parseInt(ratingVal.value); const user = db.getCurrentUser(); const username = user ? `@${user.username}` : "@guest"; const date = new Date().toISOString().split('T')[0]; if (!MOCK_REVIEWS[productId]) { MOCK_REVIEWS[productId] = []; } MOCK_REVIEWS[productId].unshift({ username: username, rating: rating, date: date, text: comment }); const modal = document.getElementById("productReviewModal"); if (modal) modal.style.display = "none"; showToast("ส่งรีวิวเรียบร้อยแล้ว ขอบคุณสำหรับคะแนนความพึงพอใจค่ะ!", "success"); // Refresh product details if it is currently open const detailModal = document.getElementById("productDetailModal"); if (detailModal && detailModal.style.display === "flex") { openProductDetail(productId); } reviewForm.reset(); }); } // Hero Slider is initialized earlier in bootApp updateAuthHeader(); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", bootApp); } else { bootApp(); }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.29 |
proxy
|
phpinfo
|
Settings