PDA

View Full Version : Summary Bbar grid



Ronhead
29 Mar 2012, 5:40 AM
Hi everyone,
ive a code from http://examples1.ext.net/#/GridPanel/Miscellaneous/Grouping_TotalRow/ and i try to use with extjs3.x but dont work totally.
now show me this error:


c is undefined

error source line:

chrome://firebug/content/blank.gif

if(c.events){





The code is


<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>ExtJS extension - Multiple Field Grouping Grid</title>

<script type="text/javascript" src="../js/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../js/ext/ext-all-debug.js"></script>

<link rel="stylesheet" type="text/css" href="../js/ux/grid/GroupSummary.css" />
<link rel="stylesheet" type="text/css" href="../js/ext/resources/css/ext-all.css" />
<script type="text/javascript" src="../js/ux/grid/GroupSummary.js"></script>


</head>

<body>
<script type="text/javascript">

Ext.onReady(function(){

Ext.QuickTips.init();


var updateTotal = function (grid) {
var fbar = grid.getBottomToolbar(),
column,
field,
width,
data = {},
c,
cs = grid.view.getColumnData();

for (var j = 0, jlen = grid.store.getCount(); j < jlen; j++) {
var r = grid.store.getAt(j);

for (var i = 0, len = cs.length; i < len; i++) {
c = cs[i];
column = grid.getColumnModel().getColumnId([i]);

if (column.summaryType) {
data[c.name] = Ext.grid.GroupSummary.Calculations[column.summaryType](data[c.name] || 0, r, c.name, data);
}
}
}
for (var i=0; i < grid.getColumnModel().getColumnCount(); i++) {
column = grid.getColumnModel().getColumnId([i]);

if (column.dataIndex != grid.store.groupField) {
field = fbar.findBy(function (item) {
return item.dataIndex === column.dataIndex;
})[0];

c = cs[i];
fbar.remove(field, false);
fbar.insert(i, field);
width = grid.getColumnModel().getColumnWidth(i);
field.setWidth(width-5);
field.setValue((column.summaryRenderer || c.renderer)(data[c.name], {}, {}, 0, i, grid.store));
}
}

fbar.doLayout();
};



var xg = Ext.grid;

var reader = new Ext.data.JsonReader({
idProperty: 'taskId',
fields: [
{name: 'projectId', type: 'int'},
{name: 'project', type: 'string'},
{name: 'taskId', type: 'int'},
{name: 'description', type: 'string'},
{name: 'estimate', type: 'float'},
{name: 'rate', type: 'float'},
{name: 'cost', type: 'float'},
{name: 'due', type: 'date', dateFormat:'m/d/Y'}
]

});

// define a custom summary function
Ext.ux.GroupSummary.Calculations['totalCost'] = function(v, record, field){
return v + (record.data.estimate * record.data.rate);
};

// utilize custom extension for Group Summary
var summary = new Ext.ux.GroupSummary();

var grid = new xg.EditorGridPanel({
ds: new Ext.data.GroupingStore({
reader: reader,
// use local data
data: app.grid.dummyData,
sortInfo: {field: 'due', direction: 'ASC'},
groupField: 'project'
}),
columns: [
{
id: 'description',
header: 'Task',
width: 80,
sortable: true,
dataIndex: 'description',
summaryType: 'count',
hideable: false,
summaryRenderer: function(v, params, data){
return ((v === 0 || v > 1) ? '(' + v +' Tasks)' : '(1 Task)');
},
editor: new Ext.form.TextField({
allowBlank: false
})
},{
header: 'Project',
width: 20,
sortable: true,
dataIndex: 'project'
},{
header: 'Due Date',
width: 25,
sortable: true,
dataIndex: 'due',
summaryType: 'max',
renderer: Ext.util.Format.dateRenderer('m/d/Y'),
editor: new Ext.form.DateField({
format: 'm/d/Y'
})
},{
header: 'Estimate',
width: 20,
sortable: true,
dataIndex: 'estimate',
summaryType: 'sum',
renderer : function(v){
return v +' hours';
},
editor: new Ext.form.NumberField({
allowBlank: false,
allowNegative: false,
style: 'text-align:left'
})
},{
header: 'Rate',
width: 20,
sortable: true,
renderer: Ext.util.Format.usMoney,
dataIndex: 'rate',
summaryType: 'average',
editor: new Ext.form.NumberField({
allowBlank: false,
allowNegative: false,
style: 'text-align:left'
})
},{
id: 'cost',
header: 'Cost',
width: 20,
sortable: false,
groupable: false,
renderer: function(v, params, record){
return Ext.util.Format.usMoney(record.data.estimate * record.data.rate);
},
dataIndex: 'cost',
summaryType: 'totalCost',
summaryRenderer: Ext.util.Format.usMoney
}
],

view: new Ext.grid.GroupingView({
forceFit: true,
showGroupName: false,
enableNoGroups: false,
enableGroupingMenu: false,
hideGroupedColumn: true
}),

plugins: summary,

tbar : [{
text: 'Toggle',
tooltip: 'Toggle the visibility of summary row',
handler: function(){summary.toggleSummaries();}
}],
listeners: {
afterrender : {
fn : function(e){
updateTotal(e);
}
}
},
frame: true,
width: 800,
height: 450,
clicksToEdit: 1,
collapsible: true,
animCollapse: false,
trackMouseOver: false,
//enableColumnMove: false,
title: 'Sponsored Projects',
iconCls: 'icon-grid',
renderTo: document.body,
bbar:[
{xtype:'textfield',id:"ColumnField1",dataIndex:'description', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField2",dataIndex:'due', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField3",dataIndex:'estimate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField4",dataIndex:'rate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField5",dataIndex:'cost', cls:'total-field' ,text:'-'}
]
});

});

// set up namespace for application
Ext.ns('app.grid');
// store dummy data in the app namespace
app.grid.dummyData = [
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 112, description: 'Integrate 2.0 Forms with 2.0 Layouts', estimate: 6, rate: 150, due:'06/24/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 113, description: 'Implement AnchorLayout', estimate: 4, rate: 150, due:'06/25/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 114, description: 'Add support for multiple types of anchors', estimate: 4, rate: 150, due:'06/27/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 115, description: 'Testing and debugging', estimate: 8, rate: 0, due:'06/29/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 101, description: 'Add required rendering "hooks" to GridView', estimate: 6, rate: 100, due:'07/01/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 102, description: 'Extend GridView and override rendering functions', estimate: 6, rate: 100, due:'07/03/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 103, description: 'Extend Store with grouping functionality', estimate: 4, rate: 100, due:'07/04/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 121, description: 'Default CSS Styling', estimate: 2, rate: 100, due:'07/05/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 104, description: 'Testing and debugging', estimate: 6, rate: 100, due:'07/06/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 105, description: 'Ext Grid plugin integration', estimate: 4, rate: 125, due:'07/01/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 106, description: 'Summary creation during rendering phase', estimate: 4, rate: 125, due:'07/02/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 107, description: 'Dynamic summary updates in editor grids', estimate: 6, rate: 125, due:'07/05/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 108, description: 'Remote summary integration', estimate: 4, rate: 125, due:'07/05/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 109, description: 'Summary renderers and calculators', estimate: 4, rate: 125, due:'07/06/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 110, description: 'Integrate summaries with GroupingView', estimate: 10, rate: 125, due:'07/11/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 111, description: 'Testing and debugging', estimate: 8, rate: 125, due:'07/15/2007'}
];




</script>

<div id="grid-example"></div>
</body>
</html>


i hope you can helpme i need this summary from group

mitchellsimoens
29 Mar 2012, 8:34 AM
In the updateTotal method the 2nd for loop, field is undefined. So when you try to insert it, it will break.

scottmartin
29 Mar 2012, 9:37 AM
Update line 85 and 90:



Ext.ux.grid.GroupSummary.Calculations['totalCost'] = function(v, record, field){ // added .grid.
var summary = new Ext.ux.grid.GroupSummary(); // .grid.


and field is undefined as Mitch mention on L:49


field = fbar.findBy(function (item) {

Regards,
Scott.

Ronhead
29 Mar 2012, 10:41 AM
Thank you guys for you response :)

i know this warning,
Ext.ux.grid.GroupSummary.Calculations i dont know why my code just it , but works

Ext.ux.GroupSummary.Calculations


mm a fix a error but dont work again



for (var i=0; i < grid.getColumnModel().getColumnCount(); i++) {
column = grid.getColumnModel().getColumnId([i]);
//column in second loop is == 1 WHY?
if (column != grid.store.groupField) {
field = fbar.findBy(function (item) {
return item.dataIndex === column;
})[0];

c = cs[i];
fbar.remove(field, false);
fbar.insert(i, field);
width = grid.getColumnModel().getColumnWidth(i);
field.setWidth(width-5);
field.setValue((column.summaryRenderer || c.renderer)(data[c.name], {}, {}, 0, i, grid.store));
}
}


just put column and not
column.dataIndex
and
change name from bbar dataindex
{xtype:'textfield',id:"ColumnField1",dataIndex:'description', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField2",dataIndex:'due', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField3",dataIndex:'estimate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField4",dataIndex:'rate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField5",dataIndex:'cost', cls:'total-field' ,text:'-'}

Ronhead
29 Mar 2012, 1:31 PM
well now i've this error, dont show me the real values in summary textfield.
this line

field.setValue((column.summaryRenderer || c.renderer)(data[c.name], {}, {}, 0, i, grid.store));


the fix code



<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>ExtJS extension - Multiple Field Grouping Grid</title>

<script type="text/javascript" src="../js/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../js/ext/ext-all-debug.js"></script>

<link rel="stylesheet" type="text/css" href="../js/ux/grid/GroupSummary.css" />
<link rel="stylesheet" type="text/css" href="../js/ext/resources/css/ext-all.css" />
<script type="text/javascript" src="../js/ux/grid/GroupSummary.js"></script>


</head>

<body>
<script type="text/javascript">

Ext.onReady(function(){

Ext.QuickTips.init();


var updateTotal = function (grid) {
var fbar = grid.getBottomToolbar(),
column,
field,
width,
data = {},
c,
cs = grid.view.getColumnData();

for (var j = 0, jlen = grid.store.getCount(); j < jlen; j++) {
var r = grid.store.getAt(j);

for (var i = 0, len = cs.length; i < len; i++) {
c = cs[i];
column = grid.getColumnModel().getColumnId([i]);

if (column.summaryType) {
data[c.name] = Ext.grid.GroupSummary.Calculations[column.summaryType](data[c.name] || 0, r, c.name, data);
}
}
}
for (var i=0; i < grid.getColumnModel().getColumnCount(); i++) {
column = grid.getColumnModel().getColumnId([i]);
// alert("column: "+column);
if (column != grid.store.groupField) {
field = fbar.findBy(function (item) {
return item.dataIndex === column;
})[0];
c = cs[i];
fbar.remove(field, false);
fbar.insert(i, field);
width = grid.getColumnModel().getColumnWidth(i);
field.setWidth(width-5);
field.setValue((column.summaryRenderer || c.renderer)(data[c.name], {}, {}, 0, i, grid.store));
}
}

fbar.doLayout();
};



var xg = Ext.grid;

var reader = new Ext.data.JsonReader({
idProperty: 'taskId',
fields: [
{name: 'projectId', type: 'int'},
{name: 'project', type: 'string'},
{name: 'taskId', type: 'int'},
{name: 'description', type: 'string'},
{name: 'estimate', type: 'float'},
{name: 'rate', type: 'float'},
{name: 'cost', type: 'float'},
{name: 'due', type: 'date', dateFormat:'m/d/Y'}
]

});

// define a custom summary function
Ext.ux.GroupSummary.Calculations['totalCost'] = function(v, record, field){
return v + (record.data.estimate * record.data.rate);
};

// utilize custom extension for Group Summary
var summary = new Ext.ux.GroupSummary();

var grid = new xg.EditorGridPanel({
ds: new Ext.data.GroupingStore({
reader: reader,
// use local data
data: app.grid.dummyData,
sortInfo: {field: 'due', direction: 'ASC'},
groupField: 'project'
}),
columns: [
{
id: 'description',
header: 'Task',
width: 80,
sortable: true,
dataIndex: 'description',
summaryType: 'count',
hideable: false,
summaryRenderer: function(v, params, data){
return ((v === 0 || v > 1) ? '(' + v +' Tasks)' : '(1 Task)');
},
editor: new Ext.form.TextField({
allowBlank: false
})
},{
header: 'Project',
width: 20,
id: 'project',
sortable: true,
dataIndex: 'project'
},{
header: 'Due Date',
width: 25,
sortable: true,
id: 'due',
dataIndex: 'due',
summaryType: 'max',
renderer: Ext.util.Format.dateRenderer('m/d/Y'),
editor: new Ext.form.DateField({
format: 'm/d/Y'
})
},{
header: 'Estimate',
width: 20,
id:'estimate',
sortable: true,
dataIndex: 'estimate',
summaryType: 'sum',
renderer : function(v){
return v +' hours';
},
editor: new Ext.form.NumberField({
allowBlank: false,
allowNegative: false,
style: 'text-align:left'
})
},{
header: 'Rate',
width: 20,
sortable: true,
renderer: Ext.util.Format.usMoney,
dataIndex: 'rate',
id: 'rate',
summaryType: 'average',
editor: new Ext.form.NumberField({
allowBlank: false,
allowNegative: false,
style: 'text-align:left'
})
},{
id: 'cost',
header: 'Cost',
width: 20,
sortable: false,
groupable: false,
renderer: function(v, params, record){
return Ext.util.Format.usMoney(record.estimate * record.rate);
},
dataIndex: 'cost',
summaryType: 'totalCost',
summaryRenderer: Ext.util.Format.usMoney
}
],

view: new Ext.grid.GroupingView({
forceFit: true,
showGroupName: false,
enableNoGroups: false,
enableGroupingMenu: false,
hideGroupedColumn: true
}),

plugins: summary,

tbar : [{
text: 'Toggle',
tooltip: 'Toggle the visibility of summary row',
handler: function(){summary.toggleSummaries();}
}],
listeners: {
afterrender : {
fn : function(e){
updateTotal(e);
}
},
columnsize :{
fn : function(e){
updateTotal(e);
}
}
},
frame: true,
width: 800,
height: 450,
clicksToEdit: 1,
collapsible: true,
animCollapse: false,
trackMouseOver: false,
//enableColumnMove: false,
title: 'Sponsored Projects',
iconCls: 'icon-grid',
renderTo: document.body,
bbar:[
{xtype:'textfield',id:"ColumnField1",dataIndex:'description', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField2",dataIndex:'due', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField3",dataIndex:'estimate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField4",dataIndex:'rate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField5",dataIndex:'cost', cls:'total-field' ,text:'-'}
]
});

});

// set up namespace for application
Ext.ns('app.grid');
// store dummy data in the app namespace
app.grid.dummyData = [
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 112, description: 'Integrate 2.0 Forms with 2.0 Layouts', estimate: 6, rate: 150, due:'06/24/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 113, description: 'Implement AnchorLayout', estimate: 4, rate: 150, due:'06/25/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 114, description: 'Add support for multiple types of anchors', estimate: 4, rate: 150, due:'06/27/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 115, description: 'Testing and debugging', estimate: 8, rate: 0, due:'06/29/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 101, description: 'Add required rendering "hooks" to GridView', estimate: 6, rate: 100, due:'07/01/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 102, description: 'Extend GridView and override rendering functions', estimate: 6, rate: 100, due:'07/03/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 103, description: 'Extend Store with grouping functionality', estimate: 4, rate: 100, due:'07/04/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 121, description: 'Default CSS Styling', estimate: 2, rate: 100, due:'07/05/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 104, description: 'Testing and debugging', estimate: 6, rate: 100, due:'07/06/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 105, description: 'Ext Grid plugin integration', estimate: 4, rate: 125, due:'07/01/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 106, description: 'Summary creation during rendering phase', estimate: 4, rate: 125, due:'07/02/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 107, description: 'Dynamic summary updates in editor grids', estimate: 6, rate: 125, due:'07/05/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 108, description: 'Remote summary integration', estimate: 4, rate: 125, due:'07/05/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 109, description: 'Summary renderers and calculators', estimate: 4, rate: 125, due:'07/06/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 110, description: 'Integrate summaries with GroupingView', estimate: 10, rate: 125, due:'07/11/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 111, description: 'Testing and debugging', estimate: 8, rate: 125, due:'07/15/2007'}
];




</script>

<div id="grid-example"></div>
</body>
</html>

Ronhead
30 Mar 2012, 7:35 AM
anyone can helpme ?

Ronhead
4 Apr 2012, 6:52 AM
well i can repair this code and use in 3.x source

the final code



<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>ExtJS extension - Multiple Field Grouping Grid</title>

<script type="text/javascript" src="../js/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../js/ext/ext-all-debug.js"></script>

<link rel="stylesheet" type="text/css" href="../js/ux/grid/GroupSummary.css" />
<link rel="stylesheet" type="text/css" href="../js/ext/resources/css/ext-all.css" />
<script type="text/javascript" src="../js/ux/grid/GroupSummary.js"></script>


</head>

<body>
<script type="text/javascript">

Ext.onReady(function(){

Ext.QuickTips.init();


var xg = Ext.grid;

var reader = new Ext.data.JsonReader({
idProperty: 'taskId',
fields: [
{name: 'projectId', type: 'int'},
{name: 'project', type: 'string'},
{name: 'taskId', type: 'int'},
{name: 'description', type: 'string'},
{name: 'estimate', type: 'float'},
{name: 'rate', type: 'float'},
{name: 'cost', type: 'float'},
{name: 'due', type: 'date', dateFormat:'m/d/Y'}
]

});

// define a custom summary function
Ext.ux.GroupSummary.Calculations['totalCost'] = function(v, record, field){
return v + (record.data.estimate * record.data.rate);
};

// utilize custom extension for Group Summary
var summary = new Ext.ux.GroupSummary();

var grid = new xg.EditorGridPanel({
id: 'id_grid',
ds: new Ext.data.GroupingStore({
reader: reader,
// use local data
data: app.grid.dummyData,
sortInfo: {field: 'due', direction: 'ASC'},
groupField: 'project'
}),
columns: [
{
id: 'description',
header: 'Task',
width: 80,
sortable: true,
dataIndex: 'description',
summaryType: 'count',
hideable: false,
summaryRenderer: function(v, params, data){
return ((v === 0 || v > 1) ? '(' + v +' Tasks)' : '(1 Task)');
},
editor: new Ext.form.TextField({
allowBlank: false
})
},{
header: 'Project',
width: 20,
id: 'project',
sortable: true,
dataIndex: 'project'
},{
header: 'Due Date',
width: 25,
sortable: true,
id: 'due',
dataIndex: 'due',
summaryType: 'max',
renderer: Ext.util.Format.dateRenderer('m/d/Y'),
editor: new Ext.form.DateField({
format: 'm/d/Y'
})
},{
header: 'Estimate',
width: 20,
id:'estimate',
sortable: true,
dataIndex: 'estimate',
summaryType: 'sum',
renderer : function(v){
return v +' hours';
},
editor: new Ext.form.NumberField({
allowBlank: false,
allowNegative: false,
style: 'text-align:left'
})
},{
header: 'Rate',
width: 20,
sortable: true,
renderer: Ext.util.Format.usMoney,
dataIndex: 'rate',
id: 'rate',
summaryType: 'sum',
editor: new Ext.form.NumberField({
allowBlank: false,
allowNegative: false,
style: 'text-align:left'
})
},{
id: 'cost',
header: 'Cost',
width: 20,
sortable: false,
groupable: false,
renderer: function(v, params, record){
return Ext.util.Format.usMoney(record.estimate * record.rate);
},
dataIndex: 'cost',
summaryType: 'sum',
summaryRenderer: Ext.util.Format.usMoney
}
],

view: new Ext.grid.GroupingView({
forceFit: true,
showGroupName: false,
enableNoGroups: false,
enableGroupingMenu: false,
hideGroupedColumn: true
}),
// plugins: summary,

tbar : [{
text: 'Toggle',
tooltip: 'Toggle the visibility of summary row',
handler: function(){summary.toggleSummaries();}
}],
listeners: {
afterrender : {
fn : function(e){
updateTotal(e);
}
},
columnresize :{
fn : function(grid){
updateTotal(grid);
}
}
},
frame: true,
width: 800,
height: 450,
clicksToEdit: 1,
collapsible: true,
animCollapse: false,
trackMouseOver: false,
//enableColumnMove: false,
title: 'Sponsored Projects',
iconCls: 'icon-grid',
renderTo: document.body,
bbar:[
{xtype:'textfield',id:"ColumnField1",dataIndex:'description', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField2",dataIndex:'due', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField3",dataIndex:'estimate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField4",dataIndex:'rate', cls:'total-field' ,text:'-'},
{xtype:'textfield',id:"ColumnField5",dataIndex:'cost', cls:'total-field' ,text:'-'}
]
});
function captureEvents(observable) {
Ext.util.Observable.capture(
observable,
function(eventName) {
console.info(eventName);
},
this
);
}
// captureEvents(grid);

});
function updateTotal (grid) {
var grid = Ext.getCmp('id_grid');
var fbar = grid.getBottomToolbar(),
column,
field,
width,
data = {},
c,
cs = grid.view.getColumnData();

for (var j = 0, jlen = grid.store.getCount(); j < jlen; j++) {
var r = grid.store.getAt(j);

for (var i = 0, len = cs.length; i < len; i++) {
c = cs[i];
column = grid.getColumnModel().getColumnId([i]);

console.info(c);
if (c.scope.summaryType) {
data[c.name] = Ext.grid.GroupSummary.Calculations[c.scope.summaryType](data[c.name] || 0, r, c.name, data);
}
}

}
for (var i=0; i < grid.getColumnModel().getColumnCount(); i++) {
column = grid.getColumnModel().getColumnId([i]);
// alert("column: "+column);
if (column != grid.store.groupField) {
field = fbar.findBy(function (item) {
return item.dataIndex === column;
})[0];
c = cs[i];
fbar.remove(field, false);
fbar.insert(i, field);
width = grid.getColumnModel().getColumnWidth(i);
field.setWidth(width+5);
field.setValue((c.scope.summaryRenderer || c.scope.renderer)(data[c.name], {}, {}, 0, i, grid.store));
// field.setValue(1);



}
}

fbar.doLayout();
};
// set up namespace for application
Ext.ns('app.grid');
// store dummy data in the app namespace
app.grid.dummyData = [
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 112, description: 'Integrate 2.0 Forms with 2.0 Layouts', estimate: 6, rate: 150, due:'06/24/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 113, description: 'Implement AnchorLayout', estimate: 4, rate: 150, due:'06/25/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 114, description: 'Add support for multiple types of anchors', estimate: 4, rate: 150, due:'06/27/2007'},
{projectId: 100, project: 'Ext Forms: Field Anchoring', taskId: 115, description: 'Testing and debugging', estimate: 8, rate: 0, due:'06/29/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 101, description: 'Add required rendering "hooks" to GridView', estimate: 6, rate: 100, due:'07/01/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 102, description: 'Extend GridView and override rendering functions', estimate: 6, rate: 100, due:'07/03/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 103, description: 'Extend Store with grouping functionality', estimate: 4, rate: 100, due:'07/04/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 121, description: 'Default CSS Styling', estimate: 2, rate: 100, due:'07/05/2007'},
{projectId: 101, project: 'Ext Grid: Single-level Grouping', taskId: 104, description: 'Testing and debugging', estimate: 6, rate: 100, due:'07/06/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 105, description: 'Ext Grid plugin integration', estimate: 4, rate: 125, due:'07/01/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 106, description: 'Summary creation during rendering phase', estimate: 4, rate: 125, due:'07/02/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 107, description: 'Dynamic summary updates in editor grids', estimate: 6, rate: 125, due:'07/05/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 108, description: 'Remote summary integration', estimate: 4, rate: 125, due:'07/05/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 109, description: 'Summary renderers and calculators', estimate: 4, rate: 125, due:'07/06/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 110, description: 'Integrate summaries with GroupingView', estimate: 10, rate: 125, due:'07/11/2007'},
{projectId: 102, project: 'Ext Grid: Summary Rows', taskId: 111, description: 'Testing and debugging', estimate: 8, rate: 125, due:'07/15/2007'}
];




</script>

<div id="grid-example"></div>
</body>
</html>


33577
http://www.sencha.com/forum/image/png;base64,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