google.charts.load('current', {
packages: ['corechart', 'table']
}).then(function () {
var data = google.visualization.arrayToDataTable([
['Name', 'RoolNumber', 'Gender', 'Age', 'Donuts eaten'],
['Michael', 1, 'Male', 12, 5],
['Elisa', 2, 'Female', 20, 7],
['Robert', 3, 'Male', 7, 3],
['John', 4, 'Male', 54, 2],
['Jessica', 5, 'Female', 22, 6],
['Aaron', 6, 'Male', 3, 1],
['Margareth', 7, 'Female', 42, 8],
['Miranda', 8, 'Female', 33, 6]
]);
var table = new google.visualization.Table(document.getElementById('table'));
var options = {
sort: 'event'
};
// table sort event
google.visualization.events.addListener(table, 'sort', function (sender) {
// get sorted rows indexes
var sortIndexes = data.getSortedRows({column: sender.column, desc: !sender.ascending});
// move values to top
moveToTop(sender, sortIndexes, 'Elisa');
moveToTop(sender, sortIndexes, 'Michael');
// set table sort arrow
options.sortAscending = sender.ascending;
options.sortColumn = sender.column;
// build table view with custom sort
var view = new google.visualization.DataView(data);
view.setRows(sortIndexes);
// draw table with view
table.draw(view, options);
});
// move value to top of sort
function moveToTop(sender, sortIndexes, value) {
// find value in current sort
var fixedRows = data.getFilteredRows([{
column: 0,
value: value
}]);
if (fixedRows.length > 0) {
// move value to top
sortIndexes.splice(sortIndexes.indexOf(fixedRows[0]), 1);
sortIndexes.unshift(fixedRows[0]);
}
}
// first draw
table.draw(data, options);
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="table"></div>