added web interface for plugin installation

This commit is contained in:
Sebastian Sdorra
2010-12-16 18:17:48 +01:00
parent 84191eb242
commit 3795b6dd0d
3 changed files with 110 additions and 22 deletions

View File

@@ -37,6 +37,7 @@ package sonia.scm.api.rest;
import sonia.scm.ScmState; import sonia.scm.ScmState;
import sonia.scm.group.Group; import sonia.scm.group.Group;
import sonia.scm.plugin.PluginInformation;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.user.User; import sonia.scm.user.User;
@@ -71,8 +72,8 @@ public class JsonJaxbContextResolver implements ContextResolver<JAXBContext>
{ {
this.context = new JSONJAXBContext( this.context = new JSONJAXBContext(
JSONConfiguration.mapped().rootUnwrapping(true).arrays( JSONConfiguration.mapped().rootUnwrapping(true).arrays(
"member", "groups", "permissions", "repositories", "member", "groups", "permissions", "repositories", "repositoryTypes",
"repositoryTypes", "users").nonStrings( "users", "plugin-information").nonStrings(
"readable", "writeable", "groupPermission", "readable", "writeable", "groupPermission",
"admin").build(), types.toArray(new Class[0])); "admin").build(), types.toArray(new Class[0]));
} }
@@ -102,5 +103,6 @@ public class JsonJaxbContextResolver implements ContextResolver<JAXBContext>
/** Field description */ /** Field description */
private List<Class> types = Arrays.asList(new Class[] { Group.class, private List<Class> types = Arrays.asList(new Class[] { Group.class,
Repository.class, ScmState.class, User.class }); Repository.class, PluginInformation.class, ScmState.class,
User.class });
} }

View File

@@ -32,34 +32,56 @@
// register namespace // register namespace
Ext.ns("Sonia.plugin"); Ext.ns("Sonia.plugin");
// pluginGrid Sonia.plugin.Store = Ext.extend(Sonia.rest.JsonStore, {
Sonia.plugin.Grid = Ext.extend(Sonia.rest.Grid, { constructor: function(config) {
var baseConfig = {
initComponent: function(){
var pluginStore = new Sonia.rest.JsonStore({
url: restUrl + 'plugins/installed.json',
root: 'plugin-information', root: 'plugin-information',
fields: [ 'name', 'author', 'description', 'url', 'version' ], fields: [ 'name', 'author', 'description', 'url', 'version', 'groupId', 'artifactId' ],
sortInfo: { sortInfo: {
field: 'name' field: 'name'
} }
};
Sonia.plugin.Store.superclass.constructor.call(this, Ext.apply(config, baseConfig));
}
}); });
Sonia.plugin.GetPluginId = function(data){
return data.groupId + ':' + data.artifactId + ':' + data.version;
}
Sonia.plugin.DefaultColumns = [
{id: 'name', header: 'Name', dataIndex: 'name'},
{id: 'author', header: 'Author', dataIndex: 'author'},
{id: 'description', header: 'Description', dataIndex: 'description'},
{id: 'version', header: 'Version', dataIndex: 'version'}
]
// installed plugins grid
Sonia.plugin.InstalledGrid = Ext.extend(Sonia.rest.Grid, {
initComponent: function(){
var pluginStore = new Sonia.plugin.Store({
url: restUrl + 'plugins/installed.json'
});
var columns = [];
columns = columns.concat( columns, Sonia.plugin.DefaultColumns );
columns.push(
{id: 'Url', header: 'Url', dataIndex: 'url', renderer: this.renderUrl, width: 250}
);
var pluginColModel = new Ext.grid.ColumnModel({ var pluginColModel = new Ext.grid.ColumnModel({
defaults: { defaults: {
sortable: true, sortable: true,
scope: this, scope: this,
width: 125 width: 125
}, },
columns: [ columns: columns
{id: 'name', header: 'Name', dataIndex: 'name'},
{id: 'author', header: 'Author', dataIndex: 'author' },
{id: 'description', header: 'Description', dataIndex: 'description'},
{id: 'version', header: 'Version', dataIndex: 'version'},
{id: 'Url', header: 'Url', dataIndex: 'url', renderer: this.renderUrl, width: 250}
]
}); });
var config = { var config = {
@@ -70,10 +92,69 @@ Sonia.plugin.Grid = Ext.extend(Sonia.rest.Grid, {
Ext.apply(this, Ext.apply(this.initialConfig, config)); Ext.apply(this, Ext.apply(this.initialConfig, config));
Sonia.plugin.Grid.superclass.initComponent.apply(this, arguments); Sonia.plugin.InstalledGrid.superclass.initComponent.apply(this, arguments);
} }
}); });
// register xtype // register xtype
Ext.reg('pluginGrid', Sonia.plugin.Grid); Ext.reg('installedPluginsGrid', Sonia.plugin.InstalledGrid);
// available plugins grid
Sonia.plugin.AvailableGrid = Ext.extend(Sonia.rest.Grid,{
initComponent: function(){
var pluginStore = new Sonia.plugin.Store({
url: restUrl + 'plugins/available.json'
});
var columns = [];
columns = columns.concat( columns, Sonia.plugin.DefaultColumns );
columns.push(
{id: 'Url', header: 'Url', dataIndex: 'url', renderer: this.renderUrl, width: 250},
{id: 'Install', header: 'Install', renderer: this.renderInstallLink, width: 60}
);
var pluginColModel = new Ext.grid.ColumnModel({
defaults: {
sortable: true,
scope: this,
width: 125
},
columns: columns
});
var config = {
autoExpandColumn: 'description',
store: pluginStore,
colModel: pluginColModel
};
this.on('cellclick', this.cellClick);
Ext.apply(this, Ext.apply(this.initialConfig, config));
Sonia.plugin.AvailableGrid.superclass.initComponent.apply(this, arguments);
},
renderInstallLink: function(){
return '<a style="cursor: pointer">Install</a>'
},
cellClick: function(grid, rowIndex, columnIndex, e){
if(columnIndex==grid.getColumnModel().getIndexById('Install')){
var record = grid.getStore().getAt(rowIndex);
this.installPlugin(Sonia.plugin.GetPluginId(record.data));
}
},
installPlugin: function(pluginId){
if ( debug ){
console.debug( 'install plugin ' + pluginId );
}
}
});
Ext.reg('availablePluginsGrid', Sonia.plugin.AvailableGrid);

View File

@@ -135,9 +135,14 @@ Ext.onReady(function(){
addTabPanel('repositoryConfig', 'repositoryConfig', 'Repository Config'); addTabPanel('repositoryConfig', 'repositoryConfig', 'Repository Config');
} }
},{ },{
label: 'Plugins', label: 'Installed Plugins',
fn: function(){ fn: function(){
addTabPanel('plugins', 'pluginGrid', 'Plugins') addTabPanel('installedPlugins', 'installedPluginsGrid', 'Installed Plugins')
}
},{
label: 'Available Plugins',
fn: function(){
addTabPanel('availablePlugins', 'availablePluginsGrid', 'Available Plugins')
} }
}] }]
},{ },{