view.html.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. /**
  3. * The view view file of ticket 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 Mengyi Liu
  7. * @package ticket
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. $getModulePath = function() use($modulePath, $lang)
  12. {
  13. if(empty($modulePath)) return array('moduleTitle' => '/', 'printModule' => '/');
  14. $moduleTitle = '';
  15. $printModule = '';
  16. foreach($modulePath as $key => $module)
  17. {
  18. $moduleTitle .= $module->name;
  19. $printModule .= $module->name;
  20. if(isset($modulePath[$key + 1]))
  21. {
  22. $moduleTitle .= '/';
  23. $printModule .= ' / ';
  24. }
  25. }
  26. return array('moduleTitle' => $moduleTitle, 'printModule' => $printModule);
  27. };
  28. $getBasicInfoItems = function($ticket) use($product, $products, $getModulePath, $modulePath, $users, $feedback, $builds)
  29. {
  30. global $app, $lang;
  31. $canViewProduct = hasPriv('product', 'view') && in_array($ticket->product, explode(',', $app->user->view->products)) && isset($products[$ticket->product]) && !$product->shadow;
  32. $modulePath = $getModulePath($modulePath);
  33. $mailtoList = '';
  34. foreach(explode(',', str_replace(' ', '', $ticket->mailto)) as $account) $mailtoList .= zget($users, $account) . ' ';
  35. $feedbackTitle = isset($feedback->id) && isset($feedback->title) ? "#{$feedback->id} {$feedback->title}" : '';
  36. $feedbackTitle = hasPriv('feedback', 'adminView') ? array('control' => 'link', 'text' => $feedbackTitle, 'url' => createLink('feedback', 'adminView', "ticketID=$ticket->feedback")) : $feedbackTitle;
  37. $openedBuilds = '';
  38. if(!empty($ticket->openedBuild))
  39. {
  40. foreach(explode(',', str_replace(' ', '', $ticket->openedBuild)) as $openedBuild) $openedBuilds .= zget($builds, $openedBuild) . ' ';
  41. $openedBuilds = trim($openedBuilds);
  42. }
  43. $items = array();
  44. $items[$lang->ticket->product] = $canViewProduct ? array('control' => 'link', 'url' => createLink('product', 'view', "productID={$ticket->product}"), 'text' => $product->name) : $product->name;
  45. $items[$lang->ticket->module] = array('control' => 'text', 'content' => $modulePath['printModule'], 'title' => $modulePath['moduleTitle'], 'id' => 'moduleBox');
  46. $items[$lang->ticket->openedBuild] = array('control' => 'text', 'content' => $openedBuilds, 'title' => $openedBuilds);
  47. $items[$lang->ticket->type] = zget($lang->ticket->typeList, $ticket->type, '');
  48. $items[$lang->ticket->source] = !empty($ticket->feedback) ? $feedbackTitle : '';
  49. $items[$lang->ticket->status] = array('control' => 'status', 'class' => "status-ticket", 'status' => $ticket->status, 'text' => zget($lang->ticket->statusList, $ticket->status, ''));
  50. $items[$lang->ticket->pri] = array('control' => 'pri', 'pri' => $ticket->pri, 'text' => zget($lang->ticket->priList, $ticket->pri, ''));
  51. $items[$lang->ticket->openedBy] = zget($users, $ticket->openedBy) . ' ' . $lang->at . ' ' . $ticket->openedDate;
  52. $items[$lang->ticket->assignedTo] = zget($users, $ticket->assignedTo);
  53. $items[$lang->ticket->keywords] = $ticket->keywords;
  54. $items[$lang->ticket->mailto] = $mailtoList;
  55. $items[$lang->ticket->estimate] = $ticket->estimate . $lang->workingHour;
  56. $items[$lang->ticket->consumed] = $ticket->consumed . $lang->workingHour;
  57. $items[$lang->ticket->deadline] = !helper::isZeroDate($ticket->deadline) ? $ticket->deadline : '';
  58. return $items;
  59. };
  60. $getLifeItems = function($ticket) use($users)
  61. {
  62. global $lang;
  63. $items = array();
  64. $items[$lang->ticket->createdByAB] = zget($users, $ticket->openedBy) . $lang->at . $ticket->openedDate;
  65. $items[$lang->ticket->assignedTo] = $ticket->assignedTo && $ticket->assignedTo != 'closed' ? zget($users, $ticket->assignedTo) . $lang->at . $ticket->assignedDate : '';
  66. $items[$lang->ticket->startedBy] = $ticket->startedBy ? zget($users, $ticket->startedBy) . $lang->at . $ticket->startedDate : '';
  67. $items[$lang->ticket->finishedByAB] = $ticket->finishedBy ? zget($users, $ticket->finishedBy) . $lang->at . $ticket->finishedDate : '';
  68. $items[$lang->ticket->closedByAB] = $ticket->closedBy ? zget($users, $ticket->closedBy) . $lang->at . $ticket->closedDate : '';
  69. $items[$lang->ticket->closedReason] = zget($lang->ticket->closedReasonList, $ticket->closedReason);
  70. $items[$lang->ticket->activatedBy] = $ticket->activatedBy ? zget($users, $ticket->activatedBy) . $lang->at . $ticket->activatedDate : '';
  71. $items[$lang->ticket->activatedCount] = $ticket->activatedCount ? (string)$ticket->activatedCount : '';
  72. $items[$lang->ticket->editedByAB] = $ticket->editedBy ? zget($users, $ticket->editedBy) . $lang->at . $ticket->editedDate : '';
  73. return $items;
  74. };
  75. $getContactItems = function($ticketSources)
  76. {
  77. global $lang;
  78. $items = array();
  79. foreach($ticketSources as $ticketSource)
  80. {
  81. $items[] = array('label' => $lang->ticket->customer, 'children' => $ticketSource->customer);
  82. $items[] = array('label' => $lang->ticket->contact, 'children' => $ticketSource->contact);
  83. $items[] = array('label' => $lang->ticket->notifyEmail, 'children' => $ticketSource->notifyEmail);
  84. }
  85. return $items;
  86. };
  87. $sections = array();
  88. $sections[] = setting()
  89. ->title($lang->ticket->desc)
  90. ->control('html')
  91. ->content(empty($ticket->desc) ? $lang->noDesc : $ticket->desc);
  92. if(!empty($feedback))
  93. {
  94. $cols = array();
  95. $cols['id'] = $config->feedback->dtable->fieldList['id'];
  96. $cols['title'] = $config->feedback->dtable->fieldList['title'];
  97. $cols['status'] = $config->feedback->dtable->fieldList['status'];
  98. $cols['title']['width'] = '550px';
  99. $cols['status']['width'] = '100px';
  100. $sections[] = setting()
  101. ->title($lang->ticket->fromFeedback)
  102. ->control('dtable')
  103. ->extensible(false)
  104. ->cols($cols)
  105. ->data(array($feedback));
  106. }
  107. $sections[] = setting()
  108. ->control('fileList')
  109. ->fileTitle($lang->ticket->descFiles)
  110. ->files($ticket->createFiles)
  111. ->extra('create')
  112. ->showDelete(false)
  113. ->padding(false)
  114. ->object($ticket);
  115. if(!empty($ticket->resolution))
  116. {
  117. $sections[] = setting()
  118. ->title($lang->ticket->resolution)
  119. ->control('html')
  120. ->content($ticket->resolution);
  121. $sections[] = setting()
  122. ->control('fileList')
  123. ->fileTitle($lang->ticket->resolutionFiles)
  124. ->files($ticket->finishFiles)
  125. ->extra('finished')
  126. ->showDelete(false)
  127. ->padding(false)
  128. ->object($ticket);
  129. }
  130. $tabs = array();
  131. $tabs[] = setting()
  132. ->group('basic')
  133. ->title($lang->ticket->legendBasicInfo)
  134. ->control('datalist')
  135. ->items($getBasicInfoItems($ticket));
  136. $tabs[] = setting()
  137. ->group('basic')
  138. ->title($lang->ticket->legendLife)
  139. ->control('datalist')
  140. ->labelWidth($app->getClientLang() == 'en' ? '100' : '68')
  141. ->items($getLifeItems($ticket));
  142. $tabs[] = setting()
  143. ->group('contacts')
  144. ->title($lang->custom->relateObject)
  145. ->control('relatedObjectList')
  146. ->objectID($ticket->id)
  147. ->objectType('ticket')
  148. ->browseType('byObject');
  149. $tabs[] = setting()
  150. ->group('contacts')
  151. ->title($lang->ticket->contacts)
  152. ->control('datalist')
  153. ->items($getContactItems($ticketSources));
  154. $config->ticket->actionList['createBug']['url']['params'] = "product={$ticket->product}&branch=0&extra=projectID=0,fromType=ticket,fromID={id}";
  155. $config->ticket->actionList['createStory']['url']['params'] = "product={$ticket->product}&branch=0&moduleID=0&storyID=0&executionID=0&bugID=0&planID=0&todoID=0&extra=fromType=ticket,fromID={id}";
  156. foreach($config->ticket->actions->view['mainActions'] as $key => $actionName)
  157. {
  158. if(in_array($actionName, array('createStory', 'createBug')) && !common::hasPriv('ticket', $actionName)) unset($config->ticket->actions->view['mainActions'][$key]);
  159. }
  160. $operateList = $ticket->deleted ? array() : $this->loadModel('common')->buildOperateMenu($ticket);
  161. $actions = $ticket->deleted ? array() : array_merge($operateList['mainActions'], !empty($operateList['suffixActions']) && !empty($operateList['suffixActions']) ? array(array('type' => 'divider')) : array(), $operateList['suffixActions']);
  162. detail
  163. (
  164. to::title
  165. (
  166. label(zget($lang->ticket->statusList, $ticket->status), setClass("status-{$ticket->status} size-sm")),
  167. label($product->name, setClass('secondary size-sm'))
  168. ),
  169. set::objectType('ticket'),
  170. set::sections($sections),
  171. set::tabs($tabs),
  172. set::actions(array_values($actions))
  173. );
  174. render();