New: SearchPane now has a `column().paneOptions()` method that can be used to give it the options that should be displayed in the list, rather than just using the data available in the table. This is useful for server-side processing and more complex data sets.

New: SearchPane can have a `columns.searchPane.match` option set for each individual column allowing finer grain control over what gets matched. Currently only full string matching and sub-string matching any where in the original data is supported.
New: SearchPane example showing these two features - customOptions.html
pull/397/head
Allan Jardine 6 years ago
parent f3db23bdb9
commit b21102e105

@ -0,0 +1,537 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>DataTables search pane example</title>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="dataTables.searchPane.css">
<style type="text/css">
body {
font: 90%/1.45em "Helvetica Neue", HelveticaNeue, Helvetica, Arial, sans-serif;
margin: 0;
padding: 0;
color: #333;
background-color: #fff;
}
</style>
<script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" language="javascript" src="dataTables.searchPane.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready( function () {
var table = $('#example').DataTable( {
searchPane: true,
columnDefs: [ {
targets: 1,
searchPane: {
match: 'any'
}
} ]
} );
// Get the data from column index 1, and split it by words
var options = table
.column(1)
.data()
.map( function ( d ) {
return d.split(' ');
})
.flatten()
.sort();
// Apply that as the options for the column
table.column(1).paneOptions( options )
} );
</script>
</head>
<body>
<div class="container">
<table id="example" class="display nowrap" cellspacing="0" width="100%">
<thead>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Age</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Name</th>
<th>Position</th>
<th>Office</th>
<th>Age</th>
<th>Start date</th>
<th>Salary</th>
</tr>
</tfoot>
<tbody>
<tr>
<td>Tiger Nixon</td>
<td>System Architect</td>
<td>Edinburgh</td>
<td>61</td>
<td>2011/04/25</td>
<td>$320,800</td>
</tr>
<tr>
<td>Garrett Winters</td>
<td>Accountant</td>
<td>Tokyo</td>
<td>63</td>
<td>2011/07/25</td>
<td>$170,750</td>
</tr>
<tr>
<td>Ashton Cox</td>
<td>Junior Technical Author</td>
<td>San Francisco</td>
<td>66</td>
<td>2009/01/12</td>
<td>$86,000</td>
</tr>
<tr>
<td>Cedric Kelly</td>
<td>Senior Javascript Developer</td>
<td>Edinburgh</td>
<td>22</td>
<td>2012/03/29</td>
<td>$433,060</td>
</tr>
<tr>
<td>Airi Satou</td>
<td>Accountant</td>
<td>Tokyo</td>
<td>33</td>
<td>2008/11/28</td>
<td>$162,700</td>
</tr>
<tr>
<td>Brielle Williamson</td>
<td>Integration Specialist</td>
<td>New York</td>
<td>61</td>
<td>2012/12/02</td>
<td>$372,000</td>
</tr>
<tr>
<td>Herrod Chandler</td>
<td>Sales Assistant</td>
<td>San Francisco</td>
<td>59</td>
<td>2012/08/06</td>
<td>$137,500</td>
</tr>
<tr>
<td>Rhona Davidson</td>
<td>Integration Specialist</td>
<td>Tokyo</td>
<td>55</td>
<td>2010/10/14</td>
<td>$327,900</td>
</tr>
<tr>
<td>Colleen Hurst</td>
<td>Javascript Developer</td>
<td>San Francisco</td>
<td>39</td>
<td>2009/09/15</td>
<td>$205,500</td>
</tr>
<tr>
<td>Sonya Frost</td>
<td>Software Engineer</td>
<td>Edinburgh</td>
<td>23</td>
<td>2008/12/13</td>
<td>$103,600</td>
</tr>
<tr>
<td>Jena Gaines</td>
<td>Office Manager</td>
<td>London</td>
<td>30</td>
<td>2008/12/19</td>
<td>$90,560</td>
</tr>
<tr>
<td>Quinn Flynn</td>
<td>Support Lead</td>
<td>Edinburgh</td>
<td>22</td>
<td>2013/03/03</td>
<td>$342,000</td>
</tr>
<tr>
<td>Charde Marshall</td>
<td>Regional Director</td>
<td>San Francisco</td>
<td>36</td>
<td>2008/10/16</td>
<td>$470,600</td>
</tr>
<tr>
<td>Haley Kennedy</td>
<td>Senior Marketing Designer</td>
<td>London</td>
<td>43</td>
<td>2012/12/18</td>
<td>$313,500</td>
</tr>
<tr>
<td>Tatyana Fitzpatrick</td>
<td>Regional Director</td>
<td>London</td>
<td>19</td>
<td>2010/03/17</td>
<td>$385,750</td>
</tr>
<tr>
<td>Michael Silva</td>
<td>Marketing Designer</td>
<td>London</td>
<td>66</td>
<td>2012/11/27</td>
<td>$198,500</td>
</tr>
<tr>
<td>Paul Byrd</td>
<td>Chief Financial Officer (CFO)</td>
<td>New York</td>
<td>64</td>
<td>2010/06/09</td>
<td>$725,000</td>
</tr>
<tr>
<td>Gloria Little</td>
<td>Systems Administrator</td>
<td>New York</td>
<td>59</td>
<td>2009/04/10</td>
<td>$237,500</td>
</tr>
<tr>
<td>Bradley Greer</td>
<td>Software Engineer</td>
<td>London</td>
<td>41</td>
<td>2012/10/13</td>
<td>$132,000</td>
</tr>
<tr>
<td>Dai Rios</td>
<td>Personnel Lead</td>
<td>Edinburgh</td>
<td>35</td>
<td>2012/09/26</td>
<td>$217,500</td>
</tr>
<tr>
<td>Jenette Caldwell</td>
<td>Development Lead</td>
<td>New York</td>
<td>30</td>
<td>2011/09/03</td>
<td>$345,000</td>
</tr>
<tr>
<td>Yuri Berry</td>
<td>Chief Marketing Officer (CMO)</td>
<td>New York</td>
<td>40</td>
<td>2009/06/25</td>
<td>$675,000</td>
</tr>
<tr>
<td>Caesar Vance</td>
<td>Pre-Sales Support</td>
<td>New York</td>
<td>21</td>
<td>2011/12/12</td>
<td>$106,450</td>
</tr>
<tr>
<td>Doris Wilder</td>
<td>Sales Assistant</td>
<td>Sidney</td>
<td>23</td>
<td>2010/09/20</td>
<td>$85,600</td>
</tr>
<tr>
<td>Angelica Ramos</td>
<td>Chief Executive Officer (CEO)</td>
<td>London</td>
<td>47</td>
<td>2009/10/09</td>
<td>$1,200,000</td>
</tr>
<tr>
<td>Gavin Joyce</td>
<td>Developer</td>
<td>Edinburgh</td>
<td>42</td>
<td>2010/12/22</td>
<td>$92,575</td>
</tr>
<tr>
<td>Jennifer Chang</td>
<td>Regional Director</td>
<td>Singapore</td>
<td>28</td>
<td>2010/11/14</td>
<td>$357,650</td>
</tr>
<tr>
<td>Brenden Wagner</td>
<td>Software Engineer</td>
<td>San Francisco</td>
<td>28</td>
<td>2011/06/07</td>
<td>$206,850</td>
</tr>
<tr>
<td>Fiona Green</td>
<td>Chief Operating Officer (COO)</td>
<td>San Francisco</td>
<td>48</td>
<td>2010/03/11</td>
<td>$850,000</td>
</tr>
<tr>
<td>Shou Itou</td>
<td>Regional Marketing</td>
<td>Tokyo</td>
<td>20</td>
<td>2011/08/14</td>
<td>$163,000</td>
</tr>
<tr>
<td>Michelle House</td>
<td>Integration Specialist</td>
<td>Sidney</td>
<td>37</td>
<td>2011/06/02</td>
<td>$95,400</td>
</tr>
<tr>
<td>Suki Burks</td>
<td>Developer</td>
<td>London</td>
<td>53</td>
<td>2009/10/22</td>
<td>$114,500</td>
</tr>
<tr>
<td>Prescott Bartlett</td>
<td>Technical Author</td>
<td>London</td>
<td>27</td>
<td>2011/05/07</td>
<td>$145,000</td>
</tr>
<tr>
<td>Gavin Cortez</td>
<td>Team Leader</td>
<td>San Francisco</td>
<td>22</td>
<td>2008/10/26</td>
<td>$235,500</td>
</tr>
<tr>
<td>Martena Mccray</td>
<td>Post-Sales support</td>
<td>Edinburgh</td>
<td>46</td>
<td>2011/03/09</td>
<td>$324,050</td>
</tr>
<tr>
<td>Unity Butler</td>
<td>Marketing Designer</td>
<td>San Francisco</td>
<td>47</td>
<td>2009/12/09</td>
<td>$85,675</td>
</tr>
<tr>
<td>Howard Hatfield</td>
<td>Office Manager</td>
<td>San Francisco</td>
<td>51</td>
<td>2008/12/16</td>
<td>$164,500</td>
</tr>
<tr>
<td>Hope Fuentes</td>
<td>Secretary</td>
<td>San Francisco</td>
<td>41</td>
<td>2010/02/12</td>
<td>$109,850</td>
</tr>
<tr>
<td>Vivian Harrell</td>
<td>Financial Controller</td>
<td>San Francisco</td>
<td>62</td>
<td>2009/02/14</td>
<td>$452,500</td>
</tr>
<tr>
<td>Timothy Mooney</td>
<td>Office Manager</td>
<td>London</td>
<td>37</td>
<td>2008/12/11</td>
<td>$136,200</td>
</tr>
<tr>
<td>Jackson Bradshaw</td>
<td>Director</td>
<td>New York</td>
<td>65</td>
<td>2008/09/26</td>
<td>$645,750</td>
</tr>
<tr>
<td>Olivia Liang</td>
<td>Support Engineer</td>
<td>Singapore</td>
<td>64</td>
<td>2011/02/03</td>
<td>$234,500</td>
</tr>
<tr>
<td>Bruno Nash</td>
<td>Software Engineer</td>
<td>London</td>
<td>38</td>
<td>2011/05/03</td>
<td>$163,500</td>
</tr>
<tr>
<td>Sakura Yamamoto</td>
<td>Support Engineer</td>
<td>Tokyo</td>
<td>37</td>
<td>2009/08/19</td>
<td>$139,575</td>
</tr>
<tr>
<td>Thor Walton</td>
<td>Developer</td>
<td>New York</td>
<td>61</td>
<td>2013/08/11</td>
<td>$98,540</td>
</tr>
<tr>
<td>Finn Camacho</td>
<td>Support Engineer</td>
<td>San Francisco</td>
<td>47</td>
<td>2009/07/07</td>
<td>$87,500</td>
</tr>
<tr>
<td>Serge Baldwin</td>
<td>Data Coordinator</td>
<td>Singapore</td>
<td>64</td>
<td>2012/04/09</td>
<td>$138,575</td>
</tr>
<tr>
<td>Zenaida Frank</td>
<td>Software Engineer</td>
<td>New York</td>
<td>63</td>
<td>2010/01/04</td>
<td>$125,250</td>
</tr>
<tr>
<td>Zorita Serrano</td>
<td>Software Engineer</td>
<td>San Francisco</td>
<td>56</td>
<td>2012/06/01</td>
<td>$115,000</td>
</tr>
<tr>
<td>Jennifer Acosta</td>
<td>Junior Javascript Developer</td>
<td>Edinburgh</td>
<td>43</td>
<td>2013/02/01</td>
<td>$75,650</td>
</tr>
<tr>
<td>Cara Stevens</td>
<td>Sales Assistant</td>
<td>New York</td>
<td>46</td>
<td>2011/12/06</td>
<td>$145,600</td>
</tr>
<tr>
<td>Hermione Butler</td>
<td>Regional Director</td>
<td>London</td>
<td>47</td>
<td>2011/03/21</td>
<td>$356,250</td>
</tr>
<tr>
<td>Lael Greer</td>
<td>Systems Administrator</td>
<td>London</td>
<td>21</td>
<td>2009/02/27</td>
<td>$103,500</td>
</tr>
<tr>
<td>Jonas Alexander</td>
<td>Developer</td>
<td>San Francisco</td>
<td>30</td>
<td>2010/07/14</td>
<td>$86,500</td>
</tr>
<tr>
<td>Shad Decker</td>
<td>Regional Director</td>
<td>Edinburgh</td>
<td>51</td>
<td>2008/11/13</td>
<td>$183,000</td>
</tr>
<tr>
<td>Michael Bruce</td>
<td>Javascript Developer</td>
<td>Singapore</td>
<td>29</td>
<td>2011/06/27</td>
<td>$183,000</td>
</tr>
<tr>
<td>Donna Snider</td>
<td>Customer Support</td>
<td>New York</td>
<td>27</td>
<td>2011/01/25</td>
<td>$112,000</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>

