jquery-tablesorter-rails4 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/app/assets/javascripts/jquery_tablesorter/jquery.metadata.js +116 -0
  8. data/app/assets/javascripts/jquery_tablesorter/jquery.tablesorter.js +1477 -0
  9. data/app/assets/javascripts/jquery_tablesorter/jquery.tablesorter.widgets-filter-formatter.js +924 -0
  10. data/app/assets/javascripts/jquery_tablesorter/jquery.tablesorter.widgets.js +1210 -0
  11. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-date-iso8601.js +34 -0
  12. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-date-month.js +32 -0
  13. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-date-two-digit-year.js +68 -0
  14. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-date-weekday.js +32 -0
  15. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-date.js +36 -0
  16. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-feet-inch-fraction.js +63 -0
  17. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-ignore-articles.js +47 -0
  18. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-input-select.js +78 -0
  19. data/app/assets/javascripts/jquery_tablesorter/parsers/parser-metric.js +77 -0
  20. data/app/assets/javascripts/jquery_tablesorter/widgets/widget-editable.js +68 -0
  21. data/app/assets/javascripts/jquery_tablesorter/widgets/widget-grouping.js +114 -0
  22. data/app/assets/javascripts/jquery_tablesorter/widgets/widget-repeatheaders.js +50 -0
  23. data/app/assets/javascripts/jquery_tablesorter/widgets/widget-scroller.js +240 -0
  24. data/app/assets/stylesheets/jquery_tablesorter/filter.formatter.css +183 -0
  25. data/app/assets/stylesheets/jquery_tablesorter/theme.black-ice.css +180 -0
  26. data/app/assets/stylesheets/jquery_tablesorter/theme.blue.css +215 -0
  27. data/app/assets/stylesheets/jquery_tablesorter/theme.bootstrap.css +139 -0
  28. data/app/assets/stylesheets/jquery_tablesorter/theme.dark.css +181 -0
  29. data/app/assets/stylesheets/jquery_tablesorter/theme.default.css +183 -0
  30. data/app/assets/stylesheets/jquery_tablesorter/theme.dropbox.css +201 -0
  31. data/app/assets/stylesheets/jquery_tablesorter/theme.green.css +198 -0
  32. data/app/assets/stylesheets/jquery_tablesorter/theme.grey.css +234 -0
  33. data/app/assets/stylesheets/jquery_tablesorter/theme.ice.css +189 -0
  34. data/app/assets/stylesheets/jquery_tablesorter/theme.jui.css +145 -0
  35. data/jquery-tablesorter-rails4.gemspec +25 -0
  36. data/lib/jquery-tablesorter-rails4.rb +1 -0
  37. data/lib/jquery/tablesorter/rails4.rb +10 -0
  38. data/lib/jquery/tablesorter/rails4/engine.rb +8 -0
  39. data/lib/jquery/tablesorter/rails4/version.rb +7 -0
  40. metadata +124 -0
