New file |
0,0 → 1,498 |
/* |
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.SortableTable"); |
dojo.deprecated("SortableTable will be removed in favor of FilteringTable.", "0.5"); |
dojo.require("dojo.lang.common"); |
dojo.require("dojo.date.format"); |
dojo.require("dojo.html.*"); |
dojo.require("dojo.html.selection"); |
dojo.require("dojo.html.util"); |
dojo.require("dojo.html.style"); |
dojo.require("dojo.event.*"); |
dojo.require("dojo.widget.*"); |
dojo.require("dojo.widget.HtmlWidget"); |
dojo.widget.defineWidget("dojo.widget.SortableTable", dojo.widget.HtmlWidget, function () { |
this.data = []; |
this.selected = []; |
this.columns = []; |
}, {enableMultipleSelect:false, maximumNumberOfSelections:0, enableAlternateRows:false, minRows:0, defaultDateFormat:"%D", sortIndex:0, sortDirection:0, valueField:"Id", headClass:"", tbodyClass:"", headerClass:"", headerSortUpClass:"selected", headerSortDownClass:"selected", rowClass:"", rowAlternateClass:"alt", rowSelectedClass:"selected", 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; |
}, compare:function (o1, o2) { |
for (var p in o1) { |
if (!(p in o2)) { |
return false; |
} |
if (o1[p].valueOf() != o2[p].valueOf()) { |
return false; |
} |
} |
return true; |
}, isSelected:function (o) { |
for (var i = 0; i < this.selected.length; i++) { |
if (this.compare(this.selected[i], o)) { |
return true; |
} |
} |
return false; |
}, removeFromSelected:function (o) { |
var idx = -1; |
for (var i = 0; i < this.selected.length; i++) { |
if (this.compare(this.selected[i], o)) { |
idx = i; |
break; |
} |
} |
if (idx >= 0) { |
this.selected.splice(idx, 1); |
} |
}, getSelection:function () { |
return this.selected; |
}, getValue:function () { |
var a = []; |
for (var i = 0; i < this.selected.length; i++) { |
if (this.selected[i][this.valueField]) { |
a.push(this.selected[i][this.valueField]); |
} |
} |
return a.join(); |
}, reset:function () { |
this.columns = []; |
this.data = []; |
this.resetSelections(this.domNode.getElementsByTagName("tbody")[0]); |
}, resetSelections:function (body) { |
this.selected = []; |
var idx = 0; |
var rows = body.getElementsByTagName("tr"); |
for (var i = 0; i < rows.length; i++) { |
if (rows[i].parentNode == body) { |
rows[i].removeAttribute("selected"); |
if (this.enableAlternateRows && idx % 2 == 1) { |
rows[i].className = this.rowAlternateClass; |
} else { |
rows[i].className = ""; |
} |
idx++; |
} |
} |
}, getObjectFromRow:function (row) { |
var cells = row.getElementsByTagName("td"); |
var o = {}; |
for (var i = 0; i < this.columns.length; i++) { |
if (this.columns[i].sortType == "__markup__") { |
o[this.columns[i].getField()] = cells[i].innerHTML; |
} else { |
var text = dojo.html.renderedTextContent(cells[i]); |
var val = text; |
if (this.columns[i].getType() != String) { |
var val = new (this.columns[i].getType())(text); |
} |
o[this.columns[i].getField()] = val; |
} |
} |
if (dojo.html.hasAttribute(row, "value")) { |
o[this.valueField] = dojo.html.getAttribute(row, "value"); |
} |
return o; |
}, setSelectionByRow:function (row) { |
var o = this.getObjectFromRow(row); |
var b = false; |
for (var i = 0; i < this.selected.length; i++) { |
if (this.compare(this.selected[i], o)) { |
b = true; |
break; |
} |
} |
if (!b) { |
this.selected.push(o); |
} |
}, parseColumns:function (node) { |
this.reset(); |
var row = node.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 = {field:null, format:null, noSort:false, sortType:"String", dataType:String, sortFunction:null, label:null, align:"left", valign:"middle", getField:function () { |
return this.field || this.label; |
}, getType:function () { |
return this.dataType; |
}}; |
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; |
} |
} |
if (dojo.html.hasAttribute(cells[i], "field")) { |
o.field = dojo.html.getAttribute(cells[i], "field"); |
} |
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__"; |
o.noSort = true; |
} else { |
var type = this.getTypeFromString(sortType); |
if (type) { |
o.sortType = sortType; |
o.dataType = type; |
} |
} |
} |
o.label = dojo.html.renderedTextContent(cells[i]); |
this.columns.push(o); |
if (dojo.html.hasAttribute(cells[i], "sort")) { |
this.sortIndex = i; |
var dir = dojo.html.getAttribute(cells[i], "sort"); |
if (!isNaN(parseInt(dir))) { |
dir = parseInt(dir); |
this.sortDirection = (dir != 0) ? 1 : 0; |
} else { |
this.sortDirection = (dir.toLowerCase() == "desc") ? 1 : 0; |
} |
} |
} |
}, parseData:function (data) { |
this.data = []; |
this.selected = []; |
for (var i = 0; i < data.length; i++) { |
var o = {}; |
for (var j = 0; j < this.columns.length; j++) { |
var field = this.columns[j].getField(); |
if (this.columns[j].sortType == "__markup__") { |
o[field] = String(data[i][field]); |
} else { |
var type = this.columns[j].getType(); |
var val = data[i][field]; |
var t = this.columns[j].sortType.toLowerCase(); |
if (type == String) { |
o[field] = val; |
} else { |
if (val != null) { |
o[field] = new type(val); |
} else { |
o[field] = new type(); |
} |
} |
} |
} |
if (data[i][this.valueField] && !o[this.valueField]) { |
o[this.valueField] = data[i][this.valueField]; |
} |
this.data.push(o); |
} |
}, parseDataFromTable:function (tbody) { |
this.data = []; |
this.selected = []; |
var rows = tbody.getElementsByTagName("tr"); |
for (var i = 0; i < rows.length; i++) { |
if (dojo.html.getAttribute(rows[i], "ignoreIfParsed") == "true") { |
continue; |
} |
var o = {}; |
var cells = rows[i].getElementsByTagName("td"); |
for (var j = 0; j < this.columns.length; j++) { |
var field = this.columns[j].getField(); |
if (this.columns[j].sortType == "__markup__") { |
o[field] = cells[j].innerHTML; |
} else { |
var type = this.columns[j].getType(); |
var val = dojo.html.renderedTextContent(cells[j]); |
if (type == String) { |
o[field] = val; |
} else { |
if (val != null) { |
o[field] = new type(val); |
} else { |
o[field] = new type(); |
} |
} |
} |
} |
if (dojo.html.hasAttribute(rows[i], "value") && !o[this.valueField]) { |
o[this.valueField] = dojo.html.getAttribute(rows[i], "value"); |
} |
this.data.push(o); |
if (dojo.html.getAttribute(rows[i], "selected") == "true") { |
this.selected.push(o); |
} |
} |
}, showSelections:function () { |
var body = this.domNode.getElementsByTagName("tbody")[0]; |
var rows = body.getElementsByTagName("tr"); |
var idx = 0; |
for (var i = 0; i < rows.length; i++) { |
if (rows[i].parentNode == body) { |
if (dojo.html.getAttribute(rows[i], "selected") == "true") { |
rows[i].className = this.rowSelectedClass; |
} else { |
if (this.enableAlternateRows && idx % 2 == 1) { |
rows[i].className = this.rowAlternateClass; |
} else { |
rows[i].className = ""; |
} |
} |
idx++; |
} |
} |
}, render:function (bDontPreserve) { |
var data = []; |
var body = this.domNode.getElementsByTagName("tbody")[0]; |
if (!bDontPreserve) { |
this.parseDataFromTable(body); |
} |
for (var i = 0; i < this.data.length; i++) { |
data.push(this.data[i]); |
} |
var col = this.columns[this.sortIndex]; |
if (!col.noSort) { |
var field = col.getField(); |
if (col.sortFunction) { |
var sort = col.sortFunction; |
} else { |
var sort = function (a, b) { |
if (a[field] > b[field]) { |
return 1; |
} |
if (a[field] < b[field]) { |
return -1; |
} |
return 0; |
}; |
} |
data.sort(sort); |
if (this.sortDirection != 0) { |
data.reverse(); |
} |
} |
while (body.childNodes.length > 0) { |
body.removeChild(body.childNodes[0]); |
} |
for (var i = 0; i < data.length; i++) { |
var row = document.createElement("tr"); |
dojo.html.disableSelection(row); |
if (data[i][this.valueField]) { |
row.setAttribute("value", data[i][this.valueField]); |
} |
if (this.isSelected(data[i])) { |
row.className = this.rowSelectedClass; |
row.setAttribute("selected", "true"); |
} else { |
if (this.enableAlternateRows && i % 2 == 1) { |
row.className = this.rowAlternateClass; |
} |
} |
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); |
if (this.sortIndex == j) { |
cell.className = this.columnSelected; |
} |
if (this.columns[j].sortType == "__markup__") { |
cell.innerHTML = data[i][this.columns[j].getField()]; |
for (var k = 0; k < cell.childNodes.length; k++) { |
var node = cell.childNodes[k]; |
if (node && node.nodeType == dojo.html.ELEMENT_NODE) { |
dojo.html.disableSelection(node); |
} |
} |
} else { |
if (this.columns[j].getType() == Date) { |
var format = this.defaultDateFormat; |
if (this.columns[j].format) { |
format = this.columns[j].format; |
} |
cell.appendChild(document.createTextNode(dojo.date.strftime(data[i][this.columns[j].getField()], format))); |
} else { |
cell.appendChild(document.createTextNode(data[i][this.columns[j].getField()])); |
} |
} |
row.appendChild(cell); |
} |
body.appendChild(row); |
dojo.event.connect(row, "onclick", this, "onUISelect"); |
} |
var minRows = parseInt(this.minRows); |
if (!isNaN(minRows) && minRows > 0 && data.length < minRows) { |
var mod = 0; |
if (data.length % 2 == 0) { |
mod = 1; |
} |
var nRows = minRows - data.length; |
for (var i = 0; i < nRows; i++) { |
var row = document.createElement("tr"); |
row.setAttribute("ignoreIfParsed", "true"); |
if (this.enableAlternateRows && i % 2 == mod) { |
row.className = this.rowAlternateClass; |
} |
for (var j = 0; j < this.columns.length; j++) { |
var cell = document.createElement("td"); |
cell.appendChild(document.createTextNode("\xa0")); |
row.appendChild(cell); |
} |
body.appendChild(row); |
} |
} |
}, onSelect:function (e) { |
}, onUISelect:function (e) { |
var row = dojo.html.getParentByType(e.target, "tr"); |
var body = dojo.html.getParentByType(row, "tbody"); |
if (this.enableMultipleSelect) { |
if (e.metaKey || e.ctrlKey) { |
if (this.isSelected(this.getObjectFromRow(row))) { |
this.removeFromSelected(this.getObjectFromRow(row)); |
row.removeAttribute("selected"); |
} else { |
this.setSelectionByRow(row); |
row.setAttribute("selected", "true"); |
} |
} else { |
if (e.shiftKey) { |
var startRow; |
var rows = body.getElementsByTagName("tr"); |
for (var i = 0; i < rows.length; i++) { |
if (rows[i].parentNode == body) { |
if (rows[i] == row) { |
break; |
} |
if (dojo.html.getAttribute(rows[i], "selected") == "true") { |
startRow = rows[i]; |
} |
} |
} |
if (!startRow) { |
startRow = row; |
for (; i < rows.length; i++) { |
if (dojo.html.getAttribute(rows[i], "selected") == "true") { |
row = rows[i]; |
break; |
} |
} |
} |
this.resetSelections(body); |
if (startRow == row) { |
row.setAttribute("selected", "true"); |
this.setSelectionByRow(row); |
} else { |
var doSelect = false; |
for (var i = 0; i < rows.length; i++) { |
if (rows[i].parentNode == body) { |
rows[i].removeAttribute("selected"); |
if (rows[i] == startRow) { |
doSelect = true; |
} |
if (doSelect) { |
this.setSelectionByRow(rows[i]); |
rows[i].setAttribute("selected", "true"); |
} |
if (rows[i] == row) { |
doSelect = false; |
} |
} |
} |
} |
} else { |
this.resetSelections(body); |
row.setAttribute("selected", "true"); |
this.setSelectionByRow(row); |
} |
} |
} else { |
this.resetSelections(body); |
row.setAttribute("selected", "true"); |
this.setSelectionByRow(row); |
} |
this.showSelections(); |
this.onSelect(e); |
e.stopPropagation(); |
e.preventDefault(); |
}, onHeaderClick: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++) { |
if (headers[i] == header) { |
if (i != oldIndex) { |
this.sortIndex = i; |
this.sortDirection = 0; |
headers[i].className = this.headerSortDownClass; |
} else { |
this.sortDirection = (oldDirection == 0) ? 1 : 0; |
if (this.sortDirection == 0) { |
headers[i].className = this.headerSortDownClass; |
} else { |
headers[i].className = this.headerSortUpClass; |
} |
} |
} else { |
headers[i].className = this.headerClass; |
} |
} |
this.render(); |
}, postCreate:function () { |
var thead = this.domNode.getElementsByTagName("thead")[0]; |
if (this.headClass.length > 0) { |
thead.className = this.headClass; |
} |
dojo.html.disableSelection(this.domNode); |
this.parseColumns(thead); |
var header = "td"; |
if (thead.getElementsByTagName(header).length == 0) { |
header = "th"; |
} |
var headers = thead.getElementsByTagName(header); |
for (var i = 0; i < headers.length; i++) { |
if (!this.columns[i].noSort) { |
dojo.event.connect(headers[i], "onclick", this, "onHeaderClick"); |
} |
if (this.sortIndex == i) { |
if (this.sortDirection == 0) { |
headers[i].className = this.headerSortDownClass; |
} else { |
headers[i].className = this.headerSortUpClass; |
} |
} |
} |
var tbody = this.domNode.getElementsByTagName("tbody")[0]; |
if (this.tbodyClass.length > 0) { |
tbody.className = this.tbodyClass; |
} |
this.parseDataFromTable(tbody); |
this.render(true); |
}}); |
|