mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-06 15:42:52 +01:00
closes #6216
This commit is contained in:
@@ -140,7 +140,7 @@ module.exports = function (Posts) {
|
||||
db.setObject('topic:' + tid, results.topic, next);
|
||||
},
|
||||
function (next) {
|
||||
topics.updateTags(tid, data.tags, next);
|
||||
topics.updateTopicTags(tid, data.tags, next);
|
||||
},
|
||||
function (next) {
|
||||
topics.getTopicTagsObjects(tid, next);
|
||||
|
||||
@@ -13,11 +13,19 @@ Tags.create = function (socket, data, callback) {
|
||||
};
|
||||
|
||||
Tags.update = function (socket, data, callback) {
|
||||
if (!data) {
|
||||
if (!Array.isArray(data)) {
|
||||
return callback(new Error('[[error:invalid-data]]'));
|
||||
}
|
||||
|
||||
topics.updateTag(data.tag, data, callback);
|
||||
topics.updateTags(data, callback);
|
||||
};
|
||||
|
||||
Tags.rename = function (socket, data, callback) {
|
||||
if (!Array.isArray(data)) {
|
||||
return callback(new Error('[[error:invalid-data]]'));
|
||||
}
|
||||
|
||||
topics.renameTags(data, callback);
|
||||
};
|
||||
|
||||
Tags.deleteTags = function (socket, data, callback) {
|
||||
|
||||
@@ -9,7 +9,7 @@ var meta = require('../meta');
|
||||
var _ = require('lodash');
|
||||
var plugins = require('../plugins');
|
||||
var utils = require('../utils');
|
||||
|
||||
var batch = require('../batch');
|
||||
|
||||
module.exports = function (Topics) {
|
||||
Topics.createTags = function (tags, tid, timestamp, callback) {
|
||||
@@ -96,13 +96,61 @@ module.exports = function (Topics) {
|
||||
], callback);
|
||||
};
|
||||
|
||||
Topics.updateTag = function (tag, data, callback) {
|
||||
if (!tag) {
|
||||
return setImmediate(callback, new Error('[[error:invalid-tag]]'));
|
||||
}
|
||||
db.setObject('tag:' + tag, data, callback);
|
||||
Topics.updateTags = function (data, callback) {
|
||||
async.eachSeries(data, function (tagData, next) {
|
||||
db.setObject('tag:' + tagData.value, {
|
||||
color: tagData.color,
|
||||
bgColor: tagData.bgColor,
|
||||
}, next);
|
||||
}, callback);
|
||||
};
|
||||
|
||||
Topics.renameTags = function (data, callback) {
|
||||
async.eachSeries(data, function (tagData, next) {
|
||||
renameTag(tagData.value, tagData.newName, next);
|
||||
}, callback);
|
||||
};
|
||||
|
||||
function renameTag(tag, newTagName, callback) {
|
||||
if (!newTagName || tag === newTagName) {
|
||||
return setImmediate(callback);
|
||||
}
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
Topics.createEmptyTag(newTagName, next);
|
||||
},
|
||||
function (next) {
|
||||
batch.processSortedSet('tag:' + tag + ':topics', function (tids, next) {
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
db.sortedSetScores('tag:' + tag + ':topics', tids, next);
|
||||
},
|
||||
function (scores, next) {
|
||||
db.sortedSetAdd('tag:' + newTagName + ':topics', scores, tids, next);
|
||||
},
|
||||
function (next) {
|
||||
var keys = tids.map(function (tid) {
|
||||
return 'topic:' + tid + ':tags';
|
||||
});
|
||||
|
||||
async.series([
|
||||
async.apply(db.sortedSetRemove, 'tag:' + tag + ':topics', tids),
|
||||
async.apply(db.setsRemove, keys, tag),
|
||||
async.apply(db.setsAdd, keys, newTagName),
|
||||
], next);
|
||||
},
|
||||
], next);
|
||||
}, next);
|
||||
},
|
||||
function (next) {
|
||||
Topics.deleteTag(tag, next);
|
||||
},
|
||||
function (next) {
|
||||
updateTagCount(newTagName, next);
|
||||
},
|
||||
], callback);
|
||||
}
|
||||
|
||||
function updateTagCount(tag, callback) {
|
||||
callback = callback || function () {};
|
||||
async.waterfall([
|
||||
@@ -148,7 +196,9 @@ module.exports = function (Topics) {
|
||||
return 'tag:' + tag;
|
||||
}), next);
|
||||
},
|
||||
], callback);
|
||||
], function (err) {
|
||||
callback(err);
|
||||
});
|
||||
};
|
||||
|
||||
function removeTagsFromTopics(tags, callback) {
|
||||
@@ -266,7 +316,7 @@ module.exports = function (Topics) {
|
||||
], callback);
|
||||
};
|
||||
|
||||
Topics.updateTags = function (tid, tags, callback) {
|
||||
Topics.updateTopicTags = function (tid, tags, callback) {
|
||||
callback = callback || function () {};
|
||||
async.waterfall([
|
||||
function (next) {
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
<p>[[admin/manage/tags:description]]</p>
|
||||
<button class="btn btn-primary btn-block" id="create">[[admin/manage/tags:create]]</button>
|
||||
<button class="btn btn-primary btn-block" id="modify">[[admin/manage/tags:modify]]</button>
|
||||
<button class="btn btn-primary btn-block" id="rename">[[admin/manage/tags:rename]]</button>
|
||||
<button class="btn btn-warning btn-block" id="deleteSelected">[[admin/manage/tags:delete]]</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -74,4 +75,11 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rename-modal hidden">
|
||||
<div class="form-group">
|
||||
<label for="value">[[admin/manage/tags:name]]</label>
|
||||
<input id="value" data-name="value" value="{tags.value}" class="form-control" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user