diff --git a/public/language/en-GB/admin/manage/categories.json b/public/language/en-GB/admin/manage/categories.json
index 6aa607612d..758785d689 100644
--- a/public/language/en-GB/admin/manage/categories.json
+++ b/public/language/en-GB/admin/manage/categories.json
@@ -19,6 +19,7 @@
"parent-category-none": "(None)",
"copy-settings": "Copy Settings From",
"optional-clone-settings": "(Optional) Clone Settings From Category",
+ "clone-children": "Clone Children Categories And Settings",
"purge": "Purge Category",
"enable": "Enable",
diff --git a/public/src/admin/manage/categories.js b/public/src/admin/manage/categories.js
index 2cd4914ce0..76504eec6f 100644
--- a/public/src/admin/manage/categories.js
+++ b/public/src/admin/manage/categories.js
@@ -78,12 +78,25 @@ define('admin/manage/categories', ['vendor/jquery/serializeObject/jquery.ba-seri
var formData = modal.find('form').serializeObject();
formData.description = '';
formData.icon = 'fa-comments';
+ formData.uid = app.user.uid;
Categories.create(formData);
modal.modal('hide');
return false;
}
+ $('#cloneChildren').on('change', function () {
+ var check = $(this);
+ var parentSelect = $('#parentCid');
+
+ if (check.prop('checked')) {
+ parentSelect.attr('disabled', 'disabled');
+ parentSelect.val('');
+ } else {
+ parentSelect.removeAttr('disabled');
+ }
+ });
+
modal.find('form').on('submit', submit);
});
});
diff --git a/src/categories/create.js b/src/categories/create.js
index 1d6fc6c09f..c4cf728701 100644
--- a/src/categories/create.js
+++ b/src/categories/create.js
@@ -84,10 +84,24 @@ module.exports = function (Categories) {
], next);
},
function (results, next) {
- if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) {
- return Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid, next);
- }
- next(null, category);
+ async.series([
+ function (next) {
+ if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) {
+ return Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid, next);
+ }
+
+ next();
+ },
+ function (next) {
+ if (data.cloneChildren) {
+ return duplicateCategoriesChildren(category.cid, data.cloneFromCid, data.uid, next);
+ }
+
+ next();
+ },
+ ], function (err) {
+ next(err, category);
+ });
},
function (category, next) {
plugins.fireHook('action:category.create', { category: category });
@@ -96,6 +110,25 @@ module.exports = function (Categories) {
], callback);
};
+ function duplicateCategoriesChildren(parentCid, cid, uid, callback) {
+ Categories.getChildren([cid], uid, function (err, children) {
+ if (err || !children.length) {
+ return callback(err);
+ }
+
+ children = children[0];
+
+ children.forEach(function (child) {
+ child.parentCid = parentCid;
+ child.cloneFromCid = child.cid;
+ child.cloneChildren = true;
+ child.uid = uid;
+ });
+
+ async.each(children, Categories.create, callback);
+ });
+ }
+
Categories.assignColours = function () {
var backgrounds = ['#AB4642', '#DC9656', '#F7CA88', '#A1B56C', '#86C1B9', '#7CAFC2', '#BA8BAF', '#A16946'];
var text = ['#fff', '#fff', '#333', '#fff', '#333', '#fff', '#fff', '#fff'];
diff --git a/src/views/admin/partials/categories/create.tpl b/src/views/admin/partials/categories/create.tpl
index 436705b1d8..7fb0f2484b 100644
--- a/src/views/admin/partials/categories/create.tpl
+++ b/src/views/admin/partials/categories/create.tpl
@@ -21,5 +21,10 @@
+
+
\ No newline at end of file