From: <b_c...@us...> - 2010-06-17 17:14:01
|
Revision: 4533 http://jaffa.svn.sourceforge.net/jaffa/?rev=4533&view=rev Author: b_calderwood Date: 2010-06-17 17:13:53 +0000 (Thu, 17 Jun 2010) Log Message: ----------- Fix issues with panel interaction in card layout. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-06-16 20:55:22 UTC (rev 4532) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-06-17 17:13:53 UTC (rev 4533) @@ -23,11 +23,10 @@ removeButtonText:'Remove', okButtonText:'OK', cancelButtonText: 'Cancel', - detailButtonText: 'Details >', - listButtonText: '< List', + detailButtonText: 'Form View', + listButtonText: 'Grid View', fixText: 'Fix Record', discardText:'Discard Changes', - clearText:'Clear Data in the Form', confirmText: 'Confirm Action', warningText:'Warning', addRecordText: 'Add', @@ -58,6 +57,7 @@ /** @cfg (boolean) addButton True to include default add button on grid toolbar */ addButton: true, + //Container uses panel plugin for change listeners, also stops cascade load/save into the detail panel plugins: new Jaffa.maintenance.plugins.Panel({beforerenderHandler: Ext.emptyFn, bodyCfg: ''}), initComponent: function(){ @@ -121,6 +121,14 @@ readOnly:false} ); + //Set some properties on detail panel required for border layout + if (this.layout == 'border'){ + Ext.applyIf(this.detailPanel, { + split: true, + region: 'south', + collapsible: true + }); + } //If detailPanel config supplied, initialise toolbar and create component if (!this.detailPanel.initComponent){ @@ -132,15 +140,6 @@ this.detailPanel.gridPanel = this.gridPanel; this.detailPanel.transientFields = true; - //Set some properties on detail panel required for border layout - if (this.layout == 'border'){ - Ext.applyIf(this.detailPanel, { - split: true, - region: 'south', - collapsible: true - }); - } - Ext.applyIf(this.detailPanel, { controller: this.gridPanel.controller, clearPanel: function() { @@ -157,16 +156,16 @@ Ext.MessageBox.show({ buttons: { ok: this.ownerCt.fixText, - cancel: cb?this.ownerCt.discardText:this.ownerCt.clearText + cancel: this.ownerCt.discardText }, - title: this.warningText + ':', + title: this.ownerCt.warningText + ':', msg: msg, fn: function(btn, text) { if (btn=='cancel') { if (cb) cb(); else { - this.clearPanel(); + this.resetDetailPanel(); if (this.ownerCt.layout.type=='card') this.ownerCt.layout.setActiveItem(0); } } @@ -237,7 +236,7 @@ if (this.layout == 'card' && this.gridPanel.getTopToolbar()) { this.gridPanel.getTopToolbar().insert(this.buttonIndex, { text: this.modifyButtonText, - iconCls: 'edit', + iconCls: 'table_edit', scope: this, handler: function(){ if (this.gridPanel.getSelectionModel().getSelections().length == 1) { @@ -280,6 +279,7 @@ this.gridPanel.getTopToolbar().add('->'); this.gridPanel.getTopToolbar().add({ text: this.detailButtonText, + iconCls: 'application_form', itemId: '_details', scope: this, disabled: true, @@ -289,7 +289,18 @@ }); this.detailPanel.getTopToolbar().add('->'); this.detailPanel.getTopToolbar().add({ + iconCls: 'step-back' + }); + this.detailPanel.getTopToolbar().add({ + text: '1 of 10', + xtype: 'label' + }); + this.detailPanel.getTopToolbar().add({ + iconCls: 'step-forward' + }); + this.detailPanel.getTopToolbar().add({ text: this.listButtonText, + iconCls: 'table_go', scope: this, handler: function(){ this.layout.setActiveItem(0); @@ -329,6 +340,7 @@ this.gridPanel.controller.applyPanelFieldsMetaRules(this.gridPanel.detailPanel) Jaffa.maintenance.plugins.Panel.prototype._setChangeListeners.call(this.detailPanel, this.detailPanel.setDirty.createDelegate(this, [true])); Jaffa.maintenance.GridDetailContainer.superclass.initComponent.call(this); + this.controller.on('load', this.resetDetailPanel, this); }, //Method to handle selection of rows on the grid @@ -350,11 +362,11 @@ var row = grid.getStore().getAt(rowIndex); this.detailPanel.loadRecord(row); if (row.get('isNew')) { - this.detailPanel.currentTitle = '('+this.addRecordText+') ' + this.detailPanel.baseTitle; + this.detailPanel.currentTitle = '('+(this.addRecordText?this.addRecordText:this.ownerCt.addRecordText)+') ' + this.detailPanel.baseTitle; this.detailPanel.setTitle(this.detailPanel.currentTitle); } else { - this.detailPanel.currentTitle = '('+this.modifyRecordText+') ' + this.detailPanel.baseTitle; + this.detailPanel.currentTitle = '('+(this.modifyRecordText?this.modifyRecordText:this.ownerCt.modifyRecordText)+') ' + this.detailPanel.baseTitle; this.detailPanel.setTitle(this.detailPanel.currentTitle); } }else{ @@ -372,11 +384,11 @@ var row = grid.getStore().getAt(rowIndex); this.detailPanel.loadRecord(row); if (row.get('isNew')) { - this.detailPanel.currentTitle = '('+this.addRecordText+') ' + this.detailPanel.baseTitle; + this.detailPanel.currentTitle = '('+(this.addRecordText?this.addRecordText:this.ownerCt.addRecordText)+') ' + this.detailPanel.baseTitle; this.detailPanel.setTitle(this.detailPanel.currentTitle); } else { - this.detailPanel.currentTitle = '('+this.modifyRecordText+') ' + this.detailPanel.baseTitle; + this.detailPanel.currentTitle = '('+(this.modifyRecordText?this.modifyRecordText:this.ownerCt.modifyRecordText)+') ' + this.detailPanel.baseTitle; this.detailPanel.setTitle(this.detailPanel.currentTitle); } } @@ -407,6 +419,8 @@ if (this.layout.type == 'card') { this.layout.setActiveItem(1); this.gridPanel.getTopToolbar().getComponent('_details').enable(); + } else { + this.detailPanel.expand(); } }, //Remove button handler @@ -415,8 +429,7 @@ for (var i=0; i<recs.length; i++) { this.gridPanel.removeRecord(recs[i]); } - this.detailPanel.clearPanel(); - this.gridPanel.getTopToolbar().getComponent('_details').disable(); + this.resetDetailPanel() }, //Ok button handler onDetailOk: function(){ @@ -445,12 +458,19 @@ } else { if (this.detailPanel.record.get('isNew') && !this.gridPanel.getStore().getById(this.detailPanel.record.id) ) { this.detailPanel.clearPanel(); - if (this.layout.type == 'card') { - this.layout.setActiveItem(0); - this.gridPanel.getTopToolbar().getComponent('_details').disable(); - } } + if (this.layout.type == 'card') { + this.resetDetailPanel(); + } } + }, + //Reset detail panel + resetDetailPanel: function(){ + this.detailPanel.clearPanel(); + if (this.layout.type == 'card') { + this.layout.setActiveItem(0); + this.gridPanel.getTopToolbar().getComponent('_details').disable(); + } } }); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <b_c...@us...> - 2010-06-25 19:53:23
|
Revision: 4540 http://jaffa.svn.sourceforge.net/jaffa/?rev=4540&view=rev Author: b_calderwood Date: 2010-06-25 19:53:16 +0000 (Fri, 25 Jun 2010) Log Message: ----------- Add allowAdd, allowEdit, allowDelete properties. Add 'add' button to detail panel (this does a save + add). Fixed paging on detail panel toolbar. Added slide layout (layout still has issues). Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-06-24 22:29:24 UTC (rev 4539) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-06-25 19:53:16 UTC (rev 4540) @@ -19,6 +19,7 @@ Jaffa.maintenance.GridDetailContainer = Ext.extend(Ext.Panel, { /** Text objects that can be replaced for internationalization */ modifyButtonText: 'Modify', + viewButtonText: 'View', addButtonText:'Add', removeButtonText:'Remove', okButtonText:'OK', @@ -32,7 +33,27 @@ addRecordText: 'Add', modifyRecordText: 'Modify', - + /** + * @cfg {Boolean} allowAdd + * true to allow the user to add new records and enables the add button (defaults to true) + * false to disable the add button + * Note: setting allowAdd to undefined will hide the add button + */ + allowAdd: true, + + /** + * @cfg {Boolean} allowEdit + * allows the user to edit records (defaults to true) + */ + allowEdit: true, + + /** + * @cfg {Boolean} allowDelete + * true to allow the user to delete the selected records and enables the delete button (defaults to true) + * false to disable the delete button + * Note: setting allowDelete to undefined will hide the delete button + */ + allowDelete: true, /** @cfg gridPanel A grid or grid config that will be used as the grid part of the container */ @@ -42,7 +63,7 @@ */ detailPanel: undefined, - /** @cfg layout Layout for the container panels. Currently supports 'border' and 'card'. Default to 'border'. + /** @cfg layout Layout for the container panels. Currently supports 'border', 'slide' and 'card'. Default to 'border'. */ layout: 'border', @@ -61,13 +82,6 @@ //Container uses panel plugin for change listeners, also stops cascade load/save into the detail panel plugins: new Jaffa.maintenance.plugins.Panel({beforerenderHandler: Ext.emptyFn, bodyCfg: ''}), initComponent: function(){ - //If gridPanel config supplied, initialise toolbar - if (!this.gridPanel.initComponent){ - this.gridPanel.bodyCfg=''; - if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; - this.gridPanel = Ext.ComponentMgr.create(this.gridPanel, Ext.Panel); - } - //Inject updateRecord method into grid save process if (this.gridPanel.saveData){ var originalSave = this.gridPanel.saveData.createDelegate(this.gridPanel); @@ -85,7 +99,6 @@ originalValidate(); } } - Ext.applyIf(this.gridPanel, { region: 'center', saveData: function(origData, saveData) { @@ -98,11 +111,17 @@ return Jaffa.maintenance.plugins.GridLoadSave.prototype.validateData.call(this); } }); + this.gridPanel.boxMinHeight=200; + //If gridPanel config supplied, initialise toolbar + if (!this.gridPanel.initComponent){ + this.gridPanel.bodyCfg=''; + if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; + this.gridPanel = Ext.ComponentMgr.create(this.gridPanel, Ext.Panel); + } //baseTitle is used to create title on detail panel, adding modifiers when necessary ('Add', 'Modify', '*') this.detailPanel.baseTitle = this.detailPanel.title; this.detailPanel.boxMinHeight=200; - this.gridPanel.boxMinHeight=200; //Detail panel gets basic panel plugin for change listeners. this.detailPanel.plugins= new Jaffa.maintenance.plugins.Panel({ beforerenderHandler: Ext.emptyFn, @@ -139,6 +158,32 @@ this.gridPanel.detailPanel = this.detailPanel; this.detailPanel.gridPanel = this.gridPanel; this.detailPanel.transientFields = true; + + if (!this.allowEdit) + this.detailPanel.cascade(function(f){ + if (f.mapping) { + if (f.xtype == 'combo' || f.xtype == 'finderComboGrid') { + f.disable(); + } + else + if (f.xtype == 'checkbox') { + if (f.rendered) { + f.disable(); + } + else { + f.disabled = true; + } + } + else { + if (f.rendered) { + f.setTextOnly(true); + } + else { + f.textOnly = true; + } + } + } + }); Ext.applyIf(this.detailPanel, { controller: this.gridPanel.controller, @@ -166,7 +211,7 @@ cb(); else { this.resetDetailPanel(); - if (this.ownerCt.layout.type=='card') this.ownerCt.layout.setActiveItem(0); + if (this.ownerCt.layout.type=='card'||this.ownerCt.layout.type=='slide') this.ownerCt.layout.setActiveItem(0); } } }, @@ -194,6 +239,10 @@ this.controller.clearPanelFields(this); this.controller.setPanelFields(this, this.record.data); this.enable(); + + if (this.ownerCt.layout.type=='card') + this.setPageNumber(); + }, setTitleText: function(text) { if (typeof text != 'string') { @@ -203,6 +252,15 @@ } } this.setTitle(text||this.currentTitle); + }, + setPageNumber: function(){ + var index = this.gridPanel.getStore().indexOf(this.record); + if (index >= 0){ + index = index + 1; + } else { + index = 'NEW'; + } + this.getTopToolbar().getComponent('recordPosition').setText(index + ' of ' + this.gridPanel.getStore().getCount()); } }); this.detailPanel.disable(); @@ -214,6 +272,7 @@ this.gridPanel.getTopToolbar().insert(this.buttonIndex, { text: this.removeButtonText, iconCls: 'remove-row', + disabled: !this.allowDelete, scope: this, handler: function(){ this.onGridRemove(); @@ -224,6 +283,7 @@ text: this.addButtonText, iconCls: 'add-row', scope: this, + disabled: !this.allowAdd, handler: function(){ this.onGridAdd(); } @@ -233,9 +293,9 @@ console.error(); //Inject 'modify' button into grid panel toolbar if using card style layout - if (this.layout == 'card' && this.gridPanel.getTopToolbar()) { + if ((this.layout == 'card'||this.layout == 'slide') && this.gridPanel.getTopToolbar()) { this.gridPanel.getTopToolbar().insert(this.buttonIndex, { - text: this.modifyButtonText, + text: this.allowEdit?this.modifyButtonText:this.viewButtonText, iconCls: 'table_edit', scope: this, handler: function(){ @@ -254,15 +314,23 @@ this.detailPanel.getTopToolbar().insert(0, { text: this.okButtonText, iconCls: 'ok', + disabled: !this.allowEdit, scope: this, handler: function(){ if (this.detailPanel.validate()) { this.detailPanel.updateRecord(); - if(this.layout.type=='card') this.layout.setActiveItem(0); + if(this.layout.type=='card'||this.layout.type == 'slide') this.layout.setActiveItem(0); } } }); this.detailPanel.getTopToolbar().insert(1, { + text: this.addButtonText, + iconCls: 'add', + disabled: !this.allowAdd, + scope: this, + handler: this.onGridAdd + }); + this.detailPanel.getTopToolbar().insert(2, { text: this.cancelButtonText, iconCls: 'Cancel', scope: this, @@ -275,7 +343,7 @@ console.error(); //If using card style layout, add 'Detail' and 'List' navigation buttons to grid and detail panel - if (this.layout == 'card') { + if (this.layout == 'card'||this.layout == 'slide') { this.gridPanel.getTopToolbar().add('->'); this.gridPanel.getTopToolbar().add({ text: this.detailButtonText, @@ -289,14 +357,32 @@ }); this.detailPanel.getTopToolbar().add('->'); this.detailPanel.getTopToolbar().add({ - iconCls: 'step-back' + iconCls: 'step-back', + scope:this, + handler: function(){ + var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); + var newIndex = 0; + if (currentIndex > 0) + newIndex = currentIndex - 1; + + this.onRowClick(this.gridPanel, newIndex, null); + } }); this.detailPanel.getTopToolbar().add({ - text: '1 of 10', - xtype: 'label' + xtype: 'label', + itemId: 'recordPosition' }); this.detailPanel.getTopToolbar().add({ - iconCls: 'step-forward' + iconCls: 'step-forward', + scope:this, + handler: function(){ + var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); + var newIndex = this.gridPanel.getStore().getCount() - 1; + if (currentIndex < (this.gridPanel.getStore().getCount() - 1) && currentIndex >=0) + newIndex = currentIndex + 1; + + this.onRowClick(this.gridPanel, newIndex, null); + } }); this.detailPanel.getTopToolbar().add({ text: this.listButtonText, @@ -308,7 +394,7 @@ }); } - if (this.layout=='card'){ + if (this.layout=='card'||this.layout == 'slide'){ this.activeItem = 0; } @@ -318,8 +404,8 @@ //Set up row click handlers for the grid this.gridPanel.on({ - rowclick: this.layout=='card'?Ext.emptyFn:this.onRowClick, - rowdblclick: this.layout=='card'? + rowclick: this.layout=='card'||this.layout == 'slide'?Ext.emptyFn:this.onRowClick, + rowdblclick: this.layout=='card'||this.layout == 'slide'? { fn:function(grid, rowIndex, e){ this.onRowClick(grid, rowIndex, e); @@ -374,7 +460,7 @@ if (this.detailPanel.validate( function(){ this.detailPanel.clearPanel(); - if (this.layout.type=='card') + if (this.layout.type=='card'||this.layout.type == 'slide') this.onRowClick(grid, rowIndex, e); else this.ownerCt.onRowClick(grid, rowIndex, e); @@ -394,7 +480,7 @@ } } } - if (this.ownerCt.layout.type=='card') this.ownerCt.layout.setActiveItem(1); + if (this.ownerCt.layout.type=='card'||this.ownerCt.layout.type=='slide') this.ownerCt.layout.setActiveItem(1); }, //Add button handler onGridAdd: function(btn) { @@ -416,7 +502,7 @@ this.detailPanel.currentTitle = '(Add) ' + this.detailPanel.baseTitle; this.detailPanel.setTitle(this.detailPanel.currentTitle); }; - if (this.layout.type == 'card') { + if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(1); this.gridPanel.getTopToolbar().getComponent('_details').enable(); } else { @@ -425,6 +511,7 @@ }, //Remove button handler onGridRemove: function() { + if (!this.allowDelete) return false; var recs = this.gridPanel.getSelectionModel().getSelections(); for (var i=0; i<recs.length; i++) { this.gridPanel.removeRecord(recs[i]); @@ -444,7 +531,7 @@ var record = this.detailPanel.record; if (record.get('isNew') && !this.gridPanel.getStore().getById(record.id) ) { this.detailPanel.clearPanel(); - if (this.layout.type == 'card') { + if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(0); this.gridPanel.getTopToolbar().getComponent('_details').disable(); } @@ -459,7 +546,7 @@ if (this.detailPanel.record.get('isNew') && !this.gridPanel.getStore().getById(this.detailPanel.record.id) ) { this.detailPanel.clearPanel(); } - if (this.layout.type == 'card') { + if (this.layout.type == 'card'||this.layout.type == 'slide') { this.resetDetailPanel(); } } @@ -467,7 +554,7 @@ //Reset detail panel resetDetailPanel: function(){ this.detailPanel.clearPanel(); - if (this.layout.type == 'card') { + if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(0); this.gridPanel.getTopToolbar().getComponent('_details').disable(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2010-06-25 23:56:33
|
Revision: 4541 http://jaffa.svn.sourceforge.net/jaffa/?rev=4541&view=rev Author: SeanZ Date: 2010-06-25 23:56:27 +0000 (Fri, 25 Jun 2010) Log Message: ----------- allow adding plugins to detailPanel. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-06-25 19:53:16 UTC (rev 4540) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-06-25 23:56:27 UTC (rev 4541) @@ -123,7 +123,8 @@ this.detailPanel.baseTitle = this.detailPanel.title; this.detailPanel.boxMinHeight=200; //Detail panel gets basic panel plugin for change listeners. - this.detailPanel.plugins= new Jaffa.maintenance.plugins.Panel({ + this.detailPanel.plugins = this.detailPanel.plugins || []; + this.detailPanel.plugins.unshift(new Jaffa.maintenance.plugins.Panel({ beforerenderHandler: Ext.emptyFn, setDirty: function(dirty) { if (this.isDirty != dirty) { @@ -138,7 +139,7 @@ return ''; }, readOnly:false} - ); + )); //Set some properties on detail panel required for border layout if (this.layout == 'border'){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <b_c...@us...> - 2010-07-06 21:24:59
|
Revision: 4554 http://jaffa.svn.sourceforge.net/jaffa/?rev=4554&view=rev Author: b_calderwood Date: 2010-07-06 21:24:53 +0000 (Tue, 06 Jul 2010) Log Message: ----------- Enable/Disable detail panel backward and forward navigation buttons as applicable. Fix add icon on detail panel to match results panel. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-07-06 21:23:58 UTC (rev 4553) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-07-06 21:24:53 UTC (rev 4554) @@ -241,8 +241,20 @@ this.controller.setPanelFields(this, this.record.data); this.enable(); - if (this.ownerCt.layout.type=='card') - this.setPageNumber(); + if (this.ownerCt.layout.type == 'card') { + var currentIndex = this.gridPanel.getStore().indexOf(this.record); + var currentCount = this.gridPanel.getStore().getCount(); + + this.getTopToolbar().getComponent('stepBack').enable(); + this.getTopToolbar().getComponent('stepForward').enable(); + if (currentIndex >= currentCount - 1) { + this.getTopToolbar().getComponent('stepForward').disable(); + } + if (currentIndex == 0 || currentCount==0) { + this.getTopToolbar().getComponent('stepBack').disable(); + } + this.setPageNumber(); + } }, setTitleText: function(text) { @@ -330,7 +342,7 @@ this.detailPanel.getTopToolbar().insert(1, { text: this.addButtonText, itemId: 'addBtn', - iconCls: 'add', + iconCls: 'add-row', disabled: !this.allowAdd, scope: this, handler: this.onGridAdd @@ -363,6 +375,7 @@ this.detailPanel.getTopToolbar().add('->'); this.detailPanel.getTopToolbar().add({ iconCls: 'step-back', + itemId: 'stepBack', scope:this, handler: function(){ var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); @@ -379,12 +392,15 @@ }); this.detailPanel.getTopToolbar().add({ iconCls: 'step-forward', + itemId: 'stepForward', scope:this, handler: function(){ var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); var newIndex = this.gridPanel.getStore().getCount() - 1; if (currentIndex < (this.gridPanel.getStore().getCount() - 1) && currentIndex >=0) newIndex = currentIndex + 1; + if (currentIndex < 0) + newIndex = this.gridPanel.getStore().getCount(); this.onRowClick(this.gridPanel, newIndex, null); } @@ -450,6 +466,7 @@ } }else{ if (!this.detailPanel.isDirty){ + if (rowIndex >= grid.getStore().getCount()) rowIndex = grid.getStore().getCount() - 1; var row = grid.getStore().getAt(rowIndex); this.detailPanel.loadRecord(row); if (row.get('isNew')) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-07-26 23:54:35
|
Revision: 4612 http://jaffa.svn.sourceforge.net/jaffa/?rev=4612&view=rev Author: cosbor11 Date: 2010-07-26 23:54:29 +0000 (Mon, 26 Jul 2010) Log Message: ----------- added beforeloadrecord and recordload fires to the gridPanel's loadRecord method Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-07-26 22:04:22 UTC (rev 4611) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-07-26 23:54:29 UTC (rev 4612) @@ -82,6 +82,22 @@ //Container uses panel plugin for change listeners, also stops cascade load/save into the detail panel plugins: new Jaffa.maintenance.plugins.Panel({beforerenderHandler: Ext.emptyFn, bodyCfg: ''}), initComponent: function(){ + this.addEvents( + /** + * @event beforeloadrecord + * Fires before a record is loaded into the + * @param {this} ct the griddetailcontainer + * @param {Object} rec the record being edited + */ + 'beforeloadrecord', + /** + * @event loadrecord + * Fires after a record is loaded into the + * @param {this} ct the griddetailcontainer + * @param {Object} rec the record being edited + */ + 'loadrecord' + ); //Inject updateRecord method into grid save process if (this.gridPanel.saveData){ var originalSave = this.gridPanel.saveData.createDelegate(this.gridPanel); @@ -237,6 +253,7 @@ }, //Loads a record into the detail panel loadRecord: function(record) { + this.fireEvent('beforeloadrecord', this, record); this.record = record; this.controller.clearPanelFields(this); this.controller.setPanelFields(this, this.record.data); @@ -256,6 +273,7 @@ } this.setPageNumber(); } + this.fireEvent('loadrecord', this, record); }, setTitleText: function(text) { @@ -306,7 +324,8 @@ }); } else - console.error(); + alert('err'); + //console.error(); //Inject 'modify' button into grid panel toolbar if using card style layout if ((this.layout == 'card'||this.layout == 'slide') && this.gridPanel.getTopToolbar()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-07-27 19:17:06
|
Revision: 4615 http://jaffa.svn.sourceforge.net/jaffa/?rev=4615&view=rev Author: cosbor11 Date: 2010-07-27 19:16:59 +0000 (Tue, 27 Jul 2010) Log Message: ----------- changed handle on .resetDetailPanel(); in the validate data callback to this.ownerCt.resetDetailPanel(); was causing runtime error Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-07-27 18:29:49 UTC (rev 4614) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-07-27 19:16:59 UTC (rev 4615) @@ -128,7 +128,7 @@ } }); this.gridPanel.boxMinHeight=200; - //If gridPanel config supplied, initialise toolbar + //If gridPanel config supplied, initialize toolbar if (!this.gridPanel.initComponent){ this.gridPanel.bodyCfg=''; if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; @@ -228,7 +228,7 @@ if (cb) cb(); else { - this.resetDetailPanel(); + this.ownerCt.resetDetailPanel(); if (this.ownerCt.layout.type=='card'||this.ownerCt.layout.type=='slide') this.ownerCt.layout.setActiveItem(0); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-08-02 18:32:55
|
Revision: 4639 http://jaffa.svn.sourceforge.net/jaffa/?rev=4639&view=rev Author: cosbor11 Date: 2010-08-02 18:32:49 +0000 (Mon, 02 Aug 2010) Log Message: ----------- See Bug #14803. The f.clearPanels() call in PanelController.js in the clearPanelFields method conflicts with detailPanel.clearPanel in GridDetailContainer.js and causes a too much recursion error so I changed the name of the method in GridDetailContainer to "clearForm" Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-08-02 16:31:13 UTC (rev 4638) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-08-02 18:32:49 UTC (rev 4639) @@ -205,7 +205,7 @@ Ext.applyIf(this.detailPanel, { controller: this.gridPanel.controller, - clearPanel: function() { + clearForm: function() { this.controller.clearPanelFields(this); delete this.record; this.disable(); @@ -475,13 +475,13 @@ onRowClick: function(grid, rowIndex, e){ if (grid.getSelectionModel().getSelections().length > 1){ if (!this.detailPanel.isDirty){ - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); this.detailPanel.setTitle(this.detailPanel.baseTitle); }else{ if (this.detailPanel.validate()) { this.detailPanel.updateRecord(); var record = this.detailPanel.record; - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); this.detailPanel.setTitle(this.detailPanel.baseTitle); } } @@ -502,7 +502,7 @@ //TODO test validate before update if (this.detailPanel.validate( function(){ - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); if (this.layout.type=='card'||this.layout.type == 'slide') this.onRowClick(grid, rowIndex, e); else @@ -573,21 +573,21 @@ if (mBtn=='yes') { var record = this.detailPanel.record; if (record.get('isNew') && !this.gridPanel.getStore().getById(record.id) ) { - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(0); this.gridPanel.getTopToolbar().getComponent('_details').disable(); } } else { - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); this.detailPanel.loadRecord(record); } } }, this); } else { if (this.detailPanel.record.get('isNew') && !this.gridPanel.getStore().getById(this.detailPanel.record.id) ) { - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); } if (this.layout.type == 'card'||this.layout.type == 'slide') { this.resetDetailPanel(); @@ -596,7 +596,7 @@ }, //Reset detail panel resetDetailPanel: function(){ - this.detailPanel.clearPanel(); + this.detailPanel.clearForm(); if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(0); this.gridPanel.getTopToolbar().getComponent('_details').disable(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-08-26 22:15:46
|
Revision: 4708 http://jaffa.svn.sourceforge.net/jaffa/?rev=4708&view=rev Author: cosbor11 Date: 2010-08-26 22:15:39 +0000 (Thu, 26 Aug 2010) Log Message: ----------- made some configuration enhancements: - added the following button properties: detailOkButton: true, detailAddButton: true, detailCancelButton: true - added onCardRowDblClick and onBorderRowDblClick methods so they can be easily overriden - changed the way the top toolbar is built Also there were two onDetailOk handler functions I removed the bottom one because it was over-writing the top Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-08-26 22:15:00 UTC (rev 4707) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-08-26 22:15:39 UTC (rev 4708) @@ -477,13 +477,6 @@ this.detailPanel.expand(); }, - onDetailOk: function(){ - if (this.detailPanel.validate()) { - this.detailPanel.updateRecord(); - if (this.layout.type == 'card' || this.layout.type == 'slide') this.layout.setActiveItem(0); - } - }, - //Method to handle selection of rows on the grid onRowClick: function(grid, rowIndex, e){ if (grid.getSelectionModel().getSelections().length > 1){ @@ -576,7 +569,10 @@ }, //Ok button handler onDetailOk: function(){ - if (this.detailPanel.validate()) this.detailPanel.updateRecord(); + if (this.detailPanel.validate()) { + this.detailPanel.updateRecord(); + if (this.layout.type == 'card' || this.layout.type == 'slide') this.layout.setActiveItem(0); + } }, //Cancel button handler onDetailCancel: function(){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <b_c...@us...> - 2010-09-25 00:33:36
|
Revision: 4771 http://jaffa.svn.sourceforge.net/jaffa/?rev=4771&view=rev Author: b_calderwood Date: 2010-09-25 00:33:30 +0000 (Sat, 25 Sep 2010) Log Message: ----------- Add updaterecord and removerecord events that are fired when records are added or removed from the gridpanel. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-09-25 00:03:22 UTC (rev 4770) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-09-25 00:33:30 UTC (rev 4771) @@ -103,7 +103,22 @@ * @param {this} ct the griddetailcontainer * @param {Object} rec the record being edited */ - 'loadrecord' + 'loadrecord', + /** + * @event updaterecord + * Fires after a record in the grid is updated by the detail panel + * @param {this} ct the griddetailcontainer + * @param {Object} oldrec the record being changed + * @param {Object} newrec the updated record + */ + 'updaterecord', + /** + * @event removerecord + * Fires after a record in the grid is removed + * @param {this} ct the griddetailcontainer + * @param {Object} records the deleted records + */ + 'removerecord' ); //Inject updateRecord method into grid save process if (this.gridPanel.saveData){ @@ -250,10 +265,17 @@ //Updates grid record with changes made on detail panel updateRecord: function() { if (this.isDirty) { + var oldRecordData={}; + for(var property in this.record.data) + oldRecordData[property] = this.record.data[property]; + + var oldRecord = new (this.gridPanel.getStore().recordType)(oldRecordData);; + this.controller.updateRecordFromPanel(this.record, this); if (this.record.get('isNew') && !this.gridPanel.getStore().getById(this.record.id)) this.gridPanel.getStore().add(this.record) this.setDirty(false); + this.ownerCt.fireEvent('updaterecord', this.ownerCt, oldRecord, this.record); } if (this.record && this.record.isNew && !this.record.modified) { this.record.store.remove(this.record); } @@ -575,6 +597,7 @@ } else { Ext.MessageBox.alert(this.buttonErrorTitle,this.removeButtonSelectAtLeastOneRecordText); } + this.fireEvent('removerecord', this, recs); }, //Ok button handler onDetailOk: function(){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-09-29 17:18:34
|
Revision: 4774 http://jaffa.svn.sourceforge.net/jaffa/?rev=4774&view=rev Author: cosbor11 Date: 2010-09-29 17:18:28 +0000 (Wed, 29 Sep 2010) Log Message: ----------- Moved the applyIf of saveData and validateData to the gridPanel to after the instantiation of the grid so that if the grid's class definition has these methods they will not be overwritten. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-09-28 23:46:38 UTC (rev 4773) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-09-29 17:18:28 UTC (rev 4774) @@ -137,6 +137,14 @@ originalValidate(); } } + this.gridPanel.boxMinHeight=200; + //If gridPanel config supplied, initialize toolbar + if (!this.gridPanel.initComponent){ + this.gridPanel.bodyCfg=''; + if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; + this.gridPanel = Ext.ComponentMgr.create(this.gridPanel, Ext.Panel); + } + Ext.applyIf(this.gridPanel, { region: 'center', saveData: function(origData, saveData) { @@ -149,13 +157,6 @@ return Jaffa.maintenance.plugins.GridLoadSave.prototype.validateData.call(this); } }); - this.gridPanel.boxMinHeight=200; - //If gridPanel config supplied, initialize toolbar - if (!this.gridPanel.initComponent){ - this.gridPanel.bodyCfg=''; - if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; - this.gridPanel = Ext.ComponentMgr.create(this.gridPanel, Ext.Panel); - } //baseTitle is used to create title on detail panel, adding modifiers when necessary ('Add', 'Modify', '*') this.detailPanel.baseTitle = this.detailPanel.title; @@ -267,8 +268,7 @@ if (this.isDirty) { var oldRecordData={}; for(var property in this.record.data) - oldRecordData[property] = this.record.data[property]; - + oldRecordData[property] = this.record.data[property]; var oldRecord = new (this.gridPanel.getStore().recordType)(oldRecordData);; this.controller.updateRecordFromPanel(this.record, this); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-10-07 23:45:00
|
Revision: 4790 http://jaffa.svn.sourceforge.net/jaffa/?rev=4790&view=rev Author: cosbor11 Date: 2010-10-07 23:44:54 +0000 (Thu, 07 Oct 2010) Log Message: ----------- Added support to exclude navigationButtons by saying navigationButtons: false in the config Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-07 00:27:43 UTC (rev 4789) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-07 23:44:54 UTC (rev 4790) @@ -85,7 +85,7 @@ detailOkButton: true, detailAddButton: true, detailCancelButton: true, - + navigationButtons: true, //Container uses panel plugin for change listeners, also stops cascade load/save into the detail panel plugins: new Jaffa.maintenance.plugins.Panel({beforerenderHandler: Ext.emptyFn, bodyCfg: ''}), initComponent: function(){ @@ -288,10 +288,9 @@ this.controller.setPanelFields(this, this.record.data); this.enable(); - if (this.ownerCt.layout.type == 'card') { + if (this.ownerCt.layout.type == 'card' && this.navigationButtons) { var currentIndex = this.gridPanel.getStore().indexOf(this.record); var currentCount = this.gridPanel.getStore().getCount(); - this.getTopToolbar().getComponent('stepBack').enable(); this.getTopToolbar().getComponent('stepForward').enable(); if (currentIndex >= currentCount - 1) { @@ -418,7 +417,7 @@ } //If using card style layout, add 'Detail' and 'List' navigation buttons to grid and detail panel - if (this.layout == 'card'||this.layout == 'slide') { + if ((this.layout == 'card'||this.layout == 'slide') && this.navigationButtons) { this.gridPanel.getTopToolbar().add('->'); this.gridPanel.getTopToolbar().add({ text: this.detailButtonText, @@ -644,7 +643,7 @@ this.detailPanel.clearForm(); if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(0); - this.gridPanel.getTopToolbar().getComponent('_details').disable(); + if (this.gridPanel.getTopToolbar().getComponent('_details')) this.gridPanel.getTopToolbar().getComponent('_details').disable(); } } }); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2010-10-12 23:15:24
|
Revision: 4802 http://jaffa.svn.sourceforge.net/jaffa/?rev=4802&view=rev Author: SeanZ Date: 2010-10-12 23:15:18 +0000 (Tue, 12 Oct 2010) Log Message: ----------- straighten saveData() and validate() override on grid panel. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-11 17:33:52 UTC (rev 4801) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-12 23:15:18 UTC (rev 4802) @@ -120,42 +120,46 @@ */ 'removerecord' ); + this.gridPanel.boxMinHeight=200; + //If gridPanel config supplied, initialize toolbar + if (!(this.gridPanel instanceof Ext.grid.GridPanel)){ + this.gridPanel.bodyCfg=''; + if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; + this.gridPanel = Ext.ComponentMgr.create(this.gridPanel, Ext.Panel); + } + //Inject updateRecord method into grid save process - if (this.gridPanel.saveData){ + if (typeof this.gridPanel.saveData == 'function'){ var originalSave = this.gridPanel.saveData.createDelegate(this.gridPanel); this.gridPanel.saveData = function(origData, saveData){ this.detailPanel.updateRecord(); originalSave(origData, saveData); } + } else { + this.gridPanel.saveData = function(origData, saveData) { + this.detailPanel.updateRecord(); + return Jaffa.maintenance.plugins.GridLoadSave.prototype.saveData.call(this, origData, saveData); + }; } + //Inject validateData method into grid save process - if (this.gridPanel.validateData){ + if (typeof this.gridPanel.validateData == 'function'){ var originalValidate = this.gridPanel.validateData.createDelegate(this.gridPanel); this.gridPanel.validateData = function(){ var msg = this.detailPanel.validateData(); if (msg) return msg; originalValidate(); } - } - this.gridPanel.boxMinHeight=200; - //If gridPanel config supplied, initialize toolbar - if (!this.gridPanel.initComponent){ - this.gridPanel.bodyCfg=''; - if (!this.gridPanel.tbar && (this.removeButton||this.addButton)) this.gridPanel.tbar=[]; - this.gridPanel = Ext.ComponentMgr.create(this.gridPanel, Ext.Panel); - } - - Ext.applyIf(this.gridPanel, { - region: 'center', - saveData: function(origData, saveData) { - this.detailPanel.updateRecord(); - return Jaffa.maintenance.plugins.GridLoadSave.prototype.saveData.call(this, origData, saveData); - }, - validateData: function() { + } else { + this.gridPanel.validateData = function() { var msg = this.detailPanel.validateData(); if (msg) return msg; return Jaffa.maintenance.plugins.GridLoadSave.prototype.validateData.call(this); + }; } + + Ext.applyIf(this.gridPanel, { + region: 'center' }); //baseTitle is used to create title on detail panel, adding modifiers when necessary ('Add', 'Modify', '*') @@ -191,7 +195,7 @@ } //If detailPanel config supplied, initialise toolbar and create component - if (!this.detailPanel.initComponent){ + if (!(this.detailPanel instanceof Ext.Panel)){ this.detailPanel.bodyCfg=''; if (!this.detailPanel.tbar) this.detailPanel.tbar=[]; this.detailPanel = Ext.ComponentMgr.create(this.detailPanel, Ext.Panel); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-10-13 19:42:32
|
Revision: 4804 http://jaffa.svn.sourceforge.net/jaffa/?rev=4804&view=rev Author: cosbor11 Date: 2010-10-13 19:42:26 +0000 (Wed, 13 Oct 2010) Log Message: ----------- fixed the saveData createDelegate to return the isChanged flag Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-12 23:47:20 UTC (rev 4803) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-13 19:42:26 UTC (rev 4804) @@ -133,7 +133,7 @@ var originalSave = this.gridPanel.saveData.createDelegate(this.gridPanel); this.gridPanel.saveData = function(origData, saveData){ this.detailPanel.updateRecord(); - originalSave(origData, saveData); + return originalSave(origData, saveData); } } else { this.gridPanel.saveData = function(origData, saveData) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2010-10-13 19:49:11
|
Revision: 4805 http://jaffa.svn.sourceforge.net/jaffa/?rev=4805&view=rev Author: cosbor11 Date: 2010-10-13 19:49:05 +0000 (Wed, 13 Oct 2010) Log Message: ----------- propagated the return of the origionalValidate function Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-13 19:42:26 UTC (rev 4804) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-10-13 19:49:05 UTC (rev 4805) @@ -148,7 +148,7 @@ this.gridPanel.validateData = function(){ var msg = this.detailPanel.validateData(); if (msg) return msg; - originalValidate(); + return originalValidate(); } } else { this.gridPanel.validateData = function() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <b_c...@us...> - 2010-11-07 00:15:27
|
Revision: 4846 http://jaffa.svn.sourceforge.net/jaffa/?rev=4846&view=rev Author: b_calderwood Date: 2010-11-07 00:15:21 +0000 (Sun, 07 Nov 2010) Log Message: ----------- Allow the modify button to be hidden if not required. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-11-05 23:56:35 UTC (rev 4845) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-11-07 00:15:21 UTC (rev 4846) @@ -82,6 +82,7 @@ */ addButton: true, + gridModifyButton: true, detailOkButton: true, detailAddButton: true, detailCancelButton: true, @@ -289,7 +290,12 @@ this.fireEvent('beforeloadrecord', this, record); this.record = record; this.controller.clearPanelFields(this); - this.controller.setPanelFields(this, this.record.data); + + if (this.loadDetailPanel) + this.loadDetailPanel(this.record); + else + this.controller.setPanelFields(this, this.record.data); + this.enable(); if (this.ownerCt.layout.type == 'card' && this.navigationButtons) { @@ -360,7 +366,7 @@ //console.error(); //Inject 'modify' button into grid panel toolbar if using card style layout - if ((this.layout == 'card'||this.layout == 'slide') && this.gridPanel.getTopToolbar()) { + if ((this.layout == 'card'||this.layout == 'slide') && this.gridPanel.getTopToolbar() && this.gridModifyButton) { this.gridPanel.getTopToolbar().insert(this.buttonIndex, { text: this.allowEdit?this.modifyButtonText:this.viewButtonText, itemId: 'modifyBtn', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <b_c...@us...> - 2010-11-09 17:48:44
|
Revision: 4849 http://jaffa.svn.sourceforge.net/jaffa/?rev=4849&view=rev Author: b_calderwood Date: 2010-11-09 17:48:38 +0000 (Tue, 09 Nov 2010) Log Message: ----------- Convert step forward/back handler to functions so they can be overridden if required. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-11-09 02:18:06 UTC (rev 4848) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2010-11-09 17:48:38 UTC (rev 4849) @@ -445,12 +445,7 @@ itemId: 'stepBack', scope:this, handler: function(){ - var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); - var newIndex = 0; - if (currentIndex > 0) - newIndex = currentIndex - 1; - - this.onRowClick(this.gridPanel, newIndex, null); + this.onStepBack(); } }); this.detailPanel.getTopToolbar().add({ @@ -462,14 +457,7 @@ itemId: 'stepForward', scope:this, handler: function(){ - var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); - var newIndex = this.gridPanel.getStore().getCount() - 1; - if (currentIndex < (this.gridPanel.getStore().getCount() - 1) && currentIndex >=0) - newIndex = currentIndex + 1; - if (currentIndex < 0) - newIndex = this.gridPanel.getStore().getCount(); - - this.onRowClick(this.gridPanel, newIndex, null); + this.onStepForward(); } }); this.detailPanel.getTopToolbar().add({ @@ -648,6 +636,24 @@ } } }, + onStepForward: function(){ + var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); + var newIndex = this.gridPanel.getStore().getCount() - 1; + if (currentIndex < (this.gridPanel.getStore().getCount() - 1) && currentIndex >=0) + newIndex = currentIndex + 1; + if (currentIndex < 0) + newIndex = this.gridPanel.getStore().getCount(); + + this.onRowClick(this.gridPanel, newIndex, null); + }, + onStepBack: function(){ + var currentIndex = this.gridPanel.getStore().indexOf(this.detailPanel.record); + var newIndex = 0; + if (currentIndex > 0) + newIndex = currentIndex - 1; + + this.onRowClick(this.gridPanel, newIndex, null); + }, //Reset detail panel resetDetailPanel: function(){ this.detailPanel.clearForm(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2011-02-03 21:40:56
|
Revision: 5037 http://jaffa.svn.sourceforge.net/jaffa/?rev=5037&view=rev Author: cosbor11 Date: 2011-02-03 21:40:49 +0000 (Thu, 03 Feb 2011) Log Message: ----------- wrapped a undefined guard around this.setTitleText() Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-02-03 13:39:44 UTC (rev 5036) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-02-03 21:40:49 UTC (rev 5037) @@ -174,7 +174,9 @@ setDirty: function(dirty) { if (this.isDirty != dirty) { this.isDirty = dirty; - this.setTitleText(); + if(this.setTitleText){ + this.setTitleText(); + } } }, validateData: function() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2011-05-19 18:11:23
|
Revision: 5266 http://jaffa.svn.sourceforge.net/jaffa/?rev=5266&view=rev Author: SeanZ Date: 2011-05-19 18:11:17 +0000 (Thu, 19 May 2011) Log Message: ----------- handle the nullpointer exception when row index is out of the bound. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-05-19 08:32:57 UTC (rev 5265) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-05-19 18:11:17 UTC (rev 5266) @@ -525,15 +525,16 @@ if (!this.detailPanel.isDirty){ if (rowIndex >= grid.getStore().getCount()) rowIndex = grid.getStore().getCount() - 1; var row = grid.getStore().getAt(rowIndex); - this.detailPanel.loadRecord(row); - if (row.get('isNew')) { - this.detailPanel.currentTitle = '('+(this.addRecordText?this.addRecordText:this.ownerCt.addRecordText)+') ' + this.detailPanel.baseTitle; - this.detailPanel.setTitle(this.detailPanel.currentTitle); + if (row) { + this.detailPanel.loadRecord(row); + if (row.get('isNew')) { + this.detailPanel.currentTitle = '('+(this.addRecordText?this.addRecordText:this.ownerCt.addRecordText)+') ' + this.detailPanel.baseTitle; + this.detailPanel.setTitle(this.detailPanel.currentTitle); + } else { + this.detailPanel.currentTitle = '('+(this.modifyRecordText?this.modifyRecordText:this.ownerCt.modifyRecordText)+') ' + this.detailPanel.baseTitle; + this.detailPanel.setTitle(this.detailPanel.currentTitle); + } } - else { - this.detailPanel.currentTitle = '('+(this.modifyRecordText?this.modifyRecordText:this.ownerCt.modifyRecordText)+') ' + this.detailPanel.baseTitle; - this.detailPanel.setTitle(this.detailPanel.currentTitle); - } }else{ //TODO test validate before update if (this.detailPanel.validate( @@ -547,15 +548,16 @@ ){ this.detailPanel.updateRecord(); var row = grid.getStore().getAt(rowIndex); - this.detailPanel.loadRecord(row); - if (row.get('isNew')) { - this.detailPanel.currentTitle = '('+(this.addRecordText?this.addRecordText:this.ownerCt.addRecordText)+') ' + this.detailPanel.baseTitle; - this.detailPanel.setTitle(this.detailPanel.currentTitle); + if (row) { + this.detailPanel.loadRecord(row); + if (row.get('isNew')) { + this.detailPanel.currentTitle = '('+(this.addRecordText?this.addRecordText:this.ownerCt.addRecordText)+') ' + this.detailPanel.baseTitle; + this.detailPanel.setTitle(this.detailPanel.currentTitle); + } else { + this.detailPanel.currentTitle = '('+(this.modifyRecordText?this.modifyRecordText:this.ownerCt.modifyRecordText)+') ' + this.detailPanel.baseTitle; + this.detailPanel.setTitle(this.detailPanel.currentTitle); + } } - else { - this.detailPanel.currentTitle = '('+(this.modifyRecordText?this.modifyRecordText:this.ownerCt.modifyRecordText)+') ' + this.detailPanel.baseTitle; - this.detailPanel.setTitle(this.detailPanel.currentTitle); - } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2011-06-03 22:17:02
|
Revision: 5331 http://jaffa.svn.sourceforge.net/jaffa/?rev=5331&view=rev Author: SeanZ Date: 2011-06-03 22:16:56 +0000 (Fri, 03 Jun 2011) Log Message: ----------- handles titleToken. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-06-03 21:12:07 UTC (rev 5330) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-06-03 22:16:56 UTC (rev 5331) @@ -165,6 +165,9 @@ //baseTitle is used to create title on detail panel, adding modifiers when necessary ('Add', 'Modify', '*') this.detailPanel.baseTitle = this.detailPanel.title; + if (this.detailPanel.titleToken) { + this.detailPanel.baseTitle = Labels.get(this.detailPanel.titleToken); + } this.detailPanel.boxMinHeight=200; //Detail panel gets basic panel plugin for change listeners. this.detailPanel.plugins = this.detailPanel.plugins || []; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cos...@us...> - 2011-06-28 17:43:15
|
Revision: 5387 http://jaffa.svn.sourceforge.net/jaffa/?rev=5387&view=rev Author: cosbor11 Date: 2011-06-28 17:43:09 +0000 (Tue, 28 Jun 2011) Log Message: ----------- made the detailPanel & gridPanel's boxMinHeight overridable Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-06-27 22:01:36 UTC (rev 5386) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2011-06-28 17:43:09 UTC (rev 5387) @@ -126,7 +126,7 @@ */ 'removerecord' ); - this.gridPanel.boxMinHeight=200; + this.gridPanel.boxMinHeight= this.gridPanel.boxMinHeight || 200; //If gridPanel config supplied, initialize toolbar if (!(this.gridPanel instanceof Ext.grid.GridPanel)){ this.gridPanel.bodyCfg=''; @@ -173,7 +173,7 @@ if (this.detailPanel.titleToken) { this.detailPanel.baseTitle = Labels.get(this.detailPanel.titleToken); } - this.detailPanel.boxMinHeight=200; + this.detailPanel.boxMinHeight= this.detailPanel.boxMinHeight || 200; //Detail panel gets basic panel plugin for change listeners. this.detailPanel.plugins = this.detailPanel.plugins || []; if (!Ext.isArray(this.detailPanel.plugins)) this.detailPanel.plugins= [this.detailPanel.plugins]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <b_c...@us...> - 2012-08-10 23:33:31
|
Revision: 6300 http://jaffa.svn.sourceforge.net/jaffa/?rev=6300&view=rev Author: b_calderwood Date: 2012-08-10 23:33:24 +0000 (Fri, 10 Aug 2012) Log Message: ----------- When a row is selected, the details are viewed in the maintenance panel. If the row is then unselected, the maintenance panel should also be cleared. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2012-08-10 00:34:10 UTC (rev 6299) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2012-08-10 23:33:24 UTC (rev 6300) @@ -519,13 +519,24 @@ //Method to handle selection of rows on the grid onRowClick: function(grid, rowIndex, e){ - if (grid.getSelectionModel().getSelections().length > 1){ + if (grid.getSelectionModel().getSelections().length == 0){ if (!this.detailPanel.isDirty){ this.detailPanel.clearForm(); this.detailPanel.setTitle(this.detailPanel.baseTitle); }else{ if (this.detailPanel.validate()) { this.detailPanel.updateRecord(); + this.detailPanel.clearForm(); + this.detailPanel.setTitle(this.detailPanel.baseTitle); + } + } + }else if (grid.getSelectionModel().getSelections().length > 1){ + if (!this.detailPanel.isDirty){ + this.detailPanel.clearForm(); + this.detailPanel.setTitle(this.detailPanel.baseTitle); + }else{ + if (this.detailPanel.validate()) { + this.detailPanel.updateRecord(); var record = this.detailPanel.record; this.detailPanel.clearForm(); this.detailPanel.setTitle(this.detailPanel.baseTitle); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pru...@us...> - 2012-09-11 16:51:23
|
Revision: 6339 http://jaffa.svn.sourceforge.net/jaffa/?rev=6339&view=rev Author: prudhvireddy Date: 2012-09-11 16:51:17 +0000 (Tue, 11 Sep 2012) Log Message: ----------- Refactor: Moved modify button handler logic to a new method called 'onModify'. This will give access to override modify handler. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2012-09-10 22:13:21 UTC (rev 6338) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2012-09-11 16:51:17 UTC (rev 6339) @@ -386,10 +386,7 @@ scope: this, handler: function(){ if (this.gridPanel.getSelectionModel().getSelections().length == 1) { - this.onRowClick(this.gridPanel, this.gridPanel.getStore().indexOf(this.gridPanel.getSelectionModel().getSelected()), null); - this.layout.setActiveItem(1); - if (this.gridPanel.getTopToolbar().getComponent('_details')) - this.gridPanel.getTopToolbar().getComponent('_details').enable(); + this.onModify.call(this,this.gridPanel.getSelectionModel().getSelected()) } else { Ext.MessageBox.alert(this.buttonErrorTitle,this.modifyButtonSelectOneRecordText); } @@ -689,6 +686,13 @@ }, onFormView : function(){ this.layout.setActiveItem(1); + }, + onModify : function(rec){ + if(this.onRowClick(this.gridPanel, this.gridPanel.getStore().indexOf(rec), null) !== false){ + this.layout.setActiveItem(1); + if (this.gridPanel.getTopToolbar().getComponent('_details')) + this.gridPanel.getTopToolbar().getComponent('_details').enable(); + } } }); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2013-02-19 16:44:34
|
Revision: 6928 http://jaffa.svn.sourceforge.net/jaffa/?rev=6928&view=rev Author: SeanZ Date: 2013-02-19 16:44:21 +0000 (Tue, 19 Feb 2013) Log Message: ----------- enable configuration of the modify button. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2013-02-16 00:48:53 UTC (rev 6927) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2013-02-19 16:44:21 UTC (rev 6928) @@ -87,6 +87,10 @@ */ floatingDataSource: false, + /** @cfg (json) modifyBtnCfg Configuration info on modify button. + * + */ + gridModifyButton: true, detailOkButton: true, detailAddButton: true, @@ -379,7 +383,7 @@ //Inject 'modify' button into grid panel toolbar if using card style layout if (['card','slide','border'].indexOf(this.layout)>=0 && this.gridPanel.getTopToolbar() && this.gridModifyButton) { - this.gridPanel.getTopToolbar().insert(this.buttonIndex, { + this.gridPanel.getTopToolbar().insert(this.buttonIndex, Ext.apply({ text: this.allowEdit?this.modifyButtonText:this.viewButtonText, itemId: 'modifyBtn', iconCls: 'table_edit', @@ -391,7 +395,7 @@ Ext.MessageBox.alert(this.buttonErrorTitle,this.modifyButtonSelectOneRecordText); } } - }); + }, this.modifyBtnCfg)); } //Inject 'Ok' and 'Cancel' buttons at start of detail panel toolbar This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2013-02-26 17:13:01
|
Revision: 6945 http://jaffa.svn.sourceforge.net/jaffa/?rev=6945&view=rev Author: SeanZ Date: 2013-02-26 17:12:52 +0000 (Tue, 26 Feb 2013) Log Message: ----------- add itemId to gridView and cancel buttons. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2013-02-26 01:10:03 UTC (rev 6944) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2013-02-26 17:12:52 UTC (rev 6945) @@ -429,6 +429,7 @@ if (this.detailCancelButton) { detailTb.addButton({ text: this.cancelButtonText, + itemId: 'cancelBtn', iconCls: 'Cancel', scope: this, handler: function() { @@ -475,6 +476,7 @@ }); this.detailPanel.getTopToolbar().add({ text: this.listButtonText, + itemId: 'gridViewBtn', iconCls: 'table_go', scope: this, handler: function(){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Se...@us...> - 2013-03-08 22:16:52
|
Revision: 6990 http://jaffa.svn.sourceforge.net/jaffa/?rev=6990&view=rev Author: SeanZ Date: 2013-03-08 22:16:46 +0000 (Fri, 08 Mar 2013) Log Message: ----------- Added copyFieldList to prepopulate a list of fields from the previous record when add a new record. Modified Paths: -------------- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js Modified: trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js =================================================================== --- trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2013-03-08 19:58:24 UTC (rev 6989) +++ trunk/JaffaRIA/source/html/js/extjs/jaffa/maintenance/GridDetailContainer.js 2013-03-08 22:16:46 UTC (rev 6990) @@ -86,7 +86,14 @@ * happens when a GridDetailContainer is inside of a Detail panel of another GridDetailContainer. */ floatingDataSource: false, - + + /** @cfg copyFieldList An array of fields that will be copied from the current/highlighted record + * when creating a new record in the store. + */ + copyFieldList: [], + copyErrorTitle: 'Copy Error', + copySelectOneRecordText:'Select a single record as the basis for the new record.', + /** @cfg (json) modifyBtnCfg Configuration info on modify button. * */ @@ -594,18 +601,10 @@ return; } if (this.detailPanel.validate(function(){ - var rec = new (this.gridPanel.getStore().recordType)({isNew:true}); - this.detailPanel.loadRecord(rec); - this.gridPanel.getSelectionModel().clearSelections(); - this.detailPanel.currentTitle = '(Add) ' + this.detailPanel.baseTitle; - this.detailPanel.setTitle(this.detailPanel.currentTitle); + this.createNewRecord(); }.createDelegate(this))){ this.detailPanel.updateRecord(); - var rec = new (this.gridPanel.getStore().recordType)({isNew:true}); - this.detailPanel.loadRecord(rec); - this.gridPanel.getSelectionModel().clearSelections(); - this.detailPanel.currentTitle = '(Add) ' + this.detailPanel.baseTitle; - this.detailPanel.setTitle(this.detailPanel.currentTitle); + if (!this.createNewRecord()) return false; }; if (this.layout.type == 'card'||this.layout.type == 'slide') { this.layout.setActiveItem(1); @@ -614,6 +613,43 @@ this.detailPanel.expand(); } }, + //Creates a new record and loads it into the detail panel + createNewRecord: function(){ + var rec; + if (this.copyFieldList && this.copyFieldList.length && this.copyFieldList.length > 0){ + var oldRec; + if (this.layout.container.items.indexOf(this.layout.activeItem)>0){ + //Adding from detail panel + oldRec = this.detailPanel.record; + }else{ + //Adding from grid panel + if (this.gridPanel.getSelectionModel().getSelections().length==0){ + oldRec = null; + }else if (this.gridPanel.getSelectionModel().getSelections().length==1){ + oldRec = this.gridPanel.getSelectionModel().getSelected(); + }else{ + //error + Ext.MessageBox.alert(this.copyErrorTitle,this.copySelectOneRecordText); + return false; + } + + } + rec = new (this.gridPanel.getStore().recordType)({isNew:true}); + if (oldRec){ + for (var i=0; i<this.copyFieldList.length; i++){ + rec.set(this.copyFieldList[i], oldRec.get(this.copyFieldList[i])); + } + } + }else{ + rec = new (this.gridPanel.getStore().recordType)({isNew:true}); + } + this.detailPanel.loadRecord(rec); + this.gridPanel.getSelectionModel().clearSelections(); + this.detailPanel.currentTitle = '(Add) ' + this.detailPanel.baseTitle; + this.detailPanel.setTitle(this.detailPanel.currentTitle); + return true; + }, + //Remove button handler onGridRemove: function() { if (!this.allowDelete) return false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |