diff --git a/app/assets/javascripts/discourse/models/user-stream.js.es6 b/app/assets/javascripts/discourse/models/user-stream.js.es6 index 49c02b4e61e..fc80dc94ef7 100644 --- a/app/assets/javascripts/discourse/models/user-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/user-stream.js.es6 @@ -28,11 +28,21 @@ export default RestModel.extend({ baseUrl: url('itemsLoaded', 'user.username_lower', '/user_actions.json?offset=%@&username=%@'), - filterBy(filter) { - this.setProperties({ filter, itemsLoaded: 0, content: [], lastLoadedUrl: null }); + filterBy(filter, noContentHelpKey) { + this.setProperties({ + filter, + itemsLoaded: 0, + content: [], + noContentHelpKey: noContentHelpKey, + lastLoadedUrl: null + }); return this.findItems(); }, + noContent: function() { + return this.get('loaded') && this.get('content').length === 0; + }.property('loaded', 'content.@each'), + remove(userAction) { // 1) remove the user action from the child groups this.get("content").forEach(function (ua) { @@ -61,6 +71,9 @@ export default RestModel.extend({ if (this.get('filterParam')) { findUrl += "&filter=" + this.get('filterParam'); } + if (this.get('noContentHelpKey')) { + findUrl += "&no_results_help_key=" + this.get('noContentHelpKey'); + } // Don't load the same stream twice. We're probably at the end. const lastLoadedUrl = this.get('lastLoadedUrl'); @@ -69,6 +82,9 @@ export default RestModel.extend({ if (this.get('loading')) { return Ember.RSVP.resolve(); } this.set('loading', true); return ajax(findUrl, {cache: 'false'}).then( function(result) { + if (result && result.no_results_help) { + self.set('noContentHelp', result.no_results_help); + } if (result && result.user_actions) { const copy = Em.A(); result.user_actions.forEach(function(action) { @@ -78,11 +94,11 @@ export default RestModel.extend({ self.get('content').pushObjects(UserAction.collapseStream(copy)); self.setProperties({ - loaded: true, itemsLoaded: self.get('itemsLoaded') + result.user_actions.length }); } }).finally(function() { + self.set('loaded', true); self.set('loading', false); self.set('lastLoadedUrl', findUrl); }); diff --git a/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 index cb14c181538..49ad23d1bc4 100644 --- a/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-activity-bookmarks.js.es6 @@ -2,5 +2,6 @@ import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; export default UserActivityStreamRoute.extend({ - userActionType: UserAction.TYPES["bookmarks"] + userActionType: UserAction.TYPES["bookmarks"], + noContentHelpKey: "user_activity.no_bookmarks" }); diff --git a/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 index 13a0e5b9863..852f67ab27e 100644 --- a/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-activity-likes-given.js.es6 @@ -2,5 +2,6 @@ import UserActivityStreamRoute from "discourse/routes/user-activity-stream"; import UserAction from "discourse/models/user-action"; export default UserActivityStreamRoute.extend({ - userActionType: UserAction.TYPES["likes_given"] + userActionType: UserAction.TYPES["likes_given"], + noContentHelpKey: 'no_likes_given' }); diff --git a/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 b/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 index 7447d712179..4fbf8e4300c 100644 --- a/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-activity-stream.js.es6 @@ -6,7 +6,7 @@ export default Discourse.Route.extend(ViewingActionType, { }, afterModel() { - return this.modelFor("user").get("stream").filterBy(this.get("userActionType")); + return this.modelFor("user").get("stream").filterBy(this.get("userActionType"), this.get("noContentHelpKey")); }, renderTemplate() { diff --git a/app/assets/javascripts/discourse/templates/user/stream.hbs b/app/assets/javascripts/discourse/templates/user/stream.hbs index 0a06e728c81..220ae57ba8a 100644 --- a/app/assets/javascripts/discourse/templates/user/stream.hbs +++ b/app/assets/javascripts/discourse/templates/user/stream.hbs @@ -1,3 +1,8 @@ +{{#if model.noContent}} +
+ {{{model.noContentHelp}}} +
+{{/if}} {{#user-stream stream=model}} {{#each model.content as |item|}} {{stream-item item=item removeBookmark="removeBookmark"}} diff --git a/app/controllers/user_actions_controller.rb b/app/controllers/user_actions_controller.rb index 6ff74ec995d..fea9ec4183f 100644 --- a/app/controllers/user_actions_controller.rb +++ b/app/controllers/user_actions_controller.rb @@ -24,7 +24,21 @@ class UserActionsController < ApplicationController UserAction.stream(opts) end - render_serialized(stream, UserActionSerializer, root: 'user_actions') + stream = stream.to_a + if stream.length == 0 && (help_key = params['no_results_help_key']) + if user.id == guardian.user.try(:id) + help_key += ".self" + else + help_key += ".other" + end + render json: { + user_action: [], + no_results_help: I18n.t(help_key) + } + else + render_serialized(stream, UserActionSerializer, root: 'user_actions') + end + end def show diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 573685dca4f..09e54a10602 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -599,6 +599,14 @@ en: description: 'Vote for this post' long_form: 'voted for this post' + user_activity: + no_bookmarks: + self: "You have no bookmarked posts, bookmarking posts allows you to easily access them later on." + other: "No bookmarks." + no_likes_given: + self: "You have not liked any posts." + other: "No liked posts." + topic_flag_types: spam: title: 'Spam' diff --git a/spec/controllers/user_actions_controller_spec.rb b/spec/controllers/user_actions_controller_spec.rb index a161c2f90d3..ca0c0df4a5c 100644 --- a/spec/controllers/user_actions_controller_spec.rb +++ b/spec/controllers/user_actions_controller_spec.rb @@ -24,6 +24,28 @@ describe UserActionsController do expect(action["post_number"]).to eq(1) end + it 'renders help text if provided for self' do + logged_in = log_in + + xhr :get, :index, filter: UserAction::LIKE, username: logged_in.username, no_results_help_key: "user_activity.no_bookmarks" + + expect(response.status).to eq(200) + parsed = JSON.parse(response.body) + + expect(parsed["no_results_help"]).to eq(I18n.t("user_activity.no_bookmarks.self")) + + end + + it 'renders help text for others' do + user = Fabricate(:user) + xhr :get, :index, filter: UserAction::LIKE, username: user.username, no_results_help_key: "user_activity.no_bookmarks" + + expect(response.status).to eq(200) + parsed = JSON.parse(response.body) + + expect(parsed["no_results_help"]).to eq(I18n.t("user_activity.no_bookmarks.other")) + end + context "queued posts" do context "without access" do let(:user) { Fabricate(:user) }