From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id ED2E41F670 for ; Thu, 27 Aug 2020 22:05:00 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/2] www: more descriptive pagination Date: Thu, 27 Aug 2020 22:05:00 +0000 Message-Id: <20200827220500.27784-3-e@yhbt.net> In-Reply-To: <20200827220500.27784-1-e@yhbt.net> References: <20200827220500.27784-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Being an easily confused person, I find "next" and "prev" ambiguous as to whether messages on the next or previous page will be newer or older than the current page. Clarify that for the threaded /$INBOX/ view and search results. For search results sorted by relevance, we'll use "[>= $SCORE]" or "[<= $SCORE]" to indicate to indicate directionality. This also fixes $INBOX/new.html for unindexed v1 inboxes. --- lib/PublicInbox/Feed.pm | 5 ++++- lib/PublicInbox/SearchView.pm | 37 ++++++++++++++++++++++++++--------- lib/PublicInbox/View.pm | 12 +++++++----- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm index bf095a2c..cbdf5db9 100644 --- a/lib/PublicInbox/Feed.pm +++ b/lib/PublicInbox/Feed.pm @@ -133,7 +133,10 @@ sub recent_msgs { } } - $ctx->{next_page} = "r=$last_commit" if $last_commit; + $last_commit and + $ctx->{next_page} = qq[] . + 'next (older)'; + [ map { bless {blob => $_ }, 'PublicInbox::Smsg' } @oids ]; } diff --git a/lib/PublicInbox/SearchView.pm b/lib/PublicInbox/SearchView.pm index 7521a66d..892e8fda 100644 --- a/lib/PublicInbox/SearchView.pm +++ b/lib/PublicInbox/SearchView.pm @@ -5,7 +5,7 @@ package PublicInbox::SearchView; use strict; use v5.10.1; -use List::Util qw(max); +use List::Util qw(min max); use URI::Escape qw(uri_unescape); use PublicInbox::Smsg; use PublicInbox::Hval qw(ascii_html obfuscate_addrs mid_href fmt_ts); @@ -98,6 +98,7 @@ sub mset_summary { my $obfs_ibx = $ibx->{obfuscate} ? $ibx : undef; my @nums = @{$ibx->search->mset_to_artnums($mset)}; my %num2msg = map { $_->{num} => $_ } @{$ibx->over->get_all(@nums)}; + my ($min, $max); foreach my $m ($mset->items) { my $rank = sprintf("%${pad}d", $m->get_rank + 1); @@ -112,6 +113,11 @@ sub mset_summary { }; $ctx->{-t_max} //= $smsg->{ts}; + # only when sorting by relevance, ->items is always + # ordered descending: + $max //= $pct; + $min = $pct; + my $s = ascii_html($smsg->{subject}); my $f = ascii_html($smsg->{from_name}); if ($obfs_ibx) { @@ -125,6 +131,10 @@ sub mset_summary { $s . "\n"; $$res .= "$pfx - by $f @ $date UTC [$pct%]\n\n"; } + if ($q->{r}) { # for descriptions in search_nav_bot + $q->{-min_pct} = $min; + $q->{-max_pct} = $max; + } $$res .= search_nav_bot($mset, $q); undef; } @@ -218,42 +228,46 @@ sub search_nav_bot { my $beg = $off + 1; if ($beg <= $end) { - $rv .= "Results $beg-$end of $total"; - $rv .= ' (estimated)' if $end != $total; + my $approx = $end == $total ? '' : '~'; + $rv .= "Results $beg-$end of $approx$total"; } else { $rv .= "No more results, only $total"; } - my ($next, $join, $prev); + my ($next, $join, $prev, $nd, $pd); if ($o >= 0) { # sort descending my $n = $o + $l; if ($n < $total) { $next = $q->qs_html(o => $n, l => $l); + $nd = $q->{r} ? "[<= $q->{-min_pct}%]" : '(older)'; } if ($o > 0) { - $join = $n < $total ? '/' : ' '; + $join = $n < $total ? ' | ' : "\t"; my $p = $o - $l; $prev = $q->qs_html(o => ($p > 0 ? $p : 0)); + $pd = $q->{r} ? "[>= $q->{-max_pct}%]" : '(newer)'; } } else { # o < 0, sort ascending my $n = $o - $l; if (-$n < $total) { $next = $q->qs_html(o => $n, l => $l); + $nd = $q->{r} ? "[<= $q->{-min_pct}%]" : '(newer)'; } if ($o < -1) { - $join = -$n < $total ? '/' : ' '; + $join = -$n < $total ? ' | ' : "\t"; my $p = $o + $l; $prev = $q->qs_html(o => ($p < 0 ? $p : 0)); + $pd = $q->{r} ? "[>= $q->{-max_pct}%]" : '(older)'; } } - $rv .= qq{ next} if $next; + $rv .= qq{ next $nd} if $next; $rv .= $join if $join; - $rv .= qq{prev} if $prev; + $rv .= qq{prev $pd} if $prev; my $rev = $q->qs_html(o => $o < 0 ? 0 : -1); - $rv .= qq{ | reverse results}; + $rv .= qq{ | reverse}; } sub sort_relevance { @@ -279,6 +293,11 @@ sub mset_thread { my $msgs = $ibx->over->get_all(keys %pct); $_->{pct} = $pct{$_->{num}} for @$msgs; my $r = $q->{r}; + if ($r) { # for descriptions in search_nav_bot + my @pct = values %pct; + $q->{-min_pct} = min(@pct); + $q->{-max_pct} = max(@pct); + } my $rootset = PublicInbox::SearchThread::thread($msgs, $r ? \&sort_relevance : \&PublicInbox::View::sort_ds, $ctx); diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 9c3ef104..3055da20 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -1175,9 +1175,9 @@ sub pagination_footer ($$) { my ($ctx, $latest) = @_; my $next = $ctx->{next_page} || ''; my $prev = $ctx->{prev_page} || ''; - if ($prev) { - $next = $next ? "$next " : ' '; - $prev .= qq! latest!; + if ($prev) { # aligned padding for: 'next (older) | ' + $next = $next ? "$next | " : ' | '; + $prev .= qq[ | latest]; } "
page: $next$prev
"; } @@ -1215,11 +1215,13 @@ sub paginate_recent ($$) { } if (defined($oldest) && $more) { my $s = ts2str($oldest); - $ctx->{next_page} = qq!next!; + $ctx->{next_page} = qq[] . + 'next (older)'; } if (defined($newest) && (defined($before) || defined($after))) { my $s = ts2str($newest); - $ctx->{prev_page} = qq!prev!; + $ctx->{prev_page} = qq[] . + 'prev (newer)'; } $msgs; }