diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 1ca81906de..337938b4dd 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -9,11 +9,12 @@ var dependencies = [ 'composer/formatting', 'composer/drafts', 'composer/tags', + 'composer/categoryList', 'composer/preview', 'composer/resize' ]; -define('composer', dependencies, function(taskbar, controls, uploads, formatting, drafts, tags, preview, resize) { +define('composer', dependencies, function(taskbar, controls, uploads, formatting, drafts, tags, categoryList, preview, resize) { var composer = { active: undefined, posts: {}, @@ -200,84 +201,96 @@ define('composer', dependencies, function(taskbar, controls, uploads, formatting var template = (composer.bsEnvironment === 'xs' || composer.bsEnvironment === 'sm') ? 'composer-mobile' : 'composer'; - templates.parse(template, {allowTopicsThumbnail: allowTopicsThumbnail, showTags: isTopic || isMain}, function(composerTemplate) { - translator.translate(composerTemplate, function(composerTemplate) { - composerTemplate = $(composerTemplate); + var data = { + allowTopicsThumbnail: allowTopicsThumbnail, + showTags: isTopic || isMain, + isTopic: isTopic + }; - composerTemplate.attr('id', 'cmp-uuid-' + post_uuid); + parseAndTranslate(template, data, function(composerTemplate) { - $(document.body).append(composerTemplate); + composerTemplate = $(composerTemplate); - var postContainer = $(composerTemplate[0]), - postData = composer.posts[post_uuid], - bodyEl = postContainer.find('textarea'), - draft = drafts.getDraft(postData.save_id); + composerTemplate.attr('id', 'cmp-uuid-' + post_uuid); - tags.init(postContainer, composer.posts[post_uuid]); - updateTitle(postData, postContainer); + $(document.body).append(composerTemplate); - activate(post_uuid); - resize.reposition(postContainer); + var postContainer = $(composerTemplate[0]), + postData = composer.posts[post_uuid], + bodyEl = postContainer.find('textarea'), + draft = drafts.getDraft(postData.save_id); - if (config.allowFileUploads || config.hasImageUploadPlugin) { - uploads.initialize(post_uuid); - } + tags.init(postContainer, composer.posts[post_uuid]); + categoryList.init(postContainer, composer.posts[post_uuid]); + updateTitle(postData, postContainer); - formatting.addHandler(postContainer); + activate(post_uuid); + resize.reposition(postContainer); - if (allowTopicsThumbnail) { - uploads.toggleThumbEls(postContainer, composer.posts[post_uuid].topic_thumb || ''); - } + if (config.allowFileUploads || config.hasImageUploadPlugin) { + uploads.initialize(post_uuid); + } - postContainer.on('change', 'input, textarea', function() { - composer.posts[post_uuid].modified = true; - }); + formatting.addHandler(postContainer); - postContainer.on('click', '.action-bar button[data-action="post"]', function() { - $(this).attr('disabled', true); - post(post_uuid); - }); + if (allowTopicsThumbnail) { + uploads.toggleThumbEls(postContainer, composer.posts[post_uuid].topic_thumb || ''); + } - postContainer.on('click', '.action-bar button[data-action="discard"]', function() { - if (!composer.posts[post_uuid].modified) { - discard(post_uuid); - return; - } + postContainer.on('change', 'input, textarea', function() { + composer.posts[post_uuid].modified = true; + }); - translator.translate('[[modules:composer.discard]]', function(translated) { - bootbox.confirm(translated, function(confirm) { - if (confirm) { - discard(post_uuid); - } - }); - }); - }); + postContainer.on('click', '.action-bar button[data-action="post"]', function() { + $(this).attr('disabled', true); + post(post_uuid); + }); - bodyEl.on('input propertychange', function() { - preview.render(postContainer); - }); + postContainer.on('click', '.action-bar button[data-action="discard"]', function() { + if (!composer.posts[post_uuid].modified) { + discard(post_uuid); + return; + } - bodyEl.on('scroll', function() { - preview.matchScroll(postContainer); + translator.translate('[[modules:composer.discard]]', function(translated) { + bootbox.confirm(translated, function(confirm) { + if (confirm) { + discard(post_uuid); + } + }); }); + }); - bodyEl.val(draft ? draft : postData.body); - preview.render(postContainer, function() { - preview.matchScroll(postContainer); - }); - drafts.init(postContainer, postData); + bodyEl.on('input propertychange', function() { + preview.render(postContainer); + }); + + bodyEl.on('scroll', function() { + preview.matchScroll(postContainer); + }); - resize.handleResize(postContainer); + bodyEl.val(draft ? draft : postData.body); + preview.render(postContainer, function() { + preview.matchScroll(postContainer); + }); + drafts.init(postContainer, postData); - handleHelp(postContainer); + resize.handleResize(postContainer); - $(window).trigger('action:composer.loaded', { - post_uuid: post_uuid - }); + handleHelp(postContainer); - formatting.addComposerButtons(); - focusElements(postContainer); + $(window).trigger('action:composer.loaded', { + post_uuid: post_uuid }); + + formatting.addComposerButtons(); + focusElements(postContainer); + }); + } + + function parseAndTranslate(template, data, callback) { + templates.parse(template, data, function(composerTemplate) { + translator.translate(composerTemplate, callback); }); } diff --git a/public/src/modules/composer/categoryList.js b/public/src/modules/composer/categoryList.js new file mode 100644 index 0000000000..776e435bc9 --- /dev/null +++ b/public/src/modules/composer/categoryList.js @@ -0,0 +1,37 @@ + +'use strict'; + +/*globals define, config, socket, app*/ + +define('composer/categoryList', function() { + var categoryList = {}; + + categoryList.init = function(postContainer, postData) { + var listEl = postContainer.find('.category-list'); + if (!listEl.length) { + return; + } + + socket.emit('categories.getCategoriesByPrivilege', 'topics:create', function(err, categories) { + if (err) { + return app.alertError(err.message); + } + + categories.forEach(function(category) { + $('').appendTo(listEl); + }); + + if (postData.cid) { + listEl.find('option[value="' + postData.cid + '"]').prop('selected', true); + } + }); + + listEl.on('change', function() { + if (postData.cid) { + postData.cid = this.value; + } + }); + }; + + return categoryList; +}); diff --git a/public/src/modules/composer/resize.js b/public/src/modules/composer/resize.js index a544aaf9b6..75382b2b6e 100644 --- a/public/src/modules/composer/resize.js +++ b/public/src/modules/composer/resize.js @@ -137,8 +137,8 @@ define('composer/resize', function() { function resizeWritePreview(postContainer) { - var h1 = postContainer.find('.title').outerHeight(true); - var h2 = postContainer.find('.tags-container').outerHeight(true); + var h1 = postContainer.find('.title-container').outerHeight(true); + var h2 = postContainer.find('.category-tag-row').outerHeight(true); var h3 = postContainer.find('.formatting-bar').outerHeight(true); var h4 = postContainer.find('.topic-thumb-container').outerHeight(true); var h5 = $('.taskbar').height(); diff --git a/src/categories.js b/src/categories.js index bf42392596..eae19b4595 100644 --- a/src/categories.js +++ b/src/categories.js @@ -188,7 +188,7 @@ var db = require('./database'), }); }; - Categories.getVisibleCategories = function(uid, callback) { + Categories.getCategoriesByPrivilege = function(uid, privilege, callback) { db.getSortedSetRange('categories:cid', 0, -1, function(err, cids) { if (err) { return callback(err); @@ -198,7 +198,7 @@ var db = require('./database'), return callback(null, []); } - privileges.categories.filter('find', cids, uid, function(err, cids) { + privileges.categories.filter(privilege, cids, uid, function(err, cids) { if (err) { return callback(err); } diff --git a/src/controllers/index.js b/src/controllers/index.js index 31c8348fb5..8a6ca21459 100644 --- a/src/controllers/index.js +++ b/src/controllers/index.js @@ -64,7 +64,7 @@ Controllers.home = function(req, res, next) { }, categories: function (next) { var uid = req.user ? req.user.uid : 0; - categories.getVisibleCategories(uid, function (err, categoryData) { + categories.getCategoriesByPrivilege(uid, 'find', function (err, categoryData) { if (err) { return next(err); } diff --git a/src/sitemap.js b/src/sitemap.js index e01a2cde3e..5db793a128 100644 --- a/src/sitemap.js +++ b/src/sitemap.js @@ -31,7 +31,7 @@ var path = require('path'), async.parallel([ function(next) { var categoryUrls = []; - categories.getVisibleCategories(0, function(err, categoriesData) { + categories.getCategoriesByPrivilege(0, 'find', function(err, categoriesData) { if (err) { return next(err); } diff --git a/src/socket.io/categories.js b/src/socket.io/categories.js index c594361589..4cac4beb56 100644 --- a/src/socket.io/categories.js +++ b/src/socket.io/categories.js @@ -79,4 +79,8 @@ SocketCategories.getUsersInCategory = function(socket, cid, callback) { user.getMultipleUserFields(uids, ['uid', 'userslug', 'username', 'picture'], callback); }; +SocketCategories.getCategoriesByPrivilege = function(socket, privilege, callback) { + categories.getCategoriesByPrivilege(socket.uid, privilege, callback); +}; + module.exports = SocketCategories;