From cf889b70bd1c76a2de25cda3afbfcda64e5e771a Mon Sep 17 00:00:00 2001 From: barisusakli Date: Mon, 28 Dec 2015 10:42:15 +0200 Subject: [PATCH] closes #3982 --- public/src/client/topic/move.js | 44 ++++++++++++++++++++++++++++----- src/socket.io/categories.js | 42 +++++++++++++++++++++++++------ 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/public/src/client/topic/move.js b/public/src/client/topic/move.js index daca51a411..d013e1c09d 100644 --- a/public/src/client/topic/move.js +++ b/public/src/client/topic/move.js @@ -15,7 +15,7 @@ define('forum/topic/move', function() { Move.onComplete = onComplete; Move.moveAll = tids ? false : true; - socket.emit('categories.get', onCategoriesLoaded); + socket.emit('categories.getMoveCategories', onCategoriesLoaded); }; function onCategoriesLoaded(err, categories) { @@ -23,8 +23,7 @@ define('forum/topic/move', function() { return app.alertError(err.message); } - parseModal(categories, function(html) { - modal = $(html); + parseModal(categories, function() { modal.on('hidden.bs.modal', function() { modal.remove(); @@ -36,7 +35,7 @@ define('forum/topic/move', function() { modal.find('.modal-header h3').translateText('[[topic:move_topics]]'); } - modal.on('click', '.category-list li[data-cid]', function(e) { + modal.on('click', '.category-list li[data-cid]', function() { selectCategory($(this)); }); @@ -47,8 +46,41 @@ define('forum/topic/move', function() { } function parseModal(categories, callback) { - templates.parse('partials/move_thread_modal', {categories: categories}, function(html) { - translator.translate(html, callback); + templates.parse('partials/move_thread_modal', {categories: []}, function(html) { + translator.translate(html, function(html) { + modal = $(html); + categories.forEach(function(category) { + if (!category.link) { + buildRecursive(modal.find('.category-list'), category, ''); + } + }); + callback(); + }); + }); + } + + function buildRecursive(parentEl, category, level) { + var categoryEl = $('
  • '); + + if (category.bgColor) { + categoryEl.css('background-color', category.bgColor); + } + if (category.color) { + categoryEl.css('color', category.color); + } + categoryEl.toggleClass('disabled', !!category.disabled); + categoryEl.attr('data-cid', category.cid); + categoryEl.html(' ' + category.name); + + parentEl.append(level); + parentEl.append(categoryEl); + parentEl.append('
    '); + + var indent = '      '; + category.children.forEach(function(childCategory) { + if (!childCategory.link) { + buildRecursive(parentEl, childCategory, indent + level); + } }); } diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index 967f51afd1..f9b8f0e3fc 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -1,14 +1,14 @@ 'use strict'; -var async = require('async'), - db = require('../database'), - categories = require('../categories'), - privileges = require('../privileges'), - user = require('../user'), - topics = require('../topics'), - websockets = require('./index'), +var async = require('async'); +var db = require('../database'); +var categories = require('../categories'); +var privileges = require('../privileges'); +var user = require('../user'); +var topics = require('../topics'); - SocketCategories = {}; + +var SocketCategories = {}; SocketCategories.getRecentReplies = function(socket, cid, callback) { categories.getRecentReplies(cid, socket.uid, 4, callback); @@ -141,6 +141,32 @@ SocketCategories.getCategoriesByPrivilege = function(socket, privilege, callback categories.getCategoriesByPrivilege('categories:cid', socket.uid, privilege, callback); }; +SocketCategories.getMoveCategories = function(socket, data, callback) { + async.parallel({ + isAdmin: async.apply(user.isAdministrator, socket.uid), + categories: function(next) { + async.waterfall([ + function (next) { + db.getSortedSetRange('cid:0:children', 0, -1, next); + }, + function (cids, next) { + categories.getCategories(cids, socket.uid, next); + } + ], next); + } + }, function(err, results) { + if (err) { + return callback(err); + } + + results.categories = results.categories.filter(function(category) { + return category && (!category.disabled || results.isAdmin) && !category.link; + }); + + callback(null, results.categories); + }); +}; + SocketCategories.watch = function(socket, cid, callback) { user.watchCategory(socket.uid, cid, function(err) { if (err) {