diff --git a/module/ci/model.php b/module/ci/model.php index 867cd5dc9e..b8f7231975 100644 --- a/module/ci/model.php +++ b/module/ci/model.php @@ -24,8 +24,9 @@ class ciModel extends model $this->session->set('repoID', $repoID); session_write_close(); } - $homeMenuMethod = array('gitlab-browse', 'gitlab-create', 'gitlab-edit', 'gitlab-binduser', 'gogs-browse', 'gogs-create', 'gogs-edit', 'gitea-browse', 'gitea-create', 'gitea-edit', 'jenkins-browse', 'jenkins-create', 'jenkins-edit', 'sonarqube-browse', 'sonarqube-create', 'sonarqube-edit'); - if(!in_array("{$this->app->moduleName}-{$this->app->methodName}", $homeMenuMethod)) common::setMenuVars('devops', $this->session->repoID); + + $homeMenuModule = array('gitlab', 'gogs', 'gitea', 'jenkins', 'sonarqube'); + if(!in_array("{$this->app->moduleName}", $homeMenuModule)) common::setMenuVars('devops', $this->session->repoID); if($this->session->repoID) { diff --git a/module/gitlab/config/dtable.php b/module/gitlab/config/dtable.php index 555bf5bf63..6ea4dd416e 100644 --- a/module/gitlab/config/dtable.php +++ b/module/gitlab/config/dtable.php @@ -74,3 +74,95 @@ $config->gitlab->dtable->bindUser->fieldList['status']['title'] = $lang->gitlab- $config->gitlab->dtable->bindUser->fieldList['status']['type'] = 'html'; $config->gitlab->dtable->bindUser->fieldList['status']['width'] = 100; $config->gitlab->dtable->bindUser->fieldList['status']['map'] = $lang->gitlab->bindStatus; + +$config->gitlab->dtable->project = new stdclass(); + +$config->gitlab->dtable->project->fieldList['id']['title'] = $lang->gitlab->id; +$config->gitlab->dtable->project->fieldList['id']['sortType'] = true; + +$config->gitlab->dtable->project->fieldList['name']['title'] = $lang->gitlab->project->name; +$config->gitlab->dtable->project->fieldList['name']['name'] = 'name_with_namespace'; +$config->gitlab->dtable->project->fieldList['name']['sortType'] = true; + +$config->gitlab->dtable->project->fieldList['star']['title'] = ''; + +$config->gitlab->dtable->project->fieldList['lastUpdate']['title'] = $lang->gitlab->lastUpdate; +$config->gitlab->dtable->project->fieldList['lastUpdate']['type'] = 'date'; +$config->gitlab->dtable->project->fieldList['lastUpdate']['sortType'] = false; + +$config->gitlab->dtable->project->fieldList['actions']['name'] = 'actions'; +$config->gitlab->dtable->project->fieldList['actions']['title'] = $lang->actions; +$config->gitlab->dtable->project->fieldList['actions']['type'] = 'actions'; +$config->gitlab->dtable->project->fieldList['actions']['menu'] = array('browseBranch', 'browseTag', 'manageBranchPriv', 'manageTagPriv', 'manageProjectMembers', 'createWebhook', 'importIssue', 'editProject', 'deleteProject'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['browseBranch']['icon'] = 'treemap'; +$config->gitlab->dtable->project->fieldList['actions']['list']['browseBranch']['hint'] = $lang->gitlab->browseBranch; +$config->gitlab->dtable->project->fieldList['actions']['list']['browseBranch']['url'] = helper::createLink('gitlab', 'browseBranch', 'gitlabID={gitlabID}&projectID={id}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['browseTag']['icon'] = 'tag'; +$config->gitlab->dtable->project->fieldList['actions']['list']['browseTag']['hint'] = $lang->gitlab->browseTag; +$config->gitlab->dtable->project->fieldList['actions']['list']['browseTag']['url'] = helper::createLink('gitlab', 'browseTag', 'gitlabID={gitlabID}&projectID={id}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['manageBranchPriv']['icon'] = 'tag'; +$config->gitlab->dtable->project->fieldList['actions']['list']['manageBranchPriv']['hint'] = $lang->gitlab->browseBranchPriv; +$config->gitlab->dtable->project->fieldList['actions']['list']['manageBranchPriv']['url'] = helper::createLink('gitlab', 'manageBranchPriv', 'gitlabID={gitlabID}&projectID={id}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['manageTagPriv']['icon'] = 'tag-lock'; +$config->gitlab->dtable->project->fieldList['actions']['list']['manageTagPriv']['hint'] = $lang->gitlab->browseTagPriv; +$config->gitlab->dtable->project->fieldList['actions']['list']['manageTagPriv']['url'] = helper::createLink('gitlab', 'manageTagPriv', 'gitlabID={gitlabID}&projectID={id}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['manageProjectMembers']['icon'] = 'team'; +$config->gitlab->dtable->project->fieldList['actions']['list']['manageProjectMembers']['hint'] = $lang->gitlab->manageProjectMembers; +$config->gitlab->dtable->project->fieldList['actions']['list']['manageProjectMembers']['url'] = helper::createLink('gitlab', 'manageProjectMembers', 'repoID={repoID}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['createWebhook']['icon'] = 'change'; +$config->gitlab->dtable->project->fieldList['actions']['list']['createWebhook']['hint'] = $lang->gitlab->createWebhook; +$config->gitlab->dtable->project->fieldList['actions']['list']['createWebhook']['url'] = helper::createLink('gitlab', 'createWebhook', 'repoID={repoID}'); +$config->gitlab->dtable->project->fieldList['actions']['list']['createWebhook']['className'] = 'ajax-submit'; + +$config->gitlab->dtable->project->fieldList['actions']['list']['importIssue']['icon'] = 'link'; +$config->gitlab->dtable->project->fieldList['actions']['list']['importIssue']['hint'] = $lang->gitlab->importIssue; +$config->gitlab->dtable->project->fieldList['actions']['list']['importIssue']['url'] = helper::createLink('gitlab', 'importIssue', 'gitlabID={gitlabID}&projectID={id}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['editProject']['icon'] = 'edit'; +$config->gitlab->dtable->project->fieldList['actions']['list']['editProject']['hint'] = $lang->gitlab->editProject; +$config->gitlab->dtable->project->fieldList['actions']['list']['editProject']['url'] = helper::createLink('gitlab', 'editProject', 'gitlabID={gitlabID}&projectID={id}'); + +$config->gitlab->dtable->project->fieldList['actions']['list']['deleteProject']['icon'] = 'trash'; +$config->gitlab->dtable->project->fieldList['actions']['list']['deleteProject']['hint'] = $lang->gitlab->deleteProject; +$config->gitlab->dtable->project->fieldList['actions']['list']['deleteProject']['url'] = helper::createLink('gitlab', 'deleteProject', 'gitlabID={gitlabID}&projectID={id}'); +$config->gitlab->dtable->project->fieldList['actions']['list']['deleteProject']['className'] = 'ajax-submit'; + +$config->gitlab->dtable->group = new stdclass(); + +$config->gitlab->dtable->group->fieldList['id']['title'] = $lang->gitlab->group->id; +$config->gitlab->dtable->group->fieldList['id']['sortType'] = true; + +$config->gitlab->dtable->group->fieldList['fullName']['title'] = $lang->gitlab->group->name; +$config->gitlab->dtable->group->fieldList['fullName']['name'] = 'fullName'; +$config->gitlab->dtable->group->fieldList['fullName']['type'] = 'avatarBtn'; +$config->gitlab->dtable->group->fieldList['fullName']['sortType'] = true; + +$config->gitlab->dtable->group->fieldList['path']['title'] = $lang->gitlab->group->path; +$config->gitlab->dtable->group->fieldList['path']['name'] = 'full_path'; +$config->gitlab->dtable->group->fieldList['path']['sortType'] = true; + +$config->gitlab->dtable->group->fieldList['createOn']['title'] = $lang->gitlab->group->createOn; + +$config->gitlab->dtable->group->fieldList['actions']['name'] = 'actions'; +$config->gitlab->dtable->group->fieldList['actions']['title'] = $lang->actions; +$config->gitlab->dtable->group->fieldList['actions']['type'] = 'actions'; +$config->gitlab->dtable->group->fieldList['actions']['menu'] = array('manageGroupMembers', 'editGroup', 'deleteGroup'); + +$config->gitlab->dtable->group->fieldList['actions']['list']['manageGroupMembers']['icon'] = 'team'; +$config->gitlab->dtable->group->fieldList['actions']['list']['manageGroupMembers']['hint'] = $lang->gitlab->group->manageMembers; +$config->gitlab->dtable->group->fieldList['actions']['list']['manageGroupMembers']['url'] = helper::createLink('gitlab', 'manageGroupMembers', 'gitlabID={gitlabID}&groupID={id}'); + +$config->gitlab->dtable->group->fieldList['actions']['list']['editGroup']['icon'] = 'edit'; +$config->gitlab->dtable->group->fieldList['actions']['list']['editGroup']['hint'] = $lang->gitlab->editGroup; +$config->gitlab->dtable->group->fieldList['actions']['list']['editGroup']['url'] = helper::createLink('gitlab', 'editGroup', 'gitlabID={gitlabID}&groupID={id}'); + +$config->gitlab->dtable->group->fieldList['actions']['list']['deleteGroup']['icon'] = 'trash'; +$config->gitlab->dtable->group->fieldList['actions']['list']['deleteGroup']['hint'] = $lang->gitlab->deleteGroup; +$config->gitlab->dtable->group->fieldList['actions']['list']['deleteGroup']['url'] = helper::createLink('gitlab', 'deleteGroup', 'gitlabID={gitlabID}&groupID={id}'); +$config->gitlab->dtable->group->fieldList['actions']['list']['deleteGroup']['className'] = 'ajax-submit'; diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 18a3b4c083..533ee40561 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -362,9 +362,10 @@ class gitlab extends control if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse'))); } + $fixOrderBy = str_replace('fullName', 'name', $orderBy); $keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); - $groups = $this->gitlab->apiGetGroups($gitlabID, $orderBy, '', $keyword); - $adminGroups = $this->gitlab->apiGetGroups($gitlabID, $orderBy, 'owner', $keyword); + $groups = $this->gitlab->apiGetGroups($gitlabID, $fixOrderBy, '', $keyword); + $adminGroups = $this->gitlab->apiGetGroups($gitlabID, $fixOrderBy, 'owner', $keyword); $adminGroupIDList = array(); foreach($adminGroups as $group) $adminGroupIDList[] = $group->id; diff --git a/module/gitlab/css/browsegroup.ui.css b/module/gitlab/css/browsegroup.ui.css new file mode 100644 index 0000000000..8b1c756c1a --- /dev/null +++ b/module/gitlab/css/browsegroup.ui.css @@ -0,0 +1 @@ +#groupDropmenu .icon-angle-right {display: none;} diff --git a/module/gitlab/js/browsegroup.ui.js b/module/gitlab/js/browsegroup.ui.js new file mode 100644 index 0000000000..71dc6fc791 --- /dev/null +++ b/module/gitlab/js/browsegroup.ui.js @@ -0,0 +1,23 @@ +window.renderCell = function(result, {col, row}) +{ + if(col.name === 'full_path') + { + result[0] = {html:'' + row.data.full_path + '', style:{flexDirection:"column"}}; + return result; + } + + return result; +}; + +window.createSortLink = function(col) +{ + var sort = col.name + '_asc'; + if(sort == orderBy) sort = col.name + '_desc'; + + return sortLink.replace('{orderBy}', sort); +} + +function searchGroup() +{ + loadPage({method:'post', data: {keyword: $('#keyword').val()}, target: '#table-gitlab-browsegroup>*'}); +} diff --git a/module/gitlab/model.php b/module/gitlab/model.php index c41b8eb58c..e0069335df 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -3008,7 +3008,21 @@ class gitlabModel extends model */ public function isClickable(object $gitlab, string $action): bool { - return commonModel::hasPriv('space', 'browse'); + if(!commonModel::hasPriv('space', 'browse')) return false; + + if($action == 'browseBranch') return $object->isDeveloper; + if($action == 'browseTag') return $object->isDeveloper; + if($action == 'manageProjectMembers') return $object->hasRepo; + if($action == 'createWebhook') return $object->hasRepo; + if($action == 'manageBranchPriv') return $object->defaultBranch; + if($action == 'manageTagPriv') return $object->defaultBranch; + if($action == 'editProject') return $object->defaultBranch; + if($action == 'deleteProject') return $object->defaultBranch; + + if($action == 'editGroup') return $object->isAdmin; + if($action == 'deleteGroup') return $object->isAdmin; + + return true; } /** diff --git a/module/gitlab/ui/browsegroup.html.php b/module/gitlab/ui/browsegroup.html.php new file mode 100644 index 0000000000..dd563239c2 --- /dev/null +++ b/module/gitlab/ui/browsegroup.html.php @@ -0,0 +1,107 @@ + + * @package gitlab + * @link https://www.zentao.net + */ +namespace zin; + +jsVar('orderBy', $orderBy); +jsVar('sortLink', helper::createLink('gitlab', 'browseGroup', "gitlabID={$gitlabID}&orderBy={orderBy}")); +jsVar('gitlabUrl', $gitlab->url); + +$canCreate = hasPriv('instance', 'manage'); + +$menus = $items = array(); +$gitlabs = $this->gitlab->getPairs(); +foreach($gitlabs as $id => $gitlabName) +{ + $menus[] = array('text' => $gitlabName, 'id' => $id, 'keys' => zget(common::convert2Pinyin(array($gitlabName), $gitlabName), ''), 'url' => helper::createLink('gitlab', zget($config->gitlab->menus, 'group', 'group'), "gitlabID={$id}")); +} +foreach($config->gitlab->menus as $key => $method) +{ + $langKey = 'browse' . ucwords($key); + $items[] = li + ( + setClass('nav-item'), + a + ( + setClass('' . ($key == 'group' ? 'active' : '')), + set::href(createLink('gitlab', $method, "gitlabID={$gitlabID}")), + $lang->gitlab->$langKey, + ) + ); +} + +foreach($gitlabGroupList as $gitlabGroup) +{ + $gitlabGroup->fullName = $gitlabGroup->full_name; + $gitlabGroup->gitlabID = $gitlabID; + $gitlabGroup->createOn = substr($gitlabGroup->created_at, 0, 10); + $gitlabGroup->isAdmin = $app->user->admin || in_array($gitlabGroup->id, $adminGroupIDList); +} +foreach($config->gitlab->dtable->group->fieldList['actions']['list'] as $action => $gitlabConfig) +{ + if(!$this->gitlab->isDisplay($gitlab, $action)) unset($config->gitlab->dtable->group->fieldList['actions']['list'][$action]); +} + +$config->gitlab->dtable->group->fieldList['fullName']['avatarProps'] = jsRaw("(col, row) => ({text: row.data.name})"); +$gitlabGroupList = initTableData($gitlabGroupList, $config->gitlab->dtable->group->fieldList, $this->gitlab); + +featureBar +( + dropmenu + ( + set::id('groupDropmenu'), + set::objectID($gitlabID), + set::text($gitlab->name), + set::data(array('data' => array('group' => $menus), 'tabs' => array(array('name' => 'group', 'text' => '')))), + ), + $items, + form + ( + set::id('searchForm'), + set::actions(array()), + formRow + ( + input + ( + set::placeholder($lang->gitlab->placeholderSearch), + set::name('keyword'), + set::value($keyword) + ), + btn + ( + setClass('primary'), + $lang->gitlab->search, + on::click('searchGroup') + ) + ) + ) +); + +toolBar +( + $canCreate ? item(set(array + ( + 'text' => $lang->gitlab->group->create, + 'icon' => 'plus', + 'class' => 'btn primary', + 'url' => createLink('gitlab', 'createGroup', "gitlabID={$gitlabID}"), + ))) : null, +); + +dtable +( + set::cols($config->gitlab->dtable->group->fieldList), + set::data($gitlabGroupList), + set::sortLink(jsRaw('createSortLink')), + set::onRenderCell(jsRaw('window.renderCell')), + set::orderBy($orderBy), +); + +render(); diff --git a/module/gitlab/ui/browseproject.html.php b/module/gitlab/ui/browseproject.html.php index fa65578170..72cb1527d9 100644 --- a/module/gitlab/ui/browseproject.html.php +++ b/module/gitlab/ui/browseproject.html.php @@ -44,6 +44,7 @@ foreach($gitlabProjectList as $gitlabProject) $gitlabProject->hasRepo = isset($repoPairs[$gitlabProject->id]) ? true : false; $gitlabProject->defaultBranch = $gitlabProject->adminer || $gitlabProject->isMaintainer; $gitlabProject->repoID = zget($repoPairs, $gitlabProject->id); + $gitlabProject->gitlabID = $gitlabID; } foreach($config->gitlab->dtable->project->fieldList['actions']['list'] as $action => $gitlabConfig) {