v1.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. $(function()
  2. {
  3. $('.productBox .picker-box').last().on('inited', function(){updateItems();});
  4. });
  5. window.addNewLine = function(e)
  6. {
  7. const obj = e.target
  8. const newLine = $(obj).closest('.productBox').clone();
  9. $(obj).closest('.productBox').find('.removeLine').removeClass('hidden');
  10. let index = 0;
  11. let chosenProducts = [];
  12. let options = zui.Picker.query("[name^='product']").options;
  13. options = JSON.parse(JSON.stringify(options));
  14. /* 将已有产品下拉的最大name属性的值加1赋值给新行. */
  15. $(".productsBox .pick-value[name^='product']").each(function()
  16. {
  17. chosenProducts.push($(this).val());
  18. let id = $(this).attr('name').replace(/[^\d]/g, '');
  19. id = parseInt(id);
  20. id ++;
  21. index = id > index ? id : index;
  22. })
  23. /* Disable chosen products. */
  24. options.items.forEach(function(item)
  25. {
  26. if(chosenProducts.includes(item.value)) item.disabled = true;
  27. });
  28. const objectType = $(obj).closest('.productsBox').data('objecttype');
  29. while($('[name="' + objectType + '[' + index + ']"]').length > 0) index ++;
  30. /* 处理新一行控件的显示/隐藏,宽度/是否居中等样式问题. */
  31. newLine.addClass('newLine');
  32. newLine.find('.form-label').addClass('hidden');
  33. newLine.find('.removeLine').removeClass('hidden');
  34. newLine.find('.c-actions').removeClass('first-action');
  35. newLine.find('.form-tip').remove();
  36. /* 重新初始化新一行的下拉控件. */
  37. const objectClass = objectType == 'roadmap' ? '.linkRoadmap' : '.linkPlan';
  38. newLine.find('.linkProduct').html(`<div id=product${index} class='form-group-wrapper picker-box' data-on='change' data-call='refreshPicker' data-params='event'></div>`);
  39. newLine.find(objectClass).html(`<div id=${objectType}${index} class='form-group-wrapper picker-box'></div>`);
  40. newLine.find('.branchBox').html(`<div id=branch${index} class='form-group-wrapper picker-box' data-call="branchChange(event)" data-on="change"></div>`, false);
  41. $(obj).closest('.productBox').after(newLine);
  42. /* 初始化产品。*/
  43. options.name = `product[${index}]`;
  44. options.defaultValue = '';
  45. options.disabled = false;
  46. options.placeholder = '';
  47. new zui.Picker(`#product${index}`, options);
  48. new zui.Picker(`#branch${index}`, {name: `branch[${index}]`, multiple: true, items: []});
  49. new zui.Picker(`#${objectType}${index}`, {name: `${objectType}[${index}]`, items: [], multiple: true});
  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. updateItems();
  61. }
  62. /**
  63. * Load roadmap.
  64. *
  65. * @param object product
  66. * @access public
  67. * @return void
  68. */
  69. window.loadRoadmap = function(product)
  70. {
  71. const objectType = product.closest('.productsBox').data('objecttype');
  72. if(objectType != 'roadmap') return;
  73. let productID = product.val();
  74. let branchID = product.closest('.productBox').find('.linkBranch .pick-value').val();
  75. if(typeof branchID == 'undefined' || branchID === '') branchID = 'all';
  76. let link = $.createLink('demand', 'ajaxGetRoadmaps', 'productID=' + productID + '&branch=' + branchID + '&param=nolaunching');
  77. const $items = [{text: '', value: '', key: ''}];
  78. const $roadmap = product.closest('.productBox').find('.roadmapBox .pick-value');
  79. const oldRoadmap = product.closest('.productBox').find('[name^=roadmap]').val();
  80. $roadmap.closest('.picker-box').removeClass('hidden');
  81. $roadmap.closest('.linkRoadmap').find('[name^=roadmapName]').addClass('hidden');
  82. $roadmap.closest('.linkRoadmap').find('[name^=roadmapName]').attr('disabled', 'disabled');
  83. $roadmap.zui('picker').render({disabled: false});
  84. $.getJSON(link, function(data)
  85. {
  86. $roadmap.zui('picker').render({items: data});
  87. if(productID == '' || productID === undefined) $roadmap.zui('picker').render({items: $items});
  88. $roadmap.zui('picker').$.setValue(oldRoadmap);
  89. let optionCount = $roadmap.zui('picker').options.items.length;
  90. $roadmap.closest('.input-group').find('.addRoadmap').toggleClass('hidden', !productID || (productID != 0 && optionCount));
  91. $roadmap.closest('.input-group').find('[name^=addRoadmap]').prop('checked', false);
  92. });
  93. }
  94. /**
  95. * Load plan.
  96. *
  97. * @param object product
  98. * @access public
  99. * @return void
  100. */
  101. window.loadPlan = function(product)
  102. {
  103. const objectType = product.closest('.productsBox').data('objecttype');
  104. if(objectType != 'plan') return;
  105. let productID = product.val();
  106. let branchID = product.closest('.productBox').find('.linkBranch .pick-value').val();
  107. if(!multiBranchProducts[productID] || typeof branchID == 'undefined') branchID = 'all';
  108. let link = $.createLink('charter', 'ajaxGetPlans', 'productID=' + productID + '&branchID=' + branchID);
  109. const $items = [{text: '', value: '', key: ''}];
  110. const $plan = product.closest('.productBox').find('.planBox .pick-value');
  111. const oldPlan = product.closest('.productBox').find('[name^=plan]').val();
  112. $plan.closest('.picker-box').removeClass('hidden');
  113. $plan.zui('picker').render({disabled: false});
  114. $.getJSON(link, function(data)
  115. {
  116. $plan.zui('picker').render({items: data});
  117. if(productID == '' || productID === undefined) $plan.zui('picker').render({items: $items});
  118. $plan.zui('picker').$.setValue(oldPlan);
  119. });
  120. }
  121. window.refreshPicker = function(event)
  122. {
  123. if(typeof event !== "undefined")
  124. {
  125. const $product = $(event.target);
  126. const productID = $product.val();
  127. if(multiBranchProducts[productID])
  128. {
  129. loadBranches($product);
  130. }
  131. else
  132. {
  133. updateItems();
  134. const objectType = $product.closest('.productsBox').data('objecttype');
  135. if(objectType == 'roadmap') loadRoadmap($product);
  136. if(objectType == 'plan') loadPlan($product);
  137. let $formRow = $product.closest('.productBox');
  138. $formRow.find('.form-group').eq(0).addClass('w-1/2').removeClass('w-1/4');
  139. $formRow.find('.form-group').eq(1).addClass('hidden');
  140. }
  141. }
  142. }
  143. window.loadRoadmapStories = function(event)
  144. {
  145. let $roadmaps = $(event.target).closest('.roadmapBox').find('.pick-value').val()
  146. let $product = $(event.target).closest('.productBox').find('.linkProduct .pick-value').val()
  147. const link = $.createLink('charter', 'loadRoadmapStories', 'product=' + $product + '&roadmaps=' + $roadmaps.join(), '', true);
  148. openUrl(link, {load: 'modal', size: 'lg', type: 'iframe'});
  149. }
  150. window.loadBranches = function(product)
  151. {
  152. let currentProduct = product.val();
  153. let $formRow = product.closest('.productBox');
  154. let charterID = $('[name="charter"]').length ? $('[name="charter"]').val() : 0;
  155. const objectType = product.closest('.productsBox').data('objecttype');
  156. if(typeof projectID == 'undefined') projectID = 0;
  157. $.getJSON($.createLink('branch', 'ajaxGetBranches', "productID=" + currentProduct + "&oldBranch=&param=active&projectID=" + projectID + "&withMainBranch=true&isTwins=no&fieldID=0&multiple=&charterID=" + charterID), function(data)
  158. {
  159. if(data.length > 0)
  160. {
  161. $formRow.find('.form-group').eq(0).addClass('w-1/4').removeClass('w-1/2');
  162. $formRow.find('.form-group').eq(1).removeClass('hidden');
  163. const $branchPicker = $formRow.find('[name^=branch]').zui('picker');
  164. $branchPicker.render({items: data, multiple: true});
  165. $branchPicker.$.setValue('0').then(() =>
  166. {
  167. if(objectType == 'roadmap')
  168. {
  169. loadRoadmap(product);
  170. }
  171. else
  172. {
  173. loadPlan(product);
  174. }
  175. });
  176. }
  177. else
  178. {
  179. if(objectType == 'roadmap')
  180. {
  181. loadRoadmap(product);
  182. }
  183. else
  184. {
  185. loadPlan(product);
  186. }
  187. }
  188. });
  189. updateItems();
  190. }
  191. window.branchChange = function(event)
  192. {
  193. const objectType = $(event.target).closest('.productsBox').data('objecttype');
  194. const $product = $(event.target).closest('.productBox').find('.linkProduct .pick-value');
  195. if(objectType == 'roadmap')
  196. {
  197. loadRoadmap($product);
  198. }
  199. else
  200. {
  201. loadPlan($product);
  202. }
  203. updateItems();
  204. }
  205. window.updateItems = function()
  206. {
  207. let chosenProducts = [];
  208. $(".productsBox [name^='product']").each(function()
  209. {
  210. const productID = $(this).val();
  211. if(productID > 0 && chosenProducts.indexOf(productID) == -1) chosenProducts.push(productID);
  212. });
  213. let allItems = zui.Picker.query("[name^='product']").options.items;
  214. let productItems = [];
  215. for(i = 0; i < allItems.length; i++)
  216. {
  217. allItems[i].disabled = false;
  218. if(chosenProducts.includes(allItems[i].value)) allItems[i].disabled = true;
  219. productItems[allItems[i].value] = Object.assign({},allItems[i]);
  220. productItems[allItems[i].value].i = i;
  221. }
  222. $(".productsBox [name^='product']").each(function()
  223. {
  224. const $product = $(this).zui('picker');
  225. const productID = $(this).val();
  226. let currentProductItems = JSON.parse(JSON.stringify(allItems));
  227. if(productID != 0) currentProductItems[productItems[productID].i].disabled = false;
  228. $product.render({items: currentProductItems});
  229. });
  230. }