/******************************************* * admin.js *******************************************/ // Admin-related DOM references const adminUsersTableBody = document.getElementById("adminUsersTableBody"); const adminTradesTableBody = document.getElementById("adminTradesTableBody"); const adminNavLink = document.getElementById("adminNavLink"); const adminTradesNavLink = document.getElementById("adminTradesNavLink"); // For user details overlay const adminUserDetails = document.getElementById("adminUserDetails"); const adminUserDetailsContent = document.getElementById("adminUserDetailsContent"); const closeUserDetailsBtn = document.getElementById("closeUserDetailsBtn"); // Leaderboard toggle references const toggleLeaderboardBtn = document.getElementById("toggleLeaderboardBtn"); const navLeaderboard = document.getElementById("navLeaderboard"); const leaderboardSection = document.getElementById("leaderboardSection"); const leaderboardTableBody = document.getElementById("leaderboardTableBody"); // 1) Admin initialization (creates admin account "Opulentissimus" if not existing) window.initializeAdmin = async function() { if (!localStorage.getItem("pt_users")) { localStorage.setItem("pt_users", JSON.stringify({})); } if (!localStorage.getItem("pt_trades")) { localStorage.setItem("pt_trades", JSON.stringify([])); } const users = JSON.parse(localStorage.getItem("pt_users")) || {}; // Create admin user if not present if (!users["Opulentissimus"]) { try { await auth.createUserWithEmailAndPassword( "papertradecommunications@gmail.com", "Sh()peman2@25" ); const currentUser = auth.currentUser; if (currentUser) { await currentUser.updateProfile({ displayName: "Opulentissimus" }); } // Initialize user data initializeUserData("Opulentissimus"); users["Opulentissimus"] = { email: "papertradecommunications@gmail.com", firstName: "Admin", lastName: "User", zip: "00000", dob: "1970-01-01", tradingPlan: "Yes" }; localStorage.setItem("pt_users", JSON.stringify(users)); console.log("Admin account 'Opulentissimus' created successfully."); } catch (error) { if (error.code === "auth/email-already-in-use") { console.log("Admin account already exists."); // If the user is indeed logged in as that admin: if (auth.currentUser && auth.currentUser.displayName === "Opulentissimus") { if (!users["Opulentissimus"]) { users["Opulentissimus"] = { email: "papertradecommunications@gmail.com", firstName: "Admin", lastName: "User", zip: "00000", dob: "1970-01-01", tradingPlan: "Yes" }; localStorage.setItem("pt_users", JSON.stringify(users)); } } } else { console.error("Error creating admin account:", error); } } } }; // 2) Leaderboard initialization window.initializeLeaderboard = function() { if (localStorage.getItem("pt_leaderboard_on") === null) { localStorage.setItem("pt_leaderboard_on", "false"); } const leaderboardStatus = (localStorage.getItem("pt_leaderboard_on") === "true"); updateLeaderboardVisibility(leaderboardStatus); if (leaderboardStatus) { loadLeaderboard(); } // Listen to localStorage changes for leaderboard toggle window.addEventListener("storage", (event) => { if (event.key === "pt_leaderboard_on") { const status = (event.newValue === "true"); updateLeaderboardVisibility(status); if (status) { loadLeaderboard(); } else { clearLeaderboard(); } } }); }; // Show/hide the Leaderboard nav link window.updateLeaderboardVisibility = function(status) { if (status) { navLeaderboard.style.display = "block"; } else { navLeaderboard.style.display = "none"; if (leaderboardSection.style.display === "block") { showSection("home"); } } }; // Load the entire leaderboard table window.loadLeaderboard = async function() { leaderboardTableBody.innerHTML = ""; const users = JSON.parse(localStorage.getItem("pt_users") || "{}") || {}; let leaderboardData = []; for (let username in users) { const balanceKey = `pt_balance_${username}`; const portfolioKey = `pt_portfolio_${username}`; const cashBalance = parseFloat(localStorage.getItem(balanceKey) || "100000"); const portfolioVal = await loadPositionsForCalc(username); const totalBalance = cashBalance + portfolioVal; leaderboardData.push({ username: username, totalBalance: totalBalance }); } // Sort descending leaderboardData.sort((a, b) => b.totalBalance - a.totalBalance); // Populate table leaderboardData.forEach(user => { const row = document.createElement("tr"); row.innerHTML = `
No holdings.
"; } else { portfolioHtml += `Symbol | Shares Owned |
---|---|
${sym} | ${portfolio[sym]} |
No trades yet.
"; } else { tradesHtml += `Symbol | Action | Quantity | Price | Total | Timestamp |
---|---|---|---|---|---|
${tr.symbol} | ${tr.action} | ${tr.quantity} | $${tr.price} | $${tr.total} | ${new Date(tr.timestamp).toLocaleString()} |
Username: ${username}
Email: ${userObj.email}
First Name: ${userObj.firstName}
Last Name: ${userObj.lastName}
Zip Code: ${userObj.zip}
Date of Birth: ${userObj.dob}
Trading Plan Response: ${userObj.tradingPlan || "N/A"}
Free Cash: $${currentBalance.toFixed(2)}
Total Net Worth (Cash + Positions): $${netWorth.toFixed(2)}