Merge pull request #4622 from dmacjam/master
FEATURE: Append tags bulk action for topics
This commit is contained in:
commit
292dd8623c
|
@ -15,6 +15,7 @@ addBulkButton('showNotificationLevel', 'notification_level');
|
||||||
addBulkButton('resetRead', 'reset_read');
|
addBulkButton('resetRead', 'reset_read');
|
||||||
addBulkButton('unlistTopics', 'unlist_topics');
|
addBulkButton('unlistTopics', 'unlist_topics');
|
||||||
addBulkButton('showTagTopics', 'change_tags');
|
addBulkButton('showTagTopics', 'change_tags');
|
||||||
|
addBulkButton('showAppendTagTopics', 'append_tags');
|
||||||
|
|
||||||
// Modal for performing bulk actions on topics
|
// Modal for performing bulk actions on topics
|
||||||
export default Ember.Controller.extend(ModalFunctionality, {
|
export default Ember.Controller.extend(ModalFunctionality, {
|
||||||
|
@ -78,6 +79,9 @@ export default Ember.Controller.extend(ModalFunctionality, {
|
||||||
actions: {
|
actions: {
|
||||||
showTagTopics() {
|
showTagTopics() {
|
||||||
this.set('tags', '');
|
this.set('tags', '');
|
||||||
|
this.set('action', 'changeTags');
|
||||||
|
this.set('label', 'change_tags');
|
||||||
|
this.set('title', 'choose_new_tags');
|
||||||
this.send('changeBulkTemplate', 'bulk-tag');
|
this.send('changeBulkTemplate', 'bulk-tag');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -85,6 +89,18 @@ export default Ember.Controller.extend(ModalFunctionality, {
|
||||||
this.performAndRefresh({type: 'change_tags', tags: this.get('tags')});
|
this.performAndRefresh({type: 'change_tags', tags: this.get('tags')});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showAppendTagTopics() {
|
||||||
|
this.set('tags', '');
|
||||||
|
this.set('action', 'appendTags');
|
||||||
|
this.set('label', 'append_tags');
|
||||||
|
this.set('title', 'choose_append_tags');
|
||||||
|
this.send('changeBulkTemplate', 'bulk-tag');
|
||||||
|
},
|
||||||
|
|
||||||
|
appendTags() {
|
||||||
|
this.performAndRefresh({type: 'append_tags', tags: this.get('tags')});
|
||||||
|
},
|
||||||
|
|
||||||
showChangeCategory() {
|
showChangeCategory() {
|
||||||
this.send('changeBulkTemplate', 'modal/bulk-change-category');
|
this.send('changeBulkTemplate', 'modal/bulk-change-category');
|
||||||
this.set('modal.modalClass', 'topic-bulk-actions-modal full');
|
this.set('modal.modalClass', 'topic-bulk-actions-modal full');
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<p>{{i18n "topics.bulk.choose_new_tags"}}</p>
|
<p>{{i18n (concat "topics.bulk." title)}}</p>
|
||||||
|
|
||||||
<p>{{tag-chooser tags=tags categoryId=categoryId}}</p>
|
<p>{{tag-chooser tags=tags categoryId=categoryId}}</p>
|
||||||
|
|
||||||
{{d-button action="changeTags" disabled=emptyTags label="topics.bulk.change_tags"}}
|
{{d-button action=action disabled=emptyTags label=(concat "topics.bulk." label)}}
|
||||||
|
|
|
@ -1362,8 +1362,10 @@ en:
|
||||||
selected:
|
selected:
|
||||||
one: "You have selected <b>1</b> topic."
|
one: "You have selected <b>1</b> topic."
|
||||||
other: "You have selected <b>{{count}}</b> topics."
|
other: "You have selected <b>{{count}}</b> topics."
|
||||||
change_tags: "Change Tags"
|
change_tags: "Replace Tags"
|
||||||
|
append_tags: "Append Tags"
|
||||||
choose_new_tags: "Choose new tags for these topics:"
|
choose_new_tags: "Choose new tags for these topics:"
|
||||||
|
choose_append_tags: "Choose new tags to append for these topics:"
|
||||||
changed_tags: "The tags of those topics were changed."
|
changed_tags: "The tags of those topics were changed."
|
||||||
|
|
||||||
none:
|
none:
|
||||||
|
|
|
@ -4,7 +4,7 @@ module DiscourseTagging
|
||||||
TAGS_FILTER_REGEXP = /[\/\?#\[\]@!\$&'\(\)\*\+,;=\.%\\`^\s|\{\}"<>]+/ # /?#[]@!$&'()*+,;=.%\`^|{}"<>
|
TAGS_FILTER_REGEXP = /[\/\?#\[\]@!\$&'\(\)\*\+,;=\.%\\`^\s|\{\}"<>]+/ # /?#[]@!$&'()*+,;=.%\`^|{}"<>
|
||||||
|
|
||||||
|
|
||||||
def self.tag_topic_by_names(topic, guardian, tag_names_arg)
|
def self.tag_topic_by_names(topic, guardian, tag_names_arg, append=false)
|
||||||
if SiteSetting.tagging_enabled
|
if SiteSetting.tagging_enabled
|
||||||
tag_names = DiscourseTagging.tags_for_saving(tag_names_arg, guardian) || []
|
tag_names = DiscourseTagging.tags_for_saving(tag_names_arg, guardian) || []
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ module DiscourseTagging
|
||||||
|
|
||||||
if tag_names.present?
|
if tag_names.present?
|
||||||
category = topic.category
|
category = topic.category
|
||||||
|
tag_names = tag_names + old_tag_names if append
|
||||||
|
|
||||||
# guardian is explicitly nil cause we don't want to strip all
|
# guardian is explicitly nil cause we don't want to strip all
|
||||||
# staff tags that already passed validation
|
# staff tags that already passed validation
|
||||||
|
|
|
@ -11,7 +11,7 @@ class TopicsBulkAction
|
||||||
def self.operations
|
def self.operations
|
||||||
@operations ||= %w(change_category close archive change_notification_level
|
@operations ||= %w(change_category close archive change_notification_level
|
||||||
reset_read dismiss_posts delete unlist archive_messages
|
reset_read dismiss_posts delete unlist archive_messages
|
||||||
move_messages_to_inbox change_tags)
|
move_messages_to_inbox change_tags append_tags)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.register_operation(name, &block)
|
def self.register_operation(name, &block)
|
||||||
|
@ -146,6 +146,20 @@ class TopicsBulkAction
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def append_tags
|
||||||
|
tags = @operation[:tags]
|
||||||
|
tags = DiscourseTagging.tags_for_saving(tags, guardian) if tags.present?
|
||||||
|
|
||||||
|
topics.each do |t|
|
||||||
|
if guardian.can_edit?(t)
|
||||||
|
if tags.present?
|
||||||
|
DiscourseTagging.tag_topic_by_names(t, guardian, tags, append=true)
|
||||||
|
end
|
||||||
|
@changed_ids << t.id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def guardian
|
def guardian
|
||||||
@guardian ||= Guardian.new(@user)
|
@guardian ||= Guardian.new(@user)
|
||||||
end
|
end
|
||||||
|
|
|
@ -232,4 +232,62 @@ describe TopicsBulkAction do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "append tags" do
|
||||||
|
let(:topic) { Fabricate(:topic) }
|
||||||
|
let(:tag1) { Fabricate(:tag) }
|
||||||
|
let(:tag2) { Fabricate(:tag) }
|
||||||
|
let(:tag3) { Fabricate(:tag) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
SiteSetting.tagging_enabled = true
|
||||||
|
SiteSetting.min_trust_level_to_tag_topics = 0
|
||||||
|
topic.tags = [tag1, tag2]
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can append new or existing tags" do
|
||||||
|
SiteSetting.min_trust_to_create_tag = 0
|
||||||
|
tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'append_tags', tags: [tag1.name, tag3.name, 'newtag'])
|
||||||
|
topic_ids = tba.perform!
|
||||||
|
expect(topic_ids).to eq([topic.id])
|
||||||
|
topic.reload
|
||||||
|
expect(topic.tags.map(&:name).sort).to eq([tag1.name, tag2.name, tag3.name, 'newtag'].sort)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can append empty tags" do
|
||||||
|
tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'append_tags', tags: [])
|
||||||
|
topic_ids = tba.perform!
|
||||||
|
expect(topic_ids).to eq([topic.id])
|
||||||
|
topic.reload
|
||||||
|
expect(topic.tags.map(&:name).sort).to eq([tag1.name, tag2.name].sort)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the user can't create new topics" do
|
||||||
|
before do
|
||||||
|
SiteSetting.min_trust_to_create_tag = 4
|
||||||
|
end
|
||||||
|
|
||||||
|
it "can append existing tags but doesn't append new tags" do
|
||||||
|
tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'append_tags', tags: [tag3.name, 'newtag'])
|
||||||
|
topic_ids = tba.perform!
|
||||||
|
expect(topic_ids).to eq([topic.id])
|
||||||
|
topic.reload
|
||||||
|
expect(topic.tags.map(&:name)).to eq([tag1.name, tag2.name, tag3.name])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when user can't edit topic" do
|
||||||
|
before do
|
||||||
|
Guardian.any_instance.expects(:can_edit?).returns(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't change the tags" do
|
||||||
|
tba = TopicsBulkAction.new(topic.user, [topic.id], type: 'append_tags', tags: ['newtag', tag3.name])
|
||||||
|
topic_ids = tba.perform!
|
||||||
|
expect(topic_ids).to eq([])
|
||||||
|
topic.reload
|
||||||
|
expect(topic.tags.map(&:name)).to eq([tag1.name, tag2.name])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue