plugin installation takes a version now, and queries nbbpm, #2363

better error handling for #2363

upgrades now also call the suggestion route from nbbpm

upgrade button will show alert now if you try to upgrade past the suggested version, #2363
v1.18.x
Julian Lam 10 years ago
parent 0f66077bf5
commit 19297e2d22

@ -33,35 +33,16 @@ define('admin/extend/plugins', function() {
pluginsList.on('click', 'button[data-action="toggleInstall"]', function() {
pluginID = $(this).parents('li').attr('data-plugin-id');
var btn = $(this);
var activateBtn = btn.siblings('[data-action="toggleActive"]');
btn.html(btn.html() + 'ing')
.attr('disabled', true)
.find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.toggleInstall', pluginID, function(err, status) {
if (err) {
return app.alertError(err.message);
}
if (status.installed) {
btn.html('<i class="fa fa-trash-o"></i> Uninstall');
Plugins.suggest(pluginID, function(err, payload) {
if (!err) {
Plugins.toggleInstall(pluginID, payload.version);
} else {
btn.html('<i class="fa fa-download"></i> Install');
bootbox.confirm('<p>NodeBB could not reach the package manager, proceed with installation of latest version?</p><div class="alert alert-danger"><strong>Server returned (' + err.status + ')</strong>: ' + err.responseText + '</div>', function(confirm) {
if (confirm) {
Plugins.toggleInstall(pluginID, 'latest');
}
activateBtn.toggleClass('hidden', !status.installed);
btn.toggleClass('btn-danger', status.installed).toggleClass('btn-success', !status.installed)
.attr('disabled', false);
app.alert({
alert_id: 'plugin_toggled',
title: 'Plugin ' + (status.installed ? 'Installed' : 'Uninstalled'),
message: status.installed ? 'Plugin successfully installed, please activate the plugin.' : 'The plugin has been successfully deactivated and uninstalled.',
type: 'info',
timeout: 5000
});
}
});
});
@ -70,16 +51,31 @@ define('admin/extend/plugins', function() {
var parent = btn.parents('li');
pluginID = parent.attr('data-plugin-id');
btn.attr('disabled', true).find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.upgrade', pluginID, function(err) {
Plugins.suggest(pluginID, function(err, payload) {
if (!err) {
require(['semver'], function(semver) {
if (semver.gt(payload.version, parent.find('.currentVersion').text())) {
btn.attr('disabled', true).find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.upgrade', {
id: pluginID,
version: payload.version
}, function(err) {
if (err) {
return app.alertError(err.message);
}
parent.find('.fa-exclamation-triangle').remove();
parent.find('.currentVersion').text(parent.find('.latestVersion').text());
parent.find('.currentVersion').text(payload.version);
btn.remove();
});
} else {
bootbox.alert('<p>Your version of NodeBB (v' + app.config.version + ') is only cleared to upgrade to v' + payload.version + ' of this plugin. Please update your NodeBB if you wish to install a newer version of this plugin.');
}
});
} else {
bootbox.alert('<p>NodeBB could not reach the package manager, an upgrade is not suggested at this time.</p>');
}
});
});
@ -94,6 +90,58 @@ define('admin/extend/plugins', function() {
} else {
pluginsList.append('<li><p><i>No plugins found.</i></p></li>');
}
},
toggleInstall: function(pluginID, version, callback) {
var btn = $('li[data-plugin-id="' + pluginID + '"] button[data-action="toggleInstall"]');
var activateBtn = btn.siblings('[data-action="toggleActive"]');
btn.html(btn.html() + 'ing')
.attr('disabled', true)
.find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.toggleInstall', {
id: pluginID,
version: version
}, function(err, status) {
if (err) {
return app.alertError(err.message);
}
if (status.installed) {
btn.html('<i class="fa fa-trash-o"></i> Uninstall');
} else {
btn.html('<i class="fa fa-download"></i> Install');
}
activateBtn.toggleClass('hidden', !status.installed);
btn.toggleClass('btn-danger', status.installed).toggleClass('btn-success', !status.installed)
.attr('disabled', false);
app.alert({
alert_id: 'plugin_toggled',
title: 'Plugin ' + (status.installed ? 'Installed' : 'Uninstalled'),
message: status.installed ? 'Plugin successfully installed, please activate the plugin.' : 'The plugin has been successfully deactivated and uninstalled.',
type: 'info',
timeout: 5000
});
if (typeof callback === 'function') {
callback.apply(this, arguments);
}
});
},
suggest: function(pluginId, callback) {
var nbbVersion = app.config.version;
$.ajax('https://packages.nodebb.org/api/v1/suggest', {
type: 'GET',
data: {
package: pluginId,
version: nbbVersion
},
dataType: 'json'
}).done(function(payload) {
callback(undefined, payload);
}).fail(callback);
}
};

@ -2,7 +2,8 @@
'use strict';
var winston = require('winston'),
db = require('../database');
db = require('../database'),
pkg = require('../../package.json');
module.exports = function(Meta) {
@ -25,6 +26,7 @@ module.exports = function(Meta) {
Meta.configs.list = function (callback) {
db.getObject('config', function (err, config) {
config.version = pkg.version;
callback(err, config || {});
});
};

@ -550,7 +550,7 @@ var fs = require('fs'),
});
};
Plugins.toggleInstall = function(id, callback) {
Plugins.toggleInstall = function(id, version, callback) {
Plugins.isInstalled(id, function(err, installed) {
if (err) {
return callback(err);
@ -573,7 +573,7 @@ var fs = require('fs'),
npm.load({}, next);
},
function(res, next) {
npm.commands[installed ? 'uninstall' : 'install'](installed ? id : [id], next);
npm.commands[installed ? 'uninstall' : 'install'](installed ? id : [id + '@' + (version || 'latest')], next);
}
], function(err) {
callback(err, {
@ -584,13 +584,13 @@ var fs = require('fs'),
});
};
Plugins.upgrade = function(id, callback) {
Plugins.upgrade = function(id, version, callback) {
async.waterfall([
function(next) {
npm.load({}, next);
},
function(res, next) {
npm.commands.install([id], next);
npm.commands.install([id + '@' + (version || 'latest')], next);
}
], callback);
};

@ -97,12 +97,12 @@ SocketAdmin.plugins.toggleActive = function(socket, plugin_id, callback) {
plugins.toggleActive(plugin_id, callback);
};
SocketAdmin.plugins.toggleInstall = function(socket, plugin_id, callback) {
plugins.toggleInstall(plugin_id, callback);
SocketAdmin.plugins.toggleInstall = function(socket, data, callback) {
plugins.toggleInstall(data.id, data.version, callback);
};
SocketAdmin.plugins.upgrade = function(socket, plugin_id, callback) {
plugins.upgrade(plugin_id, callback);
SocketAdmin.plugins.upgrade = function(socket, data, callback) {
plugins.upgrade(data.id, data.version, callback);
};
SocketAdmin.widgets.set = function(socket, data, callback) {

Loading…
Cancel
Save