From 2aa309b0706068889493307c2452486f4fc17a5d Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 1 Apr 2022 15:37:08 +0000 Subject: [PATCH] FEATURE: Improve blank page syndrome (#110) --- .discourse-compatibility | 1 + .../routes/user-activity-votes.js.es6 | 27 ++++++++++-- config/locales/client.en.yml | 2 + .../user-activity-votes-test.js.es6 | 42 +++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 .discourse-compatibility create mode 100644 test/javascripts/acceptance/user-activity-votes-test.js.es6 diff --git a/.discourse-compatibility b/.discourse-compatibility new file mode 100644 index 0000000..f28a969 --- /dev/null +++ b/.discourse-compatibility @@ -0,0 +1 @@ +2.9.0.beta3: 2de1fe5df1a5c25ad1e0e31e8d28adca315d9092 diff --git a/assets/javascripts/discourse/routes/user-activity-votes.js.es6 b/assets/javascripts/discourse/routes/user-activity-votes.js.es6 index b1c8d0d..df332e2 100644 --- a/assets/javascripts/discourse/routes/user-activity-votes.js.es6 +++ b/assets/javascripts/discourse/routes/user-activity-votes.js.es6 @@ -1,12 +1,31 @@ import UserTopicListRoute from "discourse/routes/user-topic-list"; import UserAction from "discourse/models/user-action"; +import I18n from "I18n"; export default UserTopicListRoute.extend({ userActionType: UserAction.TYPES.topics, - model: function () { - return this.store.findFiltered("topicList", { - filter: "topics/voted-by/" + this.modelFor("user").get("username_lower"), - }); + model() { + return this.store + .findFiltered("topicList", { + filter: + "topics/voted-by/" + this.modelFor("user").get("username_lower"), + }) + .then((model) => { + model.set("emptyState", this.emptyState()); + return model; + }); + }, + + emptyState() { + const user = this.modelFor("user"); + const title = this.isCurrentUser(user) + ? I18n.t("voting.no_votes_title_self") + : I18n.t("voting.no_votes_title_others", { username: user.username }); + + return { + title: title, + body: "", + }; }, }); diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 2d9f328..545006b 100755 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -28,6 +28,8 @@ en: one: "Vote" other: "Votes" remove_vote: "Remove vote" + no_votes_title_self: "You haven't voted for any topic yet" + no_votes_title_others: "%{username} hasn't voted for any topic yet" filters: votes: title: "Votes" diff --git a/test/javascripts/acceptance/user-activity-votes-test.js.es6 b/test/javascripts/acceptance/user-activity-votes-test.js.es6 new file mode 100644 index 0000000..e94ed93 --- /dev/null +++ b/test/javascripts/acceptance/user-activity-votes-test.js.es6 @@ -0,0 +1,42 @@ +import { acceptance, query } from "discourse/tests/helpers/qunit-helpers"; +import { test } from "qunit"; +import { visit } from "@ember/test-helpers"; +import I18n from "I18n"; + +acceptance( + "Discourse Voting Plugin | /activity/votes | empty state", + function (needs) { + const currentUser = "eviltrout"; + const anotherUser = "charlie"; + + needs.user(); + + needs.pretender((server, helper) => { + const emptyResponse = { topic_list: { topics: [] } }; + + server.get(`/topics/voted-by/${currentUser}.json`, () => { + return helper.response(emptyResponse); + }); + + server.get(`/topics/voted-by/${anotherUser}.json`, () => { + return helper.response(emptyResponse); + }); + }); + + test("When looking at the own activity page", async function (assert) { + await visit(`/u/${currentUser}/activity/votes`); + assert.equal( + query("div.empty-state span.empty-state-title").innerText, + I18n.t("voting.no_votes_title_self") + ); + }); + + test("When looking at another user's activity page", async function (assert) { + await visit(`/u/${anotherUser}/activity/votes`); + assert.equal( + query("div.empty-state span.empty-state-title").innerText, + I18n.t("voting.no_votes_title_others", { username: anotherUser }) + ); + }); + } +);