报表列过滤功能 [系列2]

表格列过滤功能 [系列2]
================================================================================================
本系列sample是工作中自己的积累, 提供给大家交流;
如果有好的意见或建议,欢迎撇砖
报表列过滤功能 [系列2] 

================================================================================================
columnFilter.js
/**
 * 表格过滤功能
 * tabObj 表格对象
 * 特点:
 * 1. 支持单元格合并后的表格;
 * 2. 支持多列同时过滤;
 * 3. 对外部提供接口:callSetFilterFunc,callDataFunc,callSetDefaultFunc分别调用外部的动态获取下拉框选项、给过滤的下拉框设定默认选项、保存所设置的过滤条件到页面hidden;
 * 4. 过滤的触发交给页面的查询按钮;
 *
 * Sample:
 * <script>
 *		 var params = {
 *			filterCols:[1,2,3,4,5,6],  				//参数"[1,2,3,4,5,6]":给第2至7列增加过滤功能(列序号是从0开始计)
 *			lastIndexOfMaxCol:1,					//右边起,最后一个无过滤条件的列的逆序号,从0开始计
 *			callDataFunc:getFilterOptions,			//动态获取下拉框选项数据
 *			callSetDefaultFunc:setDefaultCondition,	//给过滤的下拉框设定默认选项
 *			callSetFilterFunc:setFilter,			//保存过滤下拉框的选项
 *			headerRow:1								//列表表头行序号,默认是0
 *		};
 *		var columnFilter = new ColumnFilter($("tabDecisionPath"));
 *		columnFilter.addHandler(params);
 * </script>
 */
function ColumnFilter(tabObj){
	// 表格对象
	var _tabObj = tabObj; 
	//表格列数
	var colNumber;
	//如果列数是动态变化的,则用maxCol来表示需要过滤的最大列序 
	var maxCol;  
	//下拉选项
	var select = "";
	
	//参数
	var params = {
		//要添加过滤功能的列的数组
		//filterCols: [1,2,3,4,5,6],
		//右边起,最后一个无过滤条件的列的逆序号,从0开始计
		//lastIndexOfMaxCol:1,
		//动态获取下拉框选项数据
		//callDataFunc:getFilterOptions,
		//给过滤的下拉框设定默认选项
		//callSetDefaultFunc:setDefaultCondition,
		//保存过滤下拉框的选项
		//callSetFilterFunc:setFilter,
		//列表表头行序号,默认是0
		headerRow: 0
	};
	
	//方法集合
	var methods = {
		/** 检查参数是否合法 */
		doCheckParams:function(parameters){
			if(parameters.filterCols==null || parameters.filterCols==undefined || parameters.filterCols.length==0){return false;};
			if(parameters.lastIndexOfMaxCol==null || parameters.lastIndexOfMaxCol==undefined){return false;};
			if(parameters.callDataFunc==null || parameters.callDataFunc==undefined){return false;};
			if(parameters.callSetDefaultFunc==null || parameters.callSetDefaultFunc==undefined){return false;};
			if(parameters.callSetFilterFunc==null || parameters.callSetFilterFunc==undefined){return false;};
			if(parameters.headerRow==null || parameters.headerRow==undefined){parameters.headerRow=params.headerRow;};
			
			this.params = parameters;
			return true;
		},
		/** 检查参数是否越界 */
		doCheckCol:function(col){
			if(col>colNumber-1){
				return false; 
			}
			return true;
		},
		/** 过滤 */
		setFilterValue:function(obj,col){
			var val = obj.options[obj.selectedIndex].value;
			if(obj.selectedIndex==0){
				val = "";
			}
			var originText = obj.options[0].value;
			this.params.callSetFilterFunc({key:originText, value:val});
		},
		/** 生成过滤器 */
		doRender:function(col, headerText){
			var curCol = col;
			//拼装下拉框
			select = "<select id='" + headerText + "' onchange='columnFilter.setFilterValue(this," + curCol + ");' style='width:100%;height:100%'>" + 
					 "<option value='" + headerText + "'>" + headerText + "</option>";
					 
			var optionsStr =this.params.callDataFunc(headerText);
			if(optionsStr==""){return false;}
			var options = [];
			options = optionsStr.split("|");
			for(var i=0; i<options.length; i++){
				var arr = options[i].split(",");
				options[i]={id:arr[0],name:arr[1]};
			}
			for(var i=0;i<options.length;i++){
				select += "<option value='" + options[i].id + "'>" +options[i].name + "</option>";
			}
			select += "</select>";
			_tabObj.rows[this.params.headerRow].cells[curCol].innerHTML = "<div style='width:100%;height:100%;' >" +select + "</div>";
			return true;
		}, 
		/** 
		 * 给过滤的下拉框设定默认选项
		 */
		setDefault:function(headerText){
			this.params.callSetDefaultFunc($(headerText));
		},
		/**
		 * 绑定过滤事件
		 * params 参数
		 */
		addHandler:function(parameters){
			//检查参数是否合法
			if(!this.doCheckParams(parameters)){
				alert("参数错误!");
				return;
			}
		 
			//列表内容行不能为空
			if($("trr0")==undefined){return;} 
			if(this.params.filterCols==undefined || this.params.filterCols.length==0){return;}
			colNumber = _tabObj.rows[this.params.headerRow].cells.length;
			maxCol = colNumber - this.params.lastIndexOfMaxCol - 2;
			for(var i=0; i<this.params.filterCols.length;i++){
				var col = this.params.filterCols[i];
				if(!this.doCheckCol(col)){return;}
				if(maxCol!=undefined){
					if(col>maxCol){return;}
				}
				//给第col列Header增加单击事件       
				var headerText = _tabObj.rows[this.params.headerRow].cells[col].innerText;
				
				//生成过滤下拉框
				if(!this.doRender(col, headerText)){
					continue;
				}
				
				//设置下拉框默认选项
				this.setDefault(headerText);
			}
		}
	};
	
	return methods; 
}



