2015-12-01 05:06:34 +00:00
|
|
|
(function ($, w, undefined) {
|
|
|
|
if (w.footable === undefined || w.footable === null)
|
|
|
|
throw new Error('Please check and make sure footable.js is included in the page and is loaded prior to this script.');
|
|
|
|
|
|
|
|
var defaults = {
|
|
|
|
filter: {
|
|
|
|
enabled: true,
|
|
|
|
input: '.footable-filter',
|
|
|
|
timeout: 300,
|
|
|
|
minimum: 2,
|
|
|
|
disableEnter: false,
|
|
|
|
filterFunction: function(index) {
|
|
|
|
var $t = $(this),
|
|
|
|
$table = $t.parents('table:first'),
|
|
|
|
filter = $table.data('current-filter').toUpperCase(),
|
|
|
|
text = $t.find('td').text();
|
|
|
|
if (!$table.data('filter-text-only')) {
|
|
|
|
$t.find('td[data-value]').each(function () {
|
|
|
|
text += $(this).data('value');
|
|
|
|
});
|
|
|
|
}
|
|
|
|
return text.toUpperCase().indexOf(filter) >= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
function Filter() {
|
|
|
|
var p = this;
|
|
|
|
p.name = 'Footable Filter';
|
|
|
|
p.init = function (ft) {
|
|
|
|
p.footable = ft;
|
|
|
|
if (ft.options.filter.enabled === true) {
|
|
|
|
if ($(ft.table).data('filter') === false) return;
|
|
|
|
ft.timers.register('filter');
|
|
|
|
$(ft.table)
|
|
|
|
.unbind('.filtering')
|
|
|
|
.bind({
|
|
|
|
'footable_initialized.filtering': function (e) {
|
|
|
|
var $table = $(ft.table);
|
|
|
|
var data = {
|
|
|
|
'input': $table.data('filter') || ft.options.filter.input,
|
|
|
|
'timeout': $table.data('filter-timeout') || ft.options.filter.timeout,
|
|
|
|
'minimum': $table.data('filter-minimum') || ft.options.filter.minimum,
|
|
|
|
'disableEnter': $table.data('filter-disable-enter') || ft.options.filter.disableEnter
|
|
|
|
};
|
|
|
|
if (data.disableEnter) {
|
|
|
|
$(data.input).keypress(function (event) {
|
|
|
|
if (window.event)
|
|
|
|
return (window.event.keyCode !== 13);
|
|
|
|
else
|
|
|
|
return (event.which !== 13);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
$table.bind('footable_clear_filter', function () {
|
|
|
|
$(data.input).val('');
|
|
|
|
p.clearFilter();
|
|
|
|
});
|
|
|
|
$table.bind('footable_filter', function (event, args) {
|
|
|
|
p.filter(args.filter);
|
|
|
|
});
|
|
|
|
$(data.input).keyup(function (eve) {
|
|
|
|
ft.timers.filter.stop();
|
|
|
|
if (eve.which === 27) {
|
|
|
|
$(data.input).val('');
|
|
|
|
}
|
|
|
|
ft.timers.filter.start(function () {
|
|
|
|
var val = $(data.input).val() || '';
|
|
|
|
p.filter(val);
|
|
|
|
}, data.timeout);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
'footable_redrawn.filtering': function (e) {
|
|
|
|
var $table = $(ft.table),
|
|
|
|
filter = $table.data('filter-string');
|
|
|
|
if (filter) {
|
|
|
|
p.filter(filter);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
//save the filter object onto the table so we can access it later
|
|
|
|
.data('footable-filter', p);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
p.filter = function (filterString) {
|
|
|
|
var ft = p.footable,
|
|
|
|
$table = $(ft.table),
|
|
|
|
minimum = $table.data('filter-minimum') || ft.options.filter.minimum,
|
|
|
|
clear = !filterString;
|
|
|
|
|
|
|
|
//raise a pre-filter event so that we can cancel the filtering if needed
|
|
|
|
var event = ft.raise('footable_filtering', { filter: filterString, clear: clear });
|
|
|
|
if (event && event.result === false) return;
|
|
|
|
if (event.filter && event.filter.length < minimum) {
|
|
|
|
return; //if we do not have the minimum chars then do nothing
|
|
|
|
}
|
|
|
|
|
|
|
|
if (event.clear) {
|
|
|
|
p.clearFilter();
|
|
|
|
} else {
|
|
|
|
var filters = event.filter.split(' ');
|
|
|
|
|
|
|
|
$table.find('> tbody > tr').hide().addClass('footable-filtered');
|
|
|
|
var rows = $table.find('> tbody > tr:not(.footable-row-detail)');
|
|
|
|
$.each(filters, function (i, f) {
|
|
|
|
if (f && f.length > 0) {
|
|
|
|
$table.data('current-filter', f);
|
|
|
|
rows = rows.filter(ft.options.filter.filterFunction);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
rows.each(function () {
|
|
|
|
p.showRow(this, ft);
|
|
|
|
$(this).removeClass('footable-filtered');
|
|
|
|
});
|
|
|
|
$table.data('filter-string', event.filter);
|
|
|
|
ft.raise('footable_filtered', { filter: event.filter, clear: false });
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
p.clearFilter = function () {
|
|
|
|
var ft = p.footable,
|
|
|
|
$table = $(ft.table);
|
|
|
|
|
|
|
|
$table.find('> tbody > tr:not(.footable-row-detail)').removeClass('footable-filtered').each(function () {
|
|
|
|
p.showRow(this, ft);
|
|
|
|
});
|
|
|
|
$table.removeData('filter-string');
|
|
|
|
ft.raise('footable_filtered', { clear: true });
|
|
|
|
};
|
|
|
|
|
|
|
|
p.showRow = function (row, ft) {
|
|
|
|
var $row = $(row), $next = $row.next(), $table = $(ft.table);
|
2016-03-22 12:14:16 +00:00
|
|
|
if ($row.is(':visible')) return; //already visible - do nothing
|
2015-12-01 05:06:34 +00:00
|
|
|
if ($table.hasClass('breakpoint') && $row.hasClass('footable-detail-show') && $next.hasClass('footable-row-detail')) {
|
|
|
|
$row.add($next).show();
|
|
|
|
ft.createOrUpdateDetailRow(row);
|
|
|
|
}
|
|
|
|
else $row.show();
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
w.footable.plugins.register(Filter, defaults);
|
|
|
|
|
|
|
|
})(jQuery, window);
|