webui-aria2/js/libs/dojox/grid/enhanced/plugins/Search.js.uncompressed.js
2012-05-01 19:52:07 +08:00

123 lines
3.2 KiB
JavaScript

//>>built
define("dojox/grid/enhanced/plugins/Search", [
"dojo/_base/kernel",
"dojo/_base/lang",
"dojo/_base/declare",
"dojo/_base/array",
"dojo/data/util/filter",
"../../EnhancedGrid",
"../_Plugin"
], function(dojo, lang, declare, array, dFilter, EnhancedGrid, _Plugin){
var Search = declare("dojox.grid.enhanced.plugins.Search", _Plugin, {
// summary:
// Search the grid using wildcard string or Regular Expression.
// name: String
// plugin name
name: "search",
constructor: function(grid, args){
this.grid = grid;
args = (args && lang.isObject(args)) ? args : {};
this._cacheSize = args.cacheSize || -1;
grid.searchRow = lang.hitch(this, "searchRow");
},
searchRow: function(/* Object|RegExp|String */searchArgs, /* function(Integer, item) */onSearched){
if(!lang.isFunction(onSearched)){ return; }
if(lang.isString(searchArgs)){
searchArgs = dFilter.patternToRegExp(searchArgs);
}
var isGlobal = false;
if(searchArgs instanceof RegExp){
isGlobal = true;
}else if(lang.isObject(searchArgs)){
var isEmpty = true;
for(var field in searchArgs){
if(lang.isString(searchArgs[field])){
searchArgs[field] = dFilter.patternToRegExp(searchArgs[field]);
}
isEmpty = false;
}
if(isEmpty){ return; }
}else{
return;
}
this._search(searchArgs, 0, onSearched, isGlobal);
},
_search: function(/* Object|RegExp */searchArgs, /* Integer */start, /* function(Integer, item) */onSearched, /* Boolean */isGlobal){
var _this = this,
cnt = this._cacheSize,
args = {
start: start,
query: this.grid.query,
sort: this.grid.getSortProps(),
queryOptions: this.grid.queryOptions,
onBegin: function(size){
_this._storeSize = size;
},
onComplete: function(items){
if(!array.some(items, function(item, i){
if(_this._checkRow(item, searchArgs, isGlobal)){
onSearched(start + i, item);
return true;
}
return false;
})){
if(cnt > 0 && start + cnt < _this._storeSize){
_this._search(searchArgs, start + cnt, onSearched, isGlobal);
}else{
onSearched(-1, null);
}
}
}
};
if(cnt > 0){
args.count = cnt;
}
this.grid._storeLayerFetch(args);
},
_checkRow: function(/* store item */item, /* Object|RegExp */searchArgs, /* Boolean */isGlobal){
var g = this.grid, s = g.store, i, field,
cells = array.filter(g.layout.cells, function(cell){
return !cell.hidden;
});
if(isGlobal){
return array.some(cells, function(cell){
try{
if(cell.field){
return String(s.getValue(item, cell.field)).search(searchArgs) >= 0;
}
}catch(e){
console.log("Search._checkRow() error: ", e);
}
return false;
});
}else{
for(field in searchArgs){
if(searchArgs[field] instanceof RegExp){
for(i = cells.length - 1; i >= 0; --i){
if(cells[i].field == field){
try{
if(String(s.getValue(item, field)).search(searchArgs[field]) < 0){
return false;
}
break;
}catch(e){
return false;
}
}
}
if(i < 0){ return false; }
}
}
return true;
}
}
});
EnhancedGrid.registerPlugin(Search/*name:'search'*/);
return Search;
});