v1.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. window.addNewLine = function(e)
  2. {
  3. const obj = e.target
  4. const newLine = $(obj).closest('.productBox').clone();
  5. $(obj).closest('.productBox').find('.removeLine').removeClass('hidden');
  6. let index = 0;
  7. let chosenProducts = [];
  8. let options = zui.Picker.query("[name^='product']").options;
  9. options = JSON.parse(JSON.stringify(options));
  10. /* 将已有产品下拉的最大name属性的值加1赋值给新行. */
  11. $(".productsBox .pick-value[name^='product']").each(function()
  12. {
  13. chosenProducts.push($(this).val());
  14. let id = $(this).attr('name').replace(/[^\d]/g, '');
  15. id = parseInt(id);
  16. id ++;
  17. index = id > index ? id : index;
  18. })
  19. /* Disable chosen products. */
  20. options.items.forEach(function(item)
  21. {
  22. if(chosenProducts.includes(item.value)) item.disabled = true;
  23. });
  24. while($('[name="roadmap[' + index + ']"]').length > 0) index ++;
  25. while($('[name="storyGrade[' + index + ']"]').length > 0) index ++;
  26. /* 处理新一行控件的显示/隐藏,宽度/是否居中等样式问题. */
  27. newLine.addClass('newLine');
  28. newLine.find('.form-label').addClass('hidden');
  29. newLine.find('.removeLine').removeClass('hidden');
  30. newLine.find('.c-actions').removeClass('first-action');
  31. /* 重新初始化新一行的下拉控件. */
  32. newLine.find('.linkProduct').html(`<div id=product${index} class='form-group-wrapper picker-box'></div>`);
  33. newLine.find('.storyGrade').html(`<div id=storyGrade${index} class='form-group-wrapper picker-box'></div>`);
  34. newLine.find('.linkBranch').html(`<div id=branch${index} class='form-group-wrapper picker-box'></div>`);
  35. newLine.find('.linkRoadmap').html(`<div id=roadmap${index} class='form-group-wrapper picker-box'></div>`);
  36. $(obj).closest('.productBox').after(newLine);
  37. /* 初始化产品。*/
  38. options.name = `product[${index}]`;
  39. options.defaultValue = '';
  40. options.disabled = false;
  41. options.placeholder = '';
  42. new zui.Picker(`#product${index}`, options);
  43. /* 初始化需求层级。*/
  44. let gradeOptions = $(obj).closest('.productBox').find('[name^=storyGrade]').zui('picker').options;
  45. gradeOptions.name = `storyGrade[${index}]`;
  46. gradeOptions.items = [];
  47. new zui.Picker(`#storyGrade${index}`, gradeOptions);
  48. new zui.Picker(`#branch${index} `, {name: `branch[${index}]`, items: [], emptyValue: ''});
  49. new zui.Picker(`#roadmap${index}`, {name: `roadmap[${index}]`, items: []});
  50. refreshPicker();
  51. }
  52. window.removeLine = function(e)
  53. {
  54. const obj = e.target;
  55. $(obj).closest('.productBox').remove();
  56. const $productBox = $('.productsBox').find('.productBox');
  57. if($productBox.length == 1) $productBox.find('.removeLine').addClass('hidden');
  58. $productBox.first().find('.form-label').removeClass('hidden');
  59. refreshPicker();
  60. }
  61. /**
  62. * Load roadmap.
  63. *
  64. * @param object product
  65. * @access public
  66. * @return void
  67. */
  68. window.loadRoadmap = function(product)
  69. {
  70. let storyType = 'epic';
  71. let objectType = 'all';
  72. const storyGrade = product.closest('.productBox').find('[name^=storyGrade]').val();
  73. if(storyGrade.indexOf('-') !== -1) storyType = storyGrade.substr(0, storyGrade.indexOf('-'));
  74. if(storyType == 'story') objectType = 'plan';
  75. let productID = product.val();
  76. let branchID = product.closest('.productBox').find('.linkBranch .pick-value').val();
  77. let link = $.createLink('demand', 'ajaxGetRoadmapPlans', 'productID=' + productID + '&branch=' + branchID + '&getObjectType=' + objectType);
  78. const $roadmap = product.closest('.productBox').find('.roadmapBox .pick-value');
  79. $roadmap.closest('.picker-box').removeClass('hidden');
  80. $roadmap.zui('picker').render({disabled: false});
  81. $.getJSON(link, function(data)
  82. {
  83. $roadmap.zui('picker').render({items: data});
  84. $roadmap.zui('picker').$.setValue('');
  85. });
  86. }
  87. /**
  88. * Load branches when change product.
  89. *
  90. * @param object obj
  91. * @access public
  92. * @return bool
  93. */
  94. window.loadProductBranches = function(obj)
  95. {
  96. const $product = $(obj);
  97. const productID = $product.val();
  98. const branchPicker = $product.closest('.input-group').find('.linkBranch .pick-value').zui('picker');
  99. if(!productID)
  100. {
  101. $product.closest('.input-group').find('.linkBranch').addClass('hidden');
  102. branchPicker.render({items: []});
  103. $product.closest('.productBox').find('[name^=roadmap]').zui('picker').render({items: []});
  104. return false;
  105. }
  106. $.getJSON($.createLink('demand', 'ajaxGetBranches', "productID=" + productID), function(data)
  107. {
  108. $product.closest('.input-group').find('.linkBranch').toggleClass('hidden', !data.length);
  109. branchPicker.render({items: data, emptyValue: ''});
  110. if(data.length) branchPicker.$.setValue(data[0].value);
  111. loadRoadmap($product);
  112. })
  113. }
  114. window.loadStoryGrade = function(productBox)
  115. {
  116. const productID = $(productBox).find('[name^=product]').val();
  117. const addProduct = $(productBox).find('[name^=addProduct]').prop('checked') ? 'true' : 'false';
  118. const $gradePicker = $(productBox).find('[name^=storyGrade]').zui('picker');
  119. $.getJSON($.createLink('demand', 'ajaxGetStoryGrade', "productID=" + productID + "&addProduct=" + addProduct), function(data)
  120. {
  121. $gradePicker.render({items: data});
  122. $gradePicker.$.setValue(data[0].value);
  123. })
  124. }
  125. /**
  126. * Load branch.
  127. *
  128. * @access public
  129. * @return void
  130. */
  131. window.loadBranch = function()
  132. {
  133. const $product = $(this).closest('.distributeProduct').find('.linkProduct .pick-value');
  134. loadRoadmap($product);
  135. }
  136. /**
  137. * Load roadmap or plan.
  138. *
  139. * @access public
  140. * @return void
  141. */
  142. window.loadRoadmapPlans = function()
  143. {
  144. const $product = $(this).closest('.productBox').find('.linkProduct .pick-value');
  145. loadRoadmap($product);
  146. }
  147. /**
  148. * Add new product.
  149. *
  150. * @access public
  151. * @return void
  152. */
  153. window.addProduct = function()
  154. {
  155. if($(this).prop('checked'))
  156. {
  157. /* Hide product dropdown controls. */
  158. $('.productBox .linkProduct .picker-box').addClass('hidden');
  159. $('.productBox .linkProduct .picker-box').zui('picker').render({disabled: true});
  160. /* Displays the input box for creating a product. */
  161. $('[name=productName]').removeClass('hidden');
  162. $('[name=productName]').removeAttr('disabled');
  163. }
  164. else
  165. {
  166. /* Show product dropdown controls. */
  167. $('.productBox .linkProduct .picker-box').removeClass('hidden');
  168. $('.productBox .linkProduct .picker-box').zui('picker').render({disabled: false});
  169. /* Hide the input box for creating a product. */
  170. $('[name=productName]').addClass('hidden');
  171. $('[name=productName]').attr('disabled', 'disabled');
  172. }
  173. loadStoryGrade($(this).closest('.productBox'));
  174. }
  175. window.refreshPicker = function(product)
  176. {
  177. let $products = $('.distributeForm').find('.productBox .linkProduct .pick-value');
  178. let selectedProducts = [];
  179. $products.each(function()
  180. {
  181. if($(this).val() != '') selectedProducts.push($(this).val());
  182. });
  183. $products.each(function()
  184. {
  185. let $product = $(this);
  186. let productID = $product.val();
  187. let $productPicker = $product.zui('picker');
  188. let productItems = $productPicker.options.items;
  189. $.each(productItems, function(i, item)
  190. {
  191. if(item.value == '') return;
  192. productItems[i].disabled = selectedProducts.includes(item.value) && item.value != productID;
  193. })
  194. $productPicker.render({items: productItems});
  195. });
  196. if(typeof product !== "undefined")
  197. {
  198. loadProductBranches(product);
  199. loadStoryGrade(product.closest('.productBox'));
  200. }
  201. }