Reputation: 3932
Here my grid name is "rightpanel". I am trying to add the values entered
in each cell of the record and display the total in the last
cell/column of the record. But I m facing a issue with calculating the
total efforts with the login as given below.Is their any other way to
achieve this?
Here I m inserting Time (for eg --> 2.03) in my cells. Thanks &
Regards
var selectionModel = new Ext.selection.CheckboxModel();
var fm=Ext.form;
var currentRecord;
var oldValue;//used to store old effort while re-editing the already entered cell
Ext.define('AM.view.rightpanel' ,{
extend:'Ext.grid.Panel',
alias : 'widget.rightpanel',
selModel : selectionModel,
store : 'addtaskstore',
id : 'rightpanel',
columnLines : true,
width:724,
selType: 'cellmodel',
plugins: [
Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit: 1,
pluginId:'rightPanelEditor'
})
],
This listener is used to listen to click on each cell and capture the old value in that cell for supporting my logic
listeners:{
cellclick:function(thisObj, td, cellIndex, record, tr, rowIndex, e, eOpts)
{
var dataIndex = thisObj.getHeaderCt().getHeaderAtIndex(cellIndex).dataIndex;
if(eval(record.get(dataIndex))< 12) //changes made after main logic
{
oldValue = record.get(dataIndex);
}
currentRecord = record;
}
},
title:'TIMESHEET',
columns: [
{
header: 'Tasks',
dataIndex: 'task_name',
width: 160
},
{
header: 'Project Name',
dataIndex: 'project_name',
width: 160
},
{
dataIndex: 'monday',
width: 95,
id:'monday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
dataIndex: 'tuesday',
width: 95,
id:'tuesday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
dataIndex: 'wednesday',
width: 95,
id:'wednesday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
dataIndex: 'thursday',
width: 95,
id:'thursday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
dataIndex: 'friday',
width: 95,
id:'friday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
dataIndex: 'saturday',
width: 95,
id:'saturday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
dataIndex: 'sunday',
width: 95,
id:'sunday',
editor:{
xtype:'textfield',
listeners:{
'blur':function(o, t, h){
if(validateEffort(o)){
calculateTotal(o.value);
}
}
}
}
},
{
header: 'Total Efforts',
dataIndex: 'total_efforts',
width: 95,
editor:{
xtype:'textfield',
disabled:true
}
}
],
initComponent: function() {
this.callParent(arguments);
}
});
This function is used to validate the number format (like 2.34) entered in the cell on cell click
function validateEffort(obj){
var regEx=/(^([0-9]|[0-1][0-9]|[2][0-3]).([0-5][0-9])$)|(^([0-9]|[1][0-2])$)/;
if(obj && !regEx.test(obj.value)){
alert("Invalid value");
obj.setValue(oldValue);
return false;
}
return true;
}
This Function is used to calculate the total efforts (in time) to be displayed in my column with dataIndex:'total_efforts'.
function calculateTotal(newValue){
//alert("old = "+oldValue + " new = " +newValue);
oldValue = oldValue?oldValue:0.00;
if(currentRecord && oldValue !=newValue){
var currTotal = currentRecord.get('total_efforts');
//alert("currTotal=="+currTotal);
if(!currTotal || currTotal == 'NaN'){
currTotal = 0.00;
}
currentRecord.set('total_efforts',((eval(currTotal)+eval(newValue)-eval(oldValue))).toFixed(2));
var newcurrTotal = currentRecord.get('total_efforts');
var arr = [];
arr=newcurrTotal.split(".");
//alert("arr[1]--> " +arr[1]);
//alert(newcurrTotal);
if(eval(arr[1])>=60)
{
var q =parseInt(eval(arr[1])/60);
//alert("q --> "+parseInt(q));
var r = (eval(arr[1])%60)/100;
//alert("r --> "+r);
var newtotal = eval(newcurrTotal)+eval(q)-(eval(arr[1])/100)+r;
alert("new---> "+newtotal.toFixed(2));
//currentRecord.set('total_efforts',newtotal.toFixed(2));
}
//alert("new total=="+currentRecord.get('total_efforts'));
}
}
Upvotes: 0
Views: 1853
Reputation: 995
Make use of the grid's edit
event that fires when a cell (or row) edit is completed.
var grid = Ext.create('Ext.grid.Panel', {
plugins [
Ext.create('Ext.grid.plugin.CellEditing', {
clicksToEdit: 1
})
],
columns: title:'TIMESHEET',
columns: [{
dataIndex: 'monday',
width: 95,
id:'monday',
editor: {
xtype: 'numberfield',
regex: /(^([0-9]|[0-1][0-9]|[2][0-3]).([0-5][0-9])$)|(^([0-9]|[1][0-2])$)/
}
}, // ... other days of week
{
header: 'Total Efforts',
dataIndex: 'total_efforts',
width: 95
}]
});
grid.on('edit', function(editor, e) {
var record = e.record,
total = 0;
// this isn't the most efficient with recalculating the total every time but it
// really shouldn't matter.
total += record.get('monday') || 0;
total += record.get('tuesday') || 0;
total += record.get('wednesday') || 0;
total += record.get('thursday') || 0;
total += record.get('friday') || 0;
total += record.get('saturday') || 0;
total += record.get('sunday') || 0;
record.set('total_efforts', total);
});
Upvotes: 1