yvanui.widget.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. /**
  2. * widget searchbox 查找框
  3. * @author luoyifan
  4. * 2018-12-01 14:00:00
  5. */
  6. "use strict";
  7. (function ($) {
  8. //默认 searchbox
  9. $.extend($.fn.searchbox.defaults, {
  10. prompt: '回车搜索',
  11. icons: [{
  12. iconCls: 'icon-clear',
  13. handler: function (e) {
  14. var $me = $(e.data.target);
  15. $me.textbox('clear').textbox('textbox').focus();
  16. if ($me.textbox('options').widget) {
  17. widget.clear(e);
  18. }
  19. }
  20. }],
  21. searcher: function () {
  22. var opts = $(this).searchbox('options');
  23. var option = opts.dialog || opts.widget;
  24. if (option) {
  25. widget.show(option, this);
  26. }
  27. }
  28. });
  29. })(jQuery);
  30. var widget = {
  31. show: function (option, sender) {
  32. var $sender = $(sender);
  33. var $power = $(sender).up('power');
  34. $power.progress();
  35. //恢复 $sender, 设置为焦点离开之前输入的值
  36. // var query = $sender.data().widgetTmpValue != null ? $sender.data().widgetTmpValue : $sender.searchbox('options').value;
  37. var query = $sender.searchbox('options').value != null ? $sender.searchbox('options').value : $sender.data().widgetTmpValue;
  38. $sender.textbox('setValue', query);
  39. seajs.use([option.url], function (widgetWindowOption) {
  40. //为二级弹出初始化查询数据
  41. var onLoadData1 = option['onWidgetLoadData'] || option.bind;
  42. var onLoadData2 = option['onWidgetLoadData'] || option.other;
  43. var d = {};
  44. var onLoadData = Object.assign(d, onLoadData1, onLoadData2);
  45. var data;
  46. if ($.type(onLoadData) === 'function') {
  47. data = onLoadData.call($sender, option);
  48. } else {
  49. var vs = onLoadData;
  50. var $grid = $sender.up('grid');
  51. var row;
  52. if ($grid.length > 0) {
  53. //表格带回值
  54. row = $grid.getEditRow();
  55. } else {
  56. //窗体带回值
  57. row = $sender.findForm().formGet();
  58. $sender.data().widgetValue = $sender.searchbox('getValue');
  59. }
  60. if ($.type(vs) === "string") {
  61. vs = [vs];
  62. }
  63. data = {};
  64. if ($.type(vs) === 'array') {
  65. //数组,直接读取
  66. $.each(vs, function (index, name) {
  67. data[name] = row[name];
  68. });
  69. } else {
  70. //对象调用, 建立映射关系
  71. for (var prop in vs) {
  72. if (!vs.hasOwnProperty(prop)) continue;
  73. if (!row.hasOwnProperty(prop)) {
  74. console.log('searchbox没有属性' + prop, row);
  75. continue;
  76. }
  77. data[vs[prop]] = row[prop];
  78. }
  79. }
  80. }
  81. if (widgetWindowOption.hasOwnProperty('onWidgetLoadData')) {
  82. widgetWindowOption.onWidgetLoadData(sender, data);
  83. }
  84. //获取到 xtype:widget 的窗口
  85. if ($.type(widgetWindowOption) === 'function') {
  86. widgetWindowOption = widgetWindowOption($.extend(data, {
  87. sender: $sender,
  88. query: query
  89. }));
  90. }
  91. $power.progress('close');
  92. var filterMethod = function (val) {
  93. var rows = $grid.find('tr[role="row"][id]');
  94. if (val.length <= 0) {
  95. //显示所有行
  96. rows.show();
  97. return;
  98. }
  99. rows.each(function (rowIndex, row) {
  100. var finded = false;
  101. $(row).find('td').each(function (colIndex, col) {
  102. if (colIndex < 2 || finded) return;
  103. if ($.trim(col.innerText).toLowerCase().indexOf(val) >= 0) {
  104. finded = true;
  105. }
  106. });
  107. // searchbox在可编辑列表中列表的显示和隐藏
  108. // if (finded) {
  109. // $(row).show();
  110. // } else {
  111. // $(row).hide();
  112. // }
  113. });
  114. };
  115. var qp = option.queryParams;
  116. if ($.type(qp) === 'function') {
  117. qp = option.queryParams.apply($sender);
  118. }
  119. //============ 展示出界面
  120. var $dlg;
  121. var $ff;
  122. var $dId = $.yvan.createId('widgetDialog');
  123. var $tId = $.yvan.createId('textbox');
  124. var dlgOpt = {
  125. xtype: 'dialog',
  126. id: 'efrwrt_id',
  127. dialogId: $dId,
  128. title: widgetWindowOption.title || '匿名对话框',
  129. width: widgetWindowOption.width || 900,
  130. height: widgetWindowOption.height || 400,
  131. center: {
  132. items: $.extend(true,
  133. {
  134. xtype: 'grid',
  135. queryParams: qp,
  136. onRender: function () {
  137. //默认1秒后 grid 获取焦点
  138. $ff = $(this);
  139. setTimeout(function () {
  140. $sender.data().isWidgetOpen = true;
  141. if ($ff.length > 0) {
  142. $ff.focus();
  143. }
  144. $sender.data().isWidgetOpen = false;
  145. }, 500);
  146. $('#' + $tId).textbox('setValue',query);
  147. },
  148. onKeyDown: function (e) {
  149. if (e.key === 'Control' || e.key === 'Shift' || e.key === 'Alt') {
  150. return false;
  151. }
  152. if (e.keyCode === 13) {
  153. //如果按下回车键,就发出确认
  154. var $grid = $dlg.down('grid');
  155. var row = $grid.rowData();
  156. if (row) {
  157. $dlg.data('confirm')(row);
  158. }
  159. }
  160. },
  161. onDblClickRow: function (rowid, iRow, iCol, e) {
  162. //双击表格的行,发出确认
  163. var $grid = $dlg.down('grid');
  164. $dlg.data('confirm')($grid.rowData(rowid));
  165. },
  166. loadComplete: function () {
  167. var $grid = $(this);
  168. var data = $grid.getRowData();
  169. if (data.length <= 0) {
  170. $.yvan.msg('没有符合要求的数据');
  171. //还原
  172. $sender.data().widgetTmpValue = $sender.data().widgetValue;
  173. $sender.textbox('setValue', $sender.data().widgetValue);
  174. //没有数据行
  175. if (option.hasOwnProperty('autoClose') && option.autoClose) {
  176. setTimeout(function () { $dlg.window('close'); }, 0);
  177. }
  178. } else if (data.length === 1) {
  179. //唯一数据行
  180. if (option.hasOwnProperty('autoClose') && option.autoClose) {
  181. $dlg.data('confirm')(data[0]);
  182. }
  183. }
  184. var val = $dlg.parent().item('dlgSearch').val() || '';
  185. filterMethod($.trim(val).toLowerCase());
  186. }
  187. },
  188. widgetWindowOption.grid)
  189. },
  190. onClose: function () {
  191. $sender.textbox('setValue', $sender.data().widgetValue);
  192. $sender.textbox('textbox').focus();
  193. },
  194. toolbar: [{
  195. text: '确认', iconCls: 'fa fa-save', onClick: function () {
  196. //发出确认
  197. var $grid = $dlg.down('grid');
  198. var row = $grid.rowData();
  199. if (row) {
  200. $dlg.data('confirm')(row);
  201. }
  202. }
  203. }, {
  204. text: '取消', iconCls: 'fa fa-times', onClick: function () {
  205. $dlg.window('close');
  206. }
  207. }, {
  208. id: $tId, xtype: 'textbox', name: 'dlgSearch', prompt:option.widgetPrompt,
  209. onRender: function () {
  210. $(this).textbox('textbox').bind('input propertychange', function () {
  211. //取值过滤行
  212. var val = $(this).val() || '';
  213. filterMethod($.trim(val).toLowerCase());
  214. });
  215. }
  216. }, {
  217. text: '搜索', iconCls: 'fa fa-search', onClick: function () {
  218. var t = $('#' + $tId).textbox('getValue');
  219. // $sender.data().widgetValue = t;
  220. // $sender.searchbox('setValue',t);
  221. var $grid = $dlg.down('grid');
  222. $grid.reload({
  223. queryParams: { query: t }
  224. });
  225. }
  226. }]
  227. };
  228. $dlg = $.yvan.showDialog(sender, dlgOpt);
  229. // 关闭当前窗口
  230. // $dlg.dialog({
  231. // onClose:function(){
  232. // alert("123");
  233. // }
  234. // });
  235. $dlg.data({
  236. confirm: function (row) {
  237. var successOpt = option['success'] || option.bind;
  238. if (!successOpt) {
  239. //没有配置,只写自己
  240. if ($sender.name && row.hasOwnProperty($sender.name)) {
  241. $sender.searchbox('setValue', row[$sender.name]);
  242. $sender.data().widgetValue = row[$sender.name];
  243. // $dlg.dialog('close');
  244. $dlg.window('close');
  245. return true;
  246. }
  247. }
  248. if ($.type(successOpt) === "function") {
  249. //是函数,调函数
  250. var ret = successOpt.apply(this, arguments);
  251. $sender.data().widgetValue = $sender.searchbox('getValue');
  252. // $dlg.dialog('close');
  253. $dlg.window('close');
  254. return ret;
  255. }
  256. //字符串或数组,直接调用数组
  257. if ($.type(successOpt) === "string") {
  258. successOpt = [successOpt];
  259. }
  260. var obj = {};
  261. if ($.type(successOpt) === 'array') {
  262. //数组,根据名字逐个写入
  263. $.each(successOpt, function (index, name) {
  264. obj[name] = row[name];
  265. });
  266. } else if ($.type(successOpt) === 'object') {
  267. //对象,根据映射关系写入
  268. var vs = successOpt;
  269. for (var prop in vs) {
  270. if (!vs.hasOwnProperty(prop)) continue;
  271. if (!row.hasOwnProperty(vs[prop])) {
  272. console.error('弹出框没有属性' + vs[prop], row);
  273. continue;
  274. }
  275. obj[prop] = row[vs[prop]];
  276. }
  277. }
  278. var $grid = $sender.up('grid');
  279. if ($grid.length > 0) {
  280. //表格内编辑
  281. $grid.setEditRow(obj);
  282. } else {
  283. //窗体编辑
  284. $sender.findForm().form('load', obj);
  285. }
  286. $sender.data().widgetValue = $sender.searchbox('getValue');
  287. if ($.type(option['afterConfirm']) === 'function') {
  288. option['afterConfirm'](obj);
  289. }
  290. //确认关闭
  291. // $dlg.dialog('close');
  292. $dlg.window('close');
  293. }
  294. });
  295. });
  296. },
  297. clear: function (e) {
  298. var $me = $(e.data.target);
  299. $me.textbox('clear').textbox('textbox').focus();
  300. if (!$me.textbox('options').widget)
  301. return;
  302. var widget = $me.textbox('options').widget;
  303. var clear = widget.clear || widget.bind;
  304. if ($.type(clear) === "function") {
  305. widget.clear();
  306. }
  307. if ($.type(clear) === "string") {
  308. clear = [clear];
  309. }
  310. var obj = {};
  311. var vs = clear;
  312. if ($.type(vs) === 'array') {
  313. //数组清空
  314. $.each(vs, function (index, name) {
  315. obj[name] = '';
  316. });
  317. } else {
  318. //对象,按名字清空
  319. for (var prop in vs) {
  320. if (!vs.hasOwnProperty(prop)) continue;
  321. obj[prop] = '';
  322. }
  323. }
  324. $me.data().widgetValue = $me.searchbox('getValue');
  325. var $grid = $me.up('grid');
  326. if ($grid.length > 0) {
  327. //表格内编辑
  328. $grid.setEditRow(obj);
  329. } else {
  330. //窗体编辑
  331. $me.findForm().form('load', obj);
  332. }
  333. }
  334. };