]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/commitdiff
poll: Added postvote and posttrail options for better multi-page polls.
authorJoey Hess <joeyh@joeyh.name>
Mon, 26 Nov 2018 17:14:21 +0000 (13:14 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 26 Nov 2018 17:14:21 +0000 (13:14 -0400)
Modern web users probably expect the poll to move on automatically to the
next question, and this allows for that behavior.

Note that bestlink() runs at vote time, which avoids needing to make the
page containing the poll depend on the page that sets up a trail, as the
current trail at vote time will be used.

This commit was sponsored by Eric Drechsel on Patreon.

CHANGELOG
IkiWiki/Plugin/poll.pm
doc/ikiwiki/directive/poll.mdwn

index b00dc82189d8b09dbfcbb07737fabb9abd9dc965..892dca041f1456e9ed0f54fb02521af31f217f92 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,7 @@ ikiwiki (3.20180312) UNRELEASED; urgency=medium
   [ Joey Hess ]
   * aggregate: Fix aggregation of posts without a title.
     Thanks, Alexandre Oliva
+  * poll: Added postvote and posttrail options for better multi-page polls.
 
  -- Simon McVittie <smcv@debian.org>  Wed, 16 May 2018 13:09:27 +0100
 
index eb0e6ef04d086ad34e900a31f37a2407edbefabc..734fe487e9065e2c2ad71d19549efd0ec0da002c 100644 (file)
@@ -69,6 +69,12 @@ sub preprocess (@) {
                        $ret.="<input type=\"hidden\" name=\"num\" value=\"$num\" />\n";
                        $ret.="<input type=\"hidden\" name=\"page\" value=\"$params{page}\" />\n";
                        $ret.="<input type=\"hidden\" name=\"choice\" value=\"$choice\" />\n";
+                       if (defined $params{postvote}) {
+                               $ret.="<input type=\"hidden\" name=\"postvote\" value=\"".linkpage($params{postvote})."\" />\n";
+                       }
+                       if (defined $params{posttrail}) {
+                               $ret.="<input type=\"hidden\" name=\"posttrail\" value=\"".linkpage($params{posttrail})."\" />\n";
+                       }
                        $ret.="<input type=\"submit\" value=\"".gettext("vote")."\" />\n";
                }
                $ret.="</p>\n<hr class=poll align=left width=\"$percent%\"/>\n";
@@ -112,13 +118,25 @@ sub sessioncgi ($$) {
                        error("bad page name");
                }
 
+               my $postvote=urlto($page);
+               if (defined $cgi->param('postvote') && length $cgi->param('postvote')) {
+                       $postvote=urlto(bestlink($page, $cgi->param('postvote')));
+               }
+               elsif (defined $cgi->param('posttrail') && length $cgi->param('posttrail')) {
+                       my $trailname=bestlink($page, $cgi->param('posttrail'));
+                       my $trailnext=$pagestate{$page}{trail}{item}{$trailname}[1];
+                       if (defined $trailnext) {
+                               $postvote=urlto($trailnext);
+                       }
+               }
+
                # Did they vote before? If so, let them change their vote,
                # and check for dups.
                my $choice_param="poll_choice_${page}_$num";
                my $oldchoice=$session->param($choice_param);
                if (defined $oldchoice && $oldchoice eq $choice) {
                        # Same vote; no-op.
-                       IkiWiki::redirect($cgi, urlto($page));
+                       IkiWiki::redirect($cgi, $postvote);
                        exit;
                }
 
@@ -149,7 +167,7 @@ sub sessioncgi ($$) {
                };
                $content =~ s{(\\?)\[\[\Q$prefix\E\s+([^]]+)\s*\]\]}{$edit->($1, $2)}seg;
 
-               # Store their vote, update the page, and redirect to it.
+               # Store their vote, update the page, and redirect.
                writefile($pagesources{$page}, $config{srcdir}, $content);
                $session->param($choice_param, $choice);
                IkiWiki::cgi_savesession($session);
@@ -174,8 +192,7 @@ sub sessioncgi ($$) {
                eval q{use CGI::Cookie};
                error($@) if $@;
                my $cookie = CGI::Cookie->new(-name=> $session->name, -value=> $session->id);
-               print $cgi->redirect(-cookie => $cookie,
-                       -url => urlto($page));
+               print $cgi->redirect(-cookie => $cookie, -url => $postvote);
                exit;
        }
 }
index 0b47a2167979eda2ada81e4756aae5371f437e81..7b9fdfdc595622364a47fbcb82c14876c5f86126 100644 (file)
@@ -23,5 +23,12 @@ Parameters:
   another choice to the poll.
 * `total` - Show total number of votes at bottom of poll. Default is "yes".
 * `percent` - Whether to display percents. Default is "yes".
+* `postvote` - By default after voting the updated page containing the poll
+  is displayed. This parameter allows advancing onward to another page.
+  This is useful for multi-page polls.
+* `posttrail` - Similar to postvote, but allows advancing to the next page
+  on a trail after a vote. The value of the parameter is the name of the
+  page that defines the trail to follow. The trail plugin must be
+  enabled for this to work.
 
 [[!meta robots="noindex, follow"]]