customer.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. function parseCompanyTypeVal(s) {
  3. s = (s || '').trim();
  4. if (!s) {
  5. return [];
  6. }
  7. return s.split(/[、,,]+/).map(function (x) {
  8. return $.trim(x);
  9. }).filter(Boolean);
  10. }
  11. function ensureCompanyTypeOneboxCss() {
  12. if ($('#company-type-onebox-style').length) {
  13. return;
  14. }
  15. $('head').append(
  16. '<style id="company-type-onebox-style">' +
  17. '.company-type-form-group{overflow:visible !important;position:relative;z-index:10;}' +
  18. '.input-group.company-type-onebox{display:flex !important;flex-direction:row;flex-wrap:nowrap;align-items:stretch;width:100%;}' +
  19. '.company-type-onebox .bootstrap-select.btn-group{flex:1 1 auto;min-width:0;}' +
  20. '.company-type-onebox .bootstrap-select > .dropdown-toggle{width:100%;text-align:left;}' +
  21. '.company-type-onebox > .input-group-addon{flex:0 0 auto;display:flex;align-items:center;}' +
  22. '.company-type-onebox .bootstrap-select.open{z-index:1065;}' +
  23. '.company-type-onebox .bootstrap-select .dropdown-menu{margin-top:0 !important;}' +
  24. '</style>'
  25. );
  26. }
  27. var Controller = {
  28. index: function () {
  29. Table.api.init({
  30. extend: {
  31. index_url: 'customer/index' + location.search,
  32. add_url: 'customer/add',
  33. edit_url: 'customer/edit',
  34. del_url: 'customer/del',
  35. multi_url: 'customer/multi',
  36. import_url: 'customer/import',
  37. table: 'customer',
  38. }
  39. });
  40. var table = $("#table");
  41. table.bootstrapTable({
  42. url: $.fn.bootstrapTable.defaults.extend.index_url,
  43. pk: 'id',
  44. sortName: 'id',
  45. columns: [
  46. [
  47. {checkbox: true},
  48. {field: 'id', title: __('序号')},
  49. {field: 'company_name', title: __('客户名称'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  50. {field: 'username', title: __('姓名'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  51. {field: 'email', title: __('邮箱'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  52. {field: 'phone', title: __('手机号'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  53. {field: 'company_type', title: __('业务分类'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
  54. {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  55. ]
  56. ]
  57. });
  58. Table.api.bindevent(table);
  59. },
  60. add: function () {
  61. Controller.api.bindevent();
  62. setTimeout(function () {
  63. Controller.api.initCompanyType();
  64. }, 50);
  65. },
  66. edit: function () {
  67. Controller.api.bindevent();
  68. setTimeout(function () {
  69. Controller.api.initCompanyType();
  70. }, 50);
  71. },
  72. api: {
  73. bindevent: function () {
  74. Form.api.bindevent($("form[role=form]"));
  75. },
  76. initCompanyType: function () {
  77. var $hidden = $('#c-company_type');
  78. var $sel = $('#c-company_type_select');
  79. var $count = $('#c-company_type_count');
  80. if (!$hidden.length || !$sel.length || !$count.length) {
  81. return;
  82. }
  83. ensureCompanyTypeOneboxCss();
  84. var initialParts = parseCompanyTypeVal($hidden.val());
  85. function syncHidden() {
  86. var v = $sel.selectpicker('val');
  87. if (!$.isArray(v)) {
  88. v = v ? [v] : [];
  89. }
  90. v = v.filter(function (x) {
  91. return x != null && String(x).trim() !== '';
  92. });
  93. $hidden.val(v.join('、'));
  94. }
  95. function updateCount() {
  96. var v = $sel.selectpicker('val');
  97. var n = 0;
  98. if ($.isArray(v)) {
  99. n = v.filter(function (x) {
  100. return x != null && String(x).trim() !== '';
  101. }).length;
  102. } else if (v) {
  103. n = 1;
  104. }
  105. $count.text('已选 ' + n);
  106. }
  107. require(['bootstrap-select', 'bootstrap-select-lang'], function () {
  108. try {
  109. if ($sel.data('selectpicker')) {
  110. $sel.selectpicker('destroy');
  111. }
  112. } catch (e) {
  113. // ignore
  114. }
  115. $.each(initialParts, function (i, p) {
  116. if (!p) {
  117. return;
  118. }
  119. if (!$sel.find('option').filter(function () {
  120. return $(this).val() === p;
  121. }).length) {
  122. $sel.append($('<option>').attr('value', p).text(p));
  123. }
  124. });
  125. $sel.selectpicker({
  126. liveSearch: true,
  127. selectedTextFormat: 'static',
  128. noneSelectedText: '请选择',
  129. width: '100%'
  130. });
  131. var toVal = [];
  132. $.each(initialParts, function (i, p) {
  133. if (!p) {
  134. return;
  135. }
  136. if ($sel.find('option').filter(function () {
  137. return $(this).val() === p;
  138. }).length) {
  139. toVal.push(p);
  140. }
  141. });
  142. $sel.selectpicker('val', toVal);
  143. syncHidden();
  144. updateCount();
  145. $sel.off('changed.bs.select.companyct').on('changed.bs.select.companyct', function () {
  146. syncHidden();
  147. updateCount();
  148. });
  149. $sel.off('shown.bs.select.companyct').on('shown.bs.select.companyct', function () {
  150. var sp = $sel.data('selectpicker');
  151. if (!sp || !sp.$searchbox || !sp.$searchbox.length) {
  152. return;
  153. }
  154. sp.$searchbox.off('keydown.companyct').on('keydown.companyct', function (e) {
  155. if (e.which !== 13) {
  156. return;
  157. }
  158. var $box = $(this);
  159. var q = $.trim($box.val());
  160. if (!q) {
  161. return;
  162. }
  163. var hasOption = $sel.find('option').filter(function () {
  164. return $(this).val() === q;
  165. }).length > 0;
  166. var noResultsVisible = sp.$menu && sp.$menu.find('li.no-results').is(':visible');
  167. if (hasOption) {
  168. e.preventDefault();
  169. var cur = $sel.selectpicker('val');
  170. if (!$.isArray(cur)) {
  171. cur = cur ? [cur] : [];
  172. }
  173. if ($.inArray(q, cur) === -1) {
  174. cur.push(q);
  175. $sel.selectpicker('val', cur);
  176. syncHidden();
  177. updateCount();
  178. }
  179. $box.val('').trigger('input');
  180. return;
  181. }
  182. if (noResultsVisible) {
  183. e.preventDefault();
  184. $sel.append($('<option>').val(q).text(q));
  185. $sel.selectpicker('refresh');
  186. var cur2 = $sel.selectpicker('val') || [];
  187. if (!$.isArray(cur2)) {
  188. cur2 = cur2 ? [cur2] : [];
  189. }
  190. if ($.inArray(q, cur2) === -1) {
  191. cur2.push(q);
  192. }
  193. $sel.selectpicker('val', cur2);
  194. syncHidden();
  195. updateCount();
  196. $box.val('').trigger('input');
  197. }
  198. });
  199. });
  200. $('form[role=form]').off('submit.companyct').on('submit.companyct', function () {
  201. syncHidden();
  202. });
  203. });
  204. }
  205. }
  206. };
  207. return Controller;
  208. });