Search.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojox.grid.enhanced.plugins.Search"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojox.grid.enhanced.plugins.Search"] = true;
  8. dojo.provide("dojox.grid.enhanced.plugins.Search");
  9. dojo.require("dojox.grid.enhanced._Plugin");
  10. dojo.require("dojo.data.util.filter");
  11. dojo.declare("dojox.grid.enhanced.plugins.Search", dojox.grid.enhanced._Plugin, {
  12. // summary:
  13. // Search the grid using wildcard string or Regular Expression.
  14. // name: String
  15. // plugin name
  16. name: "search",
  17. constructor: function(grid, args){
  18. this.grid = grid;
  19. args = (args && dojo.isObject(args)) ? args : {};
  20. this._cacheSize = args.cacheSize || -1;
  21. grid.searchRow = dojo.hitch(this, "searchRow");
  22. },
  23. searchRow: function(/* Object|RegExp|String */searchArgs, /* function(Integer, item) */onSearched){
  24. if(!dojo.isFunction(onSearched)){ return; }
  25. if(dojo.isString(searchArgs)){
  26. searchArgs = dojo.data.util.filter.patternToRegExp(searchArgs);
  27. }
  28. var isGlobal = false;
  29. if(searchArgs instanceof RegExp){
  30. isGlobal = true;
  31. }else if(dojo.isObject(searchArgs)){
  32. var isEmpty = true;
  33. for(var field in searchArgs){
  34. if(dojo.isString(searchArgs[field])){
  35. searchArgs[field] = dojo.data.util.filter.patternToRegExp(searchArgs[field]);
  36. }
  37. isEmpty = false;
  38. }
  39. if(isEmpty){ return; }
  40. }else{
  41. return;
  42. }
  43. this._search(searchArgs, 0, onSearched, isGlobal);
  44. },
  45. _search: function(/* Object|RegExp */searchArgs, /* Integer */start, /* function(Integer, item) */onSearched, /* Boolean */isGlobal){
  46. var _this = this,
  47. cnt = this._cacheSize,
  48. args = {
  49. "start": start,
  50. "onBegin": function(size){
  51. _this._storeSize = size;
  52. },
  53. "onComplete": function(items){
  54. if(!dojo.some(items, function(item, i){
  55. if(_this._checkRow(item, searchArgs, isGlobal)){
  56. onSearched(start + i, item);
  57. return true;
  58. }
  59. return false;
  60. })){
  61. if(cnt > 0 && start + cnt < _this._storeSize){
  62. _this._search(searchArgs, start + cnt, onSearched, isGlobal);
  63. }else{
  64. onSearched(-1, null);
  65. }
  66. }
  67. }
  68. };
  69. if(cnt > 0){
  70. args.count = cnt;
  71. }
  72. this.grid._storeLayerFetch(args);
  73. },
  74. _checkRow: function(/* store item */item, /* Object|RegExp */searchArgs, /* Boolean */isGlobal){
  75. var g = this.grid, s = g.store, i, field,
  76. cells = dojo.filter(g.layout.cells, function(cell){
  77. return !cell.hidden;
  78. });
  79. if(isGlobal){
  80. return dojo.some(cells, function(cell){
  81. try{
  82. if(cell.field){
  83. return String(s.getValue(item, cell.field)).search(searchArgs) >= 0;
  84. }
  85. }catch(e){
  86. console.log("Search._checkRow() error: ", e);
  87. }
  88. return false;
  89. });
  90. }else{
  91. for(field in searchArgs){
  92. if(searchArgs[field] instanceof RegExp){
  93. for(i = cells.length - 1; i >= 0; --i){
  94. if(cells[i].field == field){
  95. try{
  96. if(String(s.getValue(item, field)).search(searchArgs[field]) < 0){
  97. return false;
  98. }
  99. break;
  100. }catch(e){
  101. return false;
  102. }
  103. }
  104. }
  105. if(i < 0){ return false; }
  106. }
  107. }
  108. return true;
  109. }
  110. }
  111. });
  112. dojox.grid.EnhancedGrid.registerPlugin(dojox.grid.enhanced.plugins.Search/*name:'search'*/);
  113. }