Skip to content

Commit

Permalink
Merge branch 'template_vistype' into vis-options
Browse files Browse the repository at this point in the history
  • Loading branch information
w33ble committed Nov 5, 2014
2 parents 9020702 + 920e366 commit 3454842
Show file tree
Hide file tree
Showing 69 changed files with 2,469 additions and 999 deletions.
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,10 @@ script:
notifications:
email:
- rashid.khan@elasticsearch.com
- spencer.alger@elasticsearch.com
hipchat:
rooms:
secure: a2FERvICecrUAR62vP4vrUCTG3haRzf6kSzDDzGu6SICEXWLRrK0xeNQDpdwDAfzFmaIJ6txpkmInvEFeNPYNngTgEDyfhqdIa/lW0Ermdg+1hL0dK6QJiVmT1V6LDB2mgtaTTmfontxJqq7P2tmr0zz8ny4Eqq3lUnwPxYFNNo=
secure: AFhp0iboaeshokQnzRvoKPElb/JOvZ09X9mi58KbxI4iYlQ1nysvudV1b7YG8wxV9av3twgvfbcgzAoHyKhC2MZJDLzDHnZFn8r2OQXzjYpFxJuhAVirO4Weo0wi2Z78/OkxQo87gWYFa24qc8urR/Dfor4WdoWfCsJU8tQ7t5I=
format: html
on_success: change
template:
Expand Down
9 changes: 9 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
source "https://rubygems.org"

gem 'sinatra', :require => 'sinatra/base'
gem 'sinatra-contrib'
gem 'puma'
gem 'warbler'
gem 'elasticsearch'
gem 'rack-reverse-proxy', :require => 'rack/reverse_proxy'
gem 'colorize'
59 changes: 59 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
GEM
remote: https://rubygems.org/
specs:
backports (3.6.0)
colorize (0.7.3)
elasticsearch (1.0.4)
elasticsearch-api (= 1.0.4)
elasticsearch-transport (= 1.0.4)
elasticsearch-api (1.0.4)
multi_json
elasticsearch-transport (1.0.4)
faraday
multi_json
faraday (0.9.0)
multipart-post (>= 1.2, < 3)
jruby-jars (1.7.13)
jruby-rack (1.1.16)
multi_json (1.10.1)
multipart-post (2.0.0)
puma (2.9.0)
rack (>= 1.1, < 2.0)
rack (1.5.2)
rack-protection (1.5.3)
rack
rack-reverse-proxy (0.4.4)
rack (>= 1.0.0)
rack-test (0.6.2)
rack (>= 1.0)
rake (10.1.0)
rubyzip (1.1.6)
sinatra (1.4.5)
rack (~> 1.4)
rack-protection (~> 1.4)
tilt (~> 1.3, >= 1.3.4)
sinatra-contrib (1.4.2)
backports (>= 2.0)
multi_json
rack-protection
rack-test
sinatra (~> 1.4.0)
tilt (~> 1.3)
tilt (1.4.1)
warbler (1.4.4)
jruby-jars (>= 1.5.6, < 2.0)
jruby-rack (>= 1.0.0)
rake (>= 0.9.6)
rubyzip (>= 0.9, < 1.2)

PLATFORMS
ruby

