diff --git a/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6 b/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6 index 4382fdea77e..f9b62769a5a 100644 --- a/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6 +++ b/plugins/poll/assets/javascripts/components/poll-results-standard.js.es6 @@ -1,13 +1,21 @@ +import evenRound from "discourse/plugins/poll/lib/even-round"; +import computed from "ember-addons/ember-computed-decorators"; + export default Em.Component.extend({ tagName: "ul", classNames: ["results"], - options: function() { + @computed("poll.voters", "poll.options.[]") + options() { + const options = this.get("poll.options"); const voters = this.get("poll.voters"); + const percentages = voters === 0 ? + Array(options.length).fill(0) : + evenRound(_.map(options, o => 100 * o.get("votes") / voters)); - this.get("poll.options").forEach(option => { - const percentage = voters === 0 ? 0 : Math.floor(100 * option.get("votes") / voters), - style = "width: " + percentage + "%".htmlSafe(); + options.forEach((option, i) => { + const percentage = percentages[i]; + const style = new Ember.Handlebars.SafeString(`width: ${percentage}%`); option.setProperties({ percentage, @@ -17,6 +25,6 @@ export default Em.Component.extend({ }); return this.get("poll.options"); - }.property("poll.voters", "poll.options.[]") + } }); diff --git a/plugins/poll/assets/javascripts/lib/even-round.js.es6 b/plugins/poll/assets/javascripts/lib/even-round.js.es6 new file mode 100644 index 00000000000..0a963aac66f --- /dev/null +++ b/plugins/poll/assets/javascripts/lib/even-round.js.es6 @@ -0,0 +1,8 @@ +// stolen from http://stackoverflow.com/a/13485888/11983 +export default (percentages) => { + const off = 100 - _.reduce(percentages, (acc, x) => acc + Math.round(x), 0); + return _.chain(percentages) + .sortBy(x => Math.round(x) - x) + .map((x, i) => Math.round(x) + (off > i) - (i >= (percentages.length + off))) + .value(); +};