diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 4918fb2d72..dfc9a16248 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1389,6 +1389,8 @@ $lang->resource->sonarqube->create = 'create'; $lang->resource->sonarqube->edit = 'edit'; $lang->resource->sonarqube->delete = 'delete'; $lang->resource->sonarqube->browseProject = 'browseProject'; +$lang->resource->sonarqube->createProject = 'createProject'; +$lang->resource->sonarqube->deleteProject = 'deleteProject'; $lang->resource->sonarqube->execJob = 'execJob'; $lang->sonarqube->methodOrder[5] = 'browse'; @@ -1396,7 +1398,9 @@ $lang->sonarqube->methodOrder[10] = 'create'; $lang->sonarqube->methodOrder[15] = 'edit'; $lang->sonarqube->methodOrder[20] = 'delete'; $lang->sonarqube->methodOrder[25] = 'browseProject'; -$lang->sonarqube->methodOrder[30] = 'execJob'; +$lang->sonarqube->methodOrder[30] = 'createProject'; +$lang->sonarqube->methodOrder[35] = 'deleteProject'; +$lang->sonarqube->methodOrder[40] = 'execJob'; /* merge request. */ $lang->resource->mr = new stdclass(); diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 024e829d8f..67535faa78 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -53,7 +53,7 @@ class sonarqube extends control } echo html::select('projectKey', $projectPairs, '', "class='form-control chosen' required"); } - + /** * create a sonarqube. * @@ -101,18 +101,6 @@ class sonarqube extends control $this->post->set('token', $token); } - /** - * Exec job. - * - * @param int $jobID - * @access public - * @return void - */ - public function execJob($jobID) - { - echo $this->fetch('job', 'exec', "jobID=$jobID"); - } - /** * Delete a sonarqube. * @@ -134,4 +122,57 @@ class sonarqube extends control $this->action->logHistory($actionID, $changes); echo js::reload('parent'); } + + /** + * Exec job. + * + * @param int $jobID + * @access public + * @return void + */ + public function execJob($jobID) + { + echo $this->fetch('job', 'exec', "jobID=$jobID"); + } + + /** + * Browse sonarqube project. + * + * @param int $sonarqubeID + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ + public function browseProject($sonarqubeID, $orderBy = 'name_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1) + { + $this->app->loadClass('pager', $static = true); + $keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); + + $sonarqubeProjectList = $this->sonarqube->apiGetProjects($sonarqubeID, $keyword); + foreach($sonarqubeProjectList as $key => $sonarqubeProject) !isset($sonarqubeProject->lastAnalysisDate) ? $sonarqubeProject->lastAnalysisDate = '' : ''; + + /* Data sort. */ + list($order, $sort) = explode('_', $orderBy); + $orderList = array(); + foreach($sonarqubeProjectList as $sonarqubeProject) $orderList[] = $sonarqubeProject->$order; + array_multisort($orderList, $sort == 'desc' ? SORT_DESC : SORT_ASC, $sonarqubeProjectList); + + /* Pager. */ + $this->app->loadClass('pager', $static = true); + $recTotal = count($sonarqubeProjectList); + $pager = new pager($recTotal, $recPerPage, $pageID); + $sonarqubeProjectList = array_chunk($sonarqubeProjectList, $pager->recPerPage); + + $this->view->sonarqube = $this->sonarqube->getByID($sonarqubeID); + $this->view->keyword = urldecode(urldecode($keyword)); + $this->view->pager = $pager; + $this->view->title = $this->lang->sonarqube->common . $this->lang->colon . $this->lang->sonarqube->browseProject; + $this->view->sonarqubeID = $sonarqubeID; + $this->view->sonarqubeProjectList = empty($sonarqubeProjectList) ? $sonarqubeProjectList: $sonarqubeProjectList[$pageID - 1]; + $this->view->orderBy = $orderBy; + $this->display(); + } } diff --git a/module/sonarqube/css/browseproject.css b/module/sonarqube/css/browseproject.css new file mode 100644 index 0000000000..d86ca85e6a --- /dev/null +++ b/module/sonarqube/css/browseproject.css @@ -0,0 +1,2 @@ +.text-c-counts > span {margin-left: 5px;} +#mainMenu .pull-left {margin-right: 15px;} diff --git a/module/sonarqube/js/browseproject.js b/module/sonarqube/js/browseproject.js new file mode 100644 index 0000000000..edf62386c8 --- /dev/null +++ b/module/sonarqube/js/browseproject.js @@ -0,0 +1,22 @@ +$(document).ready(function() +{ + $('#projectSearch').click(function() + { + triggerSearch(); + }); + $('#keyword').keypress(function(event) + { + if(event.which == 13) triggerSearch(); + }) +}); + +/** + * Trigger filtering function. + * + * @access public + * @return void + */ +function triggerSearch() +{ + $("#sonarqubeProjectForm").submit(); +} diff --git a/module/sonarqube/lang/en.php b/module/sonarqube/lang/en.php index c562bdbdb1..e997769888 100644 --- a/module/sonarqube/lang/en.php +++ b/module/sonarqube/lang/en.php @@ -1,15 +1,18 @@ sonarqube = new stdclass; -$lang->sonarqube->common = 'SonarQube'; -$lang->sonarqube->browse = 'SonarQube Browse'; -$lang->sonarqube->search = 'Search'; -$lang->sonarqube->create = 'Create SonarQube'; -$lang->sonarqube->edit = 'Edit SonarQube'; -$lang->sonarqube->delete = 'Delete SonarQube'; -$lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; -$lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; -$lang->sonarqube->browseProject = "SonarQube Project List"; -$lang->sonarqube->execJob = "Exec SonarQube Job"; +$lang->sonarqube->common = 'SonarQube'; +$lang->sonarqube->browse = 'SonarQube Browse'; +$lang->sonarqube->search = 'Search'; +$lang->sonarqube->create = 'Create SonarQube'; +$lang->sonarqube->edit = 'Edit SonarQube'; +$lang->sonarqube->delete = 'Delete SonarQube'; +$lang->sonarqube->confirmDelete = 'Do you want to delete this SonarQube server?'; +$lang->sonarqube->serverFail = 'Connect to SonarQube server failed, please check the SonarQube server.'; +$lang->sonarqube->browseProject = "SonarQube Project List"; +$lang->sonarqube->createProject = "Create SonarQube Project"; +$lang->sonarqube->deleteProject = "Delete SonarQube Project"; +$lang->sonarqube->placeholderSearch = 'Project name'; +$lang->sonarqube->execJob = "Exec SonarQube Job"; $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common} Name"; @@ -31,3 +34,6 @@ $lang->sonarqube->placeholder->url = "Please fill in the access address of the $lang->sonarqube->repeatError = 'Server name or server address already exists!'; $lang->sonarqube->validError = 'Sonarqube user authority authentication failed!'; $lang->sonarqube->hostError = "Invalid SonarQube service address."; + +$lang->sonarqube->projectName = 'Project Name'; +$lang->sonarqube->projectlastAnalysis = 'Last analysis time'; diff --git a/module/sonarqube/lang/zh-cn.php b/module/sonarqube/lang/zh-cn.php index 306938acfc..5a91d937d2 100644 --- a/module/sonarqube/lang/zh-cn.php +++ b/module/sonarqube/lang/zh-cn.php @@ -1,15 +1,18 @@ sonarqube = new stdclass; -$lang->sonarqube->common = 'SonarQube'; -$lang->sonarqube->browse = '浏览SonarQube'; -$lang->sonarqube->search = '搜索'; -$lang->sonarqube->create = '添加SonarQube'; -$lang->sonarqube->edit = '编辑SonarQube'; -$lang->sonarqube->delete = '删除SonarQube'; -$lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; -$lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; -$lang->sonarqube->browseProject = "SonarQube项目列表"; -$lang->sonarqube->execJob = "执行SonarQube任务"; +$lang->sonarqube->common = 'SonarQube'; +$lang->sonarqube->browse = '浏览SonarQube'; +$lang->sonarqube->search = '搜索'; +$lang->sonarqube->create = '添加SonarQube'; +$lang->sonarqube->edit = '编辑SonarQube'; +$lang->sonarqube->delete = '删除SonarQube'; +$lang->sonarqube->confirmDelete = '确认删除该SonarQube吗?'; +$lang->sonarqube->serverFail = '连接SonarQube服务器异常,请检查SonarQube服务器。'; +$lang->sonarqube->browseProject = "SonarQube项目列表"; +$lang->sonarqube->createProject = "创建SonarQube项目"; +$lang->sonarqube->deleteProject = "删除SonarQube项目"; +$lang->sonarqube->placeholderSearch = '请输入项目名称'; +$lang->sonarqube->execJob = "执行SonarQube任务"; $lang->sonarqube->id = 'ID'; $lang->sonarqube->name = "{$lang->sonarqube->common}名称"; @@ -31,3 +34,6 @@ $lang->sonarqube->placeholder->url = "请填写SonarQube Server首页的访问 $lang->sonarqube->repeatError = "服务器名称或服务器地址已存在!"; $lang->sonarqube->validError = "SonarQube 用户权限认证失败!"; $lang->sonarqube->hostError = "无效的SonarQube服务地址。"; + +$lang->sonarqube->projectName = '项目名称'; +$lang->sonarqube->projectlastAnalysis = '最后执行时间'; diff --git a/module/sonarqube/model.php b/module/sonarqube/model.php index 183f75f7f6..089061f014 100644 --- a/module/sonarqube/model.php +++ b/module/sonarqube/model.php @@ -12,6 +12,17 @@ class sonarqubeModel extends model { + /** + * Get a sonarqube by id. + * + * @param int $id + * @access public + * @return object + */ + public function getByID($id) + { + return $this->loadModel('pipeline')->getByID($id); + } /** * Get sonarqube list. @@ -48,7 +59,7 @@ class sonarqubeModel extends model */ public function getApiBase($sonarqubeID) { - $sonarqube = $this->loadModel('pipeline')->getByID($sonarqubeID); + $sonarqube = $this->getByID($sonarqubeID); if(!$sonarqube) return ''; $url = rtrim($sonarqube->url, '/') . '/api/%s'; @@ -71,4 +82,31 @@ class sonarqubeModel extends model $header = 'Authorization: Basic ' . $token; return json_decode(commonModel::http($url, null, array(), $header)); } + + /** + * Get projects of one sonarqube. + * + * @param int $sonarqubeID + * @param string $keyword + * @access public + * @return array + */ + public function apiGetProjects($sonarqubeID, $keyword = '') + { + list($apiRoot, $header) = $this->getApiBase($sonarqubeID); + if(!$apiRoot) return array(); + + $url = sprintf($apiRoot, "projects/search"); + + $allResults = array(); + for($page = 1; true; $page++) + { + $result = json_decode(commonModel::http($url. "?p={$page}&ps=500" . ($keyword ? "&q={$keyword}" : ''), null, array(), $header)); + if(!isset($result->components)) break; + if(!empty($result->components)) $allResults = array_merge($allResults, $result->components); + if(count($result->components) < 500) break; + } + + return $allResults; + } } diff --git a/module/sonarqube/view/browseproject.html.php b/module/sonarqube/view/browseproject.html.php new file mode 100644 index 0000000000..e53afcd5b8 --- /dev/null +++ b/module/sonarqube/view/browseproject.html.php @@ -0,0 +1,74 @@ + + * @package sonarqube + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +
+ noData;?> + + createLink('sonarqube', 'createProject', "sonarqubeID=$sonarqubeID"), " " . $lang->sonarqube->createProject, '', "class='btn btn-info'");?> + +
+