list.jsp

<%@ page contentType="text/html;charset=gbk"%>

<SCRIPT>
//...部分无关js略去


/**
 * 查找某个指标的所有约束条件
 * indexName 指标名称,如:AADT, PCI, RQI, PSSI, RDI, SRI
 * return: options sample:"8a819be52af9ed05012afa1dc007000d","重交通(>=8000)"|"8a819be52af9ed05012afa1e087a000e","中交通(8000->4000)"
 */
function getFilterOptions(indexName){
	var options;
	var parameters = "indexStr=" + indexName + "&surfaceType=" +  $("surfaceType").value + "&roadGrade=" + $("roadGrade").value; 
	var url = "<ww:url value='/decisionPath!getFilterOptions.action'/>";
	var ajax = new Ajax.Request(
		url,
		{
			method:'post',
			parameters:parameters,
			requestHeaders:{dynenc:"UTF-8"},
			asynchronous: false,
			onComplete:function(oriReq){ 
				options=oriReq.responseText.trim();
			}
		}
	)
	return options;
}

/**
 * 给过滤的下拉框设定默认选项
 * selObj: 下拉框对象
 */
function setDefaultCondition(selObj){ 
	if($("decisionPath." + selObj.id + "Id").value!=""){
		selObj.value = $("decisionPath." + selObj.id + "Id").value;
	}
}

/**
 * 保存过滤查询条件
 */
function setFilter(condition){
	document.getElementById("decisionPath." + condition.key + "Id").value = condition.value;
}

</SCRIPT>
  
<BR>
<form name="actionForm" method="post">
    <table class="table-border" align="center" cellspacing="1" cellpadding="1" width="100%" border="0" id="tabDecisionPath">
        //....中间表格内容略					
    </table>
</form>

<SCRIPT LANGUAGE="JavaScript">
doInit();

var params = {
	filterCols:[1,2,3,4,5,6],
	lastIndexOfMaxCol:1,
	callDataFunc:getFilterOptions,
	callSetDefaultFunc:setDefaultCondition,
	callSetFilterFunc:setFilter,
	headerRow:1
};
var columnFilter = new ColumnFilter($("tabDecisionPath"));
columnFilter.addHandler(params);
</SCRIPT>


报表列过滤功能 [系列2]