diff --git a/app/assets/javascripts/discourse/controllers/change-owner.js.es6 b/app/assets/javascripts/discourse/controllers/change-owner.js.es6 index f01dd713aa1..2ba32b23fad 100644 --- a/app/assets/javascripts/discourse/controllers/change-owner.js.es6 +++ b/app/assets/javascripts/discourse/controllers/change-owner.js.es6 @@ -1,9 +1,10 @@ import Presence from 'discourse/mixins/presence'; +import SelectedPostsCount from 'discourse/mixins/selected-posts-count'; import ModalFunctionality from 'discourse/mixins/modal-functionality'; import ObjectController from 'discourse/controllers/object'; // Modal related to changing the ownership of posts -export default ObjectController.extend(Presence, Discourse.SelectedPostsCount, ModalFunctionality, { +export default ObjectController.extend(Presence, SelectedPostsCount, ModalFunctionality, { needs: ['topic'], topicController: Em.computed.alias('controllers.topic'), diff --git a/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 b/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 index b99c31ceba0..c923aaf2dab 100644 --- a/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/merge-topic.js.es6 @@ -1,9 +1,10 @@ import Presence from 'discourse/mixins/presence'; +import SelectedPostsCount from 'discourse/mixins/selected-posts-count'; import ModalFunctionality from 'discourse/mixins/modal-functionality'; import ObjectController from 'discourse/controllers/object'; // Modal related to merging of topics -export default ObjectController.extend(Discourse.SelectedPostsCount, ModalFunctionality, Presence, { +export default ObjectController.extend(SelectedPostsCount, ModalFunctionality, Presence, { needs: ['topic'], topicController: Em.computed.alias('controllers.topic'), diff --git a/app/assets/javascripts/discourse/controllers/split-topic.js.es6 b/app/assets/javascripts/discourse/controllers/split-topic.js.es6 index 1e8d996fdce..98aed2dccea 100644 --- a/app/assets/javascripts/discourse/controllers/split-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/split-topic.js.es6 @@ -1,9 +1,10 @@ import Presence from 'discourse/mixins/presence'; +import SelectedPostsCount from 'discourse/mixins/selected-posts-count'; import ModalFunctionality from 'discourse/mixins/modal-functionality'; import ObjectController from 'discourse/controllers/object'; // Modal related to auto closing of topics -export default ObjectController.extend(Discourse.SelectedPostsCount, ModalFunctionality, Presence, { +export default ObjectController.extend(SelectedPostsCount, ModalFunctionality, Presence, { needs: ['topic'], topicController: Em.computed.alias('controllers.topic'), diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index 394c851d70d..6256857f600 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -1,9 +1,10 @@ import ObjectController from 'discourse/controllers/object'; import BufferedContent from 'discourse/mixins/buffered-content'; +import SelectedPostsCount from 'discourse/mixins/selected-posts-count'; import { spinnerHTML } from 'discourse/helpers/loading-spinner'; import Topic from 'discourse/models/topic'; -export default ObjectController.extend(Discourse.SelectedPostsCount, BufferedContent, { +export default ObjectController.extend(SelectedPostsCount, BufferedContent, { multiSelect: false, needs: ['header', 'modal', 'composer', 'quote-button', 'search', 'topic-progress', 'application'], allPostsSelected: false, @@ -646,11 +647,8 @@ export default ObjectController.extend(Discourse.SelectedPostsCount, BufferedCon return false; } else { selectedPosts.addObject(post); - // If the user manually selects all posts, all posts are selected - if (selectedPosts.length === this.get('posts_count')) { - this.set('allPostsSelected', true); - } + this.set('allPostsSelected', selectedPosts.length === this.get('model.posts_count')); return true; } }, diff --git a/app/assets/javascripts/discourse/mixins/selected_posts_count.js b/app/assets/javascripts/discourse/mixins/selected-posts-count.js.es6 similarity index 52% rename from app/assets/javascripts/discourse/mixins/selected_posts_count.js rename to app/assets/javascripts/discourse/mixins/selected-posts-count.js.es6 index 66be20271e7..31fd617b7ef 100644 --- a/app/assets/javascripts/discourse/mixins/selected_posts_count.js +++ b/app/assets/javascripts/discourse/mixins/selected-posts-count.js.es6 @@ -1,15 +1,9 @@ -/** - This mixin allows a modal to list a selected posts count nicely. - - @class Discourse.SelectedPostsCount - @extends Ember.Mixin - @namespace Discourse - @module Discourse -**/ -Discourse.SelectedPostsCount = Em.Mixin.create({ +export default Em.Mixin.create({ selectedPostsCount: function() { - if (this.get('allPostsSelected')) return this.get('posts_count') || this.get('topic.posts_count'); + if (this.get('allPostsSelected')) { + return this.get('model.posts_count') || this.get('topic.posts_count') || this.get('posts_count'); + } var sum = this.get('selectedPosts.length') || 0; if (this.get('selectedReplies')) { @@ -21,25 +15,18 @@ Discourse.SelectedPostsCount = Em.Mixin.create({ return sum; }.property('selectedPosts.length', 'allPostsSelected', 'selectedReplies.length'), - /** - The username that owns every selected post, or undefined if no selection or if - ownership is mixed. - - @returns {String|undefined} username that owns all selected posts - **/ + // The username that owns every selected post, or undefined if no selection or if ownership is mixed. selectedPostsUsername: function() { // Don't proceed if replies are selected or usernames are mixed // Changing ownership in those cases normally doesn't make sense - if (this.get('selectedReplies') && this.get('selectedReplies').length > 0) return; - if (this.get('selectedPosts').length <= 0) return; + if (this.get('selectedReplies') && this.get('selectedReplies').length > 0) { return; } + if (this.get('selectedPosts').length <= 0) { return; } - var selectedPosts = this.get('selectedPosts'), - username = selectedPosts[0].username; + const selectedPosts = this.get('selectedPosts'), + username = selectedPosts[0].username; if (selectedPosts.every(function(post) { return post.username === username; })) { return username; } }.property('selectedPosts.length', 'selectedReplies.length') }); - - diff --git a/app/assets/javascripts/discourse/templates/selected-posts.hbs b/app/assets/javascripts/discourse/templates/selected-posts.hbs index 73d0ed74986..1d87a7d29eb 100644 --- a/app/assets/javascripts/discourse/templates/selected-posts.hbs +++ b/app/assets/javascripts/discourse/templates/selected-posts.hbs @@ -1,4 +1,4 @@ -

