function ObjectCellRenderer() {
}
ObjectCellRenderer.prototype.init = function (params) {
this.span = document.createElement('span');
this.span.title=''
this.span.innerHTML='';
this.refresh(params)
};
ObjectCellRenderer.prototype.refresh = function(params) {
var res = ''
if(params.value) {
for(var i=0;i<params.fields.length;i++) {
res += params.fields[i].label + ': ';
res+=params.value[params.fields[i].name] + ' ';
}
}
this.span.innerHTML=res;
}
ObjectCellRenderer.prototype.getGui = function () {
return this.span;
};
function ObjectEditor() {
}
var onKeyDown = function(event) {
var key = event.which || event.keyCode;
if (key == 37 || // left
key == 39 || // right
key == 9 ) { // tab
event.stopPropagation();
}
}
ObjectEditor.prototype.init = function (params) {
this.container = document.createElement('div');
this.container.style = "border-radius: 15px; border: 1px solid grey;background: #e6e6e6;padding: 10px; ";
this.container.onkeydown = onKeyDown
for(i=0;i<params.fields.length;i++) {
var field = params.fields[i];
var label = document.createElement('label');
label.innerHTML = field.label+': ';
var input = document.createElement('input');
input.name = field.name;
if (params.value) {
input.value = params.value[field.name];
}
this.container.appendChild(label);
this.container.appendChild(input);
this.container.appendChild(document.createElement('br'));
}
var saveButton = document.createElement('button');
saveButton.appendChild(document.createTextNode('Ok'))
saveButton.addEventListener('click', function (event) {
params.stopEditing();
});
this.container.appendChild(saveButton);
};
ObjectEditor.prototype.getGui = function () {
return this.container;
};
ObjectEditor.prototype.afterGuiAttached = function () {
var inputs = this.container.getElementsByTagName('input');
inputs[0].focus();
};
ObjectEditor.prototype.getValue = function () {
var res = {};
var inputs = this.container.getElementsByTagName('input');
for(j=0;j<inputs.length;j++) {
res[inputs[j].name] = inputs[j].value.replace(/^\s+|\s+$/g, "");
}
return res;
};
ObjectEditor.prototype.destroy = function () {
};
ObjectEditor.prototype.isPopup = function () {
return true;
};
function MultiLineCellRenderer() {
}
MultiLineCellRenderer.prototype.init = function (params) {
this.span = document.createElement('span');
this.span.title=''
this.span.innerHTML='';
this.refresh(params);
}
MultiLineCellRenderer.prototype.refresh = function (params) {
if (params.value === "" || params.value === undefined || params.value === null) {
this.span.innerHTML = '0 items';
} else {
var res = ''
for(var i=0;i<params.value.length;i++) {
res += (i+1)+': ' + params.value[i]
res+='\n';
}
this.span.title = res;
this.span.innerHTML = params.value.length + ' item' + (params.value.length==1?"":"s");
}
};
MultiLineCellRenderer.prototype.getGui = function () {
return this.span;
};
function MultiLineEditor() {}
MultiLineEditor.prototype.onKeyDown = function (event) {
var key = event.which || event.keyCode;
if (key == 37 || // left
key == 39 || // right
key == 9 ) { // tab
event.stopPropagation();
}
};
MultiLineEditor.prototype.addLine = function(val) {
var li = document.createElement('li');
var span = document.createElement('span');
var removeButton = document.createElement('button');
removeButton.style='margin-left: 5px; text-align: right; '
removeButton.innerHTML = 'Remove'
span.innerHTML = val;
li.appendChild(span)
li.appendChild(removeButton)
this.ul.appendChild(li);
var that = this;
removeButton.addEventListener('click', function(event) {
that.ul.removeChild(this.parentElement);
});
}
MultiLineEditor.prototype.init = function (params) {
var that = this;
this.container = document.createElement('div');
this.container.style = "border-radius: 15px; border: 1px solid grey;background: #e6e6e6;padding: 10px;";
this.ul = document.createElement('ol');
if (params.value) {
for(i=0;i<params.value.length;i++) {
this.addLine(params.value[i]);
}
}
this.container.appendChild(this.ul);
this.input = document.createElement('input');
this.container.appendChild(this.input);
this.addButton = document.createElement('button');
this.addButton.innerHTML = 'Add';
this.addButton.addEventListener('click', function (event) {
var val = that.input.value;
if(!val || val==undefined || val=='') return;
that.addLine(val, that.ul);
that.input.value='';
});
this.container.appendChild(this.addButton);
this.saveButton = document.createElement('button');
this.saveButton.innerHTML = 'Ok';
this.saveButton.addEventListener('click', function (event) {
params.stopEditing();
});
this.container.appendChild(this.saveButton);
};
MultiLineEditor.prototype.getGui = function () {
return this.container;
};
MultiLineEditor.prototype.afterGuiAttached = function () {
var inputs = this.container.getElementsByTagName('input');
inputs[0].focus();
};
MultiLineEditor.prototype.getValue = function () {
var res = [];
for(var i=0;i<this.ul.children.length;i++) {
res.push(this.ul.children[i].children[0].innerHTML);
}
return res;
};
MultiLineEditor.prototype.destroy = function () {
};
MultiLineEditor.prototype.isPopup = function () {
return true;
};
var addressFields = [
{'name': 'address', 'label': 'Address' },
{'name': 'zip', 'label': 'ZIP' },
{'name': 'city', 'label': 'City' },
]
var columns = [
{
headerName: 'ID', field: 'id', width: 50, editable: true
}, {
headerName: 'Name', field: 'name', width: 100, editable: true
}, {
headerName: "Address", field: "address", width: 200, editable: true,
cellRenderer: ObjectCellRenderer,
cellEditor: ObjectEditor,
cellEditorParams: {
fields: addressFields
},
cellRendererParams: {
fields: addressFields
}
}, {
headerName: "Children", field: "children", width: 200, editable: true,
cellRenderer: MultiLineCellRenderer,
cellEditor: MultiLineEditor
}
];
var gridOptions = {
columnDefs: columns,
rowData: []
};
new agGrid.Grid(document.querySelector('#myGrid'), gridOptions);
document.querySelector('#addRow').addEventListener("click", function() {
gridOptions.api.addItems([{}]);
});
External resources loaded into this fiddle:
<button id='addRow' >Add row</button>
<div id="myGrid" style="height: 500px" class="ag-blue"></div>