2010-09-04 16:36:25 +02:00
|
|
|
/*
|
|
|
|
|
* To change this template, choose Tools | Templates
|
|
|
|
|
* and open the template in the editor.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Ext.ns('Sonia.group');
|
|
|
|
|
|
|
|
|
|
var addGroupWindow = null;
|
|
|
|
|
|
|
|
|
|
/** Sonia.GroupGrid **/
|
|
|
|
|
function addGroup(){
|
|
|
|
|
addGroupWindow = new Sonia.group.DetailWindow();
|
|
|
|
|
addGroupWindow.show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function removeGroup(){
|
|
|
|
|
if (groupSelModel.hasSelection()){
|
|
|
|
|
var group = groupSelModel.getSelected().data.name;
|
2010-09-05 16:41:28 +02:00
|
|
|
|
|
|
|
|
if ( debug ){
|
|
|
|
|
console.debug( 'remove group ' + group );
|
|
|
|
|
}
|
2010-09-04 16:36:25 +02:00
|
|
|
|
|
|
|
|
Ext.MessageBox.show({
|
2010-09-04 17:05:27 +02:00
|
|
|
title: 'Remove Group',
|
|
|
|
|
msg: 'Remove Group "' + group + '"?',
|
2010-09-04 16:36:25 +02:00
|
|
|
buttons: Ext.MessageBox.OKCANCEL,
|
|
|
|
|
icon: Ext.MessageBox.QUESTION,
|
|
|
|
|
fn: function(result){
|
2010-09-04 17:05:27 +02:00
|
|
|
if ( result == 'ok' ){
|
2010-09-04 16:36:25 +02:00
|
|
|
Ext.Ajax.request({
|
2010-09-04 17:05:27 +02:00
|
|
|
url: restUrl + 'groups/' + group + '.json',
|
2010-09-04 16:36:25 +02:00
|
|
|
method: 'DELETE',
|
|
|
|
|
success: function(){
|
|
|
|
|
groupStore.reload();
|
|
|
|
|
},
|
|
|
|
|
failure: function(){
|
2010-09-04 17:05:27 +02:00
|
|
|
alert('ERROR!!!')
|
2010-09-04 16:36:25 +02:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function editGroup(){
|
|
|
|
|
if (groupSelModel.hasSelection()){
|
|
|
|
|
var group = groupSelModel.getSelected().data;
|
|
|
|
|
|
|
|
|
|
var store = new Ext.data.ArrayStore({
|
|
|
|
|
fields: [ 'name' ]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ext.each(group.members, function(g,i){
|
|
|
|
|
store.add( [new Ext.data.Record( {name: g} )] );
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var groupForm = new Sonia.group.AddForm({
|
|
|
|
|
name: group.name,
|
|
|
|
|
update: true,
|
|
|
|
|
store: store
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var win = new Sonia.group.DetailWindow({
|
|
|
|
|
form: groupForm
|
|
|
|
|
});
|
|
|
|
|
win.show();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var groupToolbar = new Ext.Toolbar({
|
|
|
|
|
items: [
|
|
|
|
|
{xtype: 'tbbutton', text: 'Add', handler: addGroup},
|
|
|
|
|
{xtype: 'tbbutton', text: 'Edit', handler: editGroup},
|
|
|
|
|
{xtype: 'tbbutton', text: 'Remove', handler: removeGroup},
|
|
|
|
|
{xtype: 'tbseparator'},
|
|
|
|
|
{xtype: 'label', text: 'Search: '},
|
|
|
|
|
{xtype: 'textfield', id: 'searchfield', listeners: {
|
|
|
|
|
specialkey: function(field, e){
|
|
|
|
|
if (e.getKey() == e.ENTER) {
|
|
|
|
|
var value = this.getValue();
|
2010-09-05 16:41:28 +02:00
|
|
|
if ( debug ){
|
|
|
|
|
console.log( 'Filter: ' + value );
|
|
|
|
|
}
|
2010-09-04 16:36:25 +02:00
|
|
|
// TODO filter by member
|
|
|
|
|
groupStore.filter('name', new RegExp('.*' + value + '.*'));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}}
|
|
|
|
|
]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var groupColModel = new Ext.grid.ColumnModel({
|
|
|
|
|
columns: [
|
|
|
|
|
{header: 'Name', sortable: true, width: 200, dataIndex: 'name'},
|
|
|
|
|
{header: 'Members', sortable: true, dataIndex: 'members'}
|
|
|
|
|
]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var groupSelModel = new Ext.grid.RowSelectionModel({
|
|
|
|
|
singleSelect: true
|
|
|
|
|
});
|
|
|
|
|
|
2010-09-05 16:34:04 +02:00
|
|
|
var groupStore = new Sonia.rest.JsonStore({
|
2010-09-04 17:05:27 +02:00
|
|
|
url: restUrl + 'groups.json',
|
2010-09-04 16:36:25 +02:00
|
|
|
root: 'groups',
|
|
|
|
|
fields: [
|
2010-09-04 17:05:27 +02:00
|
|
|
'name', 'members'
|
2010-09-04 16:36:25 +02:00
|
|
|
],
|
|
|
|
|
sortInfo: {
|
|
|
|
|
field: 'name'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2010-09-05 13:54:49 +02:00
|
|
|
//groupStore.load();
|
2010-09-04 16:36:25 +02:00
|
|
|
|
2010-09-05 16:19:20 +02:00
|
|
|
Sonia.group.Grid = Ext.extend(Ext.grid.GridPanel, {
|
2010-09-04 16:36:25 +02:00
|
|
|
initComponent: function(){
|
|
|
|
|
var config = {
|
|
|
|
|
store: groupStore,
|
|
|
|
|
colModel: groupColModel,
|
|
|
|
|
selModel: groupSelModel,
|
|
|
|
|
tbar: groupToolbar,
|
|
|
|
|
viewConfig: {
|
|
|
|
|
forceFit: true
|
|
|
|
|
},
|
|
|
|
|
loadMask: true,
|
|
|
|
|
listeners: {
|
|
|
|
|
celldblclick: editGroup
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2010-09-05 13:54:49 +02:00
|
|
|
groupStore.load();
|
|
|
|
|
|
2010-09-04 16:36:25 +02:00
|
|
|
Ext.apply(this, Ext.apply(this.initialConfig, config));
|
2010-09-05 16:19:20 +02:00
|
|
|
Sonia.group.Grid.superclass.initComponent.apply(this, arguments);
|
2010-09-04 16:36:25 +02:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2010-09-05 16:19:20 +02:00
|
|
|
Ext.reg('groupGrid', Sonia.group.Grid);
|
2010-09-04 16:36:25 +02:00
|
|
|
|
|
|
|
|
Sonia.group.AddForm = new Ext.extend(Ext.FormPanel, {
|
|
|
|
|
|
|
|
|
|
containerWindow: null,
|
|
|
|
|
store: null,
|
|
|
|
|
name: '',
|
|
|
|
|
update: false,
|
|
|
|
|
|
|
|
|
|
initComponent: function(){
|
|
|
|
|
if ( this.store == null ){
|
|
|
|
|
this.store = new Ext.data.ArrayStore({
|
|
|
|
|
fields: [ 'name' ]
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.update = this.name != '';
|
|
|
|
|
|
|
|
|
|
var config = {
|
|
|
|
|
labelWidth: 80,
|
|
|
|
|
autoHeight: true,
|
|
|
|
|
//url: null,
|
|
|
|
|
frame: true,
|
|
|
|
|
title: 'Add Group',
|
|
|
|
|
defaultType:'textfield',
|
|
|
|
|
monitorValid: true,
|
|
|
|
|
items:[{
|
|
|
|
|
fieldLabel:'Name',
|
|
|
|
|
name:'name',
|
|
|
|
|
focus: ! this.update,
|
|
|
|
|
value: this.name,
|
|
|
|
|
readOnly: this.update,
|
|
|
|
|
anchor: '100%',
|
|
|
|
|
allowBlank: false
|
|
|
|
|
},{
|
|
|
|
|
fieldLabel: 'Members',
|
|
|
|
|
xtype: 'fieldset',
|
|
|
|
|
items: [{
|
|
|
|
|
id: 'addMembersView',
|
|
|
|
|
name: 'members',
|
|
|
|
|
xtype: 'listview',
|
|
|
|
|
columnResize: false,
|
|
|
|
|
multiSelect: true,
|
|
|
|
|
hideHeaders: true,
|
|
|
|
|
store: this.store,
|
|
|
|
|
columns: [{
|
|
|
|
|
xtype: 'lvcolumn',
|
|
|
|
|
header: 'Member',
|
|
|
|
|
dataIndex: 'name'
|
|
|
|
|
}]
|
|
|
|
|
}]
|
|
|
|
|
},{
|
|
|
|
|
fieldLabel: 'Add Member',
|
|
|
|
|
xtype: 'compositefield',
|
|
|
|
|
items: [{
|
|
|
|
|
id: 'addMemberField',
|
|
|
|
|
name: 'addMember',
|
|
|
|
|
width: '60%',
|
|
|
|
|
xtype: 'textfield',
|
|
|
|
|
scope: this,
|
|
|
|
|
listeners: {
|
|
|
|
|
specialkey: {
|
|
|
|
|
fn: function(field, e){
|
|
|
|
|
if (e.getKey() == e.ENTER) {
|
|
|
|
|
this.addMember();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
scope: this
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},{
|
|
|
|
|
xtype: 'button',
|
|
|
|
|
text: 'Add',
|
|
|
|
|
scope: this,
|
|
|
|
|
handler: this.addMember
|
|
|
|
|
},{
|
|
|
|
|
xtype: 'button',
|
|
|
|
|
text: 'Del',
|
|
|
|
|
scope: this,
|
|
|
|
|
handler: this.removeSelectedMember
|
|
|
|
|
}]
|
|
|
|
|
}],
|
|
|
|
|
|
|
|
|
|
buttons:[{
|
|
|
|
|
text:'Ok',
|
|
|
|
|
scope: this,
|
|
|
|
|
formBind: true,
|
|
|
|
|
handler: this.submit
|
|
|
|
|
},{
|
|
|
|
|
text: 'Cancel',
|
|
|
|
|
scope: this,
|
|
|
|
|
handler: this.close
|
|
|
|
|
}]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Ext.apply(this, Ext.apply(this.initialConfig, config));
|
|
|
|
|
Sonia.group.AddForm.superclass.initComponent.apply(this, arguments);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
addMemberBySpecialKey: function(field, e){
|
|
|
|
|
if (e.getKey() == e.ENTER) {
|
|
|
|
|
addMember();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
addMember: function(){
|
|
|
|
|
var field = Ext.getCmp('addMemberField');
|
|
|
|
|
var value = field.getValue();
|
|
|
|
|
if ( value != '' ){
|
|
|
|
|
this.store.add( [ new Ext.data.Record( {name: value}) ] );
|
|
|
|
|
field.setValue('');
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
removeSelectedMember: function(){
|
|
|
|
|
var list = Ext.getCmp('addMembersView');
|
|
|
|
|
var nodes = list.getSelectedIndexes();
|
|
|
|
|
if ( nodes != null ){
|
|
|
|
|
Ext.each(nodes, function(data, index){
|
|
|
|
|
this.store.removeAt(data);
|
|
|
|
|
}, this);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
submit: function(){
|
|
|
|
|
var containerWindow = this.containerWindow;
|
|
|
|
|
var form = this.getForm();
|
|
|
|
|
var memberArray = [];
|
|
|
|
|
this.store.each(function(data){
|
|
|
|
|
memberArray.push( data.get('name') );
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var name = form.findField('name').getValue();
|
|
|
|
|
var group = { name: name, members: memberArray }
|
|
|
|
|
|
|
|
|
|
var url = null;
|
|
|
|
|
if ( this.update ){
|
2010-09-04 17:05:27 +02:00
|
|
|
url = restUrl + 'groups/' + this.name + '.json';
|
2010-09-04 16:36:25 +02:00
|
|
|
} else {
|
2010-09-04 17:05:27 +02:00
|
|
|
url = restUrl + 'groups.json';
|
2010-09-04 16:36:25 +02:00
|
|
|
}
|
|
|
|
|
|
2010-09-05 16:41:28 +02:00
|
|
|
if ( debug ){
|
|
|
|
|
var action = this.update ? 'edit' : 'add';
|
|
|
|
|
console.debug( action + ' group ' + name );
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-04 16:36:25 +02:00
|
|
|
Ext.Ajax.request({
|
|
|
|
|
url: url,
|
|
|
|
|
jsonData: group,
|
2010-09-04 17:05:27 +02:00
|
|
|
method: this.update ? 'PUT' : 'POST',
|
2010-09-04 16:36:25 +02:00
|
|
|
success: function(){
|
|
|
|
|
// TODO make this in a nice way
|
|
|
|
|
groupStore.reload();
|
|
|
|
|
|
|
|
|
|
if ( containerWindow ){
|
|
|
|
|
containerWindow.close();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
failure: function(){
|
2010-09-04 17:05:27 +02:00
|
|
|
alert( 'failure' );
|
2010-09-04 16:36:25 +02:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
close: function(){
|
|
|
|
|
if ( this.containerWindow ){
|
|
|
|
|
this.containerWindow.close();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
load : function(data){
|
|
|
|
|
this.store.loadData( data );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ext.reg('groupAddForm', Sonia.group.AddForm);
|
|
|
|
|
|
|
|
|
|
Sonia.group.DetailWindow = Ext.extend(Ext.Window, {
|
|
|
|
|
|
|
|
|
|
form: null,
|
|
|
|
|
|
|
|
|
|
initComponent: function(){
|
|
|
|
|
var config = {
|
|
|
|
|
layout:'fit',
|
|
|
|
|
width:300,
|
|
|
|
|
autoScroll: true,
|
|
|
|
|
closable: false,
|
|
|
|
|
resizable: false,
|
|
|
|
|
plain: true,
|
|
|
|
|
border: false,
|
|
|
|
|
modal: true
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var win = this;
|
|
|
|
|
if ( this.form != null ){
|
|
|
|
|
this.form.containerWindow = win;
|
|
|
|
|
config.items = [ this.form ];
|
|
|
|
|
} else {
|
|
|
|
|
config.items = [{
|
|
|
|
|
xtype: 'groupAddForm',
|
|
|
|
|
containerWindow: win
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Ext.apply(this, Ext.apply(this.initialConfig, config));
|
|
|
|
|
Sonia.group.DetailWindow.superclass.initComponent.apply(this, arguments);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ext.reg('groupDetailWindow', Sonia.group.DetailWindow);
|