NoLev commited on
Commit
5a058dc
·
verified ·
1 Parent(s): 7e2cb08

Upload 4 files

Browse files
public/admin/admin-dashboard.html ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript">
2
+ var gk_isXlsx = false;
3
+ var gk_xlsxFileLookup = {};
4
+ var gk_fileData = {};
5
+ function filledCell(cell) {
6
+ return cell !== '' && cell != null;
7
+ }
8
+ function loadFileData(filename) {
9
+ if (gk_isXlsx && gk_xlsxFileLookup[filename]) {
10
+ try {
11
+ var workbook = XLSX.read(gk_fileData[filename], { type: 'base64' });
12
+ var firstSheetName = workbook.SheetNames[0];
13
+ var worksheet = workbook.Sheets[firstSheetName];
14
+
15
+ // Convert sheet to JSON to filter blank rows
16
+ var jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, blankrows: false, defval: '' });
17
+ // Filter out blank rows (rows where all cells are empty, null, or undefined)
18
+ var filteredData = jsonData.filter(row => row.some(filledCell));
19
+
20
+ // Heuristic to find the header row by ignoring rows with fewer filled cells than the next row
21
+ var headerRowIndex = filteredData.findIndex((row, index) =>
22
+ row.filter(filledCell).length >= filteredData[index + 1]?.filter(filledCell).length
23
+ );
24
+ // Fallback
25
+ if (headerRowIndex === -1 || headerRowIndex > 25) {
26
+ headerRowIndex = 0;
27
+ }
28
+
29
+ // Convert filtered JSON back to CSV
30
+ var csv = XLSX.utils.aoa_to_sheet(filteredData.slice(headerRowIndex)); // Create a new sheet from filtered array of arrays
31
+ csv = XLSX.utils.sheet_to_csv(csv, { header: 1 });
32
+ return csv;
33
+ } catch (e) {
34
+ console.error(e);
35
+ return "";
36
+ }
37
+ }
38
+ return gk_fileData[filename] || "";
39
+ }
40
+ </script><!DOCTYPE html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="UTF-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
45
+ <title>Admin Dashboard</title>
46
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
47
+ </head>
48
+ <body>
49
+ <div class="container">
50
+ <h2 class="my-4">Admin Dashboard</h2>
51
+ <p>Total Users: <%= totalUsers %></p>
52
+ <div class="grid-container">
53
+ <div class="grid-item"><a href="/admin/manage-users">Manage Users</a></div>
54
+ <div class="grid-item"><a href="/admin/manage-plans">Manage Plans</a></div>
55
+ <div class="grid-item"><a href="/admin/manage-payments">Manage Payments</a></div>
56
+ <div class="grid-item"><a href="/logout">Logout</a></div>
57
+ </div>
58
+ </div>
59
+ </body>
60
+ </html>
public/admin/manage-payments.html ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript">
2
+ var gk_isXlsx = false;
3
+ var gk_xlsxFileLookup = {};
4
+ var gk_fileData = {};
5
+ function filledCell(cell) {
6
+ return cell !== '' && cell != null;
7
+ }
8
+ function loadFileData(filename) {
9
+ if (gk_isXlsx && gk_xlsxFileLookup[filename]) {
10
+ try {
11
+ var workbook = XLSX.read(gk_fileData[filename], { type: 'base64' });
12
+ var firstSheetName = workbook.SheetNames[0];
13
+ var worksheet = workbook.Sheets[firstSheetName];
14
+
15
+ // Convert sheet to JSON to filter blank rows
16
+ var jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, blankrows: false, defval: '' });
17
+ // Filter out blank rows (rows where all cells are empty, null, or undefined)
18
+ var filteredData = jsonData.filter(row => row.some(filledCell));
19
+
20
+ // Heuristic to find the header row by ignoring rows with fewer filled cells than the next row
21
+ var headerRowIndex = filteredData.findIndex((row, index) =>
22
+ row.filter(filledCell).length >= filteredData[index + 1]?.filter(filledCell).length
23
+ );
24
+ // Fallback
25
+ if (headerRowIndex === -1 || headerRowIndex > 25) {
26
+ headerRowIndex = 0;
27
+ }
28
+
29
+ // Convert filtered JSON back to CSV
30
+ var csv = XLSX.utils.aoa_to_sheet(filteredData.slice(headerRowIndex)); // Create a new sheet from filtered array of arrays
31
+ csv = XLSX.utils.sheet_to_csv(csv, { header: 1 });
32
+ return csv;
33
+ } catch (e) {
34
+ console.error(e);
35
+ return "";
36
+ }
37
+ }
38
+ return gk_fileData[filename] || "";
39
+ }
40
+ </script><!DOCTYPE html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="UTF-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
45
+ <title>Manage Payment Methods</title>
46
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
47
+ </head>
48
+ <body>
49
+ <div class="container">
50
+ <h2 class="my-4">Manage Payment Methods</h2>
51
+ <form action="/admin/manage-payments" method="POST">
52
+ <div class="mb-3">
53
+ <label for="crypto_name" class="form-label">Cryptocurrency Name</label>
54
+ <input type="text" class="form-control" id="crypto_name" name="crypto_name" required>
55
+ </div>
56
+ <div class="mb-3">
57
+ <label for="wallet_address" class="form-label">Wallet Address</label>
58
+ <input type="text" class="form-control" id="wallet_address" name="wallet_address" required>
59
+ </div>
60
+ <button type="submit" class="btn btn-primary">Add Method</button>
61
+ </form>
62
+ <table class="table mt-4">
63
+ <thead>
64
+ <tr>
65
+ <th>Cryptocurrency</th>
66
+ <th>Wallet Address</th>
67
+ </tr>
68
+ </thead>
69
+ <tbody>
70
+ <% methods.forEach(method => { %>
71
+ <tr>
72
+ <td><%= method.crypto_name %></td>
73
+ <td><%= method.wallet_address %></td>
74
+ </tr>
75
+ <% }); %>
76
+ </tbody>
77
+ </table>
78
+ <a href="/admin/dashboard" class="btn btn-primary">Back to Dashboard</a>
79
+ </div>
80
+ </body>
81
+ </html>
public/admin/manage-plans.html ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript">
2
+ var gk_isXlsx = false;
3
+ var gk_xlsxFileLookup = {};
4
+ var gk_fileData = {};
5
+ function filledCell(cell) {
6
+ return cell !== '' && cell != null;
7
+ }
8
+ function loadFileData(filename) {
9
+ if (gk_isXlsx && gk_xlsxFileLookup[filename]) {
10
+ try {
11
+ var workbook = XLSX.read(gk_fileData[filename], { type: 'base64' });
12
+ var firstSheetName = workbook.SheetNames[0];
13
+ var worksheet = workbook.Sheets[firstSheetName];
14
+
15
+ // Convert sheet to JSON to filter blank rows
16
+ var jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, blankrows: false, defval: '' });
17
+ // Filter out blank rows (rows where all cells are empty, null, or undefined)
18
+ var filteredData = jsonData.filter(row => row.some(filledCell));
19
+
20
+ // Heuristic to find the header row by ignoring rows with fewer filled cells than the next row
21
+ var headerRowIndex = filteredData.findIndex((row, index) =>
22
+ row.filter(filledCell).length >= filteredData[index + 1]?.filter(filledCell).length
23
+ );
24
+ // Fallback
25
+ if (headerRowIndex === -1 || headerRowIndex > 25) {
26
+ headerRowIndex = 0;
27
+ }
28
+
29
+ // Convert filtered JSON back to CSV
30
+ var csv = XLSX.utils.aoa_to_sheet(filteredData.slice(headerRowIndex)); // Create a new sheet from filtered array of arrays
31
+ csv = XLSX.utils.sheet_to_csv(csv, { header: 1 });
32
+ return csv;
33
+ } catch (e) {
34
+ console.error(e);
35
+ return "";
36
+ }
37
+ }
38
+ return gk_fileData[filename] || "";
39
+ }
40
+ </script><!DOCTYPE html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="UTF-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
45
+ <title>Manage Plans</title>
46
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
47
+ </head>
48
+ <body>
49
+ <div class="container">
50
+ <h2 class="my-4">Manage Investment Plans</h2>
51
+ <form action="/admin/manage-plans" method="POST">
52
+ <div class="mb-3">
53
+ <label for="name" class="form-label">Plan Name</label>
54
+ <input type="text" class="form-control" id="name" name="name" required>
55
+ </div>
56
+ <div class="mb-3">
57
+ <label for="roi" class="form-label">ROI (%)</label>
58
+ <input type="number" class="form-control" id="roi" name="roi" required>
59
+ </div>
60
+ <div class="mb-3">
61
+ <label for="tenure" class="form-label">Tenure (days)</label>
62
+ <input type="number" class="form-control" id="tenure" name="tenure" required>
63
+ </div>
64
+ <button type="submit" class="btn btn-primary">Create Plan</button>
65
+ </form>
66
+ <table class="table mt-4">
67
+ <thead>
68
+ <tr>
69
+ <th>Name</th>
70
+ <th>ROI (%)</th>
71
+ <th>Tenure (days)</th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <% plans.forEach(plan => { %>
76
+ <tr>
77
+ <td><%= plan.name %></td>
78
+ <td><%= plan.roi %></td>
79
+ <td><%= plan.tenure %></td>
80
+ </tr>
81
+ <% }); %>
82
+ </tbody>
83
+ </table>
84
+ <a href="/admin/dashboard" class="btn btn-primary">Back to Dashboard</a>
85
+ </div>
86
+ </body>
87
+ </html>
public/admin/manage-users.html ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <script type="text/javascript">
2
+ var gk_isXlsx = false;
3
+ var gk_xlsxFileLookup = {};
4
+ var gk_fileData = {};
5
+ function filledCell(cell) {
6
+ return cell !== '' && cell != null;
7
+ }
8
+ function loadFileData(filename) {
9
+ if (gk_isXlsx && gk_xlsxFileLookup[filename]) {
10
+ try {
11
+ var workbook = XLSX.read(gk_fileData[filename], { type: 'base64' });
12
+ var firstSheetName = workbook.SheetNames[0];
13
+ var worksheet = workbook.Sheets[firstSheetName];
14
+
15
+ // Convert sheet to JSON to filter blank rows
16
+ var jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1, blankrows: false, defval: '' });
17
+ // Filter out blank rows (rows where all cells are empty, null, or undefined)
18
+ var filteredData = jsonData.filter(row => row.some(filledCell));
19
+
20
+ // Heuristic to find the header row by ignoring rows with fewer filled cells than the next row
21
+ var headerRowIndex = filteredData.findIndex((row, index) =>
22
+ row.filter(filledCell).length >= filteredData[index + 1]?.filter(filledCell).length
23
+ );
24
+ // Fallback
25
+ if (headerRowIndex === -1 || headerRowIndex > 25) {
26
+ headerRowIndex = 0;
27
+ }
28
+
29
+ // Convert filtered JSON back to CSV
30
+ var csv = XLSX.utils.aoa_to_sheet(filteredData.slice(headerRowIndex)); // Create a new sheet from filtered array of arrays
31
+ csv = XLSX.utils.sheet_to_csv(csv, { header: 1 });
32
+ return csv;
33
+ } catch (e) {
34
+ console.error(e);
35
+ return "";
36
+ }
37
+ }
38
+ return gk_fileData[filename] || "";
39
+ }
40
+ </script><!DOCTYPE html>
41
+ <html lang="en">
42
+ <head>
43
+ <meta charset="UTF-8">
44
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
45
+ <title>Manage Users</title>
46
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
47
+ </head>
48
+ <body>
49
+ <div class="container">
50
+ <h2 class="my-4">Manage Users</h2>
51
+ <table class="table">
52
+ <thead>
53
+ <tr>
54
+ <th>Username</th>
55
+ <th>Email</th>
56
+ <th>Balance</th>
57
+ <th>KYC Status</th>
58
+ <th>Actions</th>
59
+ </tr>
60
+ </thead>
61
+ <tbody>
62
+ <% users.forEach(user => { %>
63
+ <tr>
64
+ <td><%= user.username %></td>
65
+ <td><%= user.email %></td>
66
+ <td>$<%= user.balance %></td>
67
+ <td><%= user.kyc_status %></td>
68
+ <td>
69
+ <form action="/admin/manage-users/<%= user.id %>" method="POST">
70
+ <select name="action">
71
+ <option value="add_balance">Add Balance</option>
72
+ <option value="subtract_balance">Subtract Balance</option>
73
+ <option value="approve_kyc">Approve KYC</option>
74
+ <option value="approve_withdrawal">Approve Withdrawal</option>
75
+ <option value="suspend_withdrawal">Suspend Withdrawal</option>
76
+ <option value="ban">Ban User</option>
77
+ <option value="send_message">Send Message</option>
78
+ </select>
79
+ <input type="number" name="balance" placeholder="Amount" style="display:none;" id="balance_<%= user.id %>">
80
+ <input type="text" name="message" placeholder="Message" style="display:none;" id="message_<%= user.id %>">
81
+ <button type="submit" class="btn btn-primary btn-sm">Execute</button>
82
+ </form>
83
+ </td>
84
+ </tr>
85
+ <% }); %>
86
+ </tbody>
87
+ </table>
88
+ <a href="/admin/dashboard" class="btn btn-primary">Back to Dashboard</a>
89
+ </div>
90
+ <script>
91
+ document.querySelectorAll('select[name="action"]').forEach(select => {
92
+ select.addEventListener('change', (e) => {
93
+ const userId = e.target.closest('form').action.split('/').pop();
94
+ const balanceInput = document.getElementById(`balance_${userId}`);
95
+ const messageInput = document.getElementById(`message_${userId}`);
96
+ balanceInput.style.display = ['add_balance', 'subtract_balance'].includes(e.target.value) ? 'inline' : 'none';
97
+ messageInput.style.display = e.target.value === 'send_message' ? 'inline' : 'none';
98
+ });
99
+ });
100
+ </script>
101
+ </body>
102
+ </html>