mirror of
https://github.com/discourse/discourse.git
synced 2025-04-28 23:44:37 +08:00
FIX: select posts
This commit is contained in:
parent
ab80240900
commit
ff227eabe6
@ -1,9 +1,10 @@
|
|||||||
import Presence from 'discourse/mixins/presence';
|
import Presence from 'discourse/mixins/presence';
|
||||||
|
import SelectedPostsCount from 'discourse/mixins/selected-posts-count';
|
||||||
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
||||||
import ObjectController from 'discourse/controllers/object';
|
import ObjectController from 'discourse/controllers/object';
|
||||||
|
|
||||||
// Modal related to changing the ownership of posts
|
// 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'],
|
needs: ['topic'],
|
||||||
|
|
||||||
topicController: Em.computed.alias('controllers.topic'),
|
topicController: Em.computed.alias('controllers.topic'),
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import Presence from 'discourse/mixins/presence';
|
import Presence from 'discourse/mixins/presence';
|
||||||
|
import SelectedPostsCount from 'discourse/mixins/selected-posts-count';
|
||||||
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
||||||
import ObjectController from 'discourse/controllers/object';
|
import ObjectController from 'discourse/controllers/object';
|
||||||
|
|
||||||
// Modal related to merging of topics
|
// Modal related to merging of topics
|
||||||
export default ObjectController.extend(Discourse.SelectedPostsCount, ModalFunctionality, Presence, {
|
export default ObjectController.extend(SelectedPostsCount, ModalFunctionality, Presence, {
|
||||||
needs: ['topic'],
|
needs: ['topic'],
|
||||||
|
|
||||||
topicController: Em.computed.alias('controllers.topic'),
|
topicController: Em.computed.alias('controllers.topic'),
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import Presence from 'discourse/mixins/presence';
|
import Presence from 'discourse/mixins/presence';
|
||||||
|
import SelectedPostsCount from 'discourse/mixins/selected-posts-count';
|
||||||
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
||||||
import ObjectController from 'discourse/controllers/object';
|
import ObjectController from 'discourse/controllers/object';
|
||||||
|
|
||||||
// Modal related to auto closing of topics
|
// Modal related to auto closing of topics
|
||||||
export default ObjectController.extend(Discourse.SelectedPostsCount, ModalFunctionality, Presence, {
|
export default ObjectController.extend(SelectedPostsCount, ModalFunctionality, Presence, {
|
||||||
needs: ['topic'],
|
needs: ['topic'],
|
||||||
|
|
||||||
topicController: Em.computed.alias('controllers.topic'),
|
topicController: Em.computed.alias('controllers.topic'),
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import ObjectController from 'discourse/controllers/object';
|
import ObjectController from 'discourse/controllers/object';
|
||||||
import BufferedContent from 'discourse/mixins/buffered-content';
|
import BufferedContent from 'discourse/mixins/buffered-content';
|
||||||
|
import SelectedPostsCount from 'discourse/mixins/selected-posts-count';
|
||||||
import { spinnerHTML } from 'discourse/helpers/loading-spinner';
|
import { spinnerHTML } from 'discourse/helpers/loading-spinner';
|
||||||
import Topic from 'discourse/models/topic';
|
import Topic from 'discourse/models/topic';
|
||||||
|
|
||||||
export default ObjectController.extend(Discourse.SelectedPostsCount, BufferedContent, {
|
export default ObjectController.extend(SelectedPostsCount, BufferedContent, {
|
||||||
multiSelect: false,
|
multiSelect: false,
|
||||||
needs: ['header', 'modal', 'composer', 'quote-button', 'search', 'topic-progress', 'application'],
|
needs: ['header', 'modal', 'composer', 'quote-button', 'search', 'topic-progress', 'application'],
|
||||||
allPostsSelected: false,
|
allPostsSelected: false,
|
||||||
@ -646,11 +647,8 @@ export default ObjectController.extend(Discourse.SelectedPostsCount, BufferedCon
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
selectedPosts.addObject(post);
|
selectedPosts.addObject(post);
|
||||||
|
|
||||||
// If the user manually selects all posts, all posts are selected
|
// If the user manually selects all posts, all posts are selected
|
||||||
if (selectedPosts.length === this.get('posts_count')) {
|
this.set('allPostsSelected', selectedPosts.length === this.get('model.posts_count'));
|
||||||
this.set('allPostsSelected', true);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,15 +1,9 @@
|
|||||||
/**
|
export default Em.Mixin.create({
|
||||||
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({
|
|
||||||
|
|
||||||
selectedPostsCount: function() {
|
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;
|
var sum = this.get('selectedPosts.length') || 0;
|
||||||
if (this.get('selectedReplies')) {
|
if (this.get('selectedReplies')) {
|
||||||
@ -21,25 +15,18 @@ Discourse.SelectedPostsCount = Em.Mixin.create({
|
|||||||
return sum;
|
return sum;
|
||||||
}.property('selectedPosts.length', 'allPostsSelected', 'selectedReplies.length'),
|
}.property('selectedPosts.length', 'allPostsSelected', 'selectedReplies.length'),
|
||||||
|
|
||||||
/**
|
// The username that owns every selected post, or undefined if no selection or if ownership is mixed.
|
||||||
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
|
|
||||||
**/
|
|
||||||
selectedPostsUsername: function() {
|
selectedPostsUsername: function() {
|
||||||
// Don't proceed if replies are selected or usernames are mixed
|
// Don't proceed if replies are selected or usernames are mixed
|
||||||
// Changing ownership in those cases normally doesn't make sense
|
// Changing ownership in those cases normally doesn't make sense
|
||||||
if (this.get('selectedReplies') && this.get('selectedReplies').length > 0) return;
|
if (this.get('selectedReplies') && this.get('selectedReplies').length > 0) { return; }
|
||||||
if (this.get('selectedPosts').length <= 0) return;
|
if (this.get('selectedPosts').length <= 0) { return; }
|
||||||
|
|
||||||
var selectedPosts = this.get('selectedPosts'),
|
const selectedPosts = this.get('selectedPosts'),
|
||||||
username = selectedPosts[0].username;
|
username = selectedPosts[0].username;
|
||||||
|
|
||||||
if (selectedPosts.every(function(post) { return post.username === username; })) {
|
if (selectedPosts.every(function(post) { return post.username === username; })) {
|
||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
}.property('selectedPosts.length', 'selectedReplies.length')
|
}.property('selectedPosts.length', 'selectedReplies.length')
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
<p>{{count-i18n key=topic.multi_select.description count=selectedPostsCount}}</p>
|
<p>{{count-i18n key="topic.multi_select.description" count=selectedPostsCount}}</p>
|
||||||
|
|
||||||
{{#if canSelectAll}}
|
{{#if canSelectAll}}
|
||||||
<p><a href {{action "selectAll"}}>{{i18n 'topic.multi_select.select_all'}}</a></p>
|
<p><a href {{action "selectAll"}}>{{i18n 'topic.multi_select.select_all'}}</a></p>
|
||||||
@ -9,17 +9,19 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if canDeleteSelected}}
|
{{#if canDeleteSelected}}
|
||||||
<button class='btn' {{action "deleteSelected"}}><i class='fa fa-trash-o'></i> {{i18n 'topic.multi_select.delete'}}</button>
|
{{d-button action="deleteSelected" icon="trash-o" label="topic.multi_select.delete"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if canSplitTopic}}
|
{{#if canSplitTopic}}
|
||||||
<button class='btn' {{action "splitTopic"}}><i class='fa fa-sign-out'></i> {{i18n 'topic.split_topic.action'}}</button>
|
{{d-button action="splitTopic" icon="sign-out" label="topic.split_topic.action"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if canMergeTopic}}
|
{{#if canMergeTopic}}
|
||||||
<button class='btn' {{action "mergeTopic"}}><i class='fa fa-sign-out'></i> {{i18n 'topic.merge_topic.action'}}</button>
|
{{d-button action="mergeTopic" icon="sign-out" label="topic.merge_topic.action"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{#if canChangeOwner}}
|
{{#if canChangeOwner}}
|
||||||
<button class='btn' {{action "changeOwner"}}><i class='fa fa-user'></i> {{i18n 'topic.change_owner.action'}}</button>
|
{{d-button action="changeOwner" icon="user" label="topic.change_owner.action"}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
<p class='cancel'><a href {{action "toggleMultiSelect"}}>{{i18n 'topic.multi_select.cancel'}}</a></p>
|
<p class='cancel'><a href {{action "toggleMultiSelect"}}>{{i18n 'topic.multi_select.cancel'}}</a></p>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
export default Discourse.View.extend({
|
export default Discourse.View.extend({
|
||||||
elementId: 'selected-posts',
|
elementId: 'selected-posts',
|
||||||
topic: Ember.computed.alias('controller.model'),
|
|
||||||
classNameBindings: ['customVisibility'],
|
classNameBindings: ['customVisibility'],
|
||||||
|
templateName: "selected-posts",
|
||||||
|
|
||||||
customVisibility: function() {
|
customVisibility: function() {
|
||||||
if (!this.get('controller.multiSelect')) return 'hidden';
|
if (!this.get('controller.multiSelect')) return 'hidden';
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
import SelectedPostsCount from 'discourse/mixins/selected-posts-count';
|
||||||
import ModalBodyView from "discourse/views/modal-body";
|
import ModalBodyView from "discourse/views/modal-body";
|
||||||
|
|
||||||
export default ModalBodyView.extend(Discourse.SelectedPostsCount, {
|
export default ModalBodyView.extend(SelectedPostsCount, {
|
||||||
templateName: 'modal/split_topic',
|
templateName: 'modal/split_topic',
|
||||||
title: I18n.t('topic.split_topic.title')
|
title: I18n.t('topic.split_topic.title')
|
||||||
});
|
});
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
module("Discourse.SelectedPostsCount");
|
module("SelectedPostsCount");
|
||||||
|
|
||||||
|
import SelectedPostsCount from 'discourse/mixins/selected-posts-count';
|
||||||
import Topic from 'discourse/models/topic';
|
import Topic from 'discourse/models/topic';
|
||||||
|
|
||||||
var buildTestObj = function(params) {
|
var buildTestObj = function(params) {
|
||||||
return Ember.Object.createWithMixins(Discourse.SelectedPostsCount, params || {});
|
return Ember.Object.createWithMixins(SelectedPostsCount, params || {});
|
||||||
};
|
};
|
||||||
|
|
||||||
test("without selectedPosts", function () {
|
test("without selectedPosts", function () {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user