From b92a8131c017fdb8c8e78aa167a03059d86dbf64 Mon Sep 17 00:00:00 2001 From: Mark VanLandingham Date: Mon, 25 Nov 2019 11:51:01 -0600 Subject: [PATCH] FEATURE: Pie chart option for poll results (#8352) --- plugins/poll/app/models/poll.rb | 5 + .../poll/app/serializers/poll_serializer.rb | 3 +- .../controllers/poll-ui-builder.js.es6 | 19 +- .../templates/modal/poll-ui-builder.hbs | 23 +- .../initializers/extend-for-poll.js.es6 | 15 +- .../javascripts/lib/chart-colors.js.es6 | 69 ++++++ .../lib/discourse-markdown/poll.js.es6 | 1 + .../javascripts/widgets/discourse-poll.js.es6 | 232 +++++++++++++++++- .../poll/assets/stylesheets/common/poll.scss | 47 ++++ .../poll/assets/stylesheets/desktop/poll.scss | 16 +- .../poll/assets/stylesheets/mobile/poll.scss | 12 +- plugins/poll/config/locales/client.en.yml | 10 + plugins/poll/config/locales/server.en.yml | 4 + plugins/poll/config/settings.yml | 4 + .../20191114160613_add_graph_to_polls.rb | 7 + plugins/poll/plugin.rb | 95 ++++++- .../spec/integration/poll_endpoints_spec.rb | 71 +++++- plugins/poll/spec/models/poll_spec.rb | 19 ++ .../acceptance/poll-pie-chart-test.js.es6 | 128 ++++++++++ ...s6 => polls-bar-chart-test-desktop.js.es6} | 2 +- ...es6 => polls-bar-chart-test-mobile.js.es6} | 2 +- .../controllers/poll-ui-builder-test.js.es6 | 24 +- test/javascripts/fixtures/poll.js.es6 | 186 ++++++++++++++ 23 files changed, 947 insertions(+), 47 deletions(-) create mode 100644 plugins/poll/assets/javascripts/lib/chart-colors.js.es6 create mode 100644 plugins/poll/db/migrate/20191114160613_add_graph_to_polls.rb create mode 100644 plugins/poll/spec/models/poll_spec.rb create mode 100644 plugins/poll/test/javascripts/acceptance/poll-pie-chart-test.js.es6 rename plugins/poll/test/javascripts/acceptance/{polls-test-desktop.js.es6 => polls-bar-chart-test-desktop.js.es6} (97%) rename plugins/poll/test/javascripts/acceptance/{polls-test-mobile.js.es6 => polls-bar-chart-test-mobile.js.es6} (95%) diff --git a/plugins/poll/app/models/poll.rb b/plugins/poll/app/models/poll.rb index 1dd0d0b7181..f71de80cb22 100644 --- a/plugins/poll/app/models/poll.rb +++ b/plugins/poll/app/models/poll.rb @@ -32,6 +32,11 @@ class Poll < ActiveRecord::Base everyone: 1, } + enum chart_type: { + bar: 0, + pie: 1 + } + validates :min, numericality: { allow_nil: true, only_integer: true, greater_than_or_equal_to: 0 } validates :max, numericality: { allow_nil: true, only_integer: true, greater_than: 0 } validates :step, numericality: { allow_nil: true, only_integer: true, greater_than: 0 } diff --git a/plugins/poll/app/serializers/poll_serializer.rb b/plugins/poll/app/serializers/poll_serializer.rb index e955be9c40f..3d73264d036 100644 --- a/plugins/poll/app/serializers/poll_serializer.rb +++ b/plugins/poll/app/serializers/poll_serializer.rb @@ -12,7 +12,8 @@ class PollSerializer < ApplicationSerializer :options, :voters, :close, - :preloaded_voters + :preloaded_voters, + :chart_type def public true diff --git a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 index 76f06ae027d..0bcf1e2c7d1 100644 --- a/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 +++ b/plugins/poll/assets/javascripts/controllers/poll-ui-builder.js.es6 @@ -2,9 +2,12 @@ import Controller from "@ember/controller"; import { default as computed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; +export const BAR_CHART_TYPE = "bar"; +export const PIE_CHART_TYPE = "pie"; + export default Controller.extend({ regularPollType: "regular", numberPollType: "number", @@ -14,6 +17,10 @@ export default Controller.extend({ votePollResult: "on_vote", closedPollResult: "on_close", staffPollResult: "staff_only", + pollChartTypes: [ + { name: BAR_CHART_TYPE.capitalize(), value: BAR_CHART_TYPE }, + { name: PIE_CHART_TYPE.capitalize(), value: PIE_CHART_TYPE } + ], init() { this._super(...arguments); @@ -38,6 +45,11 @@ export default Controller.extend({ ]; }, + @computed("chartType", "pollType", "numberPollType") + isPie(chartType, pollType, numberPollType) { + return pollType !== numberPollType && chartType === PIE_CHART_TYPE; + }, + @computed( "alwaysPollResult", "votePollResult", @@ -173,6 +185,7 @@ export default Controller.extend({ "pollMax", "pollStep", "autoClose", + "chartType", "date", "time" ) @@ -187,6 +200,7 @@ export default Controller.extend({ pollMax, pollStep, autoClose, + chartType, date, time ) { @@ -212,6 +226,8 @@ export default Controller.extend({ if (pollMax) pollHeader += ` max=${pollMax}`; if (isNumber) pollHeader += ` step=${step}`; if (publicPoll) pollHeader += ` public=true`; + if (chartType && pollType !== "number") + pollHeader += ` chartType=${chartType}`; if (autoClose) { let closeDate = moment( date + " " + time, @@ -306,6 +322,7 @@ export default Controller.extend({ pollMax: null, pollStep: 1, autoClose: false, + chartType: BAR_CHART_TYPE, date: moment() .add(1, "day") .format("YYYY-MM-DD"), diff --git a/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs b/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs index a23eb84e32f..739e0a40dcd 100644 --- a/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs +++ b/plugins/poll/assets/javascripts/discourse/templates/modal/poll-ui-builder.hbs @@ -17,6 +17,15 @@ valueAttribute="value"}} + {{#unless isNumber}} +
+ + {{combo-box content=pollChartTypes + value=chartType + valueAttribute="value"}} +
+ {{/unless}} + {{#if showMinMax}}
@@ -56,12 +65,14 @@ {{input-tip validation=minNumOfOptionsValidation}} {{/unless}} -
- -
+ {{#unless isPie}} +
+ +
+ {{/unless}}