purchasecontent.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2. var DIALOG_AREA = ['920px', '800px'];
  3. var Controller = {
  4. index: function () {
  5. Table.api.init({
  6. extend: {
  7. index_url: 'purchasecontent/index' + location.search,
  8. add_url: 'purchasecontent/add',
  9. del_url: 'purchasecontent/del',
  10. table: 'purchase_content',
  11. }
  12. });
  13. var table = $('#table');
  14. function syncRecipientDeleteCheckbox() {
  15. var data = table.bootstrapTable('getData') || [];
  16. table.closest('.bootstrap-table').find('tbody tr').each(function () {
  17. var $tr = $(this);
  18. var idx = $tr.data('index');
  19. if (idx === undefined || idx === null) {
  20. return;
  21. }
  22. var row = data[idx];
  23. if (row && parseInt(row.can_delete, 10) === 1) {
  24. return;
  25. }
  26. $tr.find('input[name="btSelectItem"]').remove();
  27. $tr.find('td.bs-checkbox').empty();
  28. $tr.removeClass('selected');
  29. });
  30. }
  31. table.bootstrapTable({
  32. url: $.fn.bootstrapTable.defaults.extend.index_url,
  33. pk: 'id',
  34. sortName: 'id',
  35. sortOrder: 'desc',
  36. commonSearch: true,
  37. rowStyle: function (row) {
  38. if (parseInt(row.is_receiver, 10) === 1 && parseInt(row.is_read, 10) === 1) {
  39. return {classes: 'purchase-content-row-read'};
  40. }
  41. return {};
  42. },
  43. columns: [
  44. [
  45. {checkbox: true},
  46. {field: 'id', title: 'ID', width: 60, operate: false, sortable: true},
  47. {field: 'sender_name', title: '投递人', operate: false, width: 100, align: 'center', sortable: true},
  48. {
  49. field: 'recipient_names',
  50. title: '投递给',
  51. operate: false,
  52. align: 'left',
  53. class: 'autocontent',
  54. sortable: true,
  55. formatter: function (value, row) {
  56. var cnt = parseInt(row.recipient_count, 10) || 0;
  57. var text = value != null && value !== '' ? String(value) : '';
  58. if (cnt > 0 && text !== '') {
  59. return text + ' <span class="text-muted">(' + cnt + '人)</span>';
  60. }
  61. return text;
  62. }
  63. },
  64. {field: 'subject', title: '主题', operate: 'LIKE', align: 'left', sortable: true},
  65. {
  66. field: 'content',
  67. title: '内容',
  68. operate: 'LIKE',
  69. align: 'left',
  70. class: 'autocontent',
  71. sortable: true,
  72. formatter: Table.api.formatter.content
  73. },
  74. {
  75. field: 'createtime',
  76. title: '投递时间',
  77. operate: 'RANGE',
  78. addclass: 'datetimerange',
  79. width: 165,
  80. align: 'center',
  81. sortable: true,
  82. formatter: function (value, row) {
  83. if (row.send_time_text) {
  84. return row.send_time_text;
  85. }
  86. return Table.api.formatter.datetime.call(this, value, row);
  87. }
  88. },
  89. {
  90. field: 'is_read',
  91. title: '状态',
  92. operate: false,
  93. width: 72,
  94. align: 'center',
  95. sortable: true,
  96. formatter: function (value, row) {
  97. // 仅接收人区分已读/未读;纯发件人无阅读状态
  98. if (parseInt(row.is_receiver, 10) !== 1) {
  99. return '<span class="text-muted">—</span>';
  100. }
  101. return parseInt(value, 10) === 1
  102. ? '<span class="text-muted">已读</span>'
  103. : '<span class="text-warning">未读</span>';
  104. }
  105. },
  106. {
  107. field: 'operate',
  108. title: __('Operate'),
  109. width: 120,
  110. align: 'center',
  111. operate: false,
  112. table: table,
  113. events: $.extend({}, Table.api.events.operate, {
  114. 'click .btn-purchasecontent-view': function (e, value, row) {
  115. e.stopPropagation();
  116. e.preventDefault();
  117. var id = row && row.id;
  118. if (!id) {
  119. return;
  120. }
  121. Fast.api.open('purchasecontent/detail/ids/' + id, '查看通知', {
  122. area: DIALOG_AREA,
  123. end: function () {
  124. table.bootstrapTable('refresh');
  125. }
  126. });
  127. }
  128. }),
  129. formatter: Table.api.formatter.operate,
  130. buttons: [
  131. {
  132. name: 'detail',
  133. text: '查看',
  134. title: '查看通知',
  135. classname: 'btn btn-xs btn-info btn-purchasecontent-view',
  136. icon: 'fa fa-eye',
  137. url: 'purchasecontent/detail'
  138. },
  139. {
  140. name: 'del',
  141. text: __('Del'),
  142. title: __('Del'),
  143. classname: 'btn btn-xs btn-danger btn-delone',
  144. icon: 'fa fa-trash',
  145. url: 'purchasecontent/del',
  146. visible: function (row) {
  147. return parseInt(row.can_delete, 10) === 1;
  148. }
  149. }
  150. ]
  151. }
  152. ]
  153. ]
  154. });
  155. Table.api.bindevent(table);
  156. table.on('check-all.bs.table', function () {
  157. var data = table.bootstrapTable('getData') || [];
  158. $.each(data, function (i, row) {
  159. if (parseInt(row.can_delete, 10) !== 1) {
  160. table.bootstrapTable('uncheck', i);
  161. }
  162. });
  163. });
  164. $('#toolbar .btn-add').data('area', DIALOG_AREA);
  165. table.on('post-body.bs.table', function () {
  166. syncRecipientDeleteCheckbox();
  167. });
  168. },
  169. add: function () {
  170. Controller.api.bindevent();
  171. Controller.api.initRecipientPicker();
  172. $(document).off('click.purchaseContentClose', '.btn-purchase-content-close').on('click.purchaseContentClose', '.btn-purchase-content-close', function () {
  173. var index = parent.Layer.getFrameIndex(window.name);
  174. parent.Layer.close(index);
  175. });
  176. },
  177. detail: function () {
  178. },
  179. api: {
  180. bindevent: function () {
  181. Form.api.bindevent($('form[role=form]'));
  182. },
  183. initRecipientPicker: function () {
  184. var $picker = $('#purchase-recipient-picker');
  185. if (!$picker.length) {
  186. return;
  187. }
  188. var $hidden = $('#c-recipient_ids');
  189. var $search = $picker.find('.purchase-recipient-search');
  190. var $checkAll = $picker.find('.purchase-recipient-check-all-input');
  191. var $count = $picker.find('.purchase-recipient-count');
  192. function visibleItems() {
  193. return $picker.find('.purchase-recipient-item:not(.is-hidden)');
  194. }
  195. function visibleCheckboxes() {
  196. return visibleItems().find('.purchase-recipient-cb');
  197. }
  198. function syncHidden() {
  199. var ids = [];
  200. $picker.find('.purchase-recipient-cb:checked').each(function () {
  201. ids.push($(this).val());
  202. });
  203. $hidden.val(ids.join(',')).trigger('change');
  204. $count.text('已选 ' + ids.length + ' 人');
  205. var $vis = visibleCheckboxes();
  206. var visChecked = $vis.filter(':checked').length;
  207. $checkAll.prop('checked', $vis.length > 0 && visChecked === $vis.length);
  208. $checkAll.prop('indeterminate', visChecked > 0 && visChecked < $vis.length);
  209. }
  210. $picker.on('change', '.purchase-recipient-cb', syncHidden);
  211. $checkAll.on('change', function () {
  212. var checked = $(this).prop('checked');
  213. visibleCheckboxes().prop('checked', checked);
  214. syncHidden();
  215. });
  216. $search.on('input', function () {
  217. var kw = $.trim($(this).val()).toLowerCase();
  218. $picker.find('.purchase-recipient-item').each(function () {
  219. var label = String($(this).data('label') || $(this).text() || '').toLowerCase();
  220. $(this).toggleClass('is-hidden', kw !== '' && label.indexOf(kw) < 0);
  221. });
  222. syncHidden();
  223. });
  224. syncHidden();
  225. }
  226. }
  227. };
  228. return Controller;
  229. });