Hi all,
Today I want to write a short article how to create a table with dynamic configuration for rows. For example, I need to render simple table by data provided from a server and append to each row some extendable buttons, checkboxes etc. for making action on a row. For example, I will use this data:
After defining actual data and simple meta information for the table, I create a factory which represents Table constructor. I will use it for creating new table instance.
As you can see the Table has a simple interface for getting rows and retrieving possible row actions.
Next step I create Row factory
I add state object for Row which will keep some boolean properties as "deleted" an "asDeleted". After creating Row, I'll inject it into Table
For adding buttons to the row, I create a plain object which describes the action. Thia object must have at least one property named 'html' which returns content for compiling. Also, this object could be extended by extra properties: 'handlers' and 'scope', The first contains methods for the element, another can extend the scope. See code below:
Implement `addRowActions` method and simply add these actions to the table.
At the end, I show html for all this stuff
You can see working example at Plunker: Plunker
Thanks for reading, have a nice day.
Today I want to write a short article how to create a table with dynamic configuration for rows. For example, I need to render simple table by data provided from a server and append to each row some extendable buttons, checkboxes etc. for making action on a row. For example, I will use this data:
app.controller('MainCtrl', ['$scope', function($scope) {
var vm = this;
var tableData = [{
firstName: 'Viktor',
lastName: 'Dzundza',
age: 25
}, {
firstName: 'Jony',
lastName: 'Boyko',
age: 24
}, {
firstName: 'John',
lastName: 'Doe',
age: 45
},
{
firstName: 'Alisa',
lastName: 'Doe',
age: 2
}
];
var tableMeta = {
columns: [{
name: 'firstName',
title: 'First Name'
}, {
name: 'lastName',
title: 'Last Name'
}, {
name: 'age',
title: 'Age'
}]
};
}]);After defining actual data and simple meta information for the table, I create a factory which represents Table constructor. I will use it for creating new table instance.
app.factory('Table', [function() {
function TableConstructor(data, tableMeta) {
this.rowActions = [];
this.tableMeta = tableMeta;
this.rows = [];
}
TableConstructor.prototype.getColumns = function() {
return this.tableMeta.columns;
};
TableConstructor.prototype.getRows = function() {
return this.rows;
};
TableConstructor.prototype.getRowActions = function() {
return this.rowActions;
};
TableConstructor.prototype.addRowActions = function(actions) {
};
return TableConstructor;
}]);
As you can see the Table has a simple interface for getting rows and retrieving possible row actions.
Next step I create Row factory
app.factory('Row', function() {
function Row(data, id) {
this.id = id;
this.state = {};
this.data = data;
}
Row.prototype.toggleAsDeleted = function() {
this.state.asDeleted = !this.state.asDeleted;
};
Row.prototype.deleteRow = function() {
this.state.deleted = true;
};
Row.prototype.isDeletedMark = function() {
return this.state.asDeleted;
};
Row.prototype.isDeleted = function() {
return this.state.deleted;
};
return Row;
});
I add state object for Row which will keep some boolean properties as "deleted" an "asDeleted". After creating Row, I'll inject it into Table
this.rows = data.map(function(rowData, idx) {
return new Row(rowData, idx + 1); //actually id should be provided from server
});
For adding buttons to the row, I create a plain object which describes the action. Thia object must have at least one property named 'html' which returns content for compiling. Also, this object could be extended by extra properties: 'handlers' and 'scope', The first contains methods for the element, another can extend the scope. See code below:
var deleteRow = {
html: function() {
return '';
}
};
var markAsDeleted = {
html: function() {
return '';
}
};
Implement `addRowActions` method and simply add these actions to the table.
TableConstructor.prototype.addRowActions = function(actions) {
actions.forEach((function(a) {
this.rowActions.push(a)
}).bind(this));
};
vm.table.addRowActions([deleteRow, markAsDeleted]);
At the end, I show html for all this stuff
| Index | |
|---|---|
| {{row.id}} | {{v}} |
You can see working example at Plunker: Plunker
Thanks for reading, have a nice day.
Comments