[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
yvi.
Files modified:
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]](https://www.dreamwidth.org/img/silk/identity/user.png)
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&mode=results'>" . LJ::Lang::ml( 'poll.seeresults' ) . "</a> ] "; + $ret .= "  [ <a href='$LJ::SITEROOT/poll/?id=$pollid&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 --------------------------------------------------------------------------------