require-form.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, Upload, Validator) {
  2. var Form = {
  3. config: {
  4. },
  5. events: {
  6. validator: function (form, success, error, submit) {
  7. //绑定表单事件
  8. form.validator($.extend({
  9. validClass: 'has-success',
  10. invalidClass: 'has-error',
  11. bindClassTo: '.form-group',
  12. formClass: 'n-default n-bootstrap',
  13. msgClass: 'n-right',
  14. stopOnError: true,
  15. display: function (elem) {
  16. return $(elem).closest('.form-group').find(".control-label").text().replace(/\:/, '');
  17. },
  18. target: function (input) {
  19. var $formitem = $(input).closest('.form-group'),
  20. $msgbox = $formitem.find('span.msg-box');
  21. if (!$msgbox.length) {
  22. return [];
  23. }
  24. return $msgbox;
  25. },
  26. valid: function (ret) {
  27. //验证通过提交表单
  28. Form.api.submit($(ret), function (data, ret) {
  29. if (typeof success === 'function') {
  30. if (!success.call($(this), data, ret)) {
  31. return false;
  32. }
  33. }
  34. //提示及关闭当前窗口
  35. var msg = ret.hasOwnProperty("msg") && ret.msg !== "" ? ret.msg : __('Operation completed');
  36. parent.Toastr.success(msg);
  37. parent.$(".btn-refresh").trigger("click");
  38. var index = parent.Layer.getFrameIndex(window.name);
  39. parent.Layer.close(index);
  40. }, error, submit);
  41. return false;
  42. }
  43. }, form.data("validator-options") || {}));
  44. //移除提交按钮的disabled类
  45. $(".layer-footer .btn.disabled", form).removeClass("disabled");
  46. },
  47. selectpicker: function (form) {
  48. //绑定select元素事件
  49. if ($(".selectpicker", form).size() > 0) {
  50. require(['bootstrap-select', 'bootstrap-select-lang'], function () {
  51. $('.selectpicker', form).selectpicker();
  52. });
  53. }
  54. },
  55. selectpage: function (form) {
  56. //绑定selectpage元素事件
  57. if ($(".selectpage", form).size() > 0) {
  58. require(['selectpage'], function () {
  59. $('.selectpage', form).selectPage({
  60. source: 'ajax/selectpage',
  61. });
  62. });
  63. //给隐藏的元素添加上validate验证触发事件
  64. $(form).on("change", ".selectpage-input-hidden", function () {
  65. $(this).trigger("validate");
  66. });
  67. }
  68. },
  69. cxselect: function (form) {
  70. //绑定cxselect元素事件
  71. if ($("[data-toggle='cxselect']", form).size() > 0) {
  72. require(['cxselect'], function () {
  73. $.cxSelect.defaults.jsonName = 'name';
  74. $.cxSelect.defaults.jsonValue = 'value';
  75. $.cxSelect.defaults.jsonSpace = 'data';
  76. $("[data-toggle='cxselect']", form).cxSelect();
  77. });
  78. }
  79. },
  80. citypicker: function (form) {
  81. //绑定城市远程插件
  82. if ($("[data-toggle='city-picker']", form).size() > 0) {
  83. require(['citypicker'], function () {});
  84. }
  85. },
  86. datetimepicker: function (form) {
  87. //绑定日期时间元素事件
  88. if ($(".datetimepicker", form).size() > 0) {
  89. require(['bootstrap-datetimepicker'], function () {
  90. var options = {
  91. format: 'YYYY-MM-DD HH:mm:ss',
  92. icons: {
  93. time: 'fa fa-clock-o',
  94. date: 'fa fa-calendar',
  95. up: 'fa fa-chevron-up',
  96. down: 'fa fa-chevron-down',
  97. previous: 'fa fa-chevron-left',
  98. next: 'fa fa-chevron-right',
  99. today: 'fa fa-history',
  100. clear: 'fa fa-trash',
  101. close: 'fa fa-remove'
  102. },
  103. showTodayButton: true,
  104. showClose: true
  105. };
  106. $('.datetimepicker', form).parent().css('position', 'relative');
  107. $('.datetimepicker', form).datetimepicker(options);
  108. });
  109. }
  110. },
  111. plupload: function (form) {
  112. //绑定plupload上传元素事件
  113. if ($(".plupload", form).size() > 0) {
  114. Upload.api.plupload();
  115. }
  116. },
  117. faselect: function (form) {
  118. //绑定fachoose选择附件事件
  119. if ($(".fachoose", form).size() > 0) {
  120. $(document).on('click', ".fachoose", function () {
  121. var that = this;
  122. var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;
  123. var mimetype = $(this).data("mimetype") ? $(this).data("mimetype") : '';
  124. parent.Fast.api.open("general/attachment/select?element_id=" + $(this).attr("id") + "&multiple=" + multiple + "&mimetype=" + mimetype, __('Choose'), {
  125. callback: function (data) {
  126. var input_id = $("#" + $(that).attr("id")).data("input-id");
  127. if (data.multiple) {
  128. var urlArr = [];
  129. var inputObj = $("#" + input_id);
  130. if (inputObj.val() !== "") {
  131. urlArr.push(inputObj.val());
  132. }
  133. urlArr.push(data.url);
  134. inputObj.val(urlArr.join(",")).trigger("change");
  135. } else {
  136. $("#" + input_id).val(data.url).trigger("change");
  137. }
  138. }
  139. });
  140. return false;
  141. });
  142. }
  143. },
  144. bindevent: function (form) {
  145. }
  146. },
  147. api: {
  148. submit: function (form, success, error, submit) {
  149. if (form.size() === 0)
  150. return Toastr.error("表单未初始化完成,无法提交");
  151. if (typeof submit === 'function') {
  152. if (!submit.call(form)) {
  153. return false;
  154. }
  155. }
  156. var type = form.attr("method").toUpperCase();
  157. type = type && (type === 'GET' || type === 'POST') ? type : 'GET';
  158. url = form.attr("action");
  159. url = url ? url : location.href;
  160. //修复当存在多选项元素时提交的BUG
  161. var params = {};
  162. var multipleList = $("[name$='[]']");
  163. if (multipleList.size() > 0) {
  164. var postFields = form.serializeArray().map(function (obj) {
  165. return $(obj).prop("name");
  166. });
  167. $.each(multipleList, function (i, j) {
  168. if (postFields.indexOf($(this).prop("name")) < 0) {
  169. params[$(this).prop("name")] = '';
  170. }
  171. });
  172. }
  173. //调用Ajax请求方法
  174. Fast.api.ajax({
  175. type: type,
  176. url: url,
  177. data: form.serialize() + (params ? '&' + $.param(params) : ''),
  178. dataType: 'json',
  179. complete: function (xhr) {
  180. var token = xhr.getResponseHeader('__token__');
  181. if (token) {
  182. $("input[name='__token__']", form).val(token);
  183. }
  184. }
  185. }, function (data, ret) {
  186. $('.form-group', form).removeClass('has-feedback has-success has-error');
  187. if (data && typeof data === 'object') {
  188. //刷新客户端token
  189. if (typeof data.token !== 'undefined') {
  190. $("input[name='__token__']", form).val(data.token);
  191. }
  192. //调用客户端事件
  193. if (typeof data.callback !== 'undefined' && typeof data.callback === 'function') {
  194. data.callback.call(form, data);
  195. }
  196. }
  197. if (typeof success === 'function') {
  198. if (!success.call(form, data, ret)) {
  199. return false;
  200. }
  201. }
  202. }, function (data, ret) {
  203. if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
  204. $("input[name='__token__']", form).val(data.token);
  205. }
  206. if (typeof error === 'function') {
  207. if (!error.call(form, data, ret)) {
  208. return false;
  209. }
  210. }
  211. });
  212. return false;
  213. },
  214. bindevent: function (form, success, error, submit) {
  215. form = typeof form === 'object' ? form : $(form);
  216. var events = Form.events;
  217. events.bindevent(form);
  218. events.validator(form, success, error, submit);
  219. events.selectpicker(form);
  220. events.selectpage(form);
  221. events.cxselect(form);
  222. events.citypicker(form);
  223. events.datetimepicker(form);
  224. events.plupload(form);
  225. events.faselect(form);
  226. },
  227. custom: {}
  228. },
  229. };
  230. return Form;
  231. });