fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-09-12 07:36 am

[dw-free] apply new member list "jump to" logic to sentinvites.bml

[commit: http://hg.dwscoalition.org/dw-free/rev/c23352cced11]

http://bugs.dwscoalition.org/show_bug.cgi?id=3935

Handle "jump to" correctly when we have multiple pages of sent invites.

Patch by [personal profile] kareila.

Files modified:
  • htdocs/community/sentinvites.bml
--------------------------------------------------------------------------------
diff -r 1c440916df9e -r c23352cced11 htdocs/community/sentinvites.bml
--- a/htdocs/community/sentinvites.bml	Mon Sep 12 15:34:11 2011 +0800
+++ b/htdocs/community/sentinvites.bml	Mon Sep 12 15:36:14 2011 +0800
@@ -108,16 +108,19 @@
 
     # populate %users hash
     my %users = ();
+    my %usernames;
     foreach my $invite (@$sent) {
         my $id = $invite->{userid};
         next if $GET{show} && $GET{show} ne 'all' && $invite->{status} ne $GET{show};
+        my $name = $us->{$id}{user};
         $users{$id}{userid} = $id;
         $users{$id}{maintainer} = $us->{$invite->{maintid}}{user};
-        $users{$id}{user} = $us->{$id}{user};
+        $users{$id}{user} = $name;
         $users{$id}{$_} = 1 foreach keys %{$invite->{args}};
         $users{$id}{status} = $invite->{status};
         $users{$id}{date} = LJ::mysql_time($invite->{recvtime});
         $users{$id}{date} =~ s/\s.+$//; # we just want the date, ignore time
+        $usernames{$name} = $id;
     }
 
     # hop out if there were no invites
@@ -134,36 +137,43 @@
             " p?>";
     }
 
-    # sorting method;
+    # sorting method; default sort by username
     my $method = $GET{'sort'};
+    my %sortmap = ( A      => sub { $b->{admin}      <=> $a->{admin} },
+                    P      => sub { $b->{post}       <=> $a->{post} },
+                    M      => sub { $b->{moderate}   <=> $a->{moderate} },
+                    U      => sub { $b->{preapprove} <=> $a->{preapprove} },
+                    status => sub { $a->{status}     cmp $b->{status} },
+                    date   => sub { $b->{date}       cmp $a->{date} },
+                    maint  => sub { $b->{maintainer} cmp $a->{maintainer} },
+                  );
+    my $sort = $sortmap{$method} || sub { 0 };
 
-    my $cmp = sub {$a->{'user'} cmp $b->{'user'}};
-    $cmp = sub {$b->{'admin'} <=> $a->{'admin'}} if $method eq 'A';
-    $cmp = sub {$b->{'post'} <=> $a->{'post'}} if $method eq 'P';
-    $cmp = sub {$b->{'moderate'} <=> $a->{'moderate'}} if $method eq 'M';
-    $cmp = sub {$b->{'preapprove'} <=> $a->{'preapprove'}} if $method eq 'U';
-    $cmp = sub {$a->{'status'} cmp $b->{'status'}} if $method eq 'status';
-    $cmp = sub {$b->{'date'} cmp $a->{'date'}} if $method eq 'date';
-    $cmp = sub {$b->{'maintainer'} cmp $a->{'maintainer'}} if $method eq 'maint';
+    # even if we're sorting another way, we still want a
+    # secondary sort by username, for predictability
 
+    my $cmp = sub { $sort->( $a, $b ) || $a->{user} cmp $b->{user} };
     my @users = sort $cmp values %users;
+
+    # iterate through list and store position value in users hash
+    for ( my $i = 0; $i < @users; $i++ ) {
+        my $id = $users[$i]->{userid};
+        $users{$id}->{index} = $i;
+    }
+
     my $page_size = 100; # change to adjust page size
 
     # are we going to jump to a specific user ?
-    my $jumppage;
-    my $jumpuser;
-    if (@users > $page_size && $POST{'jumpto'} =~ /^\w+$/) {
-        my $ct;
-        foreach (@users) {
-            $jumppage++ if $ct % $page_size == 0;
-            if ($POST{'jumpto'} eq $_->{'name'}) {
-                $jumpuser = $_->{'name'};
-                last;
-            }
-            $ct++;
+    my ( $jumppage, $jumpuser, $currpage );
+    if ( $POST{jumpto} ) {
+        if ( my $user = $users{$usernames{$POST{jumpto}}} ) {
+            $jumpuser = $user->{user};
+            $jumppage = $user->{index} + 1;
+            $currpage = int( $user->{index} / $page_size ) + 1;
+            $page_size = 1;  # just show this user
         }
-        undef $jumppage unless $jumpuser;
     }
+    $jumppage = $GET{page} unless defined $jumppage;
 
     # how to make links back to this page
     my $self_link = sub {
@@ -173,7 +183,7 @@
         return "sentinvites?authas=$cname&page=$_[0]$sort$filter";
     };
 
-    my %items = BML::paging(\@users, $jumppage || $GET{'page'}, $page_size);
+    my %items = BML::paging( \@users, $jumppage, $page_size );
     my $navbar = LJ::paging_bar($items{'page'}, $items{'pages'},
                                  { 'self_link' => $self_link });
     @users = @{$items{'items'}};
@@ -181,13 +191,18 @@
     # output starts here
 
     # jump to user
-    if ($items{'pages'} > 1) {
-        $ret .= "<form method='post' action='sentinvites?authas=$cname'>";
-        $ret .= "<div style='margin-left: 30px;'>Jump to user: ";
-        $ret .= LJ::html_text({ 'name' => 'jumpto', 'value' => $POST{'jumpto'},
-                                'size' => '10', 'maxlength' => '25' }) . " ";
-        $ret .= LJ::html_submit(undef, 'Go') . "</div>";
-        $ret .= "</form>";
+    $ret .= "<form method='post' action='sentinvites?authas=$cname'>";
+    $ret .= "<p>$ML{'/community/members.bml.jump2'}: ";
+    $ret .= LJ::html_text( { name => 'jumpto', value => $POST{jumpto},
+                             size => '10', maxlength => '75' } ) . " ";
+    $ret .= LJ::html_submit(undef, 'Go') . "</p></form>";
+
+    if ( $jumpuser ) {
+        $ret .= "<p><h3><a href='" . $self_link->( $currpage ) . "'>";
+        $ret .= "$ML{'/community/members.bml.jump.clear'}</a></h3></p>";
+    } else {
+        $ret .= "<p><h3>$ML{'/community/members.bml.jump.notfound'}</h3></p>"
+            if $POST{jumpto};  # was not found in the list
         $ret .= $navbar;
     }
 
@@ -273,7 +288,7 @@
 
     $ret .= "<br /><a href='/community/members?authas=$c->{user}'>$ML{'.send'}</a>";
     $ret .= "</div>\n\n";
-    $ret .= $navbar;
+    $ret .= $navbar unless $jumpuser;
     return $ret;
 
 }
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org