edittask.ui.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. let showConfirmExecution = true;
  2. /**
  3. * Load team members of the execution.
  4. *
  5. * @param int $executionID
  6. * @access public
  7. * @return void
  8. */
  9. function loadExecutionMembers(executionID)
  10. {
  11. const link = $.createLink('execution', 'ajaxGetMembers', 'executionID=' + executionID);
  12. $.getJSON(link, function(assignedToItems)
  13. {
  14. let $assignedToPicker = $('[name=assignedTo]').zui('picker');
  15. $assignedToPicker.render({items: assignedToItems});
  16. $assignedToPicker.$.setValue(oldAssignedTo);
  17. });
  18. }
  19. window.loadAllModule = function()
  20. {
  21. const executionID = $('[name=execution]').val();
  22. const oldModuleID = $('[name=module]').val();
  23. const extra = $('#showAllModule').is(':checked') ? 'allModule' : '';
  24. const link = $.createLink('tree', 'ajaxGetOptionMenu', 'rootID=' + executionID + '&viewtype=task&branch=0&rootModuleID=0&returnType=items&fieldID=&extra=' + extra);
  25. $.getJSON(link, function(moduleItems)
  26. {
  27. let $modulePicker = $('[name=module]').zui('picker');
  28. $modulePicker.render({items: moduleItems});
  29. $modulePicker.$.setValue(oldModuleID);
  30. });
  31. }
  32. /**
  33. * Change mode event.
  34. *
  35. * @param string $mode
  36. * @access public
  37. * @return void
  38. */
  39. window.changeMode = function()
  40. {
  41. const mode = $('[name=mode]').val();
  42. if(mode != 'single')
  43. {
  44. if(mode != 'multi')
  45. {
  46. $('#assignedTo').picker({disabled: true});
  47. }
  48. else
  49. {
  50. $('#assignedTo').picker({disabled: false});
  51. }
  52. $('.team-group').removeClass('hidden');
  53. $('#estimate').attr('readonly', 'readonly');
  54. $('#left').attr('readonly', 'readonly');
  55. }
  56. else
  57. {
  58. $('#assignedTo').picker({disabled: false});
  59. $('.team-group').addClass('hidden');
  60. $('#estimate').removeAttr('readonly');
  61. $('#left').removeAttr('readonly');
  62. }
  63. }
  64. $('#teamTable .team-saveBtn').on('click.team', '.btn', function()
  65. {
  66. let memberCount = '';
  67. let totalEstimate = 0;
  68. let totalConsumed = oldConsumed;
  69. let totalLeft = 0;
  70. let error = false;
  71. $(this).closest('#teamTable').find('.picker-box').each(function()
  72. {
  73. if(!$(this).find('[name^=team]').val()) return;
  74. memberCount++;
  75. let realname = $(this).find('.picker-single-selection').text();
  76. let $tr = $(this).closest('tr');
  77. let estimate = parseFloat($tr.find('[name^=teamEstimate]').val());
  78. if(!isNaN(estimate)) totalEstimate += estimate;
  79. if(isNaN(estimate) || estimate <= 0)
  80. {
  81. zui.Modal.alert(realname + ' ' + estimateNotEmpty);
  82. error = true;
  83. return false;
  84. }
  85. let consumed = parseFloat($tr.find('[name^=teamConsumed]').val());
  86. if(!isNaN(consumed)) totalConsumed += consumed;
  87. let $left = $tr.find('[name^=teamLeft]');
  88. let left = parseFloat($left.val());
  89. if(!isNaN(left)) totalLeft += left;
  90. if(!$left.prop('readonly') && (isNaN(left) || left <= 0) && team.length > 0)
  91. {
  92. zui.Modal.alert(realname + ' ' + leftNotEmpty);
  93. error = true;
  94. return false;
  95. }
  96. if(estimate == 0 || isNaN(estimate))
  97. {
  98. $(this).val('');
  99. zui.Modal.alert(estimateNotEmpty);
  100. error = true;
  101. return false;
  102. }
  103. })
  104. if(error) return false;
  105. if(memberCount < 2)
  106. {
  107. zui.Modal.alert(teamMemberError);
  108. return false;
  109. }
  110. if(totalLeft == 0 && (taskStatus == 'doing' || taskStatus == 'pause'))
  111. {
  112. if(confirm(confirmRecord))
  113. {
  114. const statusPicker = $('input[name="status"]').closest('.picker').zui('picker');
  115. statusPicker.$.setValue('done');
  116. }
  117. else
  118. {
  119. return false;
  120. }
  121. }
  122. $('#estimate').val(totalEstimate);
  123. $('#consumedSpan').html(totalConsumed);
  124. $('#left').val(totalLeft);
  125. updateAssignedTo();
  126. zui.Modal.hide();
  127. return false;
  128. });
  129. /**
  130. * Update assignedTo.
  131. *
  132. * @access public
  133. * @return void
  134. */
  135. function updateAssignedTo()
  136. {
  137. var users = [];
  138. var mode = $('[name="mode"]').val();
  139. var assignedTo = $('[name="assignedTo"]').val();
  140. if(mode != 'single')
  141. {
  142. var isTeamMember = false;
  143. $('#teamTable').find('.picker-box').each(function()
  144. {
  145. let realname = $(this).find('.picker-single-selection').text();
  146. if(realname == '') return;
  147. let account = $(this).find('[name^=team]').val();
  148. if(account == currentUser) isTeamMember = true;
  149. users.push({'text': realname, 'value': account});
  150. });
  151. }
  152. else
  153. {
  154. for(key in members)
  155. {
  156. users.push({'text': members[key], 'value': key});
  157. }
  158. }
  159. /* 串行多人任务取第一个人作为指派人. */
  160. if(mode == 'linear' && $('#teamTable tr.member-doing').length == 0 && $('#teamTable tr.member-wait').length >= 1) assignedTo = $('#teamTable tr.member-wait').first().find('[name^=team]').first().val();
  161. let $assignedToPicker = $('#assignedTo').zui('picker');
  162. $assignedToPicker.render({items: users});
  163. $assignedToPicker.$.setValue(assignedTo);
  164. if(mode == 'multi' && isTeamMember)
  165. {
  166. $('#assignedTo').picker({disabled: false});
  167. }
  168. else
  169. {
  170. $('#assignedTo').picker({disabled: true});
  171. }
  172. }
  173. window.renderRowData = function($row, index, row)
  174. {
  175. $row.addClass('member member-' + (row ? row.memberStatus : 'wait'));
  176. $row.data('estimate', row ? row.teamEstimate : 0);
  177. $row.data('consumed', row ? row.teamConsumed : 0);
  178. $row.data('left', row ? row.teamLeft : 0);
  179. if(row && row.memberDisabled)
  180. {
  181. $row.find('[data-name=team]').find('.picker-box').on('inited', function(e, info)
  182. {
  183. const $team = info[0];
  184. $team.render({disabled: true});
  185. })
  186. }
  187. if(row && row.hourDisabled)
  188. {
  189. $row.find('[name^=teamEstimate]').attr('readonly', 'readonly');
  190. $row.find('[name^=teamLeft]').attr('readonly', 'readonly');
  191. }
  192. if(row)
  193. {
  194. $row.find('[name^=teamConsumed]').attr('readonly', 'readonly');
  195. }
  196. const mode = $('[name=mode]').val();
  197. if(mode == 'linear') $row.find('[data-name=id]').addClass('center').html("<span class='team-number'>" + $row.find('[data-name=id]').text() + "</span><i class='icon-angle-down'><i/>");
  198. }