diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 3d584a5fcf..78f1aadb03 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -56,7 +56,9 @@ import java.net.URL; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -199,7 +201,18 @@ public class DefaultPluginManager implements PluginManager { SecurityUtil.assertIsAdmin(securityContextProvicer); - return getPluginCenter().getPlugins(); + Set availablePlugins = new HashSet(); + Set centerPlugins = getPluginCenter().getPlugins(); + + for (PluginInformation info : centerPlugins) + { + if (!installedPlugins.containsKey(info.getId())) + { + availablePlugins.add(info); + } + } + + return availablePlugins; } /** diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js b/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js index ec801b2847..bd9c688ff3 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.plugin.js @@ -87,7 +87,8 @@ Sonia.plugin.InstalledGrid = Ext.extend(Sonia.rest.Grid, { var config = { autoExpandColumn: 'description', store: pluginStore, - colModel: pluginColModel + colModel: pluginColModel, + emptyText: 'No plugin is installed' }; @@ -100,6 +101,32 @@ Sonia.plugin.InstalledGrid = Ext.extend(Sonia.rest.Grid, { // register xtype Ext.reg('installedPluginsGrid', Sonia.plugin.InstalledGrid); +// loading window + +Sonia.plugin.LoadingWindow = Ext.extend(Ext.Window,{ + + initComponent: function(){ + + var config = { + layout:'fit', + width:300, + height:150, + closable: false, + resizable: false, + plain: true, + border: false, + modal: true, + items: [{ + xtype: 'progress' + }] + }; + + Ext.apply(this, Ext.apply(this.initialConfig, config)); + Sonia.login.Window.superclass.initComponent.apply(this, arguments); + } + +}); + // available plugins grid Sonia.plugin.AvailableGrid = Ext.extend(Sonia.rest.Grid,{ @@ -129,7 +156,8 @@ Sonia.plugin.AvailableGrid = Ext.extend(Sonia.rest.Grid,{ var config = { autoExpandColumn: 'description', store: pluginStore, - colModel: pluginColModel + colModel: pluginColModel, + emptyText: 'No plugin available' }; this.on('cellclick', this.cellClick); @@ -153,6 +181,37 @@ Sonia.plugin.AvailableGrid = Ext.extend(Sonia.rest.Grid,{ if ( debug ){ console.debug( 'install plugin ' + pluginId ); } + + var loadingBox = Ext.MessageBox.show({ + title: 'Please wait', + msg: 'Installing Plugin.', + width: 300, + wait: true, + animate: true, + progress: true, + closable: false + }); + + Ext.Ajax.request({ + url: restUrl + 'plugins/available/' + pluginId + '.json', + method: 'POST', + scope: this, + success: function(){ + if ( debug ){ + console.debug('plugin successfully installed'); + } + loadingBox.hide(); + Ext.MessageBox.alert('Plugin successfully installed', + 'Restart the applicationserver to activate the plugin.'); + }, + failure: function(){ + if ( debug ){ + console.debug('plugin installation failed'); + } + alert( 'failure' ); + loadingBox.hide(); + } + }); } }); diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.repository.js b/scm-webapp/src/main/webapp/resources/js/sonia.repository.js index 499ae1a7da..bedd122b73 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.repository.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.repository.js @@ -128,7 +128,8 @@ Sonia.repository.Grid = Ext.extend(Sonia.rest.Grid, { var config = { autoExpandColumn: 'description', store: repositoryStore, - colModel: repositoryColModel + colModel: repositoryColModel, + emptyText: 'No repository is configured' }; Ext.apply(this, Ext.apply(this.initialConfig, config)); diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.rest.js b/scm-webapp/src/main/webapp/resources/js/sonia.rest.js index cc0b73e431..fa5adf7fe8 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.rest.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.rest.js @@ -66,6 +66,7 @@ Sonia.rest.Grid = Ext.extend(Ext.grid.GridPanel, { urlTemplate: '{0}', mailtoTemplate: '{0}', checkboxTemplate: '', + emptyText: 'No items available', initComponent: function(){ @@ -82,7 +83,11 @@ Sonia.rest.Grid = Ext.extend(Ext.grid.GridPanel, { var config = { loadMask: true, - sm: selectionModel + sm: selectionModel, + viewConfig: { + deferEmptyText: false, + emptyText: this.emptyText + } }; Ext.apply(this, Ext.apply(this.initialConfig, config)); diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js index f8d01e89cf..cdd533088c 100644 --- a/scm-webapp/src/main/webapp/resources/js/sonia.scm.js +++ b/scm-webapp/src/main/webapp/resources/js/sonia.scm.js @@ -134,13 +134,17 @@ Ext.onReady(function(){ fn: function(){ addTabPanel('repositoryConfig', 'repositoryConfig', 'Repository Config'); } - },{ - label: 'Installed Plugins', + }] + },{ + id: 'navPlugins', + title: 'Plugins', + items: [{ + label: 'Installed', fn: function(){ addTabPanel('installedPlugins', 'installedPluginsGrid', 'Installed Plugins') } },{ - label: 'Available Plugins', + label: 'Available', fn: function(){ addTabPanel('availablePlugins', 'availablePluginsGrid', 'Available Plugins') }