diff --git a/app/assets/javascripts/discourse/controllers/group/members.js.es6 b/app/assets/javascripts/discourse/controllers/group/members.js.es6 new file mode 100644 index 00000000000..bff5ee7a281 --- /dev/null +++ b/app/assets/javascripts/discourse/controllers/group/members.js.es6 @@ -0,0 +1,26 @@ +export default Ember.ObjectController.extend({ + loading: false, + + actions: { + loadMore() { + if (this.get("loading")) { return; } + // we've reached the end + if (this.get("members.length") >= this.get("user_count")) { return; } + + this.set("loading", true); + + const self = this; + + Discourse.Group.loadMembers(this.get("name"), this.get("members.length"), this.get("limit")).then(function (result) { + self.get("members").addObjects(result.members.map(member => Discourse.User.create(member))); + self.setProperties({ + loading: false, + user_count: result.meta.total, + limit: result.meta.limit, + offset: Math.min(result.meta.offset + result.meta.limit, result.meta.total) + }); + }); + } + } +}); + diff --git a/app/assets/javascripts/discourse/models/group.js b/app/assets/javascripts/discourse/models/group.js.es6 similarity index 68% rename from app/assets/javascripts/discourse/models/group.js rename to app/assets/javascripts/discourse/models/group.js.es6 index 5d7ff91c2b3..eaa58e8e0cb 100644 --- a/app/assets/javascripts/discourse/models/group.js +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -1,12 +1,4 @@ -/** - The data model for a Group - - @class Group - @extends Discourse.Model - @namespace Discourse - @module Discourse -**/ -Discourse.Group = Discourse.Model.extend({ +const Group = Discourse.Model.extend({ limit: 50, offset: 0, user_count: 0, @@ -26,28 +18,22 @@ Discourse.Group = Discourse.Model.extend({ if (c > 0) { return c; } }.property('user_count'), - findMembers: function() { + findMembers() { if (Em.isEmpty(this.get('name'))) { return ; } - var self = this, - offset = Math.min(this.get("user_count"), Math.max(this.get("offset"), 0)); + const self = this, offset = Math.min(this.get("user_count"), Math.max(this.get("offset"), 0)); - return Discourse.ajax('/groups/' + this.get('name') + '/members.json', { - data: { - limit: this.get("limit"), - offset: offset - } - }).then(function(result) { + return Discourse.Group.loadMembers(this.get("name"), offset, this.get("limit")).then(function (result) { self.setProperties({ user_count: result.meta.total, limit: result.meta.limit, offset: result.meta.offset, - members: result.members.map(function(member) { return Discourse.User.create(member); }) + members: result.members.map(member => Discourse.User.create(member)) }); }); }, - removeMember: function(member) { + removeMember(member) { var self = this; return Discourse.ajax('/admin/groups/' + this.get('id') + '/members.json', { type: "DELETE", @@ -58,7 +44,7 @@ Discourse.Group = Discourse.Model.extend({ }); }, - addMembers: function(usernames) { + addMembers(usernames) { var self = this; return Discourse.ajax('/admin/groups/' + this.get('id') + '/members.json', { type: "PUT", @@ -69,7 +55,7 @@ Discourse.Group = Discourse.Model.extend({ }); }, - asJSON: function() { + asJSON() { return { name: this.get('name'), alias_level: this.get('alias_level'), @@ -79,23 +65,23 @@ Discourse.Group = Discourse.Model.extend({ }; }, - create: function(){ + create() { var self = this; return Discourse.ajax("/admin/groups", { type: "POST", data: this.asJSON() }).then(function(resp) { self.set('id', resp.basic_group.id); }); }, - save: function(){ + save() { return Discourse.ajax("/admin/groups/" + this.get('id'), { type: "PUT", data: this.asJSON() }); }, - destroy: function(){ + destroy() { if (!this.get('id')) { return; } return Discourse.ajax("/admin/groups/" + this.get('id'), { type: "DELETE" }); }, - findPosts: function(opts) { + findPosts(opts) { opts = opts || {}; var data = {}; @@ -110,22 +96,29 @@ Discourse.Group = Discourse.Model.extend({ } }); -Discourse.Group.reopenClass({ - findAll: function(opts){ +Group.reopenClass({ + findAll(opts) { return Discourse.ajax("/admin/groups.json", { data: opts }).then(function (groups){ - return groups.map(function(g) { return Discourse.Group.create(g); }); + return groups.map(g => Discourse.Group.create(g)); }); }, - findGroupCounts: function(name) { - return Discourse.ajax("/groups/" + name + "/counts.json").then(function (result) { - return Em.Object.create(result.counts); - }); + findGroupCounts(name) { + return Discourse.ajax("/groups/" + name + "/counts.json").then(result => Em.Object.create(result.counts)); }, - find: function(name) { - return Discourse.ajax("/groups/" + name + ".json").then(function (result) { - return Discourse.Group.create(result.basic_group); + find(name) { + return Discourse.ajax("/groups/" + name + ".json").then(result => Discourse.Group.create(result.basic_group)); + }, + + loadMembers(name, offset, limit) { + return Discourse.ajax('/groups/' + name + '/members.json', { + data: { + limit: limit || 50, + offset: offset || 0 + } }); } }); + +export default Group; diff --git a/app/assets/javascripts/discourse/routes/group-members.js.es6 b/app/assets/javascripts/discourse/routes/group-members.js.es6 index e6b207fc436..4713495d8fb 100644 --- a/app/assets/javascripts/discourse/routes/group-members.js.es6 +++ b/app/assets/javascripts/discourse/routes/group-members.js.es6 @@ -1,11 +1,11 @@ import ShowFooter from "discourse/mixins/show-footer"; export default Discourse.Route.extend(ShowFooter, { - model: function() { + model() { return this.modelFor('group'); }, - setupController: function(controller, model) { + setupController(controller, model) { this.controllerFor('group').set('showing', 'members'); controller.set("model", model); model.findMembers(); diff --git a/app/assets/javascripts/discourse/views/group-members.js.es6 b/app/assets/javascripts/discourse/views/group-members.js.es6 new file mode 100644 index 00000000000..9dbfd112a7c --- /dev/null +++ b/app/assets/javascripts/discourse/views/group-members.js.es6 @@ -0,0 +1,5 @@ +import LoadMore from "discourse/mixins/load-more"; + +export default Discourse.View.extend(Discourse.ScrollTop, LoadMore, { + eyelineSelector: '.group-members tr', +});