Commits

Miha Stajdohar committed d7951f9

Show custom fields in table on filter.

Comments (0)

Files changed (4)

benchmarks/static/benchmarks/js/app.js

             }
 
         };
-    });
-
+    })
 
+    .filter('field_value', function () {
+        return function (input, key) {
+            if (key in input) {
+                return input[key].value;
+            } else {
+                return '';
+            }
+        }
+    });

benchmarks/static/benchmarks/js/controllers.js

 'use strict';
 
-function BenchmarksCtrl($scope, $filter, $routeParams, ngTableParams, Benchmark, Bookmark) {
+function BenchmarksCtrl($scope, $filter, $routeParams, $location, ngTableParams, Benchmark, Bookmark) {
     var bookmarkId = $routeParams.bookmarkId,
         field_names = {},
         all_fields = {},
         orderedData,
-        data;
+        data,
+        bookmark_loaded = false,
+        selected_fields = [],
+        filtered_fields = [];
+
+    var default_columns = [],
+        default_column_title = function (el) {
+            return function () {
+                return default_column_names[el][0];
+            }
+        },
+        default_column_names = [
+            ['', false],
+            ['Title', 'title'],
+            ['Date', 'date'],
+            ['Tags', false],
+            ['Type', 'transaction_type'],
+            ['Scaling', 'scaling_factor'],
+            ['Threads', 'threads'],
+            ['Clients', 'clients'],
+            ['Trans. / Client', 'transactions_per_client'],
+            ['Trans. process.', 'transactions_processed'],
+            ['TPS', 'tps_excluding'],
+            ['TPS (conn.)', 'tps_including'],
+            ['User', 'username']
+        ];
+
+    for (var i = 0, l = default_column_names.length; i < l; i++) {
+        default_columns.push({
+            id: i,
+            title: default_column_title(i),
+            sortable: default_column_names[i][1],
+            filter: false,
+            filterTemplateURL: false,
+            headerTemplateURL: false,
+            filterData: null,
+            show: function () {
+                return true;
+            }
+        });
+    }
 
     $('#benchmarks-list-item').addClass('active');
     $('#bookmarks-list-item').removeClass('active');
             filter: '',         // initial filter
             sorting: {
                 date: 'desc'    // initial sorting
-            }
+            },
+            columns: []
         });
 
         $scope.attribute_x = null;
         $scope.attribute_y = [];
+        $scope.all_fields = [];
 
         $scope.checkboxes = { 'checked': false, items: {}, 'num_checked': 0 };
     }
         ];
 
         // add special fields to analysis combo boxes
-        for (var key in field_names) {
-            if (field_names[key] === 'STR') {
-                $scope.attributes_x.push({label: key, attribute: key});
-            } else if (field_names[key] === 'NUM') {
-                $scope.attributes_y.push({label: key, attribute: key});
+        for (var i = 0, l = selected_fields.length; i < l; i++) {
+            if (field_names[selected_fields[i]] === 'STR') {
+                $scope.attributes_x.push({label: selected_fields[i], attribute: selected_fields[i]});
+            } else if (field_names[selected_fields[i]] === 'NUM') {
+                $scope.attributes_y.push({label: selected_fields[i], attribute: selected_fields[i]});
             }
         }
 
         }
     }
 
