yvanui.dialog.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /**
  2. * power
  3. * @author luoyifan
  4. * 2018-11-30 22:45:00
  5. */
  6. (function ($) {
  7. "use strict";
  8. $.extend($.yvan, {
  9. showDialog: function ($sender, param) {
  10. //克隆参数
  11. if ($.type(param) === 'string') {
  12. param = {dialogId: param};
  13. }
  14. if (!param.hasOwnProperty('dialogId')) {
  15. console.error('请指定 showDialog.dialogId');
  16. return;
  17. }
  18. $sender = $($sender);
  19. //对话框渲染位置
  20. var $target = $sender.closest('.bizWindow');
  21. //沿路线上找对话框的定义
  22. var $power = $sender;
  23. var dialogOptions;
  24. while (true) {
  25. $power = $power.up('power');
  26. if ($power.length <= 0) {
  27. break;
  28. }
  29. if (!$power.data('power').hasOwnProperty('options')) {
  30. $power = $power.parent();
  31. continue;
  32. }
  33. var options = $power.data('power').options;
  34. if (options.hasOwnProperty('dialogs') && options.dialogs.hasOwnProperty(param.dialogId)) {
  35. dialogOptions = options.dialogs[param.dialogId];
  36. break;
  37. } else {
  38. $power = $power.parent();
  39. continue;
  40. }
  41. }
  42. //填充缺省参数,并复制 dialogOptions
  43. dialogOptions = $.extend(true, {}, $.fn.power.dialogs.defaults, dialogOptions, param);
  44. //解决底部按钮,需要 onBeforeRender 进行按需加载的问题
  45. if ($.type(dialogOptions.buttons) === 'array') {
  46. for (var i = dialogOptions.buttons.length - 1; i >= 0; i--) {
  47. var b = dialogOptions.buttons[i];
  48. if ($.type(b.onBeforeRender) === 'function') {
  49. if (b.onBeforeRender.call(dialogOptions) === false) {
  50. dialogOptions.buttons.splice(i, 1);
  51. }
  52. }
  53. }
  54. }
  55. //dialog 内容是函数,则调用函数,并获取结果
  56. if ($.type(dialogOptions) === 'function') {
  57. dialogOptions = dialogOptions.call(this, param);
  58. }
  59. //对话框定义中没有 center 的定义
  60. if (!dialogOptions.hasOwnProperty('center')) {
  61. console.error('dialog ' + param.dialogId + ' not exists!');
  62. return;
  63. }
  64. if (dialogOptions.hasOwnProperty('$target')) {
  65. $target = dialogOptions.$target;
  66. }
  67. //记录旧的 focus 控件
  68. var oldFocus = document.activeElement;
  69. //target 下面构建一个 window , window 下构建一个 power
  70. var $window = $('<div></div>');
  71. $.yvan.fillCommonProperties($window, dialogOptions);
  72. $window.attr('xtype', 'dialog');
  73. $window.attr('id', param.dialogId);
  74. var $power = $('<div></div>');
  75. $window.append($power);
  76. $target.append($window);
  77. $power.progress();
  78. $window.power('processToolbar', {
  79. $target: $window,
  80. item: dialogOptions,
  81. context: param
  82. });
  83. $window.power('processFooter', {
  84. $target: $window,
  85. item: dialogOptions,
  86. context: param
  87. });
  88. $window.dialog($.extend({}, dialogOptions, {
  89. onOpen: function () {
  90. //计算窗口位置
  91. var $w = $(this).parent();
  92. var iframeWidth = $w.parent().width();
  93. var iframeHeight = $w.parent().height();
  94. var windowWidth = $w.width();
  95. var windowHeight = $w.height();
  96. var setWidth = (iframeWidth - windowWidth) / 2;
  97. var setHeight = (iframeHeight - windowHeight) / 2;
  98. if (iframeHeight < windowHeight || setHeight < 0) {
  99. setHeight = 0;
  100. }
  101. if (iframeWidth < windowWidth || setWidth < 0) {
  102. setWidth = 0;
  103. }
  104. $w.css({left: setWidth, top: setHeight});
  105. //注册快捷键,存放焦点
  106. if (window.hasOwnProperty('shortcut')) {
  107. shortcut.createContainer($power, dialogOptions);
  108. shortcut.registe($power, 'esc', function () {
  109. $window.window('close');
  110. });
  111. }
  112. //不能随意改变focus,searchbox 的 widgetTmpValue 会被无理由触发
  113. //setTimeout(function () {
  114. // $power[0].focus();
  115. //}, 10);
  116. $power.power($.yvan.props(dialogOptions, ['north', 'center', 'west', 'east', 'south']), dialogOptions);
  117. if (dialogOptions.onOpen) {
  118. return dialogOptions.onOpen.apply(this, arguments);
  119. }
  120. $power.progress('close');
  121. },
  122. onClose: function () {
  123. if (dialogOptions.onClose) {
  124. var ss = dialogOptions.onClose.apply(this, arguments);
  125. //删除元素,否则有多个
  126. $("#" + param.dialogId).remove();
  127. return ss;
  128. }
  129. $power.remove();
  130. $window.window('destroy');
  131. //还原旧焦点
  132. if (oldFocus) {
  133. setTimeout(function () {
  134. oldFocus.focus();
  135. }, 10);
  136. }
  137. $("#" + param.dialogId).remove();
  138. },
  139. onMove: function (left, top) {
  140. //防止越界
  141. var $w = $(this);
  142. if (left < 0) {
  143. $w.window("move", {left: 0});
  144. }
  145. if (top < 0) {
  146. $w.window("move", {top: 0});
  147. }
  148. if (dialogOptions.onMove) {
  149. return dialogOptions.onMove.apply(this, arguments);
  150. }
  151. }
  152. }));
  153. //实时拖动
  154. $window.window('window').draggable({
  155. onStartDrag: function () {
  156. },
  157. onDrag: function (e) {
  158. $window.window('move', {
  159. left: e.data.left,
  160. top: e.data.top
  161. });
  162. },
  163. onStopDrag: function (e) {
  164. $window.window('move', {
  165. left: e.data.left,
  166. top: e.data.top
  167. });
  168. }
  169. });
  170. return $window;
  171. }
  172. });
  173. })(jQuery);