yvanui.yvsearch.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. /**
  2. * yvan.yvsearch.js
  3. * @author luoyifan
  4. * 2019-07-14 11:14:00
  5. */
  6. 'use strict';
  7. (function ($) {
  8. function init(target, context) {
  9. var state = $.data(target, 'yvsearch');
  10. var option = state.options;
  11. var $dom = $(target);
  12. option = $.extend({}, option);
  13. delete option.name;
  14. delete option.widget;
  15. delete option.xtype;
  16. delete option.required;
  17. var jqxOpt = {
  18. width: option.width,
  19. height: option.height,
  20. };
  21. $dom.jqxInput(jqxOpt);
  22. state.realValue = option.value;
  23. $dom.addClass('yvgrid-searchbox');
  24. $dom.on('click', function (event) {
  25. var $me = $(this);
  26. var width = $me.outerWidth();
  27. if (width - event.offsetX < 25) {
  28. //查询按钮
  29. $me.yvsearch('open', undefined, event);
  30. } else if (width - event.offsetX < 50) {
  31. //清空按钮
  32. $me.yvsearch('clear', event);
  33. }
  34. });
  35. $dom.on('mousemove', function (event) {
  36. var $me = $(this);
  37. var width = $me.outerWidth();
  38. if (width - event.offsetX < 20) {
  39. //查询按钮
  40. $me.removeClass('yvgrid-searchbox-hilight1');
  41. $me.addClass('yvgrid-searchbox-hilight2');
  42. } else if (width - event.offsetX < 44) {
  43. //清空按钮
  44. $me.removeClass('yvgrid-searchbox-hilight2');
  45. $me.addClass('yvgrid-searchbox-hilight1');
  46. } else {
  47. $me.removeClass('yvgrid-searchbox-hilight1');
  48. $me.removeClass('yvgrid-searchbox-hilight2');
  49. }
  50. });
  51. $dom.on('mouseout', function (event) {
  52. var $me = $(this);
  53. $me.removeClass('yvgrid-searchbox-hilight1');
  54. $me.removeClass('yvgrid-searchbox-hilight2');
  55. });
  56. $dom.on('keydown', function (event) {
  57. if (event.keyCode === 13) {
  58. $(this).yvsearch('open', undefined, event);
  59. }
  60. });
  61. $dom.on('blur', function (event) {
  62. var state = $.data(this, 'yvsearch');
  63. //离开焦点时,吧值还原
  64. if (!state.isWidgetOpen) {
  65. $(target).jqxInput('val', state.realValue || '');
  66. }
  67. });
  68. }
  69. $.fn.yvsearch = function (options, param) {
  70. if (typeof options == 'string') {
  71. var method = $.fn.yvsearch.methods[options];
  72. if (method) {
  73. var args = [this];
  74. for (var i = 1; i < arguments.length; i++) {
  75. args.push(arguments[i]);
  76. }
  77. return method.apply(this, args);
  78. } else {
  79. console.error('not found method:' + options);
  80. }
  81. }
  82. options = options || {};
  83. return this.each(function () {
  84. var state = $.data(this, 'yvsearch');
  85. if (state) {
  86. $.extend(state.options, options);
  87. } else {
  88. $.data(this, 'yvsearch', {
  89. options: $.extend({}, $.fn.yvsearch.defaults, options)
  90. });
  91. }
  92. init(this);
  93. });
  94. };
  95. $.fn.yvsearch.methods = {
  96. getQuery: function ($dom) {
  97. return $dom.jqxInput('val');
  98. },
  99. getValue: function ($dom) {
  100. var state = $.data($dom[0], 'yvsearch');
  101. if (!state || !state.realValue) {
  102. return '';
  103. }
  104. return state.realValue;
  105. },
  106. setValue: function (jq, value) {
  107. return jq.each(function () {
  108. var state = $.data(this, 'yvsearch');
  109. state.realValue = value;
  110. return $(this).jqxInput('val', value);
  111. });
  112. },
  113. focus: function ($dom) {
  114. setTimeout(function () {
  115. $dom.focus();
  116. }, 200);
  117. },
  118. confirm: function (jq, row) {
  119. return jq.each(function () {
  120. var $me = $(this);
  121. var state = $.data(this, 'yvsearch');
  122. var option = state.options;
  123. if ($.type(option.onChange) === 'function') {
  124. option.onChange.call(this, row);
  125. }
  126. option = $.extend({}, option.widget);
  127. $me.yvsearch('close');
  128. var successOpt = option['success'] || option.bind;
  129. if (!successOpt) {
  130. //没有配置,只写自己
  131. if (option.name && row.hasOwnProperty(option.name)) {
  132. $me.yvsearch('setValue', row[option.name]);
  133. return true;
  134. }
  135. }
  136. if ($.type(successOpt) === "function") {
  137. //是函数,调函数
  138. return successOpt.call(this, row);
  139. }
  140. //字符串或数组,直接调用数组
  141. if ($.type(successOpt) === "string") {
  142. successOpt = [successOpt];
  143. }
  144. var obj = {};
  145. if ($.type(successOpt) === 'array') {
  146. //数组,根据名字逐个写入
  147. $.each(successOpt, function (index, name) {
  148. obj[name] = row[name];
  149. });
  150. } else if ($.type(successOpt) === 'object') {
  151. //对象,根据映射关系写入
  152. var vs = successOpt;
  153. for (var prop in vs) {
  154. if (!vs.hasOwnProperty(prop)) continue;
  155. if (!row.hasOwnProperty(vs[prop])) {
  156. console.error('弹出框没有属性' + vs[prop], row);
  157. continue;
  158. }
  159. obj[prop] = row[vs[prop]];
  160. }
  161. }
  162. $me.up('yvgrid').yvgrid('setEditRow', obj, this);
  163. $me.yvsearch('saveValue');
  164. if ($.type(option['afterConfirm']) === 'function') {
  165. option['afterConfirm'](obj);
  166. }
  167. });
  168. },
  169. restore: function (jq) {
  170. return jq.each(function () {
  171. var state = $.data(this, 'yvsearch');
  172. $(this).jqxInput('val', state.realValue || '');
  173. });
  174. },
  175. clear: function (jq) {
  176. return jq.each(function () {
  177. var state = $.data(this, 'yvsearch');
  178. var option = state.options;
  179. if ($.type(option.onChange) === 'function') {
  180. option.onChange.call(this, {});
  181. }
  182. var widget = $.extend({}, option.widget);
  183. $(this).yvsearch('setValue', '');
  184. var obj = {};
  185. if ($.type(widget.clear) === "function") {
  186. var ret = widget.clear();
  187. if (!ret) {
  188. //没有返回任何数据, 就是纯调用
  189. return;
  190. }
  191. widget.clear = ret;
  192. }
  193. if ($.type(widget.clear) === "object") {
  194. //清空对象就是目标本身
  195. obj = $.extend({}, widget.clear);
  196. } else if ($.type(widget.clear) === "array") {
  197. //按数组内容清空
  198. $.each(widget.bind, function (index, name) {
  199. obj[name] = '';
  200. });
  201. } else if ($.type(widget.bind) === 'object') {
  202. //bind 对象,按名字清空
  203. for (var prop in widget.bind) {
  204. obj[prop] = '';
  205. }
  206. } else if ($.type(widget.bind) === 'array') {
  207. //按数组内容清空
  208. $.each(widget.bind, function (index, name) {
  209. obj[name] = '';
  210. });
  211. }
  212. //目前 yvsearch 只会出现在 yvgrid 中,只处理 yvgrid 的清空
  213. $(this).up('yvgrid').yvgrid('setEditRow', obj, this);
  214. });
  215. },
  216. close: function (jq) {
  217. return jq.each(function () {
  218. var state = $.data(this, 'yvsearch');
  219. if (state.dlgId) {
  220. $('.dlg_' + state.dlgId).window('close');
  221. }
  222. });
  223. },
  224. };
  225. $.fn.power.defaults.xtype.yvsearch = function ($targetDOM, option, context) {
  226. if (option.name) {
  227. var $dom = $("<input name='" + option.name + "' xtype='yvsearch' />").appendTo($targetDOM);
  228. } else {
  229. $dom = $("<input xtype='yvsearch' />").appendTo($targetDOM);
  230. }
  231. return $dom.yvsearch(option, context);
  232. };
  233. $.fn.yvsearch.defaults = {};
  234. })(jQuery);