v1.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. namespace zin;
  3. class productCharterBox extends wg
  4. {
  5. /**
  6. * Define widget properties.
  7. *
  8. * @var array
  9. * @access protected
  10. */
  11. protected static $defineProps = array(
  12. 'charter?: object', // 所属立项。
  13. 'products?: array', // 产品下拉列表。
  14. 'objectType?: string' // 立项关联的对象类型。
  15. );
  16. public static function getPageCSS()
  17. {
  18. return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css');
  19. }
  20. public static function getPageJS()
  21. {
  22. return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js');
  23. }
  24. protected function build()
  25. {
  26. $productsBox = $this->initProductsBox();
  27. return div
  28. (
  29. setClass('productsBox'),
  30. setData(array('objecttype' => $this->prop('objectType'))),
  31. jsVar('multiBranchProducts', data('multiBranchProducts')),
  32. $productsBox
  33. );
  34. }
  35. protected function initProductsBox()
  36. {
  37. global $lang, $app, $config;
  38. $products = $this->prop('products');
  39. $charter = $this->prop('charter');
  40. $objectType = $this->prop('objectType');
  41. $productsBox = array();
  42. $index = 0;
  43. if($charter)
  44. {
  45. $objectsGroup = array();
  46. if($objectType == 'plan') $objectsGroup = $app->control->loadModel('productplan')->getPlansForCharter(explode(',', trim($charter->product, ',')), trim($charter->plan, ','));
  47. if($objectType == 'roadmap') $objectsGroup = $app->control->loadModel('roadmap')->groupByProduct('nolaunching', trim($charter->roadmap, ','));
  48. $branchGroups = $app->control->loadModel('branch')->getByProducts(array_keys($products), 'noclosed');
  49. $linkedBranchGroups = $app->control->loadModel('charter')->getLinkedBranchGroups($charter->id);
  50. $charterProductMaps = $app->control->loadModel('charter')->getGroupDataByID($charter->id);
  51. if(empty($charterProductMaps)) $charterProductMaps = array(array()); // 没有产品时,至少渲染一行数据。
  52. foreach($charterProductMaps as $productID => $objects)
  53. {
  54. $productObjects = isset($objectsGroup[$productID]) ? array_keys($objectsGroup[$productID]) : array();
  55. $objects = array_intersect($productObjects, array_keys($objects));
  56. $product = $app->control->loadModel('product')->fetchByID($productID);
  57. $hasBranch = !empty($product->type) && $product->type != 'normal' && isset($branchGroups[$productID]);
  58. $productsBox[] = div
  59. (
  60. set::className('productBox'),
  61. div
  62. (
  63. set::className('flex'),
  64. formGroup
  65. (
  66. set::width($hasBranch ? '1/4' : '1/2'),
  67. setClass('distributeProduct text-clip'),
  68. $index != 0 ? set::labelClass('hidden') : null,
  69. set::label($lang->charter->product),
  70. inputGroup
  71. (
  72. div
  73. (
  74. setClass('grow linkProduct w-1/2'),
  75. picker
  76. (
  77. setData(array('on' => 'change', 'call' => 'refreshPicker', 'params' => 'event')),
  78. set::name("product[$index]"),
  79. set::items($products),
  80. set::value($productID)
  81. )
  82. )
  83. )
  84. ),
  85. formGroup
  86. (
  87. set::width('1/4'),
  88. setClass('linkBranch ml-px'),
  89. $hasBranch ? null : setClass('hidden'),
  90. set::label(''),
  91. $index != 0 ? set::labelClass('hidden') : null,
  92. inputGroup
  93. (
  94. setClass('branchBox'),
  95. picker
  96. (
  97. set::name("branch[{$index}][]"),
  98. set::items(isset($branchGroups[$productID]) ? $branchGroups[$productID] : array()),
  99. set::value(isset($linkedBranchGroups[$productID]) ? array_keys($linkedBranchGroups[$productID]) : array()),
  100. set::multiple(true),
  101. set::emptyValue(''),
  102. setData(array('on' => 'change', 'call' => 'branchChange', 'params' => 'event'))
  103. )
  104. )
  105. ),
  106. formGroup
  107. (
  108. set::width('1/2'),
  109. set::label($lang->charter->$objectType),
  110. $config->edition == 'ipd' ? set::labelControl(array('control' => 'icon', 'name' => 'help', 'data-toggle' => 'tooltip', 'data-title' => $lang->custom->charter->tips->type)) : null,
  111. set::className("{$objectType}Box"),
  112. $index != 0 ? set::labelClass('hidden') : null,
  113. inputGroup
  114. (
  115. div
  116. (
  117. setClass('grow w-1/2', $objectType == 'roadmap' ? 'linkRoadmap' : 'linkPlan'),
  118. picker
  119. (
  120. set::name("{$objectType}[$index]"),
  121. set::multiple(true),
  122. set::items(isset($objectsGroup[$productID]) ? $objectsGroup[$productID] : array()),
  123. set::value(array_values($objects))
  124. )
  125. ),
  126. div
  127. (
  128. $objectType == 'roadmap' && common::hasPriv('charter', 'loadRoadmapStories') ? inputGroupAddon
  129. (
  130. setClass('p-0'),
  131. btn
  132. (
  133. setID('loadRoadmapStories'),
  134. setClass('ghost'),
  135. setData(array('on' => 'click', 'call' => 'loadRoadmapStories', 'params' => 'event')),
  136. $lang->charter->loadStories
  137. )
  138. ) : null
  139. )
  140. )
  141. )
  142. ),
  143. div
  144. (
  145. set::className('actionsBox'),
  146. formGroup
  147. (
  148. set::label(''),
  149. $index != 0 ? set::labelClass('hidden') : null,
  150. div
  151. (
  152. setClass('pl-2 flex self-center line-btn'),
  153. btn
  154. (
  155. setData(array('on' => 'click', 'call' => 'addNewLine', 'params' => 'event')),
  156. setClass('btn btn-link text-gray addLine'),
  157. icon('plus')
  158. ),
  159. btn
  160. (
  161. setData(array('on' => 'click', 'call' => 'removeLine', 'params' => 'event')),
  162. setClass('btn btn-link text-gray removeLine', $index == 0 && count($charterProductMaps) <= 1 ? 'hidden' : ''),
  163. icon('trash')
  164. )
  165. )
  166. )
  167. )
  168. );
  169. $index ++;
  170. }
  171. }
  172. else
  173. {
  174. $productsBox[] = div
  175. (
  176. set::className('productBox'),
  177. div
  178. (
  179. set::className('flex'),
  180. formGroup
  181. (
  182. set::width('1/2'),
  183. setClass('distributeProduct text-clip'),
  184. set::label($lang->charter->product),
  185. set::labelClass($charter ? 'hidden' : ''),
  186. inputGroup
  187. (
  188. div
  189. (
  190. setClass('grow linkProduct w-1/2'),
  191. picker
  192. (
  193. setData(array('on' => 'change', 'call' => 'refreshPicker', 'params' => 'event')),
  194. set::name("product[$index]"),
  195. set::items($products),
  196. set::defaultValue(''),
  197. set::emptyValue('')
  198. )
  199. )
  200. )
  201. ),
  202. formGroup
  203. (
  204. set::width('1/4'),
  205. setClass('hidden linkBranch ml-px'),
  206. set::label(''),
  207. inputGroup
  208. (
  209. setClass('branchBox'),
  210. picker
  211. (
  212. set::name("branch[$index]"),
  213. set::items(array()),
  214. setData(array('on' => 'change', 'call' => 'branchChange', 'params' => 'event'))
  215. )
  216. )
  217. ),
  218. formGroup
  219. (
  220. set::width('1/2'),
  221. set::label($lang->charter->$objectType),
  222. set::labelClass($charter ? 'hidden' : ''),
  223. $config->edition == 'ipd' ? set::labelControl(array('control' => 'icon', 'name' => 'help', 'data-toggle' => 'tooltip', 'data-title' => $lang->custom->charter->tips->type)) : null,
  224. set::className("{$objectType}Box"),
  225. inputGroup
  226. (
  227. div
  228. (
  229. setClass('grow w-1/2', $objectType == 'roadmap' ? 'linkRoadmap' : 'linkPlan'),
  230. picker
  231. (
  232. set::name("{$objectType}[$index]"),
  233. set::multiple(true),
  234. set::items(array())
  235. )
  236. ),
  237. div
  238. (
  239. $objectType == 'roadmap' && common::hasPriv('charter', 'loadRoadmapStories') ? inputGroupAddon
  240. (
  241. setClass('p-0'),
  242. btn
  243. (
  244. setID('loadRoadmapStories'),
  245. setClass('ghost'),
  246. setData(array('on' => 'click', 'call' => 'loadRoadmapStories', 'params' => 'event')),
  247. $lang->charter->loadStories
  248. )
  249. ) : null
  250. )
  251. )
  252. )
  253. ),
  254. div
  255. (
  256. set::className('actionsBox'),
  257. count($products) ? formGroup
  258. (
  259. set::label(''),
  260. set::labelClass($charter ? 'hidden' : ''),
  261. div
  262. (
  263. setClass('pl-2 flex self-center line-btn'),
  264. btn
  265. (
  266. setData(array('on' => 'click', 'call' => 'addNewLine', 'params' => 'event')),
  267. setClass('btn btn-link text-gray addLine'),
  268. icon('plus')
  269. ),
  270. btn
  271. (
  272. setData(array('on' => 'click', 'call' => 'removeLine', 'params' => 'event')),
  273. setClass('btn btn-link text-gray removeLine', $charter ? '' : 'hidden'),
  274. icon('trash')
  275. )
  276. )
  277. ) : null
  278. )
  279. );
  280. }
  281. return $productsBox;
  282. }
  283. }