From 4a5a23d7fba7b02698944ffe987b30b0f40d8d35 Mon Sep 17 00:00:00 2001 From: Alec Murphy Date: Sat, 22 Feb 2025 22:25:13 -0500 Subject: [PATCH] Slon/Http/AdminServer: Paginate list of accounts --- Slon/Http/AdminServer.HC | 20 +++++++++++++++++++- Slon/Static/html/admin/main.html | 27 +++++++++++++++++++-------- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/Slon/Http/AdminServer.HC b/Slon/Http/AdminServer.HC index 07313c5..3b6e03a 100644 --- a/Slon/Http/AdminServer.HC +++ b/Slon/Http/AdminServer.HC @@ -264,7 +264,25 @@ U0 @slon_admin_new_account(SlonHttpSession* session) U0 @slon_admin_manage_accounts(SlonHttpSession* session) { - session->send(db->a("accounts")); + SLON_SCRATCH_BUFFER_AND_REQUEST_JSON + no_warn scratch_buffer; + + JsonArray* results = Json.CreateArray(); + I64 skip = Str2I64(request_json->@("skip")); + I64 limit = 10; + I64 i; + I64 count = 0; + JsonArray* accounts = db->a("accounts"); + for (i = skip; i < accounts->length && i < skip + limit; i++) { + results->append(Json.CreateItem(accounts->@(i), JSON_OBJECT)); + ++count; + } + JsonObject* o = Json.CreateObject(); + o->set("total", accounts->length, JSON_NUMBER); + o->set("skip", skip, JSON_NUMBER); + o->set("count", count, JSON_NUMBER); + o->set("accounts", results, JSON_ARRAY); + session->send(o); } U0 @slon_admin_info_stats(SlonHttpSession* session) diff --git a/Slon/Static/html/admin/main.html b/Slon/Static/html/admin/main.html index 4a3dc79..c93a857 100644 --- a/Slon/Static/html/admin/main.html +++ b/Slon/Static/html/admin/main.html @@ -34,7 +34,7 @@ @@ -63,18 +63,29 @@ setContent(html); setActiveLink("stats"); } - async function manageAccounts() { + async function manageAccounts(page) { clearActiveLinks(); - const request = new Request("/manage/accounts"); + const request = new Request("/manage/accounts?skip=" + (page*10).toString()); const response = await fetch(request); - const accounts = await response.json(); + const result = await response.json(); + const accounts = result["accounts"]; let html = "

Accounts

"; if (accounts.length) { - html += ""; + html += "
idacctdisplay_nametypedelete
"; for (let i = 0; i < accounts.length; i++) { - html += ""; + html += ""; } html += "
idacctdisplay_nametypedelete
" + accounts[i]["id"] + "" + accounts[i]["acct"] + "" + accounts[i]["display_name"] + ""+ (accounts[i]["remote_actor"] == undefined ? "local" : "remote") + "
" + accounts[i]["id"] + "" + accounts[i]["acct"] + "" + accounts[i]["display_name"] + ""+ (accounts[i]["remote_actor"] == undefined ? "local" : "remote") + "
"; + html += ""; } else { html += "No users"; } @@ -87,7 +98,7 @@ const request = new Request("/delete/account?id=" + id); const response = await fetch(request); const empty_json = await response.json(); - manageAccounts(); + manageAccounts(0); } } function manageNewUser() { @@ -142,7 +153,7 @@ const response = await fetch(request); const json = await response.json(); if (!Object.keys(json).length) { - manageAccounts(); + manageAccounts(0); } else { alert(JSON.stringify(json)); }