edit.html.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <?php
  2. /**
  3. * The edit view file of testcase module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(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 Tingting Dai <daitingting@easycorp.ltd>
  7. * @package testcase
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. data('testcase', $case);
  12. include($this->app->getModuleRoot() . 'ai/ui/inputinject.html.php');
  13. jsVar('tab', $this->app->tab);
  14. jsVar('isLibCase', $isLibCase);
  15. jsVar('caseBranch', $case->branch);
  16. if($app->tab == 'execution') jsVar('objectID', $case->execution);
  17. if($app->tab == 'project') jsVar('objectID', $case->project);
  18. if($app->tab == 'qa') jsVar('objectID', 0);
  19. set::title($lang->testcase->edit);
  20. $rootID = $isLibCase ? $case->lib : $case->product;
  21. $viewType = $isLibCase ? 'caselib' : 'case';
  22. $createModuleLink = createLink('tree', 'browse', "rootID={$rootID}&view={$viewType}&currentModuleID=0&branch={$case->branch}");
  23. if($case->type != 'unit') unset($lang->testcase->typeList['unit']);
  24. $linkCaseItems = array();
  25. if(isset($case->linkCaseTitles))
  26. {
  27. foreach($case->linkCaseTitles as $linkCaseID => $linkCaseTitle)
  28. {
  29. $linkCaseItems[] = array('text' => "#{$linkCaseID} {$linkCaseTitle}", 'value' => $linkCaseID, 'checked' => true);
  30. }
  31. }
  32. $linkBugItems = array();
  33. if(isset($case->toBugs))
  34. {
  35. foreach($case->toBugs as $bugID => $bug)
  36. {
  37. $linkBugItems[] = array('text' => "#{$bugID} {$bug->title}", 'value' => $bugID, 'checked' => true);
  38. }
  39. }
  40. $priList = array_filter($lang->testcase->priList);
  41. detailHeader
  42. (
  43. to::prefix(null),
  44. to::title
  45. (
  46. entityLabel
  47. (
  48. set::entityID($case->id),
  49. set::level(1),
  50. set::text($case->title),
  51. set::reverse(true)
  52. )
  53. )
  54. );
  55. detailBody
  56. (
  57. set::isForm(true),
  58. on::change('#lib', 'loadLibModules'),
  59. on::change('#product', 'loadProductRelated'),
  60. on::change('#module', 'loadModuleRelated'),
  61. on::change('#branch', 'loadBranchRelated'),
  62. on::click('#refresh', $isLibCase ? 'loadLibModules' : 'loadProductModules'),
  63. on::click('#auto', 'checkScript'),
  64. sectionList
  65. (
  66. section
  67. (
  68. set::title($lang->testcase->title),
  69. set::required(true),
  70. formGroup
  71. (
  72. inputControl
  73. (
  74. input
  75. (
  76. set::name('title'),
  77. set::value($case->title),
  78. set::placeholder($lang->case->title)
  79. ),
  80. set::suffixWidth('icon'),
  81. to::suffix
  82. (
  83. colorPicker
  84. (
  85. set::name('color'),
  86. set::value($case->color),
  87. set::syncColor('#title')
  88. )
  89. )
  90. )
  91. )
  92. ),
  93. !$isLibCase ? section
  94. (
  95. set::title($lang->testcase->scene),
  96. formGroup
  97. (
  98. setID('sceneIdBox'),
  99. picker
  100. (
  101. set::name('scene'),
  102. set::items($sceneOptionMenu),
  103. set::value($case->scene),
  104. set::required(true)
  105. )
  106. )
  107. ) : null,
  108. section
  109. (
  110. set::title($lang->testcase->precondition),
  111. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",precondition,") !== false),
  112. formGroup
  113. (
  114. textarea
  115. (
  116. set::name('precondition'),
  117. set::value($case->precondition),
  118. set::rows(2)
  119. )
  120. )
  121. ),
  122. section
  123. (
  124. set::title($lang->testcase->steps),
  125. stepsEditor(set::data($case->steps))
  126. ),
  127. section
  128. (
  129. set::title($lang->files),
  130. fileSelector($case->files ? set::defaultFiles(array_values($case->files)) : false)
  131. ),
  132. section
  133. (
  134. set::title($lang->testcase->legendComment),
  135. editor
  136. (
  137. set::name('comment'),
  138. set::rows(5)
  139. )
  140. )
  141. ),
  142. history(set::objectID($case->id)),
  143. detailSide
  144. (
  145. set::isForm(true),
  146. tableData
  147. (
  148. setClass('mt-5'),
  149. set::title($lang->testcase->legendBasicInfo),
  150. $isLibCase ? item
  151. (
  152. set::name($lang->testcase->lib),
  153. picker
  154. (
  155. setID('lib'),
  156. set::name('lib'),
  157. set::items($libraries),
  158. set::required(true),
  159. set::value($case->lib)
  160. )
  161. ) : item
  162. (
  163. set::name($lang->testcase->product),
  164. set::trClass($product->shadow ? 'hidden' : ''),
  165. inputGroup
  166. (
  167. picker
  168. (
  169. setID('product'),
  170. set::name('product'),
  171. set::items($products),
  172. set::required(true),
  173. set::value($case->product)
  174. ),
  175. picker
  176. (
  177. setClass(!isset($product->type) || $product->type == 'normal' ? 'hidden' : ''),
  178. setID('branch'),
  179. set::name('branch'),
  180. set::required(true),
  181. set::items($branchTagOption),
  182. set::value($case->branch)
  183. )
  184. )
  185. ),
  186. item
  187. (
  188. set::name($lang->testcase->module),
  189. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",module,") !== false),
  190. formGroup
  191. (
  192. modulePicker
  193. (
  194. setID('module'),
  195. set::items($moduleOptionMenu),
  196. set::value($case->module),
  197. set::manageLink(createLink('tree', 'browse', "rootID={$rootID}&view={$viewType}&currentModuleID=0&branch={$case->branch}"))
  198. )
  199. )
  200. ),
  201. !$isLibCase ? item
  202. (
  203. set::name($lang->testcase->story),
  204. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",story,") !== false),
  205. formGroup
  206. (
  207. setID('storyIdBox'),
  208. remotePicker
  209. (
  210. setID('story'),
  211. set::name('story'),
  212. set::type('casestories'),
  213. set::params("productID={$case->product}&moduleID={$case->module}&branch={$case->branch}&storyID={$case->story}"),
  214. $case->story ? set::value($case->story) : null
  215. )
  216. )
  217. ) : null,
  218. item
  219. (
  220. set::name($lang->testcase->type),
  221. set::required(true),
  222. inputGroup
  223. (
  224. picker(set::name('type'), set::items($lang->testcase->typeList), set::value($case->type), set::required(true), $case->type == 'unit' ? set::disabled(true) : null),
  225. helper::hasFeature('automated') ? span
  226. (
  227. setClass('input-group-addon'),
  228. control
  229. (
  230. set::type('checkbox'),
  231. set::name('auto'),
  232. set::value('auto'),
  233. set::text($lang->testcase->automated),
  234. set::checked($case->auto == 'auto' ? true : false)
  235. )
  236. ) : null
  237. )
  238. ),
  239. item
  240. (
  241. $case->auto == 'auto' ? set::trClass('autoScript') : set::trClass('hidden autoScript'),
  242. set::name($lang->testcase->autoScript),
  243. fileSelector
  244. (
  245. set::name('scriptFile'),
  246. set::accept($config->testcase->scriptAcceptFileTypes),
  247. set::maxFileCount(1),
  248. set::multiple(false),
  249. set::onAdd(jsRaw('window.readScriptContent')),
  250. set::onRemove(jsRaw('window.showUploadScriptBtn'))
  251. ),
  252. input
  253. (
  254. set::type('hidden'),
  255. set::name('script')
  256. )
  257. ),
  258. item
  259. (
  260. set::name($lang->testcase->stage),
  261. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",stage,") !== false),
  262. formGroup
  263. (
  264. picker
  265. (
  266. set::name('stage[]'),
  267. set::items($lang->testcase->stageList),
  268. set::value($case->stage),
  269. set::multiple(true)
  270. )
  271. )
  272. ),
  273. item
  274. (
  275. set::name($lang->testcase->pri),
  276. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",pri,") !== false),
  277. formGroup
  278. (
  279. priPicker
  280. (
  281. set::name('pri'),
  282. set::items($priList),
  283. set::value($case->pri)
  284. )
  285. )
  286. ),
  287. item
  288. (
  289. set::name($lang->testcase->status),
  290. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",status,") !== false),
  291. !$forceNotReview && $case->status == 'wait' ? $lang->testcase->statusList[$case->status] :
  292. formGroup
  293. (
  294. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",status,") !== false),
  295. picker
  296. (
  297. set::name('status'),
  298. set::items($lang->testcase->statusList),
  299. set::required(true),
  300. set::value($case->status)
  301. )
  302. )
  303. ),
  304. item
  305. (
  306. set::name($lang->testcase->keywords),
  307. set::required(strpos(",{$this->config->testcase->edit->requiredFields},", ",keywords,") !== false),
  308. formGroup
  309. (
  310. input
  311. (
  312. set::name('keywords'),
  313. set::value($case->keywords)
  314. )
  315. )
  316. ),
  317. (!$isLibCase && hasPriv('testcase', 'linkCases') && $config->edition == 'open') ? item
  318. (
  319. set::name($lang->testcase->linkCase),
  320. a
  321. (
  322. set::href(createLink('testcase', 'linkCases', "caseID={$case->id}")),
  323. set('data-toggle', 'modal'),
  324. set('data-size', 'lg'),
  325. $lang->testcase->linkCases
  326. )
  327. ) : null,
  328. (!$isLibCase && hasPriv('testcase', 'linkCases') && $config->edition == 'open') ? item
  329. (
  330. set::trClass(!isset($case->linkCaseTitles) ? 'hidden' : ''),
  331. control
  332. (
  333. set::type('checkList'),
  334. set::name('linkCase[]'),
  335. set::value(isset($case->linkCaseTitles) ? array_keys($case->linkCaseTitles) : ''),
  336. set::items($linkCaseItems)
  337. )
  338. ) : null,
  339. (!$isLibCase && hasPriv('testcase', 'linkBugs')) ? item
  340. (
  341. set::name($lang->testcase->linkBug),
  342. a
  343. (
  344. set::href(createLink('testcase', 'linkBugs', "caseID={$case->id}")),
  345. set('data-toggle', 'modal'),
  346. set('data-size', 'lg'),
  347. $lang->testcase->linkBugs
  348. )
  349. ) : null,
  350. (!$isLibCase && hasPriv('testcase', 'linkBugs')) ? item
  351. (
  352. set::trClass(!isset($case->toBugs) ? 'hidden' : ''),
  353. control
  354. (
  355. set::type('checkList'),
  356. set::name('linkBug[]'),
  357. set::value(array_keys($case->toBugs)),
  358. set::items($linkBugItems)
  359. )
  360. ) : null
  361. ),
  362. tableData
  363. (
  364. set::title($lang->testcase->legendOpenAndEdit),
  365. item
  366. (
  367. set::name($lang->testcase->openedBy),
  368. zget($users, $case->openedBy) . $lang->at . $case->openedDate
  369. ),
  370. item
  371. (
  372. set::name($lang->testcase->lblLastEdited),
  373. $case->lastEditedBy ? zget($users, $case->lastEditedBy) . $lang->at . $case->lastEditedDate : null
  374. )
  375. )
  376. )
  377. );
  378. render();