+    function set_bookmark() {
+        if (bookmarkId !== undefined) {
+            $('#bookmark-button').css("display", "none");
+        } else {
+            $('#bookmark-button').css("display", "block");
+        }
+
+        if (bookmarkId !== undefined && window.disqus_shortname === undefined) {
+            setTimeout(function () {
+                window.disqus_shortname = 'benguru';
+                window.disqus_identifier = bookmarkId;
+                window.disqus_url = 'http://benguru.fri.uni-lj.si/benchmarks/' + bookmarkId + '/';
+
+                (function () {
+                    var dsq = document.createElement('script');
+                    dsq.type = 'text/javascript';
+                    dsq.async = true;
+                    dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
+                    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+                })();
+            }, 1000);
+        } else if (bookmarkId !== undefined && window.DISQUS !== undefined) {
+            setTimeout(function () {
+                window.disqus_identifier = bookmarkId;
+                window.disqus_url = 'http://benguru.fri.uni-lj.si/benchmarks/' + bookmarkId + '/';
+
+                DISQUS.reset({
+                    reload: true,
+                    config: function () {
+                        this.page.identifier = window.disqus_identifier;
+                        this.page.url = window.disqus_url;
+                    }
+                });
+            }, 1000);
+        }
+    }
+
     set_defaults();
     set_attributes();
 
                 $scope.benchmarks = orderedData.slice((params.page - 1) * params.count, params.page * params.count);
                 // move select all checkbox from hidden filter to table header
                 $('#select_all').prependTo("table > thead > tr:first > th:first");
+
+                if (params.filter) {
+                    var filtered_field_set = {};
+                    for (var i = 0, l = orderedData.length; i < l; i++) {
+
+                        for (var j = 0, l2 = orderedData[i].fields.length; j < l2; j++) {
+                            if (!(orderedData[i].fields[j].name in field_names)) {
+                                filtered_field_set[orderedData[i].fields[j].name] = true;
+                            }
+                        }
+                    }
+                    filtered_fields = [];
+                    for (var key in filtered_field_set) {
+                        filtered_fields.push(key);
+                    }
+                } else {
+                    filtered_fields = [];
+                }
+
+                var columns = default_columns.slice(0),
+                    fil_title = function (el) {
+                        return function () {
+                            return filtered_fields[el];
+                        }
+                    };
+
+                for (var i = 0, l = filtered_fields.length; i < l; i++) {
+                    $scope.tableBenchmarks.columns.push({
+                        id: $scope.tableBenchmarks.columns.length,
+                        title: fil_title(i),
+                        sortable: false,
+                        filter: false,
+                        filterTemplateURL: false,
+                        headerTemplateURL: false,
+                        filterData: null,
+                        show: function () {
+                            return true;
+                        }
+                    });
+                }
+
+                $scope.tableBenchmarks.columns = columns;
+                $scope.filtered_fields = filtered_fields;
             }, true);
 
             // watch for check all checkbox
                         }
                     }
                 }
+                selected_fields = [];
+                for (var key in field_names) {
+                    selected_fields.push(key);
+                }
+
                 if ((unchecked == 0) || (checked == 0)) {
                     $scope.checkboxes.checked = (checked == total);
                 }
 
-                /*if (true) {
-                 field_names = all_fields;
-                 }*/
-
                 $scope.checkboxes.num_checked = checked;
                 set_attributes();
                 // grayed checkbox
                 $("#select_all").prop("indeterminate", (checked != 0 && unchecked != 0));
                 plot_benchmarks();
+
+                if (bookmarkId !== undefined && bookmark_loaded) {
+                    bookmarkId = undefined;
+                    set_bookmark();
+                }
             }, true);
 
             var plot_benchmarks = function () {
         }
     );
 
