📄 filteringtable.js
字号:
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); } this.render(); }, onFilter: function(){ // summary // show or hide rows based on the parameters of the passed filter. }, // Filtering methods _defaultFilter: function(/* Object */obj){ // summary // Always return true as the result of the default filter. return true; }, setFilter: function(/* string */field, /* function */fn){ // summary // set a filtering function on the passed field. 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(/* number */idx, /* function */fn){ // summary // set a filtering function on the passed column index. this.columns[idx].filterFunction=fn; this.applyFilters(); }, clearFilter: function(/* string */field){ // summary // clear a filtering function on the passed 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(/* number */idx){ // summary // clear a filtering function on the passed column index. this.columns[idx].filterFunction=this._defaultFilter; this.applyFilters(); }, clearFilters: function(){ // summary // clears all filters. for(var i=0; i<this.columns.length; i++){ this.columns[i].filterFunction=this._defaultFilter; } // we'll do the clear manually, it will be faster. 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(){ // summary // apply all filters to the table. 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(); }, // sorting functionality createSorter: function(/* array */info){ // summary // creates a custom function to be used for sorting. var self=this; var sortFunctions=[]; // our function stack. function createSortFunction(fieldIndex, dir){ var meta=self.columns[fieldIndex]; var field=meta.getField(); return function(rowA, rowB){ if(dojo.html.hasAttribute(rowA,"emptyRow") || dojo.html.hasAttribute(rowB,"emptyRow")){ return -1; } // TODO: check for markup and compare by rendered text. 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; } // if we got here then we must be equal. return 0; }; // function }, // rendering createRow: function(/* object */obj){ // summary // Create an HTML row based on the passed object 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; // HTMLTableRow }, fillCell: function(/* HTMLTableCell */cell, /* object */meta, /* object */val){ // summary // Fill the passed cell with value, based on the passed meta object. 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){ // TODO: number formatting if(val.length == 0){ val="0"; } var n = parseFloat(val, 10) + ""; // TODO: numeric formatting + rounding :) if(n.indexOf(".")>-1){ n = dojo.math.round(parseFloat(val,10),2); } cell.innerHTML = n; }else{ cell.innerHTML = val; } } }, prefill: function(){ // summary // if there's no data in the table, then prefill it with this.minRows. 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 = " "; row.appendChild(cell); } body.appendChild(row); } } }, init: function(){ // summary // initializes the table of data this.isInitialized=false; // if there is no thead, create it now. var head=this.domNode.getElementsByTagName("thead")[0]; if(head.getElementsByTagName("tr").length == 0){ // render the column code. 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); // attach the events. 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]); dojo.event.connect(row, "onclick", this, "onSelect"); body.appendChild(row); idx++; } } // add empty rows 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=" "; row.appendChild(cell); } body.appendChild(row); } } // last but not least, show any columns that have sorting already on them. 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(){ // summary // Renders the actual table data. /* The method that should be called once underlying changes * are made, including sorting, filtering, data changes. * Rendering the selections themselves are a different method, * which render() will call as the last step. ****************************************************************/ if(!this.isInitialized){ var b = this.init(); if(!b){ this.prefill(); return; } } // do the sort 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]); } // build the sorting function, and do the sorting. var sortFunction = this.createSorter(this.sortInformation); if(sortFunction){ rows.sort(sortFunction); } // append the rows without killing them, this should help with the HTML problems. 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(){ // summary // Render all selected objects using CSS. 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); } }, // widget lifetime handlers initialize: function(){ // summary // Initializes the widget. var self=this; // connect up binding listeners here. 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.render(); }); dojo.event.connect(this.store, "onAddData", function(addedObject){ var row=self.createRow(addedObject); dojo.event.connect(row, "onclick", self, "onSelect"); 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]); dojo.event.connect(row, "onclick", self, "onSelect"); 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(){ // summary // finish widget initialization. this.store.keyField = this.valueField; if(this.domNode){ // start by making sure domNode is a table element; if(this.domNode.nodeName.toLowerCase() != "table"){ } // see if there is columns set up already 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 the table doesn't have a tbody already, add one and grab a reference to it 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; } this.parseData(body); } }});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -