jQWidgets Forums

jQuery UI Widgets Forums Grid spredsheet grid Reply To: spredsheet grid

spredsheet grid #85154

atomic
Participant

Hi Peter,

I can select it but cannot edit it, but when I paste it accepts the value.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="keywords" content="jQuery Tabs, Tabs Widget, TabView, jqxTabs" />
    <meta name="description" content="In this sample, the Tab Contents will be loaded with Ajax when
        a Tab is selected." />
    <title id='Description'>Spreadsheet</title>
    <link rel="stylesheet" href="../INCLUDES/jqwidgets/styles/jqx.base.css" type="text/css" />
	<link rel="stylesheet" href="../INCLUDES/jqwidgets/styles/jqx.bootstrap.css" type="text/css" />
    <link rel="stylesheet" href="../INCLUDES/jqwidgets/styles/jqx.fresh.css" type="text/css" />
    <script type="text/javascript" src="../INCLUDES/scripts/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="../INCLUDES/scripts/demos.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxcore.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxtabs.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxcheckbox.js"></script>
	
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxdata.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxlistbox.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxdropdownlist.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxdata.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxchart.js"></script> 
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxbuttons.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxscrollbar.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxmenu.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.js"></script>
	<script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.edit.js"></script>  
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.selection.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.filter.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.sort.js"></script>
	<script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.columnsresize.js"></script> 
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.export.js"></script> 
	<script type="text/javascript" src="../INCLUDES/jqwidgets/jqxnumberinput.js"></script> 
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxgrid.aggregates.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxvalidator.js"></script>
    <script type="text/javascript" src="../INCLUDES/jqwidgets/jqxnotification.js"></script>
    
    
        <style type="text/css">
        html, body
        {
            width: 100%;
            height: 100%;
        }
        .jqx-notification-container
        {
            z-index:9999;
        }
    </style>
    
    
    
    <script type="text/javascript">
	
    $(document).ready(function () {
        var theme = 'fresh';
	

		var myURL2 ='FEDSectors.json';
		var source =
            {
				url: myURL2,
				datatype: 'json',
				cache: false,
				async: false,
                updaterow: function (rowid, rowdata) {
                    // synchronize with the server - send update command   
                }
            };
            
            
        var dataAdapter = new $.jqx.dataAdapter(source);
        dataAdapter.dataBind();
		var recordi = dataAdapter.records;	
		
		function getYears() {
			$.ajax({
				
			  url:'years.json',
			  async: false,  
			  cache: false,
			  success:function(data) {
				 result = data; 
				}
				});
			return result;
		} 
		
		var years = getYears();
        var kol = years.length;

		var columns_years_editable = [];
		flag = false;
		$.each(years, function(key, value) { 
				if (!flag)
				{
					var kolone ={
						text:'PJ',
						datafield:'sector',
						width:120,
						pinned: true,
                        editable: false,
                        aggregates: [{
                              function (aggregatedValue, currentValue) {
                                  return aggregatedValue;
                              }
                          }
                          ],
    					  aggregatesrenderer: function (aggregates, column, element, summaryData) {
    							var container = $("<div style='overflow: hidden; position: relative; margin: 2px;'></div>");
    							var addButton = $("<div style='float: left; margin-left: 5px;'><img style='position: relative; margin-top: 2px;' src='../INCLUDES/images/save16.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Save</span></div>");
    							container.append(addButton);
    							addButton.jqxButton({  width: 70, height: 20, theme: theme });
    							addButton.click(function () {saveChanges();});
    							return  container;
    						  },
					};
					flag = true;
					columns_years_editable.push(kolone);
				}
			
					kolone ={
							text:value["year"],
							datafield:value["year"],
							width:120,
							aggregates: ['sum'],
							cellsalign: 'right',
							cellsformat: 'd2',
							columntype: 'numberinput',
							initeditor: function (row, cellvalue, editor) {
											editor.jqxNumberInput({ decimalDigits: 2 });
											},
							validation: function (cell, value) {
											if (value < 0) {
												return { result: false, message: value_should_be_positive };
											}
											return true;
											}
											}
				
				columns_years_editable.push(kolone);
		});
        

        function isNumber(n) {
          return !isNaN(parseFloat(n)) && isFinite(n);
        }

        function checkSectorInputs(){
            var errorType = [];

            var rows = $("#jqxgrid").jqxGrid('getrows');	
            
            for(var i = 0; i < rows.length; i++)
            {
                $.each(years, function(key, value) 
				{
				    var error = new Object();
					var year = value["year"];
                    
                    if(rows[i][year]<0){                        
                        error['Sector'] = rows[i].sector;
                        error['Year'] = year;
                        error['Value'] = rows[i][year];
                        errorType.push(error);
                    }
                    if(!isNumber(rows[i][year])){                    
                        error['Sector'] = rows[i].sector;
                        error['Year'] = year;
                        error['Value'] = rows[i][year];
                        errorType.push(error);
                    }
                    
				});  
            }
            return errorType;
            }

		function saveChanges() 
        {
            var objList = [];
            var rows = $("#jqxgrid").jqxGrid('getrows');	
            
            for(var i = 0; i < rows.length; i++)
            {
				var data = new Object();
				$.each(years, function(key, value) 
				{
					var year = value["year"];
					data[year] = parseFloat(rows[i][year]);
                    
				});
				data['sector'] = rows[i].sector;
				objList.push(data);
                
            }
            errorType = checkSectorInputs();
            
            if(Object.keys(errorType).length === 0){
    			var myJsonString = JSON.stringify(objList);
                $.ajax({
                    type: "POST",
                    url: "controler.php?action=SaveData",
                    data: myJsonString,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (msg) {
                        $(".jqx-grid-validation, .jqx-grid-validation-arrow-up, .jqx-grid-validation-arrow-down").remove();
                        $("#jqxNotification").jqxNotification({width: 450, position: "top-left", opacity: 0.9,theme: theme,autoOpen: false, animationOpenDelay: 500, autoClose: false, autoCloseDelay: 500, template: "success"});
                        $("#notificationContent").html('Succesfull update of final energy demand by sectors.');
                        $("#jqxNotification").jqxNotification("open");
                        
                    }
                });
            }
            else{
           	  for (var i = 0; i < errorType.length; i++) {
                    index = recordi.findIndex(x => x.sector==errorType[i]['Sector']);
                    $("#jqxgrid").jqxGrid('showvalidationpopup', index, errorType[i]['Year'], "Invalid Value");
                }
            }
        }

        var sirina = 120*kol+120;
    
        $('#jqxgrid').on('cellvaluechanged', function (event) {
             $(".jqx-grid-validation, .jqx-grid-validation-arrow-up, .jqx-grid-validation-arrow-down").remove();
             errorSectors = checkSectorInputs();
             if(Object.keys(errorSectors).length !== 0){
                 for (var i = 0; i < errorSectors.length; i++) {
                       index = recordi.findIndex(x => x.sector==errorSectors[i]['Sector']);
                      $("#jqxgrid").jqxGrid('showvalidationpopup', index, errorSectors[i]['Year'], "Invalid Value"); 
                 }
             }    
         });
       $("#jqxgrid").jqxGrid(
        {
            source: dataAdapter,
            editable: true,
            columnsresize: true,
            selectionmode: 'multiplecellsadvanced',
            autoheight: true,
            width: sirina,
			theme: theme,
            altrows: true,
            showstatusbar: true,
            showaggregates: true,
			columns: columns_years_editable,
        });
        
          

});
        

    </script>
