adding admin panel integration to plugins (issue #143)

v1.18.x
Julian Lam 12 years ago
parent 871591b92d
commit 777173d9f4

@ -141,4 +141,10 @@
}
}
}
.plugins {
li {
list-style-type: none;
}
}
}

@ -0,0 +1,22 @@
var nodebb_admin = nodebb_admin || {};
(function() {
var plugins = {
init: function() {
// socket.on('api:admin.plugins.getInstalled', function(pluginsArr) {
// var pluginsFrag = document.createDocumentFragment(),
// liEl = document.createElement('li');
// for(var x=0,numPlugins=pluginsArr.length;x<numPlugins;x++) {
// liEl.setAttribute('data-plugin-id', pluginsArr[x].id);
// }
// });
}
};
jQuery(document).ready(function() {
nodebb_admin.plugins = plugins;
nodebb_admin.plugins.init();
// socket.emit('api:admin.plugins.getInstalled');
});
})();

@ -74,6 +74,7 @@
<li class=''><a href='{relative_path}/admin/users/latest'><i class='icon-user'></i> Users</a></li>
<li class=''><a href='{relative_path}/admin/topics'><i class='icon-book'></i> Topics</a></li>
<li class=''><a href='{relative_path}/admin/themes'><i class='icon-th'></i> Themes</a></li>
<li class=''><a href='{relative_path}/admin/plugins'><i class='icon-code-fork'></i> Plugins</a></li>
<li class=''><a href='{relative_path}/admin/settings'><i class='icon-cogs'></i> Settings</a></li>
<li class=''><a href='{relative_path}/admin/redis'><i class='icon-hdd'></i> Redis</a></li>
<li class=''><a href="{relative_path}/admin/motd"><i class="icon-comment"></i> MOTD</a></li>

@ -0,0 +1,14 @@
<h1>Plugins</h1>
<ul class="plugins">
<!-- BEGIN plugins -->
<li data-plugin-id="{plugins.id}">
<h2>{plugins.name}</h2>
<p>{plugins.description}</p>
<p>For more information: <a href="{plugins.url}">{plugins.url}</a></p>
</li>
<!-- END plugins -->
<!-- <li><i class="icon-refresh icon-spin"></i> Loading plugins</li> -->
</ul>
<script type="text/javascript" src="{relative_path}/src/forum/admin/plugins.js"></script>

@ -7,6 +7,7 @@
"admin/redis[^]*": "admin/redis",
"admin/index[^]*": "admin/index",
"admin/themes[^]*": "admin/themes",
"admin/plugins[^]*": "admin/plugins",
"admin/settings[^]*": "admin/settings",
"admin/twitter[^]*": "admin/twitter",
"admin/facebook[^]*": "admin/facebook",

@ -119,9 +119,33 @@ var fs = require('fs'),
}
}
},
showInstalled: function() {
isActive: function(id, callback) {
RDB.sismember('plugins:active', id, callback);
},
toggleActive: function(id, callback) {
this.isActive(id, function(err, active) {
if (err) {
if (global.env === 'development') console.log('Info: [plugins] Could not toggle active state on plugin \'' + id + '\'');
return;
}
RDB[(active ? 'srem' : 'sadd')]('plugins:active', id, function(err, success) {
if (err) {
if (global.env === 'development') console.log('Info: [plugins] Could not toggle active state on plugin \'' + id + '\'');
return;
}
callback({
id: id,
active: !active
});
});
});
},
showInstalled: function(callback) {
// TODO: Also check /node_modules
var moduleBasePath = path.join(__dirname, '../plugins');
var _self = this;
moduleBasePath = path.join(__dirname, '../plugins');
async.waterfall([
function(next) {
@ -134,26 +158,50 @@ var fs = require('fs'),
var modulePath = path.join(moduleBasePath, file),
configPath;
fs.stat(path.join(moduleBasePath, file), function(err, stats) {
if (err || !stats.isDirectory()) return next(); //Silently fail
// Load the config file
fs.readFile(path.join(modulePath, 'plugin.json'), function(err, configJSON) {
if (err) return next(); // Silently fail if config can't be read
async.waterfall([
function(next) {
fs.stat(path.join(moduleBasePath, file), next);
},
function(stats, next) {
if (stats.isDirectory()) fs.readFile(path.join(modulePath, 'plugin.json'), next);
else next(new Error('not-a-directory'));
},
function(configJSON, next) {
var config = JSON.parse(configJSON);
delete config.library;
delete config.hooks;
_self.isActive(config.id, function(err, active) {
if (err) next(new Error('no-active-state'));
plugins.push(config);
next();
});
delete config.library;
delete config.hooks;
config.active = active;
next(null, config);
});
}
], function(err, config) {
if (err) next(); // Silently fail
plugins.push(config);
});
// fs.stat(path.join(moduleBasePath, file), function(err, stats) {
// if (err || !stats.isDirectory()) return next(); // Silently fail
// // Load the config file
// fs.readFile(path.join(modulePath, 'plugin.json'), function(err, configJSON) {
// if (err) return next(); // Silently fail if config can't be read
// var config = JSON.parse(configJSON);
// delete config.library;
// delete config.hooks;
// plugins.push(config);
// next();
// });
// });
}, function(err) {
next(null, plugins);
});
}
], function(err, plugins) {
console.log('plugins:', plugins);
callback(err, plugins);
});
}
}

@ -3,7 +3,8 @@ var user = require('./../user.js'),
topics = require('./../topics.js'),
RDB = require('./../redis.js'),
pkg = require('./../../package.json'),
categories = require('./../categories.js');
categories = require('./../categories.js'),
plugins = require('../plugins');
(function(Admin) {
Admin.isAdmin = function(req, res, next) {
@ -23,8 +24,12 @@ var user = require('./../user.js'),
Admin.create_routes = function(app) {
(function() {
var routes = ['categories', 'users', 'topics', 'settings', 'themes', 'twitter', 'facebook', 'gplus', 'redis', 'motd',
'users/latest', 'users/sort-posts', 'users/sort-reputation', 'users/search'];
var routes = [
'categories', 'users', 'topics', 'settings', 'themes',
'twitter', 'facebook', 'gplus', 'redis', 'motd',
'users/latest', 'users/sort-posts', 'users/sort-reputation',
'users/search', 'plugins'
];
for (var i=0, ii=routes.length; i<ii; i++) {
(function(route) {
@ -136,6 +141,15 @@ var user = require('./../user.js'),
res.json(finalData);
});
break;
case 'plugins':
plugins.showInstalled(function(err, plugins) {
if (err || !Array.isArray(plugins)) plugins = [];
res.json(200, {
plugins: plugins
});
});
break;
default :
res.json({});
}

@ -25,7 +25,8 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }),
admin = {
'categories': require('./admin/categories.js'),
'user': require('./admin/user.js')
};
},
plugins = require('./plugins');
(function(io) {
var users = {},
@ -631,6 +632,14 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }),
socket.emit('api:admin:themes.getInstalled', themeArr);
});
});
socket.on('api:admin.plugins.getInstalled', function() {
plugins.showInstalled(function(err, plugins) {
if (err) plugins = [];
return socket.emit('api:admin.plugins.getInstalled', plugins);
});
});
});
}(SocketIO));

Loading…
Cancel
Save