FEATURE: Staff only poll results (#7984)

* FEATURE: Staff only poll results

These changes allow only staff to see the results of a poll.

Non-staff users will be shown a screen like this:

1b8bd76013.png

The "Votes are public" message has been removed from the info section,
and the button to show the votes has been replaced with a message
stating the results will only be shown to staff.

* Update PR based on feedback

* Update plugins/poll/app/models/poll.rb

make sure we return a boolean

Co-Authored-By: Régis Hanol <regis@hanol.fr>
This commit is contained in:
Blake Erickson 2019-08-15 12:27:18 -06:00 committed by GitHub
parent 00b91de5e8
commit 69498a58e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 36 additions and 10 deletions

View File

@ -24,6 +24,7 @@ class Poll < ActiveRecord::Base
always: 0, always: 0,
on_vote: 1, on_vote: 1,
on_close: 2, on_close: 2,
staff_only: 3,
} }
enum visibility: { enum visibility: {
@ -40,7 +41,10 @@ class Poll < ActiveRecord::Base
end end
def can_see_results?(user) def can_see_results?(user)
always? || is_closed? || (on_vote? && has_voted?(user)) return true if always?
return !!user&.staff? if staff_only?
return has_voted?(user) if on_vote?
is_closed?
end end
def has_voted?(user) def has_voted?(user)

View File

@ -12,6 +12,7 @@ export default Ember.Controller.extend({
alwaysPollResult: "always", alwaysPollResult: "always",
votePollResult: "on_vote", votePollResult: "on_vote",
closedPollResult: "on_close", closedPollResult: "on_close",
staffPollResult: "staff_only",
init() { init() {
this._super(...arguments); this._super(...arguments);
@ -36,8 +37,8 @@ export default Ember.Controller.extend({
]; ];
}, },
@computed("alwaysPollResult", "votePollResult", "closedPollResult") @computed("alwaysPollResult", "votePollResult", "closedPollResult", "staffPollResult")
pollResults(alwaysPollResult, votePollResult, closedPollResult) { pollResults(alwaysPollResult, votePollResult, closedPollResult, staffPollResult) {
return [ return [
{ {
name: I18n.t("poll.ui_builder.poll_result.always"), name: I18n.t("poll.ui_builder.poll_result.always"),
@ -50,6 +51,10 @@ export default Ember.Controller.extend({
{ {
name: I18n.t("poll.ui_builder.poll_result.closed"), name: I18n.t("poll.ui_builder.poll_result.closed"),
value: closedPollResult value: closedPollResult
},
{
name: I18n.t("poll.ui_builder.poll_result.staff"),
value: staffPollResult
} }
]; ];
}, },

View File

@ -402,7 +402,7 @@ createWidget("discourse-poll-info", {
} }
} }
if (!attrs.isClosed && !attrs.showResults && poll.get("public")) { if (!attrs.isClosed && !attrs.showResults && poll.public && (poll.results !== "staff_only")) {
contents.push(infoTextHtml(I18n.t("poll.public.title"))); contents.push(infoTextHtml(I18n.t("poll.public.title")));
} }
@ -418,7 +418,9 @@ createWidget("discourse-poll-buttons", {
const { poll, post } = attrs; const { poll, post } = attrs;
const topicArchived = post.get("topic.archived"); const topicArchived = post.get("topic.archived");
const closed = attrs.isClosed; const closed = attrs.isClosed;
const hideResultsDisabled = closed || topicArchived; const staffOnly = poll.results === "staff_only";
const isStaff = this.currentUser && this.currentUser.staff;
const hideResultsDisabled = !staffOnly && (closed || topicArchived);
if (attrs.isMultiple && !hideResultsDisabled) { if (attrs.isMultiple && !hideResultsDisabled) {
const castVotesDisabled = !attrs.canCastVotes; const castVotesDisabled = !attrs.canCastVotes;
@ -452,6 +454,8 @@ createWidget("discourse-poll-buttons", {
contents.push(infoTextHtml(I18n.t("poll.results.vote.title"))); contents.push(infoTextHtml(I18n.t("poll.results.vote.title")));
} else if (poll.get("results") === "on_close" && !closed) { } else if (poll.get("results") === "on_close" && !closed) {
contents.push(infoTextHtml(I18n.t("poll.results.closed.title"))); contents.push(infoTextHtml(I18n.t("poll.results.closed.title")));
} else if (poll.results === "staff_only" && !isStaff) {
contents.push(infoTextHtml(I18n.t("poll.results.staff.title")));
} else { } else {
contents.push( contents.push(
this.attach("button", { this.attach("button", {
@ -491,7 +495,7 @@ createWidget("discourse-poll-buttons", {
if ( if (
this.currentUser && this.currentUser &&
(this.currentUser.get("id") === post.get("user_id") || (this.currentUser.get("id") === post.get("user_id") ||
this.currentUser.get("staff")) && isStaff) &&
!topicArchived !topicArchived
) { ) {
if (closed) { if (closed) {
@ -536,18 +540,21 @@ export default createWidget("discourse-poll", {
defaultState(attrs) { defaultState(attrs) {
const { post, poll } = attrs; const { post, poll } = attrs;
const staffOnly = attrs.poll.results === "staff_only";
const showResults = const showResults =
post.get("topic.archived") || (post.get("topic.archived") && !staffOnly) ||
this.isClosed() || (this.isClosed() && !staffOnly) ||
(poll.get("results") !== "on_close" && this.hasVoted()); (poll.results !== "on_close" &&
this.hasVoted() && !staffOnly);
return { loading: false, showResults }; return { loading: false, showResults };
}, },
html(attrs, state) { html(attrs, state) {
const staffOnly = attrs.poll.results === "staff_only";
const showResults = const showResults =
state.showResults || attrs.post.get("topic.archived") || this.isClosed(); state.showResults || (attrs.post.get("topic.archived") && !staffOnly) || (this.isClosed() && !staffOnly);
const newAttrs = jQuery.extend({}, attrs, { const newAttrs = jQuery.extend({}, attrs, {
canCastVotes: this.canCastVotes(), canCastVotes: this.canCastVotes(),
@ -722,6 +729,13 @@ export default createWidget("discourse-poll", {
if (attrs.poll.get("results") !== "on_close") { if (attrs.poll.get("results") !== "on_close") {
state.showResults = true; state.showResults = true;
} }
if (attrs.poll.results === "staff_only") {
if (this.currentUser && this.currentUser.get("staff")) {
state.showResults = true;
} else {
state.showResults = false;
}
}
}) })
.catch(error => { .catch(error => {
if (error) { if (error) {

View File

@ -35,6 +35,8 @@ en:
title: "Results will be shown on <strong>vote</strong>." title: "Results will be shown on <strong>vote</strong>."
closed: closed:
title: "Results will be shown once <strong>closed</strong>." title: "Results will be shown once <strong>closed</strong>."
staff:
title: "Results are only shown to <strong>staff</strong> members."
multiple: multiple:
help: help:
@ -96,6 +98,7 @@ en:
always: Always visible always: Always visible
vote: On vote vote: On vote
closed: When closed closed: When closed
staff: Staff only
poll_config: poll_config:
max: Max max: Max
min: Min min: Min