DEPENDENCIES
colorize
elasticsearch
puma
rack-reverse-proxy
sinatra
sinatra-contrib
warbler
3 changes: 2 additions & 1 deletion src/kibana/components/agg_response/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ define(function (require) {
return function NormalizeChartDataFactory(Private) {
return {
flat: Private(require('components/agg_response/flat')),
hierarchical: Private(require('components/agg_response/hierarchical/build_hierarchical_data'))
hierarchical: Private(require('components/agg_response/hierarchical/build_hierarchical_data')),
tabify: Private(require('components/agg_response/tabify/tabify'))
};
};
});
16 changes: 13 additions & 3 deletions src/kibana/components/agg_response/tabify/_buckets.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,25 @@ define(function (require) {
function Buckets(aggResp) {
aggResp = aggResp || false;
this.buckets = aggResp.buckets || [];
this.length = this.buckets.length;
this.objectMode = _.isPlainObject(this.buckets);

if (this.objectMode) {
this._keys = _.keys(this.buckets);
this.length = this._keys.length;
} else {
this.length = this.buckets.length;
}
}

Buckets.prototype.forEach = function (fn) {
var buckets = this.buckets;

if (this.objectMode) {
_.forOwn(this.buckets, fn);
this._keys.forEach(function (key) {
fn(buckets[key], key);
});
} else {
this.buckets.forEach(function (bucket) {
buckets.forEach(function (bucket) {
fn(bucket, bucket.key);
});
}
Expand Down
37 changes: 30 additions & 7 deletions src/kibana/components/agg_response/tabify/_response_writer.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ define(function (require) {
* @param {any} key - the bucketKey that this table relates to
* @return {Table/TableGroup} table - the created table
*/
TabbedAggResponseWriter.prototype.table = function (group, agg, key) {
TabbedAggResponseWriter.prototype._table = function (group, agg, key) {
var Class = (group) ? TableGroup : Table;
var table = new Class();

if (group) {
table.aggConfig = agg;
table.key = key;
table.title = agg.makeLabel() + ': ' + key;
table.title = agg.makeLabel() + ': ' + (table.fieldFormat()(key));
}

var parent = this.splitStack[0];
Expand Down Expand Up @@ -68,15 +68,13 @@ define(function (require) {
throw new Error('attempted to split when splitting is disabled');
}

_.pull(self.columns, _.find(self.columns, function (col) {
return col.aggConfig === agg;
}));
self._removeAggFromColumns(agg);

buckets.forEach(function (bucket, key) {
// find the existing split that we should extend
var TableGroup = _.find(self.splitStack[0].tables, { aggConfig: agg, key: key });
// create the split if it doesn't exist yet
if (!TableGroup) TableGroup = self.table(true, agg, key);
if (!TableGroup) TableGroup = self._table(true, agg, key);

// push the split onto the stack so that it will receive written tables
self.splitStack.unshift(TableGroup);
Expand All @@ -87,6 +85,28 @@ define(function (require) {
});
};

TabbedAggResponseWriter.prototype._removeAggFromColumns = function (agg) {
var i = _.findIndex(this.columns, function (col) {
return col.aggConfig === agg;
});

// we must have already removed this column
if (i === -1) return;

this.columns.splice(i, 1);

if (!this.vis.isHierarchical()) return;

// hierarchical vis creats additional columns for each bucket
// we will remove those too
var mCol = this.columns.splice(i, 1).pop();
var mI = _.findIndex(this.aggStack, function (agg) {
return agg === mCol.aggConfig;
});

if (mI > -1) this.aggStack.splice(mI, 1);
};

/**
* Push a value into the row, then run a block. Once the block is
* complete the value is pulled from the stack.
Expand Down Expand Up @@ -119,10 +139,11 @@ define(function (require) {
}

var split = this.splitStack[0];
var table = split.tables[0] || this.table(false);
var table = split.tables[0] || this._table(false);

while (cells.length < this.columns.length) cells.push('');
table.rows.push(cells);
return table;
};

/**
Expand All @@ -147,6 +168,8 @@ define(function (require) {
if (this.canSplit) return this.root;

var table = this.root.tables[0];
if (!table) return;

delete table.$parent;
return table;
};
Expand Down
11 changes: 11 additions & 0 deletions src/kibana/components/agg_response/tabify/_table_group.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
define(function (require) {
return function TableGroupProvider() {
var _ = require('lodash');

/**
* Simple object that wraps multiple tables. It contains information about the aggConfig
* and bucket that created this group and a list of the tables within it.
Expand All @@ -11,6 +13,15 @@ define(function (require) {
this.tables = [];
}

TableGroup.prototype.field = function () {
return this.aggConfig && this.aggConfig.params && this.aggConfig.params.field;
};

TableGroup.prototype.fieldFormat = function () {
var field = this.field();
return field ? field.format.convert : _.identity;
};

return TableGroup;
};
});
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ define(function (require) {
}
break;
case 'metrics':
write.cell(aggResp ? metricValue(aggResp) : bucketCount(bucket), function () {
var value = (agg.type.name === 'count') ? bucketCount(bucket) : metricValue(aggResp);
write.cell(value, function () {
if (!write.aggStack.length) {
// row complete
write.row();
Expand Down
6 changes: 3 additions & 3 deletions src/kibana/components/agg_table/agg_table.html
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<paginate
ng-if="!group"
ng-if="formattedRows.length"

list="formattedRows"
per-page="aggTable.getPerPage()"
per-page-prop="perPage"

class="agg-table">
<div class="agg-table-paginated">
Expand All @@ -25,7 +25,7 @@
</th>
</tr>
</thead>
<tbody kbn-rows="page" kbn-rows-min="aggTable.getPerPage()"></tbody>
<tbody kbn-rows="page" kbn-rows-min="perPage"></tbody>
</table>
</div>

Expand Down
34 changes: 16 additions & 18 deletions src/kibana/components/agg_table/agg_table.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ define(function (require) {
var _ = require('lodash');
var saveAs = require('file_saver');

var tabifyAggResponse = Private(require('components/agg_response/tabify/tabify_agg_response'));
var tabifyAggResponse = Private(require('components/agg_response/tabify/tabify'));
var orderBy = $filter('orderBy');

return {
Expand All @@ -29,15 +29,10 @@ define(function (require) {

self.sort = null;
self.csv = {
showOptions: false,
separator: config.get('csv:separator'),
quoteValues: config.get('csv:quoteValues')
};

self.getPerPage = function () {
return $scope.perPage || Infinity;
};

self.getColumnClass = function (col, $first, $last) {
var cls = [];
var agg = $scope.table.aggConfig(col);
Expand All @@ -62,33 +57,35 @@ define(function (require) {
} else if (self.sort.asc) {
self.sort.asc = false;
} else {
delete self.sort;
self.sort = null;
}

if (self.sort && !self.sort.getter) {
var colI = $scope.table.columns.indexOf(self.sort.col);
self.sort.getter = function (row) {
return row[colI];
};
if (colI === -1) delete self.sort;
if (colI === -1) self.sort = null;
}
};

self.exportAsCsv = function () {
self.csv.showOptions = false;
saveAs(new Blob(self.toCsv(), { type: 'text/plain' }), self.csv.filename);
};

var text = '';
self.toCsv = function () {
var rows = $scope.table.rows;
var columns = $scope.table.columns;
var nonAlphaNumRE = /[^a-zA-Z0-9]/;
var allDoubleQuoteRE = /"/g;
var escape = function (val) {

function escape(val) {
val = String(val);
if (self.csv.quoteValues && nonAlphaNumRE.test(val)) {
val = '"' + val.replace(allDoubleQuoteRE, '""') + '"';
}
return val;
};
}

// escape each cell in each row
var csvRows = rows.map(function (row, i) {
Expand All @@ -100,17 +97,15 @@ define(function (require) {
return escape(col.title);
}));

var blob = new Blob(csvRows.map(function (row) {
return csvRows.map(function (row) {
return row.join(self.csv.separator) + '\r\n';
}), { type: 'text/plain' });

saveAs(blob, ($scope.table.title() || 'table') + '.csv');
}).join('');
};

$scope.$watchMulti([
'table',
'aggTable.sort.asc',
'aggTable.sort.field'
'aggTable.sort.col'
], function () {
var table = $scope.table;

Expand All @@ -125,7 +120,7 @@ define(function (require) {

// sort the row values, not formatted
if (self.sort) {
$scope.formattedRows = orderBy(table.rows, self.sort.getter, self.sort.asc);
$scope.formattedRows = orderBy(table.rows, self.sort.getter, !self.sort.asc);
} else {
$scope.formattedRows = null;
}
Expand All @@ -136,6 +131,9 @@ define(function (require) {
return formatters[i](cell);
});
});

// update the csv file's title
self.csv.filename = (table.title() || 'table') + '.csv';
});
}
};
Expand Down
Loading

0 comments on commit 3454842

Please sign in to comment.