v1.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. namespace zin;
  3. require_once dirname(__DIR__) . DS . 'datalist' . DS . 'v1.php';
  4. class caseBasicInfo extends wg
  5. {
  6. /**
  7. * @var mixed[]
  8. */
  9. protected static $defineProps = array
  10. (
  11. 'case' => '?object' // 当前用例。
  12. );
  13. protected function getStage($case)
  14. {
  15. global $lang;
  16. $caseStage = array();
  17. if($case->stage)
  18. {
  19. foreach(explode(',', $case->stage) as $stage)
  20. {
  21. if(empty($stage)) continue;
  22. $caseStage[] = div(zget($lang->testcase->stageList, $stage));
  23. }
  24. }
  25. return div($caseStage);
  26. }
  27. protected function getModule($case)
  28. {
  29. global $app;
  30. $modulePath = $this->prop('modulePath', data('modulePath'));
  31. $caseModule = $this->prop('caseModule', data('caseModule'));
  32. $isLibCase = $this->prop('isLibCase', data('isLibCase'));
  33. $tab = $app->tab;
  34. $moduleItems = array();
  35. if(!empty($modulePath))
  36. {
  37. $canBrowseCaselib = hasPriv('caselib', 'browse');
  38. $canBrowseTestCase = hasPriv('testcase', 'browse');
  39. $canBrowseProjectTestCase = hasPriv('testcase', 'browse');
  40. if($caseModule->branch && isset($branches[$caseModule->branch]))
  41. {
  42. $moduleItems[] = $branches[$caseModule->branch];
  43. $moduleItems[] = icon('angle-right');
  44. }
  45. foreach($modulePath as $key => $module)
  46. {
  47. if($tab == 'qa' || $tab == 'ops')
  48. {
  49. if($isLibCase)
  50. {
  51. $moduleItems[] = $canBrowseCaselib ? a(set::href(createLink('caselib', 'browse', "libID={$case->lib}&browseType=byModule&param={$module->id}")), $module->name) : $module->name;
  52. }
  53. else
  54. {
  55. $moduleItems[] = $canBrowseTestCase ? a(set::href(createLink('testcase', 'browse', "productID={$case->product}&branch={$module->branch}&browseType=byModule&param={$module->id}")), $module->name) : $module->name;
  56. }
  57. }
  58. else if($tab == 'project')
  59. {
  60. $moduleItems[] = $canBrowseProjectTestCase ? a(set::href(createLink('project', 'testcase', "projectID={$app->session->project}&productID=$case->product&branch=$module->branch&browseType=byModule&param=$module->id")), $module->name) : $module->name;
  61. }
  62. else
  63. {
  64. $moduleItems[] = $module->name;
  65. }
  66. if(isset($modulePath[$key + 1])) $moduleItems[] = icon('angle-right');
  67. }
  68. }
  69. return empty($modulePath) ? array('/') : $moduleItems;
  70. }
  71. protected function getFromCase($case)
  72. {
  73. if(!isset($case->linkCaseTitles)) $case->linkCaseTitles = array();
  74. $linkCaseTitles = array();
  75. foreach($case->linkCaseTitles as $linkCaseID => $linkCaseTitle)
  76. {
  77. $linkCaseTitles[] = a
  78. (
  79. set::href(createLink('testcase', 'view', "caseID={$linkCaseID}", '', true)),
  80. setData(array('toggle' => 'modal')),
  81. "#{$linkCaseID} {$linkCaseTitle}"
  82. );
  83. }
  84. return $linkCaseTitles;
  85. }
  86. protected function getStory($case)
  87. {
  88. global $app, $lang;
  89. $tab = $app->tab;
  90. $storyText = isset($case->storyTitle) ? "#{$case->story}:{$case->storyTitle}" : '';
  91. $param = $tab == 'project' ? "&version=0&projectID={$app->session->project}" : '';
  92. $story = array();
  93. $story[] = hasPriv('story', 'view') ? a(set::href(createLink('story', 'view', "storyID={$case->story}{$param}")), setData(array('toggle' => 'modal', 'size' => 'lg')), $storyText) : $storyText;
  94. if($case->story && $case->storyStatus == 'active' && $case->latestStoryVersion > $case->storyVersion)
  95. {
  96. $story[] = span
  97. (
  98. '(',
  99. $lang->story->changed,
  100. common::hasPriv('testcase', 'confirmStoryChange', $case) ? a
  101. (
  102. set::href(createLink('testcase', 'confirmStoryChange', "caseID={$case->id}")),
  103. setData('app', $tab),
  104. setClass('mx-1 px-1 primary-pale'),
  105. $lang->confirm
  106. ) : '',
  107. ')'
  108. );
  109. $story = array(div(setStyle(array('text-wrap' => 'wrap')), $story));
  110. }
  111. return $story;
  112. }
  113. protected function getStatus($case)
  114. {
  115. global $app, $lang;
  116. $from = $this->prop('from', data('from'));
  117. $taskID = $this->prop('taskID', data('taskID'));
  118. $suiteID = $this->prop('suiteID', data('suiteID'));
  119. $status = array();
  120. $status[] = $app->control->processStatus('testcase', $case);
  121. if($from == 'testtask' && $case->version > $case->currentVersion)
  122. {
  123. $status[] = span
  124. (
  125. set('title', $lang->testcase->fromTesttask),
  126. ' (',
  127. $lang->testcase->changed,
  128. hasPriv('testcase', 'confirmchange') ? a(setClass('btn size-xs primary-pale mx-1 ajax-submit'), set::href(createLink('testcase', 'confirmchange', "caseID=$case->id&taskID=$taskID")), $lang->testcase->sync) : '',
  129. ')'
  130. );
  131. }
  132. if($from == 'testsuite' && $case->version > $case->currentVersion)
  133. {
  134. $status[] = span
  135. (
  136. set('title', $lang->testcase->fromTestsuite),
  137. ' (',
  138. $lang->testcase->changed,
  139. hasPriv('testsuite', 'confirmCaseChange') ? a(setClass('btn size-xs primary-pale mx-1 ajax-submit'), set::href(createLink('testsuite', 'confirmCaseChange', "caseID=$case->id&suiteID=$suiteID&from=view")), $lang->testcase->sync) : '',
  140. ')'
  141. );
  142. }
  143. if(isset($case->fromCaseVersion) && $case->fromCaseVersion > $case->version && $from != 'testtask' && !empty($case->product))
  144. {
  145. $status[] = span
  146. (
  147. set('title', $lang->testcase->fromCaselib),
  148. ' (',
  149. $lang->testcase->changed,
  150. hasPriv('testcase', 'confirmLibcaseChange') ? a(setClass('btn size-xs primary-pale mx-1 ajax-submit'), set::href(createLink('testcase', 'confirmLibcaseChange', "caseID={$case->id}&libcaseID={$case->fromCaseID}")), $lang->testcase->sync) : '',
  151. hasPriv('testcase', 'ignoreLibcaseChange') ? a(setClass('btn size-xs primary-pale mx-1 ajax-submit'), set::href(createLink('testcase', 'ignoreLibcaseChange', "caseID={$case->id}")), $lang->testcase->ignore) : '',
  152. ')'
  153. );
  154. }
  155. return $status;
  156. }
  157. protected function getItems()
  158. {
  159. global $lang;
  160. $case = $this->prop('case', data('case'));
  161. if(!$case) return array();
  162. $isLibCase = $this->prop('isLibCase', data('isLibCase'));
  163. $scenes = $this->prop('scenes', data('scenes'));
  164. $items = array();
  165. if($isLibCase)
  166. {
  167. $libName = $this->prop('libName', data('libName'));
  168. $items[$lang->testcase->fromCase] = array('children' => wg($this->getFromCase($case)));
  169. $items[$lang->testcase->lib] = hasPriv('caselib', 'browse') ? array('control' => 'link', 'url' => createLink('caselib', 'browse', "libID={$case->lib}"), 'text' => $libName) : $libName;
  170. $items[$lang->testcase->module] = array('children' => wg($this->getModule($case)));
  171. }
  172. else
  173. {
  174. $product = $this->prop('product', data('product'));
  175. $branchName = $this->prop('branchName', data('branchName'));
  176. $branchLabel = sprintf($lang->product->branch, $lang->product->branchName[$product->type]);
  177. if($case->product && !$product->shadow) $items[$lang->testcase->product] = hasPriv('product', 'view') ? array('control' => 'link', 'url' => createLink('product', 'view', "productID={$case->product}"), 'text' => $product->name) : $product->name;
  178. if($case->branch && $product->type != 'normal') $items[$branchLabel] = hasPriv('testcase', 'browse') ? array('control' => 'link', 'url' => createLink('testcase', 'browse', "productID={$case->product}&branch={$case->branch}"), 'text' => $branchName) : $branchName;
  179. $items[$lang->testcase->module] = array('children' => wg($this->getModule($case)));
  180. $items[$lang->testcase->scene] = array('control' => 'text', 'text' => zget($scenes, $case->scene, ''));
  181. $items[$lang->testcase->story] = array('children' => wg($this->getStory($case)));
  182. }
  183. $items[$lang->testcase->type] = zget($lang->case->typeList, $case->type);
  184. $items[$lang->testcase->stage] = array('children' => wg($this->getStage($case)));
  185. $items[$lang->testcase->pri] = array('control' => 'pri', 'pri' => $case->pri, 'text' => $lang->case->priList);
  186. $items[$lang->testcase->status] = array('children' => wg($this->getStatus($case)));
  187. if(!$isLibCase)
  188. {
  189. $items[$lang->testcase->lastRunDate] = !helper::isZeroDate($case->lastRunDate) ? $case->lastRunDate : '';
  190. $items[$lang->testcase->lastRunResult] = $case->lastRunResult ? $lang->testcase->resultList[$case->lastRunResult] : $lang->testcase->unexecuted;
  191. }
  192. $items[$lang->testcase->keywords] = $case->keywords;
  193. return $items;
  194. }
  195. protected function build()
  196. {
  197. return new datalist
  198. (
  199. set::className('case-basec-info'),
  200. set::items($this->getItems())
  201. );
  202. }
  203. }