filteringtable.js
来自「Hippo CMS是一个以信息为中心的开源内容管理系统。Hippo CMS目标是」· JavaScript 代码 · 共 711 行 · 第 1/2 页
JS
711 行
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.widget.FilteringTable");
dojo.require("dojo.date.format");
dojo.require("dojo.math");
dojo.require("dojo.collections.Store");
dojo.require("dojo.html.*");
dojo.require("dojo.html.util");
dojo.require("dojo.html.style");
dojo.require("dojo.html.selection");
dojo.require("dojo.event.*");
dojo.require("dojo.widget.*");
dojo.require("dojo.widget.HtmlWidget");
dojo.widget.defineWidget("dojo.widget.FilteringTable", dojo.widget.HtmlWidget, function () {
this.store = new dojo.collections.Store();
this.valueField = "Id";
this.multiple = false;
this.maxSelect = 0;
this.maxSortable = 1;
this.minRows = 0;
this.defaultDateFormat = "%D";
this.isInitialized = false;
this.alternateRows = false;
this.columns = [];
this.sortInformation = [{index:0, direction:0}];
this.headClass = "";
this.tbodyClass = "";
this.headerClass = "";
this.headerUpClass = "selectedUp";
this.headerDownClass = "selectedDown";
this.rowClass = "";
this.rowAlternateClass = "alt";
this.rowSelectedClass = "selected";
this.columnSelected = "sorted-column";
}, {isContainer:false, templatePath:null, templateCssPath:null, getTypeFromString:function (s) {
var parts = s.split("."), i = 0, obj = dj_global;
do {
obj = obj[parts[i++]];
} while (i < parts.length && obj);
return (obj != dj_global) ? obj : null;
}, getByRow:function (row) {
return this.store.getByKey(dojo.html.getAttribute(row, "value"));
}, getDataByRow:function (row) {
return this.store.getDataByKey(dojo.html.getAttribute(row, "value"));
}, getRow:function (obj) {
var rows = this.domNode.tBodies[0].rows;
for (var i = 0; i < rows.length; i++) {
if (this.store.getDataByKey(dojo.html.getAttribute(rows[i], "value")) == obj) {
return rows[i];
}
}
return null;
}, getColumnIndex:function (fieldPath) {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].getField() == fieldPath) {
return i;
}
}
return -1;
}, getSelectedData:function () {
var data = this.store.get();
var a = [];
for (var i = 0; i < data.length; i++) {
if (data[i].isSelected) {
a.push(data[i].src);
}
}
if (this.multiple) {
return a;
} else {
return a[0];
}
}, isSelected:function (obj) {
var data = this.store.get();
for (var i = 0; i < data.length; i++) {
if (data[i].src == obj) {
return true;
}
}
return false;
}, isValueSelected:function (val) {
var v = this.store.getByKey(val);
if (v) {
return v.isSelected;
}
return false;
}, isIndexSelected:function (idx) {
var v = this.store.getByIndex(idx);
if (v) {
return v.isSelected;
}
return false;
}, isRowSelected:function (row) {
var v = this.getByRow(row);
if (v) {
return v.isSelected;
}
return false;
}, reset:function () {
this.store.clearData();
this.columns = [];
this.sortInformation = [{index:0, direction:0}];
this.resetSelections();
this.isInitialized = false;
this.onReset();
}, resetSelections:function () {
this.store.forEach(function (element) {
element.isSelected = false;
});
}, onReset:function () {
}, select:function (obj) {
var data = this.store.get();
for (var i = 0; i < data.length; i++) {
if (data[i].src == obj) {
data[i].isSelected = true;
break;
}
}
this.onDataSelect(obj);
}, selectByValue:function (val) {
this.select(this.store.getDataByKey(val));
}, selectByIndex:function (idx) {
this.select(this.store.getDataByIndex(idx));
}, selectByRow:function (row) {
this.select(this.getDataByRow(row));
}, selectAll:function () {
this.store.forEach(function (element) {
element.isSelected = true;
});
}, onDataSelect:function (obj) {
}, toggleSelection:function (obj) {
var data = this.store.get();
for (var i = 0; i < data.length; i++) {
if (data[i].src == obj) {
data[i].isSelected = !data[i].isSelected;
break;
}
}
this.onDataToggle(obj);
}, toggleSelectionByValue:function (val) {
this.toggleSelection(this.store.getDataByKey(val));
}, toggleSelectionByIndex:function (idx) {
this.toggleSelection(this.store.getDataByIndex(idx));
}, toggleSelectionByRow:function (row) {
this.toggleSelection(this.getDataByRow(row));
}, toggleAll:function () {
this.store.forEach(function (element) {
element.isSelected = !element.isSelected;
});
}, onDataToggle:function (obj) {
}, _meta:{field:null, format:null, filterer:null, noSort:false, sortType:"String", dataType:String, sortFunction:null, filterFunction:null, label:null, align:"left", valign:"middle", getField:function () {
return this.field || this.label;
}, getType:function () {
return this.dataType;
}}, createMetaData:function (obj) {
for (var p in this._meta) {
if (!obj[p]) {
obj[p] = this._meta[p];
}
}
if (!obj.label) {
obj.label = obj.field;
}
if (!obj.filterFunction) {
obj.filterFunction = this._defaultFilter;
}
return obj;
}, parseMetadata:function (head) {
this.columns = [];
this.sortInformation = [];
var row = head.getElementsByTagName("tr")[0];
var cells = row.getElementsByTagName("td");
if (cells.length == 0) {
cells = row.getElementsByTagName("th");
}
for (var i = 0; i < cells.length; i++) {
var o = this.createMetaData({});
if (dojo.html.hasAttribute(cells[i], "align")) {
o.align = dojo.html.getAttribute(cells[i], "align");
}
if (dojo.html.hasAttribute(cells[i], "valign")) {
o.valign = dojo.html.getAttribute(cells[i], "valign");
}
if (dojo.html.hasAttribute(cells[i], "nosort")) {
o.noSort = (dojo.html.getAttribute(cells[i], "nosort") == "true");
}
if (dojo.html.hasAttribute(cells[i], "sortusing")) {
var trans = dojo.html.getAttribute(cells[i], "sortusing");
var f = this.getTypeFromString(trans);
if (f != null && f != window && typeof (f) == "function") {
o.sortFunction = f;
}
}
o.label = dojo.html.renderedTextContent(cells[i]);
if (dojo.html.hasAttribute(cells[i], "field")) {
o.field = dojo.html.getAttribute(cells[i], "field");
} else {
if (o.label.length > 0) {
o.field = o.label;
} else {
o.field = "field" + i;
}
}
if (dojo.html.hasAttribute(cells[i], "format")) {
o.format = dojo.html.getAttribute(cells[i], "format");
}
if (dojo.html.hasAttribute(cells[i], "dataType")) {
var sortType = dojo.html.getAttribute(cells[i], "dataType");
if (sortType.toLowerCase() == "html" || sortType.toLowerCase() == "markup") {
o.sortType = "__markup__";
} else {
var type = this.getTypeFromString(sortType);
if (type) {
o.sortType = sortType;
o.dataType = type;
}
}
}
if (dojo.html.hasAttribute(cells[i], "filterusing")) {
var trans = dojo.html.getAttribute(cells[i], "filterusing");
var f = this.getTypeFromString(trans);
if (f != null && f != window && typeof (f) == "function") {
o.filterFunction = f;
}
}
this.columns.push(o);
if (dojo.html.hasAttribute(cells[i], "sort")) {
var info = {index:i, direction:0};
var dir = dojo.html.getAttribute(cells[i], "sort");
if (!isNaN(parseInt(dir))) {
dir = parseInt(dir);
info.direction = (dir != 0) ? 1 : 0;
} else {
info.direction = (dir.toLowerCase() == "desc") ? 1 : 0;
}
this.sortInformation.push(info);
}
}
if (this.sortInformation.length == 0) {
this.sortInformation.push({index:0, direction:0});
} else {
if (this.sortInformation.length > this.maxSortable) {
this.sortInformation.length = this.maxSortable;
}
}
}, parseData:function (body) {
if (body.rows.length == 0 && this.columns.length == 0) {
return;
}
var self = this;
this["__selected__"] = [];
var arr = this.store.getFromHtml(this.columns, body, function (obj, row) {
if (typeof (obj[self.valueField]) == "undefined" || obj[self.valueField] == null) {
obj[self.valueField] = dojo.html.getAttribute(row, "value");
}
if (dojo.html.getAttribute(row, "selected") == "true") {
self["__selected__"].push(obj);
}
});
this.store.setData(arr, true);
this.render();
for (var i = 0; i < this["__selected__"].length; i++) {
this.select(this["__selected__"][i]);
}
this.renderSelections();
delete this["__selected__"];
this.isInitialized = true;
}, onSelect:function (e) {
var row = dojo.html.getParentByType(e.target, "tr");
if (dojo.html.hasAttribute(row, "emptyRow")) {
return;
}
var body = dojo.html.getParentByType(row, "tbody");
if (this.multiple) {
if (e.shiftKey) {
var startRow;
var rows = body.rows;
for (var i = 0; i < rows.length; i++) {
if (rows[i] == row) {
break;
}
if (this.isRowSelected(rows[i])) {
startRow = rows[i];
}
}
if (!startRow) {
startRow = row;
for (; i < rows.length; i++) {
if (this.isRowSelected(rows[i])) {
row = rows[i];
break;
}
}
}
this.resetSelections();
if (startRow == row) {
this.toggleSelectionByRow(row);
} else {
var doSelect = false;
for (var i = 0; i < rows.length; i++) {
if (rows[i] == startRow) {
doSelect = true;
}
if (doSelect) {
this.selectByRow(rows[i]);
}
if (rows[i] == row) {
doSelect = false;
}
}
}
} else {
this.toggleSelectionByRow(row);
}
} else {
this.resetSelections();
this.toggleSelectionByRow(row);
}
this.renderSelections();
}, onSort:function (e) {
var oldIndex = this.sortIndex;
var oldDirection = this.sortDirection;
var source = e.target;
var row = dojo.html.getParentByType(source, "tr");
var cellTag = "td";
if (row.getElementsByTagName(cellTag).length == 0) {
cellTag = "th";
}
var headers = row.getElementsByTagName(cellTag);
var header = dojo.html.getParentByType(source, cellTag);
for (var i = 0; i < headers.length; i++) {
dojo.html.setClass(headers[i], this.headerClass);
if (headers[i] == header) {
if (this.sortInformation[0].index != i) {
this.sortInformation.unshift({index:i, direction:0});
} else {
this.sortInformation[0] = {index:i, direction:(~this.sortInformation[0].direction) & 1};
}
}
}
this.sortInformation.length = Math.min(this.sortInformation.length, this.maxSortable);
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);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?