Mercurial Hosting > linkmystyle
comparison src/private/reports/users.html.luan @ 0:8f4df159f06b
start public repo
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Fri, 11 Jul 2025 20:57:49 -0600 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:8f4df159f06b |
|---|---|
| 1 local Luan = require "luan:Luan.luan" | |
| 2 local error = Luan.error | |
| 3 local ipairs = Luan.ipairs or error() | |
| 4 local String = require "luan:String.luan" | |
| 5 local to_number = String.to_number or error() | |
| 6 local Table = require "luan:Table.luan" | |
| 7 local sort = Table.sort or error() | |
| 8 local Html = require "luan:Html.luan" | |
| 9 local html_encode = Html.encode or error() | |
| 10 local Io = require "luan:Io.luan" | |
| 11 local Http = require "luan:http/Http.luan" | |
| 12 local User = require "site:/lib/User.luan" | |
| 13 local Db = require "site:/lib/Db.luan" | |
| 14 local Reporting = require "site:/lib/Reporting.luan" | |
| 15 local owners_with_visits = Reporting.owners_with_visits or error() | |
| 16 local Logging = require "luan:logging/Logging.luan" | |
| 17 local logger = Logging.logger "reports/users.html" | |
| 18 | |
| 19 | |
| 20 local function by_links(user1,user2) | |
| 21 return user1.links > user2.links | |
| 22 end | |
| 23 | |
| 24 return function() | |
| 25 local n = Http.request.parameters.n | |
| 26 n = n and to_number(n) | |
| 27 local users = User.search("user_registered:*","user_registered desc",n) | |
| 28 local has_visits = owners_with_visits() | |
| 29 for _, user in ipairs(users) do | |
| 30 user.links = Db.count("link_user_id:"..user.id) | |
| 31 user.traffic = has_visits[user.id] and "yes" or "" | |
| 32 end | |
| 33 if Http.request.parameters.sort == "links" then | |
| 34 sort(users,by_links) | |
| 35 end | |
| 36 Io.stdout = Http.response.text_writer() | |
| 37 %> | |
| 38 <!doctype html> | |
| 39 <html lang="en"> | |
| 40 <head> | |
| 41 <meta name="viewport" content="width=device-width, initial-scale=1"> | |
| 42 <style> | |
| 43 @import "/tools/tools.css"; | |
| 44 | |
| 45 div[source] { | |
| 46 cursor: pointer; | |
| 47 } | |
| 48 </style> | |
| 49 <script src="/site.js"></script> | |
| 50 <script src="/admin.js"></script> | |
| 51 <script> | |
| 52 function showForm(td) { | |
| 53 let divSource = td.querySelector('div[source]'); | |
| 54 let span = divSource.querySelector('span'); | |
| 55 let divForm = td.querySelector('div[form]'); | |
| 56 let divHidden = document.querySelector('div[hidden]'); | |
| 57 divSource.style.display = 'none'; | |
| 58 divForm.innerHTML = divHidden.innerHTML; | |
| 59 let form = divForm.querySelector('form'); | |
| 60 form.onsubmit = function(){ submitted(td); } | |
| 61 let input = divForm.querySelector('input'); | |
| 62 input.value = span.textContent; | |
| 63 input.onblur = function(){ hideForm(td); } | |
| 64 input.focus(); | |
| 65 } | |
| 66 function hideForm(td) { | |
| 67 let divSource = td.querySelector('div[source]'); | |
| 68 let divForm = td.querySelector('div[form]'); | |
| 69 divSource.style.display = 'block'; | |
| 70 divForm.innerHTML = ''; | |
| 71 } | |
| 72 function submitted(td) { | |
| 73 let input = td.querySelector('input'); | |
| 74 let userId = td.getAttribute('user'); | |
| 75 ajax( `save_source.js?user=${userId}&source=${input.value}` ); | |
| 76 } | |
| 77 | |
| 78 function deleteUser(userId,userName) { | |
| 79 if( !confirm(`Do you want to delete ${userName}?`) ) | |
| 80 return; | |
| 81 ajax( `delete_user.js?user=${userId}` ); | |
| 82 console.log('qqq'); | |
| 83 } | |
| 84 </script> | |
| 85 </head> | |
| 86 <body> | |
| 87 <h1>recent users</h1> | |
| 88 <table> | |
| 89 <tr> | |
| 90 <th><a href="?">registered</a></th> | |
| 91 <th><a href="?sort=links">links</a></th> | |
| 92 <th>traffic</th> | |
| 93 <th>name</th> | |
| 94 <th>password</th> | |
| 95 <th>email</th> | |
| 96 <th>title</th> | |
| 97 <th></th> | |
| 98 </tr> | |
| 99 <% | |
| 100 for _, user in ipairs(users) do | |
| 101 %> | |
| 102 <tr> | |
| 103 <td><script>date(<%= user.registered %>)</script></td> | |
| 104 <td align=right><%= user.links %></td> | |
| 105 <td><%= user.traffic %></td> | |
| 106 <td><a href="/<%=user.name%>"><%=user.name%></a></td> | |
| 107 <td><%= html_encode(user.password) %></td> | |
| 108 <td><%= user.email %></td> | |
| 109 <td><%= html_encode(user.title or user.name) %></td> | |
| 110 <td><button onclick="deleteUser(<%=user.id%>,'<%=user.name%>')">delete</button></td> | |
| 111 </tr> | |
| 112 <% | |
| 113 end | |
| 114 %> | |
| 115 </table> | |
| 116 <div hidden=form> | |
| 117 <form action="javascript:"> | |
| 118 <input> | |
| 119 </form> | |
| 120 </div> | |
| 121 </body> | |
| 122 </html> | |
| 123 <% | |
| 124 end |