-    if (bookmarkId !== undefined && window.disqus_shortname === undefined) {
-        setTimeout(function () {
-            console.log("define disqus")
-            window.disqus_shortname = 'benguru';
-            window.disqus_identifier = bookmarkId;
-            window.disqus_url = 'http://benguru.fri.uni-lj.si/benchmarks/' + bookmarkId + '/';
-
-            (function () {
-                var dsq = document.createElement('script');
-                dsq.type = 'text/javascript';
-                dsq.async = true;
-                dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
-                (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-            })();
-        }, 1000);
-    } else if (bookmarkId !== undefined && window.DISQUS !== undefined) {
-        setTimeout(function () {
-            console.log("reload disqus")
-            window.disqus_identifier = bookmarkId;
-            window.disqus_url = 'http://benguru.fri.uni-lj.si/benchmarks/' + bookmarkId + '/';
-
-            DISQUS.reset({
-                reload: true,
-                config: function () {
-                    this.page.identifier = window.disqus_identifier;
-                    this.page.url = window.disqus_url;
-                }
-            });
-        }, 1000);
-    }
+    set_bookmark();
 }
 
 function BookmarksCtrl($scope, $filter, ngTableParams, Bookmark) {

benchmarks/static/benchmarks/lib/ng-table.js

 /*! ngTable v0.2.1 by Vitalii Savchuk(esvit666@gmail.com) - https://github.com/esvit/ng-table - New BSD License */
-!function(a,b){return"function"==typeof define&&define.amd?(define("ngTable",["../../../../main/static/main/lib/jquery","angular"],function(a,c){return b(c)}),void 0):b(a)}(angular||null,function(a){"use strict";a.module("ngTable",[]).directive("ngTable",["$compile","$q","$parse","$http","ngTableParams",function(b,c,d,e,f){return{restrict:"A",priority:1001,scope:!0,controller:["$scope","$timeout",function(b){var c;return b.params=b.params||{page:1,count:10},b.$watch("params.filter",function(a){return b.params.$liveFiltering?(c(a),b.goToPage(1)):void 0},!0),c=function(c){return c=a.extend(b.params,c),b.paramsModel.assign(b.$parent,new f(c)),b.params=a.copy(c)},b.goToPage=function(a){return a>0&&b.params.page!==a&&b.params.count*(a-1)<=b.params.total?c({page:a}):void 0},b.changeCount=function(a){return c({page:1,count:a})},b.doFilter=function(){return c({page:1})},b.sortBy=function(a){var d,e;if(a.sortable)return d=b.params.sorting&&b.params.sorting[a.sortable]&&"desc"===b.params.sorting[a.sortable],e={},e[a.sortable]=d?"asc":"desc",c({sorting:e})}}],compile:function(c){var e,f;return f=0,e=[],a.forEach(c.find("tr").eq(0).find("td"),function(a){var b,c,g,h,i;return b=$(a),b.attr("ignore-cell")&&"true"===b.attr("ignore-cell")?void 0:(i=function(a){return d(b.attr("data-title"))(a)||b.attr("data-title")||" "},b.attr("data-title-text",i()),h=b.attr("header")?d(b.attr("header"))():!1,c=b.attr("filter")?d(b.attr("filter"))():!1,g=!1,c&&c.templateURL&&(g=c.templateURL,delete c.templateURL),e.push({id:f++,title:i,sortable:b.attr("sortable")?b.attr("sortable"):!1,filter:c,filterTemplateURL:g,headerTemplateURL:h,filterData:b.attr("filter-data")?b.attr("filter-data"):null,show:b.attr("ng-show")?function(a){return d(b.attr("ng-show"))(a)}:function(){return!0}}))}),function(c,g,h){var i,j,k,l;return c.columns=e,i=function(a,b,c){var d,e,g,h,i,j;if(d=11,j=[],i=Math.ceil(b/c),i>1){for(j.push({type:"prev",number:Math.max(1,a-1),active:a>1}),j.push({type:"first",number:1,active:a>1}),g=Math.round((d-5)/2),h=Math.max(2,a-g),e=Math.min(i-1,a+2*g-(a-h)),h=Math.max(2,h-(2*g-(e-h))),f=h;e>=f;)f===h&&2!==f||f===e&&f!==i-1?j.push({type:"more"}):j.push({type:"page",number:f,active:a!==f}),f++;j.push({type:"last",number:i,active:a!==i}),j.push({type:"next",number:Math.min(i,a+1),active:i>a})}return j},c.$parent.$watch(h.ngTable,function(b){return a.isUndefined(b)?void 0:(c.paramsModel=d(h.ngTable),c.pages=i(b.page,b.total,b.count),c.params=a.copy(b))},!0),c.parse=function(a){return a(c)},h.showFilter&&c.$parent.$watch(h.showFilter,function(a){return c.show_filter=a}),a.forEach(e,function(b){var e;if(b.filterData){if(e=d(b.filterData)(c,{$column:b}),!a.isObject(e)||!a.isFunction(e.then))throw new Error("Function "+b.filterData+" must be promise");return delete b.filterData,e.then(function(c){return a.isArray(c)||(c=[]),c.unshift({title:"-",id:""}),b.data=c})}}),g.hasClass("ng-table")?void 0:(c.templates={header:h.templateHeader?h.templateHeader:"ng-table/header.html",pagination:h.templatePagination?h.templatePagination:"ng-table/pager.html"},j=b('<thead ng-include="templates.header"></thead>')(c),k=b('<div ng-include="templates.pagination"></div>')(c),g.filter("thead").remove(),l=g.find("tbody"),l[0]?$(l[0]).before(j):g.prepend(j),g.addClass("ng-table"),g.after(k))}}}}]);var b={}.hasOwnProperty;return a.module("ngTable").factory("ngTableParams",function(){var c,d;return c=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},d=function(d){var e,f,g,h,i,j,k,l,m,n;e=["total","counts","$liveFiltering"],this.page=1,this.count=1,this.counts=[10,25,50,100],this.filter={},this.sorting={};for(f in d)if(k=d[f],f.indexOf("[")>=0){for(i=f.split(/\[(.*)\]/),g="",n=i.reverse(),l=0,m=n.length;m>l;l++)h=n[l],""!==h&&(j=k,k={},k[g=h]=c(j)?parseFloat(j):j);"sorting"===g&&(this[g]={}),this[g]=a.extend(this[g]||{},k[g])}else this[f]=c(d[f])?parseFloat(d[f]):d[f];return this.orderBy=function(){var a,c,d,e;d=[],e=this.sorting;for(a in e)b.call(e,a)&&(c=e[a],d.push(("asc"===c?"+":"-")+a));return d},this.url=function(b){var c,d,g,i;b=b||!1,d=b?[]:{};for(f in this)if(this.hasOwnProperty(f)){if(e.indexOf(f)>=0)continue;if(c=this[f],h=encodeURIComponent(f),"object"==typeof c)for(i in c)a.isUndefined(c[i])||""===c[i]||(g=h+"["+encodeURIComponent(i)+"]",b?d.push(g+"="+encodeURIComponent(c[i])):d[g]=encodeURIComponent(c[i]));else a.isFunction(c)||a.isUndefined(c)||""===c||(b?d.push(h+"="+encodeURIComponent(c)):d[h]=encodeURIComponent(c))}return d},this}}),a.module("ngTable").run(["$templateCache",function(a){a.put("ng-table/filters/button.html",'<button ng-click="doFilter()" ng-show="filter==\'button\'" class="btn btn-primary btn-block">Filter</button>'),a.put("ng-table/filters/select.html",'<select ng-options="data.id as data.title for data in column.data" ng-model="params.filter[name]" ng-show="filter==\'select\'" class="filter filter-select"></select>'),a.put("ng-table/filters/text.html",'<input type="text" ng-model="params.filter[name]" ng-show="filter==\'text\'" class="input-filter"/>'),a.put("ng-table/header.html",'<tr><th ng-class="{sortable: column.sortable,\'sort-asc\': params.sorting[column.sortable]==\'asc\', \'sort-desc\': params.sorting[column.sortable]==\'desc\'}" ng-click="sortBy(column)" ng-repeat="column in columns" ng-show="column.show(this)" class="header"><div ng-hide="column.headerTemplateURL" ng-bind="parse(column.title)"></div><div ng-show="column.headerTemplateURL" ng-include="column.headerTemplateURL"></div></th></tr><tr ng-show="show_filter" class="ng-table-filters"><th ng-repeat="column in columns" ng-show="column.show(this)" data-title-text="{{column.title}}" class="filter"><form ng-submit="doFilter()"><input type="submit" tabindex="-1" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/><div ng-repeat="(name, filter) in column.filter"><div ng-if="column.filterTemplateURL"><div ng-include="column.filterTemplateURL"></div></div><div ng-if="!column.filterTemplateURL"><div ng-include="\'ng-table/filters/\' + filter + \'.html\'"></div></div></div></form></th></tr>'),a.put("ng-table/pager.html",'<div class="pagination ng-cloak"><ul class="pagination"><li ng-class="{\'disabled\': !page.active}" ng-repeat="page in pages" ng-switch="page.type"><a ng-switch-when="prev" ng-click="goToPage(page.number)" href="">«</a><a ng-switch-when="first" ng-click="goToPage(page.number)" href="">{{page.number}}</a><a ng-switch-when="page" ng-click="goToPage(page.number)" href="">{{page.number}}</a><a ng-switch-when="more" ng-click="goToPage(page.number)" href="">…</a><a ng-switch-when="last" ng-click="goToPage(page.number)" href="">{{page.number}}</a><a ng-switch-when="next" ng-click="goToPage(page.number)" href="">»</a></li></ul><div ng-show="params.counts.length" class="btn-group pull-right"><button ng-repeat="count in params.counts" type="button" ng-class="{\'active\':params.count==count}" ng-click="changeCount(count)" class="btn btn-mini">{{count}}</button></div></div>')}]),a.module("ngTable")});
+!function (a, b) {
+    return"function" == typeof define && define.amd ? (define("ngTable", ["../../../../main/static/main/lib/jquery", "angular"], function (a, c) {
+        return b(c)
+    }), void 0) : b(a)
+}(angular || null, function (a) {
+    "use strict";
+    a.module("ngTable", []).directive("ngTable", ["$compile", "$q", "$parse", "$http", "ngTableParams", function (b, c, d, e, f) {
+        return{restrict: "A", priority: 1001, scope: !0, controller: ["$scope", "$timeout", function (b) {
+            var c;
+            return b.params = b.params || {page: 1, count: 10}, b.$watch("params.filter", function (a) {
+                return b.params.$liveFiltering ? (c(a), b.goToPage(1)) : void 0
+            }, !0), c = function (c) {
+                return c = a.extend(b.params, c), b.paramsModel.assign(b.$parent, new f(c)), b.params = a.copy(c)
+            }, b.goToPage = function (a) {
+                return a > 0 && b.params.page !== a && b.params.count * (a - 1) <= b.params.total ? c({page: a}) : void 0
+            }, b.changeCount = function (a) {
+                return c({page: 1, count: a})
+            }, b.doFilter = function () {
+                return c({page: 1})
+            }, b.sortBy = function (a) {
+                var d, e;
+                if (a.sortable)return d = b.params.sorting && b.params.sorting[a.sortable] && "desc" === b.params.sorting[a.sortable], e = {}, e[a.sortable] = d ? "asc" : "desc", c({sorting: e})
+            }
+        }], compile: function (c) {
+            var e, f;
+            return f = 0, e = [], a.forEach(c.find("tr").eq(0).find("td"), function (a) {
+                var b, c, g, h, i;
+                return b = $(a), b.attr("ignore-cell") && "true" === b.attr("ignore-cell") ? void 0 : (i = function (a) {
+                    return d(b.attr("data-title"))(a) || b.attr("data-title") || " "
+                }, b.attr("data-title-text", i()), h = b.attr("header") ? d(b.attr("header"))() : !1, c = b.attr("filter") ? d(b.attr("filter"))() : !1, g = !1, c && c.templateURL && (g = c.templateURL, delete c.templateURL), e.push({id: f++, title: i, sortable: b.attr("sortable") ? b.attr("sortable") : !1, filter: c, filterTemplateURL: g, headerTemplateURL: h, filterData: b.attr("filter-data") ? b.attr("filter-data") : null, show: b.attr("ng-show") ? function (a) {
+                    return d(b.attr("ng-show"))(a)
+                } : function () {
+                    return!0
+                }}))
+            }), function (c, g, h) {
+                var i, j, k, l;
+                return c.columns = e, i = function (a, b, c) {
+                    var d, e, g, h, i, j;
+                    if (d = 11, j = [], i = Math.ceil(b / c), i > 1) {
+                        for (j.push({type: "prev", number: Math.max(1, a - 1), active: a > 1}), j.push({type: "first", number: 1, active: a > 1}), g = Math.round((d - 5) / 2), h = Math.max(2, a - g), e = Math.min(i - 1, a + 2 * g - (a - h)), h = Math.max(2, h - (2 * g - (e - h))), f = h; e >= f;)f === h && 2 !== f || f === e && f !== i - 1 ? j.push({type: "more"}) : j.push({type: "page", number: f, active: a !== f}), f++;
+                        j.push({type: "last", number: i, active: a !== i}), j.push({type: "next", number: Math.min(i, a + 1), active: i > a})
+                    }
+                    return j
+                }, c.$parent.$watch(h.ngTable, function (b) {
+                    return a.isUndefined(b) ? void 0 : (c.paramsModel = d(h.ngTable), c.pages = i(b.page, b.total, b.count), c.columns = b.columns, c.params = a.copy(b))
+                }, !0), c.parse = function (a) {
+                    return a(c)
+                }, h.showFilter && c.$parent.$watch(h.showFilter, function (a) {
+                    return c.show_filter = a
+                }), a.forEach(e, function (b) {
+                    var e;
+                    if (b.filterData) {
+                        if (e = d(b.filterData)(c, {$column: b}), !a.isObject(e) || !a.isFunction(e.then))throw new Error("Function " + b.filterData + " must be promise");
+                        return delete b.filterData, e.then(function (c) {
+                            return a.isArray(c) || (c = []), c.unshift({title: "-", id: ""}), b.data = c
+                        })
+                    }
+                }), g.hasClass("ng-table") ? void 0 : (c.templates = {header: h.templateHeader ? h.templateHeader : "ng-table/header.html", pagination: h.templatePagination ? h.templatePagination : "ng-table/pager.html"}, j = b('<thead ng-include="templates.header"></thead>')(c), k = b('<div ng-include="templates.pagination"></div>')(c), g.filter("thead").remove(), l = g.find("tbody"), l[0] ? $(l[0]).before(j) : g.prepend(j), g.addClass("ng-table"), g.after(k))
+            }
+        }}
+    }]);
+    var b = {}.hasOwnProperty;
+    return a.module("ngTable").factory("ngTableParams", function () {
+        var c, d;
+        return c = function (a) {
+            return!isNaN(parseFloat(a)) && isFinite(a)
+        }, d = function (d) {
+            var e, f, g, h, i, j, k, l, m, n;
+            e = ["total", "counts", "$liveFiltering"], this.page = 1, this.count = 1, this.counts = [10, 25, 50, 100], this.filter = {}, this.sorting = {};
+            for (f in d)if (k = d[f], f.indexOf("[") >= 0) {
+                for (i = f.split(/\[(.*)\]/), g = "", n = i.reverse(), l = 0, m = n.length; m > l; l++)h = n[l], "" !== h && (j = k, k = {}, k[g = h] = c(j) ? parseFloat(j) : j);
+                "sorting" === g && (this[g] = {}), this[g] = a.extend(this[g] || {}, k[g])
+            } else this[f] = c(d[f]) ? parseFloat(d[f]) : d[f];
+            return this.orderBy = function () {
+                var a, c, d, e;
+                d = [], e = this.sorting;
+                for (a in e)b.call(e, a) && (c = e[a], d.push(("asc" === c ? "+" : "-") + a));
+                return d
+            }, this.url = function (b) {
+                var c, d, g, i;
+                b = b || !1, d = b ? [] : {};
+                for (f in this)if (this.hasOwnProperty(f)) {
+                    if (e.indexOf(f) >= 0)continue;
+                    if (c = this[f], h = encodeURIComponent(f), "object" == typeof c)for (i in c)a.isUndefined(c[i]) || "" === c[i] || (g = h + "[" + encodeURIComponent(i) + "]", b ? d.push(g + "=" + encodeURIComponent(c[i])) : d[g] = encodeURIComponent(c[i])); else a.isFunction(c) || a.isUndefined(c) || "" === c || (b ? d.push(h + "=" + encodeURIComponent(c)) : d[h] = encodeURIComponent(c))
+                }
+                return d
+            }, this
+        }
+    }), a.module("ngTable").run(["$templateCache", function (a) {
+        a.put("ng-table/filters/button.html", '<button ng-click="doFilter()" ng-show="filter==\'button\'" class="btn btn-primary btn-block">Filter</button>'), a.put("ng-table/filters/select.html", '<select ng-options="data.id as data.title for data in column.data" ng-model="params.filter[name]" ng-show="filter==\'select\'" class="filter filter-select"></select>'), a.put("ng-table/filters/text.html", '<input type="text" ng-model="params.filter[name]" ng-show="filter==\'text\'" class="input-filter"/>'), a.put("ng-table/header.html", '<tr><th ng-class="{sortable: column.sortable,\'sort-asc\': params.sorting[column.sortable]==\'asc\', \'sort-desc\': params.sorting[column.sortable]==\'desc\'}" ng-click="sortBy(column)" ng-repeat="column in columns" ng-show="column.show(this)" class="header"><div ng-hide="column.headerTemplateURL" ng-bind="parse(column.title)"></div><div ng-show="column.headerTemplateURL" ng-include="column.headerTemplateURL"></div></th></tr><tr ng-show="show_filter" class="ng-table-filters"><th ng-repeat="column in columns" ng-show="column.show(this)" data-title-text="{{column.title}}" class="filter"><form ng-submit="doFilter()"><input type="submit" tabindex="-1" style="position: absolute; left: -9999px; width: 1px; height: 1px;"/><div ng-repeat="(name, filter) in column.filter"><div ng-if="column.filterTemplateURL"><div ng-include="column.filterTemplateURL"></div></div><div ng-if="!column.filterTemplateURL"><div ng-include="\'ng-table/filters/\' + filter + \'.html\'"></div></div></div></form></th></tr>'), a.put("ng-table/pager.html", '<div class="pagination ng-cloak"><ul class="pagination"><li ng-class="{\'disabled\': !page.active}" ng-repeat="page in pages" ng-switch="page.type"><a ng-switch-when="prev" ng-click="goToPage(page.number)" href="">«</a><a ng-switch-when="first" ng-click="goToPage(page.number)" href="">{{page.number}}</a><a ng-switch-when="page" ng-click="goToPage(page.number)" href="">{{page.number}}</a><a ng-switch-when="more" ng-click="goToPage(page.number)" href="">…</a><a ng-switch-when="last" ng-click="goToPage(page.number)" href="">{{page.number}}</a><a ng-switch-when="next" ng-click="goToPage(page.number)" href="">»</a></li></ul><div ng-show="params.counts.length" class="btn-group pull-right"><button ng-repeat="count in params.counts" type="button" ng-class="{\'active\':params.count==count}" ng-click="changeCount(count)" class="btn btn-mini">{{count}}</button></div></div>')
+    }]), a.module("ngTable")
+});
 /*
-//@ sourceMappingURL=ng-table.map
-*/
+ //@ sourceMappingURL=ng-table.map
+ */

benchmarks/static/benchmarks/partials/benchmarks.html

                 <td data-title="'User'" sortable="username">
                     {{ benchmark.user.username }}
                 </td>
+                <td ng-repeat="key in filtered_fields" data-title="'{{ key }}'">
+                    {{ benchmark.field_set | field_value:key }}
+                </td>
             </tr>
         </table>
         <script type="text/ng-template" id="ng-table/filters/checkbox.html">