Filter: add filter_childByColumn option. Fixes #396 & #574

This commit is contained in:
Mottie 2015-05-14 21:32:41 -05:00
parent 65d48727ff
commit 9a67c022c4
10 changed files with 664 additions and 382 deletions

File diff suppressed because one or more lines are too long

View File

@ -16,29 +16,53 @@
<!-- Tablesorter: required -->
<link rel="stylesheet" href="../css/theme.blue.css">
<script src="../js/jquery.tablesorter.js"></script>
<script src="../js/jquery.tablesorter.widgets.js"></script>
<!-- <script src="../js/jquery.tablesorter.widgets.js"></script> -->
<script src="../js/widgets/widget-storage.js"></script>
<script src="../js/widgets/widget-filter.js"></script>
<!-- Tablesorter: pager -->
<link rel="stylesheet" href="../addons/pager/jquery.tablesorter.pager.css">
<script src="../js/widgets/widget-pager.js"></script>
<script id="js">$(function() {
<style id="css">/* use class names to hide content for jQuery v3.0 - see https://github.com/jquery/jquery/issues/2308 */
.hidden { display: none; }
$(".tablesorter")
/* override child row hovering defined in the theme file */
#table2 tbody > tr.even.hover > td,
#table2 tbody > tr.even:hover > td,
#table2 tbody > tr.even:hover + tr.tablesorter-childRow > td,
#table2 tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #fff;
}
#table2 tbody > tr.odd.hover > td,
#table2 tbody > tr.odd:hover > td,
#table2 tbody > tr.odd:hover + tr.tablesorter-childRow > td,
#table2 tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #ebf2fa;
}
#table2 tbody > tr.even:hover > td,
#table2 tbody > tr.odd:hover > td {
background-color: #d9d9d9;
}
</style>
<script id="js">$( function() {
var $table1 = $( '#table1' )
.tablesorter({
theme : 'blue',
// this is the default setting
cssChildRow: "tablesorter-childRow",
cssChildRow : "tablesorter-childRow",
// initialize zebra and filter widgets
widgets: ["zebra", "filter", "pager"],
widgets : [ "zebra", "filter", "pager" ],
widgetOptions: {
// output default: '{page}/{totalPages}'
// possible variables: {page}, {totalPages}, {filteredPages}, {startRow}, {endRow}, {filteredRows} and {totalRows}
pager_output: '{startRow} - {endRow} / {filteredRows} ({totalRows})', // '{page}/{totalPages}'
pager_removeRows: false,
pager_output: '{startRow} - {endRow} / {filteredRows} ({totalRows})',
pager_removeRows: false,
// include child row content while filtering, if true
filter_childRows : true,
@ -46,35 +70,107 @@
filter_cssFilter : 'tablesorter-filter',
// search from beginning
filter_startsWith : false,
// Set this option to false to make the searches case sensitive
// Set this option to false to make the searches case sensitive
filter_ignoreCase : true
}
});
// hide child rows
$('.tablesorter-childRow td').hide();
// hide child rows - get in the habit of not using .hide()
// See http://jsfiddle.net/Mottie/u507846y/ & https://github.com/jquery/jquery/issues/1767
// and https://github.com/jquery/jquery/issues/2308
// This won't be a problem in jQuery v3.0+
$table1.find( '.tablesorter-childRow td' ).addClass( 'hidden' );
// Toggle child row content (td), not hiding the row since we are using rowspan
// Using delegate because the pager plugin rebuilds the table after each page change
// "delegate" works in jQuery 1.4.2+; use "live" back to v1.3; for older jQuery - SOL
$('.tablesorter').delegate('.toggle', 'click' ,function(){
$table1.delegate( '.toggle', 'click' ,function() {
// use "nextUntil" to toggle multiple child rows
// toggle table cells instead of the row
$(this).closest('tr').nextUntil('tr.tablesorter-hasChildRow').find('td').toggle();
$( this )
.closest( 'tr' )
.nextUntil( 'tr.tablesorter-hasChildRow' )
.find( 'td' )
.toggleClass( 'hidden' );
return false;
});
// Toggle widgetFilterChildRows option
$('button.toggle-option').click(function(){
var c = $('.tablesorter')[0].config.widgetOptions,
o = !c.filter_childRows;
c.filter_childRows = o;
$('.state').html(o.toString());
// Toggle filter_childRows option
$( 'button.toggle-combined' ).click( function() {
var wo = $table1[0].config.widgetOptions,
o = !wo.filter_childRows;
wo.filter_childRows = o;
$( '.state1' ).html( o.toString() );
// update filter; include false parameter to force a new search
$('table').trigger('search', false);
$table1.trigger( 'search', false );
return false;
});
});</script>
<script id="js2">$(function() {
var $table2 = $( '#table2' )
.tablesorter({
theme : 'blue',
// this is the default setting
cssChildRow : 'tablesorter-childRow',
// initialize zebra and filter widgets
widgets : [ 'zebra', 'filter' ],
widgetOptions : {
// include child row content while filtering, if true
filter_childRows : true,
// filter child row content by column; filter_childRows must also be true
filter_childByColumn : true,
// class name applied to filter row and each input
filter_cssFilter : 'tablesorter-filter',
// Set this option to false to make the searches case sensitive
filter_ignoreCase : true,
filter_reset: '.reset'
}
});
// hide child rows - don't use .hide() because filtered rows get a "filtered" class
// added to them, and style="display: table-row;" will override this class
// See http://jsfiddle.net/Mottie/u507846y/ & https://github.com/jquery/jquery/issues/1767
// and https://github.com/jquery/jquery/issues/2308
// This won't be a problem in jQuery v3.0+
$table2.find( '.tablesorter-childRow' ).addClass( 'hidden' );
// Toggle child row content (td), not hiding the row since we are using rowspan
// Using delegate because the pager plugin rebuilds the table after each page change
// "delegate" works in jQuery 1.4.2+; use "live" back to v1.3; for older jQuery - SOL
$table2.delegate( '.toggle', 'click' ,function() {
// use "nextUntil" to toggle multiple child rows
// toggle table cells instead of the row
$( this )
.closest( 'tr' )
.nextUntil( 'tr.tablesorter-hasChildRow' )
.toggleClass( 'hidden' );
return false;
});
// Toggle filter_childByColumn option
$( 'button.toggle-byColumn' ).click(function(){
var wo = $table2[0].config.widgetOptions,
o = !wo.filter_childByColumn;
wo.filter_childByColumn = o;
$('.state2').html( o.toString() );
// update filter; include false parameter to force a new search
$table2.trigger('search', false);
return false;
});
// make demo search buttons work
$( 'button[data-column]' ).on( 'click', function() {
var $this = $( this ),
totalColumns = $table2[0].config.columns,
col = $this.data( 'column' ), // zero-based index or "all"
filter = [];
// text to add to filter
filter[ col === 'all' ? totalColumns : col ] = $this.text();
$table2.trigger( 'search', [ filter ] );
return false;
});
@ -91,32 +187,40 @@
<div id="main">
<p class="tip">
<em>NOTE!</em>
<div class="tip">
<p><em>NOTE!</em></p>
<ul>
<li>Click the link in the Order # column to reveal the hidden child row cells (<a href="http://www.pengoworks.com/workshop/jquery/tablesorter/tablesorter.htm">original demo</a>). This option is available in the original plugin.</li>
<li>The filter widget will work with the original tablesorter plugin, just include the jquery.tablesorter.widget.js file and initialize the widget as seen below.</li>
<li><del>Combining the filter widget and pager plugin will not work as expected</del>.</li>
<li><span class="version">v2.21.6</span>,
<ul>
<li>Added <code>filter_childByColumn</code> to allow filtering to work on child row columns. See the <a href="#child-by-column">By Column</a> demo below.</li>
<li>Extra white-space was added after each line in the child row content to account for the loss of white-space which occurs while processing cell content using <code>textContent</code>.</li>
<li><span class="label warning">*NOTE*</span> Start getting in the habit of using a class name to hide content as <strong>jQuery 3.0+ will likely change how <code>show()</code> &amp; <code>hide()</code> work</strong> (<a href="https://github.com/jquery/jquery/issues/2308">ref</a>).</li>
</ul>
<p></p>
</li>
<li>As of <span class="version updated">v2.15.12</span>,
<ul>
<li>This demo includes the pager widget.</li>
<li>For now, when combining the filter widget with pager, ensure the <code>removeRows</code> option is set to <code>false</code>.</li>
<li>Parents of child rows now have a <code>tablesorter-hasChildRow</code> class name added.</li>
<li>The last row of each page now includes any child rows. For example, on page 1, click on the "SO71783" row link and the associated child row will now show, as it should</li>
<li><span class="label label-info">NOTE!</span> A new css definition was added to every default theme; the "filtered" class name (set by the <code>filter_filteredRow</code> widgetOption) has been added to properly hide/show child rows when filtered.</li>
<li>The additional code to always hide child row cells on <code>pagerChange</code> is no longer needed.</li>
</ul>
</li>
<li>Click the link in the Order # column to reveal the hidden child row cells (<a href="http://www.pengoworks.com/workshop/jquery/tablesorter/tablesorter.htm">original demo</a>). This option is available in the original plugin.</li>
<li>The filter widget will <strong>NOT work</strong> with the original tablesorter plugin.</li>
</ul>
<p>
</div>
<h1>Demo</h1>
<br>
<button type="button" class="toggle-option">Toggle Child Row Content</button> : <span class="state">true</span>
Filter Child Row: <a href="#combined">Combined/Disabled</a> | <a href="#child-by-column">By Column</a>
<p></p>
<h3 id="combined">Combined Child Row Content</h3>
<button type="button" class="toggle-combined">Toggle</button> <code>filter_childRows</code> : <span class="state1">true</span>
<ul>
<li>If true, the child row content is included in ALL filters. Enter "cal" (california) in any column filter and the same rows show up.</li>
<li>When false, child row content is ignored. Enter "cal" and no rows will be found.</li>
<li>If true, the child row content is included in ALL filters. Enter "cali" (california) in any column filter and the same rows show up.</li>
<li>When false, child row content is ignored. Enter "cali" and no rows will be found.</li>
</ul>
<div class="pager">
@ -134,7 +238,7 @@
<select class="gotoPage" title="Select page number"></select>
</div>
<table class="tablesorter">
<table id="table1">
<colgroup>
<col width="85" />
<col width="250" />
@ -162,230 +266,230 @@
<td>Jul 20, 2007</td>
<td>$972.78</td>
</tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>99700 Bell Road<br>Auburn, California 95603</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>99700 Bell Road <br>Auburn, California 95603</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71775</a></td><td>Cycle Clearance</td><td>PO58159451</td><td>May 6, 2007</td><td>$2,313.13</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>2255 254th Avenue Se<br>Albany, Oregon 97321</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>2255 254th Avenue Se <br>Albany, Oregon 97321</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71776</a></td><td>West Side Mart</td><td>PO19952192051</td><td>May 12, 2007</td><td>$87.09</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>251 The Metro Center<br>Wokingham, England RG41 1QW</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>251 The Metro Center <br>Wokingham, England RG41 1QW</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71777</a></td><td>Demand Distributors</td><td>PO20097113391</td><td>Apr 26, 2007</td><td>$1,267.82</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Judy</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>25102 Springwater<br>Wenatchee, Washington 98801</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Judy</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>25102 Springwater <br>Wenatchee, Washington 98801</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71778</a></td><td>Purchase Mart</td><td>PO19894146890</td><td>Apr 18, 2007</td><td>$1,503.98</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Wrentham Village<br>Wrentham, Massachusetts 02093</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Wrentham Village <br>Wrentham, Massachusetts 02093</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71779</a></td><td>Initial Bike Company</td><td>PO19633118218</td><td>Dec 20, 2007</td><td>$48,425.55</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>789 West Alameda<br>Westminster, Colorado 80030</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>789 West Alameda <br>Westminster, Colorado 80030</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71780</a></td><td>Nearby Cycle Shop</td><td>PO19604173239</td><td>Aug 29, 2007</td><td>$42,452.65</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Burgess Hill<br>Edward Way<br>West Sussex, England RH15 9UD</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Burgess Hill <br>Edward Way <br>West Sussex, England RH15 9UD</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71781</a></td><td>Sundry Sporting Goods</td><td>PO19401117806</td><td>Mar 9, 2008</td><td>$29,262.41</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Rudolph</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>595 Burning Street<br>Vancouver, British Columbia V7L 4J4</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Rudolph</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>595 Burning Street <br>Vancouver, British Columbia V7L 4J4</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71782</a></td><td>Professional Sales and Service</td><td>PO19372114749</td><td>Jul 27, 2007</td><td>$43,962.79</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>57251 Serene Blvd<br>Van Nuys, California 91411</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>57251 Serene Blvd <br>Van Nuys, California 91411</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71783</a></td><td>Eastside Department Store</td><td>PO19343113609</td><td>May 15, 2007</td><td>$92,663.56</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>9992 Whipple Rd<br>Union City, California 94587</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>9992 Whipple Rd <br>Union City, California 94587</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71784</a></td><td>Action Bicycle Specialists</td><td>PO19285135919</td><td>Nov 30, 2007</td><td>$119,960.82</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Warrington Ldc Unit 25/2<br>Woolston, England WA1 4SY</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Warrington Ldc Unit 25/2 <br>Woolston, England WA1 4SY</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71785</a></td><td>Metro Cycle Shop</td><td>PO19169115427</td><td>Feb 1, 2008</td><td>$39,805.12</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Henry</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>2507 Pacific Ave S<br>Tacoma, Washington 98403</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Henry</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>2507 Pacific Ave S <br>Tacoma, Washington 98403</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71786</a></td><td>Greater Bike Store</td><td>PO17690128583</td><td>Dec 7, 2007</td><td>$4,657.19</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>55 Lakeshore Blvd East<br>Toronto, Ontario M4B 1V6</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>55 Lakeshore Blvd East <br>Toronto, Ontario M4B 1V6</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71787</a></td><td>Fun Toys and Bikes</td><td>PO18038111279</td><td>Jun 1, 2007</td><td>$38,211.11</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6500 East Grant Road<br>Tucson, Arizona 85701</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6500 East Grant Road <br>Tucson, Arizona 85701</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71788</a></td><td>Reliable Retail Center</td><td>PO17951176595</td><td>Jul 10, 2007</td><td>$1,806.12</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>609 Evans Avenue<br>Toronto, Ontario M4B 1V4</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>609 Evans Avenue <br>Toronto, Ontario M4B 1V4</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71789</a></td><td>Eastside Parts Shop</td><td>PO17516128941</td><td>May 22, 2007</td><td>$143.50</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Andrew</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>7000 Victoria Park Avenue<br>Toronto, Ontario M4B 1V4</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Andrew</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>7000 Victoria Park Avenue <br>Toronto, Ontario M4B 1V4</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71790</a></td><td>Successful Sales Company</td><td>PO17487184338</td><td>Apr 15, 2007</td><td>$5,306.48</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>7009 Sw Hall Blvd.<br>Tigard, Oregon 97223</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>7009 Sw Hall Blvd. <br>Tigard, Oregon 97223</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71791</a></td><td>Convenient Sales and Service</td><td>PO17139191080</td><td>Nov 14, 2007</td><td>$26,692.85</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>950 Gateway Street<br>Springfield, Oregon 97477</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>950 Gateway Street <br>Springfield, Oregon 97477</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71792</a></td><td>Corner Bicycle Supply</td><td>PO17545115036</td><td>Mar 17, 2008</td><td>$67,683.32</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>2511 Baker Road<br>Toronto, Ontario M4B 1V7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>2511 Baker Road <br>Toronto, Ontario M4B 1V7</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71793</a></td><td>Mountain Toy Store</td><td>PO17226152414</td><td>Sep 5, 2007</td><td>$1,943.93</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Marvin</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>First Colony Mall<br>Sugar Land, Texas 77478</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Marvin</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>First Colony Mall <br>Sugar Land, Texas 77478</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71794</a></td><td>Vigorous Exercise Company</td><td>PO17574111985</td><td>Dec 14, 2007</td><td>$87,770.74</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>9950 Ferrand Drive, 9th Floor<br>Toronto, Ontario M4B 1V4</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>9950 Ferrand Drive, 9th Floor <br>Toronto, Ontario M4B 1V4</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71795</a></td><td>Bike Part Wholesalers</td><td>PO17371184627</td><td>Feb 6, 2008</td><td>$41,224.10</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>254a Baker Street<br>Botany<br>Sydney, New South Wales 1002</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>254a Baker Street <br>Botany <br>Sydney, New South Wales 1002</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71796</a></td><td>Extreme Riding Supplies</td><td>PO17052159664</td><td>Jul 13, 2007</td><td>$63,686.27</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Riverside<br>Sherman Oaks, California 91403</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Riverside <br>Sherman Oaks, California 91403</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71797</a></td><td>Riding Cycles</td><td>PO16501134889</td><td>Dec 2, 2007</td><td>$86,222.81</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Jon</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Galashiels<br>Liverpool, England L4 4HB</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Jon</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Galashiels <br>Liverpool, England L4 4HB</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71798</a></td><td>Work and Play Association</td><td>PO16994135863</td><td>Jan 20, 2008</td><td>$40,048.63</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>2533 Eureka Rd.<br>Southgate, Michigan 48195</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>2533 Eureka Rd. <br>Southgate, Michigan 48195</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71799</a></td><td>Metro Sports Equipment</td><td>PO15486196616</td><td>Oct 18, 2007</td><td>$23,080.67</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6, rue des Pyrenees<br>Saint Ouen, Loir et Cher 41100</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6, rue des Pyrenees <br>Saint Ouen, Loir et Cher 41100</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71800</a></td><td>Quick Parts and Service</td><td>PO15544127760</td><td>Feb 19, 2008</td><td>$37,253.44</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>99954 Boul. Laurier, Local 060, Place<br>Sainte-Foy, Quebec G1W</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>99954 Boul. Laurier, Local 060, Place <br>Sainte-Foy, Quebec G1W</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71801</a></td><td>Getaway Inn</td><td>PO15515173664</td><td>Mar 6, 2008</td><td>$47,720.54</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Min</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>54, avenue des Ternes<br>Saint Ouen, Loir et Cher 41100</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Min</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>54, avenue des Ternes <br>Saint Ouen, Loir et Cher 41100</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71802</a></td><td>Blue-Ribbon Bike Company</td><td>PO15457184141</td><td>Sep 22, 2007</td><td>$42,013.42</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>790 Shelbyville Road<br>Saint Matthews, Kentucky 40207</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>790 Shelbyville Road <br>Saint Matthews, Kentucky 40207</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71803</a></td><td>World of Bikes</td><td>PO15341174104</td><td>Mar 1, 2008</td><td>$43,964.97</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>660 Lindbergh<br>Saint Louis, Missouri 63103</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>660 Lindbergh <br>Saint Louis, Missouri 63103</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71804</a></td><td>Bikes for Two</td><td>PO14906114459</td><td>Aug 18, 2007</td><td>$2,431.21</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>63 West Beaver Creek<br>Richmond Hill, Ontario L4E 3M5</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>63 West Beaver Creek <br>Richmond Hill, Ontario L4E 3M5</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71805</a></td><td>Nationwide Supply</td><td>PO14703194514</td><td>Jun 27, 2007</td><td>$76,535.55</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Pilar</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>4250 Concord Road<br>Rhodes, New South Wales 2138</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Pilar</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>4250 Concord Road <br>Rhodes, New South Wales 2138</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71806</a></td><td>Valley Toy Store</td><td>PO14790111844</td><td>Jun 2, 2007</td><td>$20,261.90</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>252851 Rowan Place<br>Richmond, British Columbia V6B 3P7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>252851 Rowan Place <br>Richmond, British Columbia V6B 3P7</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71807</a></td><td>Courteous Bicycle Specialists</td><td>PO14935135211</td><td>Oct 28, 2007</td><td>$656.84</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>995 Crescent<br>Richmond Hill, Ontario L4E 3M5</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>995 Crescent <br>Richmond Hill, Ontario L4E 3M5</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71808</a></td><td>Odometers and Accessories Company</td><td>PO14761198562</td><td>Oct 28, 2007</td><td>$42,231.51</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>253711 Mayfield Place, Unit 150<br>Richmond, British Columbia V6B 3P7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>253711 Mayfield Place, Unit 150 <br>Richmond, British Columbia V6B 3P7</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71809</a></td><td>Fitness Bike Accessories</td><td>PO14645153239</td><td>Jan 12, 2008</td><td>$3,743.42</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: John</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Level 7<br>114 Albert Road<br>Rhodes, New South Wales 2138</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: John</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Level 7 <br>114 Albert Road <br>Rhodes, New South Wales 2138</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71810</a></td><td>Two-Seater Bikes</td><td>PO13804148315</td><td>May 27, 2007</td><td>$1,093.53</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>5700 Legacy Dr<br>Plano, Texas 75074</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>5700 Legacy Dr <br>Plano, Texas 75074</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71811</a></td><td>Racing Toys</td><td>PO13717180066</td><td>Feb 26, 2008</td><td>$3,493.04</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>9228 Via Del Sol<br>Phoenix, Arizona 85004</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>9228 Via Del Sol <br>Phoenix, Arizona 85004</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71812</a></td><td>Fashionable Bikes and Accessories</td><td>PO13543115747</td><td>Apr 28, 2007</td><td>$35,146.04</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Sports Store At Park City<br>Park City, Utah 84098</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Sports Store At Park City <br>Park City, Utah 84098</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71813</a></td><td>Liquidation Sales</td><td>PO13630186295</td><td>Jan 17, 2008</td><td>$12,707.47</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Jenny</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>No. 6<br>Millenium Court<br>Perth, South Australia 6006</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Jenny</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>No. 6 <br>Millenium Court <br>Perth, South Australia 6006</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71814</a></td><td>Our Sporting Goods Store</td><td>PO12818173864</td><td>May 31, 2007</td><td>$7,517.54</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6030 Conroy Road<br>Ottawa, Ontario K4B 1S3</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6030 Conroy Road <br>Ottawa, Ontario K4B 1S3</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71815</a></td><td>Thrifty Parts and Sales</td><td>PO13021155785</td><td>Jan 1, 2008</td><td>$1,261.44</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Oxnard Outlet<br>Oxnard, California 93030</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Oxnard Outlet <br>Oxnard, California 93030</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71816</a></td><td>Engineered Bike Systems</td><td>PO12992180445</td><td>Jul 29, 2007</td><td>$3,754.97</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>123 Camelia Avenue<br>Oxnard, California 93030</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>123 Camelia Avenue <br>Oxnard, California 93030</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71817</a></td><td>Home Town Bike Store</td><td>PO12905185178</td><td>May 21, 2007</td><td>$689.96</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Danielle</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>955 Green Valley Crescent<br>Ottawa, Ontario K4B 1S1</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Danielle</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>955 Green Valley Crescent <br>Ottawa, Ontario K4B 1S1</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71818</a></td><td>Utilitarian Sporting Goods</td><td>PO12470139718</td><td>Apr 25, 2007</td><td>$61,356.31</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>4635 S. Harrison Blvd.<br>Ogden, Utah 84401</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>4635 S. Harrison Blvd. <br>Ogden, Utah 84401</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71819</a></td><td>Fabrikam Inc., West</td><td>PO12354153257</td><td>May 19, 2007</td><td>$41,746.15</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>46460 West Oaks Drive<br>Novi, Michigan 48375</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>46460 West Oaks Drive <br>Novi, Michigan 48375</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71820</a></td><td>Racing Sales and Service</td><td>PO12673129941</td><td>Apr 26, 2007</td><td>$68,686.02</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>510, avenue de Villiers<br>Orleans, Loiret 45000</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>510, avenue de Villiers <br>Orleans, Loiret 45000</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71821</a></td><td>Bike Goods </td><td>PO11977190694</td><td>May 25, 2007</td><td>$5,904.88</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Gary</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>254075 Biscayne Blvd.<br>North Miami Beach, Florida 33162</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Gary</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>254075 Biscayne Blvd. <br>North Miami Beach, Florida 33162</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71822</a></td><td>Popular Bike Lines</td><td>PO11774139099</td><td>Dec 19, 2007</td><td>$31,191.60</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Level 7<br>80 Arthur Street<br>Newcastle, New South Wales 2300</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Level 7 <br>80 Arthur Street <br>Newcastle, New South Wales 2300</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71823</a></td><td>Enterprise Center</td><td>PO11310159994</td><td>Sep 7, 2007</td><td>$2,818.81</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Kurfürstenstr 574<br>München, Hessen 80074</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Kurfürstenstr 574 <br>München, Hessen 80074</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71824</a></td><td>Outdoor Equipment Store</td><td>PO11455162600</td><td>Oct 29, 2007</td><td>$115,117.41</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6 Cotton Road<br>Nashua, New Hampshire 03064</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6 Cotton Road <br>Nashua, New Hampshire 03064</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71825</a></td><td>One Bike Company</td><td>PO11165197222</td><td>Dec 28, 2007</td><td>$4,824.62</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Shanay</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>5 place Ville-Marie<br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Shanay</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>5 place Ville-Marie <br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71826</a></td><td>Rodeway Bike Store</td><td>PO11397155355</td><td>Oct 29, 2007</td><td>$40,083.06</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Winterfeldtstr 5557<br>Kreditorenbuchhaltung<br>Münster, Saarland 48001</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Winterfeldtstr 5557 <br>Kreditorenbuchhaltung <br>Münster, Saarland 48001</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71827</a></td><td>Metal Processing Company</td><td>PO11107195325</td><td>Aug 22, 2007</td><td>$9,247.52</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>770 Notre Datme Quest Bureau 800<br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>770 Notre Datme Quest Bureau 800 <br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71828</a></td><td>Grand Industries</td><td>PO11194153355</td><td>Aug 10, 2007</td><td>$52,553.87</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6333 Cote Vertu<br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6333 Cote Vertu <br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71829</a></td><td>Family Cycle Store</td><td>PO10962123279</td><td>Jul 16, 2007</td><td>$40,095.88</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: James</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>660 Saint-Jacques, Bureau 400<br>Montreal, Quebec H1Y 2H8</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: James</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>660 Saint-Jacques, Bureau 400 <br>Montreal, Quebec H1Y 2H8</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71830</a></td><td>Petroleum Products Distributors</td><td>PO10875112195</td><td>Nov 8, 2007</td><td>$55,088.00</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>20225 Lansing Ave<br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>20225 Lansing Ave <br>Montreal, Quebec H1Y 2H7</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71831</a></td><td>Tachometers and Accessories</td><td>PO10295111084</td><td>Aug 8, 2007</td><td>$2,228.06</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Wymbush<br>Milton Keynes, England MK8 8DF</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Wymbush <br>Milton Keynes, England MK8 8DF</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71832</a></td><td>Closest Bicycle Store</td><td>PO10353140756</td><td>Sep 3, 2007</td><td>$39,531.61</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Garamonde Drive, Wymbush<br>PO Box 4023<br>Milton Keynes, England MK8 8ZD</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Garamonde Drive, Wymbush <br>PO Box 4023 <br>Milton Keynes, England MK8 8ZD</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71833</a></td><td>Another Bicycle Company</td><td>PO10411123072</td><td>Jan 26, 2008</td><td>$70,377.54</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Stanley</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>567 Sw Mcloughlin Blvd<br>Milwaukie, Oregon 97222</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Stanley</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>567 Sw Mcloughlin Blvd <br>Milwaukie, Oregon 97222</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71834</a></td><td>Rustic Bike Store</td><td>PO377116268</td><td>Feb 22, 2008</td><td>$2,310.51</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Buergermeister-ulrich-str 3000<br>Buchhaltung<br>Augsburg, Bayern 86150</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Buergermeister-ulrich-str 3000 <br>Buchhaltung <br>Augsburg, Bayern 86150</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71835</a></td><td>Running and Cycling Gear</td><td>PO870120974</td><td>Jun 13, 2007</td><td>$71,605.92</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>No. 60 Bellis Fair Parkway<br>Bellingham, Washington 98225</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>No. 60 Bellis Fair Parkway <br>Bellingham, Washington 98225</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71836</a></td><td>Safe Cycles Shop</td><td>PO841118259</td><td>Sep 13, 2007</td><td>$90,216.85</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>2681 Eagle Peak<br>Bellevue, Washington 98004</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>2681 Eagle Peak <br>Bellevue, Washington 98004</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71837</a></td><td>Riders Company</td><td>PO1624180133</td><td>Aug 24, 2007</td><td>$39,989.36</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Kim</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Tanger Factory<br>Branch, Minnesota 55056</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Kim</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Tanger Factory <br>Branch, Minnesota 55056</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71838</a></td><td>Cycles Sales and Repair</td><td>PO1305123041</td><td>Sep 7, 2007</td><td>$15,165.23</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>3387, rue Marbeuf<br>Bobigny, Seine Saint Denis 93000</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>3387, rue Marbeuf <br>Bobigny, Seine Saint Denis 93000</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71839</a></td><td>Front Runner Bikes</td><td>PO1537119063</td><td>Jan 26, 2008</td><td>$75,173.33</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>DeSouth Square<br>Bradenton, Florida 34205</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>DeSouth Square <br>Bradenton, Florida 34205</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71840</a></td><td>Community Department Stores</td><td>PO1450191043</td><td>Oct 2, 2007</td><td>$1,234.39</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>3639, rue des Grands Champs<br>Boulogne-sur-Mer, Pas de Calais 62200</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>3639, rue des Grands Champs <br>Boulogne-sur-Mer, Pas de Calais 62200</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71841</a></td><td>Rural Cycle Emporium</td><td>PO1798133189</td><td>Nov 23, 2007</td><td>$112,758.77</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Kathleen</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6388 Lake City Way<br>Burnaby, British Columbia V5A 3A6</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Kathleen</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6388 Lake City Way <br>Burnaby, British Columbia V5A 3A6</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71842</a></td><td>Price-Cutter Discount Bikes</td><td>PO1740169151</td><td>Nov 22, 2007</td><td>$12.91</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>6700 Boul Taschereau<br>Brossard, Quebec J4Z 1C5</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>6700 Boul Taschereau <br>Brossard, Quebec J4Z 1C5</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71843</a></td><td>Future Bikes</td><td>PO2001122796</td><td>Jun 24, 2007</td><td>$7,775.72</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>67255 - 8th Street N.E., Suite 350<br>Calgary, Alberta T2P 2G8</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>67255 - 8th Street N.E., Suite 350 <br>Calgary, Alberta T2P 2G8</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71844</a></td><td>Sales and Supply Company</td><td>PO2813198985</td><td>Jun 12, 2007</td><td>$48,077.41</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Corporate Ofc A/p<br>123 Fourth Ave<br>Chantilly, Virginia 20151</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Corporate Ofc A/p <br>123 Fourth Ave <br>Chantilly, Virginia 20151</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71845</a></td><td>Trailblazing Sports</td><td>PO2697119362</td><td>Mar 4, 2008</td><td>$45,992.37</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Frank</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>251340 E. South St.<br>Cerritos, California 90703</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Frank</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>251340 E. South St. <br>Cerritos, California 90703</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71846</a></td><td>Sports Store</td><td>PO2378131604</td><td>Jul 2, 2007</td><td>$2,711.41</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Internet House, 3399 Science Park<br>Cambridge, England CB4 4BZ</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Internet House, 3399 Science Park <br>Cambridge, England CB4 4BZ</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71847</a></td><td>Camping and Sports Store</td><td>PO18502143784</td><td>Jul 15, 2007</td><td>$119,981.15</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>400-25155 West Pender St<br>Vancouver, British Columbia V7L 4J4</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>400-25155 West Pender St <br>Vancouver, British Columbia V7L 4J4</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71848</a></td><td>Locks Company</td><td>PO18763153352</td><td>Nov 9, 2007</td><td>$16,667.88</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>70259 West Sunnyview Ave<br>Visalia, California 93291</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>70259 West Sunnyview Ave <br>Visalia, California 93291</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71849</a></td><td>Principal Bike Company</td><td>PO18125130930</td><td>Jan 18, 2008</td><td>$25,746.16</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Alvaro</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Mountain Square<br>Upland, California 91786</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Alvaro</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Mountain Square <br>Upland, California 91786</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71850</a></td><td>Quitting Business Distributors</td><td>PO18241134627</td><td>Aug 28, 2007</td><td>$10,492.47</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>University Plaza<br>Tampa, Florida 33602</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>University Plaza <br>Tampa, Florida 33602</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71851</a></td><td>Rapid Bikes</td><td>PO18299133687</td><td>Jun 17, 2007</td><td>$51,104.88</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>992 St Clair Ave East<br>Toronto, Ontario M4B 1V7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>992 St Clair Ave East <br>Toronto, Ontario M4B 1V7</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71852</a></td><td>Painters Bicycle Specialists</td><td>PO20213171866</td><td>Mar 24, 2008</td><td>$10,406.62</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>9975 Union St.<br>Waterbury, Connecticut 06710</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>9975 Union St. <br>Waterbury, Connecticut 06710</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71853</a></td><td>Famous Bike Shop</td><td>PO18531164420</td><td>May 3, 2007</td><td>$4,578.20</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Jim</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>999 West Georgia St.<br>Vancouver, Ontario V5T 1Y9</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Jim</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>999 West Georgia St. <br>Vancouver, Ontario V5T 1Y9</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71854</a></td><td>Helpful Sales and Repair Service </td><td>PO16385143469</td><td>Nov 11, 2007</td><td>$36,819.69</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Licensing Account<br>Seaford, Victoria 3198</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Licensing Account <br>Seaford, Victoria 3198</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71855</a></td><td>Self-Contained Cycle Parts Company</td><td>PO18589189353</td><td>Jun 23, 2007</td><td>$429.62</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>12, rue des Grands Champs<br>Verrieres Le Buisson, Essonne 91370</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>12, rue des Grands Champs <br>Verrieres Le Buisson, Essonne 91370</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71856</a></td><td>Transport Bikes</td><td>PO16530177647</td><td>Nov 18, 2007</td><td>$665.43</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>25130 South State Street<br>Sandy, Utah 84070</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>25130 South State Street <br>Sandy, Utah 84070</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71857</a></td><td>First Cycle Store</td><td>PO16269151631</td><td>Jan 4, 2008</td><td>$37,400.41</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Mike</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>25250 N 90th St<br>Scottsdale, Arizona 85257</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Mike</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>25250 N 90th St <br>Scottsdale, Arizona 85257</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71858</a></td><td>Thrilling Bike Tours</td><td>PO16153112278</td><td>Oct 6, 2007</td><td>$15,275.20</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>4660 Rodeo Road<br>Santa Fe, New Mexico 87501</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>4660 Rodeo Road <br>Santa Fe, New Mexico 87501</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71859</a></td><td>Bike World</td><td>PO16182112142</td><td>Apr 11, 2007</td><td>$8,654.14</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>60025 Bollinger Canyon Road<br>San Ramon, California 94583</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>60025 Bollinger Canyon Road <br>San Ramon, California 94583</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71860</a></td><td>Vinyl and Plastic Goods Corporation</td><td>PO17835163979</td><td>Feb 20, 2008</td><td>$3,651.79</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>No. 25800-130 King Street West<br>Toronto, Ontario M4B 1V5</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>No. 25800-130 King Street West <br>Toronto, Ontario M4B 1V5</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71861</a></td><td>Two Bike Shops</td><td>PO14152156429</td><td>Nov 30, 2007</td><td>$2,430.32</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Jim</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>35525-9th Street Sw<br>Puyallup, Washington 98371</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Jim</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>35525-9th Street Sw <br>Puyallup, Washington 98371</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71862</a></td><td>Fad Outlet</td><td>PO14065190039</td><td>Feb 19, 2008</td><td>$1,622.62</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>2550 Ne Sandy Blvd<br>Portland, Oregon 97205</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>2550 Ne Sandy Blvd <br>Portland, Oregon 97205</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71863</a></td><td>Sports Products Store</td><td>PO16124166561</td><td>Apr 30, 2007</td><td>$3,673.32</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Po Box 252525<br>Santa Ana, California 92701</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Po Box 252525 <br>Santa Ana, California 92701</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71864</a></td><td>Good Bike Shop</td><td>PO14268188903</td><td>Oct 9, 2007</td><td>$37,623.76</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>99433 S. Greenbay Rd.<br>Racine, Wisconsin 53182</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>99433 S. Greenbay Rd. <br>Racine, Wisconsin 53182</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71865</a></td><td>Neighborhood Bicycle Storehouse</td><td>PO15109136609</td><td>May 30, 2007</td><td>$290.23</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Cecilia</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>69, boulevard Tremblay<br>Roncq, Nord 59223</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Cecilia</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>69, boulevard Tremblay <br>Roncq, Nord 59223</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71866</a></td><td>Exchange Parts Inc.</td><td>PO14297151936</td><td>Jan 27, 2008</td><td>$43,277.65</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>7700 Green Road<br>Raleigh, North Carolina 27603</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>7700 Green Road <br>Raleigh, North Carolina 27603</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71867</a></td><td>Vigorous Sports Store</td><td>PO13050111529</td><td>Jul 29, 2007</td><td>$1,170.54</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>Banbury<br>Oxon, England OX16 8RS</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>Banbury <br>Oxon, England OX16 8RS</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71868</a></td><td>Cycle Merchants</td><td>PO14210134527</td><td>Aug 15, 2007</td><td>$1,932.67</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>575 Rue St Amable<br>Quebec, Quebec G1R</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>575 Rue St Amable <br>Quebec, Quebec G1R</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71869</a></td><td>Certified Sports Supply</td><td>PO14877155420</td><td>Feb 21, 2008</td><td>$143.50</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Gabriele</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>250551 Shellbridge Way<br>Richmond, British Columbia V6B 3P7</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Gabriele</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>250551 Shellbridge Way <br>Richmond, British Columbia V6B 3P7</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71870</a></td><td>Accessories Network</td><td>PO13195134898</td><td>Feb 1, 2008</td><td>$1,903.38</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>699bis, rue des Peupliers<br>Paris, Seine (Paris) 75008</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>699bis, rue des Peupliers <br>Paris, Seine (Paris) 75008</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71871</a></td><td>Remote Bicycle Specialists</td><td>PO14239120760</td><td>Aug 10, 2007</td><td>$2,168.53</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>No. 2000-25080 Beaver Hall Hill<br>Quebec, Quebec G1R</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>No. 2000-25080 Beaver Hall Hill <br>Quebec, Quebec G1R</div></td></tr>
<tr><td rowspan="2"><a href="#" class="toggle">SO71872</a></td><td>First Center</td><td>PO13137112099</td><td>Jan 2, 2008</td><td>$215.91</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>22, rue Lafayette<br>Pantin, Seine Saint Denis 93500</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>22, rue Lafayette <br>Pantin, Seine Saint Denis 93500</div></td></tr>
<tr><td rowspan="3"><a href="#" class="toggle">SO71873</a></td><td>Incomparable Bicycle Store</td><td>PO12325121185</td><td>Jul 5, 2007</td><td>$5,941.29</td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div><div>Please send ATTN: Faith</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div><div>99 Edgewater Drive<br>Norwood, Massachusetts 02062</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Comment</div> <div>Please send ATTN: Faith</div></td></tr>
<tr class="tablesorter-childRow"><td colspan="4"><div class="bold">Shipping Address</div> <div>99 Edgewater Drive <br>Norwood, Massachusetts 02062</div></td></tr>
</tbody>
</table>
@ -466,6 +570,59 @@
&lt;/div&gt;</pre>
</div>
<hr>
<h3 id="child-by-column">childByColumn</h3>
<button class="toggle-byColumn" type="button">Toggle</button> <code>filter_childByColumn</code> : <span class="state2">true</span>
<ul>
<li>This option requires the <code>filter_childRow</code> option to be set to <code>true</code> in order to work.</li>
<li>If <code>true</code>, child row content can be filtered in the same manner as regular rows. Try searching for values <button data-column="1">&lt;1000</button> in the "FastCar" column, or values between <button data-column="2">3000 - 4000</button> in the "RapidZoo" column. Only one match in a child row is required to show the entire parent/child group.</li>
<li>If <code>false</code>, child row content will be grouped together and included in any column search; as was the behavior before this option was added.</li>
<li>Extra css was added to override the theme row highlighting to group parent/child highlighting; it just doesn't look that good and it may be removed from the themes in the future.</li>
</ul>
<button type="button" class="reset">Reset Search</button>
<div id="demo"><table id="table2" class="tablesorter">
<thead>
<tr>
<th>Region</th>
<th class="sorter-currency">FastCar</th>
<th class="sorter-currency">RapidZoo</th>
<th class="sorter-currency">SuperGlue</th>
</tr>
</thead>
<tbody>
<tr><td><a href="#" class="toggle">Middle</a></td><td>FCIDM2015Q1</td><td>RZIDM2015Q1</td><td>SGIDM2015Q1</td></tr>
<tr class="tablesorter-childRow"><td>Joseph</td><td>$ 423</td><td>$ 182</td><td>$ 255</td></tr>
<tr class="tablesorter-childRow"><td>Lawrence</td><td>$ 1,908</td><td>$ 1,642</td><td>$ 2,593</td></tr>
<tr class="tablesorter-childRow"><td>Maria</td><td>$ 1,502</td><td>$ 1,969</td><td>$ 3,408</td></tr>
<tr class="tablesorter-childRow"><td>Matt</td><td>$ 1,170</td><td>$ 1,093</td><td>$ 2,039</td></tr>
<tr><td><a href="#" class="toggle">North</a></td><td>FCIDN2015Q1</td><td>RZIDN2015Q1</td><td>SGIDN2015Q1</td></tr>
<tr class="tablesorter-childRow"><td>Joseph</td><td>$ 3,643</td><td>$ 2,846</td><td>$ 1,574</td></tr>
<tr class="tablesorter-childRow"><td>Lawrence</td><td>$ 3,456</td><td>$ 2,658</td><td>$ 1,685</td></tr>
<tr class="tablesorter-childRow"><td>Maria</td><td>$ 3,235</td><td>$ 2,616.99</td><td>$ 1,612.33</td></tr>
<tr class="tablesorter-childRow"><td>Matt</td><td>$ 3,868</td><td>$ 2,926</td><td>$ 1,254</td></tr>
<tr><td><a href="#" class="toggle">West</a></td><td>FCIDW2015Q1</td><td>RZIDW2015Q1</td><td>SGIDW2015Q1</td></tr>
<tr class="tablesorter-childRow"><td>Joseph</td><td>$ 5,507</td><td>$ 3,186</td><td>$ 4,882</td></tr>
<tr class="tablesorter-childRow"><td>Lawrence</td><td>$ 4,082</td><td>$ 4,272</td><td>$ 6,124</td></tr>
<tr class="tablesorter-childRow"><td>Maria</td><td>$ 5,520</td><td>$ 4,461</td><td>$ 4,872</td></tr>
<tr class="tablesorter-childRow"><td>Matt</td><td>$ 5,737</td><td>$ 4,598</td><td>$ 4,233</td></tr>
</tbody>
</table>
</div>
<h1>CSS</h1>
<div id="css">
<pre class="prettyprint lang-css"></pre>
</div>
<h1>Javascript</h1>
<div id="javascript2">
<pre class="prettyprint lang-javascript"></pre>
</div>
<h1>HTML</h1>
<div id="html">
<pre class="prettyprint lang-html"></pre>
</div>
<div class="next-up">
<hr />
Next up: <a href="example-option-sort-order.html">Set an initial sorting order direction &rsaquo;&rsaquo;</a>

View File

@ -80,11 +80,11 @@
<li>This is a demo of the <a href="index.html#widget-filter-external"><code>filter_external</code></a> option (added <span class="version">v2.15</span>).</li>
<li>In <span class="version">v2.15</span>
<ul>
<li>The <a class="alert" href="index.html#widget-filter-any-match"><code>filter_anyMatch</code></a> has been <span class="label alert">removed</span> (added <span class="version">v2.13.3</span>; removed in v2.15)</li>
<li>The <a class="alert" href="index.html#widget-filter-any-match"><code>filter_anyMatch</code></a> option has been <span class="label alert">removed</span> (added <span class="version">v2.13.3</span>; removed in v2.15)</li>
<li>A new option <code>filter_external</code> has been added. It is set to a jQuery selector string (<code>'.search'</code>) or jQuery object (<code>$('.search')</code>) targeting an external input.</li>
<li>So now a table can include <em>both</em> a filter row (<code>filter_columnFilters</code> is <code>true</code>, i.e. the internal table filters) and any number of external search inputs (as set by the <code>filter_external</code> option).</li>
<li>The external search results must have a <code>data-column="#"</code> attribute set, where <code>#</code> is the index of the column (zero-based) that the input targets, to have an input search all table content, set the data column attribute to <code>"all"</code> to match any column.</li>
<li>The <a href="index.html#function-bindsearch"><code>$.tablesorter.bindSearch</code> function</a> (<a href="example-widget-filter-external-inputs.html">see demo</a>) does exactly the same thing as the <code>filter_external</code> option. The major difference is seen when using ajax to populate the table, the initial filter values can be set before tablesorter initialization when using teh <code>filter_external</code> option; whereas, the bind search function can not set initial filter values and is usually executed after tablesorter initialization.</li>
<li>The <a href="index.html#function-bindsearch"><code>$.tablesorter.bindSearch</code> function</a> (<a href="example-widget-filter-external-inputs.html">see demo</a>) does exactly the same thing as the <code>filter_external</code> option. The major difference is seen when using ajax to populate the table, the initial filter values can be set before tablesorter initialization when using the <code>filter_external</code> option; whereas, the bind search function can not set initial filter values and is usually executed after tablesorter initialization.</li>
</ul>
</li>
</ul>

View File

@ -319,7 +319,7 @@
</ul>
</li>
<li>The <strong>config (c)</strong> is the <code>table.config</code> (added <span class="version">v2.21.0</span>).</li>
<li>The <strong>data</strong> parameter is the same data passed to the filter types (see <a href="example-widget-filter-custom-search.html#how_to_add_custom_filter_types">all the data values here</a>).</li>
<li>The <strong>data</strong> parameter is the same data passed to the filter types (see <a href="example-widget-filter-custom-search.html#how_to_add_custom_filter_types">all the data values here</a>; added <span class="version">v2.21.6</span>).</li>
</ul>
</div>
</div>

View File

@ -47,6 +47,9 @@
// visible; default is false
filter_childRows : false,
// if true, filter child row content by column; filter_childRows must also be true
filter_childByColumn : false,
// if true, a filter will be added to the top of each table column;
// disabled by using -> headers: { 1: { filter: false } } OR add class="filter-false"
// if you set this to false, make sure you perform a search using the second method below
@ -222,28 +225,49 @@ $(function(){
<h3 id="notes"><a href="#">Notes</a></h3>
<div>
<ul>
<li>In <span class="version">v2.21.6</span>
<ul>
<li>Regex filter searches now cache the created regex object for each query to optimize speed & a regex search now properly uses case-sensitive content.</li>
<li>Add <code>data</code> parameter to <code>filter_functions</code> (<a href="example-widget-filter-custom-search.html#how_to_add_custom_filter_types">get more details</a>).</li>
<li>Any match searches which target specific columns will no longer save each filter to its respective column; see <a href="example-widget-filter-any-match.html#anymatch_searches">"AnyMatch Searches"</a> documentation.</li>
<li>Operator filter searchs now ignore empty strings (because <code>"" &lt; 10</code> is <code>true</code>).</li>
<li>Added <code>filter_childByColumn</code> option which allows the filtering columns in both the parent & child rows. Demo added to the <a href="example-child-rows-filtered.html#child-by-column">filtered child rows demo</a></li>
</ul>
</li>
<li>In <span class="version updated">v2.18.0</span>, added <code>filter_cellFilter</code> &amp; the ability to set multiple "any" match columns for an external search (see the <a href="example-widget-filter-external-inputs.html">external inputs demo</a> for more details).</li>
<li>In <span class="version">v2.17.8</span>, filter selects will default to exact matches unless the header cell has a "filter-match" class added.</li>
<li>In <span class="version">v2.17.1</span>, added a not exact match (<code>!=</code>) filter type.</li>
<li>In <span class="version updated">v2.16+</span>,
</ul>
<div class="accordion start-closed">
<h3 id="old-notes"><a href="#">Older Notes</a></h3>
<div>
<ul>
<li>When a default filter select is added to a column, it is now parsed from the assigned parser, then sorted using the <code>textSorter</code> setting, and falls back to an alphanumeric sort (<span class="version updated">v2.16.3</span>).</li>
<li>Adding a class of <code>"filter-select-nosort"</code> will now leave the select options unsorted (<span class="version">v2.16.3</span>).</li>
<li>Added <code>filter_placeholder</code> option (<span class="version">v2.16.0</span>).</li>
<li>Added <code>filter_selectSource</code> option (<span class="version">v2.16.3</span>).</li>
<li>updated <code>filter_reset</code> option (<span class="version updated">v2.16.3</span>).</li>
<li>In <span class="version">v2.17.8</span>, filter selects will default to exact matches unless the header cell has a "filter-match" class added.</li>
<li>In <span class="version">v2.17.1</span>, added a not exact match (<code>!=</code>) filter type.</li>
<li>In <span class="version updated">v2.16+</span>,
<ul>
<li>When a default filter select is added to a column, it is now parsed from the assigned parser, then sorted using the <code>textSorter</code> setting, and falls back to an alphanumeric sort (<span class="version updated">v2.16.3</span>).</li>
<li>Adding a class of <code>"filter-select-nosort"</code> will now leave the select options unsorted (<span class="version">v2.16.3</span>).</li>
<li>Added <code>filter_placeholder</code> option (<span class="version">v2.16.0</span>).</li>
<li>Added <code>filter_selectSource</code> option (<span class="version">v2.16.3</span>).</li>
<li>updated <code>filter_reset</code> option (<span class="version updated">v2.16.3</span>).</li>
</ul>
</li>
<li>In <span class="version updated">v2.15</span>,
<ul>
<li>The <code>filter_anyMatch</code> widget option was completely <span class="label alert">removed</span>. Sorry for not deprecating this option, but the filter any match code was completely rewritten.</li>
<li>Added a <code>filter_external</code> widget option to only accept a jQuery selector string/object; please see the updated <a href="example-widget-filter-any-match.html">filter any match</a> demo for more details.</li>
</ul>
</li>
<li>Added &amp; set <code>filter_saveFilters</code> to <code>true</code> (default is <code>false</code>) in this demo (<span class="version">v2.14</span>).</li>
</ul>
</li>
<li>In <span class="version updated">v2.15</span>,
<ul>
<li>The <code>filter_anyMatch</code> widget option was completely <span class="label alert">removed</span>. Sorry for not deprecating this option, but the filter any match code was completely rewritten.</li>
<li>Added a <code>filter_external</code> widget option to only accept a jQuery selector string/object; please see the updated <a href="example-widget-filter-any-match.html">filter any match</a> demo for more details.</li>
</ul>
</li>
<li>Added &amp; set <code>filter_saveFilters</code> to <code>true</code> (default is <code>false</code>) in this demo (<span class="version">v2.14</span>).</li>
</div>
</div>
<ul>
<li>Hover over the grey bar below the table header to open the filter row. Disable this by setting <code>filter_hideFilters</code> option to <code>false</code>.</li>
<li>This widget uses jQuery's <code>.nextUntil()</code> function which is only available is jQuery version 1.4+.</li>
<li>This widget does work with tablesorter v2.0.5.</li>
<li>This widget <em>does NOT</em> work with tablesorter v2.0.5.</li>
<li>Using the built-in filters (<a href="example-widget-filter-custom-search.html">learn how to customize them here</a> - demo created <span class="version">v2.17.5</span>):
<table class="tablesorter-blue notes">
<thead>
@ -278,6 +302,7 @@ $(function(){
<h3><a href="#">Options</a></h3>
<div>
<h4>Filter widget defaults (added inside of tablesorter <code>widgetOptions</code>)</h4>
<h5>This table includes very basic information about the filter options. For more extensive information &amp; links to demos, see the main page <a href="index.html#Widget-options">Widget &amp; Pager Options</a> section.</h5>
<div>
<span class="label label-info">TIP!</span> Click on the link in the function column to reveal full details (or <a href="#" class="toggleAll">toggle</a>|<a href="#" class="showAll">show</a>|<a href="#" class="hideAll">hide</a> all) or double click to update the browser location.
</div>
@ -293,6 +318,19 @@ $(function(){
<td>if <code>true</code>, filter includes child row content in the search.</td>
</tr>
<tr id="filter-child-by-column">
<td><a href="#" class="permalink">filter_childByColumn</a></td>
<td>false</td>
<td>if <code>true</code>, queries will search child row content by column (<span class="version">v2.21.6</span>).
<div class="collapsible">
<br>
The <code>filter_childRows</code> option must be <code>true</code> for this option to work.<br>
<br>
If <code>false</code>, and the <code>filter_childRows</code> option is <code>true</code>, then queries in <em>any column</em> will search all child content, as before this option was added.
</div>
</td>
</tr>
<tr id="filter-column-filters">
<td><span class="permalink">filter_columnFilters</span></td>
<td>true</td>

View File

@ -364,7 +364,7 @@
<li><a href="example-locale-sort.html">Sorting Accented Characters</a> (<a href="#sortlocalecompare"><code>sortLocaleCompare</code></a>; v2.24; <a href="https://github.com/Mottie/tablesorter/wiki/Language">languages</a>)</li>
<li><a href="example-trigger-sort.html">Sort table using a link outside the table</a> (external link; <span class="updated version">v2.17.0</span>)</li>
<li><a href="example-child-rows.html">Attach child rows (rows that sort with their parent row)</a> (<span class="updated version">v2.15.12</span>)</li>
<li><a href="example-child-rows-filtered.html">Use child rows + filter widget</a> (<span class="updated version">v2.15.12</span>)</li>
<li><a href="example-child-rows-filtered.html">Use child rows + filter widget</a> (<span class="updated version">v2.21.6</span>)</li>
<li><a href="example-multiple-tbodies.html">Sorting with Multiple Tbodies</a> (v2.2)</li>
<li><a href="example-header-column-span.html">Sorting Across Multiple Columns</a> (v2.3)</li>
<li><a href="example-option-show-processing.html">Show a processing icon during sorting/filtering</a> (v2.4)</li>
@ -484,9 +484,9 @@
<li><span class="results">&dagger;</span> Filter Widget (<span class="version updated">v2.21.6</span>):
<ul>
<li><a href="example-widget-filter.html">basic</a> (v2.0.18; <span class="version updated">v2.18.1</span>)</li>
<li><a href="example-widget-filter-any-match.html">external option (match any column)</a> (<span class="version">v2.13.3</span>; <span class="version updated">v2.20.0</span>)</li>
<li><a href="example-widget-filter-any-match.html">external option (match any column)</a> (<span class="version">v2.13.3</span>; <span class="version updated">v2.21.6</span>)</li>
<li><a href="example-widget-filter-external-inputs.html">external inputs</a> (<span class="version">v2.14</span>; <span class="version updated">v2.18.0</span>)</li>
<li><a href="example-widget-filter-custom.html">custom</a> (v2.3.6; <span class="version updated">v2.21.0</span>)</li>
<li><a href="example-widget-filter-custom.html">custom</a> (v2.3.6; <span class="version updated">v2.21.6</span>)</li>
<li><a href="example-widget-filter-custom-search.html">custom searches</a> (<span class="version">v2.17.5</span>; <span class="version updated">v2.21.6</span>)</li>
<li><a href="example-widget-filter-custom-search2.html">custom search (example #2)</a> (<span class="version">v2.19.1</span>; <span class="version updated">v2.21.0</span>)</li>
<li>formatter: <a href="example-widget-filter-formatter-1.html">jQuery UI widgets</a> and <a href="example-widget-filter-formatter-2.html">HTML5 Elements</a> (v2.7.7; <span class="version updated">v2.17.5</span>).</li>
@ -535,18 +535,18 @@
<ul>
<li><a href="example-parsers-duration.html">Countdown parser</a> (<span class="version">v2.19.0</span>).</li>
<li><a href="example-parsers-dates.html">Date parsers</a> (<span class="version">v2.8</span>; <span class="version updated">v2.18.0</span>; includes weekday, month, two-digit year &amp; <a href="http://sugarjs.com/dates">sugar.js</a> date parsers).</li>
<li><a href="example-parsers-date-range.html">Date Range parsers</a> (<span class="version">v2.21.0</span>); if filters, include the <a href="example-widget-filter-custom-search2.html">insideRange</a> filter search type.</li>
<li><a href="example-parsers-date-range.html">Date range parsers</a> (<span class="version">v2.21.0</span>); if filters, include the <a href="example-widget-filter-custom-search2.html">insideRange</a> filter search type.</li>
<li><a href="example-parsers-duration.html">Duration parser</a> (<span class="version">v2.17.8</span>).</li>
<li><a href="example-parsers-file-type.html">File type parser</a> (<span class="version">v2.13</span>).</li>
<li><a href="http://jsfiddle.net/Mottie/0j18Lw8r/">jQuery Globalize</a> (number &amp; date parsers; <span class="version">v2.21.6</span>).</li>
<li><a href="example-parsers-ignore-articles.html">Ignore leading articles parser</a> (Ignore &quot;A&quot;, &quot;An&quot; and &quot;The&quot; in titles) (<span class="version">v2.8</span>).</li>
<li><a href="example-widget-grouping.html">Input/select parsers</a> (used by Grouping rows widget) (<span class="version">v2.8</span>; <span class="version updated">v2.21.3</span>).</li>
<li><a href="example-parsers-feet-inch-fraction.html">Feet-inch-fraction parser</a> (<span class="version">v2.8</span>).</li>
<li><a href="example-parsers-file-type.html">File type parser</a> (<span class="version">v2.13</span>).</li>
<li><a href="example-parsers-ignore-articles.html">Ignore leading articles parser</a> (Ignore &quot;A&quot;, &quot;An&quot; and &quot;The&quot; in titles) (<span class="version">v2.8</span>).</li>
<li><a href="example-widget-grouping.html">Input/select parsers</a> (used by Grouping rows widget) (<span class="version">v2.8</span>; <span class="version updated">v2.21.6</span>).</li>
<li><a href="http://jsfiddle.net/Mottie/0j18Lw8r/">jQuery Globalize</a> (number &amp; date parsers; <span class="version">v2.21.6</span>).</li>
<li><a href="example-parsers-metric.html">Metric parser</a> (<span class="version">v2.8</span>).</li>
<li><a href="example-parsers-named-numbers.html">Named Numbers parser</a> (<span class="version">v2.18.0</span>).</li>
<li><a href="example-parsers-ip-address.html">Network (IPv4, IPv6 and MAC address parser</a> (<span class="version">v2.12</span>; <span class="version updated">v2.18.0</span>).</li>
<li><a href="example-parsers-named-numbers.html">Named Numbers parser</a> (<span class="version">v2.18.0</span>; <span class="version updated">v2.21.6</span>).</li>
<li><a href="example-parsers-ip-address.html">Network (IPv4, IPv6 and MAC address parser</a> (<span class="version">v2.12</span>; <span class="version updated">v2.21.6</span>).</li>
<li><a href="example-parsers-roman.html">Roman Numeral parser</a> (<span class="version">v2.17.3</span>).</li>
<li><a href="example-option-textsorter-semver.html">Semantic Versioning (Semver) sorting</a> (<span class="version">v2.14.3</span>).</li>
<li><a href="example-option-textsorter-semver.html">Semantic Versioning (Semver) sorting</a> (<span class="version">v2.14.3</span>; <span class="version updated">v2.21.4</span>).</li>
</ul>
<h4>Work-in-progress</h4>
@ -1862,6 +1862,8 @@ $(function(){
// filter_anyMatch : null, // THIS OPTION WAS REMOVED IN V2.15
// Include child rows content in the search
filter_childRows : false,
// filter child row content by column, if true; filter_childRows must also be true!
filter_childByColumn : false,
// show column filters
filter_columnFilters : true,
// css class name added to the filter cell (string or array)
@ -2254,8 +2256,8 @@ $(function(){
Filter widget: If there are child rows in the table (rows with class name from <a href="#csschildrow"><code>&quot;cssChildRow&quot;</code></a> option) and this option is <code>true</code> and a match is found anywhere in the child row, then it will make that row visible.
(Modified v2.1).
<div class="collapsible">
<br>
Use the <a href="#widget-filter-childrows"><code>filter_childRows</code></a> option include child row text as follows:
<p><span class="label label-info">*NOTE*</span> When using this option, please be aware that all child row content will be obtained from each table cell using <code>textContent</code>, so none of the markup will be preserved. Also, carriage returns (<code>&lt;br&gt;</code>) will not be included. To account for the loss of white space, especially after carriage returns, please add an extra space to the end of the line. Using <code>innerText</code>, could have been an option for preserving the white space, but it is not standardized across all browsers (<a href="http://perfectionkills.com/the-poor-misunderstood-innerText/">ref</a>).</p>
Use the <a href="#widget-filter-childrows"><code>filter_childRows</code></a> option to include child row text as follows:
<pre class="prettyprint lang-js">$(function(){
$("table").tablesorter({
widgets: ["filter"],
@ -2268,6 +2270,31 @@ $(function(){
<td></td>
</tr>
<tr id="widget-filter-child-by-column">
<td><a href="#" class="permalink">filter_childByColumn</a></td>
<td>Boolean</td>
<td>false</td>
<td>
Filter widget: If <code>true</code>, queries will search child row content by column (<span class="version">v2.21.6</span>).
<div class="collapsible">
<p>The <code>filter_childRows</code> option must also be <code>true</code> for this option to work.</p>
<p>If <code>false</code>, and the <code>filter_childRows</code> option is <code>true</code>, then queries in <em>any column</em> will search all child content, as before this option was added.</p>
<p></p>
Use the <a href="#widget-filter-child-by-column"><code>filter_childByColumn</code></a> option as follows:
<pre class="prettyprint lang-js">$(function(){
$("table").tablesorter({
widgets: ["filter"],
widgetOptions : {
filter_childRows : true,
filter_childByColumn : true
}
});
});</pre>
</div>
</td>
<td><a href="example-child-rows-filtered.html#child-by-column">Example</a></td>
</tr>
<tr id="widget-filter-columnFilters">
<td><a href="#" class="permalink">filter_columnFilters</a></td>
<td>Boolean</td>

View File

@ -21,6 +21,9 @@
if ($("#js").length) {
$("#javascript pre").addClass('mod').html( cleanupCode( $("#js").html() ) );
}
if ($("#js2").length) {
$("#javascript2 pre").addClass('mod').html( cleanupCode( $("#js2").html() ) );
}
if ($("#css").length) {
$("pre.lang-css").addClass('mod').html( cleanupCode( $("#css").html() ) );
}
@ -117,7 +120,7 @@
$t.each(function(i){
var $this = $(this);
$this.accordion({
active: hashId,
active: $this.hasClass('start-closed') ? false : hashId,
animate: false,
heightStyle: 'content',
collapsible: true,

View File

@ -19,6 +19,7 @@ ts.addWidget({
priority: 50,
options : {
filter_childRows : false, // if true, filter includes child row content in the search
filter_childByColumn : false, // (filter_childRows must be true) if true = search child rows by column; false = search all child row text grouped
filter_columnFilters : true, // if true, a filter will be added to the top of each table column
filter_columnAnyMatch: true, // if true, allows using "#:{query}" in AnyMatch searches (column:query)
filter_cellFilter : '', // css class name added to the filter cell (string or array)
@ -89,11 +90,15 @@ ts.filter = {
},
// function( c, data ) { }
// c = table.config
// data.filter = array of filter input values;
// data.iFilter = same array, except lowercase (if wo.filter_ignoreCase is true)
// data.$row = jQuery object of the row currently being processed
// data.$cells = jQuery object of all cells within the current row
// data.filters = array of filters for all columns (some may be undefined)
// data.filter = filter for the current column
// data.iFilter = same as data.filter, except lowercase (if wo.filter_ignoreCase is true)
// data.exact = table cell text (or parsed data if column parser enabled)
// data.iExact = same as data.exact, except lowercase (if wo.filter_ignoreCase is true)
// data.cache = table cell text from cache, so it has been parsed (& in all lower case if config.ignoreCase is true)
// data.cache = table cell text from cache, so it has been parsed (& in all lower case if c.ignoreCase is true)
// data.cacheArray = An array of parsed content from each table cell in the row being processed
// data.index = column index; table = table element (DOM)
// data.parsed = array (by column) of boolean values (from filter_useParsedData or "filter-parsed" class)
types: {
@ -101,15 +106,14 @@ ts.filter = {
regex: function( c, data ) {
if ( ts.filter.regex.regex.test(data.filter) ) {
var matches,
wo = c.widgetOptions,
// cache regex per column for optimal speed
regex = wo.filter_regexCache[ data.index ] || ts.filter.regex.regex.exec( data.filter ),
regex = data.filter_regexCache[ data.index ] || ts.filter.regex.regex.exec( data.filter ),
isRegex = regex instanceof RegExp;
try {
if (!isRegex) {
// force case insensitive search if ignoreCase option set?
// if ( c.ignoreCase && !regex[2] ) { regex[2] = 'i'; }
wo.filter_regexCache[ data.index ] = regex = new RegExp( regex[1], regex[2] );
data.filter_regexCache[ data.index ] = regex = new RegExp( regex[1], regex[2] );
}
matches = regex.test( data.exact );
} catch (error) {
@ -135,13 +139,11 @@ ts.filter = {
result = ts.filter.parseFilter(c, $.trim('' + data.iFilter.replace(ts.filter.regex.operators, '')), index, true);
query = ( typeof result === "number" && result !== '' && !isNaN(result) ) ? result : query;
}
// iExact may be numeric - see issue #149;
// check if cached is defined, because sometimes j goes out of range? (numeric columns)
cachedValue = ( parsed || parser.type === 'numeric' ) && !isNaN(query) && typeof data.cache !== 'undefined' ? data.cache :
isNaN(data.iExact) ? ts.formatFloat( data.iExact.replace(ts.filter.regex.nondigit, ''), table) :
ts.formatFloat( data.iExact, table );
if ( />/.test(data.iFilter) ) { result = />=/.test(data.iFilter) ? cachedValue >= query : cachedValue > query; }
if ( /</.test(data.iFilter) ) { result = /<=/.test(data.iFilter) ? cachedValue <= query : cachedValue < query; }
// keep showing all rows if nothing follows the operator
@ -271,7 +273,6 @@ ts.filter = {
wo.filter_initTimer = null;
wo.filter_formatterCount = 0;
wo.filter_formatterInit = [];
wo.filter_regexCache = [];
wo.filter_anyColumnSelector = '[data-column="all"],[data-column="any"]';
wo.filter_multipleColumnSelector = '[data-column*="-"],[data-column*=","]';
@ -793,43 +794,200 @@ ts.filter = {
}
return columns;
},
findRows: function(table, filters, combinedFilters) {
if (table.config.lastCombinedFilter === combinedFilters || !table.config.widgetOptions.filter_initialized) { return; }
var len, norm_rows, $rows, rowIndex, tbodyIndex, $tbody, $cell, columnIndex,
childRow, lastSearch, hasSelect, matches, result, showRow, time, val, indx,
notFiltered, searchFiltered, filterMatched, excludeMatch, fxn, ffxn,
query, injected, res, id,
processRow: function( c, data, vars ) {
var $cell, columnIndex, hasSelect, matches, result, val, filterMatched, excludeMatch, fxn, ffxn, txt,
regex = ts.filter.regex,
wo = c.widgetOptions,
showRow = true;
data.$cells = data.$row.children();
if ( data.anyMatchFlag ) {
// look for multiple columns "1-3,4-6,8"
columnIndex = ts.filter.multipleColumns( c, wo.filter_$anyMatch );
data.anyMatch = true;
data.rowArray = data.$cells.map(function(i){
if ( $.inArray(i, columnIndex) > -1 ) {
if (data.parsed[i]) {
txt = data.cacheArray[i];
} else {
txt = data.rawArray[i];
txt = $.trim( wo.filter_ignoreCase ? txt.toLowerCase() : txt );
if (c.sortLocaleCompare) {
txt = ts.replaceAccents(txt);
}
}
return txt;
}
}).get();
data.filter = data.anyMatchFilter;
data.iFilter = data.iAnyMatchFilter;
data.exact = data.rowArray.join(' ');
data.iExact = wo.filter_ignoreCase ? data.exact.toLowerCase() : data.exact;
data.cache = data.cacheArray.slice(0,-1).join(' ');
filterMatched = null;
matches = null;
for (ffxn in ts.filter.types) {
if ($.inArray(ffxn, vars.noAnyMatch) < 0 && matches === null) {
matches = ts.filter.types[ffxn]( c, data );
if (matches !== null) {
filterMatched = matches;
}
}
}
if (filterMatched !== null) {
showRow = filterMatched;
} else {
if ( wo.filter_startsWith ) {
showRow = false;
columnIndex = c.columns;
while ( !showRow && columnIndex > 0 ) {
columnIndex--;
showRow = showRow || data.rowArray[ columnIndex ].indexOf( data.iFilter ) === 0;
}
} else {
showRow = ( data.iExact + data.childRowText ).indexOf( data.iFilter ) >= 0;
}
}
data.anyMatch = false;
// no other filters to process
if ( data.filters.join( '' ) === data.filter ) {
return showRow;
}
}
for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
data.filter = data.filters[ columnIndex ];
data.index = columnIndex;
// filter types to exclude, per column
excludeMatch = vars.excludeFilter[ columnIndex ];
// ignore if filter is empty or disabled
if ( data.filter ) {
data.cache = data.cacheArray[ columnIndex ];
// check if column data should be from the cell or from parsed data
if ( wo.filter_useParsedData || data.parsed[ columnIndex ] ) {
data.exact = data.cache;
} else {
result = data.rawArray[ columnIndex ] || '';
data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
}
data.iExact = !regex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?
data.exact.toLowerCase() : data.exact;
result = showRow; // if showRow is true, show that row
// in case select filter option has a different value vs text "a - z|A through Z"
ffxn = wo.filter_columnFilters ?
c.$filters.add( c.$externalFilters )
.filter( '[data-column="'+ columnIndex + '"]' )
.find( 'select option:selected' )
.attr( 'data-function-name' ) || '' : '';
// replace accents - see #357
if ( c.sortLocaleCompare ) {
data.filter = ts.replaceAccents( data.filter );
}
val = true;
if ( wo.filter_defaultFilter && regex.iQuery.test( vars.defaultColFilter[ columnIndex ] ) ) {
data.filter = ts.filter.defaultFilter( data.filter, vars.defaultColFilter[ columnIndex ] );
// val is used to indicate that a filter select is using a default filter;
// so we override the exact & partial matches
val = false;
}
// data.iFilter = case insensitive (if wo.filter_ignoreCase is true), data.filter = case sensitive
data.iFilter = wo.filter_ignoreCase ? ( data.filter || '' ).toLowerCase() : data.filter;
fxn = vars.functions[ columnIndex ];
$cell = c.$headerIndexed[ columnIndex ];
hasSelect = $cell.hasClass( 'filter-select' );
filterMatched = null;
if ( fxn || ( hasSelect && val ) ) {
if ( fxn === true || hasSelect ) {
// default selector uses exact match unless "filter-match" class is found
filterMatched = ( $cell.hasClass( 'filter-match' ) ) ?
data.iExact.search( data.iFilter ) >= 0 : data.filter === data.exact;
} else if ( typeof fxn === 'function' ) {
// filter callback( exact cell content, parser normalized content,
// filter input value, column index, jQuery row object )
filterMatched = fxn( data.exact, data.cache, data.filter, columnIndex, data.$row, c, data );
} else if ( typeof fxn[ ffxn || data.filter ] === 'function' ) {
// selector option function
filterMatched =
fxn[ ffxn || data.filter ]( data.exact, data.cache, data.filter, columnIndex, data.$row, c, data );
}
}
if ( filterMatched === null ) {
// cycle through the different filters
// filters return a boolean or null if nothing matches
matches = null;
for ( ffxn in ts.filter.types ) {
if ( $.inArray( ffxn, excludeMatch ) < 0 && matches === null ) {
matches = ts.filter.types[ ffxn ]( c, data );
if ( matches !== null ) {
filterMatched = matches;
}
}
}
if ( filterMatched !== null ) {
result = filterMatched;
// Look for match, and add child row data for matching
} else {
txt = ( data.iExact + data.childRowText )
.indexOf( ts.filter.parseFilter( c, data.iFilter, columnIndex, data.parsed[ columnIndex ] ) );
result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) );
}
} else {
result = filterMatched;
}
showRow = ( result ) ? showRow : false;
}
}
return showRow;
},
findRows: function( table, filters, combinedFilters ) {
if ( table.config.lastCombinedFilter === combinedFilters ||
!table.config.widgetOptions.filter_initialized ) {
return;
}
var len, norm_rows, rowData, $rows, rowIndex, tbodyIndex, $tbody, columnIndex,
isChild, childRow, lastSearch, showRow, time, val, indx,
notFiltered, searchFiltered, query, injected, res, id, txt,
storedFilters = $.extend( [], filters ),
regex = ts.filter.regex,
c = table.config,
wo = c.widgetOptions,
// data object passed to filters; anyMatch is a flag for the filters
data = { anyMatch: false, filters: filters },
// anyMatch really screws up with these types of filters
noAnyMatch = [ 'range', 'notMatch', 'operators' ];
// clear regex cache prior to each search
wo.filter_regexCache = [];
data = {
anyMatch: false,
filters: filters,
// regex filter type cache
filter_regexCache : [],
},
vars = {
// anyMatch really screws up with these types of filters
noAnyMatch: [ 'range', 'notMatch', 'operators' ],
// cache filter variables that use ts.getColumnData in the main loop
functions : [],
excludeFilter : [],
defaultColFilter : [],
defaultAnyFilter : ts.getColumnData( table, wo.filter_defaultFilter, c.columns, true ) || ''
};
// parse columns after formatter, in case the class is added at that point
data.parsed = c.$headers.map(function(columnIndex) {
return c.parsers && c.parsers[columnIndex] && c.parsers[columnIndex].parsed ||
// getData won't return "parsed" if other "filter-" class names exist (e.g. <th class="filter-select filter-parsed">)
ts.getData && ts.getData(c.$headerIndexed[columnIndex], ts.getColumnData( table, c.headers, columnIndex ), 'filter') === 'parsed' ||
$(this).hasClass('filter-parsed');
data.parsed = c.$headers.map( function( columnIndex ) {
return c.parsers && c.parsers[ columnIndex ] &&
// force parsing if parser type is numeric
( c.parsers[ columnIndex ].parsed || c.parsers[ columnIndex ].type === 'numeric' ) ||
// getData won't return "parsed" if other "filter-" class names exist
// (e.g. <th class="filter-select filter-parsed">)
ts.getData && ts.getData( c.$headerIndexed[ columnIndex ],
ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' ||
$( this ).hasClass( 'filter-parsed' );
}).get();
// cache filter variables that use ts.getColumnData in the main loop
wo.filter_indexed = {
functions : [],
excludeFilter : [],
defaultColFilter : [],
defaultAnyFilter : ts.getColumnData( table, wo.filter_defaultFilter, c.columns, true ) || ''
};
for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
wo.filter_indexed.functions[ columnIndex ] = ts.getColumnData( table, wo.filter_functions, columnIndex );
wo.filter_indexed.defaultColFilter[ columnIndex ] = ts.getColumnData( table, wo.filter_defaultFilter, columnIndex ) || '';
wo.filter_indexed.excludeFilter[ columnIndex ] = ( ts.getColumnData( table, wo.filter_excludeFilter, columnIndex, true ) || '' ).split(/\s+/);
vars.functions[ columnIndex ] = ts.getColumnData( table, wo.filter_functions, columnIndex );
vars.defaultColFilter[ columnIndex ] = ts.getColumnData( table, wo.filter_defaultFilter, columnIndex ) || '';
vars.excludeFilter[ columnIndex ] = ( ts.getColumnData( table, wo.filter_excludeFilter, columnIndex, true ) || '' ).split(/\s+/);
}
if (c.debug) {
@ -860,10 +1018,10 @@ ts.filter = {
if ( (wo.filter_$anyMatch && wo.filter_$anyMatch.length) || typeof filters[c.columns] !== 'undefined' ) {
data.anyMatchFlag = true;
data.anyMatchFilter = wo.filter_$anyMatch && ts.filter.getLatestSearch( wo.filter_$anyMatch ).val() || ( '' + filters[c.columns] ) || '';
data.anyMatchFilter = '' + ( filters[c.columns] || wo.filter_$anyMatch && ts.filter.getLatestSearch( wo.filter_$anyMatch ).val() || '' );
if (wo.filter_columnAnyMatch) {
// specific columns search
query = data.anyMatchFilter.split( ts.filter.regex.andSplit );
query = data.anyMatchFilter.split( regex.andSplit );
injected = false;
for (indx = 0; indx < query.length; indx++) {
res = query[indx].split(':');
@ -918,169 +1076,68 @@ ts.filter = {
// replace accents
data.anyMatchFilter = ts.replaceAccents(data.anyMatchFilter);
}
if ( wo.filter_defaultFilter && regex.iQuery.test( wo.filter_indexed.defaultAnyFilter ) ) {
data.anyMatchFilter = ts.filter.defaultFilter( data.anyMatchFilter, wo.filter_indexed.defaultAnyFilter );
if ( wo.filter_defaultFilter && regex.iQuery.test( vars.defaultAnyFilter ) ) {
data.anyMatchFilter = ts.filter.defaultFilter( data.anyMatchFilter, vars.defaultAnyFilter );
// clear search filtered flag because default filters are not saved to the last search
searchFiltered = false;
}
// make iAnyMatchFilter lowercase unless both filter widget & core ignoreCase options are true
// when c.ignoreCase is true, the cache contains all lower case data
data.iAnyMatchFilter = !(wo.filter_ignoreCase && c.ignoreCase) ? data.anyMatchFilter : data.anyMatchFilter.toLocaleLowerCase();
data.iAnyMatchFilter = !(wo.filter_ignoreCase && c.ignoreCase) ? data.anyMatchFilter : data.anyMatchFilter.toLowerCase();
}
// loop through the rows
for (rowIndex = 0; rowIndex < len; rowIndex++) {
data.cacheArray = norm_rows[rowIndex];
data.rawArray = data.cacheArray[c.columns].raw;
data.$row = $rows.eq(rowIndex);
data.$cells = data.$row.children();
childRow = $rows[rowIndex].className;
txt = $rows[rowIndex].className;
// the first row can never be a child row
isChild = rowIndex && regex.child.test(txt);
// skip child rows & already filtered rows
if ( regex.child.test(childRow) || (searchFiltered && regex.filtered.test(childRow)) ) { continue; }
showRow = true;
// *** nextAll/nextUntil not supported by Zepto! ***
childRow = data.$row.nextUntil('tr:not(.' + c.cssChildRow + ')');
// so, if "table.config.widgetOptions.filter_childRows" is true and there is
// a match anywhere in the child row, then it will make the row visible
// checked here so the option can be changed dynamically
data.childRowText = (childRow.length && wo.filter_childRows) ? childRow.text() : '';
data.childRowText = wo.filter_ignoreCase ? data.childRowText.toLocaleLowerCase() : data.childRowText;
if (data.anyMatchFlag) {
// look for multiple columns "1-3,4-6,8"
columnIndex = ts.filter.multipleColumns( c, wo.filter_$anyMatch );
data.anyMatch = true;
data.rowArray = data.$cells.map(function(i){
if ( $.inArray(i, columnIndex) > -1 ) {
var txt;
if (data.parsed[i]) {
txt = data.cacheArray[i];
} else {
txt = data.rawArray[i];
txt = $.trim( wo.filter_ignoreCase ? txt.toLowerCase() : txt );
if (c.sortLocaleCompare) {
txt = ts.replaceAccents(txt);
}
}
return txt;
}
}).get();
data.filter = data.anyMatchFilter;
data.iFilter = data.iAnyMatchFilter;
data.exact = data.rowArray.join(' ');
data.iExact = wo.filter_ignoreCase ? data.exact.toLowerCase() : data.exact;
data.cache = data.cacheArray.slice(0,-1).join(' ');
filterMatched = null;
$.each(ts.filter.types, function(type, typeFunction) {
if ($.inArray(type, noAnyMatch) < 0) {
matches = typeFunction( c, data );
if (matches !== null) {
filterMatched = matches;
return false;
}
}
});
if (filterMatched !== null) {
showRow = filterMatched;
} else {
if (wo.filter_startsWith) {
showRow = false;
columnIndex = c.columns;
while (!showRow && columnIndex > 0) {
columnIndex--;
showRow = showRow || data.rowArray[columnIndex].indexOf(data.iFilter) === 0;
}
} else {
showRow = (data.iExact + data.childRowText).indexOf(data.iFilter) >= 0;
}
}
data.anyMatch = false;
if ( isChild || ( searchFiltered && regex.filtered.test( txt ) ) ) {
continue;
}
for (columnIndex = 0; columnIndex < c.columns; columnIndex++) {
data.filter = filters[columnIndex];
data.index = columnIndex;
data.$row = $rows.eq( rowIndex );
data.cacheArray = norm_rows[ rowIndex ];
rowData = data.cacheArray[ c.columns ];
data.rawArray = rowData.raw;
data.childRowText = '';
// filter types to exclude, per column
excludeMatch = wo.filter_indexed.excludeFilter[ columnIndex ];
// ignore if filter is empty or disabled
if (data.filter) {
data.cache = data.cacheArray[columnIndex];
// check if column data should be from the cell or from parsed data
if (wo.filter_useParsedData || data.parsed[columnIndex]) {
data.exact = data.cache;
} else {
result = data.rawArray[ columnIndex ] || '';
data.exact = c.sortLocaleCompare ? ts.replaceAccents(result) : result; // issue #405
}
data.iExact = !regex.type.test(typeof data.exact) && wo.filter_ignoreCase ? data.exact.toLocaleLowerCase() : data.exact;
result = showRow; // if showRow is true, show that row
// in case select filter option has a different value vs text "a - z|A through Z"
ffxn = wo.filter_columnFilters ?
c.$filters.add(c.$externalFilters).filter('[data-column="'+ columnIndex + '"]').find('select option:selected').attr('data-function-name') || '' : '';
// replace accents - see #357
if (c.sortLocaleCompare) {
data.filter = ts.replaceAccents(data.filter);
}
val = true;
if (wo.filter_defaultFilter && regex.iQuery.test( wo.filter_indexed.defaultColFilter[ columnIndex ] )) {
data.filter = ts.filter.defaultFilter( data.filter, wo.filter_indexed.defaultColFilter[ columnIndex ] );
// val is used to indicate that a filter select is using a default filter; so we override the exact & partial matches
val = false;
}
// data.iFilter = case insensitive (if wo.filter_ignoreCase is true), data.filter = case sensitive
data.iFilter = wo.filter_ignoreCase ? (data.filter || '').toLocaleLowerCase() : data.filter;
fxn = wo.filter_indexed.functions[ columnIndex ];
$cell = c.$headerIndexed[columnIndex];
hasSelect = $cell.hasClass('filter-select');
filterMatched = null;
if ( fxn || ( hasSelect && val ) ) {
if (fxn === true || hasSelect) {
// default selector uses exact match unless "filter-match" class is found
filterMatched = ($cell.hasClass('filter-match')) ? data.iExact.search(data.iFilter) >= 0 : data.filter === data.exact;
} else if (typeof fxn === 'function') {
// filter callback( exact cell content, parser normalized content, filter input value, column index, jQuery row object )
filterMatched = fxn(data.exact, data.cache, data.filter, columnIndex, data.$row, c, data);
} else if (typeof fxn[ffxn || data.filter] === 'function') {
// selector option function
filterMatched = fxn[ffxn || data.filter](data.exact, data.cache, data.filter, columnIndex, data.$row, c, data);
}
}
if (filterMatched === null) {
// cycle through the different filters
// filters return a boolean or null if nothing matches
$.each(ts.filter.types, function(type, typeFunction) {
if ($.inArray(type, excludeMatch) < 0) {
matches = typeFunction( c, data );
if (matches !== null) {
filterMatched = matches;
return false;
}
}
});
if (filterMatched !== null) {
result = filterMatched;
// Look for match, and add child row data for matching
} else {
data.exact = (data.iExact + data.childRowText).indexOf( ts.filter.parseFilter(c, data.iFilter, columnIndex, data.parsed[columnIndex]) );
result = ( (!wo.filter_startsWith && data.exact >= 0) || (wo.filter_startsWith && data.exact === 0) );
}
} else {
result = filterMatched;
}
showRow = (result) ? showRow : false;
if ( !wo.filter_childByColumn ) {
txt = '';
// child row cached text
childRow = rowData.child;
// so, if "table.config.widgetOptions.filter_childRows" is true and there is
// a match anywhere in the child row, then it will make the row visible
// checked here so the option can be changed dynamically
for (indx = 0; indx < childRow.length; indx++) {
txt += ' ' + childRow[indx].join('') || '';
}
data.childRowText = wo.filter_childRows ?
( wo.filter_ignoreCase ? txt.toLowerCase() : txt ) :
'';
}
data.$row
showRow = ts.filter.processRow( c, data, vars );
childRow = rowData.$row.filter(':gt(0)');
if ( wo.filter_childRows && childRow.length ) {
if ( wo.filter_childByColumn ) {
// cycle through each child row
for ( indx = 0; indx < childRow.length; indx++ ) {
data.$row = childRow.eq( indx );
data.cacheArray = rowData.child[ indx ];
data.rawArray = data.cacheArray;
// use OR comparison on child rows
showRow = showRow || ts.filter.processRow( c, data, vars );
}
}
childRow.toggleClass( wo.filter_filteredRow, !showRow );
}
rowData.$row
.toggleClass(wo.filter_filteredRow, !showRow)[0]
.display = showRow ? '' : 'none';
if (childRow.length) {
childRow.toggleClass(wo.filter_filteredRow, !showRow);
}
}
}
c.filteredRows += $rows.not('.' + wo.filter_filteredRow).length;
@ -1183,7 +1240,7 @@ ts.filter = {
},
getOptions: function(table, column, onlyAvail) {
table = $(table)[0];
var rowIndex, tbodyIndex, len, row, cache, cell,
var rowIndex, tbodyIndex, len, row, cache,
c = table.config,
wo = c.widgetOptions,
arry = [];

View File

@ -9,7 +9,7 @@
<script src="testing/qunit-1.16.0.js"></script>
<script src="docs/js/jquery-latest.min.js"></script>
<script src="js/jquery.tablesorter.js"></script>
<script src="js/jquery.tablesorter.widgets.js"></script>
<script src="js/widgets/widget-filter.js"></script>
<script src="js/parsers/parser-network.js"></script>
<script src="js/extras/jquery.metadata.js"></script>
<script src="testing/testing.js"></script>

View File

@ -68,7 +68,7 @@ $(function(){
'<tr><td>16</td><td>Jim</td><td>Franco</td><td>24</td><td>$14.19</td><td>14%</td><td>Jan 14, 2004 11:23 AM</td><td>Franco</td></tr>' +
'<tr><td>166</td><td>Bruce Lee</td><td>Evans</td><td>22</td><td>$13.19</td><td>11%</td><td>Jan 18, 2007 9:12 AM</td><td>Evans</td></tr>' +
'<tr><td>100</td><td>Brenda Dexter</td><td>McMasters</td><td>18</td><td>$55.20</td><td>15%</td><td>Feb 12, 2010 7:23 PM</td><td>McMasters</td></tr>' +
'<tr><td>55</td><td>Dennis</td><td>Bronson</td><td>65</td><td>$123.00</td><td>32%</td><td>Jan 20, 2001 1:12 PM</td><td>Bronson</td></tr>' +
'<tr><td>55</td><td>Dennis</td><td>Bronson</td><td>65</td><td>$123.00</td><td></td><td>Jan 20, 2001 1:12 PM</td><td>Bronson</td></tr>' +
'<tr><td>9</td><td>Martha</td><td>delFuego</td><td>25</td><td>$22.09</td><td>17%</td><td>Jun 11, 2011 10:55 AM</td><td>delFuego</td></tr>' +
'</tbody></table>').find('table');
this.table = this.$table[0];
@ -183,13 +183,13 @@ $(function(){
function(){ assert.cacheCompare( table, 4, [153.19, 123], 'search operator (>100); ensure search filtered gets cleared', true ); }
).nextTask(
function(){ ts.setFilters( table, ['', '', '', '', '', '>=20'], true ); },
function(){ assert.cacheCompare( table, 5, [22, 20, 25, 44, 44, 32], 'search operator (>=)', true ); }
function(){ assert.cacheCompare( table, 5, [22, 20, 25, 44, 44], 'search operator (>=)', true ); }
).nextTask(
function(){ ts.setFilters( table, ['', '', '', '', '', '<10'], true ); },
function(){ assert.cacheCompare( table, 5, [5, 4], 'search operator (<10)', true ); }
).nextTask(
function(){ ts.setFilters( table, ['', '', '', '', '', '<100'], true ); },
function(){ assert.cacheCompare( table, 5, [22, 5, 18, 20, 25, 44, 44, 4, 14, 11, 15, 32, 17], 'search operator (<100); ensure search filtered gets cleared', true ); }
function(){ assert.cacheCompare( table, 5, [22, 5, 18, 20, 25, 44, 44, 4, 14, 11, 15, 17], 'search operator (<100); ensure search filtered gets cleared', true ); }
).nextTask(
function(){ ts.setFilters( table, ['', '', '', '', '', '<=20'], true ); },
function(){ assert.cacheCompare( table, 5, [5, 18, 20, 4, 14, 11, 15, 17], 'search operator (<=)', true ); }
@ -249,7 +249,7 @@ $(function(){
function(){ assert.cacheCompare( table, 1, ['Bruce', 'Alex'], 'search - filter-match removed', true ); }
).nextTask( // filter reset
function(){ c.$table.trigger('filterReset'); },
function(){ assert.cacheCompare( table, 5, [22, 5, 18, 20, 25, 44, 44, 4, 14, 11, 15, 32, 17], 'filterReset', true ); }
function(){ assert.cacheCompare( table, 5, [22, 5, 18, 20, 25, 44, 44, 4, 14, 11, 15, '', 17], 'filterReset', true ); }
).nextTask( // filter parsed class
function(){
wo.filter_startsWith = false;