Commit 1042076a by Jonathan Piacenti

Vote functionality implemented for Survey.

parent 17f35612
......@@ -21,7 +21,7 @@
</div>
</div>
<div class="poll-percent-container">
<span class="poll-percent-display{{#if top}} poll-top-choice{{/if}}">{{percent}}%</span>
<span class="poll-percent-display{{#if first}} poll-top-choice{{/if}}">{{percent}}%</span>
</div>
</li>
{{^last}}
......
<script id="survey-results-template" type="text/html">
<table>
<thead>
<tr>
<th></th>
{{#each answers}}
<th>{{this}}</th>
{{/each}}
</tr>
</thead>
{{#each tally}}
<tr>
<td>{{{text}}}</td>
{{#each answers}}
<td>{{percent}}%</td>
{{/each}}
</tr>
{{/each}}
</table>
</script>
......@@ -12,7 +12,7 @@
{% endfor %}
</tr>
</thead>
{% for key, question in questions.items %}
{% for key, question in questions %}
<tr>
<td>
{{question}}
......
......@@ -10,21 +10,18 @@ function PollUtil (runtime, element, pollType) {
this.runtime = runtime;
this.submit = $('input[type=button]', element);
this.answers = $('input[type=radio]', element);
this.resultsTemplate = Handlebars.compile($("#poll-results-template", element).html());
var getResults = this.getResults();
this.resultsTemplate = Handlebars.compile($("#" + self.pollType + "-results-template", element).html());
// If the submit button doesn't exist, the user has already
// selected a choice. Render results instead of initializing machinery.
if (! self.submit.length) {
getResults({'success': true});
self.getResults({'success': true});
return false;
}
return true;
};
this.pollInit = function(){
var self = this;
// Initialization function for PollBlocks.
var enableSubmit = self.enableSubmit();
var radio = $('input[name=choice]:checked', self.element);
self.submit.click(function () {
......@@ -35,48 +32,67 @@ function PollUtil (runtime, element, pollType) {
type: "POST",
url: self.voteUrl,
data: JSON.stringify({"choice": choice}),
success: self.getResults()
success: self.getResults
});
});
// If the user has refreshed the page, they may still have an answer
// selected and the submit button should be enabled.
var answers = $('input[type=radio]', self.element);
if (! radio.val()) {
answers.bind("change.enableSubmit", enableSubmit);
answers.bind("change.enableSubmit", self.enableSubmit);
} else {
enableSubmit();
self.enableSubmit();
}
};
this.surveyInit = function () {
var self = this;
// Initialization function for Survey Blocks
var verifyAll = self.verifyAll();
self.answers.bind("change.enableSubmit", verifyAll)
self.answers.bind("change.enableSubmit", self.verifyAll);
self.submit.click(function () {
$.ajax({
type: "POST",
url: self.voteUrl,
data: JSON.stringify(self.surveyChoices()),
success: self.getResults
})
});
// If the user has refreshed the page, they may still have an answer
// selected and the submit button should be enabled.
self.verifyAll();
};
this.surveyChoices = function () {
// Grabs all selections for survey answers, and returns a mapping for them.
var choices = {};
self.answers.each(function(index, el) {
el = $(el);
choices[el.prop('name')] = $(self.checkedElement(el)).val();
});
return choices;
};
this.checkedElement = function (el) {
// Given the DOM element of a radio, get the selector for the checked element
// with the same name.
return "input[name='" + el.prop('name') + "']:checked"
};
this.verifyAll = function () {
// Generates a function that will verify all questions have an answer selected.
var self = this;
var enableSubmit = self.enableSubmit();
return function () {
// Verify that all questions have an answer selected.
var doEnable = true;
self.answers.each(function (index, el) {
if (! $("input[name='" + $(el).prop('name') + "']:checked", self.element).length) {
if (! $(self.checkedElement($(el)), self.element).length) {
doEnable = false;
return false
}
});
if (doEnable){
enableSubmit();
}
self.enableSubmit();
}
};
this.getResults = function () {
// Generates a function that will grab and display results.
var self = this;
return function(data) {
this.getResults = function (data) {
// Fetch the results from the server and render them.
if (!data['success']) {
alert(data['errors'].join('\n'));
}
......@@ -91,22 +107,21 @@ function PollUtil (runtime, element, pollType) {
$('div.poll-block', self.element).html(self.resultsTemplate(data));
}
})
}
};
this.enableSubmit = function () {
// Generates a function which will enable the submit button.
var self = this;
return function () {
// Enable the submit button.
self.submit.removeAttr("disabled");
self.answers.unbind("change.enableSubmit");
}
};
this.pollType = pollType;
var run_init = this.init(runtime, element);
if (run_init) {
var init_map = {'poll': self.pollInit, 'survey': self.surveyInit};
init_map[pollType].call(self)
init_map[pollType]()
}
}
function PollBlock(runtime, element) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment