diff --git a/package.json b/package.json index b4901f90e3..36eb5840ca 100644 --- a/package.json +++ b/package.json @@ -41,13 +41,13 @@ "nconf": "~0.7.1", "nodebb-plugin-dbsearch": "^0.2.1", "nodebb-plugin-emoji-extended": "^0.4.1-4", - "nodebb-plugin-markdown": "^1.0.0", + "nodebb-plugin-markdown": "^2.1.0", "nodebb-plugin-mentions": "^0.11.0", "nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", "nodebb-theme-lavender": "^1.0.22", "nodebb-theme-vanilla": "^1.0.80", - "nodebb-widget-essentials": "~0.2.12", + "nodebb-widget-essentials": "^1.0.0", "nodebb-rewards-essentials": "^0.0.1", "npm": "^2.1.4", "passport": "^0.2.1", diff --git a/public/src/admin/general/navigation.js b/public/src/admin/general/navigation.js index 9bd684ec80..c98b9fa7be 100644 --- a/public/src/admin/general/navigation.js +++ b/public/src/admin/general/navigation.js @@ -1,7 +1,7 @@ "use strict"; -/* global define, app, ajaxify, socket, templates, bootbox, translator */ +/* global define, app, ajaxify, socket, templates, bootbox */ -define('admin/general/navigation', function() { +define('admin/general/navigation', ['translator'], function(translator) { var navigation = {}, available; diff --git a/public/src/admin/manage/groups.js b/public/src/admin/manage/groups.js index ed8cc59683..f604bc9387 100644 --- a/public/src/admin/manage/groups.js +++ b/public/src/admin/manage/groups.js @@ -1,10 +1,11 @@ "use strict"; -/*global define, templates, socket, ajaxify, app, admin, bootbox, utils, config, translator */ +/*global define, templates, socket, ajaxify, app, admin, bootbox, utils, config */ define('admin/manage/groups', [ 'iconSelect', - 'admin/modules/colorpicker' -], function(iconSelect, colorpicker) { + 'admin/modules/colorpicker', + 'translator' +], function(iconSelect, colorpicker, translator) { var Groups = {}; Groups.init = function() { diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index ed5d3e8b69..9f06d03cb3 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -4,11 +4,19 @@ var ajaxify = ajaxify || {}; $(document).ready(function() { - /*global app, templates, utils, socket, translator, config, RELATIVE_PATH*/ + /*global app, templates, utils, socket, config, RELATIVE_PATH*/ var location = document.location || window.location, rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), - apiXHR = null; + apiXHR = null, + + translator; + + // Dumb hack to fool ajaxify into thinking translator is still a global + // When ajaxify is migrated to a require.js module, then this can be merged into the "define" call + require(['translator'], function(_translator) { + translator = _translator; + }); $(window).on('popstate', function (ev) { ev = ev.originalEvent; @@ -49,11 +57,9 @@ $(document).ready(function() { app.template = data.template.name; - translator.load(config.defaultLang, data.template.name); - - renderTemplate(url, data.template.name, data, callback); - - require(['search'], function(search) { + require(['translator', 'search'], function(translator, search) { + translator.load(config.defaultLang, data.template.name); + renderTemplate(url, data.template.name, data, callback); search.topicDOM.end(); }); }); diff --git a/public/src/app.js b/public/src/app.js index dadf141702..4f2c848c0b 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -1,5 +1,5 @@ "use strict"; -/*global io, templates, translator, ajaxify, utils, bootbox, RELATIVE_PATH, config, Visibility*/ +/*global io, templates, ajaxify, utils, bootbox, RELATIVE_PATH, config, Visibility*/ var socket, app = app || {}; @@ -310,18 +310,20 @@ app.cacheBuster = null; titleObj.titles[0] = window.document.title; } - translator.translate(title, function(translated) { - titleObj.titles[1] = translated; - if (titleObj.interval) { - clearInterval(titleObj.interval); - } - - titleObj.interval = setInterval(function() { - var title = titleObj.titles[titleObj.titles.indexOf(window.document.title) ^ 1]; - if (title) { - window.document.title = $('
').html(title).text(); + require(['translator'], function(translator) { + translator.translate(title, function(translated) { + titleObj.titles[1] = translated; + if (titleObj.interval) { + clearInterval(titleObj.interval); } - }, 2000); + + titleObj.interval = setInterval(function() { + var title = titleObj.titles[titleObj.titles.indexOf(window.document.title) ^ 1]; + if (title) { + window.document.title = $('').html(title).text(); + } + }, 2000); + }); }); } else { if (titleObj.interval) { @@ -458,14 +460,6 @@ app.cacheBuster = null; }); } - function collapseNavigationOnClick() { - $('#nav-dropdown').off('click').on('click', '#main-nav a, #user-control-list a, #logged-out-menu li a, #logged-in-menu .visible-xs, #chat-list a', function() { - if($('.navbar .navbar-collapse').hasClass('in')) { - $('.navbar-header button').click(); - } - }); - } - function handleStatusChange() { $('#user-control-list .user-status').off('click').on('click', function(e) { var status = $(this).attr('data-status'); @@ -479,19 +473,39 @@ app.cacheBuster = null; }); } + function handleNewTopic() { + $('#content').on('click', '#new_topic', function() { + require(['composer'], function(composer) { + var cid = ajaxify.variables.get('category_id'); + if (cid) { + composer.newTopic(cid); + } else { + socket.emit('categories.getCategoriesByPrivilege', 'topics:create', function(err, categories) { + if (err) { + return app.alertError(err.message); + } + if (categories.length) { + composer.newTopic(categories[0].cid); + } + }); + } + }); + }); + } + app.load = function() { $('document').ready(function () { var url = ajaxify.start(window.location.pathname.slice(1), true, window.location.search); ajaxify.end(url, app.template); - collapseNavigationOnClick(); - handleStatusChange(); if (config.searchEnabled) { handleSearch(); } + handleNewTopic(); + $('#logout-link').on('click', app.logout); Visibility.change(function(e, state){ diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 86e5d1f66d..d090b0282a 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, ajaxify, socket, app, config, utils, translator, bootbox */ +/* globals define, ajaxify, socket, app, config, utils, bootbox */ -define('forum/account/edit', ['forum/account/header', 'uploader'], function(header, uploader) { +define('forum/account/edit', ['forum/account/header', 'uploader', 'translator'], function(header, uploader, translator) { var AccountEdit = {}, gravatarPicture = '', uploadedPicture = '', diff --git a/public/src/client/account/profile.js b/public/src/client/account/profile.js index 5bbf48fe85..b65b998d60 100644 --- a/public/src/client/account/profile.js +++ b/public/src/client/account/profile.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, ajaxify, app, utils, socket, translator*/ +/* globals define, ajaxify, app, utils, socket */ -define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll'], function(header, infinitescroll) { +define('forum/account/profile', ['forum/account/header', 'forum/infinitescroll', 'translator'], function(header, infinitescroll, translator) { var Account = {}, yourid, theirid, diff --git a/public/src/client/categories.js b/public/src/client/categories.js index e3882ff831..f3ec819130 100644 --- a/public/src/client/categories.js +++ b/public/src/client/categories.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, socket, app, templates, translator, ajaxify*/ +/* globals define, socket, app, templates, ajaxify*/ -define('forum/categories', function() { +define('forum/categories', ['components', 'translator'], function(components, translator) { var categories = {}; $(window).on('action:ajaxify.start', function(ev, data) { diff --git a/public/src/client/category.js b/public/src/client/category.js index 1e6c0e94c4..c74141feec 100644 --- a/public/src/client/category.js +++ b/public/src/client/category.js @@ -1,5 +1,5 @@ "use strict"; -/* global define, config, templates, app, utils, ajaxify, socket, translator */ +/* global define, config, templates, app, utils, ajaxify, socket */ define('forum/category', [ 'composer', @@ -8,8 +8,10 @@ define('forum/category', [ 'share', 'navigator', 'forum/categoryTools', - 'sort' -], function(composer, pagination, infinitescroll, share, navigator, categoryTools, sort) { + 'sort', + 'components', + 'translator' +], function(composer, pagination, infinitescroll, share, navigator, categoryTools, sort, components, translator) { var Category = {}; $(window).on('action:ajaxify.start', function(ev, data) { @@ -32,10 +34,6 @@ define('forum/category', [ share.addShareHandlers(ajaxify.variables.get('category_name')); - $('#new_post').on('click', function () { - composer.newTopic(cid); - }); - socket.removeListener('event:new_topic', Category.onNewTopic); socket.on('event:new_topic', Category.onNewTopic); diff --git a/public/src/client/categoryTools.js b/public/src/client/categoryTools.js index e711bce436..d5e69d1312 100644 --- a/public/src/client/categoryTools.js +++ b/public/src/client/categoryTools.js @@ -1,10 +1,10 @@ 'use strict'; -/* globals define, app, translator, socket, bootbox, ajaxify */ +/* globals define, app, socket, bootbox, ajaxify */ -define('forum/categoryTools', ['forum/topic/move', 'topicSelect'], function(move, topicSelect) { +define('forum/categoryTools', ['forum/topic/move', 'topicSelect', 'components', 'translator'], function(move, topicSelect, components, translator) { var CategoryTools = {}; diff --git a/public/src/client/chats.js b/public/src/client/chats.js index 9ea8beea57..d506d81654 100644 --- a/public/src/client/chats.js +++ b/public/src/client/chats.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, app, ajaxify, utils, socket, templates, translator */ +/* globals define, app, ajaxify, utils, socket, templates */ -define('forum/chats', ['string', 'sounds', 'forum/infinitescroll'], function(S, sounds, infinitescroll) { +define('forum/chats', ['string', 'sounds', 'forum/infinitescroll', 'translator'], function(S, sounds, infinitescroll, translator) { var Chats = { initialised: false }; diff --git a/public/src/client/footer.js b/public/src/client/footer.js index 4e7c2fa9ee..5e39ac142c 100644 --- a/public/src/client/footer.js +++ b/public/src/client/footer.js @@ -1,7 +1,7 @@ "use strict"; -/*globals define, app, translator, socket*/ +/*globals define, app, socket*/ -define('forum/footer', ['notifications', 'chat'], function(Notifications, Chat) { +define('forum/footer', ['notifications', 'chat', 'components', 'translator'], function(Notifications, Chat, components, translator) { Notifications.prepareDOM(); Chat.prepareDOM(); diff --git a/public/src/client/infinitescroll.js b/public/src/client/infinitescroll.js index ba3385d92f..7c79da1e79 100644 --- a/public/src/client/infinitescroll.js +++ b/public/src/client/infinitescroll.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, socket, ajaxify, translator, templates, app */ +/* globals define, socket, ajaxify, templates, app */ -define('forum/infinitescroll', function() { +define('forum/infinitescroll', ['translator'], function(translator) { var scroll = {}; var callback; diff --git a/public/src/client/login.js b/public/src/client/login.js index dc199f3d2f..3032e3b35d 100644 --- a/public/src/client/login.js +++ b/public/src/client/login.js @@ -1,7 +1,7 @@ "use strict"; -/* global define, app, translator, config, RELATIVE_PATH */ +/* global define, app, config, RELATIVE_PATH */ -define('forum/login', ['csrf'], function(csrf) { +define('forum/login', ['csrf', 'translator'], function(csrf, translator) { var Login = {}; Login.init = function() { diff --git a/public/src/client/recent.js b/public/src/client/recent.js index 30d635ea0d..909cec052e 100644 --- a/public/src/client/recent.js +++ b/public/src/client/recent.js @@ -2,7 +2,7 @@ /* globals define, app, socket, utils */ -define('forum/recent', ['forum/infinitescroll', 'composer'], function(infinitescroll, composer) { +define('forum/recent', ['forum/infinitescroll', 'composer', 'components'], function(infinitescroll, composer, components) { var Recent = {}; var newTopicCount = 0, @@ -23,17 +23,6 @@ define('forum/recent', ['forum/infinitescroll', 'composer'], function(infinitesc $(this).addClass('hide'); }); - $('#new_topic').on('click', function() { - socket.emit('categories.getCategoriesByPrivilege', 'topics:create', function(err, categories) { - if (err) { - return app.alertError(err.message); - } - if (categories.length) { - composer.newTopic(categories[0].cid); - } - }); - }); - infinitescroll.init(Recent.loadMoreTopics); }; diff --git a/public/src/client/register.js b/public/src/client/register.js index 636b8be306..cab41bb72f 100644 --- a/public/src/client/register.js +++ b/public/src/client/register.js @@ -1,9 +1,9 @@ 'use strict'; -/* globals define, app, utils, socket, config, translator */ +/* globals define, app, utils, socket, config */ -define('forum/register', ['csrf'], function(csrf) { +define('forum/register', ['csrf', 'translator'], function(csrf, translator) { var Register = {}, validationError = false, successIcon = ''; diff --git a/public/src/client/topic.js b/public/src/client/topic.js index f28a9097c8..3e087879d2 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -1,7 +1,7 @@ 'use strict'; -/* globals define, app, components, templates, translator, socket, bootbox, config, ajaxify, RELATIVE_PATH, utils */ +/* globals define, app, templates, socket, bootbox, config, ajaxify, RELATIVE_PATH, utils */ define('forum/topic', [ 'forum/pagination', @@ -12,8 +12,10 @@ define('forum/topic', [ 'forum/topic/browsing', 'forum/topic/posts', 'navigator', - 'sort' -], function(pagination, infinitescroll, threadTools, postTools, events, browsing, posts, navigator, sort) { + 'sort', + 'components', + 'translator' +], function(pagination, infinitescroll, threadTools, postTools, events, browsing, posts, navigator, sort, components, translator) { var Topic = {}, currentUrl = ''; diff --git a/public/src/client/topic/browsing.js b/public/src/client/topic/browsing.js index 7c14fab158..5cb71960ea 100644 --- a/public/src/client/topic/browsing.js +++ b/public/src/client/topic/browsing.js @@ -2,9 +2,9 @@ 'use strict'; -/* globals define, app, translator, config, socket, ajaxify */ +/* globals define, app, config, socket, ajaxify */ -define('forum/topic/browsing', function() { +define('forum/topic/browsing', ['translator'], function(translator) { var Browsing = {}; diff --git a/public/src/client/topic/events.js b/public/src/client/topic/events.js index c3ecf6d29a..f47108c7e1 100644 --- a/public/src/client/topic/events.js +++ b/public/src/client/topic/events.js @@ -1,14 +1,15 @@ 'use strict'; -/* globals app, ajaxify, components, define, socket, translator, templates */ +/* globals app, ajaxify, define, socket, templates */ define('forum/topic/events', [ 'forum/topic/browsing', 'forum/topic/postTools', 'forum/topic/threadTools', - 'forum/topic/posts' -], function(browsing, postTools, threadTools, posts) { + 'forum/topic/posts', + 'components' +], function(browsing, postTools, threadTools, posts, components) { var Events = {}; @@ -187,9 +188,8 @@ define('forum/topic/events', [ function togglePostVote(data) { var post = $('[data-pid="' + data.post.pid + '"]'); - - post.find('.upvote').toggleClass('btn-primary upvoted', data.upvote); - post.find('.downvote').toggleClass('btn-primary downvoted', data.downvote); + post.find('[component="post/upvote"]').toggleClass('upvoted', data.upvote); + post.find('[component="post/downvote"]').toggleClass('downvoted', data.downvote); } diff --git a/public/src/client/topic/fork.js b/public/src/client/topic/fork.js index 91ec8a2be9..5321202e49 100644 --- a/public/src/client/topic/fork.js +++ b/public/src/client/topic/fork.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, app, ajaxify, components, translator, socket */ +/* globals define, app, ajaxify, socket */ -define('forum/topic/fork', function() { +define('forum/topic/fork', ['components'], function(components) { var Fork = {}, forkModal, diff --git a/public/src/client/topic/postTools.js b/public/src/client/topic/postTools.js index 4e561b036c..b3686a7e3c 100644 --- a/public/src/client/topic/postTools.js +++ b/public/src/client/topic/postTools.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, app, ajaxify, bootbox, components, socket, templates, translator, utils */ +/* globals define, app, ajaxify, bootbox, socket, templates, utils */ -define('forum/topic/postTools', ['composer', 'share', 'navigator'], function(composer, share, navigator) { +define('forum/topic/postTools', ['composer', 'share', 'navigator', 'components', 'translator'], function(composer, share, navigator, components, translator) { var PostTools = {}, topicName; diff --git a/public/src/client/topic/posts.js b/public/src/client/topic/posts.js index 070a97fa5b..1d7dcbe0df 100644 --- a/public/src/client/topic/posts.js +++ b/public/src/client/topic/posts.js @@ -1,13 +1,14 @@ 'use strict'; -/* globals config, app, ajaxify, components, define, socket, utils */ +/* globals config, app, ajaxify, define, socket, utils */ define('forum/topic/posts', [ 'forum/pagination', 'forum/infinitescroll', 'forum/topic/postTools', - 'navigator' -], function(pagination, infinitescroll, postTools, navigator) { + 'navigator', + 'components' +], function(pagination, infinitescroll, postTools, navigator, components) { var Posts = {}; diff --git a/public/src/client/topic/threadTools.js b/public/src/client/topic/threadTools.js index fe8bc1fcfb..46a20d19b9 100644 --- a/public/src/client/topic/threadTools.js +++ b/public/src/client/topic/threadTools.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, app, components, translator, ajaxify, socket, bootbox */ +/* globals define, app, ajaxify, socket, bootbox */ -define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move'], function(fork, move) { +define('forum/topic/threadTools', ['forum/topic/fork', 'forum/topic/move', 'components', 'translator'], function(fork, move, components, translator) { var ThreadTools = {}; diff --git a/public/src/client/unread.js b/public/src/client/unread.js index c8c1c96de9..fa97312c27 100644 --- a/public/src/client/unread.js +++ b/public/src/client/unread.js @@ -2,7 +2,7 @@ /* globals define, app, socket */ -define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll'], function(recent, topicSelect, infinitescroll) { +define('forum/unread', ['forum/recent', 'topicSelect', 'forum/infinitescroll', 'components'], function(recent, topicSelect, infinitescroll, components) { var Unread = {}; $(window).on('action:ajaxify.start', function(ev, data) { diff --git a/public/src/client/users.js b/public/src/client/users.js index 6b08f05cdd..3e794a008a 100644 --- a/public/src/client/users.js +++ b/public/src/client/users.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, socket, app, ajaxify, templates, translator*/ +/* globals define, socket, app, ajaxify, templates */ -define('forum/users', function() { +define('forum/users', ['translator'], function(translator) { var Users = {}; var loadingMoreUsers = false; diff --git a/public/src/modules/alerts.js b/public/src/modules/alerts.js index 15f592720e..78ec9721c5 100644 --- a/public/src/modules/alerts.js +++ b/public/src/modules/alerts.js @@ -1,7 +1,7 @@ 'use strict'; -/* globals define, translator, templates */ +/* globals define, templates */ -define('alerts', function() { +define('alerts', ['translator'], function(translator) { var module = {}; module.alert = function (params) { diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 760f19ca20..da25e104d5 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -1,7 +1,7 @@ "use strict"; -/* globals app, config, define, socket, translator, templates, utils, ajaxify */ +/* globals app, config, define, socket, templates, utils, ajaxify */ -define('chat', ['taskbar', 'string', 'sounds', 'forum/chats'], function(taskbar, S, sounds, Chats) { +define('chat', ['taskbar', 'string', 'sounds', 'forum/chats', 'translator'], function(taskbar, S, sounds, Chats, translator) { var module = {}; var newMessage = false; diff --git a/public/src/components.js b/public/src/modules/components.js similarity index 94% rename from public/src/components.js rename to public/src/modules/components.js index bef3c95117..85f8b04526 100644 --- a/public/src/components.js +++ b/public/src/modules/components.js @@ -1,8 +1,7 @@ "use strict"; +define('components', function() { + var components = {}; -var components = components || {}; - -(function() { components.core = { 'post': function(name, value) { return $('[data-' + name + '="' + value + '"]'); @@ -44,4 +43,6 @@ var components = components || {}; return $('[component="' + arguments[0] + '"]'); } }; -}()); \ No newline at end of file + + return components; +}); \ No newline at end of file diff --git a/public/src/modules/composer.js b/public/src/modules/composer.js index 9545759395..f6dc3b9b31 100644 --- a/public/src/modules/composer.js +++ b/public/src/modules/composer.js @@ -1,9 +1,10 @@ 'use strict'; -/* globals define, socket, app, config, ajaxify, utils, translator, templates, bootbox */ +/* globals define, socket, app, config, ajaxify, utils, templates, bootbox */ define('composer', [ 'taskbar', + 'translator', 'composer/controls', 'composer/uploads', 'composer/formatting', @@ -12,7 +13,7 @@ define('composer', [ 'composer/categoryList', 'composer/preview', 'composer/resize' -], function(taskbar, controls, uploads, formatting, drafts, tags, categoryList, preview, resize) { +], function(taskbar, translator, controls, uploads, formatting, drafts, tags, categoryList, preview, resize) { var composer = { active: undefined, posts: {}, diff --git a/public/src/modules/navigator.js b/public/src/modules/navigator.js index f4f4d74a59..9404c885d9 100644 --- a/public/src/modules/navigator.js +++ b/public/src/modules/navigator.js @@ -1,10 +1,10 @@ 'use strict'; -/* globals app, components, define, ajaxify, utils, translator, config */ +/* globals app, define, ajaxify, utils, config */ -define('navigator', ['forum/pagination'], function(pagination) { +define('navigator', ['forum/pagination', 'components'], function(pagination, components) { var navigator = {}; var index = 1; diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index 43ba05ed1b..3f342a1207 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -1,8 +1,8 @@ 'use strict'; -/* globals define, socket, translator, utils, config, app, ajaxify, templates, Tinycon*/ +/* globals define, socket, utils, config, app, ajaxify, templates, Tinycon*/ -define('notifications', ['sounds'], function(sound) { +define('notifications', ['sounds', 'translator'], function(sound, translator) { var Notifications = {}; Notifications.prepareDOM = function() { diff --git a/public/src/modules/search.js b/public/src/modules/search.js index eedf0b76b9..e17b234656 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -1,7 +1,7 @@ "use strict"; -/* globals socket, ajaxify, translator, app, define */ +/* globals socket, ajaxify, app, define */ -define('search', ['navigator'], function(nav) { +define('search', ['navigator', 'translator'], function(nav, translator) { var Search = { current: {} diff --git a/public/src/modules/sort.js b/public/src/modules/sort.js index 3aad14dc44..e063fceda3 100644 --- a/public/src/modules/sort.js +++ b/public/src/modules/sort.js @@ -1,5 +1,5 @@ 'use strict'; -/* globals define, config, socket, app, ajaxify, translator, templates */ +/* globals define, config, socket, app, ajaxify, templates */ define('sort', function() { var module = {}; diff --git a/public/src/modules/topicSelect.js b/public/src/modules/topicSelect.js index 3e3ae58d46..83519cb2c5 100644 --- a/public/src/modules/topicSelect.js +++ b/public/src/modules/topicSelect.js @@ -2,7 +2,7 @@ /* globals define*/ -define('topicSelect', function() { +define('topicSelect', ['components'], function(components) { var TopicSelect = {}; var lastSelected; diff --git a/public/src/translator.js b/public/src/modules/translator.js similarity index 86% rename from public/src/translator.js rename to public/src/modules/translator.js index d1b85e300c..ac3be2728e 100644 --- a/public/src/translator.js +++ b/public/src/modules/translator.js @@ -1,18 +1,18 @@ -(function (module) { +;(function(translator) { "use strict"; - /*global RELATIVE_PATH, config*/ + /* globals RELATIVE_PATH, config, define */ + // export the class if we are in a Node-like system. + if (typeof module === 'object' && module.exports === translator) { + exports = module.exports = translator; + } - var translator = {}, - languages = {}; - - var regexes = { - match: /\[\[.*?\]\]/g, - split: /[,][\s]*/, - replace: /\]+$/ - }; - - module.exports = translator; + var languages = {}, + regexes = { + match: /\[\[.*?\]\]/g, + split: /[,][\s]*/, + replace: /\]+$/ + }; translator.addTranslation = function(language, filename, translations) { languages[language] = languages[language] || {}; @@ -127,7 +127,7 @@ if ('undefined' !== typeof window && config) { language = config.userLang || 'en_GB'; } else { - var meta = require('../../src/meta'); + var meta = require('../../../src/meta'); language = meta.config.defaultLang || 'en_GB'; } } @@ -267,16 +267,16 @@ var fs = require('fs'), path = require('path'), winston = require('winston'), - meta = require('../../src/meta'); + meta = require('../../../src/meta'); language = language || meta.config.defaultLang || 'en_GB'; - if (!fs.existsSync(path.join(__dirname, '../language', language))) { + if (!fs.existsSync(path.join(__dirname, '../../language', language))) { winston.warn('[translator] Language \'' + meta.config.defaultLang + '\' not found. Defaulting to \'en_GB\''); language = 'en_GB'; } - fs.readFile(path.join(__dirname, '../language', language, filename + '.json'), function(err, data) { + fs.readFile(path.join(__dirname, '../../language', language, filename + '.json'), function(err, data) { if (err) { winston.error('Could not load `' + filename + '`: ' + err.message + '. Skipping...'); return callback({}); @@ -291,12 +291,20 @@ }); } - if ('undefined' !== typeof window) { - window.translator = module.exports; - } + // Use the define() function if we're in AMD land + if (typeof define === 'function' && define.amd) { + define('translator', translator); -})('undefined' === typeof module ? { - module: { - exports: {} + // Expose a global `translator` object for backwards compatibility + window.translator = { + translate: function() { + console.warn('[translator] Global invocation of the translator is now deprecated, please `require` the module instead.'); + translator.translate.apply(translator, arguments); + } + } } -} : module); +})( + typeof exports === 'object' ? exports : + typeof define === 'function' && define.amd ? {} : + translator = {} +); \ No newline at end of file diff --git a/public/src/overrides.js b/public/src/overrides.js index afe5003b3c..8c0e492cce 100644 --- a/public/src/overrides.js +++ b/public/src/overrides.js @@ -1,11 +1,13 @@ 'use strict'; -/*globals translator*/ - - if ('undefined' !== typeof window) { (function ($, undefined) { + var translator; + require(['translator'], function(_translator) { + translator = _translator; + }); + $.fn.getCursorPosition = function() { var el = $(this).get(0); var pos = 0; diff --git a/src/controllers/categories.js b/src/controllers/categories.js index 8896894680..55c0122705 100644 --- a/src/controllers/categories.js +++ b/src/controllers/categories.js @@ -154,7 +154,12 @@ categoriesController.list = function(req, res, next) { return next(err); } - res.render('categories', data); + plugins.fireHook('filter:categories.build', {req: req, res: res, templateData: data}, function(err, data) { + if (err) { + return next(err); + } + res.render('categories', data.templateData); + }); }); }; diff --git a/src/controllers/helpers.js b/src/controllers/helpers.js index 3b3faa0622..0b100aad49 100644 --- a/src/controllers/helpers.js +++ b/src/controllers/helpers.js @@ -4,7 +4,7 @@ var nconf = require('nconf'), async = require('async'), validator = require('validator'), - translator = require('../../public/src/translator'), + translator = require('../../public/src/modules/translator'), categories = require('../categories'), plugins = require('../plugins'), meta = require('../meta'); diff --git a/src/emailer.js b/src/emailer.js index aeca1ecab8..a7a0b67302 100644 --- a/src/emailer.js +++ b/src/emailer.js @@ -9,7 +9,7 @@ var fs = require('fs'), User = require('./user'), Plugins = require('./plugins'), meta = require('./meta'), - translator = require('../public/src/translator'), + translator = require('../public/src/modules/translator'), app; diff --git a/src/meta/js.js b/src/meta/js.js index 85188ab3f7..52366651cf 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -44,9 +44,7 @@ module.exports = function(Meta) { 'public/src/utils.js', 'public/src/app.js', 'public/src/ajaxify.js', - 'public/src/components.js', 'public/src/overrides.js', - 'public/src/translator.js', 'public/src/variables.js', 'public/src/widgets.js' ], diff --git a/src/meta/title.js b/src/meta/title.js index 11af43ae9b..d67c448343 100644 --- a/src/meta/title.js +++ b/src/meta/title.js @@ -3,7 +3,7 @@ var winston = require('winston'), validator = require('validator'), user = require('../user'), - translator = require('../../public/src/translator'); + translator = require('../../public/src/modules/translator'); module.exports = function(Meta) { Meta.title = {}; diff --git a/src/middleware/middleware.js b/src/middleware/middleware.js index b46376f590..cc3ae7cb5c 100644 --- a/src/middleware/middleware.js +++ b/src/middleware/middleware.js @@ -14,7 +14,7 @@ var app, plugins = require('./../plugins'), navigation = require('./../navigation'), meta = require('./../meta'), - translator = require('./../../public/src/translator'), + translator = require('./../../public/src/modules/translator'), user = require('./../user'), groups = require('./../groups'), db = require('./../database'), diff --git a/src/navigation/admin.js b/src/navigation/admin.js index a0f62035b4..d608e1b620 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -5,7 +5,7 @@ var admin = {}, async = require('async'), plugins = require('../plugins'), db = require('../database'), - translator = require('../../public/src/translator'); + translator = require('../../public/src/modules/translator'); admin.save = function(data, callback) { diff --git a/src/navigation/index.js b/src/navigation/index.js index 98d575a261..b9a8a99e16 100644 --- a/src/navigation/index.js +++ b/src/navigation/index.js @@ -5,7 +5,7 @@ var navigation = {}, plugins = require('../plugins'), db = require('../database'), admin = require('./admin'), - translator = require('../../public/src/translator'); + translator = require('../../public/src/modules/translator'); navigation.get = function(callback) { diff --git a/src/plugins.js b/src/plugins.js index c63039be67..3a9d1ff5fe 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -11,7 +11,7 @@ var fs = require('fs'), db = require('./database'), emitter = require('./emitter'), meta = require('./meta'), - translator = require('../public/src/translator'), + translator = require('../public/src/modules/translator'), utils = require('../public/src/utils'), hotswap = require('./hotswap'), diff --git a/src/privileges/helpers.js b/src/privileges/helpers.js index fe72b5136f..1ffce0b7ce 100644 --- a/src/privileges/helpers.js +++ b/src/privileges/helpers.js @@ -83,30 +83,5 @@ function isGuestAllowedTo(privilege, cids, callback) { groups.isMemberOfGroups('guests', groupKeys, callback); } -helpers.hasEnoughReputationFor = function(privilege, uid, callback) { - if (parseInt(meta.config['privileges:disabled'], 10) || !parseInt(uid, 10)) { - return callback(null, false); - } - - user.getUserField(uid, 'reputation', function(err, reputation) { - if (err) { - return callback(null, false); - } - - reputation = parseInt(reputation, 10); - - if (Array.isArray(privilege)) { - for(var i=0; i