Merge branch 'master' of github.com:designcreateplay/NodeBB

v1.18.x
Julian Lam 12 years ago
commit ce77c82b0c

@ -86,6 +86,7 @@
webserver = require('./src/webserver.js'), webserver = require('./src/webserver.js'),
SocketIO = require('socket.io').listen(global.server, { log: false, transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket']}), SocketIO = require('socket.io').listen(global.server, { log: false, transports: ['websocket', 'xhr-polling', 'jsonp-polling', 'flashsocket']}),
websockets = require('./src/websockets.js'), websockets = require('./src/websockets.js'),
posts = require('./src/posts.js'),
plugins = require('./src/plugins'); // Don't remove this - plugins initializes itself plugins = require('./src/plugins'); // Don't remove this - plugins initializes itself
websockets.init(SocketIO); websockets.init(SocketIO);

@ -176,7 +176,7 @@ var ajaxify = {};
var scripts = [], var scripts = [],
script, script,
children_nodes = $(body_el).children(), children_nodes = $(body_el).find('script'),
child, child,
i; i;

@ -136,6 +136,7 @@ var socket,
var alert_id = 'alert_button_' + ((params.alert_id) ? params.alert_id : new Date().getTime()); var alert_id = 'alert_button_' + ((params.alert_id) ? params.alert_id : new Date().getTime());
var alert = $('#' + alert_id); var alert = $('#' + alert_id);
var title = params.title || '';
function startTimeout(div, timeout) { function startTimeout(div, timeout) {
var timeoutId = setTimeout(function () { var timeoutId = setTimeout(function () {
@ -148,7 +149,7 @@ var socket,
} }
if (alert.length > 0) { if (alert.length > 0) {
alert.find('strong').html(params.title); alert.find('strong').html(title);
alert.find('p').html(params.message); alert.find('p').html(params.message);
alert.attr('class', "alert toaster-alert " + "alert-" + params.type); alert.attr('class', "alert toaster-alert " + "alert-" + params.type);
@ -161,7 +162,7 @@ var socket,
p = document.createElement('p'); p = document.createElement('p');
p.innerHTML = params.message; p.innerHTML = params.message;
strong.innerHTML = params.title; strong.innerHTML = title;
div.className = "alert toaster-alert " + "alert-" + params.type; div.className = "alert toaster-alert " + "alert-" + params.type;

@ -16,9 +16,7 @@ jQuery('document').ready(function() {
}); });
socket.once('api:config.get', function(config) { socket.once('api:config.get', function(config) {
require(['forum/admin/settings'], function(Settings) { app.config = config;
Settings.config = config;
});
}); });
socket.emit('api:config.get'); socket.emit('api:config.get');

@ -1,18 +1,16 @@
define(function() { define(function() {
var Settings = {}; var Settings = {};
Settings.config = {};
Settings.init = function() { Settings.init = function() {
Settings.prepare(); Settings.prepare();
}; };
Settings.prepare = function() { Settings.prepare = function() {
// Come back in 500ms if the config isn't ready yet // Come back in 125ms if the config isn't ready yet
if (Settings.config === undefined) { if (!app.config) {
setTimeout(function() { setTimeout(function() {
Settings.prepare(); Settings.prepare();
}, 500); }, 125);
return; return;
} }
@ -25,21 +23,21 @@ define(function() {
key = fields[x].getAttribute('data-field'); key = fields[x].getAttribute('data-field');
inputType = fields[x].getAttribute('type'); inputType = fields[x].getAttribute('type');
if (fields[x].nodeName === 'INPUT') { if (fields[x].nodeName === 'INPUT') {
if (Settings.config[key]) { if (app.config[key]) {
switch (inputType) { switch (inputType) {
case 'text': case 'text':
case 'textarea': case 'textarea':
case 'number': case 'number':
fields[x].value = Settings.config[key]; fields[x].value = app.config[key];
break; break;
case 'checkbox': case 'checkbox':
fields[x].checked = Settings.config[key] === '1' ? true : false; fields[x].checked = app.config[key] === '1' ? true : false;
break; break;
} }
} }
} else if (fields[x].nodeName === 'TEXTAREA') { } else if (fields[x].nodeName === 'TEXTAREA') {
if (Settings.config[key]) fields[x].value = Settings.config[key]; if (app.config[key]) fields[x].value = app.config[key];
} }
} }

@ -76,35 +76,52 @@
<div class="well sidebar-nav"> <div class="well sidebar-nav">
<ul class="nav nav-list"> <ul class="nav nav-list">
<li class="nav-header">NodeBB</li> <li class="nav-header">NodeBB</li>
<li class='active'><a href='{relative_path}/admin/index'><i class='icon-home'></i> Home</a></li> <li class='active'>
<li class=''><a href='{relative_path}/admin/categories/active'><i class='icon-folder-close-alt'></i> Categories</a></li> <a href='{relative_path}/admin/index'><i class='icon-home'></i> Home</a>
<li class=''><a href='{relative_path}/admin/users/latest'><i class='icon-user'></i> Users</a></li> </li>
<li class=""><a href="{relative_path}/admin/groups"><i class="icon-group"></i> Groups</a></li> <li><a href='{relative_path}/admin/categories/active'><i class='icon-folder-close-alt'></i> Categories</a></li>
<li class=''><a href='{relative_path}/admin/topics'><i class='icon-book'></i> Topics</a></li> <li><a href='{relative_path}/admin/users/latest'><i class='icon-user'></i> Users</a></li>
<li class=''><a href='{relative_path}/admin/themes'><i class='icon-th'></i> Themes</a></li> <li><a href="{relative_path}/admin/groups"><i class="icon-group"></i> Groups</a></li>
<li class=''><a href='{relative_path}/admin/plugins'><i class='icon-code-fork'></i> Plugins</a></li> <li><a href='{relative_path}/admin/topics'><i class='icon-book'></i> Topics</a></li>
<li class=''><a href='{relative_path}/admin/settings'><i class='icon-cogs'></i> Settings</a></li> <li><a href='{relative_path}/admin/themes'><i class='icon-th'></i> Themes</a></li>
<li class=''><a href='{relative_path}/admin/redis'><i class='icon-hdd'></i> Redis</a></li> <li><a href='{relative_path}/admin/plugins'><i class='icon-code-fork'></i> Plugins</a></li>
<li class=''><a href='{relative_path}/admin/logger'><i class='icon-th'></i> Logger</a></li> <li><a href='{relative_path}/admin/settings'><i class='icon-cogs'></i> Settings</a></li>
<li class=''><a href="{relative_path}/admin/motd"><i class="icon-comment"></i> MOTD</a></li> <li><a href='{relative_path}/admin/redis'><i class='icon-hdd'></i> Redis</a></li>
<li><a href='{relative_path}/admin/logger'><i class='icon-th'></i> Logger</a></li>
<li><a href="{relative_path}/admin/motd"><i class="icon-comment"></i> MOTD</a></li>
</ul>
</div>
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">Social Authentication</li> <li class="nav-header">Social Authentication</li>
<li class=''><a href='{relative_path}/admin/twitter'><i class='icon-twitter-sign'></i> Twitter</a></li> <li><a href='{relative_path}/admin/twitter'><i class='icon-twitter-sign'></i> Twitter</a></li>
<li class=''><a href='{relative_path}/admin/facebook'><i class='icon-facebook-sign'></i> Facebook</a></li> <li><a href='{relative_path}/admin/facebook'><i class='icon-facebook-sign'></i> Facebook</a></li>
<li class=''><a href='{relative_path}/admin/gplus'><i class='icon-google-plus-sign'></i> Google+</a></li> <li><a href='{relative_path}/admin/gplus'><i class='icon-google-plus-sign'></i> Google+</a></li>
<!--<li class="nav-header">Custom Modules</li>--> </ul>
<!-- <li class=''><a href=''>Search</a></li> --> </div>
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">Plugins</li>
<!-- BEGIN plugins -->
<li>
<a href='{relative_path}/admin{plugins.route}'><i class="{plugins.icon}"></i> {plugins.name}</a>
</li>
<!-- END plugins -->
</ul>
</div>
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">Unit Tests</li> <li class="nav-header">Unit Tests</li>
<ul class="nav nav-list"> <ul class="nav nav-list">
<li class=''><a href='{relative_path}/admin/testing/categories'>Categories</a></li> <li><a href='{relative_path}/admin/testing/categories'>Categories</a></li>
<!--<li class=''><a href='{relative_path}/admin/testing/topics'>Topics</a></li> <!--<li><a href='{relative_path}/admin/testing/topics'>Topics</a></li>
<li class=''><a href='{relative_path}/admin/testing/posts'>Posts</a></li> <li><a href='{relative_path}/admin/testing/posts'>Posts</a></li>
<li class=''><a href='{relative_path}/admin/testing/accounts'>Accounts</a></li> <li><a href='{relative_path}/admin/testing/accounts'>Accounts</a></li>
<li class=''><a href='{relative_path}/admin/testing/chat'>Chat</a></li> <li><a href='{relative_path}/admin/testing/chat'>Chat</a></li>
<li class=''><a href='{relative_path}/admin/testing/notifications'>Notifications</a></li> <li><a href='{relative_path}/admin/testing/notifications'>Notifications</a></li>
<li class=''><a href='{relative_path}/admin/testing/friends'>Friends</a></li> <li><a href='{relative_path}/admin/testing/friends'>Friends</a></li>
<li class=''><a href='{relative_path}/admin/testing/feed'>RSS Feed</a></li> <li><a href='{relative_path}/admin/testing/feed'>RSS Feed</a></li>
<li class=''><a href='{relative_path}/admin/testing/emails'>Emails</a></li>--> <li><a href='{relative_path}/admin/testing/emails'>Emails</a></li>-->
</ul> </ul>
</ul> </ul>
</div><!--/.well --> </div><!--/.well -->

@ -90,6 +90,16 @@
<!-- END moderators --> <!-- END moderators -->
</div> </div>
</div> </div>
<!-- BEGIN sidebars -->
<div class="sidebar-block img-thumbnail {sidebars.block_class}">
<div class="block-header">
{sidebars.header}
</div>
<div class="block-content">
{sidebars.content}
</div>
</div>
<!-- END sidebars -->
</div> </div>
</div> </div>

@ -66,6 +66,9 @@
<div id="content_{main_posts.pid}" class="post-content" itemprop="articleBody">{main_posts.content}</div> <div id="content_{main_posts.pid}" class="post-content" itemprop="articleBody">{main_posts.content}</div>
<div class="post-signature">{main_posts.signature}</div> <div class="post-signature">{main_posts.signature}</div>
<div class="post-info"> <div class="post-info">
<span class="pull-left">
{main_posts.additional_profile_info}
</span>
<span class="pull-right"> <span class="pull-right">
posted <span class="relativeTimeAgo timeago" title="{main_posts.relativeTime}"></span> posted <span class="relativeTimeAgo timeago" title="{main_posts.relativeTime}"></span>
<span class="{main_posts.edited-class}">| last edited by <strong><a href="/user/{main_posts.editorslug}">{main_posts.editorname}</a></strong></span> <span class="{main_posts.edited-class}">| last edited by <strong><a href="/user/{main_posts.editorslug}">{main_posts.editorname}</a></strong></span>
@ -127,6 +130,9 @@
<div id="content_{posts.pid}" class="post-content" itemprop="text">{posts.content}</div> <div id="content_{posts.pid}" class="post-content" itemprop="text">{posts.content}</div>
<div class="post-signature">{posts.signature}</div> <div class="post-signature">{posts.signature}</div>
<div class="post-info"> <div class="post-info">
<span class="pull-left">
{posts.additional_profile_info}
</span>
<span class="pull-right"> <span class="pull-right">
posted <span class="relativeTimeAgo timeago" title="{posts.relativeTime}"></span> posted <span class="relativeTimeAgo timeago" title="{posts.relativeTime}"></span>
<span class="{posts.edited-class}">| last edited by <strong><a href="/user/{posts.editorslug}">{posts.editorname}</a></strong></span> <span class="{posts.edited-class}">| last edited by <strong><a href="/user/{posts.editorslug}">{posts.editorname}</a></strong></span>

@ -55,9 +55,16 @@ var RDB = require('./redis.js'),
Categories.getActiveUsers(category_id, next); Categories.getActiveUsers(category_id, next);
} }
async.parallel([getTopicIds, getActiveUsers], function(err, results) { function getSidebars(next) {
plugins.fireHook('filter:category.build_sidebars', [], function(err, sidebars) {
next(err, sidebars);
});
}
async.parallel([getTopicIds, getActiveUsers, getSidebars], function(err, results) {
var tids = results[0], var tids = results[0],
active_users = results[1]; active_users = results[1],
sidebars = results[2];
var categoryData = { var categoryData = {
'category_name': category_name, 'category_name': category_name,
@ -72,7 +79,8 @@ var RDB = require('./redis.js'),
'topics': [], 'topics': [],
'twitter-intent-url': 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(nconf.get('url') + 'category/' + category_slug) + '&text=' + encodeURIComponent(category_name), 'twitter-intent-url': 'https://twitter.com/intent/tweet?url=' + encodeURIComponent(nconf.get('url') + 'category/' + category_slug) + '&text=' + encodeURIComponent(category_name),
'facebook-share-url': 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(nconf.get('url') + 'category/' + category_slug), 'facebook-share-url': 'https://www.facebook.com/sharer/sharer.php?u=' + encodeURIComponent(nconf.get('url') + 'category/' + category_slug),
'google-share-url': 'https://plus.google.com/share?url=' + encodeURIComponent(nconf.get('url') + 'category/' + category_slug) 'google-share-url': 'https://plus.google.com/share?url=' + encodeURIComponent(nconf.get('url') + 'category/' + category_slug),
'sidebars': sidebars
}; };
function getTopics(next) { function getTopics(next) {

@ -274,7 +274,13 @@ var fs = require('fs'),
fs.readFile(path.join(file, 'plugin.json'), next); fs.readFile(path.join(file, 'plugin.json'), next);
}, },
function(configJSON, next) { function(configJSON, next) {
var config = JSON.parse(configJSON); try {
var config = JSON.parse(configJSON);
} catch (err) {
winston.warn("Plugin: " + file + " is corrupted or invalid. Please check plugin.json for errors.")
return next(err, null);
}
_self.isActive(config.id, function(err, active) { _self.isActive(config.id, function(err, active) {
if (err) next(new Error('no-active-state')); if (err) next(new Error('no-active-state'));

@ -16,6 +16,7 @@ var RDB = require('./redis.js'),
winston = require('winston'); winston = require('winston');
(function(Posts) { (function(Posts) {
var customUserInfo = {};
Posts.getPostsByTid = function(tid, start, end, callback) { Posts.getPostsByTid = function(tid, start, end, callback) {
RDB.lrange('tid:' + tid + ':posts', start, end, function(err, pids) { RDB.lrange('tid:' + tid + ':posts', start, end, function(err, pids) {
@ -46,17 +47,27 @@ var RDB = require('./redis.js'),
post.picture = userData.picture || require('gravatar').url('', {}, https = nconf.get('https')); post.picture = userData.picture || require('gravatar').url('', {}, https = nconf.get('https'));
post.signature = signature; post.signature = signature;
if (post.editor !== '') { for (var info in customUserInfo) {
user.getUserFields(post.editor, ['username', 'userslug'], function(err, editorData) { if (customUserInfo.hasOwnProperty(info)) {
if (err) return callback(); post[info] = userData[info] || customUserInfo[info];
}
}
plugins.fireHook('filter:posts.custom_profile_info', {profile: "", uid: post.uid}, function(err, profile_info) {
post.additional_profile_info = profile_info.profile;
post.editorname = editorData.username; if (post.editor !== '') {
post.editorslug = editorData.userslug; user.getUserFields(post.editor, ['username', 'userslug'], function(err, editorData) {
if (err) return callback();
post.editorname = editorData.username;
post.editorslug = editorData.userslug;
callback();
});
} else {
callback(); callback();
}); }
} else { });
callback();
}
}); });
}); });
}; };

@ -18,10 +18,17 @@ var user = require('./../user.js'),
}); });
} }
Admin.build_header = function (res) { Admin.build_header = function (res, callback) {
return templates['admin/header'].parse({ var custom_header = {
csrf: res.locals.csrf_token, 'plugins': []
relative_path: nconf.get('relative_path') };
plugins.fireHook('filter:admin.header.build', custom_header, function(err, custom_header) {
callback(err, templates['admin/header'].parse({
csrf: res.locals.csrf_token,
relative_path: nconf.get('relative_path'),
plugins: custom_header.plugins
}));
}); });
} }
@ -38,7 +45,9 @@ var user = require('./../user.js'),
for (var i = 0, ii = routes.length; i < ii; i++) { for (var i = 0, ii = routes.length; i < ii; i++) {
(function (route) { (function (route) {
app.get('/admin/' + route, Admin.isAdmin, function (req, res) { app.get('/admin/' + route, Admin.isAdmin, function (req, res) {
res.send(Admin.build_header(res) + app.create_route('admin/' + route) + templates['admin/footer']); Admin.build_header(res, function(err, header) {
res.send(header + app.create_route('admin/' + route) + templates['admin/footer']);
});
}); });
}(routes[i])); }(routes[i]));
} }
@ -48,7 +57,9 @@ var user = require('./../user.js'),
for (var i = 0, ii = unit_tests.length; i < ii; i++) { for (var i = 0, ii = unit_tests.length; i < ii; i++) {
(function (route) { (function (route) {
app.get('/admin/testing/' + route, Admin.isAdmin, function (req, res) { app.get('/admin/testing/' + route, Admin.isAdmin, function (req, res) {
res.send(Admin.build_header(res) + app.create_route('admin/testing/' + route) + templates['admin/footer']); Admin.build_header(res, function(err, header) {
res.send(header + app.create_route('admin/testing/' + route) + templates['admin/footer']);
});
}); });
}(unit_tests[i])); }(unit_tests[i]));
} }
@ -57,14 +68,42 @@ var user = require('./../user.js'),
app.namespace('/admin', function () { app.namespace('/admin', function () {
app.get('/', Admin.isAdmin, function (req, res) { app.get('/', Admin.isAdmin, function (req, res) {
res.send(Admin.build_header(res) + app.create_route('admin/index') + templates['admin/footer']); Admin.build_header(res, function(err, header) {
res.send(header + app.create_route('admin/index') + templates['admin/footer']);
});
}); });
app.get('/index', Admin.isAdmin, function (req, res) { app.get('/index', Admin.isAdmin, function (req, res) {
res.send(Admin.build_header(res) + app.create_route('admin/index') + templates['admin/footer']); Admin.build_header(res, function(err, header) {
res.send(header + app.create_route('admin/index') + templates['admin/footer']);
});
}); });
}); });
var custom_routes = {
'routes': [],
'api_methods': []
};
plugins.ready(function() {
plugins.fireHook('filter:admin.create_routes', custom_routes, function(err, custom_routes) {
var routes = custom_routes.routes;
for (var route in routes) {
if (routes.hasOwnProperty(route)) {
app[routes[route].method || 'get']('/admin' + routes[route].route, function(req, res) {
routes[route].options(req, res, function(options) {
Admin.build_header(res, function (err, header) {
res.send(header + options.content + templates['admin/footer']);
});
});
});
}
}
});
});
app.namespace('/api/admin', function () { app.namespace('/api/admin', function () {
app.get('/index', function (req, res) { app.get('/index', function (req, res) {
res.json({ res.json({

@ -1,5 +1,5 @@
var RDB = require('./redis.js') var RDB = require('./redis.js'),
schema = require('./schema.js'), schema = require('./schema.js'),
posts = require('./posts.js'), posts = require('./posts.js'),
utils = require('./../public/src/utils.js'), utils = require('./../public/src/utils.js'),
user = require('./user.js'), user = require('./user.js'),

Loading…
Cancel
Save