358 lines
15 KiB
JavaScript
358 lines
15 KiB
JavaScript
(function ($$1) {
|
|
'use strict';
|
|
|
|
$$1 = 'default' in $$1 ? $$1['default'] : $$1;
|
|
|
|
var FilterMenu = function () {
|
|
function FilterMenu(target, th, column, index, options) {
|
|
this.options = options;
|
|
this.th = th;
|
|
this.column = column;
|
|
this.index = index;
|
|
this.tds = target.find('tbody tr td:nth-child(' + (this.column + 1) + ')').toArray();
|
|
}
|
|
FilterMenu.prototype.initialize = function () {
|
|
this.menu = this.dropdownFilterDropdown();
|
|
this.th.appendChild(this.menu);
|
|
var $trigger = $(this.menu.children[0]);
|
|
var $content = $(this.menu.children[1]);
|
|
var $menu = $(this.menu);
|
|
$trigger.click(function () {
|
|
return $content.toggle();
|
|
});
|
|
$(document).click(function (el) {
|
|
if (!$menu.is(el.target) && $menu.has(el.target).length === 0) {
|
|
$content.hide();
|
|
}
|
|
});
|
|
};
|
|
FilterMenu.prototype.searchToggle = function (value) {
|
|
if (this.selectAllCheckbox instanceof HTMLInputElement) this.selectAllCheckbox.checked = false;
|
|
if (value.length === 0) {
|
|
this.toggleAll(true);
|
|
if (this.selectAllCheckbox instanceof HTMLInputElement) this.selectAllCheckbox.checked = true;
|
|
return;
|
|
}
|
|
this.toggleAll(false);
|
|
this.inputs.filter(function (input) {
|
|
return input.value.toLowerCase().indexOf(value.toLowerCase()) > -1;
|
|
}).forEach(function (input) {
|
|
input.checked = true;
|
|
});
|
|
};
|
|
FilterMenu.prototype.updateSelectAll = function () {
|
|
if (this.selectAllCheckbox instanceof HTMLInputElement) {
|
|
$(this.searchFilter).val('');
|
|
this.selectAllCheckbox.checked = this.inputs.length === this.inputs.filter(function (input) {
|
|
return input.checked;
|
|
}).length;
|
|
}
|
|
};
|
|
FilterMenu.prototype.selectAllUpdate = function (checked) {
|
|
$(this.searchFilter).val('');
|
|
this.toggleAll(checked);
|
|
};
|
|
FilterMenu.prototype.toggleAll = function (checked) {
|
|
for (var i = 0; i < this.inputs.length; i++) {
|
|
var input = this.inputs[i];
|
|
if (input instanceof HTMLInputElement) input.checked = checked;
|
|
}
|
|
};
|
|
FilterMenu.prototype.dropdownFilterItem = function (td, self) {
|
|
var value = td.innerText;
|
|
var dropdownFilterItem = document.createElement('div');
|
|
dropdownFilterItem.className = 'dropdown-filter-item';
|
|
var input = document.createElement('input');
|
|
input.type = 'checkbox';
|
|
input.value = value.trim().replace(/ +(?= )/g, '');
|
|
input.setAttribute('checked', 'checked');
|
|
input.className = 'dropdown-filter-menu-item item';
|
|
input.setAttribute('data-column', self.column.toString());
|
|
input.setAttribute('data-index', self.index.toString());
|
|
dropdownFilterItem.appendChild(input);
|
|
dropdownFilterItem.innerHTML = dropdownFilterItem.innerHTML.trim() + ' ' + value;
|
|
return dropdownFilterItem;
|
|
};
|
|
FilterMenu.prototype.dropdownFilterItemSelectAll = function () {
|
|
var value = this.options.captions.select_all;
|
|
var dropdownFilterItemSelectAll = document.createElement('div');
|
|
dropdownFilterItemSelectAll.className = 'dropdown-filter-item';
|
|
var input = document.createElement('input');
|
|
input.type = 'checkbox';
|
|
input.value = this.options.captions.select_all;
|
|
input.setAttribute('checked', 'checked');
|
|
input.className = 'dropdown-filter-menu-item select-all';
|
|
input.setAttribute('data-column', this.column.toString());
|
|
input.setAttribute('data-index', this.index.toString());
|
|
dropdownFilterItemSelectAll.appendChild(input);
|
|
dropdownFilterItemSelectAll.innerHTML = dropdownFilterItemSelectAll.innerHTML + ' ' + value;
|
|
return dropdownFilterItemSelectAll;
|
|
};
|
|
FilterMenu.prototype.dropdownFilterSearch = function () {
|
|
var dropdownFilterItem = document.createElement('div');
|
|
dropdownFilterItem.className = 'dropdown-filter-search';
|
|
var input = document.createElement('input');
|
|
input.type = 'text';
|
|
input.className = 'dropdown-filter-menu-search form-control';
|
|
input.setAttribute('data-column', this.column.toString());
|
|
input.setAttribute('data-index', this.index.toString());
|
|
input.setAttribute('placeholder', this.options.captions.search);
|
|
dropdownFilterItem.appendChild(input);
|
|
return dropdownFilterItem;
|
|
};
|
|
FilterMenu.prototype.dropdownFilterSort = function (direction) {
|
|
var dropdownFilterItem = document.createElement('div');
|
|
dropdownFilterItem.className = 'dropdown-filter-sort';
|
|
var span = document.createElement('span');
|
|
span.className = direction.toLowerCase().split(' ').join('-');
|
|
span.setAttribute('data-column', this.column.toString());
|
|
span.setAttribute('data-index', this.index.toString());
|
|
span.innerText = direction;
|
|
dropdownFilterItem.appendChild(span);
|
|
return dropdownFilterItem;
|
|
};
|
|
FilterMenu.prototype.dropdownFilterContent = function () {
|
|
var _this = this;
|
|
var self = this;
|
|
var dropdownFilterContent = document.createElement('div');
|
|
dropdownFilterContent.className = 'dropdown-filter-content';
|
|
var innerDivs = this.tds.reduce(function (arr, el) {
|
|
var values = arr.map(function (el) {
|
|
return el.innerText.trim();
|
|
});
|
|
if (values.indexOf(el.innerText.trim()) < 0) arr.push(el);
|
|
return arr;
|
|
}, []).sort(function (a, b) {
|
|
var A = a.innerText.toLowerCase();
|
|
var B = b.innerText.toLowerCase();
|
|
if (!isNaN(Number(A)) && !isNaN(Number(B))) {
|
|
if (Number(A) < Number(B)) return -1;
|
|
if (Number(A) > Number(B)) return 1;
|
|
} else {
|
|
if (A < B) return -1;
|
|
if (A > B) return 1;
|
|
}
|
|
return 0;
|
|
}).map(function (td) {
|
|
return _this.dropdownFilterItem(td, self);
|
|
});
|
|
this.inputs = innerDivs.map(function (div) {
|
|
return div.firstElementChild;
|
|
});
|
|
var selectAllCheckboxDiv = this.dropdownFilterItemSelectAll();
|
|
this.selectAllCheckbox = selectAllCheckboxDiv.firstElementChild;
|
|
innerDivs.unshift(selectAllCheckboxDiv);
|
|
var searchFilterDiv = this.dropdownFilterSearch();
|
|
this.searchFilter = searchFilterDiv.firstElementChild;
|
|
var outerDiv = innerDivs.reduce(function (outerDiv, innerDiv) {
|
|
outerDiv.appendChild(innerDiv);
|
|
return outerDiv;
|
|
}, document.createElement('div'));
|
|
outerDiv.className = 'checkbox-container';
|
|
var elements = [];
|
|
if (this.options.sort) elements = elements.concat([this.dropdownFilterSort(this.options.captions.a_to_z), this.dropdownFilterSort(this.options.captions.z_to_a)]);
|
|
if (this.options.search) elements.push(searchFilterDiv);
|
|
return elements.concat(outerDiv).reduce(function (html, el) {
|
|
html.appendChild(el);
|
|
return html;
|
|
}, dropdownFilterContent);
|
|
};
|
|
FilterMenu.prototype.dropdownFilterDropdown = function () {
|
|
var dropdownFilterDropdown = document.createElement('div');
|
|
dropdownFilterDropdown.className = 'dropdown-filter-dropdown';
|
|
var arrow = document.createElement('span');
|
|
arrow.className = 'glyphicon glyphicon-arrow-down dropdown-filter-icon';
|
|
var icon = document.createElement('i');
|
|
icon.className = 'arrow-down';
|
|
arrow.appendChild(icon);
|
|
dropdownFilterDropdown.appendChild(arrow);
|
|
dropdownFilterDropdown.appendChild(this.dropdownFilterContent());
|
|
if ($(this.th).hasClass('no-sort')) {
|
|
$(dropdownFilterDropdown).find('.dropdown-filter-sort').remove();
|
|
}
|
|
if ($(this.th).hasClass('no-filter')) {
|
|
$(dropdownFilterDropdown).find('.checkbox-container').remove();
|
|
}
|
|
if ($(this.th).hasClass('no-search')) {
|
|
$(dropdownFilterDropdown).find('.dropdown-filter-search').remove();
|
|
}
|
|
return dropdownFilterDropdown;
|
|
};
|
|
return FilterMenu;
|
|
}();
|
|
|
|
var FilterCollection = function () {
|
|
function FilterCollection(target, options) {
|
|
this.target = target;
|
|
this.options = options;
|
|
this.ths = target.find('th.filterableCol' + options.columnSelector).toArray();
|
|
this.filterMenus = this.ths.map(function (th, index) {
|
|
var column = $(th).index();
|
|
return new FilterMenu(target, th, column, index, options);
|
|
});
|
|
this.rows = target.find('tbody').find('tr').toArray();
|
|
this.table = target.get(0);
|
|
}
|
|
FilterCollection.prototype.initialize = function () {
|
|
this.filterMenus.forEach(function (filterMenu) {
|
|
filterMenu.initialize();
|
|
});
|
|
this.bindCheckboxes();
|
|
this.bindSelectAllCheckboxes();
|
|
this.bindSort();
|
|
this.bindSearch();
|
|
};
|
|
FilterCollection.prototype.bindCheckboxes = function () {
|
|
var filterMenus = this.filterMenus;
|
|
var rows = this.rows;
|
|
var ths = this.ths;
|
|
var updateRowVisibility = this.updateRowVisibility;
|
|
this.target.find('.dropdown-filter-menu-item.item').change(function () {
|
|
var index = $(this).data('index');
|
|
var value = $(this).val();
|
|
filterMenus[index].updateSelectAll();
|
|
updateRowVisibility(filterMenus, rows, ths);
|
|
});
|
|
};
|
|
FilterCollection.prototype.bindSelectAllCheckboxes = function () {
|
|
var filterMenus = this.filterMenus;
|
|
var rows = this.rows;
|
|
var ths = this.ths;
|
|
var updateRowVisibility = this.updateRowVisibility;
|
|
this.target.find('.dropdown-filter-menu-item.select-all').change(function () {
|
|
var index = $(this).data('index');
|
|
var value = this.checked;
|
|
filterMenus[index].selectAllUpdate(value);
|
|
updateRowVisibility(filterMenus, rows, ths);
|
|
});
|
|
};
|
|
FilterCollection.prototype.bindSort = function () {
|
|
var filterMenus = this.filterMenus;
|
|
var rows = this.rows;
|
|
var ths = this.ths;
|
|
var sort = this.sort;
|
|
var table = this.table;
|
|
var options = this.options;
|
|
var updateRowVisibility = this.updateRowVisibility;
|
|
this.target.find('.dropdown-filter-sort').click(function () {
|
|
var $sortElement = $(this).find('span');
|
|
var column = $sortElement.data('column');
|
|
var order = $sortElement.attr('class');
|
|
sort(column, order, table, options);
|
|
updateRowVisibility(filterMenus, rows, ths);
|
|
});
|
|
};
|
|
FilterCollection.prototype.bindSearch = function () {
|
|
var filterMenus = this.filterMenus;
|
|
var rows = this.rows;
|
|
var ths = this.ths;
|
|
var updateRowVisibility = this.updateRowVisibility;
|
|
this.target.find('.dropdown-filter-search').keyup(function () {
|
|
var $input = $(this).find('input');
|
|
var index = $input.data('index');
|
|
var value = $input.val();
|
|
filterMenus[index].searchToggle(value);
|
|
updateRowVisibility(filterMenus, rows, ths);
|
|
});
|
|
};
|
|
FilterCollection.prototype.updateRowVisibility = function (filterMenus, rows, ths) {
|
|
var showRows = rows;
|
|
var hideRows = [];
|
|
var selectedLists = filterMenus.map(function (filterMenu) {
|
|
return {
|
|
column: filterMenu.column,
|
|
selected: filterMenu.inputs.filter(function (input) {
|
|
return input.checked;
|
|
}).map(function (input) {
|
|
return input.value.trim().replace(/ +(?= )/g, '');
|
|
})
|
|
};
|
|
});
|
|
for (var i = 0; i < rows.length; i++) {
|
|
var tds = rows[i].children;
|
|
for (var j = 0; j < selectedLists.length; j++) {
|
|
var content = tds[selectedLists[j].column].innerText.trim().replace(/ +(?= )/g, '');
|
|
if (selectedLists[j].selected.indexOf(content) === -1) {
|
|
$(rows[i]).hide();
|
|
break;
|
|
}
|
|
$(rows[i]).show();
|
|
}
|
|
}
|
|
};
|
|
FilterCollection.prototype.sort = function (column, order, table, options) {
|
|
if (column == 3 || column == 2) {
|
|
var flip = 1;
|
|
if (order === options.captions.z_to_a.toLowerCase().split(' ').join('-')) flip = -1;
|
|
var tbody = $(table).find('tbody').get(0);
|
|
var rows = $(tbody).find('tr').get();
|
|
var th = $(table).find('th')[column];
|
|
var isType = th.getAttribute('istype');
|
|
var dateformat = th.getAttribute('dateformat');
|
|
rows.sort(function (a, b) {
|
|
var A = a.children[column].innerText.toUpperCase();
|
|
var B = b.children[column].innerText.toUpperCase();
|
|
if (isType == 'date') {
|
|
A = moment(A, dateformat);
|
|
B = moment(B, dateformat);
|
|
return A.diff(B, 'd') * flip;
|
|
} else if (!isNaN(Number(A)) && !isNaN(Number(B))) {
|
|
if (Number(A) < Number(B)) return -1 * flip;
|
|
if (Number(A) > Number(B)) return 1 * flip;
|
|
} else {
|
|
if (A < B) return -1 * flip;
|
|
if (A > B) return 1 * flip;
|
|
}
|
|
return 0;
|
|
});
|
|
for (var i = 0; i < rows.length; i++) {
|
|
tbody.appendChild(rows[i]);
|
|
}
|
|
}
|
|
else {
|
|
var flip = 1;
|
|
if (order === options.captions.z_to_a.toLowerCase().split(' ').join('-')) flip = -1;
|
|
var tbody = $(table).find('tbody').get(0);
|
|
var rows = $(tbody).find('tr').get();
|
|
rows.sort(function (a, b) {
|
|
var A = a.children[column].innerText.toUpperCase();
|
|
var B = b.children[column].innerText.toUpperCase();
|
|
if (!isNaN(Number(A)) && !isNaN(Number(B))) {
|
|
if (Number(A) < Number(B)) return -1 * flip;
|
|
if (Number(A) > Number(B)) return 1 * flip;
|
|
} else {
|
|
if (A < B) return -1 * flip;
|
|
if (A > B) return 1 * flip;
|
|
}
|
|
return 0;
|
|
});
|
|
for (var i = 0; i < rows.length; i++) {
|
|
tbody.appendChild(rows[i]);
|
|
}
|
|
}
|
|
|
|
};
|
|
return FilterCollection;
|
|
}();
|
|
|
|
$$1.fn.excelTableFilter = function (options) {
|
|
var target = this;
|
|
options = $$1.extend({}, $$1.fn.excelTableFilter.options, options);
|
|
if (typeof options.columnSelector === 'undefined') options.columnSelector = '';
|
|
if (typeof options.sort === 'undefined') options.sort = true;
|
|
if (typeof options.search === 'undefined') options.search = true;
|
|
if (typeof options.captions === 'undefined') options.captions = {
|
|
a_to_z: 'Asc',
|
|
z_to_a: 'Desc',
|
|
search: 'Search',
|
|
select_all: 'Select All'
|
|
};
|
|
var filterCollection = new FilterCollection(target, options);
|
|
filterCollection.initialize();
|
|
return target;
|
|
};
|
|
$$1.fn.excelTableFilter.options = {};
|
|
|
|
}(jQuery));
|
|
//# sourceMappingURL=excel-bootstrap-table-filter-bundle.js.map
|