category.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date 2018/9/26
  7. * @version
  8. */
  9. let editCate;
  10. // 初始化分类数据
  11. function InitCategoryData(category) {
  12. const data = category instanceof Array ? category : [category];
  13. for (const d of data) {
  14. d.typeStr = cType.text[d.type];
  15. }
  16. }
  17. // 获取自定义分类可选类型Html(下拉、单选)
  18. function getTypeHtml() {
  19. const html = [];
  20. for (const k in cType.key) {
  21. const value = cType.key[k];
  22. html.push('<div class="form-check form-check-inline">');
  23. html.push('<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio' + value + '" value="' + value + '">');
  24. html.push('<label class="form-check-label" for="inlineRadio' + value + '">', cType.text[value], '</label>');
  25. html.push('</div>');
  26. }
  27. return html.join('');
  28. }
  29. // 获取自定义分类html
  30. function getCategoryHtml(category) {
  31. const data = category instanceof Array ? category : [category];
  32. const html = [];
  33. for (const d of data) {
  34. html.push('<tr ', d.value && d.value.length > 0 ? '' : 'class="table-warning"', 'cid="' + d.id + '">');
  35. html.push('<td>', d.name, '</td>');
  36. // html.push('<td>', d.typeStr, '</td>');
  37. html.push('<td>');
  38. if (d.value && d.value.length > 0) {
  39. for (const v of d.value) {
  40. html.push('<span class="badge badge-secondary">', v.value, '</span>\n');
  41. }
  42. } else {
  43. html.push('请在右侧添加值');
  44. }
  45. html.push('</td>');
  46. html.push('<td>');
  47. html.push('<a href="javascript: void(0);" name="add" class="btn btn-sm btn-outline-primary"', 'cid="' + d.id, '">添加值</a>\n');
  48. html.push('<a href="javascript: void(0);" name="edit-cate" class="btn btn-sm btn-outline-primary"', 'cid="' + d.id + '">编辑</a>\n');
  49. html.push('<a href="javascript: void(0);" name="del" class="btn btn-sm btn-outline-danger"', 'cid="' + d.id + '">删除</a> ');
  50. html.push('</td>');
  51. html.push('<tr>');
  52. }
  53. return html.join('');
  54. }
  55. // 获取分类值html
  56. function getValueHtml(value, index = null) {
  57. const html = [];
  58. let i = index ? index : 1;
  59. for (const v of value) {
  60. html.push('<tr name="value" vid="' + v.id + '">');
  61. html.push('<td width="35" class="text-center">'+ i +'</td>');
  62. html.push('<td><input class="form-control form-control-sm" name="value" placeholder="请输入值" value="' + v.value + '" vid ="' + v.id + '"></td>');
  63. html.push('<td><a href="javascript:void(0);" class="up-btn mr-2" title="上移"><i class="fa fa-caret-up"></i></a><a href="javascript:void(0);" class="down-btn" title="下移"><i class="fa fa-caret-down "></i></a></td>');
  64. html.push('<td>', v.relaTenders.length + v.newTenders.length ,'</td>');
  65. html.push('<td><a href="javascript: void(0);" class="text-danger" name="del-value" vid="' + v.id + '">删除</a></td>');
  66. html.push('</tr>');
  67. i++;
  68. }
  69. return html.join('');
  70. }
  71. function makeIconColor() {
  72. $('#value-list a').removeClass('text-secondary');
  73. $('#value-list').children('tr').eq(0).find('.up-btn').addClass('text-secondary');
  74. $('#value-list').children('tr').eq(-2).find('.down-btn').addClass('text-secondary');
  75. }
  76. // 根据分类id查找分类
  77. function findCategory(cid) {
  78. for (const c of cData) {
  79. if (c.id === cid) {
  80. return c;
  81. }
  82. }
  83. }
  84. // 删除值 获取其他可用值的html
  85. function getValidValueHtml(vid) {
  86. const html = [];
  87. const values = $('tr:not(.table-danger)[name=value]', '#value-list');
  88. for (const value of values) {
  89. const v = $(value);
  90. if (v.attr('vid') === vid || $('input', v).val() === '') { continue }
  91. html.push('<div class="form-check form-check-inline">');
  92. html.push('<input class="form-check-input" type="radio" name="inlineRadioOptions" id="inlineRadio' + v.attr('vid') + '" value="' + v.attr('vid') +'">');
  93. html.push('<label class="form-check-label" for="inlineRadio' + v.attr('vid') + '">' + $('input', v).val() + '</label>');
  94. html.push('</div>');
  95. }
  96. return html.join('');
  97. }
  98. // 初始化 添加值 编辑数据
  99. function getEditCate(category) {
  100. function findTenderCate(tender, value) {
  101. for (const c of tender.category) {
  102. if (c.cid == value.cid) {
  103. return c;
  104. }
  105. }
  106. }
  107. editCate = JSON.parse(JSON.stringify(category));
  108. for (const v of editCate.value) {
  109. v.relaTenders = tenders.filter(function (t) {
  110. const cate = findTenderCate(t, v);
  111. return cate ? cate.value == v.id : false;
  112. });
  113. v.newTenders = [];
  114. }
  115. }
  116. // 绑定编辑值、删除值
  117. function bindCategoryValueControl() {
  118. $('body').on('click', 'a[name="del-value"]', function () {
  119. const vid = $(this).attr('vid');
  120. const value = _.find(editCate.value, function (v) {
  121. return v.id == vid;
  122. });
  123. const delHtml = $(this).parents('td').html();
  124. const _self = $(this).parents('td');
  125. $(this).remove();
  126. if (value.delete) { return; }
  127. if (value.relaTenders.length > 0) {
  128. // 提示用户转移标段
  129. _self.html(delHtml);
  130. $('#tender-count').text(value.relaTenders.length).attr('vid', vid);
  131. $('#tender-target').html(getValidValueHtml(vid));
  132. $('input[type=radio]', '#tender-target')[0].checked = true;
  133. $('#del-cate-value-ok').click(function () {
  134. const delVid = $('#tender-count').attr('vid');
  135. const tarVid = $('input:checked', '#tender-target').val();
  136. const delValue = _.find(editCate.value, function (v) {
  137. return v.id == delVid;
  138. });
  139. const tarValue = _.find(editCate.value, function (v) {
  140. return v.id == tarVid;
  141. });
  142. tarValue.newTenders = tarValue.newTenders.concat(delValue.relaTenders, delValue.newTenders);
  143. delValue.relaTenders = [];
  144. delValue.newTenders = [];
  145. delValue.delete = true;
  146. const delTr = $('tr[vid=' + delVid + ']');
  147. delTr.addClass('table-danger');
  148. $('input', delTr).attr('disabled', '');
  149. delTr.children()[2].innerText = '移动到其他项';
  150. $('tr[vid=' + tarVid + ']').children()[2].innerText = tarValue.relaTenders.length + tarValue.newTenders.length;
  151. $('#del-cate-value').modal('hide');
  152. });
  153. $('#del-cate-value').modal('show');
  154. } else {
  155. value.delete = true;
  156. const tr = $('tr[vid=' + vid + ']');
  157. tr.addClass('table-danger');
  158. $('input', tr).attr('disabled', '');
  159. }
  160. });
  161. }
  162. // 绑定分类控制等(添加值、编辑、删除)
  163. function bindCategoryControl() {
  164. // 弹出添加值
  165. $('body').on('click', 'a[name=add]', function () {
  166. const id = parseInt($(this).attr('cid'));
  167. const category = findCategory(id);
  168. getEditCate(category);
  169. $('#add-ok').attr('cid', id);
  170. if (editCate) {
  171. const list = $('#value-list');
  172. list.html(getValueHtml(editCate.value) + '<tr id="add-value-row"><td colspan="4"><a href="javascript: void(0);">添加新值</a></td></tr>');
  173. $('#add-value-row').click(function () {
  174. const newID = editCate.value.length > 0 ? _.maxBy(editCate.value, function (v) { return v.id; }).id + 1 : 1;
  175. const newValue = {
  176. isNew: true,
  177. id: newID,
  178. value: '',
  179. relaTenders: [],
  180. newTenders: editCate.value.length > 0 ? [] : tenders.concat([]),
  181. };
  182. editCate.value.push(newValue);
  183. $(this).before(getValueHtml([newValue], $('#value-list tr').length));
  184. bindCategoryValueControl();
  185. makeIconColor();
  186. });
  187. bindCategoryValueControl();
  188. makeIconColor();
  189. $('#add').modal('show');
  190. }
  191. });
  192. // 弹出 编辑
  193. $('body').on('click', 'a[name=edit-cate]', function () {
  194. const id = parseInt($(this).attr('cid'));
  195. const category = findCategory(id);
  196. $('input[name=name]', '#edit-cate').val(category.name);
  197. // $('div[name=type]', '#edit-cate').html(getTypeHtml());
  198. // $('#inlineRadio' + category.type, '#edit-cate')[0].checked = true;
  199. $('#edit-cate-ok').attr('cid', $(this).attr('cid'));
  200. $('#edit-cate').modal('show');
  201. });
  202. // 弹出 删除类别
  203. $('body').on('click', 'a[name=del]', function () {
  204. $('#del-cate-ok').attr('cid', $(this).attr('cid'));
  205. $('#del-cate').modal('show');
  206. });
  207. }
  208. $(document).ready(() => {
  209. // InitCategoryData(cData);
  210. $('#categoryList').html(getCategoryHtml(cData));
  211. bindCategoryControl();
  212. // $('div[name=type]', '#add-cate').html(getTypeHtml());
  213. // 新增分类
  214. $('#add-cate-ok').click(function () {
  215. const name = $('input[name=name]', '#add-cate');
  216. // const type = $('input[type=radio]:checked', '#add-cate');
  217. const data = {
  218. name: trimInvalidChar(name.val()),
  219. // type: parseInt(type.val()),
  220. };
  221. postData('/setting/category/add', data, function (data) {
  222. // InitCategoryData(data);
  223. $('#categoryList').append(getCategoryHtml(data));
  224. bindCategoryControl();
  225. cData.push(data);
  226. $('#add-cate').modal('hide');
  227. name.val('');
  228. // type[0].checked = false;
  229. }, function (msg) {
  230. $('#add-cate').modal('hide');
  231. });
  232. });
  233. // 添加值
  234. $('#add-ok').click(function () {
  235. const valueArr = [];
  236. const value = $('input[name=value]');
  237. for (const v of value) {
  238. if (v.value !== '') {
  239. const cateValue = _.find(editCate.value, function (ec) {
  240. return $(v).attr('vid') == ec.id;
  241. });
  242. let newValue = {};
  243. if (cateValue.delete) {
  244. newValue = { id: cateValue.id, delete: true, };
  245. } else if (cateValue.isNew) {
  246. newValue = { value: $(v).val(), new: true, };
  247. } else {
  248. newValue = { id: cateValue.id, value: $(v).val()};
  249. }
  250. if (!cateValue.delete && cateValue.newTenders.length > 0) {
  251. newValue.newTenders = _.map(cateValue.newTenders, 'id');
  252. }
  253. valueArr.push(newValue);
  254. }
  255. }
  256. const data = {
  257. id: parseInt($(this).attr('cid')),
  258. updateValue: valueArr,
  259. };
  260. postData('/setting/category/value', data, function (data) {
  261. tenders = data.tenders;
  262. const category = findCategory(data.category.id);
  263. category.value = data.category.value;
  264. // InitCategoryData(category);
  265. $('tr[cid=' + data.category.id + ']')[0].outerHTML = getCategoryHtml(category);
  266. bindCategoryControl();
  267. $('#add').modal('hide');
  268. }, function () {
  269. $('#add').modal('hide');
  270. });
  271. });
  272. // 编辑
  273. $('#edit-cate-ok').click(function () {
  274. const name = $('input[name=name]', '#edit-cate');
  275. // const type = $('input[type=radio]:checked', '#edit-cate');
  276. const data = {
  277. id: parseInt($(this).attr('cid')),
  278. name: trimInvalidChar(name.val()),
  279. // type: parseInt(type.val()),
  280. }
  281. postData('/setting/category/update', data, function (data) {
  282. const category = findCategory(data.id);
  283. for (const c in data) {
  284. category[c] = data[c];
  285. }
  286. // InitCategoryData(category);
  287. $('tr[cid=' + data.id + ']')[0].outerHTML = getCategoryHtml(category);
  288. bindCategoryControl();
  289. $('#edit-cate').modal('hide');
  290. }, function () {
  291. $('#edit-cate').modal('hide');
  292. });
  293. });
  294. // 删除类别
  295. $('#del-cate-ok').click(function () {
  296. const data = {
  297. id: parseInt($(this).attr('cid')),
  298. }
  299. postData('/setting/category/del', data, function () {
  300. $('tr[cid=' + data.id + ']').remove();
  301. $('#del-cate').modal('hide');
  302. }, function () {
  303. $('#del-cate').modal('hide');
  304. });
  305. });
  306. // 上移值
  307. $('body').on('click', '.up-btn', function () {
  308. const prev = $(this).parents("tr").prev();
  309. const prevIndex = parseInt($(prev).index('#value-list tr'));
  310. prev.children('td').eq(0).text(prevIndex + 2);
  311. $(this).parents("tr").insertBefore(prev);
  312. $(this).parents("tr").children('td').eq(0).text(prevIndex + 1);
  313. makeIconColor();
  314. // if(prevIndex === 1){
  315. // console.log('hello');
  316. // }
  317. });
  318. // 下一值
  319. $('body').on('click', '.down-btn', function () {
  320. const next = $(this).parents("tr").next();
  321. const nextIndex = parseInt($(next).index('#value-list tr'));
  322. const nowlength = $('#value-list tr').length - 1;
  323. if (nextIndex < nowlength) {
  324. $(this).parents("tr").insertAfter(next);
  325. next.children('td').eq(0).text(nextIndex);
  326. $(this).parents("tr").children('td').eq(0).text(nextIndex + 1);
  327. }
  328. makeIconColor();
  329. });
  330. });