123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- (function() {
- var SELECTOR, addEventListener, clickEvents, numberRegExp, sortable, touchDevice, trimRegExp;
- SELECTOR = 'table[data-sortable]';
- numberRegExp = /^-?[£$¤]?[\d,.]+%?$/;
- trimRegExp = /^\s+|\s+$/g;
- clickEvents = ['click'];
- touchDevice = 'ontouchstart' in document.documentElement;
- if (touchDevice) {
- clickEvents.push('touchstart');
- }
- addEventListener = function(el, event, handler) {
- if (el.addEventListener != null) {
- return el.addEventListener(event, handler, false);
- } else {
- return el.attachEvent("on" + event, handler);
- }
- };
- sortable = {
- init: function(options) {
- var table, tables, _i, _len, _results;
- if (options == null) {
- options = {};
- }
- if (options.selector == null) {
- options.selector = SELECTOR;
- }
- tables = document.querySelectorAll(options.selector);
- _results = [];
- for (_i = 0, _len = tables.length; _i < _len; _i++) {
- table = tables[_i];
- _results.push(sortable.initTable(table));
- }
- return _results;
- },
- initTable: function(table) {
- var i, th, ths, _i, _len, _ref;
- if (((_ref = table.tHead) != null ? _ref.rows.length : void 0) !== 1) {
- return;
- }
- if (table.getAttribute('data-sortable-initialized') === 'true') {
- return;
- }
- table.setAttribute('data-sortable-initialized', 'true');
- ths = table.querySelectorAll('th');
- for (i = _i = 0, _len = ths.length; _i < _len; i = ++_i) {
- th = ths[i];
- if (th.getAttribute('data-sortable') !== 'false') {
- sortable.setupClickableTH(table, th, i);
- }
- }
- return table;
- },
- setupClickableTH: function(table, th, i) {
- var eventName, onClick, type, _i, _len, _results;
- type = sortable.getColumnType(table, i);
- onClick = function(e) {
- var compare, item, newSortedDirection, position, row, rowArray, sorted, sortedDirection, tBody, ths, value, _compare, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref, _ref1;
- if (e.handled !== true) {
- e.handled = true;
- } else {
- return false;
- }
- sorted = this.getAttribute('data-sorted') === 'true';
- sortedDirection = this.getAttribute('data-sorted-direction');
- if (sorted) {
- newSortedDirection = sortedDirection === 'ascending' ? 'descending' : 'ascending';
- } else {
- newSortedDirection = type.defaultSortDirection;
- }
- ths = this.parentNode.querySelectorAll('th');
- for (_i = 0, _len = ths.length; _i < _len; _i++) {
- th = ths[_i];
- th.setAttribute('data-sorted', 'false');
- th.removeAttribute('data-sorted-direction');
- }
- this.setAttribute('data-sorted', 'true');
- this.setAttribute('data-sorted-direction', newSortedDirection);
- tBody = table.tBodies[0];
- rowArray = [];
- if (!sorted) {
- if (type.compare != null) {
- _compare = type.compare;
- } else {
- _compare = function(a, b) {
- return b - a;
- };
- }
- compare = function(a, b) {
- if (a[0] === b[0]) {
- return a[2] - b[2];
- }
- if (type.reverse) {
- return _compare(b[0], a[0]);
- } else {
- return _compare(a[0], b[0]);
- }
- };
- _ref = tBody.rows;
- for (position = _j = 0, _len1 = _ref.length; _j < _len1; position = ++_j) {
- row = _ref[position];
- value = sortable.getNodeValue(row.cells[i]);
- if (type.comparator != null) {
- value = type.comparator(value);
- }
- rowArray.push([value, row, position]);
- }
- rowArray.sort(compare);
- for (_k = 0, _len2 = rowArray.length; _k < _len2; _k++) {
- row = rowArray[_k];
- tBody.appendChild(row[1]);
- }
- } else {
- _ref1 = tBody.rows;
- for (_l = 0, _len3 = _ref1.length; _l < _len3; _l++) {
- item = _ref1[_l];
- rowArray.push(item);
- }
- rowArray.reverse();
- for (_m = 0, _len4 = rowArray.length; _m < _len4; _m++) {
- row = rowArray[_m];
- tBody.appendChild(row);
- }
- }
- if (typeof window['CustomEvent'] === 'function') {
- return typeof table.dispatchEvent === "function" ? table.dispatchEvent(new CustomEvent('Sortable.sorted', {
- bubbles: true
- })) : void 0;
- }
- };
- _results = [];
- for (_i = 0, _len = clickEvents.length; _i < _len; _i++) {
- eventName = clickEvents[_i];
- _results.push(addEventListener(th, eventName, onClick));
- }
- return _results;
- },
- getColumnType: function(table, i) {
- var row, specified, text, type, _i, _j, _len, _len1, _ref, _ref1, _ref2;
- specified = (_ref = table.querySelectorAll('th')[i]) != null ? _ref.getAttribute('data-sortable-type') : void 0;
- if (specified != null) {
- return sortable.typesObject[specified];
- }
- _ref1 = table.tBodies[0].rows;
- for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
- row = _ref1[_i];
- text = sortable.getNodeValue(row.cells[i]);
- _ref2 = sortable.types;
- for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
- type = _ref2[_j];
- if (type.match(text)) {
- return type;
- }
- }
- }
- return sortable.typesObject.alpha;
- },
- getNodeValue: function(node) {
- var dataValue;
- if (!node) {
- return '';
- }
- dataValue = node.getAttribute('data-value');
- if (dataValue !== null) {
- return dataValue;
- }
- if (typeof node.innerText !== 'undefined') {
- return node.innerText.replace(trimRegExp, '');
- }
- return node.textContent.replace(trimRegExp, '');
- },
- setupTypes: function(types) {
- var type, _i, _len, _results;
- sortable.types = types;
- sortable.typesObject = {};
- _results = [];
- for (_i = 0, _len = types.length; _i < _len; _i++) {
- type = types[_i];
- _results.push(sortable.typesObject[type.name] = type);
- }
- return _results;
- }
- };
- sortable.setupTypes([
- {
- name: 'numeric',
- defaultSortDirection: 'descending',
- match: function(a) {
- return a.match(numberRegExp);
- },
- comparator: function(a) {
- return parseFloat(a.replace(/[^0-9.-]/g, ''), 10) || 0;
- }
- }, {
- name: 'date',
- defaultSortDirection: 'ascending',
- reverse: true,
- match: function(a) {
- return !isNaN(Date.parse(a));
- },
- comparator: function(a) {
- return Date.parse(a) || 0;
- }
- }, {
- name: 'alpha',
- defaultSortDirection: 'ascending',
- match: function() {
- return true;
- },
- compare: function(a, b) {
- return a.localeCompare(b);
- }
- }
- ]);
- setTimeout(sortable.init, 0);
- if (typeof define === 'function' && define.amd) {
- define(function() {
- return sortable;
- });
- } else if (typeof exports !== 'undefined') {
- module.exports = sortable;
- } else {
- window.Sortable = sortable;
- }
- }).call(this);
|