batchedit.ui.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. $(function()
  2. {
  3. $('#mainNavbar .nav .nav-item').find("[href$='" + storyType + "']").addClass('active');
  4. if($.apps.currentCode == 'qa' && $('#mainNavbar .nav .nav-item').find("[href$='" + storyType + "']").length == 0) $('#navbar .nav .nav-item').find("[data-id='testcase']").addClass('active');
  5. });
  6. window.renderRowData = function($row, index, story)
  7. {
  8. $row.find('[data-name="closedBy"]').find('.picker-box').on('inited', function(e, info)
  9. {
  10. let $picker = info[0];
  11. let options = $picker.options;
  12. options.disabled = story.rawStatus != 'closed';
  13. $picker.render(options);
  14. });
  15. $row.addClass('story' + story.id);
  16. let $closedReasonTD = $row.find('[data-name="closedReason"]');
  17. $closedReasonTD.find('.picker-box').on('inited', function(e, info)
  18. {
  19. $closedReasonTD.find('.picker-box').wrap("<div class='input-group'></div>");
  20. let $picker = info[0];
  21. let options = $picker.options;
  22. options.disabled = story.rawStatus != 'closed';
  23. if(story.rawStatus == 'closed') options.onChange = function(value){setDuplicateAndChild(value, story.id)};
  24. $picker.render(options);
  25. if(story.rawStatus == 'closed')
  26. {
  27. let branchID = story.branch.replace('branch', '');
  28. let productStories = typeof(productStoryList[story.product]) == 'undefined' ? [] : productStoryList[story.product];
  29. productStories = typeof(productStories[branchID]) == 'undefined' ? [] : productStories[branchID];
  30. let appendStoryHtml = "<span id='duplicateStoryBox" + story.id + "' " + (story.closedReason != 'duplicate' ? "class='hidden'" : '') + ">";
  31. appendStoryHtml += "<div class='form-control picker-box' data-name='duplicateStory' style='padding:0'></div></span>";
  32. $closedReasonTD.find('.input-group').append(appendStoryHtml);
  33. items = [];
  34. for(let storyID in productStories) items.push({text: productStories[storyID], value: storyID});
  35. $closedReasonTD.find('.picker-box[data-name=duplicateStory]').picker({items: items, name: 'duplicateStory[' + story.id + ']'});
  36. }
  37. });
  38. $row.find('[data-name="draft"]').find('.picker-box').on('inited', function(e, info)
  39. {
  40. let $picker = info[0];
  41. let options = $picker.options;
  42. options.disabled = story.rawStatus == 'draft';
  43. $picker.render(options);
  44. });
  45. let $title = $row.find('.form-batch-input[data-name="title"]');
  46. let $module = $row.find('.form-batch-control[data-name="module"]');
  47. let $plan = $row.find('.form-batch-control[data-name="plan"]');
  48. let $branch = $row.find('.form-batch-control[data-name="branch"]');
  49. let $stage = $row.find('.form-batch-control[data-name="stage"]');
  50. let $estimate = $row.find('.form-batch-control[data-name="estimate"]');
  51. let $roadmap = $row.find('.form-batch-control[data-name="roadmap"]');
  52. if($estimate.length > 0 && story.isParent == '1') $estimate.find('input.form-control').attr('readonly', 'readonly');
  53. if($stage.length > 0)
  54. {
  55. $stage.find('.picker-box').on('inited', function(e, info)
  56. {
  57. let $picker = info[0];
  58. let options = $picker.options;
  59. let items = story.type == 'story' ? options.items : urStageOptions;
  60. if(story.type == 'story' && story.isParent == '0')
  61. {
  62. /* 叶子需求删除父需求的阶段。*/
  63. items.splice(11, 2);
  64. options.items = items;
  65. }
  66. else if(story.type != 'story' || story.isParent == '1')
  67. {
  68. options.disabled = true;
  69. }
  70. options.items = items;
  71. $picker.render(options);
  72. })
  73. }
  74. $title.attr('title', story.title).before("<input type='hidden' name='title[" + story.id + "]' value='" + story.title + "' />");
  75. if(story.rawStatus != 'draft') $title.attr('disabled', 'disabled');
  76. $row.find('.form-control-static[data-name="status"]').addClass('status-' + story.rawStatus);
  77. if($branch.length > 0)
  78. {
  79. let branches = typeof branchTagOption[story.product] == 'undefined' ? [] : branchTagOption[story.product];
  80. $branch.find('.picker-box').on('inited', function(e, info)
  81. {
  82. let $picker = info[0];
  83. let options = $picker.options;
  84. let items = [{text: '', value: ''}];
  85. for(let branch in branches)
  86. {
  87. if(branch == '') continue;
  88. items.push({text: branches[branch], value: branch});
  89. }
  90. options.items = items;
  91. options.onChange = function(){loadBranches(story.product, e)};
  92. options.defaultValue = story.branch;
  93. options.required = true;
  94. $picker.render(options);
  95. });
  96. }
  97. if($module.length > 0)
  98. {
  99. let modules = typeof moduleList[story.id] == 'undefined' ? ['/'] : moduleList[story.id];
  100. $module.find('.picker-box').on('inited', function(e, info)
  101. {
  102. let $picker = info[0];
  103. let options = $picker.options;
  104. let items = [];
  105. for(let module in modules) items.push({text: modules[module], value: module});
  106. options.items = items;
  107. options.defaultValue = story.module;
  108. $picker.render(options);
  109. });
  110. }
  111. if($plan.length > 0)
  112. {
  113. const branchID = story.branch.replace('branch', '');
  114. let plans = typeof(planGroups[story.product]) == 'undefined' ? [] : planGroups[story.product];
  115. plans = typeof(plans[branchID]) == 'undefined' ? [] : plans[branchID];
  116. $plan.find('.picker-box').on('inited', function(e, info)
  117. {
  118. let $picker = info[0];
  119. let options = $picker.options;
  120. let items = [];
  121. for(let plan in plans)
  122. {
  123. if(plan == '') continue;
  124. items.push({text: plans[plan], value: plan});
  125. }
  126. options.items = items;
  127. options.defaultValue = story.plan;
  128. options.multiple = story.type != 'story' ? true : false;
  129. $picker.render(options);
  130. });
  131. $row.attr('type', story.type);
  132. }
  133. if($estimate.length > 0)
  134. {
  135. if(story.parent == -1) $estimate.find('[name^=estimate]').attr('readonly', 'readonly');
  136. }
  137. if($roadmap && $roadmap.length > 0)
  138. {
  139. const roadmapFilter = ['launching', 'launched', 'closed'];
  140. const storyFileter = ['draft', 'reviewing', 'closed'];
  141. let roadmapCondition = (allRoadmaps[story.roadmap] && roadmapFilter.indexOf(allRoadmaps[story.roadmap].status) !== -1);
  142. let storyCondition = storyFileter.indexOf(story.rawStatus) !== -1;
  143. $roadmap.find('.picker-box').on('inited', function(e, info)
  144. {
  145. let $picker = info[0];
  146. let options = $picker.options;
  147. $.each(roadmaps, function(key, value)
  148. {
  149. options.items.push({text: value, value: key});
  150. })
  151. if(allRoadmaps[story.roadmap] && !roadmaps[story.roadmap]) options.items.push({text: allRoadmaps[story.roadmap].name, value: story.roadmap});
  152. options.disabled = (roadmapCondition || storyCondition);
  153. $picker.render(options);
  154. });
  155. if(roadmapCondition || storyCondition) $roadmap.append("<input type='hidden' name='roadmap[" + story.id + "]' value='" + story.roadmap + "' />");
  156. }
  157. if(story.type == 'requirement' && storyType != 'requirement')
  158. {
  159. $row.find('[data-name="source"]').find('.picker-box').on('inited', function(e, info)
  160. {
  161. let $sourcePicker = info[0];
  162. $sourcePicker.render({items: URSourceItems});
  163. });
  164. }
  165. if(story.source == 'researchreport')
  166. {
  167. renderSourceNote($row.find('[data-name="sourceNote"]'), story.source, story.sourceNote);
  168. }
  169. };
  170. window.loadBranches = function(product, obj)
  171. {
  172. $this = $(obj.target);
  173. branch = $this.find('input[name^=branch]').val().replace('branch', '');
  174. let storyID = $this.closest('tr').find('.form-batch-input[data-name="storyIdList"]').val();
  175. let $module = $this.closest('tr').find('.form-batch-control[data-name="module"]');
  176. let currentModuleID = $module.find('input[name^=module]').val();
  177. let moduleLink = $.createLink('tree', 'ajaxGetOptionMenu', 'productID=' + product + '&viewtype=story&branch=' + branch + '&rootModuleID=0&returnType=items&fieldID=' + storyID + '&extra=nodeleted&currentModuleID=' + currentModuleID);
  178. if($module.find('input[name^=module]').length > 0)
  179. {
  180. $.getJSON(moduleLink, function(items)
  181. {
  182. let $picker = $this.closest('tr').find('.picker-box[data-name="module"]').zui('picker');
  183. let options = $picker.options;
  184. let oldItems = options.items.map(item => item.value.toString());
  185. let newItems = items.map(item => item.value.toString());
  186. if(JSON.stringify(newItems.slice().sort()) != JSON.stringify(oldItems.slice().sort()))
  187. {
  188. options.items = items;
  189. $picker.render(options);
  190. $picker.$.setValue(currentModuleID);
  191. }
  192. });
  193. }
  194. let $plan = $this.closest('tr').find('.form-batch-control[data-name="plan"]');
  195. let planLink = $.createLink('product', 'ajaxGetPlans', 'productID=' + product + '&branch=' + branch + '&params=&skipparent=true');
  196. if($plan.find('input[name^=plan]').length > 0)
  197. {
  198. $.getJSON(planLink, function(items)
  199. {
  200. let $picker = $this.closest('tr').find('.picker-box[data-name="plan"]').zui('picker');
  201. let options = $picker.options;
  202. let oldItems = options.items.map(item => item.value.toString());
  203. let newItems = items.map(item => item.value.toString());
  204. if(JSON.stringify(newItems.slice().sort()) != JSON.stringify(oldItems.slice().sort()))
  205. {
  206. options.items = items;
  207. $picker.render(options);
  208. $picker.$.setValue('');
  209. }
  210. });
  211. }
  212. }
  213. window.setDuplicateAndChild = function(resolution, storyID)
  214. {
  215. if(resolution == 'duplicate')
  216. {
  217. $('#duplicateStoryBox' + storyID).removeClass('hidden');
  218. }
  219. else
  220. {
  221. $('#duplicateStoryBox' + storyID).addClass('hidden');
  222. }
  223. };
  224. window.handleRenderFieldCol = function($col, col)
  225. {
  226. if(col.name === 'sourceNote') return renderSourceNote($col);
  227. };