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 |