Dev
Dev

Reputation: 3932

Adding the cell values of a record in grid and get the result in the last cell of the record in extjs

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

Answers (1)

wantok
wantok

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

Related Questions