I was wondering if there is any known way to efficiently add a "Reorder" feature to my datatables in dc.js. It would be great if my users, after having done their selection with the charts, could decide according to which column the filtered rows should be ordered (by clicking on the column header for example).
Any ideas where to start?
Thanks a lot
To reorder data. table columns, the idiomatic way is to use setcolorder(x, neworder) , instead of doing x <- x[, neworder, with=FALSE] . This is because the latter makes an entire copy of the data.
The existing answers are using legacy DataTables syntax. Versions 1.10+ should use the following syntax: $('table'). dataTable({ "pageLength": -1, //display all records "order": [[ 0, "desc" ]] // Sort by first column descending });
Using the order initialisation parameter, you can set the table to display the data in exactly the order that you want. The order parameter is an array of arrays where the first value of the inner array is the column to order on, and the second is 'asc' (ascending ordering) or 'desc' (descending ordering) as required.
To sort a data frame in R, use the order( ) function. By default, sorting is ASCENDING. Prepend the sorting variable by a minus sign to indicate DESCENDING order.
Here is another table sorting method that only uses standard jQuery and dc.js
Define your table html with column headers.
<table id="data-table">
<thead>
<th class="data-table-col" data-col="a">Field A</th>
<th class="data-table-col" data-col="b">Field B</th>
<th class="data-table-col" data-col="c">Field C</th>
</thead>
</table>
Setup the DC.js dataTable. The only important thing is the columns configuration. Use the format that does not dynamically create headers
var dataDim = xf.dimension(function(d) {return d.a;});
var dataTable = dc.dataTable("#data-table")
.columns([
function(d) {
return d.a;
},
function(d) {
return d.b;
},
function(d) {
return d.c;
}
]);
Then, just attach a click event handler to the column headers and use DC.js to sort the table. Edit - you must also change the dimension so that the sortBy sorts all data, not just displayed data
$('#data-table').on('click', '.data-table-col', function() {
var column = $(this).attr("data-col");
dataDim.dispose();
dataDim = xf.dimension(function(d) {return d[column];});
dataTable.dimension(dataDim)
dataTable.sortBy(function(d) {
return d[column];
});
dataTable.redraw();
});
I like to use JQuery datatables for this: http://datatables.net/
First add the table and the header row:
<table id="dc-data-table" class="list table table-striped table-bordered">
<thead>
<tr>
<th>Country</th>
<th>Users</th>
</tr>
</thead>
</table>
Next build your dimensions like normal:
var ndx = crossfilter(data),
countryDimension = ndx.dimension(function (d) {
return d.country;
}),
Then bind the jquery data table:
var datatable = $("#dc-data-table").dataTable({
"bPaginate": false,
"bLengthChange": false,
"bFilter": false,
"bSort": true,
"bInfo": false,
"bAutoWidth": false,
"bDeferRender": true,
"aaData": countryDimension.top(Infinity),
"bDestroy": true,
"aoColumns": [
{ "mData": "country", "sDefaultContent": ""},
{ "mData": "users", "sDefaultContent": " " }
]
});
Finally, hook it into dc.js if you want the table to reflect the filters of your other charts:
function RefreshTable() {
dc.events.trigger(function () {
alldata = countryDimension.top(Infinity);
datatable.fnClearTable();
datatable.fnAddData(alldata);
datatable.fnDraw();
});
}
for (var i = 0; i < dc.chartRegistry.list().length; i++) {
var chartI = dc.chartRegistry.list()[i];
chartI.on("filtered", RefreshTable);
}
Here is a jsFiddle that demonstrates this: http://jsfiddle.net/djmartin_umich/d55My/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With