Check-in by ben on 2024-10-06 21:49:20
Add option to change user list sort order
INSERTED DELETED
1 0 make.sh
pharos/listsort/index.dcgi
34 3 src/list/index.dcgi.m4
54 0 src/listsort/index.dcgi.m4
89 3 TOTAL over 3 changed files
Index: make.sh
==================================================================
--- make.sh
+++ make.sh
@@ -18,10 +18,11 @@
images/index.gph \
details/index.dcgi \
download/index.dcgi \
list/index.dcgi \
lists/index.dcgi \
+ listsort/index.dcgi \
raw/index.cgi \
search/index.dcgi \
software/index.gph \
sort/index.dcgi \
video/index.gph \
ADDED pharos/listsort/index.dcgi
Index: pharos/listsort/index.dcgi
==================================================================
--- /dev/null
+++ pharos/listsort/index.dcgi
Index: src/list/index.dcgi.m4
==================================================================
--- src/list/index.dcgi.m4
+++ src/list/index.dcgi.m4
@@ -10,21 +10,32 @@
incl(src/cgi.awk)
incl(src/util.awk)
function main( acct, client_url, cmd, count, creator, iaout, id,
is_private, items, label, list_id, name, name_slug, numfound,
- page, pages, rows, query, title, type, url)
+ order, order_name, order_names, order_param, page, pages, rows,
+ query, title, type, url)
{
+ order_names["creatorSorter"] = creator
+ order_names["date"] = "date"
+ order_names["titleSorter"] = "title"
+ order_names["week"] = "week"
+
rows = 15
page = 1
+ order = ""
- # parse out page number
+ # parse out page number and sort order
for (i in parts) {
if (parts[i] ~ /^rows[0-9][0-9]*$/) {
rows = substr(parts[i], 5)
} else if (parts[i] ~ /^page[0-9][0-9]*$/) {
page = substr(parts[i], 5)
+ } else if (parts[i] ~ /^sort/) {
+ if (length(order) == 0) {
+ order = substr(parts[i], 5)
+ }
}
}
split(search, parts, "/")
acct = parts[1]
@@ -75,14 +86,28 @@
name_slug = uri_encode(name)
gsub(/%20/, "-", name_slug)
client_url = api_ssl_endpoint "/details/" acct "/lists/" list_id \
"/" name_slug
+ order_param = ""
+ if (length(order) > 0) {
+ split(order, parts, ":")
+ order_name = order_names[parts[1]]
+ if (length(order_name) > 0) {
+ if (parts[2] == "desc") {
+ client_url = client_url "?-" order_name
+ } else {
+ client_url = client_url "?" order_name
+ }
+ order_param = "&sort=" uri_encode(order)
+ }
+ }
url = api_ssl_endpoint "/services/search/beta/page_production/" \
"?user_query=identifier:(" query ")" \
"&hits_per_page=" rows \
"&page=" page \
+ order_param \
"&aggregations=false" \
"&client_url=" client_url
api_request(url, "GET", iaout)
pages = int(numfound / rows)
@@ -117,11 +142,11 @@
type = $3
} else if ($1 == ".response.body.hits.hits[].fields.title" &&
$2 == "s")
{
title = $3
- } else if ($1 == ".response.body.hits.hits[]._score" && $2 == "a") {
+ } else if ($1 == ".response.body.hits.hits[]._score") {
# the _score field happens to be toward the end of each item
if (length(title) > 0) {
if (length(creator) > 0) {
label = sprintf("[%s] %s by %s", mediatype[type], \
gph_encode(shorten(title, 40)), shorten(creator, 18))
@@ -154,10 +179,16 @@
if (count == rows) {
printf "[1|[>>] Page %d|%s/list/page%d/rows%d/%%09%s/%d|%s|%s]\n",
page + 1, cgipath, page + 1, rows,
acct, list_id, server, port
}
+
+ # only show "sort" if there's more than one item to sort
+ if (numfound > 1) {
+ printf "[1|[^v] Sort|%s/listsort/%%09%s/%d|%s|%s]\n", cgipath,
+ acct, list_id, server, port
+ }
printf "[1|Account %s|%s/account/%s|%s|%s]\n", acct, cgipath,
acct, server, port
print ""
ADDED src/listsort/index.dcgi.m4
Index: src/listsort/index.dcgi.m4
==================================================================
--- /dev/null
+++ src/listsort/index.dcgi.m4
@@ -0,0 +1,54 @@
+include(config.m4)dnl
+#!__CMD_AWK__ -f
+
+# listsort/index.dcgi
+#
+# Change list sort order
+
+include(src/config.awk)
+incl(src/cgi.awk)
+
+function main( acct, i, lbl, list_id, opt) {
+ lbl[1] = "Relevance"
+ opt[1] = ""
+ lbl[2] = "Weekly views [^]"
+ opt[2] = "week:asc"
+ lbl[3] = "Weekly views [v]"
+ opt[3] = "week:desc"
+ lbl[4] = "Title [^]"
+ opt[4] = "titleSorter:asc"
+ lbl[5] = "Title [v]"
+ opt[5] = "titleSorter:desc"
+ lbl[6] = "Date published [^]"
+ opt[6] = "date:asc"
+ lbl[7] = "Date published [v]"
+ opt[7] = "date:desc"
+ lbl[8] = "Creator [^]"
+ opt[8] = "creatorSorter:asc"
+ lbl[9] = "Creator [v]"
+ opt[9] = "creatorSorter:desc"
+
+ split(search, parts, "/")
+ acct = parts[1]
+ list_id = parts[2]
+
+ print "# Sort by"
+ print ""
+ for (i = 1; i < 10; i++) {
+ if (length(opt[i]) == 0) {
+ printf "[1|%s|%s/list/%%09%s/%d|%s|%s]\n",
+ lbl[i], cgipath, acct, list_id, server, port
+ } else {
+ printf "[1|%s|%s/list/sort%s%%09%s/%d|%s|%s]\n",
+ lbl[i], cgipath, opt[i], acct, list_id, server, port
+ }
+ }
+ exit 0
+}
+
+BEGIN {
+ config_init()
+
+ cgi_init()
+ main()
+}