Files
NodeBB/public/src/admin/extend/plugins.js

339 lines
10 KiB
JavaScript
Raw Normal View History

2017-02-18 01:56:23 -07:00
'use strict';
2020-10-10 23:01:32 -04:00
define('admin/extend/plugins', [
'translator',
'benchpress',
'bootbox',
2020-10-10 23:01:32 -04:00
'jquery-ui/widgets/sortable',
], function (translator, Benchpress, bootbox) {
const Plugins = {};
Plugins.init = function () {
const pluginsList = $('.plugins');
const numPlugins = pluginsList[0].querySelectorAll('li').length;
let pluginID;
2014-12-01 13:24:13 -05:00
if (!numPlugins) {
translator.translate('<li><p><i>[[admin/extend/plugins:none-found]]</i></p></li>', function (html) {
pluginsList.append(html);
});
2014-12-01 13:24:13 -05:00
return;
}
const searchInputEl = document.querySelector('#plugin-search');
searchInputEl.value = '';
2015-08-20 12:35:38 -04:00
pluginsList.on('click', 'button[data-action="toggleActive"]', function () {
const pluginEl = $(this).parents('li');
2016-05-01 13:09:41 +03:00
pluginID = pluginEl.attr('data-plugin-id');
const btn = $('[id="' + pluginID + '"] [data-action="toggleActive"]');
const pluginData = ajaxify.data.installed[pluginEl.attr('data-plugin-index')];
2017-08-03 12:06:01 -04:00
2017-08-03 12:15:43 -04:00
function toggleActivate() {
2017-08-03 12:06:01 -04:00
socket.emit('admin.plugins.toggleActive', pluginID, function (err, status) {
if (err) {
return app.alertError(err);
2014-12-01 13:24:13 -05:00
}
2017-08-03 12:06:01 -04:00
translator.translate('<i class="fa fa-power-off"></i> [[admin/extend/plugins:plugin-item.' + (status.active ? 'deactivate' : 'activate') + ']]', function (buttonText) {
btn.html(buttonText);
btn.toggleClass('btn-warning', status.active).toggleClass('btn-success', !status.active);
// clone it to active plugins tab
2018-09-08 14:01:15 -04:00
if (status.active && !$('#active [id="' + pluginID + '"]').length) {
2017-08-03 12:06:01 -04:00
$('#active ul').prepend(pluginEl.clone(true));
}
2017-08-03 12:06:01 -04:00
// Toggle active state in template data
pluginData.active = !pluginData.active;
2017-08-03 12:06:01 -04:00
app.alert({
alert_id: 'plugin_toggled',
title: '[[admin/extend/plugins:alert.' + (status.active ? 'enabled' : 'disabled') + ']]',
message: '[[admin/extend/plugins:alert.' + (status.active ? 'activate-success' : 'deactivate-success') + ']]',
type: status.active ? 'warning' : 'success',
timeout: 5000,
clickfn: function () {
require(['admin/modules/instance'], function (instance) {
instance.rebuildAndRestart();
2017-08-03 12:06:01 -04:00
});
},
});
});
});
}
if (pluginData.license && pluginData.active !== true) {
Benchpress.render('admin/partials/plugins/license', pluginData).then(function (html) {
2017-08-03 12:15:43 -04:00
bootbox.dialog({
2017-08-03 12:06:01 -04:00
title: '[[admin/extend/plugins:license.title]]',
message: html,
size: 'large',
buttons: {
cancel: {
label: '[[modules:bootbox.cancel]]',
className: 'btn-link',
},
save: {
label: '[[modules:bootbox.confirm]]',
className: 'btn-primary',
callback: toggleActivate,
2017-08-03 12:15:43 -04:00
},
2017-02-17 19:31:21 -07:00
},
onShown: function () {
const saveEl = this.querySelector('button.btn-primary');
if (saveEl) {
saveEl.focus();
}
},
});
});
2017-08-03 12:06:01 -04:00
} else {
toggleActivate(pluginID);
}
2014-12-01 13:24:13 -05:00
});
pluginsList.on('click', 'button[data-action="toggleInstall"]', function () {
const btn = $(this);
2015-09-12 15:14:49 -04:00
btn.attr('disabled', true);
2014-12-01 13:24:13 -05:00
pluginID = $(this).parents('li').attr('data-plugin-id');
2014-12-01 13:24:13 -05:00
if ($(this).attr('data-installed') === '1') {
return Plugins.toggleInstall(pluginID, $(this).parents('li').attr('data-version'));
}
Plugins.suggest(pluginID, function (err, payload) {
2014-12-01 13:24:13 -05:00
if (err) {
bootbox.confirm(translator.compile('admin/extend/plugins:alert.suggest-error', err.status, err.responseText), function (confirm) {
2014-12-01 13:24:13 -05:00
if (confirm) {
Plugins.toggleInstall(pluginID, 'latest');
2015-09-12 15:14:49 -04:00
} else {
btn.removeAttr('disabled');
2014-10-09 18:42:05 -04:00
}
});
2014-12-01 13:24:13 -05:00
return;
}
2017-02-18 15:05:36 -07:00
if (payload.version !== 'latest') {
Plugins.toggleInstall(pluginID, payload.version);
} else if (payload.version === 'latest') {
confirmInstall(pluginID, function (confirm) {
if (confirm) {
Plugins.toggleInstall(pluginID, 'latest');
} else {
btn.removeAttr('disabled');
}
});
} else {
btn.removeAttr('disabled');
}
2014-12-01 13:24:13 -05:00
});
});
2014-10-09 18:42:05 -04:00
pluginsList.on('click', 'button[data-action="upgrade"]', function () {
const btn = $(this);
const parent = btn.parents('li');
2014-12-01 13:24:13 -05:00
pluginID = parent.attr('data-plugin-id');
2014-10-09 18:42:05 -04:00
Plugins.suggest(pluginID, function (err, payload) {
2014-12-01 13:24:13 -05:00
if (err) {
return bootbox.alert('[[admin/extend/plugins:alert.package-manager-unreachable]]');
2014-12-01 13:24:13 -05:00
}
require(['compare-versions'], function (compareVersions) {
const currentVersion = parent.find('.currentVersion').text();
if (payload.version !== 'latest' && compareVersions.compare(payload.version, currentVersion, '>')) {
2014-12-01 13:24:13 -05:00
upgrade(pluginID, btn, payload.version);
} else if (payload.version === 'latest') {
confirmInstall(pluginID, function () {
2014-12-01 13:24:13 -05:00
upgrade(pluginID, btn, payload.version);
});
} else {
bootbox.alert(translator.compile('admin/extend/plugins:alert.incompatible', app.config.version, payload.version));
2014-12-01 13:24:13 -05:00
}
});
2014-12-01 13:24:13 -05:00
});
});
$(searchInputEl).on('input propertychange', function () {
const term = $(this).val();
$('.plugins li').each(function () {
const pluginId = $(this).attr('data-plugin-id');
2014-12-01 13:24:13 -05:00
$(this).toggleClass('hide', pluginId && pluginId.indexOf(term) === -1);
});
});
2015-02-23 15:55:35 -05:00
$('#plugin-submit-usage').on('click', function () {
socket.emit('admin.config.setMultiple', {
submitPluginUsage: $(this).prop('checked') ? '1' : '0',
}, function (err) {
if (err) {
return app.alertError(err.message);
}
});
});
$('#plugin-order').on('click', function () {
2015-02-23 15:55:35 -05:00
$('#order-active-plugins-modal').modal('show');
socket.emit('admin.plugins.getActive', function (err, activePlugins) {
2015-02-23 15:55:35 -05:00
if (err) {
return app.alertError(err);
}
let html = '';
activePlugins.forEach(function (plugin) {
html += '<li class="">' + plugin + '<span class="pull-right"><i class="fa fa-chevron-up"></i><i class="fa fa-chevron-down"></i></span></li>';
2015-02-23 15:55:35 -05:00
});
if (!activePlugins.length) {
translator.translate('[[admin/extend/plugins:none-active]]', function (text) {
$('#order-active-plugins-modal .plugin-list').html(text).sortable();
});
return;
2015-02-23 15:55:35 -05:00
}
const list = $('#order-active-plugins-modal .plugin-list');
list.html(html).sortable();
list.find('.fa-chevron-up').on('click', function () {
const item = $(this).parents('li');
item.prev().before(item);
});
list.find('.fa-chevron-down').on('click', function () {
const item = $(this).parents('li');
item.next().after(item);
});
2015-02-23 15:55:35 -05:00
});
});
$('#save-plugin-order').on('click', function () {
const plugins = $('#order-active-plugins-modal .plugin-list').children();
const data = [];
plugins.each(function (index, el) {
2017-02-18 12:30:49 -07:00
data.push({ name: $(el).text(), order: index });
2015-02-23 15:55:35 -05:00
});
socket.emit('admin.plugins.orderActivePlugins', data, function (err) {
2015-02-23 15:55:35 -05:00
if (err) {
return app.alertError(err.message);
}
$('#order-active-plugins-modal').modal('hide');
app.alert({
alert_id: 'plugin_reordered',
title: '[[admin/extend/plugins:alert.reorder]]',
message: '[[admin/extend/plugins:alert.reorder-success]]',
type: 'success',
timeout: 5000,
clickfn: function () {
require(['admin/modules/instance'], function (instance) {
instance.rebuildAndRestart();
});
},
});
2015-02-23 15:55:35 -05:00
});
});
2016-02-23 14:16:42 -05:00
populateUpgradeablePlugins();
2016-05-01 13:09:41 +03:00
populateActivePlugins();
searchInputEl.focus();
2014-12-01 13:24:13 -05:00
};
2014-12-01 13:24:13 -05:00
function confirmInstall(pluginID, callback) {
bootbox.confirm(translator.compile('admin/extend/plugins:alert.possibly-incompatible', pluginID), function (confirm) {
2017-02-18 02:38:03 -07:00
callback(confirm);
2014-12-01 13:24:13 -05:00
});
}
function upgrade(pluginID, btn, version) {
btn.attr('disabled', true).find('i').attr('class', 'fa fa-refresh fa-spin');
socket.emit('admin.plugins.upgrade', {
id: pluginID,
2017-02-17 19:31:21 -07:00
version: version,
}, function (err, isActive) {
2014-12-01 13:24:13 -05:00
if (err) {
return app.alertError(err.message);
}
const parent = btn.parents('li');
2014-12-01 13:24:13 -05:00
parent.find('.fa-exclamation-triangle').remove();
parent.find('.currentVersion').text(version);
btn.remove();
2015-03-06 13:00:56 -05:00
if (isActive) {
app.alert({
alert_id: 'plugin_upgraded',
title: '[[admin/extend/plugins:alert.upgraded]]',
message: '[[admin/extend/plugins:alert.upgrade-success]]',
2015-03-06 13:00:56 -05:00
type: 'warning',
timeout: 5000,
clickfn: function () {
require(['admin/modules/instance'], function (instance) {
instance.rebuildAndRestart();
2015-06-08 15:50:33 -04:00
});
2017-02-17 19:31:21 -07:00
},
2015-03-06 13:00:56 -05:00
});
}
2014-12-01 13:24:13 -05:00
});
}
Plugins.toggleInstall = function (pluginID, version, callback) {
const btn = $('li[data-plugin-id="' + pluginID + '"] button[data-action="toggleInstall"]');
2015-09-12 15:14:49 -04:00
btn.find('i').attr('class', 'fa fa-refresh fa-spin');
2014-12-01 13:24:13 -05:00
socket.emit('admin.plugins.toggleInstall', {
id: pluginID,
2017-02-17 19:31:21 -07:00
version: version,
}, function (err, pluginData) {
2014-12-01 13:24:13 -05:00
if (err) {
2015-09-12 15:14:49 -04:00
btn.removeAttr('disabled');
2014-12-01 13:24:13 -05:00
return app.alertError(err.message);
}
ajaxify.refresh();
2014-12-01 13:24:13 -05:00
app.alert({
alert_id: 'plugin_toggled',
title: '[[admin/extend/plugins:alert.' + (pluginData.installed ? 'installed' : 'uninstalled') + ']]',
message: '[[admin/extend/plugins:alert.' + (pluginData.installed ? 'install-success' : 'uninstall-success') + ']]',
2014-12-01 13:24:13 -05:00
type: 'info',
2017-02-17 19:31:21 -07:00
timeout: 5000,
2014-12-01 13:24:13 -05:00
});
2014-12-01 13:24:13 -05:00
if (typeof callback === 'function') {
callback.apply(this, arguments);
}
});
};
Plugins.suggest = function (pluginId, callback) {
const nbbVersion = app.config.version.match(/^\d+\.\d+\.\d+/);
$.ajax((app.config.registry || 'https://packages.nodebb.org') + '/api/v1/suggest', {
2014-12-01 13:24:13 -05:00
type: 'GET',
data: {
package: pluginId,
2017-02-17 19:31:21 -07:00
version: nbbVersion[0],
2014-12-01 13:24:13 -05:00
},
2017-02-17 19:31:21 -07:00
dataType: 'json',
}).done(function (payload) {
2014-12-01 13:24:13 -05:00
callback(undefined, payload);
}).fail(callback);
};
2016-02-23 14:16:42 -05:00
function populateUpgradeablePlugins() {
$('#installed ul li').each(function () {
2016-02-23 14:16:42 -05:00
if ($(this).children('[data-action="upgrade"]').length) {
2016-03-09 14:30:54 -05:00
$('#upgrade ul').append($(this).clone(true));
2016-02-23 14:16:42 -05:00
}
});
}
2016-05-01 13:09:41 +03:00
function populateActivePlugins() {
$('#installed ul li').each(function () {
2016-05-01 13:09:41 +03:00
if ($(this).hasClass('active')) {
$('#active ul').append($(this).clone(true));
2016-09-01 15:44:10 +03:00
} else {
$('#deactive ul').append($(this).clone(true));
2016-05-01 13:09:41 +03:00
}
});
}
return Plugins;
});