@ -95,8 +95,7 @@
_attach: function() { _attach: function() {
var container = this.c.container; var container = this.c.container;
var host = var host = typeof container === 'function' ? container(this.s.dt) : container;
typeof container === 'function' ? container(this.s.dt) : container;
if (this.c.insert === 'prepend') { if (this.c.insert === 'prepend') {
$(this.dom.container).prependTo(host); $(this.dom.container).prependTo(host);
@ -108,7 +107,9 @@
_binData: function(data) { _binData: function(data) {
var out = {}; var out = {};
data.each(function(d) { for (var i = 0, ien = data.length; i < ien; i++) {
var d = data[i];
if (!d) { if (!d) {
return; return;
} }
@ -118,7 +119,7 @@
} else { } else {
out[d]++; out[d]++;
} }
}); }
return out; return out;
}, },
@ -142,8 +143,10 @@
var paneClasses = classes.pane; var paneClasses = classes.pane;
var table = this.s.dt; var table = this.s.dt;
var column = table.column(idx); var column = table.column(idx);
var colOpts = this._getOptions(idx);
var list = $('<ul/>'); var list = $('<ul/>');
var bins = this._binData(column.data().flatten()); var binData = colOpts.options ? new DataTable.Api(null, colOpts.options) : column.data();
var bins = this._binData(binData.flatten());
// Don't show the pane if there isn't enough variance in the data // Don't show the pane if there isn't enough variance in the data
if (this._variance(bins) < this.c.threshold) { if (this._variance(bins) < this.c.threshold) {
@ -155,8 +158,7 @@
var search = column.search(); var search = column.search();
search = search ? search.substr(1, search.length - 2).split('|') : []; search = search ? search.substr(1, search.length - 2).split('|') : [];
var data = column var data = binData
.data()
.unique() .unique()
.sort() .sort()
.toArray(); .toArray();
@ -164,9 +166,7 @@
for (var i = 0, ien = data.length; i < ien; i++) { for (var i = 0, ien = data.length; i < ien; i++) {
if (data[i]) { if (data[i]) {
var li = $('<li/>') var li = $('<li/>')
.html( .html('<span class="' + itemClasses.label + '">' + data[i] + '</span>')
'<span class="' + itemClasses.label + '">' + data[i] + '</span>'
)
.data('filter', data[i]) .data('filter', data[i])
.append( .append(
$('<span/>') $('<span/>')
@ -175,9 +175,7 @@
); );
if (search.length) { if (search.length) {
var escaped = data[i].replace var escaped = data[i].replace ? $.fn.dataTable.util.escapeRegex(data[i]) : data[i];
? $.fn.dataTable.util.escapeRegex(data[i])
: data[i];
if ($.inArray(escaped, search) !== -1) { if ($.inArray(escaped, search) !== -1) {
li.addClass(itemClasses.selected); li.addClass(itemClasses.selected);
@ -192,11 +190,7 @@
.data('column', idx) .data('column', idx)
.addClass(paneClasses.container) .addClass(paneClasses.container)
.addClass(search.length ? paneClasses.active : '') .addClass(search.length ? paneClasses.active : '')
.append( .append($('<button type="button">&times;</button>').addClass(this.classes.clear))
$('<button type="button">&times;</button>').addClass(
this.classes.clear
)
)
.append( .append(
$('<div/>') $('<div/>')
.addClass(paneClasses.title) .addClass(paneClasses.title)
@ -222,12 +216,20 @@
} }
}, },
_getOptions: function ( colIdx ) {
var table = this.s.dt;
return table.settings()[0].aoColumns[colIdx].searchPane || {};
},
_toggle: function(li) { _toggle: function(li) {
var classes = this.classes; var classes = this.classes;
var itemSelected = classes.item.selected; var itemSelected = classes.item.selected;
var table = this.s.dt; var table = this.s.dt;
var li = $(li); var li = $(li);
var pane = li.closest('div.' + classes.pane.container); var pane = li.closest('div.' + classes.pane.container);
var columnIdx = pane.data('column');
var options = this._getOptions(columnIdx);
li.toggleClass(itemSelected, !li.hasClass(itemSelected)); li.toggleClass(itemSelected, !li.hasClass(itemSelected));
@ -236,13 +238,32 @@
if (filters.length === 0) { if (filters.length === 0) {
pane.removeClass(classes.pane.active); pane.removeClass(classes.pane.active);
table table
.column(pane.data('column')) .column(columnIdx)
.search('') .search('')
.draw(); .draw();
} else if (options.match === 'any') {
// Allow sub-word matching
pane.addClass(classes.pane.active);
table
.column(columnIdx)
.search(
'(' +
$.map(filters, function(filter) {
var d = $(filter)
.data('filter')
.toString();
return $.fn.dataTable.util.escapeRegex(d);
}).join('|') +
')',
true,
false
)
.draw();
} else { } else {
// Only search on the full phrase
pane.addClass(classes.pane.active); pane.addClass(classes.pane.active);
table table
.column(pane.data('column')) .column(columnIdx)
.search( .search(
'^(' + '^(' +
$.map(filters, function(filter) { $.map(filters, function(filter) {
@ -318,6 +339,21 @@
}); });
}); });
DataTable.Api.register('column().paneOptions()', function(options) {
return this.iterator('column', function(ctx, idx) {
var col = ctx.aoColumns[idx];
if (ctx.searchPane) {
if (!col.searchPane) {
col.searchPane = {};
}
col.searchPane.options = options;
ctx.searchPane.rebuild();
}
});
});
$(document).on('init.dt', function(e, settings, json) { $(document).on('init.dt', function(e, settings, json) {
if (e.namespace !== 'dt') { if (e.namespace !== 'dt') {
return; return;

@ -1,12 +1,26 @@
/*! /*!
Copyright 2017 SpryMedia Ltd.
This source file is free software, available under the following license:
MIT license - http://datatables.net/license/mit
This source file is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
For details please refer to: http://www.datatables.net
SearchPane 0.0.1 SearchPane 0.0.1
2017 SpryMedia Ltd - datatables.net/license 2017 SpryMedia Ltd - datatables.net/license
*/ */
(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(d){return b(d,window,document)}):"object"===typeof exports?module.exports=function(d,h){d||(d=window);if(!h||!h.fn.dataTable)h=require("datatables.net")(d,h).$;return b(h,d,d.document)}:b(jQuery,window,document)})(function(b,d,h,k){function f(a,c){var g=this,e=new j.Api(a);this.classes=b.extend(!0,{},f.classes);this.dom={container:b("<div/>").addClass(this.classes.container)};this.c=b.extend(!0,{},f.defaults, var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,f,c){a instanceof String&&(a=String(a));for(var g=a.length,d=0;d<g;d++){var k=a[d];if(f.call(c,k,d,a))return{i:d,v:k}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(a,f,c){a!=Array.prototype&&a!=Object.prototype&&(a[f]=c.value)};
c);this.s={dt:e};e.settings()[0].searchPane=this;e.columns(this.c.columns).eq(0).each(function(a){g._pane(a)});b(this.dom.container).on("click","li",function(){g._toggle(this)}).on("click","button."+this.classes.clear,function(){g._clear(b(this).closest("div."+g.classes.pane.container))});this._attach()}var j=b.fn.dataTable;b.extend(f.prototype,{rebuild:function(){var a=this;this.s.dt.columns(this.c.columns).eq(0).each(function(c){a._pane(c)})},_attach:function(){var a=this.c.container,a="function"=== $jscomp.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(a,f,c,g){if(f){c=$jscomp.global;a=a.split(".");for(g=0;g<a.length-1;g++){var d=a[g];d in c||(c[d]={});c=c[d]}a=a[a.length-1];g=c[a];f=f(g);f!=g&&null!=f&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:f})}};
typeof a?a(this.s.dt):a;"prepend"===this.c.insert?b(this.dom.container).prependTo(a):b(this.dom.container).appendTo(a)},_binData:function(a){var c={};a.each(function(a){a&&(c[a]?c[a]++:c[a]=1)});return c},_clear:function(a){var c=this.classes,b=c.item.selected;a.find("li."+b).removeClass(b);a.removeClass(c.pane.active);this.s.dt.column(a.data("column")).search("").draw()},_pane:function(a){var c=this.classes,g=c.item,c=c.pane,e=this.s.dt.column(a),l=b("<ul/>"),m=this._binData(e.data().flatten()); $jscomp.polyfill("Array.prototype.find",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},"es6-impl","es3");
if(!(this._variance(m)<this.c.threshold)){for(var f=e.search(),f=f?f.substr(1,f.length-2).split("|"):[],d=e.data().unique().sort().toArray(),i=0,h=d.length;i<h;i++)if(d[i]){var j=b("<li/>").html('<span class="'+g.label+'">'+d[i]+"</span>").data("filter",d[i]).append(b("<span/>").addClass(g.count).html(m[d[i]]));if(f.length){var k=d[i].replace?b.fn.dataTable.util.escapeRegex(d[i]):d[i];-1!==b.inArray(k,f)&&j.addClass(g.selected)}l.append(j)}g=b("<div/>").data("column",a).addClass(c.container).addClass(f.length? (function(a){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(f){return a(f,window,document)}):"object"===typeof exports?module.exports=function(f,c){f||(f=window);c&&c.fn.dataTable||(c=require("datatables.net")(f,c).$);return a(c,f,f.document)}:a(jQuery,window,document)})(function(a,f,c,g){function d(b,h){var e=this;b=new k.Api(b);this.classes=a.extend(!0,{},d.classes);this.dom={container:a("<div/>").addClass(this.classes.container)};this.c=a.extend(!0,{},d.defaults,
c.active:"").append(b('<button type="button">&times;</button>').addClass(this.classes.clear)).append(b("<div/>").addClass(c.title).html(b(e.header()).text())).append(b("<div/>").addClass(c.scroller).append(l));c=this.dom.container;e=c.children().map(function(){if(b(this).data("column")==a)return this});e.length?e.replaceWith(g):b(c).append(g)}},_toggle:function(a){var c=this.classes,g=c.item.selected,e=this.s.dt,a=b(a),d=a.closest("div."+c.pane.container);a.toggleClass(g,!a.hasClass(g));a=d.find("li."+ h);this.s={dt:b};b.settings()[0].searchPane=this;b.columns(this.c.columns).eq(0).each(function(a){e._pane(a)});a(this.dom.container).on("click","li",function(){e._toggle(this)}).on("click","button."+this.classes.clear,function(){e._clear(a(this).closest("div."+e.classes.pane.container))});this._attach()}var k=a.fn.dataTable;a.extend(d.prototype,{rebuild:function(){var a=this;this.s.dt.columns(this.c.columns).eq(0).each(function(b){a._pane(b)})},_attach:function(){var b=this.c.container,b="function"===
g);0===a.length?(d.removeClass(c.pane.active),e.column(d.data("column")).search("").draw()):(d.addClass(c.pane.active),e.column(d.data("column")).search("^("+b.map(a,function(a){a=b(a).data("filter").toString();return b.fn.dataTable.util.escapeRegex(a)}).join("|")+")$",!0,!1).draw())},_variance:function(a){for(var a=b.map(a,function(a){return a}),c=a.length,g=0,e=0,d=c;e<d;e++)g+=a[e];for(var g=g/c,f=0,e=0,d=c;e<d;e++)f+=Math.pow(g-a[e],2);return f/(c-1)}});f.classes={container:"dt-searchPanes",clear:"clear", typeof b?b(this.s.dt):b;"prepend"===this.c.insert?a(this.dom.container).prependTo(b):a(this.dom.container).appendTo(b)},_binData:function(a){for(var b={},e=0,c=a.length;e<c;e++){var l=a[e];if(!l)return;b[l]?b[l]++:b[l]=1}return b},_clear:function(a){var b=this.classes,e=b.item.selected;a.find("li."+e).removeClass(e);a.removeClass(b.pane.active);this.s.dt.column(a.data("column")).search("").draw()},_pane:function(b){var h=this.classes,e=h.item,h=h.pane,c=this.s.dt.column(b),l=this._getOptions(b),f=
pane:{active:"filtering",container:"pane",title:"title",scroller:"scroller"},item:{selected:"selected",label:"label",count:"count"}};f.defaults={container:function(a){return a.table().container()},columns:k,insert:"prepend",threshold:0.5};f.version="0.0.1";b.fn.dataTable.SearchPanes=f;b.fn.DataTable.SearchPanes=f;j.Api.register("searchPanes.rebuild()",function(){return this.iterator("table",function(a){a.searchPane&&a.searchPane.rebuild()})});b(h).on("init.dt",function(a,c){if("dt"===a.namespace){var d= a("<ul/>"),d=l.options?new k.Api(null,l.options):c.data(),l=this._binData(d.flatten());if(!(this._variance(l)<this.c.threshold)){for(var m=c.search(),m=m?m.substr(1,m.length-2).split("|"):[],d=d.unique().sort().toArray(),g=0,p=d.length;g<p;g++)if(d[g]){var n=a("<li/>").html('<span class="'+e.label+'">'+d[g]+"</span>").data("filter",d[g]).append(a("<span/>").addClass(e.count).html(l[d[g]]));if(m.length){var q=d[g].replace?a.fn.dataTable.util.escapeRegex(d[g]):d[g];-1!==a.inArray(q,m)&&n.addClass(e.selected)}f.append(n)}e=
c.oInit.searchPane,e=j.defaults.searchPane;if(d||e)e=b.extend({},d,e),!1!==d&&new f(c,e)}})}); a("<div/>").data("column",b).addClass(h.container).addClass(m.length?h.active:"").append(a('<button type="button">&times;</button>').addClass(this.classes.clear)).append(a("<div/>").addClass(h.title).html(a(c.header()).text())).append(a("<div/>").addClass(h.scroller).append(f));h=this.dom.container;c=h.children().map(function(){if(a(this).data("column")==b)return this});c.length?c.replaceWith(e):a(h).append(e)}},_getOptions:function(a){return this.s.dt.settings()[0].aoColumns[a].searchPane||{}},_toggle:function(b){var d=
this.classes,e=d.item.selected,c=this.s.dt;b=a(b);var f=b.closest("div."+d.pane.container),g=f.data("column"),k=this._getOptions(g);b.toggleClass(e,!b.hasClass(e));b=f.find("li."+e);0===b.length?(f.removeClass(d.pane.active),c.column(g).search("").draw()):"any"===k.match?(f.addClass(d.pane.active),c.column(g).search("("+a.map(b,function(b){b=a(b).data("filter").toString();return a.fn.dataTable.util.escapeRegex(b)}).join("|")+")",!0,!1).draw()):(f.addClass(d.pane.active),c.column(g).search("^("+a.map(b,
function(b){b=a(b).data("filter").toString();return a.fn.dataTable.util.escapeRegex(b)}).join("|")+")$",!0,!1).draw())},_variance:function(b){b=a.map(b,function(a,b){return a});for(var d=b.length,e=0,c=0,f=d;c<f;c++)e+=b[c];for(var e=e/d,g=0,c=0,f=d;c<f;c++)g+=Math.pow(e-b[c],2);return g/(d-1)}});d.classes={container:"dt-searchPanes",clear:"clear",pane:{active:"filtering",container:"pane",title:"title",scroller:"scroller"},item:{selected:"selected",label:"label",count:"count"}};d.defaults={container:function(a){return a.table().container()},
columns:g,insert:"prepend",threshold:.5};d.version="0.0.1";a.fn.dataTable.SearchPanes=d;a.fn.DataTable.SearchPanes=d;k.Api.register("searchPanes.rebuild()",function(){return this.iterator("table",function(a){a.searchPane&&a.searchPane.rebuild()})});k.Api.register("column().paneOptions()",function(a){return this.iterator("column",function(b,c){c=b.aoColumns[c];b.searchPane&&(c.searchPane||(c.searchPane={}),c.searchPane.options=a,b.searchPane.rebuild())})});a(c).on("init.dt",function(b,c,e){"dt"===
b.namespace&&(b=c.oInit.searchPane,e=k.defaults.searchPane,b||e)&&(e=a.extend({},b,e),!1!==b&&new d(c,e))})});

Loading…
Cancel
Save