yvanui.yvsearch.widget.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. * yvan.yvsearch.widget.js
  3. * @author luoyifan
  4. * 2019-07-14 22:23:00
  5. */
  6. 'use strict';
  7. (function ($) {
  8. $.extend($.fn.yvsearch.methods, {
  9. open: function (jq, option, event) {
  10. var state = $.data(jq[0], 'yvsearch');
  11. if (state.isOpened === true) {
  12. $.yvan.msg('请不要频繁操作');
  13. return;
  14. }
  15. option = $.extend(state.options, option);
  16. option = option.widget;
  17. state.isOpened = true;
  18. var $grid, $dlg;
  19. var sender = jq[0];
  20. var $sender = $(sender);
  21. var query = $sender.yvsearch('getQuery');
  22. seajs.use([option.url], function (widgetWindowOption) {
  23. /**
  24. * ========== data:为二级弹出初始化查询数据 ============
  25. */
  26. {
  27. var onLoadData = option['onWidgetLoadData'] || option.bind;
  28. var data;
  29. if ($.type(onLoadData) === 'function') {
  30. //自定义 onLoadData
  31. data = onLoadData.call($sender, option);
  32. } else {
  33. var vs = onLoadData;
  34. var $parentGrid = $sender.up('yvgrid');
  35. var row;
  36. if ($grid.length > 0) {
  37. //表格带回值
  38. row = $parentGrid.yvgrid('getEditRow', sender);
  39. }
  40. data = {};
  41. if ($.type(vs) === 'array') {
  42. //数组,直接读取
  43. $.each(vs, function (index, name) {
  44. data[name] = row[name];
  45. });
  46. } else {
  47. //对象调用, 建立映射关系
  48. for (var prop in vs) {
  49. if (!vs.hasOwnProperty(prop)) continue;
  50. if (!row.hasOwnProperty(prop)) {
  51. console.error('yvsearch 没有属性' + prop, row);
  52. continue;
  53. }
  54. data[vs[prop]] = row[prop];
  55. }
  56. }
  57. }
  58. //数据准备好之后
  59. if (widgetWindowOption.hasOwnProperty('onWidgetLoadData')) {
  60. widgetWindowOption.onWidgetLoadData(sender, data);
  61. }
  62. // widget 是方法, 直接调用该方法
  63. // 获取到 xtype:widget 的窗口
  64. if ($.type(widgetWindowOption) === 'function') {
  65. widgetWindowOption = widgetWindowOption($.extend(data, {
  66. sender: $sender,
  67. query: query
  68. }));
  69. }
  70. //如果调用前,onBeforeShow 返回 false,就取消打开窗口
  71. if ($.type(option.onBeforeShow) === 'function') {
  72. if (!option.onBeforeShow.call(this, sender, option, widgetWindowOption)) {
  73. return;
  74. }
  75. }
  76. ;
  77. }
  78. /**
  79. * ========== 构建 dlgOption 展示界面 ============
  80. */
  81. var dlgId = $.yvan.createId('widgetDialog');
  82. state.dlgId = dlgId;
  83. var dlgOpt = {
  84. xtype: 'dialog',
  85. dialogId: dlgId,
  86. title: widgetWindowOption.title || '匿名对话框',
  87. width: widgetWindowOption.width || 900,
  88. height: widgetWindowOption.height || 400,
  89. center: {
  90. items: $.extend(widgetWindowOption.grid, {
  91. xtype: 'yvgrid',
  92. toolbar: {
  93. xtype: 'toolbar',
  94. height: 40,
  95. items: [
  96. {
  97. text: '确认', iconCls: 'fa fa-save', onClick: function () {
  98. //发出确认
  99. var row = $grid.yvgrid('rowData');
  100. if (row) {
  101. $sender.yvsearch('confirm', row);
  102. }
  103. }
  104. }, {
  105. text: '取消', iconCls: 'fa fa-times', onClick: function () {
  106. $dlg.window('close');
  107. }
  108. }, {
  109. xtype: 'textbox',
  110. onRender: function () {
  111. var textbox = $(this).textbox('textbox');
  112. setTimeout(function () {
  113. var state = $.data(sender, 'yvsearch');
  114. state.isWidgetOpen = true;
  115. textbox.focus();
  116. state.isWidgetOpen = false;
  117. }, 50);
  118. }
  119. }
  120. ]
  121. },
  122. onRender: function () {
  123. //默认1秒后 grid 获取焦点
  124. $grid = $(this);
  125. $grid.yvgrid('reload', {
  126. url: url
  127. });
  128. },
  129. onKeyDown: function (e) {
  130. if (e.keyCode === 13) {
  131. //如果按下回车键,就发出确认
  132. var row = $grid.yvgrid('rowData');
  133. if (row) {
  134. $sender.yvsearch('confirm', row);
  135. }
  136. return true;
  137. }
  138. },
  139. onDblClickRow: function (rowid, iRow, iCol, e) {
  140. //双击表格的行,发出确认
  141. var row = $grid.yvgrid('rowData', rowid);
  142. $sender.yvsearch('confirm', row);
  143. },
  144. loadComplete: function () {
  145. if (!$grid) return;
  146. var data = $grid.yvgrid('getData');
  147. if (data.length <= 0) {
  148. $.yvan.msg('没有符合要求的数据');
  149. $dlg.window('close');
  150. } else if (data.length === 1) {
  151. //唯一数据行
  152. $sender.yvsearch('confirm', data[0]);
  153. }
  154. }
  155. })
  156. },
  157. onClose: function () {
  158. $sender.yvsearch('focus');
  159. state.isOpened = false;
  160. }
  161. };
  162. var url = dlgOpt.center.items.url;
  163. delete dlgOpt.center.items.url;
  164. $dlg = $.yvan.showDialog(sender, dlgOpt);
  165. });//use
  166. }
  167. });
  168. })(jQuery);