diff --git a/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 b/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 index 448deec2c0f..2e0907449e4 100644 --- a/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 @@ -1,4 +1,5 @@ export default Ember.Component.extend({ + loadingMore: Ember.computed.alias('topicList.loadingMore'), loading: Ember.computed.not('loaded'), loaded: function() { diff --git a/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 b/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 index 7b7664e7574..c51bf407297 100644 --- a/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 @@ -1,25 +1,62 @@ import computed from 'ember-addons/ember-computed-decorators'; +import Topic from 'discourse/models/topic'; export default Ember.Controller.extend({ + needs: ["user-topics-list"], pmView: false, - privateMessagesActive: Em.computed.equal('pmView', 'index'), - privateMessagesMineActive: Em.computed.equal('pmView', 'mine'), - privateMessagesUnreadActive: Em.computed.equal('pmView', 'unread'), isGroup: Em.computed.equal('pmView', 'groups'), + selected: Em.computed.alias('controllers.user-topics-list.selected'), + bulkSelectEnabled: Em.computed.alias('controllers.user-topics-list.bulkSelectEnabled'), - @computed('model.groups', 'groupFilter', 'pmView') - groupPMStats(groups, filter, pmView) { - if (groups) { - return groups.filter(group => group.has_messages) - .map(g => { - return { - name: g.name, - active: (g.name === filter && pmView === "groups") - }; - }); + @computed('selected.@each', 'bulkSelectEnabled') + hasSelection(selected, bulkSelectEnabled){ + return bulkSelectEnabled && selected && selected.length > 0; + }, + + @computed('hasSelection', 'pmView', 'archive') + canMoveToInbox(hasSelection, pmView, archive){ + return hasSelection && (pmView === "archive" || archive); + }, + + @computed('hasSelection', 'pmView', 'archive') + canArchive(hasSelection, pmView, archive){ + return hasSelection && pmView !== "archive" && !archive; + }, + + + bulkOperation(operation) { + const selected = this.get('selected'); + var params = {type: operation}; + if (this.get('isGroup')) { + params.group = this.get('groupFilter'); + } + + Topic.bulkOperation(selected,params).then(() => { + const model = this.get('controllers.user-topics-list.model'); + const topics = model.get('topics'); + topics.removeObjects(selected); + selected.clear(); + model.loadMore(); + }, () => { + bootbox.alert(I18n.t("user.messages.failed_to_move")); + }); + }, + + actions: { + archive() { + this.bulkOperation("archive_messages"); + }, + toInbox() { + this.bulkOperation("move_messages_to_inbox"); + }, + toggleBulkSelect(){ + this.toggleProperty("bulkSelectEnabled"); + }, + selectAll() { + $('input.bulk-select:not(checked)').click(); } } }); diff --git a/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 b/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 index a0073b7c0e7..a0bcdada168 100644 --- a/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 @@ -17,6 +17,6 @@ export default Ember.Controller.extend({ showNewPM: function(){ return this.get('controllers.user.viewingSelf') && Discourse.User.currentProp('can_send_private_messages'); - }.property('controllers.user.viewingSelf'), + }.property('controllers.user.viewingSelf') }); diff --git a/app/assets/javascripts/discourse/helpers/capitalize.js.es6 b/app/assets/javascripts/discourse/helpers/capitalize.js.es6 new file mode 100644 index 00000000000..97765d0c586 --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/capitalize.js.es6 @@ -0,0 +1,3 @@ +Ember.Handlebars.registerBoundHelper("capitalize", function(str) { + return str[0].toUpperCase() + str.slice(1); +}); diff --git a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 index 39bee49123f..6aa420a88c4 100644 --- a/app/assets/javascripts/discourse/routes/app-route-map.js.es6 +++ b/app/assets/javascripts/discourse/routes/app-route-map.js.es6 @@ -76,9 +76,10 @@ export default function() { this.route('deletedPosts', { path: '/deleted-posts' }); this.resource('userPrivateMessages', { path: '/messages' }, function() { - this.route('mine'); - this.route('unread'); + this.route('sent'); + this.route('archive'); this.route('group', { path: 'group/:name'}); + this.route('groupArchive', { path: 'group/:name/archive'}); }); this.resource('preferences', function() { diff --git a/app/assets/javascripts/discourse/routes/build-private-messages-route.js.es6 b/app/assets/javascripts/discourse/routes/build-private-messages-route.js.es6 index cef72ed152d..4d50c3918be 100644 --- a/app/assets/javascripts/discourse/routes/build-private-messages-route.js.es6 +++ b/app/assets/javascripts/discourse/routes/build-private-messages-route.js.es6 @@ -21,10 +21,13 @@ export default (viewName, path) => { this.controllerFor("user-topics-list").setProperties({ hideCategory: true, - showParticipants: true + showParticipants: true, + canBulkSelect: true, + selected: [] }); - this.controllerFor("userPrivateMessages").set("pmView", viewName); + this.controllerFor("user-private-messages").set("archive", false); + this.controllerFor("user-private-messages").set("pmView", viewName); this.searchService.set('contextType', 'private_messages'); }, diff --git a/app/assets/javascripts/discourse/routes/user-private-messages-unread.js.es6 b/app/assets/javascripts/discourse/routes/user-private-messages-archive.js.es6 similarity index 52% rename from app/assets/javascripts/discourse/routes/user-private-messages-unread.js.es6 rename to app/assets/javascripts/discourse/routes/user-private-messages-archive.js.es6 index 062ef732894..7ebf279b290 100644 --- a/app/assets/javascripts/discourse/routes/user-private-messages-unread.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-private-messages-archive.js.es6 @@ -1,3 +1,3 @@ import createPMRoute from "discourse/routes/build-private-messages-route"; -export default createPMRoute('unread', 'private-messages-unread'); +export default createPMRoute('archive', 'private-messages-archive'); diff --git a/app/assets/javascripts/discourse/routes/user-private-messages-group-archive.js.es6 b/app/assets/javascripts/discourse/routes/user-private-messages-group-archive.js.es6 new file mode 100644 index 00000000000..c4f3a3d9132 --- /dev/null +++ b/app/assets/javascripts/discourse/routes/user-private-messages-group-archive.js.es6 @@ -0,0 +1,18 @@ +import createPMRoute from "discourse/routes/build-private-messages-route"; + +export default createPMRoute('groups', 'private-messages-groups').extend({ + model(params) { + const username = this.modelFor("user").get("username_lower"); + return this.store.findFiltered("topicList", { + filter: `topics/private-messages-group/${username}/${params.name}/archive` + }); + }, + + setupController(controller, model) { + this._super.apply(this, arguments); + const split = model.get("filter").split('/'); + const group = split[split.length-2]; + this.controllerFor("user-private-messages").set("groupFilter", group); + this.controllerFor("user-private-messages").set("archive", true); + } +}); diff --git a/app/assets/javascripts/discourse/routes/user-private-messages-group.js.es6 b/app/assets/javascripts/discourse/routes/user-private-messages-group.js.es6 index 7e962ee8646..ded798bb2d6 100644 --- a/app/assets/javascripts/discourse/routes/user-private-messages-group.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-private-messages-group.js.es6 @@ -1,4 +1,3 @@ -import Group from 'discourse/models/group'; import createPMRoute from "discourse/routes/build-private-messages-route"; export default createPMRoute('groups', 'private-messages-groups').extend({ @@ -9,17 +8,10 @@ export default createPMRoute('groups', 'private-messages-groups').extend({ }); }, - afterModel(model) { - const groupName = _.last(model.get("filter").split('/')); - Group.findAll().then(groups => { - const group = _.first(groups.filterBy("name", groupName)); - this.controllerFor("user-private-messages").set("group", group); - }); - }, - setupController(controller, model) { this._super.apply(this, arguments); const group = _.last(model.get("filter").split('/')); - this.controllerFor("userPrivateMessages").set("groupFilter", group); + this.controllerFor("user-private-messages").set("groupFilter", group); + this.controllerFor("user-private-messages").set("archive", false); } }); diff --git a/app/assets/javascripts/discourse/routes/user-private-messages-mine.js.es6 b/app/assets/javascripts/discourse/routes/user-private-messages-sent.js.es6 similarity index 54% rename from app/assets/javascripts/discourse/routes/user-private-messages-mine.js.es6 rename to app/assets/javascripts/discourse/routes/user-private-messages-sent.js.es6 index b2cf029e5d4..b31c2f4c9fe 100644 --- a/app/assets/javascripts/discourse/routes/user-private-messages-mine.js.es6 +++ b/app/assets/javascripts/discourse/routes/user-private-messages-sent.js.es6 @@ -1,3 +1,3 @@ import createPMRoute from "discourse/routes/build-private-messages-route"; -export default createPMRoute('mine', 'private-messages-sent'); +export default createPMRoute('sent', 'private-messages-sent'); diff --git a/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs b/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs index 6d323d7aabe..59b095c6872 100644 --- a/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs +++ b/app/assets/javascripts/discourse/templates/components/basic-topic-list.hbs @@ -5,10 +5,15 @@ hideCategory=hideCategory topics=topics expandExcerpts=expandExcerpts + bulkSelectEnabled=bulkSelectEnabled + canBulkSelect=canBulkSelect + selected=selected }} {{else}} + {{#unless loadingMore}}