Merge pull request #3 from NodeBB/master

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

@ -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",

@ -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;

@ -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() {

@ -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();
});
});

@ -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 = $('<div/>').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 = $('<div/>').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){

@ -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 = '',

@ -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,

@ -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) {

@ -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);

@ -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 = {};

@ -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
};

@ -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();

@ -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;

@ -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() {

@ -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);
};

@ -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 = '<i class="fa fa-check"></i>';

@ -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 = '';

@ -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 = {};

@ -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);
}

@ -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,

@ -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;

@ -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 = {};

@ -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 = {};

@ -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) {

@ -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;

@ -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) {

@ -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;

@ -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] + '"]');
}
};
}());
return components;
});

@ -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: {},

@ -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;

@ -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() {

@ -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: {}

@ -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 = {};

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

@ -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 = {}
);

@ -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;

@ -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);
});
});
};

@ -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');

@ -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;

@ -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'
],

@ -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 = {};

@ -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'),

@ -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) {

@ -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) {

@ -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'),

@ -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<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;

@ -21,45 +21,34 @@ module.exports = function(privileges) {
if (!Array.isArray(pids) || !pids.length) {
return callback(null, []);
}
async.parallel({
manage: function(next) {
helpers.hasEnoughReputationFor(['privileges:manage_content', 'privileges:manage_topic'], uid, next);
},
isAdministrator: function(next) {
isAdmin: function(next){
user.isAdministrator(uid, next);
},
}, function(err, userResults) {
if(err) {
isModerator: function(next) {
posts.isModerator(pids, uid, next);
},
isOwner: function(next) {
posts.isOwner(pids, uid, next);
}
}, function(err, results) {
if (err) {
return callback(err);
}
var userPriv = userResults.isAdministrator || userResults.manage;
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 = [];
var privileges = [];
for (var i=0; i<pids.length; ++i) {
var editable = userPriv || postResults.isModerator[i] || postResults.isOwner[i];
privileges.push({
editable: editable,
view_deleted: editable,
move: userResults.isAdministrator || postResults.isModerator[i]
});
}
for (var i=0; i<pids.length; ++i) {
var editable = results.isAdmin || results.isModerator[i] || results.isOwner[i];
privileges.push({
editable: editable,
view_deleted: editable,
move: results.isAdmin || results.isModerator[i]
});
}
callback(null, privileges);
});
callback(null, privileges);
});
};
@ -126,7 +115,7 @@ module.exports = function(privileges) {
return callback(new Error('[[error:post-edit-duration-expired, ' + meta.config.postEditDuration + ']]'));
}
callback(null, results.isEditable.editable);
});
});
};
privileges.posts.canMove = function(pid, uid, callback) {
@ -154,16 +143,11 @@ module.exports = function(privileges) {
if (isLocked) {
return callback(null, {isLocked: true});
}
helpers.some([
function(next) {
posts.isOwner(pid, uid, next);
},
function(next) {
helpers.hasEnoughReputationFor(['privileges:manage_content', 'privileges:manage_topic'], uid, next);
}
], function(err, editable) {
next(err, {editable: editable});
});
posts.isOwner(pid, uid, next);
},
function(isOwner, next) {
next(null, {editable: isOwner});
}
], callback);
}
@ -184,7 +168,7 @@ module.exports = function(privileges) {
if (err || !cid) {
return next(err, false);
}
user.isModerator(uid, cid, next);
});
},

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

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

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

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

@ -19,24 +19,6 @@
</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-heading">Activity Thresholds</div>
<div class="panel-body">

Loading…
Cancel
Save