filteringtable.js

来自「Hippo CMS是一个以信息为中心的开源内容管理系统。Hippo CMS目标是」· JavaScript 代码 · 共 711 行 · 第 1/2 页

JS
711
字号
	this.render();
}, onFilter:function () {
}, _defaultFilter:function (obj) {
	return true;
}, setFilter:function (field, fn) {
	for (var i = 0; i < this.columns.length; i++) {
		if (this.columns[i].getField() == field) {
			this.columns[i].filterFunction = fn;
			break;
		}
	}
	this.applyFilters();
}, setFilterByIndex:function (idx, fn) {
	this.columns[idx].filterFunction = fn;
	this.applyFilters();
}, clearFilter:function (field) {
	for (var i = 0; i < this.columns.length; i++) {
		if (this.columns[i].getField() == field) {
			this.columns[i].filterFunction = this._defaultFilter;
			break;
		}
	}
	this.applyFilters();
}, clearFilterByIndex:function (idx) {
	this.columns[idx].filterFunction = this._defaultFilter;
	this.applyFilters();
}, clearFilters:function () {
	for (var i = 0; i < this.columns.length; i++) {
		this.columns[i].filterFunction = this._defaultFilter;
	}
	var rows = this.domNode.tBodies[0].rows;
	for (var i = 0; i < rows.length; i++) {
		rows[i].style.display = "";
		if (this.alternateRows) {
			dojo.html[((i % 2 == 1) ? "addClass" : "removeClass")](rows[i], this.rowAlternateClass);
		}
	}
	this.onFilter();
}, applyFilters:function () {
	var alt = 0;
	var rows = this.domNode.tBodies[0].rows;
	for (var i = 0; i < rows.length; i++) {
		var b = true;
		var row = rows[i];
		for (var j = 0; j < this.columns.length; j++) {
			var value = this.store.getField(this.getDataByRow(row), this.columns[j].getField());
			if (this.columns[j].getType() == Date && value != null && !value.getYear) {
				value = new Date(value);
			}
			if (!this.columns[j].filterFunction(value)) {
				b = false;
				break;
			}
		}
		row.style.display = (b ? "" : "none");
		if (b && this.alternateRows) {
			dojo.html[((alt++ % 2 == 1) ? "addClass" : "removeClass")](row, this.rowAlternateClass);
		}
	}
	this.onFilter();
}, createSorter:function (info) {
	var self = this;
	var sortFunctions = [];
	function createSortFunction(fieldIndex, dir) {
		var meta = self.columns[fieldIndex];
		var field = meta.getField();
		return function (rowA, rowB) {
			if (dojo.html.hasAttribute(rowA, "emptyRow")) {
				return 1;
			}
			if (dojo.html.hasAttribute(rowB, "emptyRow")) {
				return -1;
			}
			var a = self.store.getField(self.getDataByRow(rowA), field);
			var b = self.store.getField(self.getDataByRow(rowB), field);
			var ret = 0;
			if (a > b) {
				ret = 1;
			}
			if (a < b) {
				ret = -1;
			}
			return dir * ret;
		};
	}
	var current = 0;
	var max = Math.min(info.length, this.maxSortable, this.columns.length);
	while (current < max) {
		var direction = (info[current].direction == 0) ? 1 : -1;
		sortFunctions.push(createSortFunction(info[current].index, direction));
		current++;
	}
	return function (rowA, rowB) {
		var idx = 0;
		while (idx < sortFunctions.length) {
			var ret = sortFunctions[idx++](rowA, rowB);
			if (ret != 0) {
				return ret;
			}
		}
		return 0;
	};
}, createRow:function (obj) {
	var row = document.createElement("tr");
	dojo.html.disableSelection(row);
	if (obj.key != null) {
		row.setAttribute("value", obj.key);
	}
	for (var j = 0; j < this.columns.length; j++) {
		var cell = document.createElement("td");
		cell.setAttribute("align", this.columns[j].align);
		cell.setAttribute("valign", this.columns[j].valign);
		dojo.html.disableSelection(cell);
		var val = this.store.getField(obj.src, this.columns[j].getField());
		if (typeof (val) == "undefined") {
			val = "";
		}
		this.fillCell(cell, this.columns[j], val);
		row.appendChild(cell);
	}
	return row;
}, fillCell:function (cell, meta, val) {
	if (meta.sortType == "__markup__") {
		cell.innerHTML = val;
	} else {
		if (meta.getType() == Date) {
			val = new Date(val);
			if (!isNaN(val)) {
				var format = this.defaultDateFormat;
				if (meta.format) {
					format = meta.format;
				}
				cell.innerHTML = dojo.date.strftime(val, format);
			} else {
				cell.innerHTML = val;
			}
		} else {
			if ("Number number int Integer float Float".indexOf(meta.getType()) > -1) {
				if (val.length == 0) {
					val = "0";
				}
				var n = parseFloat(val, 10) + "";
				if (n.indexOf(".") > -1) {
					n = dojo.math.round(parseFloat(val, 10), 2);
				}
				cell.innerHTML = n;
			} else {
				cell.innerHTML = val;
			}
		}
	}
}, prefill:function () {
	this.isInitialized = false;
	var body = this.domNode.tBodies[0];
	while (body.childNodes.length > 0) {
		body.removeChild(body.childNodes[0]);
	}
	if (this.minRows > 0) {
		for (var i = 0; i < this.minRows; i++) {
			var row = document.createElement("tr");
			if (this.alternateRows) {
				dojo.html[((i % 2 == 1) ? "addClass" : "removeClass")](row, this.rowAlternateClass);
			}
			row.setAttribute("emptyRow", "true");
			for (var j = 0; j < this.columns.length; j++) {
				var cell = document.createElement("td");
				cell.innerHTML = "&nbsp;";
				row.appendChild(cell);
			}
			body.appendChild(row);
		}
	}
}, init:function () {
	this.isInitialized = false;
	var head = this.domNode.getElementsByTagName("thead")[0];
	if (head.getElementsByTagName("tr").length == 0) {
		var row = document.createElement("tr");
		for (var i = 0; i < this.columns.length; i++) {
			var cell = document.createElement("td");
			cell.setAttribute("align", this.columns[i].align);
			cell.setAttribute("valign", this.columns[i].valign);
			dojo.html.disableSelection(cell);
			cell.innerHTML = this.columns[i].label;
			row.appendChild(cell);
			if (!this.columns[i].noSort) {
				dojo.event.connect(cell, "onclick", this, "onSort");
			}
		}
		dojo.html.prependChild(row, head);
	}
	if (this.store.get().length == 0) {
		return false;
	}
	var idx = this.domNode.tBodies[0].rows.length;
	if (!idx || idx == 0 || this.domNode.tBodies[0].rows[0].getAttribute("emptyRow") == "true") {
		idx = 0;
		var body = this.domNode.tBodies[0];
		while (body.childNodes.length > 0) {
			body.removeChild(body.childNodes[0]);
		}
		var data = this.store.get();
		for (var i = 0; i < data.length; i++) {
			var row = this.createRow(data[i]);
			body.appendChild(row);
			idx++;
		}
	}
	if (this.minRows > 0 && idx < this.minRows) {
		idx = this.minRows - idx;
		for (var i = 0; i < idx; i++) {
			row = document.createElement("tr");
			row.setAttribute("emptyRow", "true");
			for (var j = 0; j < this.columns.length; j++) {
				cell = document.createElement("td");
				cell.innerHTML = "&nbsp;";
				row.appendChild(cell);
			}
			body.appendChild(row);
		}
	}
	var row = this.domNode.getElementsByTagName("thead")[0].rows[0];
	var cellTag = "td";
	if (row.getElementsByTagName(cellTag).length == 0) {
		cellTag = "th";
	}
	var headers = row.getElementsByTagName(cellTag);
	for (var i = 0; i < headers.length; i++) {
		dojo.html.setClass(headers[i], this.headerClass);
	}
	for (var i = 0; i < this.sortInformation.length; i++) {
		var idx = this.sortInformation[i].index;
		var dir = (~this.sortInformation[i].direction) & 1;
		dojo.html.setClass(headers[idx], dir == 0 ? this.headerDownClass : this.headerUpClass);
	}
	this.isInitialized = true;
	return this.isInitialized;
}, render:function () {
	if (!this.isInitialized) {
		var b = this.init();
		if (!b) {
			this.prefill();
			return;
		}
	}
	var rows = [];
	var body = this.domNode.tBodies[0];
	var emptyRowIdx = -1;
	for (var i = 0; i < body.rows.length; i++) {
		rows.push(body.rows[i]);
	}
	var sortFunction = this.createSorter(this.sortInformation);
	if (sortFunction) {
		rows.sort(sortFunction);
	}
	for (var i = 0; i < rows.length; i++) {
		if (this.alternateRows) {
			dojo.html[((i % 2 == 1) ? "addClass" : "removeClass")](rows[i], this.rowAlternateClass);
		}
		dojo.html[(this.isRowSelected(body.rows[i]) ? "addClass" : "removeClass")](body.rows[i], this.rowSelectedClass);
		body.appendChild(rows[i]);
	}
}, renderSelections:function () {
	var body = this.domNode.tBodies[0];
	for (var i = 0; i < body.rows.length; i++) {
		dojo.html[(this.isRowSelected(body.rows[i]) ? "addClass" : "removeClass")](body.rows[i], this.rowSelectedClass);
	}
}, initialize:function () {
	var self = this;
	dojo.event.connect(this.store, "onSetData", function () {
		self.store.forEach(function (element) {
			element.isSelected = false;
		});
		self.isInitialized = false;
		var body = self.domNode.tBodies[0];
		if (body) {
			while (body.childNodes.length > 0) {
				body.removeChild(body.childNodes[0]);
			}
		}
		self.render();
	});
	dojo.event.connect(this.store, "onClearData", function () {
		self.isInitialized = false;
		self.render();
	});
	dojo.event.connect(this.store, "onAddData", function (addedObject) {
		var row = self.createRow(addedObject);
		self.domNode.tBodies[0].appendChild(row);
		self.render();
	});
	dojo.event.connect(this.store, "onAddDataRange", function (arr) {
		for (var i = 0; i < arr.length; i++) {
			arr[i].isSelected = false;
			var row = self.createRow(arr[i]);
			self.domNode.tBodies[0].appendChild(row);
		}
		self.render();
	});
	dojo.event.connect(this.store, "onRemoveData", function (removedObject) {
		var rows = self.domNode.tBodies[0].rows;
		for (var i = 0; i < rows.length; i++) {
			if (self.getDataByRow(rows[i]) == removedObject.src) {
				rows[i].parentNode.removeChild(rows[i]);
				break;
			}
		}
		self.render();
	});
	dojo.event.connect(this.store, "onUpdateField", function (obj, fieldPath, val) {
		var row = self.getRow(obj);
		var idx = self.getColumnIndex(fieldPath);
		if (row && row.cells[idx] && self.columns[idx]) {
			self.fillCell(row.cells[idx], self.columns[idx], val);
		}
	});
}, postCreate:function () {
	this.store.keyField = this.valueField;
	if (this.domNode) {
		if (this.domNode.nodeName.toLowerCase() != "table") {
		}
		if (this.domNode.getElementsByTagName("thead")[0]) {
			var head = this.domNode.getElementsByTagName("thead")[0];
			if (this.headClass.length > 0) {
				head.className = this.headClass;
			}
			dojo.html.disableSelection(this.domNode);
			this.parseMetadata(head);
			var header = "td";
			if (head.getElementsByTagName(header).length == 0) {
				header = "th";
			}
			var headers = head.getElementsByTagName(header);
			for (var i = 0; i < headers.length; i++) {
				if (!this.columns[i].noSort) {
					dojo.event.connect(headers[i], "onclick", this, "onSort");
				}
			}
		} else {
			this.domNode.appendChild(document.createElement("thead"));
		}
		if (this.domNode.tBodies.length < 1) {
			var body = document.createElement("tbody");
			this.domNode.appendChild(body);
		} else {
			var body = this.domNode.tBodies[0];
		}
		if (this.tbodyClass.length > 0) {
			body.className = this.tbodyClass;
		}
		dojo.event.connect(body, "onclick", this, "onSelect");
		this.parseData(body);
	}
}});

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?