ag-grid
Version:
Advanced Javascript Datagrid. Supports raw Javascript, AngularJS 1.x, AngularJS 2.0 and Web Components
116 lines (91 loc) • 4.54 kB
JavaScript
var module = angular.module("example", ["agGrid"]);
module.controller("exampleCtrl", function($scope, $timeout) {
var columnDefs = [
{headerName: "Default String", field: "defaultString", width: 150, editable: true},
{headerName: "Upper Case Only", field: "upperCaseOnly", width: 150, editable: true, newValueHandler: upperCaseNewValueHandler},
{headerName: "Number", valueGetter: 'data.number', width: 150, editable: true, newValueHandler: numberNewValueHandler},
{headerName: "Custom With Angular", field: "setAngular", width: 175, cellRenderer: customEditorUsingAngular},
{headerName: "Custom No Angular", field: "setNoAngular", width: 175, cellRenderer: customEditorNoAngular}
];
var data = [
{defaultString: 'Apple', upperCaseOnly: 'APPLE', number: 11, setAngular: 'AAA', setNoAngular: 'AAA'},
{defaultString: 'Orange', upperCaseOnly: 'ORANGE', number: 22, setAngular: 'BBB', setNoAngular: 'BBB'},
{defaultString: 'Banana', upperCaseOnly: 'BANANA', number: 33, setAngular: 'CCC', setNoAngular: 'CCC'},
{defaultString: 'Pear', upperCaseOnly: 'PEAR', number: 44, setAngular: 'DDD', setNoAngular: 'DDD'}
];
var setSelectionOptions = ['AAA','BBB','CCC','DDD','EEE','FFF','GGG'];
$scope.gridOptions = {
columnDefs: columnDefs,
rowData: data,
angularCompileRows: true
};
function upperCaseNewValueHandler(params) {
params.data[params.colDef.field] = params.newValue.toUpperCase();
}
function numberNewValueHandler(params) {
var valueAsNumber = parseInt(params.newValue);
if (isNaN(valueAsNumber)) {
window.alert("Invalid value " + params.newValue + ", must be a number");
} else {
params.data.number = valueAsNumber;
}
}
function customEditorUsingAngular(params) {
params.$scope.setSelectionOptions = setSelectionOptions;
var html = '<span ng-show="!editing" ng-click="startEditing()">{{data.'+params.colDef.field+'}}</span> ' +
'<select ng-blur="editing=false" ng-change="editing=false" ng-show="editing" ng-options="item for item in setSelectionOptions" ng-model="data.'+params.colDef.field+'">';
// we could return the html as a string, however we want to add a 'onfocus' listener, which is no possible in AngularJS
var domElement = document.createElement("span");
domElement.innerHTML = html;
params.$scope.startEditing = function() {
params.$scope.editing = true; // set to true, to show dropdown
// put this into $timeout, so it happens AFTER the digest cycle,
// otherwise the item we are trying to focus is not visible
$timeout(function () {
var select = domElement.querySelector('select');
select.focus();
}, 0);
};
return domElement;
}
function customEditorNoAngular(params) {
var editing = false;
var eCell = document.createElement('span');
var eLabel = document.createTextNode(params.value);
eCell.appendChild(eLabel);
var eSelect = document.createElement("select");
setSelectionOptions.forEach(function(item) {
var eOption = document.createElement("option");
eOption.setAttribute("value", item);
eOption.innerHTML = item;
eSelect.appendChild(eOption);
});
eSelect.value = params.value;
eCell.addEventListener('click', function () {
if (!editing) {
eCell.removeChild(eLabel);
eCell.appendChild(eSelect);
eSelect.focus();
editing = true;
}
});
eSelect.addEventListener('blur', function () {
if (editing) {
editing = false;
eCell.removeChild(eSelect);
eCell.appendChild(eLabel);
}
});
eSelect.addEventListener('change', function () {
if (editing) {
editing = false;
var newValue = eSelect.value;
params.data[params.colDef.field] = newValue;
eLabel.nodeValue = newValue;
eCell.removeChild(eSelect);
eCell.appendChild(eLabel);
}
});
return eCell;
}
});