Search.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * 输入框下拉筛选插件
  3. */
  4. Ext.define('erp.view.core.plugin.Search', {
  5. requires : ['erp.view.core.trigger.Dropdown'],
  6. ptype : 'search',
  7. constructor : function(cfg) {
  8. if (cfg) {
  9. Ext.apply(this, cfg);
  10. }
  11. },
  12. pageIndex: 0,
  13. pageSize: 10,
  14. init : function(field) {
  15. var me = this;
  16. me.searchfield = field;
  17. field.enableKeyEvents = true;
  18. field.on({
  19. keyup : function(m, l) {
  20. var j = me.getDropdown();
  21. if (l.keyCode === Ext.EventObject.ESC || !m.value) {
  22. j.hide();
  23. m.setValue("");
  24. return
  25. } else {
  26. j.show();
  27. }
  28. var h = j.getSelectionModel();
  29. var i = h.getLastSelected();
  30. var n = j.store.indexOf(i);
  31. var k = j.store.getCount() - 1;
  32. if (l.keyCode === Ext.EventObject.UP) {
  33. if (n === undefined) {
  34. h.select(0);
  35. } else {
  36. h.select(n === 0 ? k: (n - 1));
  37. }
  38. } else {
  39. if (l.keyCode === Ext.EventObject.DOWN) {
  40. if (n === undefined) {
  41. h.select(0);
  42. } else {
  43. h.select(n === k ? 0 : n + 1);
  44. }
  45. } else {
  46. if (l.keyCode === Ext.EventObject.ENTER) {
  47. l.preventDefault();
  48. i && me.loadRecord(i);
  49. } else {
  50. me.pageIndex = 0;
  51. clearTimeout(me.searchTimeout);
  52. me.searchTimeout = Ext.Function.defer(function() {
  53. me.search(m.value);
  54. }, 50, me);
  55. }
  56. }
  57. }
  58. },
  59. focus: function(b) {
  60. if (b.value && me.getDropdown().store.getCount() > 0) {
  61. me.getDropdown().show();
  62. }
  63. },
  64. blur: function() {
  65. var b = me.getDropdown();
  66. me.hideTimeout = Ext.Function.defer(b.hide, 500, b);
  67. }
  68. });
  69. me.getDropdown().on({
  70. itemclick: function(c, d, l, i, e) {
  71. // me.loadRecord(d);
  72. },
  73. changePage: function(c, d) {
  74. me.pageIndex += d;
  75. me.search(me.getField().getValue());
  76. },
  77. footerClick: function(c, d) {
  78. clearTimeout(me.hideTimeout);
  79. me.getField().focus();
  80. }
  81. });
  82. },
  83. getField: function() {
  84. return this.searchfield;
  85. },
  86. getGrid: function() {
  87. return this.searchgrid || (this.searchgrid = this.getField().column.ownerCt.ownerCt);
  88. },
  89. getDropdown: function() {
  90. return this.getField().dropdown
  91. || (this.getField().dropdown = Ext.create('erp.view.core.trigger.Dropdown'));
  92. },
  93. loadRecord: function(d) {
  94. this.getDropdown().hide();
  95. },
  96. search: function(h) {
  97. var e = this.filter(h);
  98. if (this.pageIndex < 0) {
  99. this.pageIndex = 0;
  100. } else {
  101. if (this.pageIndex > Math.floor(e.length / this.pageSize)) {
  102. this.pageIndex = Math.floor(e.length / this.pageSize);
  103. }
  104. }
  105. var g = this.pageIndex * this.pageSize;
  106. var f = g + this.pageSize;
  107. this.getDropdown().setTotal(e.length);
  108. this.getDropdown().setStart(g);
  109. this.getDropdown().getStore().loadData(e.slice(g, f));
  110. this.getDropdown().alignTo(this.getField().getEl(), "bl");
  111. if (e.length === 0) {
  112. this.getDropdown().hide();
  113. } else {
  114. this.getDropdown().getSelectionModel().select(0);
  115. }
  116. },
  117. filter: function(p) {
  118. var z = {}, s = [], t = Ext.escapeRe(p), v = new RegExp(t, "i"),
  119. f = this.getField().dataIndex, h;
  120. this.getGrid().getStore().each(function(a) {
  121. h = a.get(f);
  122. if (h && v.test(h) && !z[h]) {
  123. z[h] = 1;
  124. s.push({text : h});
  125. }
  126. });
  127. return s;
  128. }
  129. });