{{count-i18n key=topic.multi_select.description count=selectedPostsCount}}

+

{{count-i18n key="topic.multi_select.description" count=selectedPostsCount}}

{{#if canSelectAll}}

{{i18n 'topic.multi_select.select_all'}}

@@ -9,17 +9,19 @@ {{/if}} {{#if canDeleteSelected}} - + {{d-button action="deleteSelected" icon="trash-o" label="topic.multi_select.delete"}} {{/if}} {{#if canSplitTopic}} - + {{d-button action="splitTopic" icon="sign-out" label="topic.split_topic.action"}} {{/if}} + {{#if canMergeTopic}} - + {{d-button action="mergeTopic" icon="sign-out" label="topic.merge_topic.action"}} {{/if}} + {{#if canChangeOwner}} - + {{d-button action="changeOwner" icon="user" label="topic.change_owner.action"}} {{/if}}

{{i18n 'topic.multi_select.cancel'}}

diff --git a/app/assets/javascripts/discourse/views/selected-posts.js.es6 b/app/assets/javascripts/discourse/views/selected-posts.js.es6 index d548c022138..d173337d752 100644 --- a/app/assets/javascripts/discourse/views/selected-posts.js.es6 +++ b/app/assets/javascripts/discourse/views/selected-posts.js.es6 @@ -1,7 +1,7 @@ export default Discourse.View.extend({ elementId: 'selected-posts', - topic: Ember.computed.alias('controller.model'), classNameBindings: ['customVisibility'], + templateName: "selected-posts", customVisibility: function() { if (!this.get('controller.multiSelect')) return 'hidden'; diff --git a/app/assets/javascripts/discourse/views/split-topic.js.es6 b/app/assets/javascripts/discourse/views/split-topic.js.es6 index 1c5be40e944..5ee0d765548 100644 --- a/app/assets/javascripts/discourse/views/split-topic.js.es6 +++ b/app/assets/javascripts/discourse/views/split-topic.js.es6 @@ -1,6 +1,7 @@ +import SelectedPostsCount from 'discourse/mixins/selected-posts-count'; import ModalBodyView from "discourse/views/modal-body"; -export default ModalBodyView.extend(Discourse.SelectedPostsCount, { +export default ModalBodyView.extend(SelectedPostsCount, { templateName: 'modal/split_topic', title: I18n.t('topic.split_topic.title') }); diff --git a/test/javascripts/mixins/selected-posts-count-test.js.es6 b/test/javascripts/mixins/selected-posts-count-test.js.es6 index 830d9033ee4..9533acdce5a 100644 --- a/test/javascripts/mixins/selected-posts-count-test.js.es6 +++ b/test/javascripts/mixins/selected-posts-count-test.js.es6 @@ -1,9 +1,10 @@ -module("Discourse.SelectedPostsCount"); +module("SelectedPostsCount"); +import SelectedPostsCount from 'discourse/mixins/selected-posts-count'; import Topic from 'discourse/models/topic'; var buildTestObj = function(params) { - return Ember.Object.createWithMixins(Discourse.SelectedPostsCount, params || {}); + return Ember.Object.createWithMixins(SelectedPostsCount, params || {}); }; test("without selectedPosts", function () {