common.ui.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. $('#teamTable').on('click.team', '.btn-add', function()
  2. {
  3. var $newRow = $(this).closest('tr').clone();
  4. let options = zui.Picker.query("[name^='team']").options;
  5. $newRow.find('.picker-box').remove();
  6. $newRow.find('td').eq(1).append('<div class="picker-box" id="line"></div>');
  7. $newRow.find('input').val('');
  8. $newRow.find('[name^=teamConsumed]').val(0);
  9. $(this).closest('tr').after($newRow);
  10. toggleBtn();
  11. let index = setLineIndex();
  12. let newID = $newRow.find('[id^=line]').attr('id');
  13. let taskMode = $('[name=mode]').val() ? $('[name=mode]').val() : '';
  14. /* Init team's select picker. */
  15. options.defaultValue = '';
  16. options.disabled = false;
  17. if(taskMode == 'multi')
  18. {
  19. let members = [];
  20. let $teams = $('#teamTable').find('.picker-box [name^=team]');
  21. for(i = 0; i < $teams.length; i++)
  22. {
  23. let value = $teams.eq(i).val();
  24. if(members.includes(value))
  25. {
  26. $teams.eq(i).closest('tr').addClass('hidden');
  27. continue;
  28. }
  29. if(value != '') members.push(value);
  30. }
  31. $.each(options.items, function(i, item)
  32. {
  33. if(item.value == '') return;
  34. options.items[i].disabled = members.includes(item.value);
  35. });
  36. }
  37. new zui.Picker(`#${newID}`, options);
  38. })
  39. $('#teamTable').on('click.team', '.btn-delete', function()
  40. {
  41. var $row = $(this).closest('tr');
  42. if(!checkRemove($row.index())) return;
  43. $row.remove();
  44. toggleBtn();
  45. setLineIndex();
  46. disableMembers();
  47. });
  48. $('#teamTable').on('change.team', '.picker-select', function()
  49. {
  50. disableMembers();
  51. });
  52. $('#teamTable').on('click', "[data-type='add']", function()
  53. {
  54. setTimeout(function(){disableMembers()}, 300);
  55. });
  56. /* 切换串行/并行 展示/隐藏工序图标. */
  57. $(function()
  58. {
  59. $('.form').on('change.team', '[name="mode"]', function()
  60. {
  61. if($(this).val() == 'multi')
  62. {
  63. $('#teamTable td .icon-angle-down').addClass('hidden');
  64. }
  65. else
  66. {
  67. $('#teamTable td .icon-angle-down').removeClass('hidden');
  68. }
  69. });
  70. })
  71. /**
  72. * Set line number.
  73. *
  74. * @access public
  75. * @return void
  76. */
  77. function setLineIndex()
  78. {
  79. let index = 1;
  80. $('.team-number').each(function()
  81. {
  82. $(this).text(index);
  83. $(this).closest('tr').find('[id^="line"]').attr('id', 'line' + index);
  84. index ++;
  85. });
  86. }
  87. /**
  88. * Check delete button hide or not.
  89. *
  90. * @access public
  91. * @return void
  92. */
  93. function toggleBtn()
  94. {
  95. var $deleteBtn = $('#teamTable').find('.btn-delete');
  96. if($deleteBtn.length == 1)
  97. {
  98. $deleteBtn.addClass('hidden');
  99. }
  100. else
  101. {
  102. $deleteBtn.removeClass('hidden');
  103. }
  104. };
  105. function onPageUnmount()
  106. {
  107. $('#modalTeam').off('.saveTeam');
  108. }
  109. /**
  110. * Disable user select box.
  111. *
  112. * @access public
  113. * @return void
  114. */
  115. function disableMembers()
  116. {
  117. let mode = $('[name=mode]').val() ? $('[name=mode]').val() : '';
  118. if(mode == 'multi')
  119. {
  120. let members = [];
  121. let $teams = $('#teamTable').find('.picker-box [name^=team]');
  122. for(i = 0; i < $teams.length; i++)
  123. {
  124. let value = $teams.eq(i).val();
  125. if(members.includes(value))
  126. {
  127. $teams.eq(i).closest('tr').addClass('hidden');
  128. continue;
  129. }
  130. if(value != '') members.push(value);
  131. }
  132. $teams.each(function()
  133. {
  134. let $team = $(this);
  135. let account = $team.val();
  136. let $teamPicker = $team.zui('picker');
  137. let teamItems = $teamPicker.options.items;
  138. $.each(teamItems, function(i, item)
  139. {
  140. if(item.value == '') return;
  141. teamItems[i].disabled = members.includes(item.value) && item.value != account;
  142. })
  143. $teamPicker.render({items: teamItems});
  144. });
  145. $('#teamTable').find('tr.hidden').remove();
  146. }
  147. else
  148. {
  149. let $teams = $('#teamTable').find('.picker-box [name^=team]');
  150. $teams.each(function()
  151. {
  152. let $team = $(this);
  153. let $teamPicker = $team.zui('picker');
  154. let teamItems = $teamPicker.options.items;
  155. $.each(teamItems, function(i, item)
  156. {
  157. if(item.value == '') return;
  158. teamItems[i].disabled = false;
  159. })
  160. $teamPicker.render({items: $teamPicker.options.items});
  161. });
  162. }
  163. }
  164. $('#teamTable').on('change.team', '.picker-box [name^=team]', function()
  165. {
  166. disableMembers();
  167. })
  168. /**
  169. * Check if it can be removed.
  170. *
  171. * @param int $removeIndex
  172. * @access public
  173. * @return void
  174. */
  175. function checkRemove(removeIndex)
  176. {
  177. let $teams = $('#teamTable').find('.picker-box [name^=team]');
  178. let totalLeft = 0;
  179. let memberCount = 0;
  180. for(i = 0; i < $teams.length; i++)
  181. {
  182. let $this = $teams.eq(i);
  183. let value = $this.val();
  184. if(value == '') continue;
  185. let $tr = $this.closest('tr');
  186. if($tr.index() == removeIndex) continue;
  187. memberCount++;
  188. let $teamLeft = $tr.find('[name^=teamLeft]');
  189. if($teamLeft.length > 0)
  190. {
  191. left = parseFloat($teamLeft.val());
  192. if(!isNaN(left)) totalLeft += left;
  193. }
  194. }
  195. if(memberCount < 2)
  196. {
  197. zui.Modal.alert(teamMemberError);
  198. return false;
  199. }
  200. if($('#teamTable').find('td > .btn-delete:enabled').length == 1) return false;
  201. return true;
  202. }
  203. window.confirmBug = function(confirmTip, taskID, bugID)
  204. {
  205. zui.Modal.confirm(confirmTip).then((res) => {
  206. if(res)
  207. {
  208. loadPage($.createLink('bug', 'view', `bugID=${bugID}`));
  209. }
  210. else
  211. {
  212. loadPage($.createLink('task', 'view', `taskID=${taskID}`));
  213. }
  214. });
  215. }
  216. function ignoreTip(event)
  217. {
  218. $(event.target).closest('.form-tip').remove();
  219. }