Merge pull request #3 from NodeBB/master

123
v1.18.x
Сергей Савельев 10 years ago
commit f7a3428bf8

@ -41,13 +41,13 @@
"nconf": "~0.7.1", "nconf": "~0.7.1",
"nodebb-plugin-dbsearch": "^0.2.1", "nodebb-plugin-dbsearch": "^0.2.1",
"nodebb-plugin-emoji-extended": "^0.4.1-4", "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-mentions": "^0.11.0",
"nodebb-plugin-soundpack-default": "~0.1.1", "nodebb-plugin-soundpack-default": "~0.1.1",
"nodebb-plugin-spam-be-gone": "^0.4.0", "nodebb-plugin-spam-be-gone": "^0.4.0",
"nodebb-theme-lavender": "^1.0.22", "nodebb-theme-lavender": "^1.0.22",
"nodebb-theme-vanilla": "^1.0.80", "nodebb-theme-vanilla": "^1.0.80",
"nodebb-widget-essentials": "~0.2.12", "nodebb-widget-essentials": "^1.0.0",
"nodebb-rewards-essentials": "^0.0.1", "nodebb-rewards-essentials": "^0.0.1",
"npm": "^2.1.4", "npm": "^2.1.4",
"passport": "^0.2.1", "passport": "^0.2.1",

@ -1,7 +1,7 @@
"use strict"; "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 = {}, var navigation = {},
available; available;

