123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- // Stupid jQuery table plugin.
- // Call on a table
- // sortFns: Sort functions for your datatypes.
- (function($) {
- $.fn.stupidtable = function(sortFns) {
- return this.each(function() {
- var $table = $(this);
- sortFns = sortFns || {};
- // Merge sort functions with some default sort functions.
- sortFns = $.extend({}, $.fn.stupidtable.default_sort_fns, sortFns);
- // ==================================================== //
- // Begin execution! //
- // ==================================================== //
- // Do sorting when THs are clicked
- $table.on("click.stupidtable", "th", function() {
- var $this = $(this);
- var th_index = 0;
- var dir = $.fn.stupidtable.dir;
- $table.find("th").slice(0, $this.index()).each(function() {
- var cols = $(this).attr("colspan") || 1;
- th_index += parseInt(cols,10);
- });
- // Determine (and/or reverse) sorting direction, default `asc`
- var sort_dir = $this.data("sort-default") || dir.ASC;
- if ($this.data("sort-dir"))
- sort_dir = $this.data("sort-dir") === dir.ASC ? dir.DESC : dir.ASC;
- // Choose appropriate sorting function.
- var type = $this.data("sort") || null;
- // Prevent sorting if no type defined
- if (type === null) {
- return;
- }
- // Trigger `beforetablesort` event that calling scripts can hook into;
- // pass parameters for sorted column index and sorting direction
- $table.trigger("beforetablesort", {column: th_index, direction: sort_dir});
- // More reliable method of forcing a redraw
- $table.css("display");
- // Run sorting asynchronously on a timout to force browser redraw after
- // `beforetablesort` callback. Also avoids locking up the browser too much.
- setTimeout(function() {
- // Gather the elements for this column
- var column = [];
- var sortMethod = sortFns[type];
- var trs = $table.children("tbody").children("tr");
- // Extract the data for the column that needs to be sorted and pair it up
- // with the TR itself into a tuple
- trs.each(function(index,tr) {
- var $e = $(tr).children().eq(th_index);
- var sort_val = $e.data("sort-value");
- var order_by = typeof(sort_val) !== "undefined" ? sort_val : $e.text();
- column.push([order_by, tr]);
- });
- // Sort by the data-order-by value
- column.sort(function(a, b) { return sortMethod(a[0], b[0]); });
- if (sort_dir != dir.ASC)
- column.reverse();
- // Replace the content of tbody with the sorted rows. Strangely (and
- // conveniently!) enough, .append accomplishes this for us.
- trs = $.map(column, function(kv) { return kv[1]; });
- $table.children("tbody").append(trs);
- // Reset siblings
- $table.find("th").data("sort-dir", null).removeClass("sorting-desc sorting-asc");
- $this.data("sort-dir", sort_dir).addClass("sorting-"+sort_dir);
- // Trigger `aftertablesort` event. Similar to `beforetablesort`
- $table.trigger("aftertablesort", {column: th_index, direction: sort_dir});
- // More reliable method of forcing a redraw
- $table.css("display");
- }, 10);
- });
- });
- };
- // Enum containing sorting directions
- $.fn.stupidtable.dir = {ASC: "asc", DESC: "desc"};
- $.fn.stupidtable.default_sort_fns = {
- "int": function(a, b) {
- return parseInt(a.replace(/,/g, ''), 10) - parseInt(b.replace(/,/g, ''), 10);
- },
- "float": function(a, b) {
- return (parseFloat(a) || 0) - (parseFloat(b) || 0);
- },
- "string": function(a, b) {
- if (a < b) return -1;
- if (a > b) return +1;
- return 0;
- },
- "string-ins": function(a, b) {
- a = a.toLowerCase();
- b = b.toLowerCase();
- if (a < b) return -1;
- if (a > b) return +1;
- return 0;
- }
- };
- })(jQuery);
|