From 22fb6fd19f1590ce522ea8fa55b52ea6f14db4e2 Mon Sep 17 00:00:00 2001 From: caoyanyi Date: Fri, 27 Oct 2023 10:06:13 +0800 Subject: [PATCH] + Add mr page display rule for execution. --- module/mr/control.php | 109 +++++++++++++++++--- module/mr/js/{browse.ui.js => common.ui.js} | 0 module/mr/js/create.ui.js | 6 ++ module/mr/model.php | 12 ++- module/mr/ui/browsebyexecution.html.php | 90 ++++++++++++++++ module/mr/ui/create.html.php | 22 +++- 6 files changed, 218 insertions(+), 21 deletions(-) rename module/mr/js/{browse.ui.js => common.ui.js} (100%) create mode 100644 module/mr/ui/browsebyexecution.html.php diff --git a/module/mr/control.php b/module/mr/control.php index acc883aae9..5ad4adc83e 100644 --- a/module/mr/control.php +++ b/module/mr/control.php @@ -31,6 +31,11 @@ class mr extends control */ public function browse($repoID = 0, $mode = 'status', $param = 'opened', $objectID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { + /* Save current URI to session. */ + $this->session->set('mrList', $this->app->getURI(true), 'repo'); + + if($this->app->tab == 'execution' && $objectID) return print($this->fetch('mr', 'browseByExecution', "repoID={$repoID}&mode={$mode}¶m={$param}&objectID={$objectID}&orderBy={$orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}&pageID={$pageID}")); + $this->app->loadClass('pager', true); $pager = new pager($recTotal, $recPerPage, $pageID); @@ -56,7 +61,7 @@ class mr extends control $param = $this->app->user->account; } $filterProjects = empty($repo->serviceProject) ? array() : array($repo->serviceHost => array($repo->serviceProject => $repo->serviceProject)); - $MRList = $this->mr->getList($mode, $param, $orderBy, $pager, $filterProjects, $repoID); + $MRList = $this->mr->getList($mode, $param, $orderBy, $filterProjects, $repoID, 0, $pager); if($repo->SCM == 'Gitlab') { @@ -73,11 +78,8 @@ class mr extends control $projects = $this->mr->getAllProjects($repoID, $repo->SCM); } - /* Save current URI to session. */ - $this->session->set('mrList', $this->app->getURI(true), 'repo'); - /* Sync GitLab MR to ZenTao Database. */ - $MRList = $this->mr->batchSyncMR($MRList, $repo->SCM); + $MRList = $this->mr->batchSyncMR($MRList, array($repoID => $repo)); /* Check whether Mr is linked with the product. */ foreach($MRList as $MR) @@ -123,12 +125,87 @@ class mr extends control } /** - * Create MR function. + * Browse mr for execution. * + * @param int $repoID + * @param string $mode + * @param string $param + * @param int $executionID + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ - public function create(int $repoID = 0) + public function browseByExecution($repoID = 0, $mode = 'status', $param = 'opened', $executionID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) + { + if($param == 'assignee' || $param == 'creator') + { + $mode = $param; + $param = $this->app->user->account; + } + + $this->app->loadClass('pager', true); + $pager = new pager($recTotal, $recPerPage, $pageID); + + $MRList = $this->mr->getList($mode, $param, $orderBy, array(), 0, $executionID, $pager); + $repoList = $this->loadModel('repo')->getList($executionID); + $MRList = $this->mr->batchSyncMR($MRList, $repoList); + + $projects = array(); + foreach($repoList as $repo) + { + if($repo->SCM == 'Gitlab') + { + $projectIds = array(); + foreach($MRList as $MR) + { + $projectIds[$MR->sourceProject] = $MR->sourceProject; + $projectIds[$MR->targetProject] = $MR->targetProject; + } + $projects += $this->mr->getGitlabProjects($repo->serviceHost, $projectIds); + } + else + { + $projects += $this->mr->getAllProjects($repoID, $repo->SCM); + } + } + + $openIDList = array(); + if($this->app->user->admin) + { + $openIDList += $this->loadModel('gitlab')->getGitLabListByAccount('caoyanyi');//, $this->app->user->account); + $openIDList += $this->loadModel('gitea')->getGiteaListByAccount($this->app->user->account); + $openIDList += $this->loadModel('gogs')->getGogsListByAccount($this->app->user->account); + } + + + $this->view->title = $this->lang->mr->common . $this->lang->colon . $this->lang->mr->browse; + $this->view->MRList = $MRList; + $this->view->projects = $projects; + $this->view->pager = $pager; + $this->view->mode = $mode; + $this->view->param = $param; + $this->view->objectID = $executionID; + $this->view->executionID = $executionID; + $this->view->repoList = $repoList; + $this->view->orderBy = $orderBy; + $this->view->openIDList = $openIDList; + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->sortLink = $this->createLink('mr', 'browse', "repoID={$repoID}&mode={$mode}¶m={$param}&objectID={$executionID}&orderBy={orderBy}&recTotal={$recTotal}&recPerPage={$recPerPage}"); + $this->display(); + } + + /** + * Create MR function. + * + * @param int $repoID + * @param int $objectID + * @access public + * @return void + */ + public function create(int $repoID = 0, int $objectID = 0) { if($_POST) { @@ -146,11 +223,14 @@ class mr extends control foreach($jobs as $job) $jobPairs[$job->id] = "[{$job->id}]{$job->name}"; $this->app->loadLang('compile'); - $this->view->title = $this->lang->mr->create; - $this->view->users = $this->loadModel('user')->getPairs('noletter|noclosed'); - $this->view->repo = $repo; - $this->view->project = $project; - $this->view->jobPairs = $jobPairs; + $this->view->title = $this->lang->mr->create; + $this->view->users = $this->loadModel('user')->getPairs('noletter|noclosed'); + $this->view->repo = $repo; + $this->view->repoPairs = $objectID ? $this->repo->getRepoPairs('execution', $objectID, false) : array(); + $this->view->project = $project; + $this->view->executionID = $objectID; + $this->view->objectID = $objectID; + $this->view->jobPairs = $jobPairs; $this->display(); } @@ -243,12 +323,9 @@ class mr extends control * @access public * @return void */ - public function delete($MRID, $confirm = 'no') + public function delete($MRID) { - if($confirm != 'yes') return print(js::confirm($this->lang->mr->confirmDelete, inlink('delete', "MRID=$MRID&confirm=yes"))); - $MR = $this->mr->getByID($MRID); - if($MR->synced) { $res = $this->mr->apiDeleteMR($MR->hostID, $MR->targetProject, $MR->mriid); diff --git a/module/mr/js/browse.ui.js b/module/mr/js/common.ui.js similarity index 100% rename from module/mr/js/browse.ui.js rename to module/mr/js/common.ui.js diff --git a/module/mr/js/create.ui.js b/module/mr/js/create.ui.js index d3b3c880b9..fc64455cbb 100644 --- a/module/mr/js/create.ui.js +++ b/module/mr/js/create.ui.js @@ -101,6 +101,12 @@ function onNeedCiChange(event) } } +function changeRepo() +{ + const repoID = $('input[name=changeRepo]').val(); + loadPage($.createLink('mr', 'create', `repoID=${repoID}&objectID=${objectID}`)); +} + $(function() { if(repo.gitService) diff --git a/module/mr/model.php b/module/mr/model.php index e48f70adf7..b1e46ff01e 100644 --- a/module/mr/model.php +++ b/module/mr/model.php @@ -41,13 +41,14 @@ class mrModel extends model * @param string $mode * @param string $param * @param string $orderBy - * @param object $pager * @param array|bool $filterProjects * @param int $repoID + * @param int $objectID + * @param object $pager * @access public * @return array */ - public function getList($mode = 'all', $param = 'all', $orderBy = 'id_desc', $pager = null, $filterProjects = array(), $repoID = 0) + public function getList($mode = 'all', $param = 'all', $orderBy = 'id_desc', $filterProjects = array(), $repoID = 0, $objectID = 0, $pager = null) { /* If filterProjects equals false,it means no permission. */ if($filterProjects === false) return array(); @@ -72,6 +73,7 @@ class mrModel extends model ->beginIF($mode == 'creator' and $param != 'all')->andWhere('createdBy')->eq($param)->fi() ->beginIF($filterProjectSql)->andWhere($filterProjectSql)->fi() ->beginIF($repoID)->andWhere('repoID')->eq($repoID)->fi() + ->beginIF($objectID)->andWhere('executionID')->eq($objectID)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); @@ -518,11 +520,11 @@ class mrModel extends model * Batch Sync GitLab MR Database. * * @param object $MRList - * @param string $scm + * @param array $repoList * @access public * @return array */ - public function batchSyncMR($MRList, $scm = 'Gitlab') + public function batchSyncMR($MRList, $repoList = array()) { if(empty($MRList)) return array(); @@ -533,6 +535,8 @@ class mrModel extends model { if($MR->status != 'opened') continue; + $scm = empty($repoList[$MR->repoID]) ? 'Gitlab' : $repoList[$MR->repoID]->SCM; + if(!isset($rawMRList[$MR->hostID][$MR->targetProject])) $rawMRList[$MR->hostID][$MR->targetProject] = $this->apiGetMRList($MR->hostID, $MR->targetProject, $scm); $rawMR = new stdClass(); foreach($rawMRList[$MR->hostID][$MR->targetProject] as $projcetRawMR) diff --git a/module/mr/ui/browsebyexecution.html.php b/module/mr/ui/browsebyexecution.html.php new file mode 100644 index 0000000000..eb6fd0d67a --- /dev/null +++ b/module/mr/ui/browsebyexecution.html.php @@ -0,0 +1,90 @@ + + * @package mr + * @link https://www.zentao.net + */ +namespace zin; + +jsVar('orderBy', $orderBy); +jsVar('sortLink', $sortLink); + +foreach($MRList as $index => $MR) +{ + if(!isset($repoList[$MR->repoID])) + { + unset($MRList[$index]); + continue; + } + + $repo = $repoList[$MR->repoID]; + $MR->canDelete = ($app->user->admin or (isset($openIDList[$MR->hostID]) and isset($projects[$MR->hostID][$MR->sourceProject]->owner->id) and $projects[$MR->hostID][$MR->sourceProject]->owner->id == $openIDList[$MR->hostID])) ? '' : 'disabled'; + if($repo->SCM == 'Gitlab') + { + $MR->canEdit = (isset($projects[$MR->hostID][$MR->sourceProject]->isDeveloper) and $projects[$MR->hostID][$MR->sourceProject]->isDeveloper == true) ? '' : 'disabled'; + } + elseif($repo->SCM == 'Gitea') + { + $MR->canEdit = (isset($projects[$MR->hostID][$MR->sourceProject]->allow_merge_commits) and $projects[$MR->hostID][$MR->sourceProject]->allow_merge_commits == true) ? '' : 'disabled'; + } + elseif($repo->SCM == 'Gogs') + { + $MR->canEdit = (isset($projects[$MR->hostID][$MR->sourceProject]->permissions->push) and $projects[$MR->hostID][$MR->sourceProject]->permissions->push) ? '' : 'disabled'; + } + + if($repo->SCM == 'Gitlab') + { + $MR->sourceProject = isset($projects[$MR->hostID][$MR->sourceProject]) ? $projects[$MR->hostID][$MR->sourceProject]->name_with_namespace . ':' . $MR->sourceBranch : $MR->sourceProject . ':' . $MR->sourceBranch; + $MR->targetProject = isset($projects[$MR->hostID][$MR->targetProject]) ? $projects[$MR->hostID][$MR->targetProject]->name_with_namespace . ':' . $MR->targetBranch : $MR->targetProject . ':' . $MR->targetBranch; + } + else + { + $MR->sourceProject = isset($projects[$MR->hostID][$MR->sourceProject]) ? $projects[$MR->hostID][$MR->sourceProject]->full_name . ':' . $MR->sourceBranch : $MR->sourceProject . ':' . $MR->sourceBranch; + $MR->targetProject = isset($projects[$MR->hostID][$MR->targetProject]) ? $projects[$MR->hostID][$MR->targetProject]->full_name . ':' . $MR->targetBranch : $MR->targetProject . ':' . $MR->targetBranch; + } + + $MR->mergeStatus = ($MR->status == 'closed' || $MR->status == 'merged') ? zget($lang->mr->statusList, $MR->status) : zget($lang->mr->mergeStatusList, $MR->mergeStatus); + + if($MR->status == 'merged' or $MR->status == 'closed') + { + $MR->approvalStatus = '-'; + } + else + { + $MR->approvalStatus = empty($MR->approvalStatus) ? $lang->mr->approvalStatusList['notReviewed'] : $lang->mr->approvalStatusList[$MR->approvalStatus]; + } +} + +$MRs = initTableData($MRList, $config->mr->dtable->fieldList, $this->mr); + +featureBar +( + set::current($mode != 'status' ? $mode : $param), + set::linkParams("repoID={$repoID}&mode=status¶m={key}"), +); + +toolBar +( + hasPriv('mr', 'create') ? item( + set::text($lang->mr->create), + set::icon('plus'), + set::className('btn primary'), + set::url(createLink('mr', 'create', "repoID=" . key($repoList) . "&objectID={$objectID}")), + set('data-app', $app->tab) + ) : null, +); + +dtable +( + set::userMap($users), + set::cols($config->mr->dtable->fieldList), + set::data($MRs), + set::sortLink(jsRaw('createSortLink')), + set::footPager(usePager()), +); + +render(); diff --git a/module/mr/ui/create.html.php b/module/mr/ui/create.html.php index 1d4e4ba8da..6e087f7939 100644 --- a/module/mr/ui/create.html.php +++ b/module/mr/ui/create.html.php @@ -14,12 +14,13 @@ h::importJs('js/misc/base64.js'); jsVar('hostType', strtolower($repo->SCM)); jsVar('hostID', $repo->gitService); jsVar('repo', $repo); +jsVar('objectID', $objectID); jsVar('projectID', $project->id); jsVar('mrLang', $lang->mr); jsVar('branchPrivs', array()); jsVar('projectNamespace', in_array($repo->SCM, array('Gitea', 'Gogs')) ? $project->name_with_namespace : ''); -dropmenu(set::objectID($repo->id), set::text($repo->name), set::tab('repo')); +if($app->tab == 'devops') dropmenu(set::objectID($repo->id), set::text($repo->name), set::tab('repo')); if(in_array($repo->SCM, array('Gitea', 'Gogs'))) { @@ -34,6 +35,15 @@ formPanel ( set::title($lang->mr->create), set::labelWidth($app->clientLang == 'zh-cn' ? '6em' : '10em'), + count($repoPairs) > 1 ? to::titleSuffix( + picker + ( + set::name('changeRepo'), + set::items($repoPairs), + set::value($repo->id), + on::change('changeRepo') + ) + ) : null, formGroup ( setClass('hidden'), @@ -147,6 +157,16 @@ formPanel set::value($repo->id), ), ), + formRow + ( + setClass('hidden'), + formGroup + ( + set::name('executionID'), + set::label(''), + set::value($executionID), + ), + ), ); render();