view.html.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. <?php
  2. /**
  3. * The view file of marketresearch module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2024 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  5. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  6. * @author Fangzhou Hu<hufangzhou@easycorp.ltd>
  7. * @package marketresearch
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. jsVar('confirmDeleteTip', $lang->project->confirmDelete);
  12. $membersDom = array();
  13. if(!empty($research->PM))
  14. {
  15. $user = isset($userList[$research->PM]) ? $userList[$research->PM] : null;
  16. if($user)
  17. {
  18. $membersDom[] = div
  19. (
  20. setClass('w-1/8 center-y'),
  21. avatar(setClass('primary-outline'), set::text($user->realname), set::src($user->avatar)),
  22. span(setClass('my-2'), $user->realname),
  23. span(setClass('text-gray'), $lang->project->PM)
  24. );
  25. }
  26. unset($teamMembers[$research->PM]);
  27. }
  28. $memberCount = count($membersDom);
  29. foreach($teamMembers as $teamMember)
  30. {
  31. if($memberCount >= 7) break;
  32. $user = isset($userList[$teamMember->account]) ? $userList[$teamMember->account] : null;
  33. if(!$user) continue;
  34. $membersDom[] = div
  35. (
  36. setClass('w-1/8 center-y'),
  37. avatar(set::text($user->realname), set::src($user->avatar)),
  38. span(setClass('my-2'), $user->realname),
  39. span(setClass('text-gray'), $lang->project->member)
  40. );
  41. $memberCount ++;
  42. }
  43. if(common::hasPriv('marketresearch', 'manageMembers'))
  44. {
  45. $membersDom[] = a
  46. (
  47. setClass('w-1/8 center-y cursor-pointer'),
  48. set::href(createLink('marketresearch', 'manageMembers', "researchID={$research->id}")),
  49. avatar
  50. (
  51. setClass('mb-2'),
  52. set::foreColor('var(--color-primary-500-rgb)'),
  53. set::background('var(--color-primary-50)'),
  54. icon('plus')
  55. ),
  56. $lang->project->manage
  57. );
  58. }
  59. $status = $this->processStatus('marketresearch', $research);
  60. row
  61. (
  62. setClass('w-full'),
  63. cell
  64. (
  65. setClass('main w-2/3'),
  66. div
  67. (
  68. setClass('flex-auto canvas flex p-4 basic'),
  69. div
  70. (
  71. setClass('text-center w-1/3 flex flex-col justify-center items-center progressBox'),
  72. div
  73. (
  74. set('class', 'chart pie-chart'),
  75. echarts
  76. (
  77. set::color(array('#2B80FF', '#E3E4E9')),
  78. set::width(120),
  79. set::height(120),
  80. set::series(array(
  81. array
  82. (
  83. 'type' => 'pie',
  84. 'radius' => array('80%', '90%'),
  85. 'itemStyle' => array('borderRadius' => '40'),
  86. 'label' => array('show' => false),
  87. 'data' => array($research->progress, 100 - $research->progress)
  88. )))
  89. ),
  90. div
  91. (
  92. set::className('pie-chart-title text-center'),
  93. div(span(set::className('text-2xl font-bold'), $research->progress . '%')),
  94. div
  95. (
  96. span
  97. (
  98. setClass('text-sm text-gray'),
  99. $lang->allProgress,
  100. btn
  101. (
  102. set::size('sm'),
  103. set::icon('help'),
  104. setClass('ghost form-label-hint text-gray-300 ml-2'),
  105. toggle::tooltip(array('title' => $lang->execution->progressTip, 'className' => 'text-gray border border-gray-300', 'type' => 'white', 'placement' => 'right'))
  106. )
  107. )
  108. )
  109. )
  110. )
  111. ),
  112. div
  113. (
  114. setClass('flex-none w-2/3'),
  115. div
  116. (
  117. setClass('flex items-center'),
  118. label
  119. (
  120. setClass('label rounded-full ring-gray-400 gray-300-pale'),
  121. $research->id
  122. ),
  123. span
  124. (
  125. setClass('text-md font-bold ml-2 clip'),
  126. set::title($research->name),
  127. $research->name
  128. ),
  129. $research->deleted ? label
  130. (
  131. setClass('danger-outline text-danger flex-none ml-2'),
  132. $lang->research->deleted
  133. ) : null,
  134. isset($research->delay) ? label
  135. (
  136. setClass("ml-2 flex-none danger-pale"),
  137. $lang->marketresearch->delayed
  138. ) : label
  139. (
  140. setClass("ml-2 flex-none bg-white status status-{$research->status}"),
  141. $status
  142. ),
  143. span
  144. (
  145. setClass('ml-2 text-gray flex-none acl'),
  146. $lang->marketresearch->shortAclList[$research->acl],
  147. btn
  148. (
  149. set::size('sm'),
  150. set::icon('help'),
  151. setClass('ghost form-label-hint text-gray-300 ml-2'),
  152. toggle::tooltip(array('title' => $lang->marketresearch->aclList[$research->acl], 'className' => 'text-gray border border-gray-300', 'type' => 'white', 'placement' => 'right'))
  153. )
  154. )
  155. ),
  156. div
  157. (
  158. set::className('detail-content mt-4 overflow-hidden desc-box'),
  159. set::title(strip_tags($research->desc)),
  160. html($research->desc)
  161. )
  162. )
  163. ),
  164. div
  165. (
  166. setClass('flex flex-auto p-4 mt-4 canvas'),
  167. div
  168. (
  169. setClass('w-full'),
  170. /* Project team. */
  171. h::table
  172. (
  173. setClass('table condensed bordered teams ' . ($research->hasProduct ? 'mt-4' : '')),
  174. h::thead
  175. (
  176. h::tr
  177. (
  178. h::th
  179. (
  180. div
  181. (
  182. setClass('flex items-center justify-between'),
  183. span($lang->marketresearch->common . $lang->project->team),
  184. hasPriv('marketresearch', 'team') ? btn
  185. (
  186. setClass('ghost text-gray'),
  187. set::trailingIcon('caret-right pb-0.5'),
  188. set::url(createLink('marketresearch', 'team', "researchID={$research->id}")),
  189. span($lang->more, setClass('font-normal'))
  190. ) : null
  191. )
  192. )
  193. )
  194. ),
  195. h::tbody
  196. (
  197. h::tr
  198. (
  199. h::td(div(setClass('flex flex-wrap member-list pt-2'), $membersDom))
  200. )
  201. )
  202. ),
  203. /* Estimate statistics. */
  204. h::table
  205. (
  206. setClass('table condensed bordered mt-4 duration'),
  207. h::thead
  208. (
  209. h::tr
  210. (
  211. h::th
  212. (
  213. div(setClass('flex items-center justify-between'), span($lang->execution->DurationStats))
  214. )
  215. )
  216. ),
  217. h::tbody
  218. (
  219. h::tr
  220. (
  221. h::td
  222. (
  223. div
  224. (
  225. setClass('flex flex-wrap pt-2 mx-4'),
  226. div
  227. (
  228. setClass('w-1/4'),
  229. span(setClass('text-gray'), $lang->project->begin),
  230. span(setClass('ml-2'), $research->begin)
  231. ),
  232. div
  233. (
  234. setClass('w-1/4'),
  235. span(setClass('text-gray'), $lang->project->end),
  236. span
  237. (
  238. setClass('ml-2'),
  239. $research->end = $research->end == LONG_TIME ? $this->lang->project->longTime : $research->end
  240. )
  241. ),
  242. div
  243. (
  244. setClass('w-1/4'),
  245. span(setClass('text-gray'), $lang->project->realBeganAB),
  246. span
  247. (
  248. setClass('ml-2'),
  249. helper::isZeroDate($research->realBegan) ? '' : $research->realBegan
  250. )
  251. ),
  252. div
  253. (
  254. setClass('w-1/4'),
  255. span(setClass('text-gray'), $lang->project->realEndAB),
  256. span
  257. (
  258. setClass('ml-2'),
  259. helper::isZeroDate($research->realEnd) ? '' : $research->realEnd
  260. )
  261. )
  262. )
  263. )
  264. )
  265. )
  266. ),
  267. h::table
  268. (
  269. setClass('table condensed bordered mt-4 estimate'),
  270. h::thead
  271. (
  272. h::tr
  273. (
  274. h::th
  275. (
  276. div(setClass('flex items-center justify-between'), span($lang->execution->lblStats))
  277. )
  278. )
  279. ),
  280. h::tbody
  281. (
  282. h::tr
  283. (
  284. h::td
  285. (
  286. div
  287. (
  288. setClass('flex flex-wrap pt-2 mx-4'),
  289. div
  290. (
  291. setClass('w-1/4'),
  292. span(setClass('text-gray'), $lang->execution->estimateHours),
  293. span(setClass('ml-2'), (float)$research->estimate . 'h')
  294. ),
  295. div
  296. (
  297. setClass('w-1/4'),
  298. span(setClass('text-gray'), $lang->execution->consumedHours),
  299. span(setClass('ml-2'), (float)$research->consumed . 'h')
  300. ),
  301. div
  302. (
  303. setClass('w-1/4'),
  304. span(setClass('text-gray'), $lang->execution->leftHours),
  305. span(setClass('ml-2'), (float)$research->left . 'h')
  306. ),
  307. div
  308. (
  309. setClass('w-1/4'),
  310. span(setClass('text-gray'), $lang->execution->totalHours),
  311. span(setClass('ml-2'), (float)$research->left . 'h')
  312. )
  313. )
  314. )
  315. )
  316. )
  317. ),
  318. html($this->printExtendFields($research, 'html', 'position=info', false))
  319. )
  320. )
  321. ),
  322. cell
  323. (
  324. setClass('side ml-4'),
  325. panel
  326. (
  327. setID('dynamicBlock'),
  328. to::heading
  329. (
  330. div
  331. (
  332. set('class', 'panel-title text-md font-bold'),
  333. $lang->execution->latestDynamic
  334. )
  335. ),
  336. set::bodyClass('pt-0 h-80 overflow-y-auto'),
  337. set::shadow(false),
  338. dynamic()
  339. ),
  340. html($this->printExtendFields($research, 'html', 'position=basic', false)),
  341. div
  342. (
  343. setID('historyBlock'),
  344. setClass('mt-4'),
  345. history
  346. (
  347. set::objectID($research->id),
  348. set::commentUrl(createLink('action', 'comment', array('objectType' => 'marketresearch', 'objectID' => $research->id))),
  349. set::bodyClass('maxh-80 overflow-y-auto')
  350. )
  351. )
  352. )
  353. );
  354. $config->project->actionList['edit']['url']['params'] = 'projectID={id}&from=view';
  355. $actions = $this->loadModel('common')->buildOperateMenu($research);
  356. div
  357. (
  358. setClass('w-2/3 center fixed actions-menu'),
  359. floatToolbar
  360. (
  361. isAjaxRequest('modal') ? null : to::prefix(backBtn(set::icon('back'), $lang->goback)),
  362. set::main($actions['mainActions']),
  363. set::suffix($actions['suffixActions']),
  364. set::object($research)
  365. )
  366. );