(function ($) {
|
|
var prefilter = "";
|
var comboboxValue = "";
|
encode = function(obj) {
|
if ($.isArray(obj)) {
|
return this.encodeArray(obj);
|
}
|
else if (typeof obj == "object") {
|
return this.encodeObject(obj);
|
}
|
else if (typeof obj == "string") {
|
return encodeURI(obj);
|
}
|
else if (typeof obj == "boolean") {
|
return String(obj);
|
}
|
else if (typeof obj == "number") {
|
return String(obj);
|
}
|
else if (typeof obj === "function") {
|
return "";
|
}
|
}
|
|
encodeArray = function(o) {
|
var a = ["[", ""],
|
|
len = o.length,
|
i;
|
for (i = 0; i < len; i += 1) {
|
a.push(this.encode(o[i]), ',');
|
}
|
|
a[a.length - 1] = ']';
|
return a.join("");
|
}
|
|
encodeObject = function(o) {
|
if (!o) {
|
return "null";
|
}
|
if (o.length) {
|
return "el";
|
}
|
var a = ["{", ""];
|
|
for (var i in o) {
|
if (i == 'parent') {
|
continue;
|
}
|
a.push(this.encode(i), ":", this.encode(o[i]), ',');
|
}
|
|
a[a.length - 1] = '}';
|
return a.join("");
|
}
|
|
|
|
|
function getPrefilter () {
|
return prefilter;
|
}
|
|
function getPluginName(target) {
|
if ($(target).data('treegrid')) {
|
return 'treegrid';
|
} else {
|
return 'datagrid';
|
}
|
}
|
|
var oldLoadDataMethod = $.fn.datagrid.methods.loadData;
|
$.fn.datagrid.methods.loadData = function (jq, data) {
|
jq.each(function () {
|
$.data(this, 'datagrid').filterSource = null;
|
});
|
return oldLoadDataMethod.call($.fn.datagrid.methods, jq, data);
|
};
|
|
$.extend($.fn.datagrid.defaults, {
|
filterMenuIconCls: 'icon-ok',
|
filterBtnIconCls: 'icon-filter',
|
filterBtnPosition: 'right',
|
filterPosition: 'bottom',
|
remoteFilter: false,
|
filterDelay: 400,
|
filterRules: [],
|
filterStringify: function (data) {
|
return JSON.stringify(data);
|
}
|
});
|
|
// filter types
|
$.fn.datagrid.defaults.filters = $.extend({}, $.fn.datagrid.defaults.editors, {
|
label: {
|
init: function (container, options) {
|
return $('<span></span>').appendTo(container);
|
},
|
getValue: function (target) {
|
return $(target).html();
|
},
|
setValue: function (target, value) {
|
$(target).html(value);
|
},
|
resize: function (target, width) {
|
$(target)._outerWidth(width)._outerHeight(22);
|
}
|
}
|
});
|
|
// filter operators
|
$.fn.datagrid.defaults.operators = {
|
nofilter: {
|
text: '清掉过滤'
|
},
|
contains: {
|
text: '包含',
|
isMatch: function (source, value) {
|
return source.toLowerCase().indexOf(value.toLowerCase()) >= 0;
|
}
|
},
|
equal: {
|
text: '等于',
|
isMatch: function (source, value) {
|
return source == value;
|
}
|
},
|
notequal: {
|
text: '不等于',
|
isMatch: function (source, value) {
|
return source != value;
|
}
|
},
|
beginwith: {
|
text: '开头是',
|
isMatch: function (source, value) {
|
return source.toLowerCase().indexOf(value.toLowerCase()) == 0;
|
}
|
},
|
endwith: {
|
text: '结尾是',
|
isMatch: function (source, value) {
|
return source.toLowerCase().indexOf(value.toLowerCase(), source.length - value.length) !== -1;
|
}
|
},
|
less: {
|
text: '小于',
|
isMatch: function (source, value) {
|
return source < value;
|
}
|
},
|
lessorequal: {
|
text: '小于等于',
|
isMatch: function (source, value) {
|
return source <= value;
|
}
|
},
|
greater: {
|
text: '大于',
|
isMatch: function (source, value) {
|
return source > value;
|
}
|
},
|
greaterorequal: {
|
text: '大于等于',
|
isMatch: function (source, value) {
|
return source >= value;
|
}
|
},
|
dateequal: {
|
text: '日期相等',
|
isMatch: function (source, value) {
|
var sourcesplit = source.split("-");
|
var datadate = new Date(sourcesplit[0],parseInt(sourcesplit[1])-1,sourcesplit[2]);
|
var valuesplit = value.split("/");
|
var filterdate = new Date(valuesplit[2],parseInt(valuesplit[0]-1),valuesplit[1]);
|
return datadate.getTime() == filterdate.getTime();
|
}
|
},
|
dateless: {
|
text: '小于',
|
isMatch: function (source, value) {
|
return source < value;
|
}
|
},
|
datelessorequal: {
|
text: '小于等于',
|
isMatch: function (source, value) {
|
return source <= value;
|
}
|
},
|
dategreater: {
|
text: '大于',
|
isMatch: function (source, value) {
|
return source > value;
|
}
|
},
|
dategreaterorequal: {
|
text: '大于等于',
|
isMatch: function (source, value) {
|
return source >= value;
|
}
|
},
|
numequal: {
|
text: '日期相等',
|
isMatch: function (source, value) {
|
return source == value;
|
}
|
},
|
numless: {
|
text: '小于',
|
isMatch: function (source, value) {
|
return source < value;
|
}
|
},
|
numlessorequal: {
|
text: '小于等于',
|
isMatch: function (source, value) {
|
return source <= value;
|
}
|
},
|
numgreater: {
|
text: '大于',
|
isMatch: function (source, value) {
|
return source > value;
|
}
|
},
|
numgreaterorequal: {
|
text: '大于等于',
|
isMatch: function (source, value) {
|
return source >= value;
|
}
|
}
|
};
|
|
function resizeFilter(target, field, width) {
|
var dg = $(target);
|
var header = dg.datagrid('getPanel').find('div.datagrid-header');
|
var ff = field ? header.find('input.datagrid-filter[name="' + field + '"]') : header.find('input.datagrid-filter');
|
ff.each(function () {
|
var name = $(this).attr('name');
|
var col = dg.datagrid('getColumnOption', name);
|
var btn = $(this).closest('div.datagrid-filter-c').find('a.datagrid-filter-btn');
|
if (width != undefined) {
|
this.filter.resize(this, width);
|
} else {
|
this.filter.resize(this, col.width - btn._outerWidth());
|
}
|
});
|
}
|
|
function getFilterComponent(target, field) {
|
var opts = $(target).datagrid('options');
|
var header = $(target).datagrid('getPanel').find('div.datagrid-header');
|
return header.find('tr.datagrid-filter-row td[field="' + field + '"] input.datagrid-filter');
|
}
|
|
/**
|
* get filter rule index, return -1 if not found.
|
*/
|
function getRuleIndex(target, field) {
|
var rules = $(target).datagrid('options').filterRules;
|
for (var i = 0; i < rules.length; i++) {
|
if (rules[i].field == field) {
|
return i;
|
}
|
}
|
return -1;
|
}
|
|
function addFilterRule(target, param) {
|
var opts = $(target).datagrid('options');
|
var rules = opts.filterRules;
|
var index = getRuleIndex(target, param.field);
|
if (index >= 0) {
|
if (param.op == 'nofilter') {
|
removeFilterRule(target, param.field);
|
} else {
|
$.extend(rules[index], param);
|
}
|
} else {
|
rules.push(param);
|
}
|
|
var input = getFilterComponent(target, param.field);
|
if (input.length) {
|
if (param.op != 'nofilter') {
|
input[0].filter.setValue(input, param.value);
|
}
|
var menu = input[0].menu;
|
if (menu) {
|
menu.find('.' + opts.filterMenuIconCls).removeClass(opts.filterMenuIconCls);
|
var item = menu.menu('findItem', opts.operators[param.op]['text']);
|
menu.menu('setIcon', {
|
target: item.target,
|
iconCls: opts.filterMenuIconCls
|
});
|
}
|
}
|
}
|
|
function getFilterRule(target, field) {
|
var name = getPluginName(target);
|
var rules = $(target)[name]('options').filterRules;
|
var index = getRuleIndex(target, field);
|
if (index >= 0) {
|
return rules[index];
|
} else {
|
return null;
|
}
|
}
|
|
function removeFilterRule(target, field) {
|
var dg = $(target);
|
var opts = dg.datagrid('options');
|
if (field) {
|
var index = getRuleIndex(target, field);
|
if (index >= 0) {
|
opts.filterRules.splice(index, 1);
|
}
|
_clear([field]);
|
} else {
|
opts.filterRules = [];
|
var fields = dg.datagrid('getColumnFields', true).concat(dg.datagrid('getColumnFields'));
|
_clear(fields);
|
}
|
|
function _clear(fields) {
|
for (var i = 0; i < fields.length; i++) {
|
var input = getFilterComponent(target, fields[i]);
|
if (input.length) {
|
input[0].filter.setValue(input, '');
|
var menu = input[0].menu;
|
if (menu) {
|
menu.find('.' + opts.filterMenuIconCls).removeClass(opts.filterMenuIconCls);
|
}
|
}
|
}
|
}
|
}
|
|
function doFilter(target) {
|
var state = $.data(target, 'datagrid');
|
var opts = state.options;
|
if (opts.remoteFilter) {
|
$(target).datagrid('load');
|
} else {
|
$(target).datagrid('getPager').pagination('refresh', { pageNumber: 1 });
|
$(target).datagrid('options').pageNumber = 1;
|
$(target).datagrid('load');
|
//$(target).datagrid('loadData', state.data || state.filterSource );
|
}
|
}
|
|
function myLoadFilter(data) {
|
var state = $.data(this, 'datagrid');
|
var opts = state.options;
|
if (typeof(data.rows) == "undefined") {
|
data.rows = [];
|
}
|
if ($.isArray(data)) {
|
data = {
|
total: data.length,
|
rows: data
|
};
|
}
|
if (!opts.remoteFilter) {
|
if (!state.filterSource) {
|
state.filterSource = data;
|
}
|
//data = $.extend({}, state.filterSource);
|
var filter = "1=1";
|
|
var dg = $(this);
|
for (var j = 0; j < opts.filterRules.length; j++) {
|
var rule = opts.filterRules[j];
|
filter = getfilters(filter,rule);
|
}
|
if (prefilter != filter) {
|
|
dg.datagrid('load', {
|
filter: filter
|
});
|
prefilter = filter;
|
}
|
|
if (opts.pagination && (data.rows.length == 0 || data.rows.length == 20)) {
|
var dg = $(this);
|
var pager = dg.datagrid('getPager');
|
pager.pagination({
|
onSelectPage: function (pageNum, pageSize) {
|
opts.pageNumber = pageNum;
|
opts.pageSize = pageSize;
|
pager.pagination('refresh', {
|
pageNumber: pageNum,
|
pageSize: pageSize,
|
filter: prefilter
|
});
|
|
dg.datagrid('reload', {
|
page: pageNum,
|
filter: prefilter
|
});
|
}
|
});
|
/*var start = (opts.pageNumber - 1) * parseInt(opts.pageSize);
|
var end = start + parseInt(opts.pageSize);
|
data.rows = data.rows.slice(start, end);*/
|
}
|
}
|
return data;
|
|
function isMatch(row) {
|
var rules = opts.filterRules;
|
for (var i = 0; i < rules.length; i++) {
|
var rule = rules[i];
|
var source = row[rule.field];
|
if (source) {
|
var op = opts.operators[rule.op];
|
if (!op.isMatch(source, rule.value)) { return false }
|
}
|
}
|
return true;
|
}
|
}
|
|
function formatNum(n){
|
var nsplit = n.split(".");
|
var b=parseInt(nsplit[0]).toString();
|
var len=b.length;
|
var format = "";
|
if(len > 3){
|
var r=len%3;
|
format = r>0?b.slice(0,r)+","+b.slice(r,len).match(/\d{3}/g).join(","):b.slice(r,len).match(/\d{3}/g).join(",");
|
}
|
else {
|
format = b;
|
}
|
|
if(!nsplit[1]){
|
nsplit[1] = "00";
|
}
|
return format + "." + nsplit[1];
|
|
}
|
|
function getfilters (filter, rule){
|
filter += " and ";
|
var op = rule.op;
|
if (rule.value == "") {
|
return "1=1";
|
}
|
if (op == "equal") {
|
filter += rule.field + " = '" + rule.value + "'";
|
}
|
else if (op == "contains") {
|
filter += rule.field + " like '%" + rule.value + "%'";
|
}
|
else if (op == "beginwith") {
|
filter += rule.field + " like '%" + rule.value + "'";
|
}
|
else if (op == "endwith") {
|
filter += rule.field + " like '" + rule.value + "%'";
|
}
|
else if (op == "less") {
|
filter += rule.field + " < " + rule.value;
|
}
|
else if (op == "lessorequal") {
|
filter += rule.field + " <= " + rule.value;
|
}
|
else if (op == "greater") {
|
filter += rule.field + " > " + rule.value;
|
}
|
else if (op == "greaterorequal") {
|
filter += rule.field + " >= " + rule.value;
|
}
|
else if (op == "dateequal") {
|
filter += rule.field + " = '" + rule.value + "'";
|
}
|
else if (op == "dateless") {
|
filter += rule.field + " < '" + rule.value + "'";
|
}
|
else if (op == "datelessorequal") {
|
filter += rule.field + " <= '" + rule.value + "'";
|
}
|
else if (op == "dategreater") {
|
filter += rule.field + " > '" + rule.value + "'";
|
}
|
else if (op == "dategreaterorequal") {
|
filter += rule.field + " >= '" + rule.value + "'";
|
}
|
else if (op == "numequal") {
|
num = formatNum(rule.value);
|
filter += rule.field + " = '" + num + "'";
|
}
|
else if (op == "numless") {
|
num = formatNum(rule.value);
|
filter += rule.field + " < '" + num + "'";
|
}
|
else if (op == "numlessorequal") {
|
num = formatNum(rule.value);
|
filter += rule.field + " <= '" + num + "'";
|
}
|
else if (op == "numgreater") {
|
num = formatNum(rule.value);
|
filter += rule.field + " > '" + num + "'";
|
}
|
else if (op == "numgreaterorequal") {
|
num = formatNum(rule.value);
|
filter += rule.field + " >= '" + num + "'";
|
}
|
else if (op == "comboboxequal") {
|
var length = rule.value.split(",").length - 1;
|
if(length == 0) {
|
filter += "1=1";
|
}
|
else if (length > 0) {
|
var value = rule.value.substring(0, rule.value.length - 1);
|
filter += rule.field + " in ("+ value +")";
|
}
|
|
}
|
|
return filter;
|
}
|
function init(target, filters) {
|
filters = filters || [];
|
var state = $.data(target, 'datagrid');
|
var opts = state.options;
|
|
var onResizeColumn = opts.onResizeColumn;
|
opts.onResizeColumn = function (field, width) {
|
if (opts.fitColumns) {
|
resizeFilter(target, null, 10);
|
$(target).datagrid('fitColumns');
|
resizeFilter(target);
|
} else {
|
resizeFilter(target, field);
|
}
|
onResizeColumn.call(target, field, width);
|
};
|
var onResize = opts.onResize;
|
opts.onResize = function (width, height) {
|
if (opts.fitColumns) {
|
resizeFilter(target, null, 10);
|
$(target).datagrid('fitColumns');
|
resizeFilter(target);
|
}
|
onResize.call(this, width, height);
|
}
|
var onBeforeLoad = opts.onBeforeLoad;
|
opts.onBeforeLoad = function (param) {
|
param.filterRules = opts.filterStringify(opts.filterRules);
|
return onBeforeLoad.call(this, param);
|
};
|
opts.loadFilter = myLoadFilter;
|
|
initCss();
|
createFilter(true);
|
createFilter();
|
if (opts.fitColumns) {
|
setTimeout(function () {
|
resizeFilter(target);
|
}, 0);
|
}
|
|
function initCss() {
|
if (!$('#datagrid-filter-style').length) {
|
$('head').append(
|
'<style id="datagrid-filter-style">' +
|
'a.datagrid-filter-btn{display:inline-block;width:22px;height:22px;vertical-align:top;cursor:pointer;opacity:0.6;filter:alpha(opacity=60);}' +
|
'a:hover.datagrid-filter-btn{opacity:1;filter:alpha(opacity=100);}' +
|
'</style>'
|
);
|
}
|
}
|
|
/**
|
* create filter component
|
*/
|
function createFilter(frozen) {
|
var dc = state.dc;
|
var fields = $(target).datagrid('getColumnFields', frozen);
|
if (frozen && opts.rownumbers) {
|
fields.unshift('_');
|
}
|
var table = (frozen ? dc.header1 : dc.header2).find('table.datagrid-htable');
|
table.find('tr').each(function () {
|
$(this).height($(this).height());
|
});
|
|
// clear the old filter component
|
table.find('input.datagrid-filter').each(function () {
|
if (this.filter.destroy) {
|
this.filter.destroy(this);
|
}
|
if (this.menu) {
|
$(this.menu).menu('destroy');
|
}
|
});
|
table.find('tr.datagrid-filter-row').remove();
|
|
var tr = $('<tr class="datagrid-header-row datagrid-filter-row"></tr>');
|
if (opts.filterPosition == 'bottom') {
|
tr.appendTo(table.find('tbody'));
|
} else {
|
tr.prependTo(table.find('tbody'));
|
}
|
|
for (var i = 0; i < fields.length; i++) {
|
var field = fields[i];
|
var col = $(target).datagrid('getColumnOption', field);
|
if (col && (col.checkbox || col.expander)) {
|
field = '_';
|
}
|
var td = $('<td></td>').attr('field', field).appendTo(tr);
|
// if (field == '_') { continue; }
|
|
//begin 加入清除所有过滤框按钮 2013-12-18 修改 Wing
|
if (field == '_') {
|
var btnClear = $('<input type="button" value="C" style="width:27px">');
|
$(btnClear).bind("click", function () {
|
removeFilterRule(target);
|
doFilter(target);
|
});
|
$(td).append(btnClear);
|
continue;
|
}
|
//end
|
var div = $('<div class="datagrid-filter-c"></div>').appendTo(td);
|
|
var fopts = getFilter(field);
|
var type = fopts ? fopts.type : 'text';
|
|
var filter = opts.filters[fopts ? fopts.type : 'text'];
|
var input = filter.init(div, fopts ? (fopts.options || {}) : {});
|
input.addClass('datagrid-filter').attr('name', field);
|
input[0].filter = filter;
|
|
//begin 为类型 是 text 和 numberbox 添加默认回车查询 2014-01-22 修改 Wing
|
if (fopts) {
|
input[0].menu = createFilterButton(div, fopts.op);
|
if (fopts.options && fopts.options.onInit) {
|
fopts.options.onInit.call(input[0]);
|
}
|
}
|
if (type == 'text') {
|
input.bind('keydown', function (e) {
|
var t = $(this);
|
if (e.keyCode == 13) {
|
var field = t.attr('name');
|
var rule = getFilterRule(target, field);
|
if (rule) {
|
rule.value = t.val();
|
}
|
else {
|
addFilterRule(target, {
|
field: field,
|
op: 'contains',
|
value: t.val()
|
});
|
}
|
doFilter(target);
|
}
|
});
|
}
|
if (type == "numberbox") {
|
input.bind('keydown', function (e) {
|
var t = $(this);
|
if (e.keyCode == 13) {
|
|
var field = t.attr('name');
|
var rule = getFilterRule(target, field);
|
if (rule) {
|
rule.value = t.val();
|
}
|
else {
|
addFilterRule(target, {
|
field: field,
|
op: 'numequal',
|
value: t.val()
|
});
|
}
|
doFilter(target);
|
}
|
});
|
}
|
if (type == "combobox") {
|
|
input.combobox({
|
onSelect: function(record){
|
var t = $(this);
|
var field = t.attr('name');
|
comboboxValue += "'" + record[field] + "',";
|
var rule = getFilterRule(target, field);
|
if (rule) {
|
rule.value = comboboxValue;
|
}
|
else {
|
addFilterRule(target, {
|
field: field,
|
op: 'comboboxequal',
|
value: record[field]
|
});
|
}
|
doFilter(target);
|
},
|
onUnselect: function(record){
|
var t = $(this);
|
var field = t.attr('name');
|
var preSelectValue = "'" + record[field] + "',";
|
comboboxValue = comboboxValue.replace(preSelectValue, "");
|
var rule = getFilterRule(target, field);
|
if (rule) {
|
rule.value = comboboxValue;
|
}
|
else {
|
addFilterRule(target, {
|
field: field,
|
op: 'comboboxequal',
|
value: record[field]
|
});
|
}
|
doFilter(target);
|
}
|
});
|
}
|
//end
|
|
// if (fopts) {
|
// input[0].menu = createFilterButton(div, fopts.op);
|
// if (fopts.options && fopts.options.onInit) {
|
// fopts.options.onInit.call(input[0]);
|
// }
|
// } else if (type == 'text') {
|
// input.bind('keydown', function (e) {
|
// var t = $(this);
|
// if (this.timer) {
|
// clearTimeout(this.timer);
|
// }
|
// if (e.keyCode == 13) {
|
// addFilterRule(target, {
|
// field: t.attr('name'),
|
// op: 'contains',
|
// value: t.val()
|
// });
|
// doFilter(target);
|
// } else {
|
// this.timer = setTimeout(function () {
|
// addFilterRule(target, {
|
// field: t.attr('name'),
|
// op: 'contains',
|
// value: t.val()
|
// });
|
// doFilter(target);
|
// }, opts.filterDelay);
|
// }
|
// });
|
// }
|
|
resizeFilter(target, field);
|
}
|
}
|
|
function createFilterButton(container, operators) {
|
if (!operators) { return null; }
|
|
var btn = $('<a class="datagrid-filter-btn"> </a>').addClass(opts.filterBtnIconCls);
|
if (opts.filterBtnPosition == 'right') {
|
btn.appendTo(container);
|
} else {
|
btn.prependTo(container);
|
}
|
var menu = $('<div></div>').appendTo('body');
|
menu.menu({
|
alignTo: btn,
|
onClick: function (item) {
|
var btn = $(this).menu('options').alignTo;
|
var td = btn.closest('td[field]');
|
var field = td.attr('field');
|
var input = td.find('input.datagrid-filter');
|
var value = input[0].filter.getValue(input);
|
|
addFilterRule(target, {
|
field: field,
|
op: item.name,
|
value: value
|
});
|
|
doFilter(target);
|
}
|
});
|
$.each(['nofilter'].concat(operators), function (index, item) {
|
var op = opts.operators[item];
|
if (op) {
|
menu.menu('appendItem', {
|
text: op.text,
|
name: item
|
});
|
}
|
});
|
btn.bind('click', { menu: menu }, function (e) {
|
$(e.data.menu).menu('show');
|
return false;
|
});
|
return menu;
|
}
|
|
function getFilter(field) {
|
for (var i = 0; i < filters.length; i++) {
|
var filter = filters[i];
|
if (filter.field == field) {
|
return filter;
|
}
|
}
|
return null;
|
}
|
}
|
|
$.extend($.fn.datagrid.methods, {
|
enableFilter: function (jq, filters) {
|
return jq.each(function () {
|
init(this, filters);
|
});
|
},
|
getFilterRule: function (jq, field) {
|
return getFilterRule(jq[0], field);
|
},
|
addFilterRule: function (jq, param) {
|
return jq.each(function () {
|
addFilterRule(this, param);
|
});
|
},
|
removeFilterRule: function (jq, field) {
|
return jq.each(function () {
|
removeFilterRule(this, field);
|
});
|
},
|
doFilter: function (jq) {
|
return jq.each(function () {
|
doFilter(this);
|
});
|
},
|
getFilterComponent: function (jq, field) {
|
return getFilterComponent(jq[0], field);
|
}
|
});
|
})(jQuery);
|