assess.html.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <?php
  2. /**
  3. * The assess view file of review module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
  6. * @license ZPL (http://zpl.pub/page/zplv12.html)
  7. * @author Yidong Wang <yidong@cnezsoft.com>
  8. * @package review
  9. * @version $Id$
  10. * @link http://www.zentao.net
  11. */
  12. namespace zin;
  13. $sideWidth = '600';
  14. featureBar
  15. (
  16. to::leading(array(backBtn(set::icon('back'), set::className('primary-outline'), set::url(createLink('review', 'browse', "reviewID=$review->project")), $lang->goback))),
  17. entityTitle(set::titleClass('text-lg text-clip font-bold'), setID((string)$review->id), set::object($review), set::type('review'), set::title($review->title))
  18. );
  19. $reviewModel = $this->review;
  20. $projectchange = $review->type == 'projectchange' ? $projectchange : null;
  21. $buildSideBar = function($review, $viewData) use ($sideWidth, $reviewModel, $projectchange, $users)
  22. {
  23. global $app, $lang, $config;
  24. $nodes = array();
  25. if($review->type == 'projectchange')
  26. {
  27. $nodes[] = section
  28. (
  29. set::title($lang->projectchange->basicInfo),
  30. h::table
  31. (
  32. setClass('table condensed borderless'),
  33. h::tbody
  34. (
  35. h::tr
  36. (
  37. h::td
  38. (
  39. div(setClass('flex flex-wrap pt-2'), div
  40. (
  41. setClass('w-1/3'),
  42. span(setClass('text-gray'), $lang->projectchange->urgency),
  43. span(setClass('ml-2'), zget($lang->projectchange->urgencyList, $projectchange->urgency))
  44. ), div
  45. (
  46. setClass('w-1/3'),
  47. span(setClass('text-gray'), $lang->projectchange->type),
  48. span(setClass('ml-2'), zget($lang->projectchange->typeList, $projectchange->type))
  49. ), div
  50. (
  51. setClass('w-1/3'),
  52. span(setClass('text-gray'), $lang->projectchange->deadline),
  53. span(setClass('ml-2'), formatTime($projectchange->deadline, DT_DATE1))
  54. ))
  55. )
  56. )
  57. )
  58. )
  59. );
  60. $nodes[] = section
  61. (
  62. set::title($lang->projectchange->deliverable),
  63. empty($review->deliverables) ? div
  64. (
  65. setClass('dtable-empty-tip'),
  66. span
  67. (
  68. setClass('text-gray'),
  69. $lang->noData
  70. )
  71. ) : dtable
  72. (
  73. set::cols($config->projectchange->deliverable->dtable->fieldList),
  74. set::data($review->deliverables),
  75. set::userMap($users)
  76. )
  77. );
  78. $nodes[] = section
  79. (
  80. set::title($lang->projectchange->reason),
  81. set::content($projectchange->reason)
  82. );
  83. $nodes[] = section
  84. (
  85. set::title($lang->projectchange->desc),
  86. html($projectchange->desc)
  87. );
  88. if(!empty($projectchange->files)) $nodes[] = fileList(set::files($projectchange->files), set::padding(false));
  89. return $nodes;
  90. }
  91. if(empty($review->deliverables))
  92. {
  93. $reviewData = json_decode($review->data, true);
  94. $showWithPageEditor = isset($reviewData['$migrate']) && $reviewData['$migrate'] == 'html';
  95. if(!empty($viewData->bookID) && !$showWithPageEditor)
  96. {
  97. $nodes[] = div
  98. (
  99. setID('bookTree'),
  100. treeEditor(set::items($reviewModel->buildBookTree($viewData->book, $viewData->review, zget($viewData, 'docID', 0))), set::canSplit(false))
  101. );
  102. }
  103. elseif(!$showWithPageEditor && $review->oldCategory == 'PP')
  104. {
  105. $from = 'doc';
  106. $ganttType = $viewData->type;
  107. $productID = $review->product;
  108. $projectID = $review->project;
  109. $reviewID = $review->id;
  110. include $app->getModuleRoot() . 'programplan/ui/ganttfields.html.php';
  111. data('showFields', 'PM,status,deadline');
  112. $ganttFields['column_text'] = $lang->programplan->ganttBrowseType['gantt'];
  113. $nodes[] = gantt
  114. (
  115. set('ganttLang', $ganttLang),
  116. set('ganttFields', $ganttFields),
  117. set('showChart', false),
  118. set('colsWidth', $sideWidth),
  119. set('options', $viewData->plans)
  120. );
  121. }
  122. elseif($showWithPageEditor)
  123. {
  124. $nodes[] = pageEditor
  125. (
  126. set::size('auto'),
  127. set::readonly(true),
  128. set::content($review->data)
  129. );
  130. }
  131. else
  132. {
  133. $linkedDoc = !empty($viewData->doc) ? $viewData->doc : null;
  134. if($linkedDoc)
  135. {
  136. $contentType = $linkedDoc->contentType;
  137. $nodes[] = section
  138. (
  139. set::title($linkedDoc->title . ' ' . $review->version),
  140. div
  141. (
  142. setClass('article-content'),
  143. setID($linkedDoc->contentType == 'markdown' ? 'markdownContent' : null),
  144. $contentType === 'doc' ? pageEditor
  145. (
  146. set::size('auto'),
  147. set::readonly(true),
  148. set::value(isset($linkedDoc->rawContent) ? $linkedDoc->rawContent : $linkedDoc->content)
  149. ) : editor
  150. (
  151. set::resizable(false),
  152. set::markdown($linkedDoc->contentType == 'markdown'),
  153. set::readonly(true),
  154. set::hideUI(true),
  155. set::size('auto'),
  156. html($linkedDoc->content)
  157. )
  158. )
  159. );
  160. }
  161. }
  162. if(!empty($viewData->doc) && !empty($viewData->doc->files)) $nodes[] = fileList(set::files($viewData->doc->files), set::padding(false));
  163. }
  164. else
  165. {
  166. $i = 0;
  167. $titleAction['items'][] = array('size' => 'xs', 'type' => 'ghost', 'class' => 'mr-2', 'data-on' => 'click', 'data-call' => 'toggleDetail', 'data-params' => 'event');
  168. foreach($review->deliverables as $deliverable)
  169. {
  170. if($i == 0)
  171. {
  172. $titleAction['items'][0]['icon'] = 'angle-top';
  173. }
  174. else
  175. {
  176. $titleAction['items'][0]['icon'] = 'angle-down';
  177. }
  178. $className = $i == 0 ? '' : 'hidden';
  179. $title = $deliverable->name . ' ' . $deliverable->version;
  180. $deliverableData = !empty($deliverable->data) ? json_decode($deliverable->data, true) : array();
  181. $showWithPageEditor = isset($deliverableData['$migrate']) && $deliverableData['$migrate'] == 'html';
  182. if($deliverable->doc && !$showWithPageEditor)
  183. {
  184. $nodes[] = section
  185. (
  186. set::title($title),
  187. set::titleActions($titleAction),
  188. div
  189. (
  190. setClass("article-content $className"),
  191. pageEditor
  192. (
  193. set::size('auto'),
  194. set::readonly(true),
  195. set::value(isset($deliverable->doc->rawContent) ? $deliverable->doc->rawContent : $deliverable->doc->content)
  196. )
  197. )
  198. );
  199. if(!empty($deliverable->doc->files)) $nodes[] = fileList(set::files($deliverable->doc->files), set::padding(false));
  200. }
  201. elseif($showWithPageEditor)
  202. {
  203. $nodes[] = section
  204. (
  205. set::title($title),
  206. set::titleActions($titleAction),
  207. div
  208. (
  209. setClass("article-content $className"),
  210. pageEditor
  211. (
  212. set::size('auto'),
  213. set::readonly(true),
  214. set::value($deliverable->data)
  215. )
  216. )
  217. );
  218. }
  219. $i ++;
  220. }
  221. }
  222. if(!empty($review->files)) $nodes[] = fileList(set::files($review->files), set::padding(false));
  223. return $nodes;
  224. };
  225. sidebar
  226. (
  227. set::width($sideWidth + 10),
  228. set::maxWidth($sideWidth + 10),
  229. set::minWidth(0),
  230. set::toggleBtn(false),
  231. $buildSideBar($review, $this->view)
  232. );
  233. if($setReviewer) $reviewer = strpos($setReviewer, 'pending-') !== false ? substr($setReviewer, 8) : $setReviewer;
  234. $reviewclHtml = '';
  235. if(!empty($reviewcl))
  236. {
  237. $reviewclGroup = array();
  238. foreach($reviewcl as $list)
  239. {
  240. $reviewclGroup[$list->category][] = $list;
  241. }
  242. $reviewclHtml = "<table class='table bordered condensed reviewcl'>";
  243. $reviewclHtml .= "<caption class='text-left pb-2'>{$lang->review->reviewcl}</caption>";
  244. $reviewclHtml .= "<thead><tr><th class='w-1/2'>{$lang->review->listItem}</th><th class='w-1/2'>{$lang->review->listResult}</th></tr></thead>";
  245. $reviewclHtml .= '<tbody>';
  246. foreach($reviewclGroup as $category => $lists)
  247. {
  248. $btn = '<button class="toolbar-item mr-2 btn square ghost size-xs" data-on="click" data-call="toggleOpinion" data-params="event" type="button"><i class="icon icon-angle-top"></i></button>';
  249. $reviewclHtml .= "<tr><td class='text-left font-bold' colspan='2' id='category-{$category}'>" . zget($categoryList, $category) . $btn . '</td></tr>';
  250. foreach($lists as $list)
  251. {
  252. $reviewclHtml .= "<tr class='category-{$category}'>";
  253. $reviewclHtml .= "<td>" . $list->title . '</td>';
  254. $reviewclHtml .= "<td>";
  255. $reviewclHtml .= html::radio("issueResult[$list->id]", $lang->review->checkList, '1', "class='issueResult' onchange='toggleOption(this)'", 'inline');
  256. $reviewclHtml .= "<div class='flex items-center issue-opinion hidden'>";
  257. $reviewclHtml .= "<input name='issueOpinion[$list->id][]' class='w-full form-control opinion'>";
  258. $reviewclHtml .= "<a class='btn btn-sm btn-link add-issue-opinion'><i class='icon icon-plus'></i></a>";
  259. $reviewclHtml .= "<a class='btn btn-sm btn-link del-issue-opinion' style='visibility: hidden;'><i class='icon icon-trash'></i></a>";
  260. $reviewclHtml .= '</div>';
  261. $reviewclHtml .= '</td>';
  262. $reviewclHtml .= '</tr>';
  263. }
  264. }
  265. $reviewclHtml .= '</tbody></table>';
  266. }
  267. $issueCols = $this->config->review->issue->dtable->fieldList;
  268. $issues = array_values($review->issues);
  269. $issueCols['createdBy']['map'] = $users;
  270. $approvalType = '';
  271. $approvalObjectID = 0;
  272. if(in_array($review->type, array('deliverable', 'decision')))
  273. {
  274. $approvalType = 'review';
  275. $approvalObjectID = $review->id;
  276. }
  277. else
  278. {
  279. $approvalType = $review->type;
  280. $approvalObjectID = $review->object;
  281. }
  282. panel
  283. (
  284. tabs
  285. (
  286. tabPane
  287. (
  288. setClass('panel-form'),
  289. set::key('review-opinion'),
  290. set::title($lang->review->finalOpinion),
  291. set::active(true),
  292. form
  293. (
  294. set::actions(array()),
  295. set::labelWidth('100px'),
  296. setID('reviewForm'),
  297. !empty($reviewcl) ? formRow
  298. (
  299. setID('reviewrc'),
  300. set::width('full'),
  301. html($reviewclHtml)
  302. ) : null,
  303. $setReviewer ? formGroup
  304. (
  305. set::width('1/3'),
  306. set::label($lang->review->setReviewer),
  307. set::name('setReviewer'),
  308. set::value($reviewer),
  309. set::control('picker'),
  310. set::items($users)
  311. ) : null,
  312. formGroup
  313. (
  314. set::width('full'),
  315. set::label($lang->review->reviewResult),
  316. set::name('result'),
  317. set::value(isset($result->result) ? $result->result : 'pass'),
  318. set::control('radioListInline'),
  319. set::items($lang->review->resultList)
  320. ),
  321. formRow
  322. (
  323. formGroup(set::width('1/3'), set::label($lang->review->reviewedDate), set::name('createdDate'), set::value(helper::today()), set::control('datePicker')),
  324. formGroup
  325. (
  326. set::width('1/3'),
  327. set::label($lang->review->consumed),
  328. inputControl
  329. (
  330. input(set::name('consumed'), set::value(isset($result->consumed) ? $result->consumed : 0)),
  331. to::suffix($lang->task->suffixHour),
  332. set::suffixWidth(20)
  333. )
  334. )
  335. ),
  336. formGroup(set::width('full'), set::label($lang->review->finalOpinion), set::name('opinion'), set::value(isset($result->opinion) ? $result->opinion : ''), set::control('editor')),
  337. formGroup
  338. (
  339. set::width('full'),
  340. set::label($lang->files),
  341. fileSelector()
  342. ),
  343. $review->deleted ? null : toolbar(setClass('review-actions toolbar form-actions form-group no-label'), btn(set(array('text' => $lang->save, 'btnType' => 'submit', 'type' => 'primary'))), isset($currentNode->priv) && in_array('revert', $currentNode->priv) ? btn(set(array('text' => $lang->approval->revert, 'url' => createLink('approval', 'revert', "objectType={$approvalType}&objectID={$approvalObjectID}"), 'innerClass' => 'revert-btn', 'data-toggle' => 'modal'))) : null, isset($currentNode->priv) && in_array('forward', $currentNode->priv) ? btn(set(array('text' => $lang->approval->forward, 'url' => createLink('approval', 'forward', "objectType={$approvalType}&objectID={$approvalObjectID}"), 'innerClass' => 'forward-btn', 'data-toggle' => 'modal'))) : null, isset($currentNode->priv) && in_array('addnode', $currentNode->priv) ? btn(set(array('text' => $lang->approval->addNode, 'url' => createLink('approval', 'addNode', "objectType={$approvalType}&objectID={$approvalObjectID}"), 'innerClass' => 'forward-btn', 'data-toggle' => 'modal'))) : null, hasPriv('approval', 'progress') ? btn(set(array('text' => $lang->approval->progress, 'url' => createLink('approval', 'progress', "approvalID={$approval->id}"), 'data-toggle' => 'modal'))) : null)
  344. )
  345. ),
  346. $review->type != 'projectchange' ? tabPane
  347. (
  348. set::key('review-issue'),
  349. set::title($lang->review->issueList),
  350. set::active(false),
  351. dtable
  352. (
  353. set::cols($issueCols),
  354. set::data($issues),
  355. set::sortType(false)
  356. )
  357. ) : null
  358. )
  359. );
  360. history(set::objectID((int)$reviewID));