require-form.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. //调用Ajax请求方法
  161. Fast.api.ajax({
  162. type: type,
  163. url: url,
  164. data: form.serialize(),
  165. dataType: 'json'
  166. }, function (data, ret) {
  167. $('.form-group', form).removeClass('has-feedback has-success has-error');
  168. if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
  169. $("input[name='__token__']", form).val(data.token);
  170. }
  171. if (typeof success === 'function') {
  172. if (!success.call(form, data, ret)) {
  173. return false;
  174. }
  175. }
  176. }, function (data, ret) {
  177. if (data && typeof data === 'object' && typeof data.token !== 'undefined') {
  178. $("input[name='__token__']", form).val(data.token);
  179. }
  180. if (typeof error === 'function') {
  181. if (!error.call(form, data, ret)) {
  182. return false;
  183. }
  184. }
  185. });
  186. return false;
  187. },
  188. bindevent: function (form, success, error, submit) {
  189. form = typeof form === 'object' ? form : $(form);
  190. var events = Form.events;
  191. events.bindevent(form);
  192. events.validator(form, success, error, submit);
  193. events.selectpicker(form);
  194. events.selectpage(form);
  195. events.cxselect(form);
  196. events.citypicker(form);
  197. events.datetimepicker(form);
  198. events.plupload(form);
  199. events.faselect(form);
  200. },
  201. custom: {}
  202. },
  203. };
  204. return Form;
  205. });