@ -1,10 +1,11 @@
"use strict"; "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', [ define('admin/manage/groups', [
'iconSelect', 'iconSelect',
'admin/modules/colorpicker' 'admin/modules/colorpicker',
], function(iconSelect, colorpicker) { 'translator'
], function(iconSelect, colorpicker, translator) {
var Groups = {}; var Groups = {};
Groups.init = function() { Groups.init = function() {

@ -4,11 +4,19 @@ var ajaxify = ajaxify || {};
$(document).ready(function() { $(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, var location = document.location || window.location,
rootUrl = location.protocol + '//' + (location.hostname || location.host) + (location.port ? ':' + location.port : ''), 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) { $(window).on('popstate', function (ev) {
ev = ev.originalEvent; ev = ev.originalEvent;
@ -49,11 +57,9 @@ $(document).ready(function() {
app.template = data.template.name; app.template = data.template.name;
translator.load(config.defaultLang, data.template.name); require(['translator', 'search'], function(translator, search) {
translator.load(config.defaultLang, data.template.name);
renderTemplate(url, data.template.name, data, callback); renderTemplate(url, data.template.name, data, callback);
require(['search'], function(search) {
search.topicDOM.end(); search.topicDOM.end();
}); });
}); });

@ -1,5 +1,5 @@
"use strict"; "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, var socket,
app = app || {}; app = app || {};
@ -310,18 +310,20 @@ app.cacheBuster = null;
titleObj.titles[0] = window.document.title; titleObj.titles[0] = window.document.title;
} }
translator.translate(title, function(translated) { require(['translator'], function(translator) {
titleObj.titles[1] = translated; translator.translate(title, function(translated) {
if (titleObj.interval) { titleObj.titles[1] = translated;
clearInterval(titleObj.interval); 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 = $('<div/>').html(title).text();
} }
}, 2000);
titleObj.interval = setInterval(function() {
var title = titleObj.titles[titleObj.titles.indexOf(window.document.title) ^ 1];
if (title) {
window.document.title = $('<div/>').html(title).text();
}
}, 2000);
});
}); });
} else { } else {
if (titleObj.interval) { 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() { function handleStatusChange() {
$('#user-control-list .user-status').off('click').on('click', function(e) { $('#user-control-list .user-status').off('click').on('click', function(e) {
var status = $(this).attr('data-status'); 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() { app.load = function() {
$('document').ready(function () { $('document').ready(function () {
var url = ajaxify.start(window.location.pathname.slice(1), true, window.location.search); var url = ajaxify.start(window.location.pathname.slice(1), true, window.location.search);
ajaxify.end(url, app.template); ajaxify.end(url, app.template);
collapseNavigationOnClick();
handleStatusChange(); handleStatusChange();
if (config.searchEnabled) { if (config.searchEnabled) {
handleSearch(); handleSearch();
} }
handleNewTopic();
$('#logout-link').on('click', app.logout); $('#logout-link').on('click', app.logout);
Visibility.change(function(e, state){ Visibility.change(function(e, state){

@ -1,8 +1,8 @@
'use strict'; '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 = {}, var AccountEdit = {},
gravatarPicture = '', gravatarPicture = '',
uploadedPicture = '', uploadedPicture = '',

@ -1,8 +1,8 @@
'use strict'; '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 = {}, var Account = {},
yourid, yourid,
theirid, theirid,

@ -1,8 +1,8 @@
'use strict'; '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 = {}; var categories = {};
$(window).on('action:ajaxify.start', function(ev, data) { $(window).on('action:ajaxify.start', function(ev, data) {

@ -1,5 +1,5 @@
"use strict"; "use strict";
/* global define, config, templates, app, utils, ajaxify, socket, translator */ /* global define, config, templates, app, utils, ajaxify, socket */
define('forum/category', [ define('forum/category', [
'composer', 'composer',
@ -8,8 +8,10 @@ define('forum/category', [
'share', 'share',
'navigator', 'navigator',
'forum/categoryTools', 'forum/categoryTools',
'sort' 'sort',
], function(composer, pagination, infinitescroll, share, navigator, categoryTools, sort) { 'components',
'translator'
], function(composer, pagination, infinitescroll, share, navigator, categoryTools, sort, components, translator) {
var Category = {}; var Category = {};
$(window).on('action:ajaxify.start', function(ev, data) { $(window).on('action:ajaxify.start', function(ev, data) {
@ -32,10 +34,6 @@ define('forum/category', [
share.addShareHandlers(ajaxify.variables.get('category_name')); share.addShareHandlers(ajaxify.variables.get('category_name'));
$('#new_post').on('click', function () {
composer.newTopic(cid);
});
socket.removeListener('event:new_topic', Category.onNewTopic); socket.removeListener('event:new_topic', Category.onNewTopic);
socket.on('event:new_topic', Category.onNewTopic); socket.on('event:new_topic', Category.onNewTopic);

@ -1,10 +1,10 @@
'use strict'; '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 = {}; var CategoryTools = {};

@ -1,8 +1,8 @@
'use strict'; '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 = { var Chats = {
initialised: false initialised: false
}; };

@ -1,7 +1,7 @@
"use strict"; "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(); Notifications.prepareDOM();
Chat.prepareDOM(); Chat.prepareDOM();

@ -1,8 +1,8 @@
'use strict'; '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 scroll = {};
var callback; var callback;

@ -1,7 +1,7 @@
"use strict"; "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 = {}; var Login = {};
Login.init = function() { Login.init = function() {

@ -2,7 +2,7 @@
/* globals define, app, socket, utils */ /* 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 Recent = {};
var newTopicCount = 0, var newTopicCount = 0,
@ -23,17 +23,6 @@ define('forum/recent', ['forum/infinitescroll', 'composer'], function(infinitesc
$(this).addClass('hide'); $(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); infinitescroll.init(Recent.loadMoreTopics);
}; };

@ -1,9 +1,9 @@
'use strict'; '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 = {}, var Register = {},
validationError = false, validationError = false,
successIcon = '<i class="fa fa-check"></i>'; successIcon = '<i class="fa fa-check"></i>';

@ -1,7 +1,7 @@
'use strict'; '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', [ define('forum/topic', [
'forum/pagination', 'forum/pagination',
@ -12,8 +12,10 @@ define('forum/topic', [
'forum/topic/browsing', 'forum/topic/browsing',
'forum/topic/posts', 'forum/topic/posts',
'navigator', 'navigator',
'sort' 'sort',
], function(pagination, infinitescroll, threadTools, postTools, events, browsing, posts, navigator, sort) { 'components',
'translator'
], function(pagination, infinitescroll, threadTools, postTools, events, browsing, posts, navigator, sort, components, translator) {
var Topic = {}, var Topic = {},
currentUrl = ''; currentUrl = '';

@ -2,9 +2,9 @@
'use strict'; '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 = {}; var Browsing = {};

@ -1,14 +1,15 @@
'use strict'; 'use strict';
/* globals app, ajaxify, components, define, socket, translator, templates */ /* globals app, ajaxify, define, socket, templates */
define('forum/topic/events', [ define('forum/topic/events', [
'forum/topic/browsing', 'forum/topic/browsing',
'forum/topic/postTools', 'forum/topic/postTools',
'forum/topic/threadTools', 'forum/topic/threadTools',
'forum/topic/posts' 'forum/topic/posts',
], function(browsing, postTools, threadTools, posts) { 'components'
], function(browsing, postTools, threadTools, posts, components) {
var Events = {}; var Events = {};
@ -187,9 +188,8 @@ define('forum/topic/events', [
function togglePostVote(data) { function togglePostVote(data) {
var post = $('[data-pid="' + data.post.pid + '"]'); var post = $('[data-pid="' + data.post.pid + '"]');
post.find('[component="post/upvote"]').toggleClass('upvoted', data.upvote);
post.find('.upvote').toggleClass('btn-primary upvoted', data.upvote); post.find('[component="post/downvote"]').toggleClass('downvoted', data.downvote);
post.find('.downvote').toggleClass('btn-primary downvoted', data.downvote);
} }

@ -1,8 +1,8 @@
'use strict'; '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 = {}, var Fork = {},
forkModal, forkModal,

@ -1,8 +1,8 @@
'use strict'; '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 = {}, var PostTools = {},
topicName; topicName;

@ -1,13 +1,14 @@
'use strict'; 'use strict';
/* globals config, app, ajaxify, components, define, socket, utils */ /* globals config, app, ajaxify, define, socket, utils */
define('forum/topic/posts', [ define('forum/topic/posts', [
'forum/pagination', 'forum/pagination',
'forum/infinitescroll', 'forum/infinitescroll',
'forum/topic/postTools', 'forum/topic/postTools',
'navigator' 'navigator',
], function(pagination, infinitescroll, postTools, navigator) { 'components'
], function(pagination, infinitescroll, postTools, navigator, components) {
var Posts = {}; var Posts = {};

@ -1,8 +1,8 @@
'use strict'; '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 = {}; var ThreadTools = {};

@ -2,7 +2,7 @@
/* globals define, app, socket */ /* 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 = {}; var Unread = {};
$(window).on('action:ajaxify.start', function(ev, data) { $(window).on('action:ajaxify.start', function(ev, data) {

@ -1,8 +1,8 @@
'use strict'; '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 Users = {};
var loadingMoreUsers = false; var loadingMoreUsers = false;

@ -1,7 +1,7 @@
'use strict'; 'use strict';
/* globals define, translator, templates */ /* globals define, templates */
define('alerts', function() { define('alerts', ['translator'], function(translator) {
var module = {}; var module = {};
module.alert = function (params) { module.alert = function (params) {

@ -1,7 +1,7 @@
"use strict"; "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 module = {};
var newMessage = false; var newMessage = false;

@ -1,8 +1,7 @@
"use strict"; "use strict";
define('components', function() {
var components = {};
var components = components || {};
(function() {
components.core = { components.core = {
'post': function(name, value) { 'post': function(name, value) {
return $('[data-' + name + '="' + value + '"]'); return $('[data-' + name + '="' + value + '"]');
@ -44,4 +43,6 @@ var components = components || {};
return $('[component="' + arguments[0] + '"]'); return $('[component="' + arguments[0] + '"]');
} }
}; };
}());
return components;
});

@ -1,9 +1,10 @@
'use strict'; 'use strict';
/* globals define, socket, app, config, ajaxify, utils, translator, templates, bootbox */ /* globals define, socket, app, config, ajaxify, utils, templates, bootbox */
define('composer', [ define('composer', [
'taskbar', 'taskbar',
'translator',
'composer/controls', 'composer/controls',
'composer/uploads', 'composer/uploads',
'composer/formatting', 'composer/formatting',
@ -12,7 +13,7 @@ define('composer', [
'composer/categoryList', 'composer/categoryList',
'composer/preview', 'composer/preview',
'composer/resize' '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 = { var composer = {
active: undefined, active: undefined,
posts: {}, posts: {},

@ -1,10 +1,10 @@
'use strict'; '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 navigator = {};
var index = 1; var index = 1;

@ -1,8 +1,8 @@
'use strict'; '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 = {}; var Notifications = {};
Notifications.prepareDOM = function() { Notifications.prepareDOM = function() {

@ -1,7 +1,7 @@
"use strict"; "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 = { var Search = {
current: {} current: {}

@ -1,5 +1,5 @@
'use strict'; 'use strict';
/* globals define, config, socket, app, ajaxify, translator, templates */ /* globals define, config, socket, app, ajaxify, templates */
define('sort', function() { define('sort', function() {
var module = {}; var module = {};

@ -2,7 +2,7 @@
/* globals define*/ /* globals define*/
define('topicSelect', function() { define('topicSelect', ['components'], function(components) {
var TopicSelect = {}; var TopicSelect = {};
var lastSelected; var lastSelected;

@ -1,18 +1,18 @@
(function (module) { ;(function(translator) {
"use strict"; "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 = {}, var languages = {},
languages = {}; regexes = {
match: /\[\[.*?\]\]/g,
var regexes = { split: /[,][\s]*/,
match: /\[\[.*?\]\]/g, replace: /\]+$/
split: /[,][\s]*/, };
replace: /\]+$/
};
module.exports = translator;
translator.addTranslation = function(language, filename, translations) { translator.addTranslation = function(language, filename, translations) {
languages[language] = languages[language] || {}; languages[language] = languages[language] || {};
@ -127,7 +127,7 @@
if ('undefined' !== typeof window && config) { if ('undefined' !== typeof window && config) {
language = config.userLang || 'en_GB'; language = config.userLang || 'en_GB';
} else { } else {
var meta = require('../../src/meta'); var meta = require('../../../src/meta');
language = meta.config.defaultLang || 'en_GB'; language = meta.config.defaultLang || 'en_GB';
} }
} }
@ -267,16 +267,16 @@
var fs = require('fs'), var fs = require('fs'),
path = require('path'), path = require('path'),
winston = require('winston'), winston = require('winston'),
meta = require('../../src/meta'); meta = require('../../../src/meta');
language = language || meta.config.defaultLang || 'en_GB'; 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\''); winston.warn('[translator] Language \'' + meta.config.defaultLang + '\' not found. Defaulting to \'en_GB\'');
language = '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) { if (err) {
winston.error('Could not load `' + filename + '`: ' + err.message + '. Skipping...'); winston.error('Could not load `' + filename + '`: ' + err.message + '. Skipping...');
return callback({}); return callback({});
@ -291,12 +291,20 @@
}); });
} }
if ('undefined' !== typeof window) { // Use the define() function if we're in AMD land
window.translator = module.exports; if (typeof define === 'function' && define.amd) {
} define('translator', translator);
})('undefined' === typeof module ? { // Expose a global `translator` object for backwards compatibility
module: { window.translator = {
exports: {} 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 = {}
);

@ -1,11 +1,13 @@
'use strict'; 'use strict';
/*globals translator*/
if ('undefined' !== typeof window) { if ('undefined' !== typeof window) {
(function ($, undefined) { (function ($, undefined) {
var translator;
require(['translator'], function(_translator) {
translator = _translator;
});
$.fn.getCursorPosition = function() { $.fn.getCursorPosition = function() {
var el = $(this).get(0); var el = $(this).get(0);
var pos = 0; var pos = 0;

@ -154,7 +154,12 @@ categoriesController.list = function(req, res, next) {
return next(err); 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);
});
}); });
}; };

@ -4,7 +4,7 @@ var nconf = require('nconf'),
async = require('async'), async = require('async'),
validator = require('validator'), validator = require('validator'),
translator = require('../../public/src/translator'), translator = require('../../public/src/modules/translator'),
categories = require('../categories'), categories = require('../categories'),
plugins = require('../plugins'), plugins = require('../plugins'),
meta = require('../meta'); meta = require('../meta');

@ -9,7 +9,7 @@ var fs = require('fs'),
User = require('./user'), User = require('./user'),
Plugins = require('./plugins'), Plugins = require('./plugins'),
meta = require('./meta'), meta = require('./meta'),
translator = require('../public/src/translator'), translator = require('../public/src/modules/translator'),
app; app;

@ -44,9 +44,7 @@ module.exports = function(Meta) {
'public/src/utils.js', 'public/src/utils.js',
'public/src/app.js', 'public/src/app.js',
'public/src/ajaxify.js', 'public/src/ajaxify.js',
'public/src/components.js',
'public/src/overrides.js', 'public/src/overrides.js',
'public/src/translator.js',
'public/src/variables.js', 'public/src/variables.js',
'public/src/widgets.js' 'public/src/widgets.js'
], ],

@ -3,7 +3,7 @@
var winston = require('winston'), var winston = require('winston'),
validator = require('validator'), validator = require('validator'),
user = require('../user'), user = require('../user'),
translator = require('../../public/src/translator'); translator = require('../../public/src/modules/translator');
module.exports = function(Meta) { module.exports = function(Meta) {
Meta.title = {}; Meta.title = {};

@ -14,7 +14,7 @@ var app,
plugins = require('./../plugins'), plugins = require('./../plugins'),
navigation = require('./../navigation'), navigation = require('./../navigation'),
meta = require('./../meta'), meta = require('./../meta'),
translator = require('./../../public/src/translator'), translator = require('./../../public/src/modules/translator'),
user = require('./../user'), user = require('./../user'),
groups = require('./../groups'), groups = require('./../groups'),
db = require('./../database'), db = require('./../database'),

@ -5,7 +5,7 @@ var admin = {},
async = require('async'), async = require('async'),
plugins = require('../plugins'), plugins = require('../plugins'),
db = require('../database'), db = require('../database'),
translator = require('../../public/src/translator'); translator = require('../../public/src/modules/translator');
admin.save = function(data, callback) { admin.save = function(data, callback) {

@ -5,7 +5,7 @@ var navigation = {},
plugins = require('../plugins'), plugins = require('../plugins'),
db = require('../database'), db = require('../database'),
admin = require('./admin'), admin = require('./admin'),
translator = require('../../public/src/translator'); translator = require('../../public/src/modules/translator');
navigation.get = function(callback) { navigation.get = function(callback) {

@ -11,7 +11,7 @@ var fs = require('fs'),
db = require('./database'), db = require('./database'),
emitter = require('./emitter'), emitter = require('./emitter'),
meta = require('./meta'), meta = require('./meta'),
translator = require('../public/src/translator'), translator = require('../public/src/modules/translator'),
utils = require('../public/src/utils'), utils = require('../public/src/utils'),
hotswap = require('./hotswap'), hotswap = require('./hotswap'),

@ -83,30 +83,5 @@ function isGuestAllowedTo(privilege, cids, callback) {
groups.isMemberOfGroups('guests', groupKeys, 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<privilege.length; ++i) {
if (reputation >= parseInt(meta.config[privilege[i]], 10)) {
return callback(null, true);
}
}
callback(null, false);
} else {
callback(null, reputation >= parseInt(meta.config[privilege], 10));
}
});
};
module.exports = helpers; module.exports = helpers;

@ -21,45 +21,34 @@ module.exports = function(privileges) {
if (!Array.isArray(pids) || !pids.length) { if (!Array.isArray(pids) || !pids.length) {
return callback(null, []); return callback(null, []);
} }
async.parallel({ async.parallel({
manage: function(next) { isAdmin: function(next){
helpers.hasEnoughReputationFor(['privileges:manage_content', 'privileges:manage_topic'], uid, next);
},
isAdministrator: function(next) {
user.isAdministrator(uid, next); user.isAdministrator(uid, next);
}, },
}, function(err, userResults) { isModerator: function(next) {
if(err) { posts.isModerator(pids, uid, next);
},
isOwner: function(next) {
posts.isOwner(pids, uid, next);
}
}, function(err, results) {
if (err) {
return callback(err); return callback(err);
} }
var userPriv = userResults.isAdministrator || userResults.manage; var privileges = [];
async.parallel({
isOwner: function(next) {
posts.isOwner(pids, uid, next);
},
isModerator: function(next) {
posts.isModerator(pids, uid, next);
}
}, function(err, postResults) {
if (err) {
return callback(err);
}
var privileges = [];
for (var i=0; i<pids.length; ++i) { for (var i=0; i<pids.length; ++i) {
var editable = userPriv || postResults.isModerator[i] || postResults.isOwner[i]; var editable = results.isAdmin || results.isModerator[i] || results.isOwner[i];
privileges.push({ privileges.push({
editable: editable, editable: editable,
view_deleted: editable, view_deleted: editable,
move: userResults.isAdministrator || postResults.isModerator[i] move: results.isAdmin || results.isModerator[i]
}); });
} }
callback(null, privileges); callback(null, privileges);
});
}); });
}; };
@ -154,16 +143,11 @@ module.exports = function(privileges) {
if (isLocked) { if (isLocked) {
return callback(null, {isLocked: true}); return callback(null, {isLocked: true});
} }
helpers.some([
function(next) { posts.isOwner(pid, uid, next);
posts.isOwner(pid, uid, next); },
}, function(isOwner, next) {
function(next) { next(null, {editable: isOwner});
helpers.hasEnoughReputationFor(['privileges:manage_content', 'privileges:manage_topic'], uid, next);
}
], function(err, editable) {
next(err, {editable: editable});
});
} }
], callback); ], callback);
} }

@ -25,7 +25,6 @@ module.exports = function(privileges) {
isOwner: function(next) { isOwner: function(next) {
next(null, parseInt(uid, 10) === parseInt(topic.uid, 10)); next(null, parseInt(uid, 10) === parseInt(topic.uid, 10));
}, },
manage_topic: async.apply(helpers.hasEnoughReputationFor, 'privileges:manage_topic', uid),
isAdministrator: async.apply(user.isAdministrator, uid), isAdministrator: async.apply(user.isAdministrator, uid),
isModerator: async.apply(user.isModerator, uid, topic.cid), isModerator: async.apply(user.isModerator, uid, topic.cid),
disabled: async.apply(categories.getCategoryField, topic.cid, 'disabled') disabled: async.apply(categories.getCategoryField, topic.cid, 'disabled')
@ -38,7 +37,7 @@ module.exports = function(privileges) {
var disabled = parseInt(results.disabled, 10) === 1; var disabled = parseInt(results.disabled, 10) === 1;
var isAdminOrMod = results.isAdministrator || results.isModerator; var isAdminOrMod = results.isAdministrator || results.isModerator;
var editable = isAdminOrMod || results.manage_topic; var editable = isAdminOrMod;
var deletable = isAdminOrMod || results.isOwner; var deletable = isAdminOrMod || results.isOwner;
plugins.fireHook('filter:privileges.topics.get', { plugins.fireHook('filter:privileges.topics.get', {
@ -47,7 +46,7 @@ module.exports = function(privileges) {
view_thread_tools: editable || deletable, view_thread_tools: editable || deletable,
editable: editable, editable: editable,
deletable: deletable, deletable: deletable,
view_deleted: isAdminOrMod || results.manage_topic || results.isOwner, view_deleted: isAdminOrMod || results.isOwner,
disabled: disabled, disabled: disabled,
tid: tid, tid: tid,
uid: uid uid: uid
@ -106,9 +105,6 @@ module.exports = function(privileges) {
function(next) { function(next) {
topics.isOwner(tid, uid, next); topics.isOwner(tid, uid, next);
}, },
function(next) {
helpers.hasEnoughReputationFor('privileges:manage_topic', uid, next);
},
function(next) { function(next) {
isAdminOrMod(tid, uid, next); isAdminOrMod(tid, uid, next);
} }

@ -8,7 +8,7 @@ var async = require('async'),
groups = require('../groups'), groups = require('../groups'),
meta = require('../meta'), meta = require('../meta'),
notifications = require('../notifications'), notifications = require('../notifications'),
translator = require('../../public/src/translator'); translator = require('../../public/src/modules/translator');
module.exports = function(User) { module.exports = function(User) {

@ -7,7 +7,7 @@ var async = require('async'),
user = require('../user'), user = require('../user'),
utils = require('../../public/src/utils'), utils = require('../../public/src/utils'),
translator = require('../../public/src/translator'), translator = require('../../public/src/modules/translator'),
plugins = require('../plugins'), plugins = require('../plugins'),
db = require('../database'), db = require('../database'),
meta = require('../meta'), meta = require('../meta'),

@ -6,7 +6,7 @@ var async = require('async'),
user = require('../user'), user = require('../user'),
utils = require('../../public/src/utils'), utils = require('../../public/src/utils'),
translator = require('../../public/src/translator'), translator = require('../../public/src/modules/translator'),
db = require('../database'), db = require('../database'),
meta = require('../meta'), meta = require('../meta'),

@ -19,24 +19,6 @@
</div> </div>
<div class="panel panel-default">
<div class="panel-heading">Privilege Thresholds</div>
<div class="panel-body">
<form>
<p class="help-block">
Use privilege thresholds to manage how much reputation a user must gain to receive moderator access.
</p>
<strong>Manage Thread</strong><br /> <input type="text" class="form-control" value="1000" data-field="privileges:manage_topic"><br />
<strong>Manage Content</strong><br /> <input type="text" class="form-control" value="1000" data-field="privileges:manage_content"><br />
<div class="checkbox">
<label>
<input type="checkbox" data-field="privileges:disabled"> <strong>Disable Privilege Threshold System</strong>
</label>
</div>
</form>
</div>
</div>
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading">Activity Thresholds</div> <div class="panel-heading">Activity Thresholds</div>
<div class="panel-body"> <div class="panel-body">

Loading…
Cancel
Save