browse.html.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. <?php
  2. /**
  3. * The browse view file of repo module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  6. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Ke Zhao<zhaoke@easycorp.ltd>
  8. * @package repo
  9. * @link https://www.zentao.net
  10. */
  11. namespace zin;
  12. jsVar('path', $path);
  13. jsVar('copied', $lang->repo->copied);
  14. jsVar('base64BranchID', $base64BranchID);
  15. $module = $app->tab == 'devops' ? 'repo' : $app->tab;
  16. dropmenu
  17. (
  18. set::module($module),
  19. set::tab($module),
  20. set::url(createLink($module, 'ajaxGetDropMenu', "objectID=$objectID&module={$app->rawModule}&method={$app->rawMethod}"))
  21. );
  22. /* Prepare repo select data. */
  23. $branchMenus = array();
  24. $tagMenus = array();
  25. $selected = '';
  26. foreach($branches as $branchName)
  27. {
  28. $selected = ($branchName == $branchID and $branchOrTag == 'branch') ? $branchName : $selected;
  29. $base64BranchID = helper::safe64Encode(base64_encode($branchName));
  30. $branchLink = $this->createLink('repo', 'browse', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID");
  31. $branchMenus[] = array('text' => $branchName, 'id' => $branchName, 'keys' => zget(common::convert2Pinyin(array($branchName), $branchName), ''), 'url' => $branchLink, 'data-app' => $app->tab);
  32. }
  33. foreach($tags as $tagName)
  34. {
  35. $selected = ($tagName == $branchID and $branchOrTag == 'tag') ? $tagName : $selected;
  36. $base64TagID = helper::safe64Encode(base64_encode($tagName));
  37. $tagLink = $this->createLink('repo', 'browse', "repoID=$repoID&branchID=$base64TagID&objectID=$objectID&path=&revision=HEAD&refresh=0&branchOrTag=tag");
  38. $tagMenus[] = array('text' => $tagName, 'id' => $tagName, 'keys' => zget(common::convert2Pinyin(array($tagName), $tagName), ''), 'url' => $tagLink, 'data-app' => $app->tab);
  39. }
  40. $tabs = array(array('name' => 'branch', 'text' => $lang->repo->branch), array('name' => 'tag', 'text' => $lang->repo->tag));
  41. $menuData = array('branch' => $branchMenus, 'tag' => $tagMenus);
  42. /* Prepare breadcrumb navigation data. */
  43. $base64BranchID = helper::safe64Encode(base64_encode($branchID));
  44. $breadcrumbItems = array();
  45. $path ? $breadcrumbItems[] = h::a
  46. (
  47. set::href($this->repo->createLink('browse', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID")),
  48. set('data-app', $app->tab),
  49. h::span('/', setStyle('margin', '0 5px'))
  50. ) : null;
  51. $paths = explode('/', $path);
  52. $fileName = array_pop($paths);
  53. $postPath = '';
  54. foreach($paths as $index => $pathName)
  55. {
  56. $postPath .= $pathName . '/';
  57. $breadcrumbItems[] = h::a
  58. (
  59. set::href($this->repo->createLink('browse', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID&path=" . $this->repo->encodePath($postPath))),
  60. set('data-app', $app->tab),
  61. trim($pathName, '/')
  62. );
  63. $breadcrumbItems[] = h::span('/', setStyle('margin', '0 5px'));
  64. }
  65. if($fileName) $breadcrumbItems[] = h::span($fileName);
  66. /* zin: Define the set::module('repo') feature bar on main menu. */
  67. \zin\featureBar(
  68. formGroup
  69. (
  70. set::className('repo-select'),
  71. set::required(true),
  72. (in_array($app->tab, array('project', 'execution')) && count($repoPairs) > 1) ? dropmenu
  73. (
  74. set::id('repoDropmenu'),
  75. set::text($repo->name),
  76. set::objectID($repo->id),
  77. set::url(createLink('repo', 'ajaxGetDropMenu', "repoID={$repo->id}&module=repo&method=browse&projectID={$objectID}"))
  78. ) : null,
  79. ($repo->SCM != 'Subversion' && ($branches || $tags)) ? dropmenu
  80. (
  81. setID('repoBranchDropMenu'),
  82. set::objectID($selected),
  83. set::text($selected),
  84. set::data(array('data' => $menuData, 'tabs' => $tabs))
  85. ) : null
  86. ),
  87. ...$breadcrumbItems
  88. );
  89. /* zin: Define the toolbar on main menu. */
  90. $refreshLink = $this->createLink('repo', 'browse', "repoID=$repoID&branchID=" . $base64BranchID . "&objectID=$objectID&path=" . $this->repo->encodePath($path) . "&revision=$revision&refresh=1");
  91. $refreshItem = array('text' => $lang->refresh, 'url' => $refreshLink, 'class' => 'primary', 'icon' => 'refresh', 'data-app' => $app->tab);
  92. $createItem = array('text' => $lang->repo->createAction, 'url' => createLink('repo', 'create', "objectID={$objectID}"), 'data-app' => $app->tab);
  93. $config->repo->repoDtable->fieldList['revision']['link'] = inLink('revision', "repoID={$repo->id}&objectID={$objectID}&revision={revision}");
  94. $tableData = initTableData($infos, $config->repo->repoDtable->fieldList, $this->repo);
  95. $downloadWg = div
  96. (
  97. set::id('modal-downloadCode'),
  98. set::title($lang->repo->downloadCode),
  99. on('click', '#modal-downloadCode', array('capture' => true, 'prevent' => true, 'stop' => true)),
  100. on::click('.copy-btn')->call('copyLink', jsRaw('this')),
  101. !empty($cloneUrl->svn) ? div
  102. (
  103. p(set::className('repo-downloadCode'), $lang->repo->cloneUrl),
  104. div
  105. (
  106. setClass('flex space-between w-96'),
  107. div
  108. (
  109. setClass('flex-1'),
  110. input
  111. (
  112. set::type('text'),
  113. set::name('svnUrl'),
  114. set::value($cloneUrl->svn),
  115. set::readOnly(true)
  116. )
  117. ),
  118. div
  119. (
  120. set::width('50px'),
  121. btn
  122. (
  123. set::className('copy-btn'),
  124. set::icon('copy')
  125. )
  126. )
  127. )
  128. ) : null,
  129. !empty($cloneUrl->ssh) ? div
  130. (
  131. p(set::className('repo-downloadCode'), $lang->repo->sshClone),
  132. div
  133. (
  134. setClass('flex space-between w-96'),
  135. div
  136. (
  137. setClass('flex-1'),
  138. input
  139. (
  140. set::type('text'),
  141. set::name('sshUrl'),
  142. set::value($cloneUrl->ssh),
  143. set::readOnly(true)
  144. )
  145. ),
  146. div
  147. (
  148. set::width('50px'),
  149. btn
  150. (
  151. set::className('copy-btn'),
  152. set::icon('copy')
  153. )
  154. )
  155. )
  156. ) : null,
  157. !empty($cloneUrl->http) ? div
  158. (
  159. p(set::className('repo-downloadCode'), $lang->repo->httpClone),
  160. div
  161. (
  162. setClass('flex space-between w-96'),
  163. div
  164. (
  165. setClass('flex-1'),
  166. input
  167. (
  168. set::type('text'),
  169. set::name('httpUrl'),
  170. set::value($cloneUrl->http),
  171. set::readOnly(true)
  172. )
  173. ),
  174. div
  175. (
  176. set::width('50px'),
  177. btn
  178. (
  179. set::className('copy-btn'),
  180. set::icon('copy')
  181. )
  182. )
  183. )
  184. ) : null,
  185. div
  186. (
  187. setStyle(array('margin-top' => '20px')),
  188. btn
  189. (
  190. on::click()->call('downloadZip'),
  191. set::icon('down-circle'),
  192. set::className('downloadZip-btn'),
  193. set::text($lang->repo->downloadZip)
  194. )
  195. )
  196. );
  197. toolbar
  198. (
  199. a(
  200. set::className('last-sync-time'),
  201. empty($lastRevision->link) ? null : set::href($lastRevision->link),
  202. $lang->repo->notice->lastSyncTime . (isset($lastRevision->time) ? date('m-d H:i', strtotime($lastRevision->time)) : date('m-d H:i'))
  203. ),
  204. !in_array($repo->SCM, $config->repo->notSyncSCM) ? item(set($refreshItem)) : null,
  205. dropdown
  206. (
  207. set::staticMenu(true),
  208. btn
  209. (
  210. setClass('primary download-btn'),
  211. set::icon('download'),
  212. $lang->repo->download
  213. ),
  214. to::items
  215. (
  216. array($downloadWg)
  217. )
  218. ),
  219. hasPriv('repo', 'create') && $app->tab == 'project' ? item
  220. (
  221. set($createItem + array
  222. (
  223. 'icon' => 'plus',
  224. 'class' => 'btn primary'
  225. )),
  226. set('data-app', $this->app->tab)
  227. ) : null
  228. );
  229. jsVar('tableData', $tableData);
  230. dtable
  231. (
  232. set::cols($config->repo->repoDtable->fieldList),
  233. set::data($tableData),
  234. set::afterRender(jsRaw('window.afterRender')),
  235. set::onRenderCell(jsRaw('window.renderCell')),
  236. set::canRowCheckable(jsRaw('function(rowID){return false;}')),
  237. set::footPager(false)
  238. );
  239. /* zin: Define the sidebar in main content. */
  240. $encodePath = $this->repo->encodePath($path);
  241. $diffLink = $this->repo->createLink('diff', "repoID=$repoID&objectID=$objectID&entry=" . $encodePath . "&oldrevision={oldRevision}&newRevision={newRevision}");
  242. jsVar('repo', $repo);
  243. jsVar('appTab', $app->tab);
  244. jsVar('branch', $branchID);
  245. jsVar('diffLink', $diffLink);
  246. jsVar('sortLink', helper::createLink('repo', 'browse', "repoID={$repoID}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}"));
  247. /* Disbale check all checkbox of table header */
  248. $config->repo->commentDtable->fieldList['id']['checkbox'] = jsRaw('(rowID) => rowID !== \'HEADER\'');
  249. if(in_array($repo->SCM, $config->repo->notSyncSCM)) unset($config->repo->commentDtable->fieldList['commit']);
  250. $commentsTableData = initTableData($revisions, $config->repo->commentDtable->fieldList, $this->repo);
  251. $readAllLink = $this->repo->createLink('log', "repoID=$repoID&branchID=$base64BranchID&objectID=$objectID&entry=" . $encodePath . "&source=browse");
  252. $footToolbar['items'][] = array('text' => $lang->repo->diff, 'className' => "btn primary size-sm btn-diff", 'btnType' => 'primary', 'onClick' => jsRaw('window.diffClick'));
  253. $footToolbar['items'][] = array('text' => $lang->repo->allLog, 'url' => $readAllLink, 'data-app' => $this->app->tab);
  254. sidebar
  255. (
  256. set::side('right'),
  257. set::width(500),
  258. set::maxWidth(500),
  259. set::preserve(false),
  260. dtable
  261. (
  262. set::id('repo-comments-table'),
  263. set::cols($config->repo->commentDtable->fieldList),
  264. set::data($commentsTableData),
  265. set::onRenderCell(jsRaw('window.renderCommentCell')),
  266. set::onCheckChange(jsRaw('window.checkedChange')),
  267. set::canRowCheckable(jsRaw('window.canRowCheckable')),
  268. set::footToolbar($footToolbar),
  269. set::footer(array('toolbar', 'flex', 'pager')),
  270. set::footPager(usePager('pager', 'noTotalCount')),
  271. set::showToolbarOnChecked(false)
  272. )
  273. );