diff --git a/scm-webapp/src/main/webapp/index.html b/scm-webapp/src/main/webapp/index.html
index 1129bace00..cacffbd1b3 100644
--- a/scm-webapp/src/main/webapp/index.html
+++ b/scm-webapp/src/main/webapp/index.html
@@ -83,9 +83,14 @@
-
-
+
+
+
+
+
+
+
diff --git a/scm-webapp/src/main/webapp/resources/js/sonia.user.js b/scm-webapp/src/main/webapp/resources/js/sonia.user.js
deleted file mode 100644
index cbbf1fe530..0000000000
--- a/scm-webapp/src/main/webapp/resources/js/sonia.user.js
+++ /dev/null
@@ -1,449 +0,0 @@
-/**
- * Copyright (c) 2010, Sebastian Sdorra
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of SCM-Manager; nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * http://bitbucket.org/sdorra/scm-manager
- *
- */
-
-// register namespace
-Ext.ns('Sonia.user');
-
-
-// functions
-
-Sonia.user.setEditPanel = function(panel){
- var editPanel = Ext.getCmp('userEditPanel');
- editPanel.removeAll();
- editPanel.add(panel);
- editPanel.doLayout();
-}
-
-/**
- * Panels
- */
-Sonia.user.DefaultPanel = {
- region: 'south',
- title: 'User Form',
- padding: 5,
- xtype: 'panel',
- html: 'Add or select an User'
-};
-
-// UserGrid
-Sonia.user.Grid = Ext.extend(Sonia.rest.Grid, {
-
- titleText: 'User Form',
- colNameText: 'Name',
- colDisplayNameText: 'Display Name',
- colMailText: 'Mail',
- colAdminText: 'Admin',
- colCreationDateText: 'Creation Date',
- colLastModifiedText: 'Last modified',
- colTypeText: 'Type',
-
- initComponent: function(){
-
- var userStore = new Sonia.rest.JsonStore({
- proxy: new Ext.data.HttpProxy({
- url: restUrl + 'users.json',
- disableCaching: false
- }),
- fields: [ 'name', 'displayName', 'mail', 'admin', 'creationDate', 'lastModified', 'type'],
- sortInfo: {
- field: 'name'
- }
- });
-
- var userColModel = new Ext.grid.ColumnModel({
- defaults: {
- sortable: true,
- scope: this,
- width: 125
- },
- columns: [
- {id: 'name', header: this.colNameText, dataIndex: 'name'},
- {id: 'displayName', header: this.colDisplayNameText, dataIndex: 'displayName', width: 250},
- {id: 'mail', header: this.colMailText, dataIndex: 'mail', renderer: this.renderMailto, width: 200},
- {id: 'admin', header: this.colAdminText, dataIndex: 'admin', renderer: this.renderCheckbox, width: 50},
- {id: 'creationDate', header: this.colCreationDateText, dataIndex: 'creationDate', renderer: Ext.util.Format.formatTimestamp},
- {id: 'lastModified', header: this.colLastModifiedText, dataIndex: 'lastModified', renderer: Ext.util.Format.formatTimestamp},
- {id: 'type', header: this.colTypeText, dataIndex: 'type', width: 80}
- ]
- });
-
- var config = {
- store: userStore,
- colModel: userColModel,
- listeners: {
- fallBelowMinHeight: {
- fn: this.onFallBelowMinHeight,
- scope: this
- }
- }
- };
-
- Ext.apply(this, Ext.apply(this.initialConfig, config));
- Sonia.user.Grid.superclass.initComponent.apply(this, arguments);
- },
-
- onFallBelowMinHeight: function(height, minHeight){
- var p = Ext.getCmp('userEditPanel');
- this.setHeight(minHeight);
- var epHeight = p.getHeight();
- p.setHeight(epHeight - (minHeight - height));
- // rerender
- this.doLayout();
- p.doLayout();
- this.ownerCt.doLayout();
- },
-
- selectItem: function(item){
- if ( debug ){
- console.debug( item.name + ' selected' );
- }
- var panel = new Sonia.user.FormPanel({
- item: item,
- region: 'south',
- title: this.titleText,
- padding: 5,
- onUpdate: {
- fn: this.reload,
- scope: this
- },
- onCreate: {
- fn: this.reload,
- scope: this
- }
- });
- if ( item.type == 'xml' ){
- panel.getForm().setValues([
- {id: 'password', value: dummyPassword},
- {id: 'password-confirm', value: dummyPassword}
- ]);
- }
- Sonia.user.setEditPanel(panel);
- }
-
-});
-
-// register xtype
-Ext.reg('userGrid', Sonia.user.Grid);
-
-// passord validator
-Ext.apply(Ext.form.VTypes, {
- password: function(val, field) {
- if (field.initialPassField) {
- var pwd = Ext.getCmp(field.initialPassField);
- return (val == pwd.getValue());
- }
- return true;
- },
- passwordText: 'The passwords entered do not match!'
-});
-
-
-// UserFormPanel
-Sonia.user.FormPanel = Ext.extend(Sonia.rest.FormPanel,{
-
- nameText: 'Name',
- displayNameText: 'Display name',
- mailText: 'Mail',
- passwordText: 'Password',
- adminText: 'Administrator',
- errorTitleText: 'Error',
- updateErrorMsgText: 'User update failed',
- createErrorMsgText: 'User creation failed',
- passwordMinLengthText: 'Password must be at least 6 characters long',
-
- // help
- usernameHelpText: 'Unique name of the user.',
- displayNameHelpText: 'Display name of the user.',
- mailHelpText: 'Email address of the user.',
- passwordHelpText: 'Plain text password of the user.',
- passwordConfirmHelpText: 'Repeat the password for validation.',
- adminHelpText: 'An administrator is able to create, modify and delete repositories, groups and users.',
-
- initComponent: function(){
-
- var items = [{
- fieldLabel: this.nameText,
- name: 'name',
- allowBlank: false,
- readOnly: this.item != null,
- helpText: this.usernameHelpText
- },{
- fieldLabel: this.displayNameText,
- name: 'displayName',
- allowBlank: false,
- helpText: this.displayNameHelpText
- },{
- fieldLabel: this.mailText,
- name: 'mail',
- allowBlank: true,
- vtype: 'email',
- helpText: this.mailHelpText
- }];
-
- if ( this.item == null || this.item.type == 'xml' ){
- items.push({
- fieldLabel: this.passwordText,
- id: 'pwd',
- name: 'password',
- inputType: 'password',
- minLength: 6,
- maxLength: 32,
- minLengthText: this.passwordMinLengthText,
- helpText: this.passwordHelpText
- },{
- name: 'password-confirm',
- inputType: 'password',
- minLength: 6,
- maxLength: 32,
- minLengthText: this.passwordMinLengthText,
- vtype: 'password',
- initialPassField: 'pwd',
- helpText: this.passwordConfirmHelpText
- });
- }
-
- items.push({
- fieldLabel: this.adminText,
- name: 'admin',
- xtype: 'checkbox',
- helpText: this.adminHelpText
- });
-
- Ext.apply(this, Ext.apply(this.initialConfig, {items: items}));
- Sonia.user.FormPanel.superclass.initComponent.apply(this, arguments);
- },
-
- fixRequest: function(user){
- delete user['password-confirm'];
- },
-
- update: function(item){
-
- item = Ext.apply( this.item, item );
- if ( debug ){
- console.debug( 'update user: ' + item.name );
- }
- this.fixRequest(item);
- var url = restUrl + 'users/' + item.name + '.json';
- Ext.Ajax.request({
- url: url,
- jsonData: item,
- method: 'PUT',
- scope: this,
- success: function(){
- if ( debug ){
- console.debug('update success');
- }
- this.execCallback(this.onUpdate, item);
- },
- failure: function(result){
- main.handleFailure(
- result.status,
- this.errorTitleText,
- this.updateErrorMsgText
- );
- }
- });
-
- },
-
- create: function(user){
- if ( debug ){
- console.debug( 'create user: ' + user.name );
- }
- this.fixRequest(user);
- // set user type
- user.type = 'xml';
- var url = restUrl + 'users.json';
- Ext.Ajax.request({
- url: url,
- jsonData: user,
- method: 'POST',
- scope: this,
- success: function(){
- if ( debug ){
- console.debug('create success');
- }
- this.getForm().reset();
- this.execCallback(this.onCreate, user);
- },
- failure: function(result){
- main.handleFailure(
- result.status,
- this.errorTitleText,
- this.createErrorMsgText
- );
- }
- });
- },
-
- cancel: function(){
- Sonia.user.setEditPanel( Sonia.user.DefaultPanel );
- }
-
-});
-
-// register xtype
-Ext.reg('userForm', Sonia.user.FormPanel);
-
-// UserPanel
-Sonia.user.Panel = Ext.extend(Ext.Panel, {
-
- addText: 'Add',
- removeText: 'Remove',
- reloadText: 'Reload',
- titleText: 'User Form',
- emptyText: 'Add or select an User',
- removeTitleText: 'Remove User',
- removeMsgText: 'Remove User "{0}"?',
- errorTitleText: 'Error',
- errorMsgText: 'User deletion failed',
-
- initComponent: function(){
-
- var config = {
- layout: 'border',
- hideMode: 'offsets',
- bodyCssClass: 'x-panel-mc',
- enableTabScroll: true,
- region:'center',
- autoScroll: true,
- tbar: [
- {xtype: 'tbbutton', text: this.addText, scope: this, handler: this.showAddPanel},
- {xtype: 'tbbutton', text: this.removeText, scope: this, handler: this.removeUser},
- '-',
- {xtype: 'tbbutton', text: this.reloadText, scope: this, handler: this.reload}
- ],
- items: [{
- id: 'userGrid',
- xtype: 'userGrid',
- region: 'center'
- },{
- id: 'userEditPanel',
- layout: 'fit',
- items: [{
- region: 'south',
- title: 'User Form',
- xtype: 'panel',
- padding: 5,
- html: this.emptyText
- }],
- height: 250,
- split: true,
- border: false,
- region: 'south'
- }]
- };
-
- Ext.apply(this, Ext.apply(this.initialConfig, config));
- Sonia.user.Panel.superclass.initComponent.apply(this, arguments);
- },
-
- showAddPanel: function(){
- var editPanel = Ext.getCmp('userEditPanel');
- editPanel.removeAll();
- var panel = new Sonia.user.FormPanel({
- region: 'south',
- title: this.titleText,
- padding: 5,
- onUpdate: {
- fn: this.reload,
- scope: this
- },
- onCreate: {
- fn: this.reload,
- scope: this
- }
- });
- editPanel.add(panel);
- editPanel.doLayout();
- },
-
- resetPanel: function(){
- Sonia.user.setEditPanel( Sonia.user.DefaultPanel );
- },
-
- removeUser: function(){
-
- var grid = Ext.getCmp('userGrid');
- var selected = grid.getSelectionModel().getSelected();
- if ( selected ){
- var item = selected.data;
- var url = restUrl + 'users/' + item.name + '.json';
-
- Ext.MessageBox.show({
- title: this.removeTitleText,
- msg: String.format(this.removeMsgText, item.name),
- buttons: Ext.MessageBox.OKCANCEL,
- icon: Ext.MessageBox.QUESTION,
- fn: function(result){
- if ( result == 'ok' ){
-
- if ( debug ){
- console.debug( 'remove user ' + item.name );
- }
-
- Ext.Ajax.request({
- url: url,
- method: 'DELETE',
- scope: this,
- success: function(){
- this.reload();
- this.resetPanel();
- },
- failure: function(result){
- main.handleFailure(
- result.status,
- this.errorTitleText,
- this.errorMsgText
- );
- }
- });
- }
-
- },
- scope: this
- });
-
- } else if ( debug ){
- console.debug( 'no user selected' );
- }
-
- },
-
- reload: function(){
- Ext.getCmp('userGrid').reload();
- }
-
-});
-
-// register xtype
-Ext.reg('userPanel', Sonia.user.Panel);
diff --git a/scm-webapp/src/main/webapp/resources/js/user/sonia.user.formpanel.js b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.formpanel.js
new file mode 100644
index 0000000000..d41c8e7853
--- /dev/null
+++ b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.formpanel.js
@@ -0,0 +1,178 @@
+/* *
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+Sonia.user.FormPanel = Ext.extend(Sonia.rest.FormPanel,{
+
+ nameText: 'Name',
+ displayNameText: 'Display name',
+ mailText: 'Mail',
+ passwordText: 'Password',
+ adminText: 'Administrator',
+ errorTitleText: 'Error',
+ updateErrorMsgText: 'User update failed',
+ createErrorMsgText: 'User creation failed',
+ passwordMinLengthText: 'Password must be at least 6 characters long',
+
+ // help
+ usernameHelpText: 'Unique name of the user.',
+ displayNameHelpText: 'Display name of the user.',
+ mailHelpText: 'Email address of the user.',
+ passwordHelpText: 'Plain text password of the user.',
+ passwordConfirmHelpText: 'Repeat the password for validation.',
+ adminHelpText: 'An administrator is able to create, modify and delete repositories, groups and users.',
+
+ initComponent: function(){
+
+ var items = [{
+ fieldLabel: this.nameText,
+ name: 'name',
+ allowBlank: false,
+ readOnly: this.item != null,
+ helpText: this.usernameHelpText
+ },{
+ fieldLabel: this.displayNameText,
+ name: 'displayName',
+ allowBlank: false,
+ helpText: this.displayNameHelpText
+ },{
+ fieldLabel: this.mailText,
+ name: 'mail',
+ allowBlank: true,
+ vtype: 'email',
+ helpText: this.mailHelpText
+ }];
+
+ if ( this.item == null || this.item.type == 'xml' ){
+ items.push({
+ fieldLabel: this.passwordText,
+ id: 'pwd',
+ name: 'password',
+ inputType: 'password',
+ minLength: 6,
+ maxLength: 32,
+ minLengthText: this.passwordMinLengthText,
+ helpText: this.passwordHelpText
+ },{
+ name: 'password-confirm',
+ inputType: 'password',
+ minLength: 6,
+ maxLength: 32,
+ minLengthText: this.passwordMinLengthText,
+ vtype: 'password',
+ initialPassField: 'pwd',
+ helpText: this.passwordConfirmHelpText
+ });
+ }
+
+ items.push({
+ fieldLabel: this.adminText,
+ name: 'admin',
+ xtype: 'checkbox',
+ helpText: this.adminHelpText
+ });
+
+ Ext.apply(this, Ext.apply(this.initialConfig, {items: items}));
+ Sonia.user.FormPanel.superclass.initComponent.apply(this, arguments);
+ },
+
+ fixRequest: function(user){
+ delete user['password-confirm'];
+ },
+
+ update: function(item){
+
+ item = Ext.apply( this.item, item );
+ if ( debug ){
+ console.debug( 'update user: ' + item.name );
+ }
+ this.fixRequest(item);
+ var url = restUrl + 'users/' + item.name + '.json';
+ Ext.Ajax.request({
+ url: url,
+ jsonData: item,
+ method: 'PUT',
+ scope: this,
+ success: function(){
+ if ( debug ){
+ console.debug('update success');
+ }
+ this.execCallback(this.onUpdate, item);
+ },
+ failure: function(result){
+ main.handleFailure(
+ result.status,
+ this.errorTitleText,
+ this.updateErrorMsgText
+ );
+ }
+ });
+
+ },
+
+ create: function(user){
+ if ( debug ){
+ console.debug( 'create user: ' + user.name );
+ }
+ this.fixRequest(user);
+ // set user type
+ user.type = 'xml';
+ var url = restUrl + 'users.json';
+ Ext.Ajax.request({
+ url: url,
+ jsonData: user,
+ method: 'POST',
+ scope: this,
+ success: function(){
+ if ( debug ){
+ console.debug('create success');
+ }
+ this.getForm().reset();
+ this.execCallback(this.onCreate, user);
+ },
+ failure: function(result){
+ main.handleFailure(
+ result.status,
+ this.errorTitleText,
+ this.createErrorMsgText
+ );
+ }
+ });
+ },
+
+ cancel: function(){
+ Sonia.user.setEditPanel( Sonia.user.DefaultPanel );
+ }
+
+});
+
+// register xtype
+Ext.reg('userForm', Sonia.user.FormPanel);
diff --git a/scm-webapp/src/main/webapp/resources/js/user/sonia.user.grid.js b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.grid.js
new file mode 100644
index 0000000000..536214eb0f
--- /dev/null
+++ b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.grid.js
@@ -0,0 +1,131 @@
+/* *
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+
+Sonia.user.Grid = Ext.extend(Sonia.rest.Grid, {
+
+ titleText: 'User Form',
+ colNameText: 'Name',
+ colDisplayNameText: 'Display Name',
+ colMailText: 'Mail',
+ colAdminText: 'Admin',
+ colCreationDateText: 'Creation Date',
+ colLastModifiedText: 'Last modified',
+ colTypeText: 'Type',
+
+ initComponent: function(){
+
+ var userStore = new Sonia.rest.JsonStore({
+ proxy: new Ext.data.HttpProxy({
+ url: restUrl + 'users.json',
+ disableCaching: false
+ }),
+ fields: [ 'name', 'displayName', 'mail', 'admin', 'creationDate', 'lastModified', 'type'],
+ sortInfo: {
+ field: 'name'
+ }
+ });
+
+ var userColModel = new Ext.grid.ColumnModel({
+ defaults: {
+ sortable: true,
+ scope: this,
+ width: 125
+ },
+ columns: [
+ {id: 'name', header: this.colNameText, dataIndex: 'name'},
+ {id: 'displayName', header: this.colDisplayNameText, dataIndex: 'displayName', width: 250},
+ {id: 'mail', header: this.colMailText, dataIndex: 'mail', renderer: this.renderMailto, width: 200},
+ {id: 'admin', header: this.colAdminText, dataIndex: 'admin', renderer: this.renderCheckbox, width: 50},
+ {id: 'creationDate', header: this.colCreationDateText, dataIndex: 'creationDate', renderer: Ext.util.Format.formatTimestamp},
+ {id: 'lastModified', header: this.colLastModifiedText, dataIndex: 'lastModified', renderer: Ext.util.Format.formatTimestamp},
+ {id: 'type', header: this.colTypeText, dataIndex: 'type', width: 80}
+ ]
+ });
+
+ var config = {
+ store: userStore,
+ colModel: userColModel,
+ listeners: {
+ fallBelowMinHeight: {
+ fn: this.onFallBelowMinHeight,
+ scope: this
+ }
+ }
+ };
+
+ Ext.apply(this, Ext.apply(this.initialConfig, config));
+ Sonia.user.Grid.superclass.initComponent.apply(this, arguments);
+ },
+
+ onFallBelowMinHeight: function(height, minHeight){
+ var p = Ext.getCmp('userEditPanel');
+ this.setHeight(minHeight);
+ var epHeight = p.getHeight();
+ p.setHeight(epHeight - (minHeight - height));
+ // rerender
+ this.doLayout();
+ p.doLayout();
+ this.ownerCt.doLayout();
+ },
+
+ selectItem: function(item){
+ if ( debug ){
+ console.debug( item.name + ' selected' );
+ }
+ var panel = new Sonia.user.FormPanel({
+ item: item,
+ region: 'south',
+ title: this.titleText,
+ padding: 5,
+ onUpdate: {
+ fn: this.reload,
+ scope: this
+ },
+ onCreate: {
+ fn: this.reload,
+ scope: this
+ }
+ });
+ if ( item.type == 'xml' ){
+ panel.getForm().setValues([
+ {id: 'password', value: dummyPassword},
+ {id: 'password-confirm', value: dummyPassword}
+ ]);
+ }
+ Sonia.user.setEditPanel(panel);
+ }
+
+});
+
+// register xtype
+Ext.reg('userGrid', Sonia.user.Grid);
diff --git a/scm-webapp/src/main/webapp/resources/js/user/sonia.user.js b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.js
new file mode 100644
index 0000000000..95ab1575f9
--- /dev/null
+++ b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.js
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+// register namespace
+Ext.ns('Sonia.user');
+
+
+// functions
+
+Sonia.user.setEditPanel = function(panel){
+ var editPanel = Ext.getCmp('userEditPanel');
+ editPanel.removeAll();
+ editPanel.add(panel);
+ editPanel.doLayout();
+}
+
+/**
+ * Panels
+ */
+Sonia.user.DefaultPanel = {
+ region: 'south',
+ title: 'User Form',
+ padding: 5,
+ xtype: 'panel',
+ html: 'Add or select an User'
+};
+
+
+// passord validator
+Ext.apply(Ext.form.VTypes, {
+ password: function(val, field) {
+ if (field.initialPassField) {
+ var pwd = Ext.getCmp(field.initialPassField);
+ return (val == pwd.getValue());
+ }
+ return true;
+ },
+ passwordText: 'The passwords entered do not match!'
+});
diff --git a/scm-webapp/src/main/webapp/resources/js/user/sonia.user.panel.js b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.panel.js
new file mode 100644
index 0000000000..4518f12409
--- /dev/null
+++ b/scm-webapp/src/main/webapp/resources/js/user/sonia.user.panel.js
@@ -0,0 +1,164 @@
+/* *
+ * Copyright (c) 2010, Sebastian Sdorra
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of SCM-Manager; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://bitbucket.org/sdorra/scm-manager
+ *
+ */
+
+
+Sonia.user.Panel = Ext.extend(Ext.Panel, {
+
+ addText: 'Add',
+ removeText: 'Remove',
+ reloadText: 'Reload',
+ titleText: 'User Form',
+ emptyText: 'Add or select an User',
+ removeTitleText: 'Remove User',
+ removeMsgText: 'Remove User "{0}"?',
+ errorTitleText: 'Error',
+ errorMsgText: 'User deletion failed',
+
+ initComponent: function(){
+
+ var config = {
+ layout: 'border',
+ hideMode: 'offsets',
+ bodyCssClass: 'x-panel-mc',
+ enableTabScroll: true,
+ region:'center',
+ autoScroll: true,
+ tbar: [
+ {xtype: 'tbbutton', text: this.addText, scope: this, handler: this.showAddPanel},
+ {xtype: 'tbbutton', text: this.removeText, scope: this, handler: this.removeUser},
+ '-',
+ {xtype: 'tbbutton', text: this.reloadText, scope: this, handler: this.reload}
+ ],
+ items: [{
+ id: 'userGrid',
+ xtype: 'userGrid',
+ region: 'center'
+ },{
+ id: 'userEditPanel',
+ layout: 'fit',
+ items: [{
+ region: 'south',
+ title: 'User Form',
+ xtype: 'panel',
+ padding: 5,
+ html: this.emptyText
+ }],
+ height: 250,
+ split: true,
+ border: false,
+ region: 'south'
+ }]
+ };
+
+ Ext.apply(this, Ext.apply(this.initialConfig, config));
+ Sonia.user.Panel.superclass.initComponent.apply(this, arguments);
+ },
+
+ showAddPanel: function(){
+ var editPanel = Ext.getCmp('userEditPanel');
+ editPanel.removeAll();
+ var panel = new Sonia.user.FormPanel({
+ region: 'south',
+ title: this.titleText,
+ padding: 5,
+ onUpdate: {
+ fn: this.reload,
+ scope: this
+ },
+ onCreate: {
+ fn: this.reload,
+ scope: this
+ }
+ });
+ editPanel.add(panel);
+ editPanel.doLayout();
+ },
+
+ resetPanel: function(){
+ Sonia.user.setEditPanel( Sonia.user.DefaultPanel );
+ },
+
+ removeUser: function(){
+
+ var grid = Ext.getCmp('userGrid');
+ var selected = grid.getSelectionModel().getSelected();
+ if ( selected ){
+ var item = selected.data;
+ var url = restUrl + 'users/' + item.name + '.json';
+
+ Ext.MessageBox.show({
+ title: this.removeTitleText,
+ msg: String.format(this.removeMsgText, item.name),
+ buttons: Ext.MessageBox.OKCANCEL,
+ icon: Ext.MessageBox.QUESTION,
+ fn: function(result){
+ if ( result == 'ok' ){
+
+ if ( debug ){
+ console.debug( 'remove user ' + item.name );
+ }
+
+ Ext.Ajax.request({
+ url: url,
+ method: 'DELETE',
+ scope: this,
+ success: function(){
+ this.reload();
+ this.resetPanel();
+ },
+ failure: function(result){
+ main.handleFailure(
+ result.status,
+ this.errorTitleText,
+ this.errorMsgText
+ );
+ }
+ });
+ }
+
+ },
+ scope: this
+ });
+
+ } else if ( debug ){
+ console.debug( 'no user selected' );
+ }
+
+ },
+
+ reload: function(){
+ Ext.getCmp('userGrid').reload();
+ }
+
+});
+
+// register xtype
+Ext.reg('userPanel', Sonia.user.Panel);