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
--------------------------------------------------------------------------------
turlough: The Girl (Grace Jeanette) yay!ing from car window, Art is the Weapon video, Sept 2010 ((mcr) yay!)

[personal profile] turlough 2010-10-14 04:41 pm (UTC)(link)
This is totally awesome!
denise: Image: Me, facing away from camera, on top of the Castel Sant'Angelo in Rome (Default)

[staff profile] denise 2010-10-14 04:43 pm (UTC)(link)
It has been a while since I've thanked you for all the comments you leave cheering on things you find awesome. It's remarkably inspiring. :)
yvi: Kaylee half-smiling, looking very pretty (Default)

[personal profile] yvi 2010-10-16 12:43 pm (UTC)(link)
Thank you! :)