fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2010-10-14 03:47 am

[dw-free] clear-my-answers link for polls

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

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

Have a link to clear all your answers when voting in a poll.

Patch by [personal profile] yvi.

Files modified:
  • bin/upgrading/en.dat
  • cgi-bin/LJ/Poll.pm
  • htdocs/js/livejournal.js
  • htdocs/poll/index.bml
--------------------------------------------------------------------------------
diff -r e9890bfa3316 -r 88ea0f26d63f bin/upgrading/en.dat
--- a/bin/upgrading/en.dat	Thu Oct 14 11:29:27 2010 +0800
+++ b/bin/upgrading/en.dat	Thu Oct 14 11:47:13 2010 +0800
@@ -2319,6 +2319,8 @@ password=Password
 
 poll.changevote=Change Your Vote
 
+poll.clear=Clear Answers
+
 poll.dberror=Database error: [[errmsg]]
 
 poll.dberror.items=Database error inserting items: [[errmsg]]
diff -r e9890bfa3316 -r 88ea0f26d63f cgi-bin/LJ/Poll.pm
--- a/cgi-bin/LJ/Poll.pm	Thu Oct 14 11:29:27 2010 +0800
+++ b/cgi-bin/LJ/Poll.pm	Thu Oct 14 11:47:13 2010 +0800
@@ -843,7 +843,7 @@ sub render_ans {
 # opts:
 #   mode => enter|results|ans
 #   qid  => show a specific question
-#   page => page #
+#   page => page 
 sub render {
     my ($self, %opts) = @_;
 
@@ -855,6 +855,13 @@ sub render {
     my $qid      = delete $opts{qid};
     my $page     = delete $opts{page};
     my $pagesize = delete $opts{pagesize};
+
+    # clearning the answers renders just like 'enter' mode, we just need to clear all selections
+    my $clearanswers;
+    if ( $mode eq "clear" ) {
+        $clearanswers = 1;
+        $mode = "enter";
+    }
 
     # Default pagesize.
     $pagesize = 2000 unless $pagesize;
@@ -944,6 +951,8 @@ sub render {
     if ( $mode eq 'enter' && $self->can_view( $remote ) ) {
         $ret .= "<br />\n";
         $ret .= "[ <a href='$LJ::SITEROOT/poll/?id=$pollid&amp;mode=results'>" . LJ::Lang::ml( 'poll.seeresults' ) . "</a> ]  ";
+        $ret .= "&nbsp&nbsp;[ <a href='$LJ::SITEROOT/poll/?id=$pollid&amp;mode=clear' 
+            class='LJ_PollClearLink' id='LJ_PollClearLink_${pollid}' lj_pollid='$pollid'>  " . BML::ml('poll.clear') ."</a> ]";
     } elsif ( $mode eq 'results' ) {
         #include number of participants
         my $sth = $self->journal->prepare( "SELECT count(DISTINCT userid) FROM pollresult2 WHERE pollid=? AND journalid=?" );
@@ -1054,12 +1063,15 @@ sub render {
             }
         }
 
+        my $prevanswer;
+
         #### text questions are the easy case
         if ($q->type eq "text" && $do_form) {
             my ($size, $max) = split(m!/!, $q->opts);
+            $prevanswer = $clearanswers ? "" : $preval{$qid};
 
-            $results_table .= LJ::html_text({ 'size' => $size, 'maxlength' => $max,
-                                    'name' => "pollq-$qid", 'value' => $preval{$qid} });
+            $results_table .= LJ::html_text({ 'size' => $size, 'maxlength' => $max, 'class'=>"poll-$pollid",
+                                    'name' => "pollq-$qid", 'value' => $prevanswer });
         } elsif ($q->type eq 'drop' && $do_form) {
             #### drop-down list
             my @optlist = ('', '');
@@ -1069,8 +1081,9 @@ sub render {
                 LJ::Poll->clean_poll(\$item);
                 push @optlist, ($itid, $item);
             }
-            $results_table .= LJ::html_select({ 'name' => "pollq-$qid",
-                                      'selected' => $preval{$qid} }, @optlist);
+            $prevanswer = $clearanswers ? 0 : $preval{$qid}; 
+            $results_table .= LJ::html_select({ 'name' => "pollq-$qid", 'class'=>"poll-$pollid",
+                                      'selected' => $prevanswer }, @optlist);
         } elsif ($q->type eq "scale" && $do_form) {
             #### scales (from 1-10) questions
             my ($from, $to, $by) = split(m!/!, $q->opts);
@@ -1084,10 +1097,12 @@ sub render {
                 $results_table .= "<table><tr valign='top' align='center'>";
 
                 for (my $at=$from; $at<=$to; $at+=$by) {
+
+                    my $selectedanswer = !$clearanswers && ( defined $preval{$qid} && $at == $preval{$qid});
                     $results_table .= "<td style='text-align: center;'>";
-                    $results_table .= LJ::html_check({ 'type' => 'radio', 'name' => "pollq-$qid",
+                    $results_table .= LJ::html_check( { 'type' => 'radio', 'name' => "pollq-$qid", 'class'=>"poll-$pollid",
                                              'value' => $at, 'id' => "pollq-$pollid-$qid-$at",
-                                             'selected' => (defined $preval{$qid} && $at == $preval{$qid}) });
+                                             'selected' => $selectedanswer } );
                     $results_table .= "<br /><label for='pollq-$pollid-$qid-$at'>$at</label></td>";
                 }
 
@@ -1096,12 +1111,13 @@ sub render {
             # many opts, display select
             # but only if displaying form
             } else {
+                $prevanswer = $clearanswers ? "" : $preval{$qid};
 
                 my @optlist = ('', '');
                 for (my $at=$from; $at<=$to; $at+=$by) {
                     push @optlist, ($at, $at);
                 }
-                $results_table .= LJ::html_select({ 'name' => "pollq-$qid", 'selected' => $preval{$qid} }, @optlist);
+                $results_table .= LJ::html_select({ 'name' => "pollq-$qid", 'class'=>"poll-$pollid", 'selected' => $prevanswer }, @optlist);
             }
 
         } else {
@@ -1137,9 +1153,10 @@ sub render {
 
                 # displaying a radio or checkbox
                 if ($do_form) {
-                    $results_table .= LJ::html_check({ 'type' => $q->type, 'name' => "pollq-$qid",
+                    $prevanswer = $clearanswers ? 0 : $preval{$qid} =~ /\b$itid\b/;
+                    $results_table .= LJ::html_check({ 'type' => $q->type, 'name' => "pollq-$qid", 'class'=>"poll-$pollid",
                                               'value' => $itid, 'id' => "pollq-$pollid-$qid-$itid",
-                                              'selected' => ($preval{$qid} =~ /\b$itid\b/) });
+                                              'selected' => $prevanswer });
                     $results_table .= " <label for='pollq-$pollid-$qid-$itid'>$item</label><br />";
                     next;
                 }
diff -r e9890bfa3316 -r 88ea0f26d63f htdocs/js/livejournal.js
--- a/htdocs/js/livejournal.js	Thu Oct 14 11:29:27 2010 +0800
+++ b/htdocs/js/livejournal.js	Thu Oct 14 11:47:13 2010 +0800
@@ -202,6 +202,13 @@ LiveJournal.initPolls = function (elemen
         DOM.addEventListener(pollLink, "click", LiveJournal.pollAnswerLinkClicked.bindEventListener(pollLink));
     });
 
+    var pollClears = DOM.getElementsByTagAndClassName(ele, 'a', "LJ_PollClearLink") || [];
+
+    // attach click handlers to each clear link
+    Array.prototype.forEach.call(pollClears, function (pollClear) {
+        DOM.addEventListener(pollClear, "click", LiveJournal.pollClearLinkClicked.bindEventListener(pollClear));
+    });
+
     var pollButtons = DOM.getElementsByTagAndClassName(ele, 'input', "LJ_PollSubmit") || []; 
     
     // attaches a click handler to all poll submit buttons
@@ -303,6 +310,32 @@ LiveJournal.getFormObject = function (fo
     return formObject;
 
 };
+
+LiveJournal.pollClearLinkClicked = function (e) {
+    Event.stop(e);
+
+    var pollid = this.getAttribute("lj_pollid");
+    var inputelements = DOM.getElementsByTagAndClassName(document, 'input', "poll-"+pollid ) || [];
+    var inputelement;
+
+    // clear all options of this poll
+    for (var i = 0; i < inputelements.length; i++) {
+        inputelement = inputelements[i];
+        // text fields
+        if (inputelement.type == 'text') {
+            inputelement.value = "";
+        } else {
+        // checboxes and radio buttons
+            inputelements[i].checked = false;
+        }
+    }
+
+    var selectelements = DOM.getElementsByTagAndClassName(document, 'select', "poll-"+pollid ) || [];
+    // drop-down selects
+    for (var i = 0; i < selectelements.length; i++) {
+        selectelements[i].selectedIndex = 0;
+    }
+}
 
 // invocant is the pollLink from above
 LiveJournal.pollAnswerLinkClicked = function (e) {
diff -r e9890bfa3316 -r 88ea0f26d63f htdocs/poll/index.bml
--- a/htdocs/poll/index.bml	Thu Oct 14 11:29:27 2010 +0800
+++ b/htdocs/poll/index.bml	Thu Oct 14 11:47:13 2010 +0800
@@ -51,7 +51,7 @@ _c?>
     my $u = $poll->journal;
 
     my $mode = "";
-    $mode = $FORM{'mode'} if ($FORM{'mode'} =~ /(enter|results|ans)/);
+    $mode = $FORM{'mode'} if ($FORM{'mode'} =~ /(enter|results|ans|clear)/);
 
     # Handle opening and closing of polls
     # We do this first because a closed poll will alter how a poll is displayed
--------------------------------------------------------------------------------

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