From 2ab15561a83a6b5ed81ca61e67831727bd453ea6 Mon Sep 17 00:00:00 2001 From: Norbert Renner Date: Thu, 4 Sep 2014 19:55:55 +0200 Subject: [PATCH] configure columns, hide empty columns + destroy because of slow hiding --- js/control/TrackMessages.js | 92 ++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/js/control/TrackMessages.js b/js/control/TrackMessages.js index 4d6f2ca..d6fc2ce 100644 --- a/js/control/TrackMessages.js +++ b/js/control/TrackMessages.js @@ -1,27 +1,44 @@ BR.TrackMessages = L.Class.extend({ + + columnOptions: { + 'Longitude': { visible: false }, + 'Latitude': { visible: false }, + 'Elevation': { title: 'elev.', className: 'dt-body-right' }, + 'Distance': { title: 'dist.', className: 'dt-body-right' }, + 'CostPerKm': { title: 'cost/km', className: 'dt-body-right' }, + 'ElevCost': { title: 'elevcost', className: 'dt-body-right' }, + 'TurnCost': { title: 'turncost', className: 'dt-body-right' } + }, + initialize: function () { + var table = document.getElementById('datatable'); + this.tableClassName = table.className; + this.tableParent = table.parentElement; }, update: function (polyline, segments) { var i, messages, data = [], - columns; - - if (!segments || segments.length === 0) - return; + columns, + headings, + table; for (i = 0; segments && i < segments.length; i++) { messages = segments[i].feature.properties.messages; - - if (i === 0) { - columns = this._getColumns(messages[0]); - } - data = data.concat(messages.slice(1)); } - $('#datatable').DataTable({ + this._destroyTable(); + + if (data.length === 0) + return; + + headings = messages[0]; + columns = this._getColumns(headings, data); + + console.time('datatable'); + table = $('#datatable').DataTable({ destroy: true, data: data, columns: columns, @@ -34,17 +51,58 @@ BR.TrackMessages = L.Class.extend({ order: [] }); + console.timeEnd('datatable'); }, - - _getColumns: function(headings) { - var columns = []; + + _destroyTable: function() { + var ele; + + if ($.fn.DataTable.isDataTable('#datatable') ) { + // destroy option too slow on update, really remove elements with destroy method + $('#datatable').DataTable().destroy(true); + + // recreate original table element, destroy removes all + ele = document.createElement('table'); + ele.id = 'datatable'; + ele.className = this.tableClassName; + this.tableParent.appendChild(ele); + } + + return ele || document.getElementById('datatable'); + }, + + _getColumns: function(headings, data) { + var columns = [], + defaultOptions, + options, + emptyColumns = this._getEmptyColumns(data); + for (k = 0; k < headings.length; k++) { - // http://datatables.net/reference/option/#Columns - columns.push({ - title: headings[k] - }); + defaultOptions = { + title: headings[k], + visible: !emptyColumns[k] + }; + options = L.extend(defaultOptions, this.columnOptions[headings[k]]); + columns.push(options); } return columns; + }, + + _getEmptyColumns: function(data) { + var empty = new Array(data[0].length), + i; + + for (i = 0; i < empty.length; i++) { + empty[i] = true; + } + + data.forEach(function(row) { + row.forEach(function(val, i) { + empty[i] = empty[i] && !val; + }); + }); + + return empty; } });