browse.html.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <?php
  2. /**
  3. * The browse view file of caselib 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 Mengyi Liu <liumengyi@easycorp.ltd>
  7. * @package caselib
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. jsVar('confirmBatchDelete', $lang->testcase->confirmBatchDelete);
  12. $isFromDoc = $from === 'doc';
  13. $isFromAI = $from === 'ai';
  14. jsVar('isFromDoc', $isFromDoc);
  15. jsVar('isFromAI', $isFromAI);
  16. if($isFromDoc || $isFromAI)
  17. {
  18. $this->app->loadLang('doc');
  19. $caseLibs = $this->caselib->getPairs();
  20. $libChangeLink = createLink($app->rawModule, $app->rawMethod, "libID={libID}&browseType={$browseType}&param={$param}&orderBy={$orderBy}&recToTal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}&from=$from&blockID=$blockID");
  21. $insertListLink = createLink($app->rawModule, $app->rawMethod, "libID={$libID}&browseType={$browseType}&param={$param}&orderBy={$orderBy}&recToTal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}&from=$from&blockID={blockID}");
  22. formPanel
  23. (
  24. setID('zentaolist'),
  25. setClass('mb-4-important'),
  26. set::title(sprintf($this->lang->doc->insertTitle, $this->lang->doc->zentaoList['caselib'])),
  27. set::actions(array()),
  28. set::showExtra(false),
  29. to::titleSuffix
  30. (
  31. span
  32. (
  33. setClass('text-muted text-sm text-gray-600 font-light'),
  34. span(setClass('text-warning mr-1'), icon('help')),
  35. $lang->doc->previewTip
  36. )
  37. ),
  38. formRow
  39. (
  40. formGroup
  41. (
  42. set::width('1/2'),
  43. set::name('product'),
  44. set::label($lang->doc->caselib),
  45. set::control(array('required' => false)),
  46. set::items($caseLibs),
  47. set::value($libID),
  48. set::required(),
  49. span
  50. (
  51. setClass('error-tip text-danger hidden'),
  52. $lang->doc->emptyError
  53. ),
  54. on::change('[name="product"]')->do("loadModal('$libChangeLink'.replace('{libID}', $(this).val()))")
  55. )
  56. )
  57. );
  58. }
  59. $canView = common::hasPriv('caselib', 'view');
  60. $canExport = common::hasPriv('caselib', 'exportCase');
  61. $canExportTemplate = common::hasPriv('caselib', 'exportTemplate');
  62. $canImport = common::hasPriv('caselib', 'import');
  63. $canCreateLib = common::hasPriv('caselib', 'create');
  64. $canCreateCase = common::hasPriv('caselib', 'createCase');
  65. $canBatchCreateCase = common::hasPriv('caselib', 'batchCreateCase');
  66. $canBatchEdit = common::hasPriv('caselib', 'batchEditCase');
  67. $canBatchDelete = common::hasPriv('testcase', 'batchDelete');
  68. $canBatchReview = common::hasPriv('testcase', 'batchReview') and ($config->testcase->needReview or !empty($config->testcase->forceReview));
  69. $canBatchChangeModule = common::hasPriv('testcase', 'batchChangeModule');
  70. $canBatchAction = ($canBatchEdit or $canBatchDelete or $canBatchReview or $canBatchChangeModule);
  71. $cols = $this->loadModel('datatable')->getSetting('caselib');
  72. if(!empty($cols['pri'])) $cols['pri']['priList'] = $lang->testcase->priList;
  73. if($isFromDoc || $isFromAI)
  74. {
  75. if(isset($cols['actions'])) unset($cols['actions']);
  76. foreach($cols as $key => $col)
  77. {
  78. $cols[$key]['sortType'] = false;
  79. if(isset($col['link'])) unset($cols[$key]['link']);
  80. if($key == 'title') $cols[$key]['link'] = array('url' => createLink('caselib', 'viewCase', "caseID={id}&version={version}"), 'data-toggle' => 'modal', 'data-size' => 'lg');
  81. }
  82. }
  83. $tableData = initTableData($cases, $cols, $this->testcase);
  84. featureBar
  85. (
  86. set::current($this->session->libBrowseType),
  87. set::isModal($isFromDoc || $isFromAI),
  88. set::linkParams("libID=$libID&browseType={key}&param=$param&orderBy=$orderBy&recTotal=$pager->recTotal&recPerPage=$pager->recPerPage&pageID=$pager->pageID&from=$from&blockID=$blockID"),
  89. li(searchToggle
  90. (
  91. set::simple($isFromDoc || $isFromAI),
  92. set::module('caselib'),
  93. set::open(strtolower($browseType) == 'bysearch'),
  94. ($isFromDoc || $isFromAI) ? set::target('#docSearchForm') : null,
  95. ($isFromDoc || $isFromAI) ? set::onSearch(jsRaw('function(){$(this.element).closest(".modal").find("#featureBar .nav-item>.active").removeClass("active").find(".label").hide()}')) : null
  96. ))
  97. );
  98. if($isFromDoc || $isFromAI)
  99. {
  100. div(setID('docSearchForm'));
  101. }
  102. $createCaseItem = array('text' => $lang->testcase->create, 'url' => helper::createLink('caselib', 'createCase', "libID=$libID&moduleID=" . (isset($moduleID) ? $moduleID : 0)));
  103. $batchCreateCaseItem = array('text' => $lang->testcase->batchCreate, 'url' => helper::createLink('caselib', 'batchCreateCase', "libID=$libID&moduleID=" . (isset($moduleID) ? $moduleID : 0)));
  104. $exportItems = array();
  105. if($canExport)
  106. {
  107. $link = $this->createLink('caselib', 'exportCase', "libID={$libID}&orderBy={$orderBy}&browseType={$browseType}");
  108. $exportItems[] = array('text' => $lang->caselib->exportCase, 'url' => $link, 'data-toggle' => 'modal');
  109. }
  110. if($canExportTemplate)
  111. {
  112. $link = $this->createLink('caselib', 'exportTemplate', "libID={$libID}");
  113. $exportItems[] = array('text' => $lang->caselib->exportTemplate, 'url' => $link, 'data-toggle' => 'modal', 'data-size' => 'sm');
  114. }
  115. toolbar
  116. (
  117. setClass(array('hidden' => $isFromDoc || $isFromAI)),
  118. $canView ? a
  119. (
  120. setClass('toolbar-item ghost btn btn-default'),
  121. set::href(createLink('caselib', 'view', "libID={$libID}")),
  122. set('data-toggle', 'modal'),
  123. set('data-id', 'viewLibModal'),
  124. icon('list-alt'),
  125. $lang->caselib->view
  126. ) : '',
  127. !empty($exportItems) || $canImport ? btngroup
  128. (
  129. $exportItems ? dropdown
  130. (
  131. btn(setClass('btn ghost square'), set::icon('export')),
  132. set::items($exportItems),
  133. set::placement('bottom-end')
  134. ) : null,
  135. $canImport ? a
  136. (
  137. setClass('toolbar-item ghost btn btn-default'),
  138. set::href(createLink('caselib', 'import', "libID={$libID}")),
  139. set('data-toggle', 'modal'),
  140. set('data-size', 'sm'),
  141. icon('import'),
  142. $lang->testcase->fileImport
  143. ) : ''
  144. ) : '',
  145. $canCreateLib ? btn
  146. (
  147. setClass('btn secondary'),
  148. set::icon('plus'),
  149. set::url(helper::createLink('caselib', 'create')),
  150. set('data-toggle', 'modal'),
  151. $lang->caselib->create
  152. ) : '',
  153. $canCreateCase && $canBatchCreateCase ? btngroup
  154. (
  155. btn
  156. (
  157. setClass('btn primary'),
  158. set::icon('plus'),
  159. set::url(helper::createLink('caselib', 'createCase', "libID=$libID&moduleID=" . (isset($moduleID) ? $moduleID : 0))),
  160. $lang->testcase->create
  161. ),
  162. dropdown
  163. (
  164. btn(setClass('btn primary dropdown-toggle'),
  165. setStyle(array('padding' => '6px', 'border-radius' => '0 2px 2px 0'))),
  166. set::items(array($createCaseItem, $batchCreateCaseItem)),
  167. set::placement('bottom-end')
  168. )
  169. ) : null,
  170. $canCreateCase && !$canBatchCreateCase ? item(set($createCaseItem + array('class' => 'btn primary', 'icon' => 'plus'))) : null,
  171. $canBatchCreateCase && !$canCreateCase ? item(set($batchCreateCaseItem + array('class' => 'btn primary', 'icon' => 'plus'))) : null
  172. );
  173. $settingLink = $this->createLink('tree', 'browse', "libID={$libID}&view=caselib&currentModuleID=0&branch=0&from={$lang->navGroup->caselib}");
  174. $closeLink = $this->createLink('caselib', 'browse', "libID=$libID&browseType=$browseType&param=0&orderBy=$orderBy");
  175. if(!$isFromDoc && !$isFromAI)
  176. {
  177. sidebar
  178. (
  179. moduleMenu
  180. (
  181. set::modules($moduleTree),
  182. set::activeKey($moduleID),
  183. set::settingLink($settingLink),
  184. set::closeLink($closeLink)
  185. )
  186. );
  187. }
  188. $reviewItems = array();
  189. if($canBatchReview)
  190. {
  191. foreach($lang->testcase->reviewResultList as $key => $result)
  192. {
  193. if($key == '') continue;
  194. $reviewItems[] = array('text' => $result, 'innerClass' => 'batch-btn ajax-btn not-open-url', 'data-url' => $this->createLink('testcase', 'batchReview', "result=$key"));
  195. }
  196. }
  197. $moduleItems = array();
  198. if($canBatchChangeModule)
  199. {
  200. foreach($modules as $moduleIdKey => $moduleName) $moduleItems[] = array('text' => $moduleName, 'innerClass' => 'batch-btn ajax-btn not-open-url', 'data-url' => helper::createLink('testcase', 'batchChangeModule', "moduleID=$moduleIdKey"));
  201. }
  202. $navActions = array();
  203. if($canBatchReview || $canBatchDelete || $canBatchChangeModule)
  204. {
  205. $navActions = array
  206. (
  207. $canBatchReview ? array('text' => $lang->testcase->review, 'class' => 'not-hide-menu', 'items' => $reviewItems) : null,
  208. $canBatchDelete ? array('text' => $lang->delete, 'innerClass' => 'batch-btn ajax-btn not-open-url batch-delete-btn', 'data-url' => helper::createLink('testcase', 'batchDelete', "libID=$libID")) : null
  209. );
  210. }
  211. $footToolbar = null;
  212. if($isFromDoc)
  213. {
  214. $footToolbar = array(array('text' => $lang->doc->insertText, 'data-on' => 'click', 'data-call' => "insertListToDoc('#caselib', 'caselib', $blockID, '$insertListLink')"));
  215. }
  216. elseif($isFromAI)
  217. {
  218. $footToolbar = array(array('text' => $lang->doc->insertText, 'data-on' => 'click', 'data-call' => "insertListToAI('#caselib', 'case')"));
  219. }
  220. elseif($canBatchAction)
  221. {
  222. $btnGroupItems = array();
  223. if($canBatchEdit) $btnGroupItems[] = array('text' => $lang->edit, 'className' => 'batch-btn not-open-url', 'data-url' => helper::createLink('caselib', 'batchEditCase', "libID=$libID&branch=0&type=lib"));
  224. if(!empty($navActions)) $btnGroupItems[] = array('caret' => 'up', 'btnType' => 'secondary', 'items' => $navActions, 'data-placement' => 'top-start');
  225. $toolbarItems = array(array('type' => 'btn-group', 'items' => $btnGroupItems));
  226. if($canBatchChangeModule) $toolbarItems[] = array('caret' => 'up', 'text' => $lang->testcase->moduleAB, 'class' => 'not-hide-menu', 'items' => $moduleItems, 'data-menu' => array('searchBox' => true));
  227. $footToolbar = array('items' => $toolbarItems, 'btnProps' => array('btnType' => 'secondary'));
  228. }
  229. $caseCreateLink = $canCreateCase ? createLink('caselib', 'createCase', "libID={$libID}&moduleID={$moduleID}") : '';
  230. dtable
  231. (
  232. setID('caselib'),
  233. set::cols($cols),
  234. set::data(array_values($tableData)),
  235. set::customData(array('modules' => $modulePairs)),
  236. set::onRenderCell(jsRaw('window.onRenderCell')),
  237. set::userMap($users),
  238. set::checkable($canBatchAction || $isFromDoc || $isFromAI),
  239. set::emptyTip($lang->testcase->noCase),
  240. set::orderBy($orderBy),
  241. set::footToolbar($footToolbar),
  242. set::footPager(usePager()),
  243. ($isFromDoc || $isFromAI) ? null : set::customCols(true),
  244. ($isFromDoc || $isFromAI) ? null : set::sortLink(createLink('caselib', 'browse', "libID={$libID}&browseType={$browseType}&param={$param}&orderBy={name}_{sortType}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}")),
  245. ($isFromDoc || $isFromAI) ? null : set::createTip($lang->testcase->create),
  246. ($isFromDoc || $isFromAI) ? null : set::createLink($caseCreateLink),
  247. ($isFromDoc || $isFromAI) ? set::afterRender(jsCallback()->call('toggleCheckRows', $idList)) : null,
  248. ($isFromDoc || $isFromAI) ? set::onCheckChange(jsRaw('window.checkedChange')) : null,
  249. ($isFromDoc || $isFromAI) ? set::height(400) : null
  250. );
  251. render();