Mercurial Hosting > linkmystyle
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/private/reports/users.html.luan Fri Jul 11 20:57:49 2025 -0600 @@ -0,0 +1,124 @@ +local Luan = require "luan:Luan.luan" +local error = Luan.error +local ipairs = Luan.ipairs or error() +local String = require "luan:String.luan" +local to_number = String.to_number or error() +local Table = require "luan:Table.luan" +local sort = Table.sort or error() +local Html = require "luan:Html.luan" +local html_encode = Html.encode or error() +local Io = require "luan:Io.luan" +local Http = require "luan:http/Http.luan" +local User = require "site:/lib/User.luan" +local Db = require "site:/lib/Db.luan" +local Reporting = require "site:/lib/Reporting.luan" +local owners_with_visits = Reporting.owners_with_visits or error() +local Logging = require "luan:logging/Logging.luan" +local logger = Logging.logger "reports/users.html" + + +local function by_links(user1,user2) + return user1.links > user2.links +end + +return function() + local n = Http.request.parameters.n + n = n and to_number(n) + local users = User.search("user_registered:*","user_registered desc",n) + local has_visits = owners_with_visits() + for _, user in ipairs(users) do + user.links = Db.count("link_user_id:"..user.id) + user.traffic = has_visits[user.id] and "yes" or "" + end + if Http.request.parameters.sort == "links" then + sort(users,by_links) + end + Io.stdout = Http.response.text_writer() +%> +<!doctype html> +<html lang="en"> + <head> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <style> + @import "/tools/tools.css"; + + div[source] { + cursor: pointer; + } + </style> + <script src="/site.js"></script> + <script src="/admin.js"></script> + <script> + function showForm(td) { + let divSource = td.querySelector('div[source]'); + let span = divSource.querySelector('span'); + let divForm = td.querySelector('div[form]'); + let divHidden = document.querySelector('div[hidden]'); + divSource.style.display = 'none'; + divForm.innerHTML = divHidden.innerHTML; + let form = divForm.querySelector('form'); + form.onsubmit = function(){ submitted(td); } + let input = divForm.querySelector('input'); + input.value = span.textContent; + input.onblur = function(){ hideForm(td); } + input.focus(); + } + function hideForm(td) { + let divSource = td.querySelector('div[source]'); + let divForm = td.querySelector('div[form]'); + divSource.style.display = 'block'; + divForm.innerHTML = ''; + } + function submitted(td) { + let input = td.querySelector('input'); + let userId = td.getAttribute('user'); + ajax( `save_source.js?user=${userId}&source=${input.value}` ); + } + + function deleteUser(userId,userName) { + if( !confirm(`Do you want to delete ${userName}?`) ) + return; + ajax( `delete_user.js?user=${userId}` ); + console.log('qqq'); + } + </script> + </head> + <body> + <h1>recent users</h1> + <table> + <tr> + <th><a href="?">registered</a></th> + <th><a href="?sort=links">links</a></th> + <th>traffic</th> + <th>name</th> + <th>password</th> + <th>email</th> + <th>title</th> + <th></th> + </tr> +<% + for _, user in ipairs(users) do +%> + <tr> + <td><script>date(<%= user.registered %>)</script></td> + <td align=right><%= user.links %></td> + <td><%= user.traffic %></td> + <td><a href="/<%=user.name%>"><%=user.name%></a></td> + <td><%= html_encode(user.password) %></td> + <td><%= user.email %></td> + <td><%= html_encode(user.title or user.name) %></td> + <td><button onclick="deleteUser(<%=user.id%>,'<%=user.name%>')">delete</button></td> + </tr> +<% + end +%> + </table> + <div hidden=form> + <form action="javascript:"> + <input> + </form> + </div> + </body> +</html> +<% +end