[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
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
--------------------------------------------------------------------------------

no subject
no subject
no subject