Skip to content

Commit

Permalink
Updated timeseries model to use new APIs and got rid of synchronous a…
Browse files Browse the repository at this point in the history
…jax calls. Closes #537
  • Loading branch information
alexsielicki committed Nov 19, 2015
1 parent 37a8c42 commit 83f2f60
Showing 1 changed file with 168 additions and 103 deletions.
271 changes: 168 additions & 103 deletions web-server/plugins/slycat-timeseries-model/js/timeseries-table.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,117 +158,187 @@ define("slycat-timeseries-table", ["d3"], function(d3)
self.options.waveform_indexes = waveform_indexes;
self.options.row_count = table_filter.length;

self.data = new self._data_provider({
server_root : self.options["server-root"],
mid : self.options.mid,
aid : self.options.aid,
metadata : self.options.metadata,
sort_column : self.options["sort-variable"],
sort_order : self.options["sort-order"],
table_filter : self.options.table_filter,
row_count : self.options.row_count,
});
function initialize_grid(indices){

if(self.grid) {
self.grid.setData(self.data);
self.data.setGrid(self.grid);
self.grid.invalidate();
if(self.options["row-selection"].length > 0){
var selectedRows = self.data.getSimulationRowIndexes(self.options["row-selection"]);
self.trigger_row_selection = false;
self.grid.setSelectedRows(selectedRows);
self.grid.resetActiveCell();
if(selectedRows.length)
self.grid.scrollRowToTop(Math.min.apply(Math, selectedRows));
}
}
else {
self.trigger_row_selection = true;
self.grid = new Slick.Grid(self.element, self.data, self.columns, {explicitInitialization : true, enableColumnReorder : false});
self.data.setGrid(self.grid);
var sorted_table_filter = undefined;
var retrieve_table_filter = undefined;

var header_buttons = new Slick.Plugins.HeaderButtons();
header_buttons.onCommand.subscribe(function(e, args)
if(indices !== undefined)
{
var column = args.column;
var button = args.button;
var command = args.command;
var grid = args.grid;

for(var i in self.columns)
var sorted_rows = [];
// Reverse response indexes for descending sort order
if(self.options["sort-order"] == 'descending')
{
self.columns[i].header.buttons[0].cssClass = "icon-sort-off";
self.columns[i].header.buttons[0].tooltip = "Sort ascending";
self.columns[i].header.buttons[0].command = "sort-ascending";
grid.updateColumnHeader(self.columns[i].id);
var plain_array = [];
for(var i=0; i<indices.length; i++)
{
plain_array.push(indices[i]);
}
indices = plain_array.reverse();
}

if(command == "sort-ascending")
var response = [];
for(var i = 0; i < self.options.table_filter.length; i++)
{
button.cssClass = 'icon-sort-ascending';
button.command = 'sort-descending';
button.tooltip = 'Sort descending';
set_sort(column.id, "ascending");
response.push( indices.indexOf(self.options.table_filter[i]) );
}
else if(command == "sort-descending")
{
button.cssClass = 'icon-sort-descending';
button.command = 'sort-ascending';
button.tooltip = 'Sort ascending';
set_sort(column.id, "descending");
sorted_rows = new Int32Array(response);

if(sorted_rows.length > 1)
sorted_table_filter = Array.apply( [], sorted_rows );
else
sorted_table_filter = [sorted_rows[0]];
retrieve_table_filter = sorted_table_filter.slice(0).sort(function (a, b) { return a - b });
}

self.data = new self._data_provider({
server_root : self.options["server-root"],
mid : self.options.mid,
aid : self.options.aid,
metadata : self.options.metadata,
sort_column : self.options["sort-variable"],
sort_order : self.options["sort-order"],
table_filter : self.options.table_filter,
row_count : self.options.row_count,
sorted_table_filter : sorted_table_filter,
retrieve_table_filter : retrieve_table_filter
});

if(self.grid) {
self.grid.setData(self.data);
self.data.setGrid(self.grid);
self.grid.invalidate();
if(self.options["row-selection"].length > 0){
var selectedRows = self.data.getSimulationRowIndexes(self.options["row-selection"]);
self.trigger_row_selection = false;
self.grid.setSelectedRows(selectedRows);
self.grid.resetActiveCell();
if(selectedRows.length)
self.grid.scrollRowToTop(Math.min.apply(Math, selectedRows));
}
});
}
else {
self.trigger_row_selection = true;
self.grid = new Slick.Grid(self.element, self.data, self.columns, {explicitInitialization : true, enableColumnReorder : false});
self.data.setGrid(self.grid);

self.grid.registerPlugin(header_buttons);
self.grid.registerPlugin(new Slick.AutoTooltips({enableForHeaderCells:true}));
var header_buttons = new Slick.Plugins.HeaderButtons();
header_buttons.onCommand.subscribe(function(e, args)
{
var column = args.column;
var button = args.button;
var command = args.command;
var grid = args.grid;

self.grid.setSelectionModel(new Slick.RowSelectionModel());
for(var i in self.columns)
{
self.columns[i].header.buttons[0].cssClass = "icon-sort-off";
self.columns[i].header.buttons[0].tooltip = "Sort ascending";
self.columns[i].header.buttons[0].command = "sort-ascending";
grid.updateColumnHeader(self.columns[i].id);
}

self.grid.onSelectedRowsChanged.subscribe(function(e, selection)
{
// Don't trigger a selection event unless the selection was changed by user interaction (i.e. not outside callers or changing the sort order).
if(self.trigger_row_selection)
if(command == "sort-ascending")
{
button.cssClass = 'icon-sort-ascending';
button.command = 'sort-descending';
button.tooltip = 'Sort descending';
set_sort(column.id, "ascending");
}
else if(command == "sort-descending")
{
button.cssClass = 'icon-sort-descending';
button.command = 'sort-ascending';
button.tooltip = 'Sort ascending';
set_sort(column.id, "descending");
}
});

self.grid.registerPlugin(header_buttons);
self.grid.registerPlugin(new Slick.AutoTooltips({enableForHeaderCells:true}));

self.grid.setSelectionModel(new Slick.RowSelectionModel());

self.grid.onSelectedRowsChanged.subscribe(function(e, selection)
{
var waveform_indexes=[];
for(var i=0; i<selection.rows.length; i++){
waveform_indexes.push( self.grid.getDataItem(selection.rows[i])[self.options.metadata["column-count"]-1] );
// Don't trigger a selection event unless the selection was changed by user interaction (i.e. not outside callers or changing the sort order).
if(self.trigger_row_selection)
{
var waveform_indexes=[];
for(var i=0; i<selection.rows.length; i++){
waveform_indexes.push( self.grid.getDataItem(selection.rows[i])[self.options.metadata["column-count"]-1] );
}
self.options["row-selection"] = waveform_indexes;
self.element.trigger("row-selection-changed", [waveform_indexes]);
}
self.options["row-selection"] = waveform_indexes;
self.element.trigger("row-selection-changed", [waveform_indexes]);
}
self.trigger_row_selection = true;
});
self.trigger_row_selection = true;
});

self.grid.onHeaderClick.subscribe(function (e, args)
{
if(!self._array_equal([args.column.field], self.options["variable-selection"]))
self.grid.onHeaderClick.subscribe(function (e, args)
{
self.options["variable-selection"] = [args.column.field];
self._color_variables(self.options["variable-selection"]);
self.element.trigger("variable-selection-changed", { variable:self.options["variable-selection"], colormap:args.column.colormap, });
}
});
if(!self._array_equal([args.column.field], self.options["variable-selection"]))
{
self.options["variable-selection"] = [args.column.field];
self._color_variables(self.options["variable-selection"]);
self.element.trigger("variable-selection-changed", { variable:self.options["variable-selection"], colormap:args.column.colormap, });
}
});

self._color_variables(self.options["variable-selection"]);
self._color_variables(self.options["variable-selection"]);

self.grid.init();
self.grid.init();

if(self.options["row-selection"].length > 0){
var selectedRows = self.data.getSimulationRowIndexes(self.options["row-selection"]);
self.trigger_row_selection = false;
self.grid.setSelectedRows(selectedRows);
self.grid.resetActiveCell();
if(selectedRows.length)
self.grid.scrollRowToTop(Math.min.apply(Math, selectedRows));
if(self.options["row-selection"].length > 0){
var selectedRows = self.data.getSimulationRowIndexes(self.options["row-selection"]);
self.trigger_row_selection = false;
self.grid.setSelectedRows(selectedRows);
self.grid.resetActiveCell();
if(selectedRows.length)
self.grid.scrollRowToTop(Math.min.apply(Math, selectedRows));
}
}

self.data.onDataLoaded.subscribe(function (e, args) {
for (var i = args.from; i <= args.to; i++) {
self.grid.invalidateRow(i);
}
self.grid.render();
});
}

self.data.onDataLoaded.subscribe(function (e, args) {
for (var i = args.from; i <= args.to; i++) {
self.grid.invalidateRow(i);
if(self.options["sort-variable"] !== null && self.options["sort-order"] !== null && self.options.table_filter.length > 0) {
// Need to retrieve the sorted_table_filter first because everything else relies on it.

if( self.options["sort-variable"] == self.options.metadata["column-count"]-1 )
{
// we are sorting by the index column, so we can just make the data we need.
initialize_grid( new Int32Array( d3.range(self.options.metadata["row-count"]) ) );
}
self.grid.render();
});
else
{
var request = new XMLHttpRequest();
request.open("GET", self.options["server-root"] + "models/" + self.options.mid + "/arraysets/" + self.options.aid + "/data?hyperchunks=0/rank(a" + self.options["sort-variable"] + ',"asc")/...&byteorder=' + (is_little_endian() ? "little" : "big") );
request.responseType = "arraybuffer";
request.onload = function(e)
{
var indices = [];
var data = new Int32Array(this.response);
// Filtering out every other element in the reponse array, because it's full of extraneous 0 (zeros) for some reason.
// Need to figure out why, but this is a fix for now.
for(var i=0; i<data.length; i=i+2)
{
indices.push(data[i]);
}
indices = new Int32Array(indices);

initialize_grid(indices);
}
request.send();
}
}
else
{
initialize_grid();
}

}
else if(key == "sort-variable")
Expand Down Expand Up @@ -333,8 +403,14 @@ define("slycat-timeseries-table", ["d3"], function(d3)
self.sort_column = parameters.sort_column;
self.sort_order = parameters.sort_order;
self.table_filter = parameters.table_filter;
self.sorted_table_filter = parameters.table_filter;
self.retrieve_table_filter = parameters.table_filter;
if(parameters.sorted_table_filter == undefined)
self.sorted_table_filter = parameters.table_filter;
else
self.sorted_table_filter = parameters.sorted_table_filter;
if(parameters.retrieve_table_filter == undefined)
self.retrieve_table_filter = parameters.table_filter;
else
self.retrieve_table_filter = parameters.retrieve_table_filter;
self.row_count = parameters.row_count;
self.ranked_indices = {};

Expand Down Expand Up @@ -489,18 +565,6 @@ define("slycat-timeseries-table", ["d3"], function(d3)
}
}

if(self.sort_column !== null && self.sort_order !== null) {
// Need to retrieve the sorted_table_filter synchronously because everything else relies on it.
self.get_indices("sorted", self.table_filter, function(sorted_rows){
if(sorted_rows.length > 1)
self.sorted_table_filter = Array.apply( [], sorted_rows );
else
self.sorted_table_filter = [sorted_rows[0]];
self.retrieve_table_filter = self.sorted_table_filter.slice(0).sort(function (a, b) { return a - b });
self.pages = {};
});
}

self.setGrid = function(grid)
{
self.grid = grid;
Expand Down Expand Up @@ -671,6 +735,7 @@ define("slycat-timeseries-table", ["d3"], function(d3)
}
return result;
}

},

_array_equal: function(a, b)
Expand Down

0 comments on commit 83f2f60

Please sign in to comment.