diff --git a/module/gitlab/control.php b/module/gitlab/control.php
index 4c032b8446..4c00ae87be 100644
--- a/module/gitlab/control.php
+++ b/module/gitlab/control.php
@@ -304,6 +304,7 @@ class gitlab extends control
{
$gitlabGroupList = $this->gitlab->apiGetGroups($gitlabID, $orderBy);
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseGroup;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabGroupList = $gitlabGroupList;
$this->view->orderBy = $orderBy;
@@ -329,6 +330,7 @@ class gitlab extends control
$gitlab = $this->gitlab->getByID($gitlabID);
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->group->create;
$this->view->gitlab = $gitlab;
$this->view->gitlabID = $gitlabID;
$this->display();
@@ -355,12 +357,129 @@ class gitlab extends control
$gitlab = $this->gitlab->getByID($gitlabID);
$group = $this->gitlab->apiGetSingleGroup($gitlabID, $groupID);
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->group->edit;
$this->view->gitlab = $gitlab;
$this->view->group = $group;
$this->view->gitlabID = $gitlabID;
$this->display();
}
+ /**
+ * Delete a gitlab group.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @access public
+ * @return void
+ */
+ public function deleteGroup($gitlabID, $groupID, $confirm = 'no')
+ {
+ if($confirm != 'yes') die(js::confirm($this->lang->gitlab->group->confirmDelete , inlink('deleteGroup', "gitlabID=$gitlabID&groupID=$groupID&confirm=yes")));
+
+ $reponse = $this->gitlab->apiDeleteGroup($gitlabID, $groupID);
+ if(!$reponse or substr($reponse->message, 0, 2) == '20') die(js::reload('parent'));
+ die(js::alert($reponse->message));
+ }
+
+ /**
+ * Manage a gitlab group members.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @access public
+ * @return void
+ */
+ public function manageGroupMembers($gitlabID, $groupID)
+ {
+ if($_POST)
+ {
+ $data = (array) fixer::input('post')->get();
+ extract($data);
+
+ $ids = array_filter($ids);
+ if(count($ids) != count(array_unique($ids))) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->group->repeatError));
+ $newMembers = array();
+ foreach($ids as $key => $id)
+ {
+ /* Check whether each member has selected accesslevel. */
+ if(empty($levels[$key])) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->group->memberAccessLevel . $this->lang->gitlab->group->emptyError ));
+
+ $newMembers[$id] = (object)array('access_level'=>$levels[$key], 'expires_at'=>$expires[$key]);
+ }
+
+ $currentMembers = $this->gitlab->apiGetGroupMembers($gitlabID, $groupID);
+
+ /* Get the updated,deleted data. */
+ $addedMembers = $deletedMembers = $updatedMembers = array();
+ foreach($currentMembers as $currentMember)
+ {
+ if(empty($newMembers[$currentMember->id]))
+ {
+ $deletedMembers[] = $currentMember->id;
+ }
+ else
+ {
+ if($newMembers[$currentMember->id]->access_level != $currentMember->access_level or $newMembers[$currentMember->id]->expires_at != $currentMember->expires_at) $updatedMembers[] = (object)array('user_id' => $currentMember->id, 'access_level' => $newMembers[$currentMember->id]->access_level, 'expires_at' => $newMembers[$currentMember->id]->expires_at);
+ }
+ }
+ /* Get the added data. */
+ foreach($newMembers as $id => $newMember)
+ {
+ $exist = FALSE;
+ foreach($currentMembers as $currentMember)
+ {
+ if($currentMember->id == $id)
+ {
+ $exist = TRUE;
+ break;
+ }
+ }
+ if($exist == FALSE) $addedMembers[] = (object)array('user_id' => $id, 'access_level' => $newMembers[$id]->access_level, 'expires_at' => $newMembers[$id]->expires_at);
+ }
+
+ if(count($addedMembers) > 0)
+ {
+ foreach($addedMembers as $addedMember)
+ {
+ $this->gitlab->apiCreateGroupMember($gitlabID, $groupID, $addedMember);
+ }
+ }
+ if(count($updatedMembers) > 0)
+ {
+ foreach($updatedMembers as $updatedMember)
+ {
+ $this->gitlab->apiUpdateGroupMember($gitlabID, $groupID, $updatedMember);
+ }
+ }
+ if(count($deletedMembers) > 0)
+ {
+ foreach($deletedMembers as $deletedMemberID)
+ {
+ $this->gitlab->apiDeleteGroupMember($gitlabID, $groupID, $deletedMemberID);
+ }
+ }
+
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('groupBrowse', "gitlabID=$gitlabID")));
+ }
+
+ /* Get gitlab users data. */
+ $gitlabUserList = $this->gitlab->apiGetUsers($gitlabID);
+ $gitlabUsers = array(''=>'');
+ foreach($gitlabUserList as $gitlabUser)
+ {
+ $gitlabUsers[$gitlabUser->id] = $gitlabUser->realname;
+ }
+
+ $accessLevels = $this->lang->gitlab->accessLevels;
+ $currentMembers = $this->gitlab->apiGetGroupMembers($gitlabID, $groupID);
+
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->group->manageMembers;
+ $this->view->currentMembers = $currentMembers;
+ $this->view->gitlabUsers = $gitlabUsers;
+ $this->view->gitlabID = $gitlabID;
+ $this->display();
+ }
+
/**
* Browse gitlab project.
*
@@ -370,6 +489,7 @@ class gitlab extends control
*/
public function userBrowse($gitlabID)
{
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseUser;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabUserList = $this->gitlab->apiGetUsers($gitlabID);
$this->display();
@@ -394,6 +514,7 @@ class gitlab extends control
$userPairs = $this->loadModel('user')->getPairs('noclosed|noletter');
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->user->create;
$this->view->userPairs = $userPairs;
$this->view->gitlabID = $gitlabID;
$this->display();
@@ -421,6 +542,7 @@ class gitlab extends control
$user = $this->gitlab->apiGetSingleUser($gitlabID, $userID);
$zentaoBindAccount = $this->dao->select('account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('openID')->eq($user->id)->fetch('account');
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->user->edit;
$this->view->user = $user;
$this->view->userPairs = $userPairs;
$this->view->zentaoBindAccount = $zentaoBindAccount;
@@ -454,6 +576,7 @@ class gitlab extends control
*/
public function projectBrowse($gitlabID)
{
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->browseProject;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabProjectList = $this->gitlab->apiGetProjects($gitlabID);
$this->display();
@@ -488,6 +611,7 @@ class gitlab extends control
if($namespace->kind == 'group') $namespaces[$namespace->id] = $namespace->path;
}
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->project->create;
$this->view->gitlab = $gitlab;
$this->view->user = $user;
$this->view->namespaces = $namespaces;
@@ -514,6 +638,8 @@ class gitlab extends control
}
$project = $this->gitlab->apiGetSingleProject($gitlabID, $projectID);
+
+ $this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->project->edit;
$this->view->project = $project;
$this->view->gitlabID = $gitlabID;
$this->display();
diff --git a/module/gitlab/js/managegroupmembers.js b/module/gitlab/js/managegroupmembers.js
new file mode 100644
index 0000000000..589e0ffc61
--- /dev/null
+++ b/module/gitlab/js/managegroupmembers.js
@@ -0,0 +1,46 @@
+/**
+ * Save team members.
+ *
+ * @access public
+ * @return void
+ */
+function saveMembers()
+{
+ $('#saveBtn').addClass('hidden');
+ $('#submit').removeClass('hidden');
+ $('#submit').click();
+}
+
+/**
+ * Add item.
+ *
+ * @param object $obj
+ * @access public
+ * @return void
+ */
+function addItem(obj)
+{
+ var item = $('#addItem').html().replace(/%i%/g, i);
+ $(obj).closest('tr').after('
' + item + '
');
+ var selects = $(obj).closest('tr').next('tr').find('select');
+ selects.each(function()
+ {
+ $(this).trigger('liszt:updated');
+ $(this).chosen();
+ });
+ $(obj).closest('tr').next('tr').find('.form-date').datetimepicker();
+ i ++;
+}
+
+/**
+ * Delete item.
+ *
+ * @param object $obj
+ * @access public
+ * @return void
+ */
+function deleteItem(obj)
+{
+ if($('#teamForm .table tbody').children().length < 2) return false;
+ $(obj).closest('tr').remove();
+}
\ No newline at end of file
diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php
index 5dd129ffcb..852766854f 100644
--- a/module/gitlab/lang/en.php
+++ b/module/gitlab/lang/en.php
@@ -55,6 +55,12 @@ $lang->gitlab->bindUserError = "Can not bind users repeatedly %s";
$lang->gitlab->importIssueError = "The execution to which this issue belongs is not selected.";
$lang->gitlab->importIssueWarn = "There is a problem of import failure, you can try to import again.";
+$lang->gitlab->accessLevel[10] = 'Guest';
+$lang->gitlab->accessLevel[20] = 'Reporter';
+$lang->gitlab->accessLevel[30] = 'Developer';
+$lang->gitlab->accessLevel[40] = 'Maintainer';
+$lang->gitlab->accessLevel[50] = 'Owner';
+
$lang->gitlab->project = new stdclass;
$lang->gitlab->project->id = "Project ID";
$lang->gitlab->project->name = "Project name";
@@ -131,3 +137,8 @@ $lang->gitlab->group->createOn = "Created on";
$lang->gitlab->group->members = "Group Members";
$lang->gitlab->group->confirmDelete = 'Do you want to delete this GitLab group?';
$lang->gitlab->group->emptyError = "cannot be empty";
+$lang->gitlab->group->manageMembers = 'Manage Group Members';
+$lang->gitlab->group->memberName = 'Account';
+$lang->gitlab->group->memberAccessLevel = 'Access Level';
+$lang->gitlab->group->memberExpiresAt = 'Expiration time';
+$lang->gitlab->group->repeatError = "Group members cannot be added repeatedly";
diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php
index e02796e28e..2478741776 100644
--- a/module/gitlab/lang/zh-cn.php
+++ b/module/gitlab/lang/zh-cn.php
@@ -55,6 +55,12 @@ $lang->gitlab->bindUserError = "不能重复绑定用户 %s";
$lang->gitlab->importIssueError = "未选择该issue所属的执行。";
$lang->gitlab->importIssueWarn = "存在导入失败的issue,可再次尝试导入。";
+$lang->gitlab->accessLevels[10] = '客人';
+$lang->gitlab->accessLevels[20] = '报告者';
+$lang->gitlab->accessLevels[30] = '开发者';
+$lang->gitlab->accessLevels[40] = '维护者';
+$lang->gitlab->accessLevels[50] = '所有者';
+
$lang->gitlab->project = new stdclass;
$lang->gitlab->project->id = "项目ID";
$lang->gitlab->project->name = "项目名称";
@@ -131,3 +137,8 @@ $lang->gitlab->group->createOn = "创建于";
$lang->gitlab->group->members = "群组成员";
$lang->gitlab->group->confirmDelete = '确认删除该GitLab群组吗?';
$lang->gitlab->group->emptyError = "不能为空";
+$lang->gitlab->group->manageMembers = '群组成员管理';
+$lang->gitlab->group->memberName = '账号';
+$lang->gitlab->group->memberAccessLevel = '角色权限';
+$lang->gitlab->group->memberExpiresAt = '过期时间';
+$lang->gitlab->group->repeatError = "群组成员不能重复添加";
\ No newline at end of file
diff --git a/module/gitlab/model.php b/module/gitlab/model.php
index 16b618de3b..5978ffb8f9 100644
--- a/module/gitlab/model.php
+++ b/module/gitlab/model.php
@@ -474,6 +474,30 @@ class gitlabModel extends model
return $users;
}
+ /**
+ * Get group members of one gitlab.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @access public
+ * @return object
+ */
+ public function apiGetGroupMembers($gitlabID, $groupID)
+ {
+ $apiRoot = $this->getApiRoot($gitlabID);
+ $url = sprintf($apiRoot, "/groups/$groupID/members/all");
+
+ $allResults = array();
+ for($page = 1; true; $page++)
+ {
+ $results = json_decode(commonModel::http($url . "&&page={$page}&per_page=100"));
+ if(!empty($results)) $allResults = array_merge($allResults, $results);
+ if(count($results)<100) break;
+ }
+
+ return $allResults;
+ }
+
/**
* Get namespaces of one gitlab.
*
@@ -582,6 +606,58 @@ class gitlabModel extends model
return json_decode(commonModel::http($url, $project));
}
+ /**
+ * Add a gitab group member by api.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @param object $member
+ * @access public
+ * @return object
+ */
+ public function apiCreateGroupMember($gitlabID, $groupID, $member)
+ {
+ if(empty($member->user_id) or empty($member->access_level)) return false;
+
+ $apiRoot = $this->getApiRoot($gitlabID);
+ $url = sprintf($apiRoot, "/groups/{$groupID}/members");
+ return json_decode(commonModel::http($url, $member));
+ }
+
+ /**
+ * Update a gitab group member by api.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @param object $member
+ * @access public
+ * @return object
+ */
+ public function apiUpdateGroupMember($gitlabID, $groupID, $member)
+ {
+ if(empty($member->user_id) or empty($member->access_level)) return false;
+
+ $apiRoot = $this->getApiRoot($gitlabID);
+ $url = sprintf($apiRoot, "/groups/{$groupID}/members/{$member->user_id}");
+ return json_decode(commonModel::http($url, $member, $options = array(CURLOPT_CUSTOMREQUEST => 'PUT')));
+ }
+
+ /**
+ * Delete a gitab group member by api.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @param int $memberID
+ * @access public
+ * @return object
+ */
+ public function apiDeleteGroupMember($gitlabID, $groupID, $memberID)
+ {
+ $apiRoot = $this->getApiRoot($gitlabID);
+ $url = sprintf($apiRoot, "/groups/{$groupID}/members/{$memberID}");
+ return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE')));
+ }
+
/**
* Create a gitab user by api.
*
@@ -633,6 +709,23 @@ class gitlabModel extends model
return json_decode(commonModel::http($url, $group, $options = array(CURLOPT_CUSTOMREQUEST => 'PUT')));
}
+ /**
+ * Delete a gitab group by api.
+ *
+ * @param int $gitlabID
+ * @param int $groupID
+ * @access public
+ * @return object
+ */
+ public function apiDeleteGroup($gitlabID, $groupID)
+ {
+ if(empty($groupID)) return false;
+
+ $apiRoot = $this->getApiRoot($gitlabID);
+ $url = sprintf($apiRoot, "/groups/{$groupID}");
+ return json_decode(commonModel::http($url, array(), $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE')));
+ }
+
/**
* Update a gitab project by api.
*
diff --git a/module/gitlab/view/groupbrowse.html.php b/module/gitlab/view/groupbrowse.html.php
index 4501a5362d..3fe83fafae 100644
--- a/module/gitlab/view/groupbrowse.html.php
+++ b/module/gitlab/view/groupbrowse.html.php
@@ -51,7 +51,7 @@
created_at, 0, 10);?> |
id", " ", '',"title={$lang->gitlab->group->members} class='btn btn-primary'");
+ common::printLink('gitlab', 'manageGroupMembers', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", " ", '',"title={$lang->gitlab->group->manageMembers} class='btn btn-primary'");
common::printLink('gitlab', 'editGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id", " ", '', "title={$lang->gitlab->group->edit} class='btn btn-primary'");
if(common::hasPriv('gitlab', 'delete')) echo html::a($this->createLink('gitlab', 'deleteGroup', "gitlabID=$gitlabID&groupID=$gitlabGroup->id"), '', 'hiddenwin', "title='{$lang->gitlab->group->confirmDelete}' class='btn'");
?>
diff --git a/module/gitlab/view/managegroupmembers.html.php b/module/gitlab/view/managegroupmembers.html.php
new file mode 100644
index 0000000000..9f75db25ba
--- /dev/null
+++ b/module/gitlab/view/managegroupmembers.html.php
@@ -0,0 +1,82 @@
+
+
+
+
+
+ {$lang->gitlab->group->manageMembers}");?>
+
+
+
+
+
+
+
+
+ |
+ '') + $this->lang->gitlab->accessLevels, '', "class='form-control'");?> |
+ |
+
+ ", '', "onclick='addItem(this)' class='btn btn-link'");?>
+ ", '', "onclick='deleteItem(this)' class='btn btn-link'");?>
+ |
+
+
+
+
diff --git a/module/gitlab/view/projectbrowse.html.php b/module/gitlab/view/projectbrowse.html.php
index caf64c970b..af7e7ec78f 100644
--- a/module/gitlab/view/projectbrowse.html.php
+++ b/module/gitlab/view/projectbrowse.html.php
@@ -42,7 +42,7 @@
$gitlabProject): ?>
|
| id;?> |
- name;?> |
+ name_with_namespace;?> |
star_count;?>
forks_count;?>
diff --git a/module/mr/control.php b/module/mr/control.php
index a996519dcb..fd05fae1b0 100644
--- a/module/mr/control.php
+++ b/module/mr/control.php
@@ -41,6 +41,9 @@ class mr extends control
/* Sync GitLab MR to ZenTao Database. */
$MRList = $this->mr->batchSyncMR($MRList);
+ /* Load lang from compile module */
+ $this->app->loadLang('compile');
+
$this->view->title = $this->lang->mr->common . $this->lang->colon . $this->lang->mr->browse;
$this->view->MRList = $MRList;
$this->view->pager = $pager;
diff --git a/module/mr/view/browse.html.php b/module/mr/view/browse.html.php
index 90d2d33c7f..f5a1286826 100644
--- a/module/mr/view/browse.html.php
+++ b/module/mr/view/browse.html.php
@@ -54,6 +54,7 @@
| mr->targetProject); ?> |
mr->targetBranch); ?> |
mr->mergeStatus); ?> |
+ mr->approvalStatus); ?> |
actions; ?> |
@@ -66,7 +67,18 @@
sourceBranch;?> |
loadModel('gitlab')->apiGetSingleProject($MR->gitlabID, $MR->targetProject)->name_with_namespace; ?> |
targetBranch;?> |
- status == 'merged') ? zget($lang->mr->statusList, $MR->status) : zget($lang->mr->mergeStatusList, $MR->mergeStatus); ?> |
+
+ status == 'closed'): ?>
+ mr->statusList, $MR->status); ?> |
+
+ status == 'merged') ? zget($lang->mr->statusList, $MR->status) : zget($lang->mr->mergeStatusList, $MR->mergeStatus); ?> |
+
+
+ status == 'merged' or $MR->status == 'closed'): ?>
+ |
+
+ approvalStatus) ? $lang->mr->approvalStatusList['notReviewed'] : $lang->mr->approvalStatusList[$MR->approvalStatus]; ?> |
+
id}", '', '', "title='{$lang->mr->view}' class='btn btn-info'");
|