FEATURE: dynamically load invites

This commit is contained in:
Arpit Jalan 2014-08-01 16:36:31 +05:30
parent 04682335d4
commit 4cd8abc905
8 changed files with 37 additions and 31 deletions

View File

@ -10,6 +10,8 @@ export default Ember.ObjectController.extend({
user: null,
model: null,
totalInvites: null,
canLoadMore: true,
invitesLoading: false,
init: function() {
this._super();
@ -30,13 +32,6 @@ export default Ember.ObjectController.extend({
});
}, 250).observes('searchTerm'),
/**
The maximum amount of invites that will be displayed in the view
@property maxInvites
**/
maxInvites: Discourse.computed.setting('invites_shown'),
/**
Can the currently logged in user invite users to the site
@ -64,15 +59,6 @@ export default Ember.ObjectController.extend({
return this.get('totalInvites') > 9;
}.property('totalInvites'),
/**
Were the results limited by our `maxInvites`
@property truncated
**/
truncated: function() {
return this.get('invites.length') === Discourse.SiteSettings.invites_shown;
}.property('invites.length'),
actions: {
/**
@ -84,6 +70,22 @@ export default Ember.ObjectController.extend({
rescind: function(invite) {
invite.rescind();
return false;
},
loadMore: function() {
var self = this;
var model = self.get('model');
if(self.get('canLoadMore')) {
self.set('invitesLoading', true);
Discourse.Invite.findInvitedBy(self.get('user'), self.get('searchTerm'), model.invites.length).then(function(invite_model) {
self.set('invitesLoading', false);
model.invites.pushObjects(invite_model.invites);
if(invite_model.invites.length === 0 || invite_model.invites.length < Discourse.SiteSettings.invites_per_page) {
self.set('canLoadMore', false);
}
});
}
}
}

View File

@ -29,11 +29,12 @@ Discourse.Invite.reopenClass({
return result;
},
findInvitedBy: function(user, filter) {
findInvitedBy: function(user, filter, offset) {
if (!user) { return Em.RSVP.resolve(); }
var data = {};
if (!Em.isNone(filter)) { data.filter = filter; }
data.offset = offset || 0;
return Discourse.ajax("/users/" + user.get('username_lower') + "/invited.json", {data: data}).then(function (result) {
result.invites = result.invites.map(function (i) {

View File

@ -17,7 +17,7 @@
{{/if}}
{{#if model.invites}}
<table class='table'>
<table class='table invite-list'>
<tr>
<th>{{i18n user.invited.user}}</th>
<th>{{i18n user.invited.redeemed_at}}</th>
@ -62,9 +62,8 @@
</tr>
{{/each}}
</table>
{{#if truncated}}
<p>{{i18n user.invited.truncated count=maxInvites}}</p>
{{#if invitesLoading}}
<div class='spinner'>{{i18n loading}}</div>
{{/if}}
{{else}}

View File

@ -1,3 +1,5 @@
export default Ember.View.extend({
export default Ember.View.extend(Discourse.LoadMore, {
classNames: ['paginated-topics-list'],
eyelineSelector: '.paginated-topics-list .invite-list tr',
templateName: 'user/invited'
});

View File

@ -94,11 +94,12 @@ class UsersController < ApplicationController
def invited
inviter = fetch_user_from_params
offset = params[:offset].to_i || 0
invites = if guardian.can_see_invite_details?(inviter)
Invite.find_all_invites_from(inviter)
Invite.find_all_invites_from(inviter, offset)
else
Invite.find_redeemed_invites_from(inviter)
Invite.find_redeemed_invites_from(inviter, offset)
end
invites = invites.filter_by(params[:filter])

View File

@ -126,18 +126,19 @@ class Invite < ActiveRecord::Base
group_ids
end
def self.find_all_invites_from(inviter)
def self.find_all_invites_from(inviter, offset=0)
Invite.where(invited_by_id: inviter.id)
.includes(:user => :user_stat)
.order('CASE WHEN invites.user_id IS NOT NULL THEN 0 ELSE 1 END',
'user_stats.time_read DESC',
'invites.redeemed_at DESC')
.limit(SiteSetting.invites_shown)
.limit(SiteSetting.invites_per_page)
.offset(offset)
.references('user_stats')
end
def self.find_redeemed_invites_from(inviter)
find_all_invites_from(inviter).where('invites.user_id IS NOT NULL')
def self.find_redeemed_invites_from(inviter, offset=0)
find_all_invites_from(inviter, offset).where('invites.user_id IS NOT NULL')
end
def self.filter_by(email_or_username)

View File

@ -951,7 +951,7 @@ en:
enable_names: "Allow showing user full names. Disable to hide full names."
display_name_on_posts: "Show a user's full name on their posts in addition to their @username."
invites_shown: "Maximum invites shown on the user page."
invites_per_page: "Default invites shown on the user page."
short_progress_text_threshold: "After the number of posts in a topic goes above this number, the progress bar will only show the current post number. If you change the progress bar's width, you may need to change this value."
default_code_lang: "Default programming language syntax highlighting applied to GitHub code blocks (lang-auto, ruby, python etc.)"
warn_reviving_old_topic_age: "When someone starts replying to a topic where the last reply is older than this many days, a warning will be displayed. Disable by setting to 0."

View File

@ -257,9 +257,9 @@ users:
default: true
invite_expiry_days: 30
invite_passthrough_hours: 0
invites_shown:
invites_per_page:
client: true
default: 30
default: 40
delete_user_max_post_age:
client: true
default: 60