var HeaderFilter = function (grid, options) {
var me = this;
me.grid = grid;
me.options = options || {};
me.init();
}
HeaderFilter.prototype = {
init: function () {
var me = this,
grid = me.grid,
columns = me.options.columns;
me.filterColumns = [];
for (var i = 0, l = columns.length; i < l; i++) {
var o = columns[i];
var column = grid.getColumn(o.name);
if (!column) throw new Error('undefined column ' + o.name);
o.column = column;
column.header = column.header + '
';
me.filterColumns.push(column);
}
$(grid.el).on("click", ".headerfilter-trigger", function (e) {
e.stopPropagation();
var column = grid.getColumnByEvent(e);
me.showFilterWindow(column);
});
grid.on("load", function (e) {
//me.clearFilterAll();
})
grid.on("resize", function (e) {
});
grid.on("update", function (e) {
me._updateFilterStatus();
});
$(document).on("mousedown", function (event) {
if (!$(event.target).closest(".filterwindow")[0]) {
$(".filterwindow").hide();
}
});
///////////////////////////////////////////////////////////////
var within = grid.within;
grid.within = function (e) {
var result = within.call(this, e);
if (!result && me.filterWindow) {
result = mini.isAncestor(me.filterWindow[0], e.target);
}
return result;
}
},
_createFilterListData: function (column) {
var data = this.grid.getData(), //getDataView
sb = [],
map = {},
result = [];
var blank = {};
blank[column.displayField || column.field] = '全部'; //暂不知道具体逻辑
result.push(blank);
for (var i = 0, l = data.length; i < l; i++) {
var record = data[i];
var text = record[column.field] || '';
if (column.displayField) {
text = record[column.displayField] || '';
} else {
}
if (text.indexOf("合计") != -1 || text.indexOf("累计") != -1 || text.indexOf("汇总") != -1 || text == "说明" || text == "备注" || text == "") continue;
if (!map[text]) {
map[text] = text;
result.push(record);
}
}
return result;
},
_getFilterValues: function (column) {
var win = this.filterWindow;
var values = [];
win.find("input:checked").not(".checkall").each(function () {
values.push(this.value);
});
return values;
},
doFilter: function () {
var me = this,
grid = me.grid,
columns = me.filterColumns;
if (me.hasFiltered()) {
grid.filter(function (record) {
var pass = true;
for (var i = 0, l = columns.length; i < l; i++) {
var column = columns[i];
if (column.filterData) {
var text = column.displayField ? record[column.displayField] : record[column.field];
if (text == null) text = "";
text = String(text);
if (!column._filterMap[text]) {
pass = false;
break;
}
}
}
return pass;
});
} else {
grid.clearFilter();
}
me._updateFilterStatus();
//alert("doFilter");
},
_createFilterWindow: function (column) {
var me = this;
var el = $('
').appendTo('body');
var data = this._createFilterListData(column),
sb = [];
for (var i = 0, l = data.length; i < l; i++) {
var record = data[i];
var text = record[column.field];
if (column.displayField) text = record[column.displayField];
if (text == null) text = '';
var checked = false;
if (column._filterMap) checked = !!column._filterMap[text];
sb[sb.length] = '';
}
el.find('.filterwindow-content').html(sb.join(''));
el.find(".filter").on("click", function () {
var values = me._getFilterValues(column);
if (values.length) {
me.filter(column, values);
} else {
me.clearFilter(column);
}
});
el.find(".clearfilter").on("click", function () {
me.clearFilter(column);
});
el.find("input[type=checkbox]").on("click", function () {
//me.clearFilter(column);
var jq = $(this);
var checked = jq.is(":checked");
if (jq.hasClass("checkall")) {
el.find("input[type=checkbox]").prop("checked", checked);
} else {
updateCheckAll();
}
});
function updateCheckAll() {
var len1 = el.find("input[type=checkbox]").not(".checkall").length
var len2 = el.find("input[type=checkbox]:checked").not(".checkall").length
//alert(len1 + ":" + len2);
el.find(".checkall").prop("checked", len1 == len2);
}
updateCheckAll();
return el;
},
_updateFilterStatus: function () {
var me = this,
grid = me.grid,
columns = me.filterColumns;
for (var i = 0, l = columns.length; i < l; i++) {
var column = columns[i];
var headerCellEl = $(me._getHeaderCellEl(column));
if (me.isFiltered(column)) headerCellEl.addClass("headerfilter-filtered");
else headerCellEl.removeClass("headerfilter-filtered");
}
},
_getHeaderCellEl: function (column) {
var me = this,
grid = me.grid;
var columns = grid.getBottomColumns();
var end = grid.getFrozenEndColumn();
var columnIndex = columns.indexOf(column);
var index = 1;
if (columnIndex > end) {
index = 2;
}
return grid.getHeaderCellEl(column, index);
},
showFilterWindow: function (column) {
var me = this,
grid = me.grid;
headerCellEl = this._getHeaderCellEl(column)
me.hideFilterWindow();
me.filterColumn = column;
me.filterWindow = me._createFilterWindow(column);
var box = mini.getBox(headerCellEl),
triggerEl = $(headerCellEl).find(".headerfilter-trigger")[0],
triggerBox = mini.getBox(triggerEl);
me.filterWindow.show();
mini.setXY(me.filterWindow, triggerBox.left, box.bottom);
},
hideFilterWindow: function () {
this.filterColumn = null;
if (this.filterWindow) {
this.filterWindow.remove();
this.filterWindow = null;
}
},
isFiltered: function (name) {
var column = this.grid.getColumn(name);
if (column) return !!column.filterData;
return false;
},
hasFiltered: function () {
var me = this,
columns = me.filterColumns;
for (var i = 0, l = columns.length; i < l; i++) {
var column = columns[i];
if (me.isFiltered(column)) return true;
}
return false;
},
filter: function (column, values) {
var me = this;
column.filterData = values;
column._filterMap = {};
for (var i = 0, l = values.length; i < l; i++) {
var value = values[i];
column._filterMap[value] = true;
}
me.doFilter();
me.hideFilterWindow();
if (me.options.callback) me.options.callback(column, true);
},
clearFilter: function (column) {
var me = this;
column.filterData = null;
column._filterMap = null;
me.doFilter();
me.hideFilterWindow();
if (me.options.callback) me.options.callback(column, false);
},
clearAllFilterData: function () {
var me = this;
var columns = me.filterColumns;
for (var i = 0, l = columns.length; i < l; i++) {
var column = columns[i];
column.filterData = null;
column._filterMap = null;
}
},
clearAllFilter: function () {
var me = this;
me._updateFilterStatus();
me.clearAllFilterData();
me.grid.clearFilter();
me.hideFilterWindow();
}
};