@@ -0,0 +1,34 @@
1
+ /*! ISO-8601 date parser
2
+ * This parser will work with dates in ISO8601 format
3
+ * 2013-02-18T18:18:44+00:00
4
+ * Written by Sean Ellingham :https://github.com/seanellingham
5
+ * See https://github.com/Mottie/tablesorter/issues/247
6
+ */
7
+ /*global jQuery: false */
8
+ ;(function($){
9
+ "use strict";
10
+
11
+ var iso8601date = /^([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/;
12
+ $.tablesorter.addParser({
13
+ id : 'iso8601date',
14
+ is : function(s) {
15
+ return s.match(iso8601date);
16
+ },
17
+ format : function(s) {
18
+ var result = s.match(iso8601date);
19
+ if (result) {
20
+ var date = new Date(result[1], 0, 1);
21
+ if (result[3]) {date.setMonth(result[3] - 1);}
22
+ if (result[5]) {date.setDate(result[5]);}
23
+ if (result[7]) {date.setHours(result[7]);}
24
+ if (result[8]) {date.setMinutes(result[8]);}
25
+ if (result[10]) {date.setSeconds(result[10]);}
26
+ if (result[12]) {date.setMilliseconds(Number('0.' + result[12]) * 1000);}
27
+ return date;
28
+ }
29
+ return 0;
30
+ },
31
+ type : 'numeric'
32
+ });
33
+
34
+ })(jQuery);
@@ -0,0 +1,32 @@
1
+ /*! Month parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/477/
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ $.tablesorter.dates = $.extend({}, $.tablesorter.dates, {
9
+ // *** modify this array to change match the language ***
10
+ monthCased : [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
11
+ });
12
+ $.tablesorter.dates.monthLower = $.tablesorter.dates.monthCased.join(',').toLocaleLowerCase().split(',');
13
+
14
+ $.tablesorter.addParser({
15
+ id: "month",
16
+ is: function(){
17
+ return false;
18
+ },
19
+ format: function(s, table) {
20
+ var j = -1, c = table.config;
21
+ s = c.ignoreCase ? s.toLocaleLowerCase() : s;
22
+ $.each($.tablesorter.dates[ 'month' + (c.ignoreCase ? 'Lower' : 'Cased') ], function(i,v){
23
+ if (j < 0 && s.match(v)) { j = i; }
24
+ });
25
+ // return s (original string) if there isn't a match
26
+ // (non-weekdays will sort separately and empty cells will sort as expected)
27
+ return j < 0 ? s : j;
28
+ },
29
+ type: "numeric"
30
+ });
31
+
32
+ })(jQuery);
@@ -0,0 +1,68 @@
1
+ /*! Two digit year parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/427/
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ // Make the date be within +/- range of the 2 digit year
9
+ // so if the current year is 2020, and the 2 digit year is 80 (2080 - 2020 > 50), it becomes 1980
10
+ // if the 2 digit year is 50 (2050 - 2020 < 50), then it becomes 2050.
11
+ var range = 50,
12
+
13
+ // ************
14
+ regxxxxyy = /(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{2})/,
15
+ regyyxxxx = /(\d{2})[\/\s](\d{1,2})[\/\s](\d{1,2})/,
16
+ formatDate = function(s, regex, format){
17
+ s = s
18
+ // replace separators
19
+ .replace(/\s+/g," ").replace(/[-.,]/g, "/")
20
+ // reformat xx/xx/xx to mm/dd/19yy;
21
+ .replace(regex, format);
22
+ var d = new Date(s), y = d.getFullYear(),
23
+ now = new Date().getFullYear();
24
+ // if date > 50 years old (set range), add 100 years
25
+ // this will work when people start using "50" and mean "2050"
26
+ while (now - y > range) {
27
+ y += 100;
28
+ }
29
+ return d.setFullYear(y);
30
+ };
31
+
32
+ $.tablesorter.addParser({
33
+ id: "ddmmyy",
34
+ is: function() {
35
+ return false;
36
+ },
37
+ format: function(s) {
38
+ // reformat dd/mm/yy to mm/dd/19yy;
39
+ return formatDate(s, regxxxxyy, "$2/$1/19$3");
40
+ },
41
+ type: "numeric"
42
+ });
43
+
44
+ $.tablesorter.addParser({
45
+ id: "mmddyy",
46
+ is: function() {
47
+ return false;
48
+ },
49
+ format: function(s) {
50
+ // reformat mm/dd/yy to mm/dd/19yy
51
+ return formatDate(s, regxxxxyy, "$1/$2/19$3");
52
+ },
53
+ type: "numeric"
54
+ });
55
+
56
+ $.tablesorter.addParser({
57
+ id: "yymmdd",
58
+ is: function() {
59
+ return false;
60
+ },
61
+ format: function(s) {
62
+ // reformat yy/mm/dd to mm/dd/19yy
63
+ return formatDate(s, regyyxxxx, "$2/$3/19$1");
64
+ },
65
+ type: "numeric"
66
+ });
67
+
68
+ })(jQuery);
@@ -0,0 +1,32 @@
1
+ /*! Weekday parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/477/
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ $.tablesorter.dates = $.extend({}, $.tablesorter.dates, {
9
+ // *** modify this array to change match the language ***
10
+ weekdayCased : [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]
11
+ });
12
+ $.tablesorter.dates.weekdayLower = $.tablesorter.dates.weekdayCased.join(',').toLocaleLowerCase().split(',');
13
+
14
+ $.tablesorter.addParser({
15
+ id: "weekday",
16
+ is: function(){
17
+ return false;
18
+ },
19
+ format: function(s, table) {
20
+ var j = -1, c = table.config;
21
+ s = c.ignoreCase ? s.toLocaleLowerCase() : s;
22
+ $.each($.tablesorter.dates[ 'weekday' + (c.ignoreCase ? 'Lower' : 'Cased') ], function(i,v){
23
+ if (j < 0 && s.match(v)) { j = i; }
24
+ });
25
+ // return s (original string) if there isn't a match
26
+ // (non-weekdays will sort separately and empty cells will sort as expected)
27
+ return j < 0 ? s : j;
28
+ },
29
+ type: "numeric"
30
+ });
31
+
32
+ })(jQuery);
@@ -0,0 +1,36 @@
1
+ /*!
2
+ * Extract dates using popular natural language date parsers
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ /*! Sugar (http://sugarjs.com/dates#comparing_dates)
9
+ * demo: http://jsfiddle.net/Mottie/abkNM/551/
10
+ */
11
+ $.tablesorter.addParser({
12
+ id: "sugar",
13
+ is: function() {
14
+ return false;
15
+ },
16
+ format: function(s) {
17
+ return Date.create ? Date.create(s).getTime() || s : s;
18
+ },
19
+ type: "numeric"
20
+ });
21
+
22
+ /*! Datejs (http://www.datejs.com/)
23
+ * demo: http://jsfiddle.net/Mottie/abkNM/550/
24
+ */
25
+ $.tablesorter.addParser({
26
+ id: "datejs",
27
+ is: function() {
28
+ return false;
29
+ },
30
+ format: function(s) {
31
+ return Date.parse && Date.parse(s) || s;
32
+ },
33
+ type: "numeric"
34
+ });
35
+
36
+ })(jQuery);
@@ -0,0 +1,63 @@
1
+ /*! Distance parser
2
+ * This parser will parser numbers like 5'10" (5 foot 10 inches)
3
+ * and 31½ into sortable values.
4
+ * Demo: http://jsfiddle.net/Mottie/abkNM/154/
5
+ */
6
+ /*global jQuery: false */
7
+ ;(function($){
8
+ "use strict";
9
+
10
+ var symbolRegex = /[\u215b\u215c\u215d\u215e\u00bc\u00bd\u00be]/g,
11
+ processFractions = function(n, table){
12
+ if (n) {
13
+ var t, p = 0;
14
+ n = $.trim(n.replace(/\"/,''));
15
+ // look for a space in the first part of the number: "10 3/4" and save the "10"
16
+ if (/\s/.test(n)) {
17
+ p = $.tablesorter.formatFloat(n.split(' ')[0], table);
18
+ // remove stuff to the left of the space
19
+ n = $.trim(n.substring(n.indexOf(' '), n.length));
20
+ }
21
+ // look for a "/" to calculate fractions
22
+ if (/\//g.test(n)) {
23
+ t = n.split('/');
24
+ // turn 3/4 into .75; make sure we don't divide by zero
25
+ n = p + parseInt(t[0], 10) / parseInt(t[1] || 1, 10);
26
+ // look for fraction symbols
27
+ } else if (symbolRegex.test(n)) {
28
+ n = p + n.replace(symbolRegex, function(m){
29
+ return {
30
+ '\u215b' : '.125', // 1/8
31
+ '\u215c' : '.375', // 3/8
32
+ '\u215d' : '.625', // 5/8
33
+ '\u215e' : '.875', // 7/8
34
+ '\u00bc' : '.25', // 1/4
35
+ '\u00bd' : '.5', // 1/2
36
+ '\u00be' : '.75' // 3/4
37
+ }[m];
38
+ });
39
+ }
40
+ }
41
+ return n || 0;
42
+ };
43
+
44
+ $.tablesorter.addParser({
45
+ id: 'distance',
46
+ is: function() {
47
+ // return false so this parser is not auto detected
48
+ return false;
49
+ },
50
+ format: function(s, table) {
51
+ if (s === '') { return ''; }
52
+
53
+ // look for feet symbol = '
54
+ // very generic test to catch 1.1', 1 1/2' and 1½'
55
+ var d = (/^\s*\S*(\s+\S+)?\s*\'/.test(s)) ? s.split("'") : [0,s],
56
+ f = processFractions(d[0], table), // feet
57
+ i = processFractions(d[1], table); // inches
58
+ return (/[\'\"]/).test(s) ? parseFloat(f) + (parseFloat(i)/12 || 0) : parseFloat(f) + parseFloat(i);
59
+ },
60
+ type: 'numeric'
61
+ });
62
+
63
+ })(jQuery);
@@ -0,0 +1,47 @@
1
+ /*! Title parser
2
+ * This parser will remove "The", "A" and "An" from the beginning of a book
3
+ * or movie title, so it sorts by the second word or number
4
+ * Demo: http://jsfiddle.net/Mottie/abkNM/5/
5
+ */
6
+ /*global jQuery: false */
7
+ ;(function($){
8
+ "use strict";
9
+
10
+ // basic list from http://en.wikipedia.org/wiki/Article_%28grammar%29
11
+ $.tablesorter.ignoreArticles = {
12
+ "en" : "the, a, an",
13
+ "de" : "der, die, das, des, dem, den, ein, eine, einer, eines, einem, einen",
14
+ "nl" : "de, het, de, een",
15
+ "es" : "el, la, lo, los, las, un, una, unos, unas",
16
+ "pt" : "o, a, os, as, um, uma, uns, umas",
17
+ "fr" : "le, la, l'_, les, un, une, des",
18
+ "it" : "il, lo, la, l'_, i, gli, le, un', uno, una, un",
19
+ "hu" : "a, az, egy"
20
+ };
21
+
22
+ // To add a custom parser, define:
23
+ // $.tablesorter.ignoreArticles['xx'] = "A, B, C";
24
+ // and then set the language id 'xx' in the headers option
25
+ // ignoreArticles : 'xx'
26
+
27
+ $.tablesorter.addParser({
28
+ id: 'ignoreArticles',
29
+ is: function() {
30
+ return false;
31
+ },
32
+ format: function(s, table, cell, cellIndex) {
33
+ var c = table.config, art, lang;
34
+ if ( !(c.headers && c.headers[cellIndex] && c.headers[cellIndex].ignoreArticlesRegex) ) {
35
+ // initialize - save regex in c.headers[cellIndex].ignoreArticles
36
+ if (!c.headers) { c.headers = {}; }
37
+ if (!c.headers[cellIndex]) { c.headers[cellIndex] = {}; }
38
+ lang = $.tablesorter.getData(c.$headers.eq(cellIndex), c.headers[cellIndex], 'ignoreArticles');
39
+ art = ($.tablesorter.ignoreArticles[lang] || "the, a, an" ) + "";
40
+ c.headers[cellIndex].ignoreArticlesRegex = new RegExp('^(' + $.trim( art.split(/\s*\,\s*/).join('\\s|') + "\\s" ).replace("_\\s","") + ')', 'i');
41
+ }
42
+ return (s || '').replace(c.headers[cellIndex].ignoreArticlesRegex, '');
43
+ },
44
+ type: 'text'
45
+ });
46
+
47
+ })(jQuery);
@@ -0,0 +1,78 @@
1
+ /*! input & select parsers for jQuery 1.7+ & tablesorter 2.7.11+
2
+ * Demo: http://mottie.github.com/tablesorter/docs/example-widget-grouping.html
3
+ */
4
+ /*jshint browser: true, jquery:true, unused:false */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ var resort = true, // resort table after update
9
+ updateServer = function(event, $table, $input){
10
+ // do something here to update your server, if needed
11
+ // event = change event object
12
+ // $table = jQuery object of the table that was just updated
13
+ // $input = jQuery object of the input or select that was modified
14
+ };
15
+
16
+ // Custom parser for parsing input values
17
+ // updated dynamically using the "change" function below
18
+ $.tablesorter.addParser({
19
+ id: "inputs",
20
+ is: function(){
21
+ return false;
22
+ },
23
+ format: function(s, table, cell) {
24
+ return $(cell).find('input').val() || s;
25
+ },
26
+ type: "text"
27
+ });
28
+
29
+ // Custom parser for including checkbox status if using the grouping widget
30
+ // updated dynamically using the "change" function below
31
+ $.tablesorter.addParser({
32
+ id: "checkbox",
33
+ is: function(){
34
+ return false;
35
+ },
36
+ format: function(s, table, cell) {
37
+ // using plain language here because this is what is shown in the group headers
38
+ // change it as desired
39
+ var $c = $(cell).find('input');
40
+ return $c.length ? $c.is(':checked') ? 'checked' : 'unchecked' : s;
41
+ },
42
+ type: "text"
43
+ });
44
+
45
+ // Custom parser which returns the currently selected options
46
+ // updated dynamically using the "change" function below
47
+ $.tablesorter.addParser({
48
+ id: "select",
49
+ is: function(){
50
+ return false;
51
+ },
52
+ format: function(s, table, cell) {
53
+ return $(cell).find('select').val() || s;
54
+ },
55
+ type: "text"
56
+ });
57
+
58
+ // update select and all input types in the tablesorter cache when the change event fires.
59
+ // This method only works with jQuery 1.7+
60
+ // you can change it to use delegate (v1.4.3+) or live (v1.3+) as desired
61
+ // if this code interferes somehow, target the specific table $('#mytable'), instead of $('table')
62
+ $(window).load(function(){
63
+ // this flag prevents the updateCell event from being spammed
64
+ // it happens when you modify input text and hit enter
65
+ var alreadyUpdating = false;
66
+ $('table').find('tbody').on('change', 'select, input', function(e){
67
+ if (!alreadyUpdating) {
68
+ var $tar = $(e.target),
69
+ $table = $tar.closest('table');
70
+ alreadyUpdating = true;
71
+ $table.trigger('updateCell', [ $tar.closest('td'), resort ]);
72
+ updateServer(e, $table, $tar);
73
+ setTimeout(function(){ alreadyUpdating = false; }, 10);
74
+ }
75
+ });
76
+ });
77
+
78
+ })(jQuery);
@@ -0,0 +1,77 @@
1
+ /*! Metric parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/382/
3
+ * Set the metric name in the header (defaults to "m|meter"), e.g.
4
+ * <th data-metric-name="b|byte">HDD Size</th>
5
+ * <th data-metric-name="m|meter">Distance</th>
6
+ */
7
+ /*jshint jquery:true */
8
+ ;(function($){
9
+ "use strict";
10
+
11
+ var prefixes = {
12
+ // "prefix" : [ base 10, base 2 ]
13
+ // skipping IEEE 1541 defined prefixes: kibibyte, mebibyte, etc, for now.
14
+ "Y|Yotta|yotta" : [ 1e24, Math.pow(1024, 8) ], // 1024^8
15
+ "Z|Zetta|zetta" : [ 1e21, Math.pow(1024, 7) ], // 1024^7
16
+ "E|Exa|exa" : [ 1e18, Math.pow(1024, 6) ], // 1024^6
17
+ "P|Peta|peta" : [ 1e15, Math.pow(1024, 5) ], // 1024^5
18
+ "T|Tera|tera" : [ 1e12, Math.pow(1024, 4) ], // 1024^4
19
+ "G|Giga|giga" : [ 1e9, Math.pow(1024, 3) ], // 1024^3
20
+ "M|Mega|mega" : [ 1e6, Math.pow(1024, 2) ], // 1024^2
21
+ "k|Kilo|kilo" : [ 1e3, 1024 ], // 1024
22
+ // prefixes below here are rarely, if ever, used in binary
23
+ "h|hecto" : [ 1e2, 1e2 ],
24
+ "da|deka" : [ 1e1, 1e1 ],
25
+ "d|deci" : [ 1e-1, 1e-1 ],
26
+ "c|centi" : [ 1e-2, 1e-2],
27
+ "m|milli" : [ 1e-3, 1e-3 ],
28
+ "µ|micro" : [ 1e-6, 1e-6 ],
29
+ "n|nano" : [ 1e-9, 1e-9 ],
30
+ "p|pico" : [ 1e-12, 1e-12 ],
31
+ "f|femto" : [ 1e-15, 1e-15 ],
32
+ "a|atto" : [ 1e-18, 1e-18 ],
33
+ "z|zepto" : [ 1e-21, 1e-21 ],
34
+ "y|yocto" : [ 1e-24, 1e-24 ]
35
+ },
36
+ // the \\d+ will not catch digits with spaces, commas or decimals; so use the value from n instead
37
+ RegLong = "(\\d+)(\\s+)?([Zz]etta|[Ee]xa|[Pp]eta|[Tt]era|[Gg]iga|[Mm]ega|kilo|hecto|deka|deci|centi|milli|micro|nano|pico|femto|atto|zepto|yocto)(",
38
+ RegAbbr = "(\\d+)(\\s+)?(Z|E|P|T|G|M|k|h|da|d|c|m|µ|n|p|f|a|z|y)(";
39
+
40
+ $.tablesorter.addParser({
41
+ id: 'metric',
42
+ is: function() {
43
+ return false;
44
+ },
45
+ format: function(s, table, cell, cellIndex) {
46
+ var v = 'm|meter',
47
+ b, t,
48
+ // process number here to get a numerical format (us or eu)
49
+ n = $.tablesorter.formatFloat(s.replace(/[^\w,. \-()]/g, ""), table),
50
+ $t = $(table).find('thead').children().children('[data-column="' + cellIndex + '"]'),
51
+ m = $t.data('metric');
52
+ if (!m) {
53
+ // stored values
54
+ t = ($t.attr('data-metric-name') || v).split('|');
55
+ m = [ t[1] || t[0].substring(1), t[0] ];
56
+ m[2] = new RegExp(RegLong + m[0] + "|" + m[1] + ")");
57
+ m[3] = new RegExp(RegAbbr + m[1] + ")");
58
+ $t.data('metric', m);
59
+ }
60
+ // find match to full name or abbreviation
61
+ t = s.match(m[2]) || s.match(m[3]);
62
+ if (t) {
63
+ for (v in prefixes) {
64
+ if (t[3].match(v)) {
65
+ // exception when using binary prefix
66
+ // change base for binary use
67
+ b = /^[b|bit|byte|o|octet]/.test(t[4]) ? 1 : 0;
68
+ return n * prefixes[v][b];
69
+ }
70
+ }
71
+ }
72
+ return n;
73
+ },
74
+ type: 'numeric'
75
+ });
76
+
77
+ })(jQuery);