Alan
3 years ago
commit
96d50fd698
17 changed files with 1665 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||||||
|
# Auto detect text files and perform LF normalization |
||||||
|
* text=auto |
@ -0,0 +1,12 @@ |
|||||||
|
language: node_js |
||||||
|
node_js: |
||||||
|
- 14 |
||||||
|
|
||||||
|
sudo: false |
||||||
|
|
||||||
|
install: |
||||||
|
- npm install |
||||||
|
|
||||||
|
cache: |
||||||
|
directories: |
||||||
|
- node_modules |
@ -0,0 +1,22 @@ |
|||||||
|
module.exports = function(grunt) { |
||||||
|
grunt.initConfig({ |
||||||
|
pkg: grunt.file.readJSON('package.json'), |
||||||
|
uglify: { |
||||||
|
options: { |
||||||
|
banner: '/*!\n'+ |
||||||
|
' * jQuery fancyTable plugin v<%= pkg.version %>\n'+ |
||||||
|
' * https://github.com/myspace-nu\n'+ |
||||||
|
' *\n'+ |
||||||
|
' * Copyright 2018 Johan Johansson\n'+ |
||||||
|
' * Released under the MIT license\n'+ |
||||||
|
' */\n' |
||||||
|
}, |
||||||
|
build: { |
||||||
|
src: 'src/fancyTable.js', |
||||||
|
dest: 'dist/fancyTable.min.js' |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
grunt.loadNpmTasks('grunt-contrib-uglify'); |
||||||
|
grunt.registerTask('default', ['uglify']); |
||||||
|
}; |
@ -0,0 +1,21 @@ |
|||||||
|
MIT License |
||||||
|
|
||||||
|
Copyright (c) 2018 Johan Johansson |
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||||
|
of this software and associated documentation files (the "Software"), to deal |
||||||
|
in the Software without restriction, including without limitation the rights |
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||||
|
copies of the Software, and to permit persons to whom the Software is |
||||||
|
furnished to do so, subject to the following conditions: |
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all |
||||||
|
copies or substantial portions of the Software. |
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||||
|
SOFTWARE. |
@ -0,0 +1,160 @@ |
|||||||
|
# jQuery.fancyTable |
||||||
|
|
||||||
|
A jQuery plugin for making html tables searchable and sortable with pagination. |
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.com/myspace-nu/jquery.fancyTable.svg?branch=master)](https://travis-ci.com/myspace-nu/jquery.fancyTable) |
||||||
|
[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/myspace-nu/jquery.fancyTable/blob/master/LICENSE) |
||||||
|
|
||||||
|
## Live demo |
||||||
|
|
||||||
|
See a live demo on [CodePen](https://codepen.io/myspace-nu/full/ZVEKyR) |
||||||
|
|
||||||
|
## Installation |
||||||
|
|
||||||
|
Using npm |
||||||
|
|
||||||
|
npm install jquery.fancytable --save |
||||||
|
|
||||||
|
Using CDN |
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/jquery.fancytable/dist/fancyTable.min.js"></script> |
||||||
|
|
||||||
|
Or manually by including the script *after* the jQuery library |
||||||
|
|
||||||
|
<script src="/path/to/fancyTable.min.js"></script> |
||||||
|
|
||||||
|
## Usage |
||||||
|
|
||||||
|
<script type="text/javascript"> |
||||||
|
$(document).ready(function() { |
||||||
|
$(".sampleTable").fancyTable({ |
||||||
|
sortColumn:0, |
||||||
|
pagination: true, |
||||||
|
perPage:10, |
||||||
|
globalSearch:true |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
|
||||||
|
## Options |
||||||
|
|
||||||
|
**globalSearch** - Use global search for all columns |
||||||
|
|
||||||
|
globalSearch: false |
||||||
|
|
||||||
|
*Default: false* |
||||||
|
|
||||||
|
**globalSearchExcludeColumns** - Defines a number of columns to exclude from the global search. |
||||||
|
|
||||||
|
globalSearchExcludeColumns: [2,5] // Exclude 2nd and 5th column. |
||||||
|
|
||||||
|
*Default: undefined* |
||||||
|
|
||||||
|
**inputPlaceholder** - Placeholder to use for <input> |
||||||
|
|
||||||
|
inputPlaceholder: 'Sök...' |
||||||
|
|
||||||
|
*Default: 'Search...'* |
||||||
|
|
||||||
|
**inputStyle** - Style attributes to use for <input> |
||||||
|
|
||||||
|
inputStyle: 'color:black;' |
||||||
|
|
||||||
|
*Default: ''* |
||||||
|
|
||||||
|
**onInit** - Function called after initialization |
||||||
|
|
||||||
|
onInit:function(){ |
||||||
|
console.log({ element:this }); |
||||||
|
} |
||||||
|
|
||||||
|
**onUpdate** - Function called after each update (sort and search) |
||||||
|
|
||||||
|
onUpdate:function(){ |
||||||
|
console.log({ element:this }); |
||||||
|
} |
||||||
|
|
||||||
|
**pagination** - Use pagination or not |
||||||
|
|
||||||
|
pagination: true |
||||||
|
|
||||||
|
*Default: false* |
||||||
|
|
||||||
|
**paginationClass** - CSS class to use for pagination buttons |
||||||
|
|
||||||
|
pagination: 'btn btn-primary' |
||||||
|
|
||||||
|
*Default: 'btn btn-light'* |
||||||
|
|
||||||
|
**paginationClassActive** - CSS class to use for active pagination buttons |
||||||
|
|
||||||
|
pagination: 'someClass' |
||||||
|
|
||||||
|
*Default: 'active'* |
||||||
|
|
||||||
|
**paginationElement** - Selector for element to place pagination controls in. |
||||||
|
|
||||||
|
paginationElement: '#someElement' |
||||||
|
|
||||||
|
*Default: undefined* - Undefined will create a (remove any existing) table footer to place controls in. |
||||||
|
|
||||||
|
**pagClosest** - Create pagination buttons for tbe n closest pages |
||||||
|
|
||||||
|
pagClosest: 5 |
||||||
|
|
||||||
|
*Default: 3* |
||||||
|
|
||||||
|
**perPage** - Rows per page when using pagination |
||||||
|
|
||||||
|
perPage: 5 |
||||||
|
|
||||||
|
*Default: 10* |
||||||
|
|
||||||
|
**searchable** - Should the table be searchable or not |
||||||
|
|
||||||
|
searchable: false |
||||||
|
|
||||||
|
*Default: true* |
||||||
|
|
||||||
|
**sortable** - Should the table be sortable or not |
||||||
|
|
||||||
|
sortable: false |
||||||
|
|
||||||
|
*Default: true* |
||||||
|
|
||||||
|
**sortColumn** - Column number for initial sorting |
||||||
|
|
||||||
|
sortColumn: 5 |
||||||
|
|
||||||
|
*Default: undefined* |
||||||
|
|
||||||
|
**sortOrder** - Initial sort order |
||||||
|
|
||||||
|
sortOrder: 'descending' // Valid values are 'desc', 'descending', 'asc', 'ascending', -1 (descending) and 1 (ascending) |
||||||
|
|
||||||
|
*Default: 'ascending'* |
||||||
|
|
||||||
|
## Data attributes |
||||||
|
|
||||||
|
**data-sortas="numeric"** - Used in the table header element <th> to define that values in the column should be sorted in numerical order (..., 8, 9, 10, 10.1, 12, ...) |
||||||
|
|
||||||
|
<th data-sortas="numeric"> |
||||||
|
|
||||||
|
**data-sortas="case-insensitive"** - Used in the table header element <th> to define that values in the column should be sorted case insensitive (a, B, c, D, ...) |
||||||
|
|
||||||
|
<th data-sortas="case-insensitive"> |
||||||
|
|
||||||
|
**data-sortvalue="`<value>`"** - Used in the table data element <td> to define an alternate value to be used when sorting |
||||||
|
|
||||||
|
<td>1</td> |
||||||
|
<td data-sortvalue="2">Two</td> |
||||||
|
<td>3</td> |
||||||
|
|
||||||
|
<td>Ghost</td> |
||||||
|
<td data-sortvalue="Fox and the Hound, The">The Fox and the Hound</td> |
||||||
|
<td>I Know What You Did Last Summer</td> |
||||||
|
|
||||||
|
|
||||||
|
### Author: [Johan Johansson](https://github.com/myspace-nu) |
||||||
|
|
||||||
|
### This library has been modified/used to meet the needs of Brookens Library |
File diff suppressed because one or more lines are too long
@ -0,0 +1,200 @@ |
|||||||
|
<!DOCTYPE html> |
||||||
|
<html lang="en"> |
||||||
|
<head> |
||||||
|
<meta charset="utf-8"> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> |
||||||
|
<title>Sample</title> |
||||||
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<div class="container"> |
||||||
|
<h3>Table with sortable headings and global search</h3> |
||||||
|
<table id="sampleTableA" class="table table-striped sampleTable"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>Col A</th> |
||||||
|
<th>Col B</th> |
||||||
|
<th>Col C</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<p> |
||||||
|
<button id="loadDataSimulation" class="btn btn-success">Load new data</button> |
||||||
|
</p> |
||||||
|
|
||||||
|
<h3>Simple table with column search</h3> |
||||||
|
<table id="sampleTableB" class="table table-striped sampleTable"> |
||||||
|
</table> |
||||||
|
|
||||||
|
<h3>Sort by nearest city</h3> |
||||||
|
<table id="sampleTableC" class="table table-striped sampleTable"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>City</th> |
||||||
|
<th>Coordinates</th> |
||||||
|
<th data-sortas="numeric">Distance</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
<tr><td>Lindesberg</td><td>@59.5994689,15.2132325</td><td></td></tr> |
||||||
|
<tr><td>Tokyo</td><td>@35.6708364,139.7532926</td><td></td></tr> |
||||||
|
<tr><td>Sydney</td><td>@-33.8981029,151.1612396</td><td></td></tr> |
||||||
|
<tr><td>Stockholm</td><td>@59.3275993,18.0524296</td><td></td></tr> |
||||||
|
<tr><td>New York</td><td>@40.7026091,-74.1197629</td><td></td></tr> |
||||||
|
<tr><td>Rio de Janeiro</td><td>@-22.9097071,-43.1925625</td><td></td></tr> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
<form class="form-inline"> |
||||||
|
<button type="button" class="form-control btn btn-light" id="getNavigatorLocation">Find my location</button> |
||||||
|
or, find by Swedish zip code <input type="text" class="form-control" id="zipCode" placeholder="Zip code"> <button type="button" class="form-control btn btn-light" id="getZipCodeLocation">Find</button> |
||||||
|
</form> |
||||||
|
<style> |
||||||
|
.form-inline .form-control { |
||||||
|
margin: 5px; |
||||||
|
} |
||||||
|
</style> |
||||||
|
|
||||||
|
<h3>Case insensitive and sort value</h3> |
||||||
|
<table id="sampleTableD" class="table table-striped sampleTable"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th>Case sensitive text values</th> |
||||||
|
<th data-sortas="case-insensitive">Case insensitive text values</th> |
||||||
|
<th data-sortas="numeric">Numeric values</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
<tr> |
||||||
|
<td>bbb</td> |
||||||
|
<td>bbb</td> |
||||||
|
<td data-sortvalue="2">Two</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td>AAA</td> |
||||||
|
<td>AAA</td> |
||||||
|
<td>3</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td>DDD</td> |
||||||
|
<td>DDD</td> |
||||||
|
<td>4</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td>ccc</td> |
||||||
|
<td>ccc</td> |
||||||
|
<td>1</td> |
||||||
|
</tr> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
</div> |
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> |
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.min.js"></script> |
||||||
|
<script src="https://cdn.jsdelivr.net/npm/js.geotools/dist/geotools.min.js"></script> |
||||||
|
<script src="https://cdn.jsdelivr.net/npm/js.geotools/dist/geotools-swedish-zipcodes.min.js"></script> |
||||||
|
<script src="https://cdn.jsdelivr.net/npm/moment@2.24.0/moment.min.js"></script> |
||||||
|
|
||||||
|
<script src="../src/fancyTable.js"></script> |
||||||
|
<script type="text/javascript"> |
||||||
|
// Word genarator |
||||||
|
function rWord(r){var t,n="bcdfghjklmnpqrstvwxyz",a="aeiou",e=function(r){return Math.floor(Math.random()*r)},o="";r=parseInt(r,10),n=n.split(""),a=a.split("");for(t=0;t<r/2;t++){var l=n[e(n.length)],p=a[e(a.length)];o+=0===t?l.toUpperCase():l,o+=2*t<r-1?p:""}return o} |
||||||
|
|
||||||
|
$(document).ready(function() { |
||||||
|
// Generate a big table |
||||||
|
for(var n=0;n<1000;n++){ |
||||||
|
var row = $("<tr>"); |
||||||
|
$("#sampleTableA").find("thead th").each(function() { |
||||||
|
$("<td>",{ |
||||||
|
html: rWord(8), |
||||||
|
style:"padding:2px;" |
||||||
|
}).appendTo($(row)); |
||||||
|
}); |
||||||
|
row.appendTo($("#sampleTableA").find("tbody")); |
||||||
|
} |
||||||
|
// Load data simulation |
||||||
|
$("#loadDataSimulation").click(function() { |
||||||
|
$(fancyTableA).find("tbody").empty(); |
||||||
|
for(var n=0;n<1000;n++){ |
||||||
|
var row = $("<tr>"); |
||||||
|
$(fancyTableA).find("thead tr:nth-child(1) th").each(function() { |
||||||
|
$("<td>",{ |
||||||
|
html: rWord(8), |
||||||
|
style:"padding:2px;" |
||||||
|
}).appendTo($(row)); |
||||||
|
}); |
||||||
|
row.appendTo($(fancyTableA).find("tbody")); |
||||||
|
} |
||||||
|
fancyTableA.reinit(); |
||||||
|
}); |
||||||
|
// And a simple one |
||||||
|
for(var n=0;n<10;n++){ |
||||||
|
var row = $("<tr>"); |
||||||
|
for(var nn=0;nn<5;nn++){ |
||||||
|
$("<td>",{ |
||||||
|
html: rWord(8), |
||||||
|
style:"padding:2px;" |
||||||
|
}).appendTo($(row)); |
||||||
|
} |
||||||
|
$(row).find("td:last").first().html( moment(new Date(Math.floor(new Date().getTime()*Math.random()))).format('l') ); |
||||||
|
row.appendTo($("#sampleTableB")); |
||||||
|
} |
||||||
|
|
||||||
|
// And one with location data |
||||||
|
$('#getNavigatorLocation').bind("click",function(){ |
||||||
|
window.navigator.geolocation.getCurrentPosition(function(pos) { |
||||||
|
var myLocation = new geotools().position(pos.coords.latitude, pos.coords.longitude); |
||||||
|
$("#sampleTableC").find("tbody tr").each(function() { |
||||||
|
var arr = $(this).find("td").eq(1).html().match(/([\-\d\.]+)/g); |
||||||
|
if(arr.length==2){ |
||||||
|
var dest = new geotools().position(arr[0],arr[1]); |
||||||
|
$(this).find("td").eq(2).html((Math.round(myLocation.distanceTo(dest)/100)/10)+" km"); |
||||||
|
} |
||||||
|
}); |
||||||
|
$('#sampleTableC td:nth-child(3),#sampleTableC th:nth-child(3)').show(); |
||||||
|
$("#sampleTableC")[0].fancyTable.sortColumn=2; |
||||||
|
$("#sampleTableC")[0].fancyTable.sortOrder=1; |
||||||
|
$.fn.fancyTable().tableSort($("#sampleTableC")[0]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
$('#getZipCodeLocation').bind("click",function(){ |
||||||
|
var myLocation = new geotools().position().fromZip($('#zipCode').val()); |
||||||
|
if(!myLocation.latitude){ |
||||||
|
return; |
||||||
|
} |
||||||
|
$("#sampleTableC").find("tbody tr").each(function() { |
||||||
|
var arr = $(this).find("td").eq(1).html().match(/([\-\d\.]+)/g); |
||||||
|
if(arr.length==2){ |
||||||
|
var dest = new geotools().position(arr[0],arr[1]); |
||||||
|
$(this).find("td").eq(2).html((Math.round(myLocation.distanceTo(dest)/100)/10)+" km"); |
||||||
|
} |
||||||
|
}); |
||||||
|
$('#sampleTableC td:nth-child(3),#sampleTableC th:nth-child(3)').show(); |
||||||
|
$("#sampleTableC")[0].fancyTable.sortColumn=2; |
||||||
|
$("#sampleTableC")[0].fancyTable.sortOrder=1; |
||||||
|
$.fn.fancyTable().tableSort($("#sampleTableC")[0]); |
||||||
|
}); |
||||||
|
$('#sampleTableC td:nth-child(2),#sampleTableC th:nth-child(2)').hide(); |
||||||
|
$('#sampleTableC td:nth-child(3),#sampleTableC th:nth-child(3)').hide(); |
||||||
|
|
||||||
|
// And make them fancy |
||||||
|
var fancyTableA = $("#sampleTableA").fancyTable({ |
||||||
|
sortColumn:0, |
||||||
|
pagination: true, |
||||||
|
perPage:5, |
||||||
|
globalSearch:true |
||||||
|
}); |
||||||
|
$("#sampleTableB").fancyTable({ |
||||||
|
pagination: true, |
||||||
|
perPage:5 |
||||||
|
}); |
||||||
|
$("#sampleTableC").fancyTable({ |
||||||
|
searchable: false |
||||||
|
}); |
||||||
|
$("#sampleTableD").fancyTable({ |
||||||
|
searchable: false |
||||||
|
}); |
||||||
|
}); |
||||||
|
</script> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,487 @@ |
|||||||
|
// Copyright 2007 - 2012 Gennadiy Shvets
|
||||||
|
// The program is distributed under the terms of the GNU General
|
||||||
|
// Public License 3.0
|
||||||
|
//
|
||||||
|
// See http://www.allmyscripts.com/Table_Sort/index.html for usage details.
|
||||||
|
|
||||||
|
// Script version 1.9
|
||||||
|
|
||||||
|
var TSort_Store; |
||||||
|
var TSort_All; |
||||||
|
|
||||||
|
function TSort_StoreDef() { |
||||||
|
this.sorting = []; |
||||||
|
this.nodes = []; |
||||||
|
this.rows = []; |
||||||
|
this.row_clones = []; |
||||||
|
this.row_nosort = []; |
||||||
|
this.sort_state = []; |
||||||
|
this.initialized = 0; |
||||||
|
this.append_classes = 0; |
||||||
|
this.n_columns = 3; |
||||||
|
// this.last_sorted = -1;
|
||||||
|
this.history = []; |
||||||
|
this.sort_keys = []; |
||||||
|
this.sort_colors = ['#FF0000', '#800080', '#0000FF']; |
||||||
|
}; |
||||||
|
|
||||||
|
function tsInitOnload() { |
||||||
|
// If TSort_All is not initialized - do it now (simulate old behavior)
|
||||||
|
if (TSort_All == null) |
||||||
|
tsRegister(); |
||||||
|
|
||||||
|
for (var id in TSort_All) { |
||||||
|
tsSetTable(id); |
||||||
|
tsInit(); |
||||||
|
} |
||||||
|
if (window.onload_sort_table) |
||||||
|
window.onload_sort_table(); |
||||||
|
} |
||||||
|
|
||||||
|
function tsInit() { |
||||||
|
|
||||||
|
if (TSort_Data.push == null) |
||||||
|
return; |
||||||
|
var table_id = TSort_Data[0]; |
||||||
|
var table = document.getElementById(table_id); |
||||||
|
// Find thead & tbody data
|
||||||
|
var cols, i, node, len, tr; |
||||||
|
var thead = table.getElementsByTagName('thead')[0]; |
||||||
|
var tbody = table.getElementsByTagName('tbody')[0]; |
||||||
|
if (thead == null) { |
||||||
|
thead = document.createElement('thead'); |
||||||
|
table.insertBefore(thead, tbody); |
||||||
|
tr = tbody.getElementsByTagName('tr'); |
||||||
|
len = tr.length; |
||||||
|
if (len == 0) { |
||||||
|
alert('Cannot find THEAD and TH tags!'); |
||||||
|
return; |
||||||
|
} |
||||||
|
var trh = new Array(); |
||||||
|
for (i = 0; i < len; i++) { |
||||||
|
cols = tr[i].getElementsByTagName('th'); |
||||||
|
if (!cols.length) continue; |
||||||
|
trh.push(tr[i]); |
||||||
|
} |
||||||
|
len = trh.length; |
||||||
|
for (i = 0; i < len; i++) { |
||||||
|
tbody.removeChild(trh[i]); |
||||||
|
thead.appendChild(trh[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
tr = thead.getElementsByTagName('tr'); |
||||||
|
if (tr.length == 0) return; |
||||||
|
if (tr.length > 1) { |
||||||
|
var cols0 = tr[0].getElementsByTagName('th'); |
||||||
|
if (cols0.length == 0) |
||||||
|
cols0 = tr[0].getElementsByTagName('td'); |
||||||
|
var cols1; |
||||||
|
var cols1 = tr[1].getElementsByTagName('th'); |
||||||
|
if (cols1.length == 0) |
||||||
|
cols1 = tr[1].getElementsByTagName('td'); |
||||||
|
cols = new Array(); |
||||||
|
var j0, j1, n; |
||||||
|
len = cols0.length; |
||||||
|
for (j0 = 0, j1 = 0; j0 < len; j0++) { |
||||||
|
node = cols0[j0]; |
||||||
|
n = node.colSpan; |
||||||
|
if (n > 1) { |
||||||
|
while (n > 0) { |
||||||
|
cols.push(cols1[j1++]); |
||||||
|
n--; |
||||||
|
} |
||||||
|
} else { |
||||||
|
if (node.rowSpan == 1) |
||||||
|
j1++; |
||||||
|
cols.push(node); |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
cols = tr[0].getElementsByTagName('th'); |
||||||
|
if (cols.length == 0) |
||||||
|
cols = tr[0].getElementsByTagName('td'); |
||||||
|
} |
||||||
|
var cols_len = cols.length; |
||||||
|
for (var i = 0; i < cols_len; i++) { |
||||||
|
if (i >= TSort_Data.length - 1) |
||||||
|
break; |
||||||
|
node = cols[i]; |
||||||
|
var sorting = TSort_Data[i + 1].toLowerCase(); |
||||||
|
if (sorting == null) sorting = ''; |
||||||
|
TSort_Store.sorting.push(sorting); |
||||||
|
|
||||||
|
if ((sorting != null) && (sorting != '')) { |
||||||
|
// node.tsort_col_id = i;
|
||||||
|
// node.tsort_table_id = table_id;
|
||||||
|
// node.onclick = tsDraw;
|
||||||
|
node.innerHTML = "<a href='' onClick=\"tsDraw(" + i + ",'" + |
||||||
|
table_id + "'); return false\">" + node.innerHTML + |
||||||
|
'</a><b><span id="TS_' + i + '_' + table_id + '"></span></b>'; |
||||||
|
node.style.cursor = "pointer"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Parse body rows
|
||||||
|
var rows = tbody.getElementsByTagName('tr'); |
||||||
|
if (rows.length == 0) return; |
||||||
|
var date = new Date(); |
||||||
|
var text, a, cn, k; |
||||||
|
var attached = TSort_Store.row_nosort; |
||||||
|
for (i = 0, k = -1; i < rows.length; i++) { |
||||||
|
var row = rows[i]; |
||||||
|
cn = row.className; |
||||||
|
if ((cn != null) && (cn.match(/(^| )_nosort( |$)/))) { |
||||||
|
// Save a reference to the TR element
|
||||||
|
var new_row = row.cloneNode(true); |
||||||
|
if (attached[k + 1] == null) |
||||||
|
attached[k + 1] = new Array(new_row); |
||||||
|
else |
||||||
|
attached[k + 1].push(new_row); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
var cols = row.getElementsByTagName('td'); |
||||||
|
len = cols.length; |
||||||
|
var row_data = []; |
||||||
|
for (j = 0; j < len; j++) { |
||||||
|
// Get cell text
|
||||||
|
text = cols[j].innerHTML; |
||||||
|
var sorting = TSort_Store.sorting[j]; |
||||||
|
if (sorting != 's') { |
||||||
|
text = text.replace(/<[^>]+>/g, ''); |
||||||
|
text = text.replace(/\ /, ' '); |
||||||
|
} |
||||||
|
text = text.replace(/^\s+/, ''); |
||||||
|
text = text.replace(/\s+$/, ''); |
||||||
|
if (sorting == 'h') { |
||||||
|
text = text.toLowerCase(); |
||||||
|
} else if (sorting == 's') |
||||||
|
text = text.toLowerCase(); |
||||||
|
else if (sorting == 'i') { |
||||||
|
text = parseInt(text); |
||||||
|
if (isNaN(text)) text = 0; |
||||||
|
} else if (sorting == 'n') { |
||||||
|
text = text.replace(/(\d)\,(?=\d\d\d)/g, "$1"); |
||||||
|
text = parseInt(text); |
||||||
|
if (isNaN(text)) text = 0; |
||||||
|
} else if (sorting == 'c') { |
||||||
|
text = text.replace(/^(\-?)\$/, "$1"); |
||||||
|
text = text.replace(/(\d)\,(?=\d\d\d)/g, "$1"); |
||||||
|
text = parseFloat(text); |
||||||
|
if (isNaN(text)) text = 0; |
||||||
|
} else if (sorting == 'f') { |
||||||
|
text = parseFloat(text); |
||||||
|
if (isNaN(text)) text = 0; |
||||||
|
} else if (sorting == 'g') { |
||||||
|
text = text.replace(/(\d)\,(?=\d\d\d)/g, "$1"); |
||||||
|
text = parseFloat(text); |
||||||
|
if (isNaN(text)) text = 0; |
||||||
|
} else if (sorting == 'd') { |
||||||
|
if (text.match(/^\d\d\d\d\-\d\d?\-\d\d?(?: \d\d?:\d\d?:\d\d?)?$/)) { |
||||||
|
a = text.split(/[\s\-:]/); |
||||||
|
text = (a[3] == null) ? |
||||||
|
Date.UTC(a[0], a[1] - 1, a[2], 0, 0, 0, 0) : |
||||||
|
Date.UTC(a[0], a[1] - 1, a[2], a[3], a[4], a[5], 0); |
||||||
|
} else |
||||||
|
text = Date.parse(text); |
||||||
|
if (isNaN(text)) text = 0; |
||||||
|
} |
||||||
|
row_data.push(text); |
||||||
|
} |
||||||
|
// Initialize the rest of the columns, that are not in <tr>
|
||||||
|
for (; j < cols_len; j++) { |
||||||
|
// Get cell text
|
||||||
|
var sorting = TSort_Store.sorting[j]; |
||||||
|
text = ''; |
||||||
|
if ((sorting == 'h') || (sorting == 's')) |
||||||
|
text = ''; |
||||||
|
else |
||||||
|
text = 0; |
||||||
|
row_data.push(text); |
||||||
|
} |
||||||
|
TSort_Store.rows.push(row_data); |
||||||
|
// Save a reference to the TR element
|
||||||
|
var new_row = row.cloneNode(true); |
||||||
|
k++; |
||||||
|
new_row.tsort_row_id = k; |
||||||
|
TSort_Store.row_clones[k] = new_row; |
||||||
|
} |
||||||
|
TSort_Store.initialized = 1; |
||||||
|
|
||||||
|
if (TSort_Store.cookie) { |
||||||
|
var allc = document.cookie; |
||||||
|
i = allc.indexOf(TSort_Store.cookie + '='); |
||||||
|
if (i != -1) { |
||||||
|
i += TSort_Store.cookie.length + 1; |
||||||
|
len = allc.indexOf(";", i); |
||||||
|
text = decodeURIComponent(allc.substring(i, (len == -1) ? |
||||||
|
allc.length : len)); |
||||||
|
TSort_Store.initial = (text == '') ? null : text.split(/\s*,\s*/); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var initial = TSort_Store.initial; |
||||||
|
if (initial != null) { |
||||||
|
var itype = typeof initial; |
||||||
|
if ((itype == 'number') || (itype == 'string')) |
||||||
|
tsDraw(initial); |
||||||
|
else { |
||||||
|
for (i = initial.length - 1; i >= 0; i--) |
||||||
|
tsDraw(initial[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function tsDraw(p_id, p_table) { |
||||||
|
if (p_table != null) |
||||||
|
tsSetTable(p_table); |
||||||
|
|
||||||
|
if ((TSort_Store == null) || (TSort_Store.initialized == 0)) |
||||||
|
return; |
||||||
|
|
||||||
|
var i = 0; |
||||||
|
var sort_keys = TSort_Store.sort_keys; |
||||||
|
var id; |
||||||
|
var new_order = ''; |
||||||
|
if (p_id != null) { |
||||||
|
if (typeof p_id == 'number') |
||||||
|
id = p_id; |
||||||
|
else if ((typeof p_id == 'string') && (p_id.match(/^\d+[ADU]$/i))) { |
||||||
|
id = p_id.replace(/^(\d+)[ADU]$/i, "$1"); |
||||||
|
new_order = p_id.replace(/^\d+([ADU])$/i, "$1").toUpperCase(); |
||||||
|
} |
||||||
|
} |
||||||
|
if (id == null) { |
||||||
|
id = this.tsort_col_id; |
||||||
|
if ((p_table == null) && (this.tsort_table_id != null)) |
||||||
|
tsSetTable(this.tsort_table_id); |
||||||
|
} |
||||||
|
var table_id = TSort_Data[0]; |
||||||
|
|
||||||
|
var order = TSort_Store.sort_state[id]; |
||||||
|
if (new_order == 'U') { |
||||||
|
if (order != null) { |
||||||
|
TSort_Store.sort_state[id] = null; |
||||||
|
obj = document.getElementById('TS_' + id + '_' + table_id); |
||||||
|
if (obj != null) obj.innerHTML = ''; |
||||||
|
} |
||||||
|
} else if (new_order != '') { |
||||||
|
TSort_Store.sort_state[id] = (new_order == 'A') ? true : false; |
||||||
|
// Add column number to the sort keys array
|
||||||
|
sort_keys.unshift(id); |
||||||
|
i = 1; |
||||||
|
} else { |
||||||
|
if ((order == null) || (order == true)) { |
||||||
|
TSort_Store.sort_state[id] = (order == null) ? true : false; |
||||||
|
// Add column number to the sort keys array
|
||||||
|
sort_keys.unshift(id); |
||||||
|
i = 1; |
||||||
|
} else { |
||||||
|
TSort_Store.sort_state[id] = null; |
||||||
|
obj = document.getElementById('TS_' + id + '_' + table_id); |
||||||
|
if (obj != null) obj.innerHTML = ''; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var len = sort_keys.length; |
||||||
|
// This will either remove the column completely from the sort_keys
|
||||||
|
// array (i = 0) or remove duplicate column number if present (i = 1).
|
||||||
|
while (i < len) { |
||||||
|
if (sort_keys[i] == id) { |
||||||
|
sort_keys.splice(i, 1); |
||||||
|
len--; |
||||||
|
break; |
||||||
|
} |
||||||
|
i++; |
||||||
|
} |
||||||
|
if (len > TSort_Store.n_columns) { |
||||||
|
i = sort_keys.pop(); |
||||||
|
obj = document.getElementById('TS_' + i + '_' + table_id); |
||||||
|
if (obj != null) obj.innerHTML = ''; |
||||||
|
TSort_Store.sort_state[i] = null; |
||||||
|
} |
||||||
|
|
||||||
|
// Sort the rows
|
||||||
|
TSort_Store.row_clones.sort(tsSort); |
||||||
|
|
||||||
|
// Save the currently selected order
|
||||||
|
var new_tbody = document.createElement('tbody'); |
||||||
|
var row_clones = TSort_Store.row_clones; |
||||||
|
len = row_clones.length; |
||||||
|
var classes = TSort_Store.classes; |
||||||
|
var alen, j, cn; |
||||||
|
var arows = TSort_Store.row_nosort[0]; |
||||||
|
if (classes == null) { |
||||||
|
if (arows != null) { |
||||||
|
alen = arows.length; |
||||||
|
for (j = 0; j < alen; j++) |
||||||
|
new_tbody.appendChild(arows[j].cloneNode(true)); |
||||||
|
} |
||||||
|
|
||||||
|
for (i = 0; i < len; i++) { |
||||||
|
row = row_clones[i]; |
||||||
|
new_tbody.appendChild(row.cloneNode(true)); |
||||||
|
arows = TSort_Store.row_nosort[row.tsort_row_id + 1]; |
||||||
|
if (arows == null) continue; |
||||||
|
alen = arows.length; |
||||||
|
for (j = 0; j < alen; j++) |
||||||
|
new_tbody.appendChild(arows[j].cloneNode(true)); |
||||||
|
} |
||||||
|
} else { |
||||||
|
var clone; |
||||||
|
var cl = 0; |
||||||
|
var cl_len = classes.length; |
||||||
|
var append = TSort_Store.append_classes; |
||||||
|
if (arows != null) { |
||||||
|
alen = arows.length; |
||||||
|
for (j = 0; j < alen; j++) { |
||||||
|
clone = arows[j].cloneNode(true); |
||||||
|
cn = clone.className; |
||||||
|
clone.className = ((append) && (cn != null) && (cn.length > 0)) ? |
||||||
|
cn + ' ' + classes[cl] : classes[cl]; |
||||||
|
new_tbody.appendChild(clone); |
||||||
|
} |
||||||
|
cl++; |
||||||
|
if (cl >= cl_len) cl = 0; |
||||||
|
} |
||||||
|
|
||||||
|
for (i = 0; i < len; i++) { |
||||||
|
row = row_clones[i]; |
||||||
|
clone = row.cloneNode(true); |
||||||
|
cn = clone.className; |
||||||
|
clone.className = ((append) && (cn != null) && (cn.length > 0)) ? |
||||||
|
cn + ' ' + classes[cl] : classes[cl]; |
||||||
|
new_tbody.appendChild(clone); |
||||||
|
arows = TSort_Store.row_nosort[row.tsort_row_id + 1]; |
||||||
|
if (arows != null) { |
||||||
|
alen = arows.length; |
||||||
|
for (j = 0; j < alen; j++) { |
||||||
|
clone = arows[j].cloneNode(true); |
||||||
|
cn = clone.className; |
||||||
|
clone.className = ((append) && (cn != null) && (cn.length > 0)) ? |
||||||
|
cn + ' ' + classes[cl] : classes[cl]; |
||||||
|
new_tbody.appendChild(clone); |
||||||
|
} |
||||||
|
} |
||||||
|
cl++; |
||||||
|
if (cl >= cl_len) cl = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Replace table body
|
||||||
|
var table = document.getElementById(table_id); |
||||||
|
var tbody = table.getElementsByTagName('tbody')[0]; |
||||||
|
table.removeChild(tbody); |
||||||
|
table.appendChild(new_tbody); |
||||||
|
|
||||||
|
var obj, color, icon, state; |
||||||
|
len = sort_keys.length; |
||||||
|
var sorting = new Array(); |
||||||
|
for (i = 0; i < len; i++) { |
||||||
|
id = sort_keys[i]; |
||||||
|
obj = document.getElementById('TS_' + id + '_' + table_id); |
||||||
|
if (obj == null) continue; |
||||||
|
state = (TSort_Store.sort_state[id]) ? 0 : 1; |
||||||
|
icon = TSort_Store.icons[state]; |
||||||
|
obj.innerHTML = (icon.match(/</)) ? icon : |
||||||
|
'<font color="' + TSort_Store.sort_colors[i] + '">' + icon + '</font>'; |
||||||
|
sorting.push(id + ((state) ? 'D' : 'A')); |
||||||
|
} |
||||||
|
|
||||||
|
if (TSort_Store.cookie) { |
||||||
|
// Store the contents of "sorting" array into a cookie for 30 days
|
||||||
|
var date = new Date(); |
||||||
|
date.setTime(date.getTime() + 2592000); |
||||||
|
document.cookie = TSort_Store.cookie + "=" + |
||||||
|
encodeURIComponent(sorting.join(',')) + "; expires=" + |
||||||
|
date.toGMTString() + "; path=/"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function tsSort(a, b) { |
||||||
|
var data_a = TSort_Store.rows[a.tsort_row_id]; |
||||||
|
var data_b = TSort_Store.rows[b.tsort_row_id]; |
||||||
|
var sort_keys = TSort_Store.sort_keys; |
||||||
|
var len = sort_keys.length; |
||||||
|
var id; |
||||||
|
var type; |
||||||
|
var order; |
||||||
|
var result; |
||||||
|
for (var i = 0; i < len; i++) { |
||||||
|
id = sort_keys[i]; |
||||||
|
type = TSort_Store.sorting[id]; |
||||||
|
|
||||||
|
var v_a = data_a[id]; |
||||||
|
var v_b = data_b[id]; |
||||||
|
if (v_a == v_b) continue; |
||||||
|
if ((type == 'i') || (type == 'f') || (type == 'd')) |
||||||
|
result = v_a - v_b; |
||||||
|
else |
||||||
|
result = (v_a < v_b) ? -1 : 1; |
||||||
|
order = TSort_Store.sort_state[id]; |
||||||
|
return (order) ? result : 0 - result; |
||||||
|
} |
||||||
|
|
||||||
|
return (a.tsort_row_id < b.tsort_row_id) ? -1 : 1; |
||||||
|
} |
||||||
|
|
||||||
|
function tsRegister() { |
||||||
|
if (typeof TSort_Data == 'undefined') return; |
||||||
|
if (TSort_All == null) |
||||||
|
TSort_All = new Object(); |
||||||
|
|
||||||
|
var ts_obj = new TSort_StoreDef(); |
||||||
|
ts_obj.sort_data = TSort_Data; |
||||||
|
TSort_Data = null; |
||||||
|
if (typeof TSort_Classes != 'undefined') { |
||||||
|
ts_obj.classes = TSort_Classes; |
||||||
|
TSort_Classes = null; |
||||||
|
} |
||||||
|
if (typeof TSort_Initial != 'undefined') { |
||||||
|
ts_obj.initial = TSort_Initial; |
||||||
|
TSort_Initial = null; |
||||||
|
} |
||||||
|
if (typeof TSort_Cookie != 'undefined') { |
||||||
|
ts_obj.cookie = TSort_Cookie; |
||||||
|
TSort_Cookie = null; |
||||||
|
} |
||||||
|
if (typeof TSort_Icons != 'undefined') { |
||||||
|
ts_obj.icons = TSort_Icons; |
||||||
|
TSort_Icons = null; |
||||||
|
} |
||||||
|
if (ts_obj.icons == null) |
||||||
|
ts_obj.icons = new Array("\u2193", "\u2191"); |
||||||
|
if (typeof TSort_AppendClasses != 'undefined') { |
||||||
|
ts_obj.append_classes = TSort_AppendClasses; |
||||||
|
TSort_AppendClasses = null; |
||||||
|
} |
||||||
|
if (typeof TSort_NColumns != 'undefined') { |
||||||
|
ts_obj.n_columns = TSort_NColumns; |
||||||
|
TSort_NColumns = null; |
||||||
|
if (ts_obj.n_columns == null) |
||||||
|
ts_obj.n_columns = 3; |
||||||
|
} |
||||||
|
|
||||||
|
if (ts_obj.sort_data != null) |
||||||
|
TSort_All[ts_obj.sort_data[0]] = ts_obj; |
||||||
|
} |
||||||
|
|
||||||
|
function tsSetTable(p_id) { |
||||||
|
TSort_Store = TSort_All[p_id]; |
||||||
|
if (TSort_Store == null) { |
||||||
|
alert("Cannot set table '" + p_id + "' - table is not registered"); |
||||||
|
return; |
||||||
|
} |
||||||
|
TSort_Data = TSort_Store.sort_data; |
||||||
|
} |
||||||
|
|
||||||
|
if (window.addEventListener) |
||||||
|
window.addEventListener("load", tsInitOnload, false); |
||||||
|
else if (window.attachEvent) |
||||||
|
window.attachEvent("onload", tsInitOnload); |
||||||
|
else { |
||||||
|
if ((window.onload_sort_table == null) && (window.onload != null)) |
||||||
|
window.onload_sort_table = window.onload; |
||||||
|
// Assign new onload function
|
||||||
|
window.onload = tsInitOnload; |
||||||
|
} |
@ -0,0 +1,56 @@ |
|||||||
|
<script type="text/javascript" src="/sort-table.js"></script> |
||||||
|
|
||||||
|
<!-- <style> |
||||||
|
table.js-sort-table.js-sort-asc thead tr>.js-sort-active:not(.js-sort-none):after { |
||||||
|
content: "\25b2"; |
||||||
|
font-size: 0.7em; |
||||||
|
padding-left: 3px; |
||||||
|
line-height: 0.7em; |
||||||
|
} |
||||||
|
|
||||||
|
table.js-sort-table.js-sort-desc thead tr>.js-sort-active:not(.js-sort-none):after { |
||||||
|
content: "\25bc"; |
||||||
|
font-size: 0.7em; |
||||||
|
padding-left: 3px; |
||||||
|
line-height: 0.7em; |
||||||
|
} |
||||||
|
</style> --> |
||||||
|
|
||||||
|
<head> |
||||||
|
</head> |
||||||
|
|
||||||
|
<body> |
||||||
|
<table class="table" id="my_Table" style="border: 1px solid rgb(221, 221, 221);"> |
||||||
|
<tbody> |
||||||
|
<tr> |
||||||
|
<th class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Name</th> |
||||||
|
<th class="ck_border" style="border: 1px solid rgb(221, 221, 221);">here are some words in front date this is more words</th> |
||||||
|
</tr> |
||||||
|
|
||||||
|
<tr> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Alpha</td> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">12/24/1983</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Bravo</td> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">02/23/2014</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Charlie</td> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">10/09/2022</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Delta</td> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">04/03/1968</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Echo</td> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">05/26/1974</td> |
||||||
|
</tr> |
||||||
|
<tr> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">Foxtrot</td> |
||||||
|
<td class="ck_border" style="border: 1px solid rgb(221, 221, 221);">06/16/1997</td> |
||||||
|
</tr> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
</body> |
@ -0,0 +1,33 @@ |
|||||||
|
{ |
||||||
|
"name": "jquery.fancytable", |
||||||
|
"version": "1.0.20", |
||||||
|
"description": "A jQuery plugin for making html tables searchable and sortable with pagination.", |
||||||
|
"main": "dist/fancyTable.min.js", |
||||||
|
"directories": { |
||||||
|
"example": "example" |
||||||
|
}, |
||||||
|
"scripts": { |
||||||
|
"test": "grunt" |
||||||
|
}, |
||||||
|
"repository": { |
||||||
|
"type": "git", |
||||||
|
"url": "git+https://github.com/myspace-nu/jquery.fancyTable.git" |
||||||
|
}, |
||||||
|
"keywords": [ |
||||||
|
"jquery", |
||||||
|
"table", |
||||||
|
"searchable", |
||||||
|
"sortable", |
||||||
|
"pagination" |
||||||
|
], |
||||||
|
"author": "Johan Johansson", |
||||||
|
"license": "MIT", |
||||||
|
"bugs": { |
||||||
|
"url": "https://github.com/myspace-nu/jquery.fancyTable/issues" |
||||||
|
}, |
||||||
|
"homepage": "https://github.com/myspace-nu/jquery.fancyTable#readme", |
||||||
|
"devDependencies": { |
||||||
|
"grunt": "^1.3.0", |
||||||
|
"grunt-contrib-uglify": "^5.0.0" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,327 @@ |
|||||||
|
/** |
||||||
|
* sort-table.js |
||||||
|
* A pure JavaScript (no dependencies) solution to make HTML |
||||||
|
* Tables sortable |
||||||
|
* |
||||||
|
* Copyright (c) 2013 Tyler Uebele |
||||||
|
* Released under the MIT license. See included LICENSE.txt |
||||||
|
* or http://opensource.org/licenses/MIT
|
||||||
|
* |
||||||
|
* latest version available at https://github.com/tyleruebele/sort-table
|
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Sort the rows in a HTML Table |
||||||
|
* |
||||||
|
* @param Table The Table DOM object |
||||||
|
* @param col The zero-based column number by which to sort |
||||||
|
* @param dir Optional. The sort direction; pass 1 for asc; -1 for desc |
||||||
|
* @returns void |
||||||
|
*/ |
||||||
|
function sortTable(Table, col, dir) { |
||||||
|
var sortClass, i; |
||||||
|
|
||||||
|
// get previous sort column
|
||||||
|
sortTable.sortCol = -1; |
||||||
|
sortClass = Table.className.match(/js-sort-\d+/); |
||||||
|
if (null != sortClass) { |
||||||
|
sortTable.sortCol = sortClass[0].replace(/js-sort-/, ''); |
||||||
|
Table.className = Table.className.replace(new RegExp(' ?' + sortClass[0] + '\\b'), ''); |
||||||
|
} |
||||||
|
// If sort column was not passed, use previous
|
||||||
|
if ('undefined' === typeof col) { |
||||||
|
col = sortTable.sortCol; |
||||||
|
} |
||||||
|
|
||||||
|
if ('undefined' !== typeof dir) { |
||||||
|
// Accept -1 or 'desc' for descending. All else is ascending
|
||||||
|
sortTable.sortDir = dir == -1 || dir == 'desc' ? -1 : 1; |
||||||
|
} else { |
||||||
|
// sort direction was not passed, use opposite of previous
|
||||||
|
sortClass = Table.className.match(/js-sort-(a|de)sc/); |
||||||
|
if (null != sortClass && sortTable.sortCol == col) { |
||||||
|
sortTable.sortDir = 'js-sort-asc' == sortClass[0] ? -1 : 1; |
||||||
|
} else { |
||||||
|
sortTable.sortDir = 1; |
||||||
|
} |
||||||
|
} |
||||||
|
Table.className = Table.className.replace(/ ?js-sort-(a|de)sc/g, ''); |
||||||
|
|
||||||
|
// update sort column
|
||||||
|
Table.className += ' js-sort-' + col; |
||||||
|
sortTable.sortCol = col; |
||||||
|
|
||||||
|
// update sort direction
|
||||||
|
Table.className += ' js-sort-' + (sortTable.sortDir == -1 ? 'desc' : 'asc'); |
||||||
|
|
||||||
|
// get sort type
|
||||||
|
if (col < Table.tHead.rows[Table.tHead.rows.length - 1].cells.length) { |
||||||
|
sortClass = Table.tHead.rows[Table.tHead.rows.length - 1].cells[col].className.match(/js-sort-[-\w]+/); |
||||||
|
} |
||||||
|
// Improved support for colspan'd headers
|
||||||
|
for (i = 0; i < Table.tHead.rows[Table.tHead.rows.length - 1].cells.length; i++) { |
||||||
|
if (col == Table.tHead.rows[Table.tHead.rows.length - 1].cells[i].getAttribute('data-js-sort-colNum')) { |
||||||
|
sortClass = Table.tHead.rows[Table.tHead.rows.length - 1].cells[i].className.match(/js-sort-[-\w]+/); |
||||||
|
} |
||||||
|
} |
||||||
|
if (null != sortClass) { |
||||||
|
sortTable.sortFunc = sortClass[0].replace(/js-sort-/, ''); |
||||||
|
} else { |
||||||
|
sortTable.sortFunc = 'string'; |
||||||
|
} |
||||||
|
// Set the headers for the active column to have the decorative class
|
||||||
|
Table.querySelectorAll('.js-sort-active').forEach(function(Node) { |
||||||
|
Node.className = Node.className.replace(/ ?js-sort-active\b/, ''); |
||||||
|
}); |
||||||
|
Table.querySelectorAll('[data-js-sort-colNum="' + col + '"]:not(:empty)').forEach(function(Node) { |
||||||
|
Node.className += ' js-sort-active'; |
||||||
|
}); |
||||||
|
|
||||||
|
// sort!
|
||||||
|
var rows = [], |
||||||
|
TBody = Table.tBodies[0]; |
||||||
|
|
||||||
|
for (i = 0; i < TBody.rows.length; i++) { |
||||||
|
rows[i] = TBody.rows[i]; |
||||||
|
} |
||||||
|
if ('none' != sortTable.sortFunc) { |
||||||
|
rows.sort(sortTable.compareRow); |
||||||
|
} |
||||||
|
|
||||||
|
while (TBody.firstChild) { |
||||||
|
TBody.removeChild(TBody.firstChild); |
||||||
|
} |
||||||
|
for (i = 0; i < rows.length; i++) { |
||||||
|
TBody.appendChild(rows[i]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Compare two table rows based on current settings |
||||||
|
* |
||||||
|
* @param RowA A TR DOM object |
||||||
|
* @param RowB A TR DOM object |
||||||
|
* @returns {number} 1 if RowA is greater, -1 if RowB, 0 if equal |
||||||
|
*/ |
||||||
|
sortTable.compareRow = function(RowA, RowB) { |
||||||
|
var valA, valB; |
||||||
|
if ('function' != typeof sortTable[sortTable.sortFunc]) { |
||||||
|
sortTable.sortFunc = 'string'; |
||||||
|
} |
||||||
|
valA = sortTable[sortTable.sortFunc](RowA.cells[sortTable.sortCol]); |
||||||
|
valB = sortTable[sortTable.sortFunc](RowB.cells[sortTable.sortCol]); |
||||||
|
|
||||||
|
return valA == valB ? 0 : sortTable.sortDir * (valA > valB ? 1 : -1); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Strip all HTML, no exceptions |
||||||
|
* @param html |
||||||
|
* @returns {string} |
||||||
|
*/ |
||||||
|
sortTable.stripTags = function(html) { |
||||||
|
return html.replace(/<\/?[a-z][a-z0-9]*\b[^>]*>/gi, ''); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that converts a table cell (TD) to a comparable value |
||||||
|
* Converts innerHTML to a timestamp, 0 for invalid dates |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns {Number} |
||||||
|
*/ |
||||||
|
sortTable.date = function(Cell) { |
||||||
|
// If okDate library is available, Use it for advanced Date processing
|
||||||
|
if (typeof okDate !== 'undefined') { |
||||||
|
var kDate = okDate(sortTable.stripTags(Cell.innerHTML)); |
||||||
|
return kDate ? kDate.getTime() : 0; |
||||||
|
} else { |
||||||
|
return (new Date(sortTable.stripTags(Cell.innerHTML))).getTime() || 0; |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that converts a table cell (TD) to a comparable value |
||||||
|
* Converts innerHTML to a JS Number object |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns {Number} |
||||||
|
*/ |
||||||
|
sortTable.number = function(Cell) { |
||||||
|
return Number(sortTable.stripTags(Cell.innerHTML).replace(/[^-\d.]/g, '')); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that converts a table cell (TD) to a comparable value |
||||||
|
* Converts innerHTML to a lower case string for insensitive compare |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns {String} |
||||||
|
*/ |
||||||
|
sortTable.string = function(Cell) { |
||||||
|
return sortTable.stripTags(Cell.innerHTML).toLowerCase(); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that converts a table cell (TD) to a comparable value |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns {String} |
||||||
|
*/ |
||||||
|
sortTable.raw = function(Cell) { |
||||||
|
return Cell.innerHTML; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that converts a table cell (TD) to a comparable value |
||||||
|
* Captures the last space-delimited token from innerHTML |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns {String} |
||||||
|
*/ |
||||||
|
sortTable.last = function(Cell) { |
||||||
|
return sortTable.stripTags(Cell.innerHTML).split(' ').pop().toLowerCase(); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that converts a table cell (TD) to a comparable value |
||||||
|
* Captures the value of the first childNode |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns {String} |
||||||
|
*/ |
||||||
|
sortTable.input = function(Cell) { |
||||||
|
for (var i = 0; i < Cell.children.length; i++) { |
||||||
|
if ('object' == typeof Cell.children[i] && |
||||||
|
'undefined' != typeof Cell.children[i].value |
||||||
|
) { |
||||||
|
return Cell.children[i].value.toLowerCase(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return sortTable.string(Cell); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper function that prevents sorting by always returning null |
||||||
|
* |
||||||
|
* @param Cell A TD DOM object |
||||||
|
* @returns null |
||||||
|
*/ |
||||||
|
sortTable.none = function(Cell) { |
||||||
|
return null; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the click handler appropriate to the specified Table and column |
||||||
|
* |
||||||
|
* @param Table Table to sort |
||||||
|
* @param col Column to sort by |
||||||
|
* @returns {Function} Click Handler |
||||||
|
*/ |
||||||
|
sortTable.getClickHandler = function(Table, col) { |
||||||
|
return function() { |
||||||
|
sortTable(Table, col); |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* Attach sortTable() calls to table header cells' onclick events |
||||||
|
* If the table(s) do not have a THead node, one will be created around the |
||||||
|
* first row |
||||||
|
*/ |
||||||
|
sortTable.init = function() { |
||||||
|
|
||||||
|
|
||||||
|
var THead, Tables, Handler; |
||||||
|
if (document.querySelectorAll) { |
||||||
|
Tables = document.querySelectorAll('table.js-sort-table'); |
||||||
|
} else { |
||||||
|
Tables = document.getElementsByTagName('table'); |
||||||
|
} |
||||||
|
|
||||||
|
for (var i = 0; i < Tables.length; i++) { |
||||||
|
// Because IE<8 doesn't support querySelectorAll, skip unclassed tables
|
||||||
|
if (!document.querySelectorAll && null === Tables[i].className.match(/\bjs-sort-table\b/)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
// Prevent repeat processing
|
||||||
|
if (Tables[i].attributes['data-js-sort-table']) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
// Ensure table has a tHead element
|
||||||
|
if (!Tables[i].tHead) { |
||||||
|
THead = document.createElement('thead'); |
||||||
|
THead.appendChild(Tables[i].rows[0]); |
||||||
|
Tables[i].insertBefore(THead, Tables[i].children[0]); |
||||||
|
} else { |
||||||
|
THead = Tables[i].tHead; |
||||||
|
} |
||||||
|
|
||||||
|
// Attach click events to table header
|
||||||
|
for (var rowNum = 0; rowNum < THead.rows.length; rowNum++) { |
||||||
|
for (var cellNum = 0, colNum = 0; cellNum < THead.rows[rowNum].cells.length; cellNum++) { |
||||||
|
// Skip headers marked "js-sort-none"
|
||||||
|
if (THead.rows[rowNum].cells[cellNum].className.match(/\bjs-sort-none\b/)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
// Define which column the header should invoke sorting for
|
||||||
|
THead.rows[rowNum].cells[cellNum].setAttribute('data-js-sort-colNum', colNum); |
||||||
|
Handler = sortTable.getClickHandler(Tables[i], colNum); |
||||||
|
window.addEventListener ? |
||||||
|
THead.rows[rowNum].cells[cellNum].addEventListener('click', Handler) : |
||||||
|
window.attachEvent && THead.rows[rowNum].cells[cellNum].attachEvent('onclick', Handler); |
||||||
|
colNum += THead.rows[rowNum].cells[cellNum].colSpan; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Mark table as processed
|
||||||
|
Tables[i].setAttribute('data-js-sort-table', 'true') |
||||||
|
} |
||||||
|
|
||||||
|
// Add default styles as the first style in head so they can be easily overwritten by user styles
|
||||||
|
var element = document.createElement('style'); |
||||||
|
document.head.insertBefore(element, document.head.childNodes[0]); |
||||||
|
var sheet = element.sheet; |
||||||
|
sheet.insertRule('table.js-sort-table.js-sort-asc thead tr > .js-sort-active:not(.js-sort-none):after {content: "\\25b2";font-size: 0.7em;padding-left: 3px;line-height: 0.7em;}', 0); |
||||||
|
sheet.insertRule('table.js-sort-table.js-sort-desc thead tr > .js-sort-active:not(.js-sort-none):after {content: "\\25bc";font-size: 0.7em;padding-left: 3px;line-height: 0.7em;}', 0); |
||||||
|
}; |
||||||
|
|
||||||
|
// removed for autosort:
|
||||||
|
// Run sortTable.init() when the page loads
|
||||||
|
// window.addEventListener ?
|
||||||
|
// window.addEventListener('load', sortTable.init, true) :
|
||||||
|
// window.attachEvent && window.attachEvent('onload', sortTable.init);
|
||||||
|
// :end removed
|
||||||
|
|
||||||
|
window.onload = function() { |
||||||
|
var mySpans, tables, table; |
||||||
|
|
||||||
|
tables = document.getElementsByTagName("table"); |
||||||
|
mySpans = document.getElementsByTagName('th'); |
||||||
|
|
||||||
|
// sortTable(document.getElementById('my_Table'), 0);
|
||||||
|
for (var g = 0; g < tables.length; g++) { |
||||||
|
tables[g].className += " js-sort-table"; |
||||||
|
} |
||||||
|
|
||||||
|
for (var i = 0; i < mySpans.length; i++) { |
||||||
|
if (mySpans[i].innerHTML.match('[dD]ate')) { |
||||||
|
mySpans[i].className += " js-sort-date"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// modified original code, removed their onLoad sortTable.init in order to autosort tables:
|
||||||
|
sortTable.init(); |
||||||
|
for (var g = 0; g < tables.length; g++) { |
||||||
|
sortTable(tables[g], 0, 1); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// Shim for IE11's lack of NodeList.prototype.forEach
|
||||||
|
if (typeof NodeList.prototype.forEach !== "function") { |
||||||
|
NodeList.prototype.forEach = Array.prototype.forEach; |
||||||
|
} |
Binary file not shown.
@ -0,0 +1,227 @@ |
|||||||
|
/*! |
||||||
|
* jQuery fancyTable plugin |
||||||
|
* https://github.com/myspace-nu
|
||||||
|
* |
||||||
|
* Copyright 2018 Johan Johansson |
||||||
|
* Released under the MIT license |
||||||
|
*/ |
||||||
|
(function($) { |
||||||
|
$.fn.fancyTable = function(options) { |
||||||
|
var settings = $.extend({ |
||||||
|
inputStyle: "", |
||||||
|
inputPlaceholder: "Search...", |
||||||
|
pagination: false, |
||||||
|
paginationClass: "btn btn-light", |
||||||
|
paginationClassActive: "active", |
||||||
|
pagClosest: 3, |
||||||
|
perPage: 10, |
||||||
|
sortable: true, |
||||||
|
searchable: true, |
||||||
|
onInit: function(){ }, |
||||||
|
onUpdate: function(){ }, |
||||||
|
testing: false |
||||||
|
}, options); |
||||||
|
var instance = this; |
||||||
|
this.settings = settings; |
||||||
|
this.tableUpdate = function (elm) { |
||||||
|
elm.fancyTable.matches = 0; |
||||||
|
$(elm).find("tbody tr").each(function() { |
||||||
|
var n=0; |
||||||
|
var match = true; |
||||||
|
var globalMatch = false; |
||||||
|
$(this).find("td").each(function() { |
||||||
|
if(!settings.globalSearch && elm.fancyTable.searchArr[n] && !(new RegExp(elm.fancyTable.searchArr[n],"i").test($(this).html()))){ |
||||||
|
match = false; |
||||||
|
} else if(settings.globalSearch && (!elm.fancyTable.search || (new RegExp(elm.fancyTable.search,"i").test($(this).html())))){ |
||||||
|
if(!Array.isArray(settings.globalSearchExcludeColumns) || !settings.globalSearchExcludeColumns.includes(n+1)){ |
||||||
|
globalMatch = true; |
||||||
|
} |
||||||
|
} |
||||||
|
n++; |
||||||
|
}); |
||||||
|
if((settings.globalSearch && globalMatch) || (!settings.globalSearch && match)){ |
||||||
|
elm.fancyTable.matches++ |
||||||
|
if(!settings.pagination || (elm.fancyTable.matches>(elm.fancyTable.perPage*(elm.fancyTable.page-1)) && elm.fancyTable.matches<=(elm.fancyTable.perPage*elm.fancyTable.page))){ |
||||||
|
$(this).show(); |
||||||
|
} else { |
||||||
|
$(this).hide(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$(this).hide(); |
||||||
|
} |
||||||
|
}); |
||||||
|
elm.fancyTable.pages = Math.ceil(elm.fancyTable.matches/elm.fancyTable.perPage); |
||||||
|
if(settings.pagination){ |
||||||
|
var paginationElement = (elm.fancyTable.paginationElement) ? $(elm.fancyTable.paginationElement) : $(elm).find(".pag"); |
||||||
|
paginationElement.empty(); |
||||||
|
for(var n=1; n<=elm.fancyTable.pages; n++){ |
||||||
|
if(n==1 || (n>(elm.fancyTable.page-(settings.pagClosest+1)) && n<(elm.fancyTable.page+(settings.pagClosest+1))) || n==elm.fancyTable.pages){ |
||||||
|
var a = $("<a>",{ |
||||||
|
html:n, |
||||||
|
"data-n": n, |
||||||
|
style:"margin:0.2em", |
||||||
|
class:settings.paginationClass+" "+((n==elm.fancyTable.page)?settings.paginationClassActive:"") |
||||||
|
}).css("cursor","pointer").bind("click",function(){ |
||||||
|
elm.fancyTable.page = $(this).data("n"); |
||||||
|
instance.tableUpdate(elm); |
||||||
|
}); |
||||||
|
if(n==elm.fancyTable.pages && elm.fancyTable.page<(elm.fancyTable.pages-settings.pagClosest-1)){ |
||||||
|
paginationElement.append($("<span>...</span>")); |
||||||
|
} |
||||||
|
paginationElement.append(a); |
||||||
|
if(n==1 && elm.fancyTable.page>settings.pagClosest+2){ |
||||||
|
paginationElement.append($("<span>...</span>")); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
settings.onUpdate.call(this,elm); |
||||||
|
}; |
||||||
|
this.reinit = function(elm){ |
||||||
|
$(this).each(function(){ |
||||||
|
$(this).find("th a").contents().unwrap(); |
||||||
|
$(this).find("tr.fancySearchRow").remove(); |
||||||
|
}); |
||||||
|
$(this).fancyTable(this.settings); |
||||||
|
}; |
||||||
|
this.tableSort = function (elm) { |
||||||
|
if(typeof elm.fancyTable.sortColumn !== "undefined" && elm.fancyTable.sortColumn < elm.fancyTable.nColumns){ |
||||||
|
$(elm).find("thead th div.sortArrow").each(function(){ |
||||||
|
$(this).remove(); |
||||||
|
}); |
||||||
|
var sortArrow = $("<div>",{"class":"sortArrow"}).css({"margin":"0.1em","display":"inline-block","width":0,"height":0,"border-left":"0.4em solid transparent","border-right":"0.4em solid transparent"}); |
||||||
|
sortArrow.css( |
||||||
|
(elm.fancyTable.sortOrder>0) ? |
||||||
|
{"border-top":"0.4em solid #000"} : |
||||||
|
{"border-bottom":"0.4em solid #000"} |
||||||
|
); |
||||||
|
$(elm).find("thead th a").eq(elm.fancyTable.sortColumn).append(sortArrow); |
||||||
|
var rows = $(elm).find("tbody tr").toArray().sort( |
||||||
|
function(a, b) { |
||||||
|
var elma = $(a).find("td").eq(elm.fancyTable.sortColumn); |
||||||
|
var elmb = $(b).find("td").eq(elm.fancyTable.sortColumn); |
||||||
|
var cmpa = $(elma).data("sortvalue") ? $(elma).data("sortvalue") : elma.html(); |
||||||
|
var cmpb = $(elmb).data("sortvalue") ? $(elmb).data("sortvalue") : elmb.html(); |
||||||
|
if(elm.fancyTable.sortAs[elm.fancyTable.sortColumn] == 'case-insensitive') { |
||||||
|
cmpa = cmpa.toLowerCase(); |
||||||
|
cmpb = cmpb.toLowerCase(); |
||||||
|
} |
||||||
|
if(elm.fancyTable.sortAs[elm.fancyTable.sortColumn] == 'numeric'){ |
||||||
|
return((elm.fancyTable.sortOrder>0) ? parseFloat(cmpa)-parseFloat(cmpb) : parseFloat(cmpb)-parseFloat(cmpa)); |
||||||
|
} else { |
||||||
|
return((cmpa<cmpb)?-elm.fancyTable.sortOrder:(cmpa>cmpb)?elm.fancyTable.sortOrder:0); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
$(elm).find("tbody").empty().append(rows); |
||||||
|
} |
||||||
|
}; |
||||||
|
this.each(function() { |
||||||
|
if($(this).prop("tagName")!=="TABLE"){ |
||||||
|
console.warn("fancyTable: Element is not a table."); |
||||||
|
return true; |
||||||
|
} |
||||||
|
var elm = this; |
||||||
|
elm.fancyTable = { |
||||||
|
nColumns: $(elm).find("td").first().parent().find("td").length, |
||||||
|
nRows : $(this).find("tbody tr").length, |
||||||
|
perPage : settings.perPage, |
||||||
|
page : 1, |
||||||
|
pages : 0, |
||||||
|
matches : 0, |
||||||
|
searchArr : [], |
||||||
|
search : "", |
||||||
|
sortColumn : settings.sortColumn, |
||||||
|
sortOrder : (typeof settings.sortOrder === "undefined") ? 1 : (new RegExp("desc","i").test(settings.sortOrder) || settings.sortOrder == -1) ? -1 : 1, |
||||||
|
sortAs:[], // null, numeric or case-insensitive
|
||||||
|
paginationElement : settings.paginationElement |
||||||
|
}; |
||||||
|
if($(elm).find("tbody").length==0){ |
||||||
|
var content = $(elm).html(); |
||||||
|
$(elm).empty(); |
||||||
|
$(elm).append("<tbody>").append($(content)); |
||||||
|
} |
||||||
|
if($(elm).find("thead").length==0){ |
||||||
|
$(elm).prepend($("<thead>")); |
||||||
|
// Maybe add generated headers at some point
|
||||||
|
//var c=$(elm).find("tr").first().find("td").length;
|
||||||
|
//for(var n=0; n<c; n++){
|
||||||
|
// $(elm).find("thead").append($("<th></th>"));
|
||||||
|
//}
|
||||||
|
} |
||||||
|
if(settings.sortable){ |
||||||
|
var n=0; |
||||||
|
$(elm).find("thead th").each(function() { |
||||||
|
elm.fancyTable.sortAs.push( |
||||||
|
($(this).data('sortas')=='numeric') ? 'numeric' : |
||||||
|
($(this).data('sortas')=='case-insensitive') ? 'case-insensitive' : |
||||||
|
null |
||||||
|
); |
||||||
|
var content = $(this).html(); |
||||||
|
var a = $("<a>",{ |
||||||
|
html:content, |
||||||
|
"data-n": n, |
||||||
|
class:"" |
||||||
|
}).css("cursor","pointer").bind("click",function(){ |
||||||
|
if(elm.fancyTable.sortColumn == $(this).data("n")){ |
||||||
|
elm.fancyTable.sortOrder=-elm.fancyTable.sortOrder; |
||||||
|
} else { |
||||||
|
elm.fancyTable.sortOrder=1; |
||||||
|
} |
||||||
|
elm.fancyTable.sortColumn = $(this).data("n"); |
||||||
|
instance.tableSort(elm); |
||||||
|
instance.tableUpdate(elm); |
||||||
|
}); |
||||||
|
$(this).empty(); |
||||||
|
$(this).append(a); |
||||||
|
n++; |
||||||
|
}); |
||||||
|
} |
||||||
|
if(settings.searchable){ |
||||||
|
var searchHeader = $("<tr>").addClass("fancySearchRow"); |
||||||
|
if(settings.globalSearch){ |
||||||
|
var searchField = $("<input>",{ |
||||||
|
"placeholder": settings.inputPlaceholder, |
||||||
|
style:"width:100%;"+settings.inputStyle |
||||||
|
}).bind("change paste keyup",function(){ |
||||||
|
elm.fancyTable.search = $(this).val(); |
||||||
|
elm.fancyTable.page = 1; |
||||||
|
instance.tableUpdate(elm); |
||||||
|
}); |
||||||
|
var th = $("<th>",{ style:"padding:2px;" }).attr("colspan",elm.fancyTable.nColumns); |
||||||
|
$(searchField).appendTo($(th)); |
||||||
|
$(th).appendTo($(searchHeader)); |
||||||
|
} else { |
||||||
|
var n=0; |
||||||
|
$(elm).find("td").first().parent().find("td").each(function() { |
||||||
|
elm.fancyTable.searchArr.push(""); |
||||||
|
var searchField = $("<input>",{ |
||||||
|
"data-n": n, |
||||||
|
"placeholder": settings.inputPlaceholder, |
||||||
|
style:"width:100%;"+settings.inputStyle |
||||||
|
}).bind("change paste keyup",function(){ |
||||||
|
elm.fancyTable.searchArr[$(this).data("n")] = $(this).val(); |
||||||
|
elm.fancyTable.page = 1; |
||||||
|
instance.tableUpdate(elm); |
||||||
|
}); |
||||||
|
var th = $("<th>",{ style:"padding:2px;" }); |
||||||
|
$(searchField).appendTo($(th)); |
||||||
|
$(th).appendTo($(searchHeader)); |
||||||
|
n++; |
||||||
|
}); |
||||||
|
} |
||||||
|
searchHeader.appendTo($(elm).find("thead")); |
||||||
|
} |
||||||
|
// Sort
|
||||||
|
instance.tableSort(elm); |
||||||
|
if(settings.pagination && !settings.paginationElement){ |
||||||
|
$(elm).find("tfoot").remove(); |
||||||
|
$(elm).append($("<tfoot><tr></tr></tfoot>")); |
||||||
|
$(elm).find("tfoot tr").append($("<td class='pag'></td>",{ }).attr("colspan",elm.fancyTable.nColumns)); |
||||||
|
} |
||||||
|
instance.tableUpdate(elm); |
||||||
|
settings.onInit.call(this,elm); |
||||||
|
}); |
||||||
|
return this; |
||||||
|
}; |
||||||
|
}(jQuery)); |
@ -0,0 +1,67 @@ |
|||||||
|
* { |
||||||
|
-moz-box-sizing: border-box; |
||||||
|
-o-box-sizing: border-box; |
||||||
|
-webkit-box-sizing: border-box; |
||||||
|
box-sizing: border-box; |
||||||
|
} |
||||||
|
body { |
||||||
|
color: #333; |
||||||
|
font-size: 1em; |
||||||
|
} |
||||||
|
a:link, |
||||||
|
a:visited, |
||||||
|
a:hover, |
||||||
|
a:active { |
||||||
|
color: #000; |
||||||
|
text-decoration: none; |
||||||
|
} |
||||||
|
.container { |
||||||
|
margin: 50px auto; |
||||||
|
padding: 0 50px; |
||||||
|
max-width: 960px; |
||||||
|
} |
||||||
|
table { |
||||||
|
background: #FFF; |
||||||
|
border-collapse: collapse; |
||||||
|
/* width: 100%; */ |
||||||
|
} |
||||||
|
td, |
||||||
|
th { |
||||||
|
padding: 4px; |
||||||
|
border: 1px solid #CCC; |
||||||
|
overflow: hidden; |
||||||
|
text-align: left; |
||||||
|
vertical-align: middle; |
||||||
|
} |
||||||
|
th { |
||||||
|
background-color: #DDD; |
||||||
|
font-weight: 400; |
||||||
|
} |
||||||
|
th a, |
||||||
|
td a { |
||||||
|
display: block; |
||||||
|
/* width: 100%; */ |
||||||
|
} |
||||||
|
th a.sort-by { |
||||||
|
padding-right: 18px; |
||||||
|
position: relative; |
||||||
|
} |
||||||
|
a.sort-by:before, |
||||||
|
a.sort-by:after { |
||||||
|
border: 4px solid transparent; |
||||||
|
content: ""; |
||||||
|
display: block; |
||||||
|
height: 0; |
||||||
|
right: 5px; |
||||||
|
top: 50%; |
||||||
|
position: absolute; |
||||||
|
width: 0; |
||||||
|
} |
||||||
|
a.sort-by:before { |
||||||
|
border-bottom-color: #666; |
||||||
|
margin-top: -9px; |
||||||
|
} |
||||||
|
a.sort-by:after { |
||||||
|
border-top-color: #666; |
||||||
|
margin-top: 1px; |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
window.onload = function() { |
||||||
|
var arrows, headers, header; |
||||||
|
|
||||||
|
headers = document.getElementsByTagName("th"); |
||||||
|
|
||||||
|
for (var g = 0; g < headers.length; g++) { |
||||||
|
arrows = document.createElement('a'); |
||||||
|
arrows.href = "#"; |
||||||
|
arrows.className = "sort-by"; |
||||||
|
headers[g].appendChild(arrows); |
||||||
|
headers[g].onclick = sortTable(g); |
||||||
|
headers[g].onkeypress = sortTable(g); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function sortTable(n) { |
||||||
|
const getCellValue = (tr, idx) => tr.children[idx].innerText || tr.children[idx].textContent; |
||||||
|
|
||||||
|
const comparer = (idx, asc) => (a, b) => ((v1, v2) => |
||||||
|
v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2) |
||||||
|
)(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx)); |
||||||
|
|
||||||
|
// do the work...
|
||||||
|
document.querySelectorAll('th').forEach(th => th.addEventListener('click', (() => { |
||||||
|
const table = th.closest('table'); |
||||||
|
Array.from(table.querySelectorAll('tr:nth-child(n+2)')) |
||||||
|
.sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc)) |
||||||
|
.forEach(tr => table.appendChild(tr)); |
||||||
|
}))); |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
<table class="table table-bordered" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" data-darkreader-inline-border-right="" data-darkreader-inline-border-top="" style="border: 1px solid rgb(221, 221, 221); --darkreader-inline-border-top:#3a3e41; --darkreader-inline-border-right:#3a3e41; --darkreader-inline-border-bottom:#3a3e41; --darkreader-inline-border-left:#3a3e41;"> |
||||||
|
<tbody> |
||||||
|
<tr> |
||||||
|
<td class="ck_border" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" data-darkreader-inline-border-right="" data-darkreader-inline-border-top="" style="border: 1px solid rgb(221, 221, 221); --darkreader-inline-border-top:#3a3e41; --darkreader-inline-border-right:#3a3e41; --darkreader-inline-border-bottom:#3a3e41; --darkreader-inline-border-left:#3a3e41;">Name;</td> |
||||||
|
<td class="ck_border" data-darkreader-inline-border-bottom="" data-darkreader-inline-border-left="" data-darkreader-inline-border-right="" data-darkreader-inline-border-top="" style="border: 1px solid rgb(221, 221, 221); --darkreader-inline-border-top:#3a3e41; --darkreader-inline-border-right:#3a3e41; --darkreader-inline-border-bottom:#3a3e41; --darkreader-inline-border-left:#3a3e41;">Date</td> |
||||||
|
</tr> |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
|
||||||
|
<p> </p> |
Loading…
Reference in new issue