</head>

<body>
	<div id="jqxNotification">
        <div id="notificationContent"></div>
    </div>
    <div id="jqxgrid" class="table table-striped"></div>
</body>
</html>

years.json

[
	{
		"year":2000
	},
	{
		"year":2010
	},
	{	
		"year":2020
	},
	{
		"year":2030
	},
	{
		"year":2040
	},
	{
		"year":2050
	}
]

FEDSectors.json

[
    {
        "2000": 5,
        "2010": 0,
        "2020": 5,
        "2030": 0,
        "2040": 0,
        "2050": 22.09,
        "sector": "Industry"
    },
    {
        "2000": 5,
        "2010": 2,
        "2020": 5,
        "2030": 0,
        "2040": 8.11,
        "2050": 5.07,
        "sector": "Transport"
    },
    {
        "2000": 5,
        "2010": 0,
        "2020": 5,
        "2030": 0,
        "2040": 9.85,
        "2050": 0,
        "sector": "Households"
    },
    {
        "2000": 5,
        "2010": 0,
        "2020": 5,
        "2030": 0,
        "2040": 5.3,
        "2050": 0,
        "sector": "Comercial"
    },
    {
        "2000": 0,
        "2010": 0,
        "2020": 1,
        "2030": 0,
        "2040": 4,
        "2050": 0,
        "sector": "Agriculture"
    },
    {
        "2000": 0,
        "2010": 0,
        "2020": 0,
        "2030": 0,
        "2040": 2,
        "2050": 0,
        "sector": "Fishing"
    },
    {
        "2000": 0,
        "2010": 9.8,
        "2020": 5.4,
        "2030": 0,
        "2040": 2.1,
        "2050": 0,
        "sector": "Non-energy use"
    },
    {
        "2000": 0,
        "2010": 4,
        "2020": 5,
        "2030": 0,
        "2040": 2,
        "2050": 0,
        "sector": "Other"
    }
]