/******************************************* * 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 = ` ${user.username} $${user.totalBalance.toFixed(2)} `; leaderboardTableBody.appendChild(row); }); }; // Clear the leaderboard table (if turned off) window.clearLeaderboard = function() { leaderboardTableBody.innerHTML = ""; }; // Toggling the leaderboard on/off toggleLeaderboardBtn.addEventListener("click", () => { const currentStatus = (localStorage.getItem("pt_leaderboard_on") === "true"); const newStatus = !currentStatus; localStorage.setItem("pt_leaderboard_on", newStatus.toString()); updateLeaderboardToggleButton(newStatus); updateLeaderboardVisibility(newStatus); if (newStatus) { loadLeaderboard(); } else { clearLeaderboard(); } }); window.updateLeaderboardToggleButton = function(status) { if (status) { toggleLeaderboardBtn.textContent = "Turn Off Leaderboard"; toggleLeaderboardBtn.style.backgroundColor = "#e74c3c"; toggleLeaderboardBtn.style.borderColor = "#e74c3c"; } else { toggleLeaderboardBtn.textContent = "Turn On Leaderboard"; toggleLeaderboardBtn.style.backgroundColor = "#007BFF"; toggleLeaderboardBtn.style.borderColor = "#007BFF"; } }; // We can call this on load to sync the button state: window.initializeAdminLeaderboardToggle = function() { const leaderboardStatus = (localStorage.getItem("pt_leaderboard_on") === "true"); updateLeaderboardToggleButton(leaderboardStatus); }; // 3) Admin Dashboard loading window.loadAdminDashboard = function() { loadAllUsers(); const leaderboardStatus = (localStorage.getItem("pt_leaderboard_on") === "true"); updateLeaderboardToggleButton(leaderboardStatus); }; // Loads all users into the Admin "Users" table window.loadAllUsers = function() { const users = JSON.parse(localStorage.getItem("pt_users") || "{}") || {}; adminUsersTableBody.innerHTML = ""; for (let username in users) { const userObj = users[username]; const row = document.createElement("tr"); row.innerHTML = ` ${username} ${userObj.email} ${userObj.firstName} ${userObj.lastName} ${userObj.zip} ${userObj.dob} ${userObj.tradingPlan || "N/A"} `; adminUsersTableBody.appendChild(row); } }; // Load all trades into "Admin Trades" window.loadAdminTrades = function() { const trades = JSON.parse(localStorage.getItem("pt_trades") || "[]"); adminTradesTableBody.innerHTML = ""; trades.forEach(t => { const row = document.createElement("tr"); row.innerHTML = ` ${t.user} ${t.symbol} ${t.action} ${t.quantity} $${t.price} $${t.total} ${new Date(t.timestamp).toLocaleString()} `; adminTradesTableBody.appendChild(row); }); }; // Handle table clicks for "View Details" or "Reset Balance" adminUsersTableBody.addEventListener("click", function(e) { if (e.target.classList.contains("view-details-btn")) { const user = e.target.getAttribute("data-username"); viewUserDetails(user); } if (e.target.classList.contains("reset-balance-btn")) { const user = e.target.getAttribute("data-username"); resetUserBalance(user); } }); // Show user details overlay window.viewUserDetails = async function(username) { const users = JSON.parse(localStorage.getItem("pt_users") || "{}") || {}; const userObj = users[username]; if (!userObj) { alert("User not found in localStorage."); return; } const allTrades = JSON.parse(localStorage.getItem("pt_trades") || "[]"); const userTrades = allTrades.filter(t => t.user === username); const balanceKey = `pt_balance_${username}`; const portfolioKey = `pt_portfolio_${username}`; let currentBalance = parseFloat(localStorage.getItem(balanceKey) || "100000"); const portfolio = JSON.parse(localStorage.getItem(portfolioKey) || "{}"); let portfolioValue = await loadPositionsForCalc(username); let netWorth = currentBalance + portfolioValue; // Build portfolio HTML let portfolioHtml = "

Portfolio Overview:

"; if (Object.keys(portfolio).length === 0) { portfolioHtml += "

No holdings.

"; } else { portfolioHtml += ` `; for (let sym in portfolio) { portfolioHtml += ` `; } portfolioHtml += `
Symbol Shares Owned
${sym} ${portfolio[sym]}
`; } // Build trades HTML let tradesHtml = "

All Trades:

"; if (userTrades.length === 0) { tradesHtml += "

No trades yet.

"; } else { tradesHtml += ` `; userTrades.forEach(tr => { tradesHtml += ` `; }); tradesHtml += `
Symbol Action Quantity Price Total Timestamp
${tr.symbol} ${tr.action} ${tr.quantity} $${tr.price} $${tr.total} ${new Date(tr.timestamp).toLocaleString()}
`; } // Combine full details let detailsHtml = `

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)}


${portfolioHtml} ${tradesHtml} `; adminUserDetailsContent.innerHTML = detailsHtml; adminUserDetails.style.display = "block"; }; // Close user details overlay closeUserDetailsBtn.addEventListener("click", () => { adminUserDetails.style.display = "none"; adminUserDetailsContent.innerHTML = ""; }); // Reset user balance window.resetUserBalance = function(username) { if (!confirm(`Are you sure you want to reset the balance and holdings for user '${username}'? This action cannot be undone.`)) { return; } localStorage.setItem(`pt_balance_${username}`, "100000"); localStorage.setItem(`pt_portfolio_${username}`, JSON.stringify({})); localStorage.setItem(`pt_account_reset_${username}`, "true"); alert(`User '${username}' balance and holdings have been reset.`); loadAllUsers(); }; // 4) Admin Trades page window.loadAdminTradesSection = function() { // This can be called from navigation or main on click loadAllTrades(); };
0
Skip to Content
Working Website
PaperTrade
Login Account
Working Website
PaperTrade
Login Account
Working Website
Login Account