diff --git a/module/common/model.php b/module/common/model.php
index c03fe7a146..50b8ac7d77 100644
--- a/module/common/model.php
+++ b/module/common/model.php
@@ -298,6 +298,38 @@ class commonModel extends model
if($this->config->edition == 'max' && $this->config->vision == 'rnd') $this->config->openedApproval = true;
}
+ /**
+ * 获取表单的配置项。
+ * Obtain the config for the form.
+ *
+ * @param string $module
+ * @param string $method
+ * @static
+ * @access public
+ * @return array
+ */
+ public static function formConfig(string $module, string $method): array
+ {
+ global $config, $app, $dbh;
+ if($config->edition == 'open') return array();
+
+ $required = $dbh->query("SELECT * FROM " . TABLE_WORKFLOWRULE . " WHERE `type` = 'system' and `rule` = 'notempty'")->fetch();
+ $fields = $app->control->loadModel('flow')->getExtendFields($module, $method);
+ $formConfig = array();
+ $type = 'string';
+ foreach($fields as $fieldObject)
+ {
+ if(strpos($fieldObject->type, 'int') !== false) $type = 'int';
+ if(strpos($fieldObject->type, 'date') !== false) $type = 'date';
+ if(in_array($fieldObject->type, array('float', 'decimal'))) $type = 'float';
+
+ $formConfig[$fieldObject->field] = array('type' => $type, 'default' => $fieldObject->default, 'control' => $fieldObject->control, 'rules' => $fieldObject->rules);
+ $formConfig[$fieldObject->field]['required'] = strpos(",{$fieldObject->rules},", ",{$required->id},") !== false;
+ if(in_array($fieldObject->control, array('multi-select', 'checkbox'))) $formConfig[$fieldObject->field]['filter'] = 'join';
+ }
+ return $formConfig;
+ }
+
/**
* Load configs from database and save it to config->system and config->personal.
*
diff --git a/module/gitea/config/dtable.php b/module/gitea/config/dtable.php
new file mode 100644
index 0000000000..2f03412c21
--- /dev/null
+++ b/module/gitea/config/dtable.php
@@ -0,0 +1,52 @@
+loadLang('gitea');
+
+$config->gitea->dtable = new stdclass();
+
+$config->gitea->dtable->fieldList['id']['title'] = 'ID';
+$config->gitea->dtable->fieldList['id']['name'] = 'id';
+$config->gitea->dtable->fieldList['id']['type'] = 'number';
+$config->gitea->dtable->fieldList['id']['sortType'] = 'desc';
+$config->gitea->dtable->fieldList['id']['checkbox'] = false;
+$config->gitea->dtable->fieldList['id']['width'] = '80';
+
+$config->gitea->dtable->fieldList['name']['title'] = $lang->gitea->name;
+$config->gitea->dtable->fieldList['name']['name'] = 'name';
+$config->gitea->dtable->fieldList['name']['type'] = 'desc';
+$config->gitea->dtable->fieldList['name']['sortType'] = true;
+$config->gitea->dtable->fieldList['name']['hint'] = true;
+$config->gitea->dtable->fieldList['name']['minWidth'] = '356';
+
+$config->gitea->dtable->fieldList['url']['title'] = $lang->gitea->url;
+$config->gitea->dtable->fieldList['url']['name'] = 'url';
+$config->gitea->dtable->fieldList['url']['type'] = 'desc';
+$config->gitea->dtable->fieldList['url']['sortType'] = true;
+$config->gitea->dtable->fieldList['url']['hint'] = true;
+$config->gitea->dtable->fieldList['url']['minWidth'] = '356';
+
+$config->gitea->actionList = array();
+$config->gitea->actionList['edit']['icon'] = 'edit';
+$config->gitea->actionList['edit']['text'] = $lang->gitea->edit;
+$config->gitea->actionList['edit']['hint'] = $lang->gitea->edit;
+$config->gitea->actionList['edit']['url'] = helper::createLink('gitea', 'edit',"giteaID={id}");
+
+$config->gitea->actionList['bindUser']['icon'] = 'lock';
+$config->gitea->actionList['bindUser']['text'] = $lang->gitea->bindUser;
+$config->gitea->actionList['bindUser']['hint'] = $lang->gitea->bindUser;
+$config->gitea->actionList['bindUser']['url'] = helper::createLink('gitea', 'bindUser',"giteaID={id}");
+
+$config->gitea->actionList['delete']['icon'] = 'trash';
+$config->gitea->actionList['delete']['text'] = $lang->gitea->delete;
+$config->gitea->actionList['delete']['hint'] = $lang->gitea->delete;
+$config->gitea->actionList['delete']['ajaxSubmit'] = true;
+$config->gitea->actionList['delete']['url'] = helper::createLink('gitea', 'delete',"giteaID={id}");
+
+$config->gitea->dtable->fieldList['actions']['name'] = 'actions';
+$config->gitea->dtable->fieldList['actions']['title'] = $lang->actions;
+$config->gitea->dtable->fieldList['actions']['type'] = 'actions';
+$config->gitea->dtable->fieldList['actions']['width'] = '160';
+$config->gitea->dtable->fieldList['actions']['sortType'] = false;
+$config->gitea->dtable->fieldList['actions']['fixed'] = 'right';
+$config->gitea->dtable->fieldList['actions']['menu'] = array('edit', 'bindUser', 'delete');
+$config->gitea->dtable->fieldList['actions']['list'] = $config->gitea->actionList;
diff --git a/module/gitea/config/form.php b/module/gitea/config/form.php
new file mode 100644
index 0000000000..cf1b7e3f90
--- /dev/null
+++ b/module/gitea/config/form.php
@@ -0,0 +1,10 @@
+gitea->form = new stdclass();
+
+$config->gitea->form->create = common::formConfig('gitea', 'create');
+
+$config->gitea->form->create['type'] = array('type' => 'string', 'required' => true, 'default' => 'gitea');
+$config->gitea->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->gitea->form->create['url'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->gitea->form->create['token'] = array('type' => 'string', 'required' => true, 'default' => '');
diff --git a/module/gitea/control.php b/module/gitea/control.php
index 4e4090360c..286475f283 100644
--- a/module/gitea/control.php
+++ b/module/gitea/control.php
@@ -68,8 +68,17 @@ class gitea extends control
{
if($_POST)
{
- $this->checkToken();
- $giteaID = $this->gitea->create();
+ $gitea = form::data($this->config->gitea->form->create)
+ ->add('type', 'gitea')
+ ->add('private',md5(rand(10,113450)))
+ ->add('createdBy', $this->app->user->account)
+ ->add('createdDate', helper::now())
+ ->trim('url,token')
+ ->skipSpecial('url,token')
+ ->remove('account,password,appType')
+ ->get();
+ $this->checkToken($gitea);
+ $giteaID = $this->loadModel('pipeline')->create($gitea);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$actionID = $this->loadModel('action')->create('gitea', $giteaID, 'created');
@@ -131,24 +140,32 @@ class gitea extends control
}
/**
+ * 删除一条gitea记录
* Delete a gitea.
*
* @param int $giteaID
* @access public
* @return void
*/
- public function delete($giteaID, $confirm = 'no')
+ public function delete($giteaID)
{
- if($confirm != 'yes') return print(js::confirm($this->lang->gitea->confirmDelete, inlink('delete', "id=$giteaID&confirm=yes")));
-
$oldGitea = $this->loadModel('pipeline')->getByID($giteaID);
$actionID = $this->pipeline->delete($giteaID, 'gitea');
- if(!$actionID) return print(js::error($this->lang->pipeline->delError));
+ if(!$actionID)
+ {
+ $response['result'] = 'fail';
+ $response['callback'] = sprintf('zui.Modal.alert("%s");', $this->lang->pipeline->delError);
+ return $this->send($response);
+ }
$gitea = $this->pipeline->getByID($giteaID);
$changes = common::createChanges($oldGitea, $gitea);
$this->loadModel('action')->logHistory($actionID, $changes);
- return print(js::reload('parent'));
+
+ $response['load'] = true;
+ $response['result'] = 'success';
+
+ return $this->send($response);
}
/**
@@ -157,9 +174,8 @@ class gitea extends control
* @access protected
* @return void
*/
- protected function checkToken()
+ protected function checkToken(object $gitea)
{
- $gitea = fixer::input('post')->trim('url,token')->get();
$this->dao->update('gitea')->data($gitea)->batchCheck($this->config->gitea->create->requiredFields, 'notempty');
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
diff --git a/module/gitea/js/browse.ui.js b/module/gitea/js/browse.ui.js
new file mode 100644
index 0000000000..726ae5aa13
--- /dev/null
+++ b/module/gitea/js/browse.ui.js
@@ -0,0 +1,27 @@
+window.createSortLink = function(col)
+{
+ var sort = col.name + '_asc';
+ if(sort == orderBy) sort = col.name + '_desc';
+
+ return sortLink.replace('{orderBy}', sort);
+}
+
+window.renderCell = function(result, {col, row})
+{
+ if(col.name === 'name')
+ {
+ var browseProjectLink = $.createLink('gitea', 'view', 'giteaID=' + row.data.id);
+ if(canBrowseProject) result[0] = {html:'' + row.data.name + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ if(col.name === 'url')
+ {
+ result[0] = {html:'' + row.data.url + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ return result;
+};
diff --git a/module/gitea/lang/en.php b/module/gitea/lang/en.php
index 9cff6aac7f..8cc2a85b8b 100644
--- a/module/gitea/lang/en.php
+++ b/module/gitea/lang/en.php
@@ -21,7 +21,7 @@ $lang->gitea->browseAction = 'Gitea List';
$lang->gitea->deleteAction = 'Delete Gitea';
$lang->gitea->id = 'ID';
-$lang->gitea->name = "Server Name";
+$lang->gitea->name = "Application Name";
$lang->gitea->url = 'Server URL';
$lang->gitea->token = 'Token';
diff --git a/module/gitea/lang/zh-cn.php b/module/gitea/lang/zh-cn.php
index 30a8bfec17..49a6b06778 100644
--- a/module/gitea/lang/zh-cn.php
+++ b/module/gitea/lang/zh-cn.php
@@ -21,7 +21,7 @@ $lang->gitea->browseAction = 'Gitea列表';
$lang->gitea->deleteAction = '删除Gitea';
$lang->gitea->id = 'ID';
-$lang->gitea->name = "服务器名称";
+$lang->gitea->name = "应用名称";
$lang->gitea->url = '服务器地址';
$lang->gitea->token = 'Token';
diff --git a/module/gitea/model.php b/module/gitea/model.php
index 06782ea84f..d49937cb87 100644
--- a/module/gitea/model.php
+++ b/module/gitea/model.php
@@ -81,17 +81,6 @@ class giteaModel extends model
return rtrim($gitea->url, '/') . '/api/v1%s' . "?token={$gitea->token}" . $sudoParam;
}
- /**
- * Create a gitea.
- *
- * @access public
- * @return bool
- */
- public function create()
- {
- return $this->loadModel('pipeline')->create('gitea');
- }
-
/**
* Update a gitea.
*
@@ -258,8 +247,8 @@ class giteaModel extends model
{
$apiRoot = rtrim($url, '/') . '/api/v1%s' . "?token={$token}";
$url = sprintf($apiRoot, "/admin/users") . "&limit=1";
- $httpData = commonModel::httpWithHeader($url);
- $users = json_decode($httpData['body']);
+ $response = commonModel::http($url);
+ $users = json_decode($response);
if(empty($users)) return false;
if(isset($users->message) or isset($users->error)) return null;
return true;
diff --git a/module/gitea/ui/browse.html.php b/module/gitea/ui/browse.html.php
new file mode 100644
index 0000000000..2b85855831
--- /dev/null
+++ b/module/gitea/ui/browse.html.php
@@ -0,0 +1,43 @@
+
+ * @package gitea
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+featureBar();
+
+/* zin: Define the toolbar on main menu. */
+$canCreate = hasPriv('gitea', 'create');
+$createLink = $this->createLink('gitea', 'create');
+$createItem = array('text' => $lang->gitea->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus');
+
+$tableData = initTableData($giteaList, $config->gitea->dtable->fieldList, $this->gitea);
+
+toolbar
+(
+ $canCreate ? item(set($createItem)) : null,
+);
+
+jsVar('confirmDelete', $lang->gitea->confirmDelete);
+jsVar('orderBy', $orderBy);
+jsVar('canBrowseProject', common::hasPriv('gitea', 'browseProject'));
+jsVar('sortLink', helper::createLink('gitea', 'browse', "orderBy={orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}"));
+
+dtable
+(
+ set::cols(array_values($config->gitea->dtable->fieldList)),
+ set::data($tableData),
+ set::sortLink(jsRaw('createSortLink')),
+ set::onRenderCell(jsRaw('window.renderCell')),
+ set::footPager(usePager()),
+);
+
+render();
diff --git a/module/gitea/ui/create.html.php b/module/gitea/ui/create.html.php
new file mode 100644
index 0000000000..33c40a2db2
--- /dev/null
+++ b/module/gitea/ui/create.html.php
@@ -0,0 +1,46 @@
+
+ * @package gitea
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('giteaCreateForm'),
+ set::title($lang->gitea->lblCreate),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->gitea->name),
+ set::value($gitea->name),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->gitea->url),
+ set::value($gitea->url),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->gitea->token),
+ set::value($gitea->token),
+ )
+ ),
+);
diff --git a/module/gitea/ui/edit.html.php b/module/gitea/ui/edit.html.php
new file mode 100644
index 0000000000..b2c3ba2d48
--- /dev/null
+++ b/module/gitea/ui/edit.html.php
@@ -0,0 +1,46 @@
+
+ * @package gitea
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('giteaCreateForm'),
+ set::title($lang->gitea->edit),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->gitea->name),
+ set::value($gitea->name),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->gitea->url),
+ set::value($gitea->url),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->gitea->token),
+ set::value($gitea->token),
+ )
+ ),
+);
diff --git a/module/gitea/ui/view.html.php b/module/gitea/ui/view.html.php
new file mode 100644
index 0000000000..40324e5f75
--- /dev/null
+++ b/module/gitea/ui/view.html.php
@@ -0,0 +1,38 @@
+
+ * @package gitea
+ * @link https://www.zentao.net
+ */
+namespace zin;
+global $lang;
+
+detailHeader
+(
+ isAjaxRequest('modal') ? to::prefix() : '',
+ to::title(
+ entityLabel(
+ set(array('entityID' => $gitea->id, 'level' => 1, 'text' => $gitea->name))
+ )
+ ),
+);
+
+detailBody
+(
+ sectionList
+ (
+ section
+ (
+ set::title($lang->gitea->url),
+ set::content("{$gitea->url}"),
+ set::useHtml(true)
+ ),
+ ),
+ history(),
+);
+
+render();
diff --git a/module/gitlab/config/dtable.php b/module/gitlab/config/dtable.php
new file mode 100644
index 0000000000..9e650e5a77
--- /dev/null
+++ b/module/gitlab/config/dtable.php
@@ -0,0 +1,52 @@
+loadLang('gitlab');
+
+$config->gitlab->dtable = new stdclass();
+
+$config->gitlab->dtable->fieldList['id']['title'] = 'ID';
+$config->gitlab->dtable->fieldList['id']['name'] = 'id';
+$config->gitlab->dtable->fieldList['id']['type'] = 'number';
+$config->gitlab->dtable->fieldList['id']['sortType'] = 'desc';
+$config->gitlab->dtable->fieldList['id']['checkbox'] = false;
+$config->gitlab->dtable->fieldList['id']['width'] = '80';
+
+$config->gitlab->dtable->fieldList['name']['title'] = $lang->gitlab->name;
+$config->gitlab->dtable->fieldList['name']['name'] = 'name';
+$config->gitlab->dtable->fieldList['name']['type'] = 'desc';
+$config->gitlab->dtable->fieldList['name']['sortType'] = true;
+$config->gitlab->dtable->fieldList['name']['hint'] = true;
+$config->gitlab->dtable->fieldList['name']['minWidth'] = '356';
+
+$config->gitlab->dtable->fieldList['url']['title'] = $lang->gitlab->url;
+$config->gitlab->dtable->fieldList['url']['name'] = 'url';
+$config->gitlab->dtable->fieldList['url']['type'] = 'desc';
+$config->gitlab->dtable->fieldList['url']['sortType'] = true;
+$config->gitlab->dtable->fieldList['url']['hint'] = true;
+$config->gitlab->dtable->fieldList['url']['minWidth'] = '356';
+
+$config->gitlab->actionList = array();
+$config->gitlab->actionList['edit']['icon'] = 'edit';
+$config->gitlab->actionList['edit']['text'] = $lang->gitlab->edit;
+$config->gitlab->actionList['edit']['hint'] = $lang->gitlab->edit;
+$config->gitlab->actionList['edit']['url'] = helper::createLink('gitlab', 'edit',"gitlabID={id}");
+
+$config->gitlab->actionList['bindUser']['icon'] = 'lock';
+$config->gitlab->actionList['bindUser']['text'] = $lang->gitlab->bindUser;
+$config->gitlab->actionList['bindUser']['hint'] = $lang->gitlab->bindUser;
+$config->gitlab->actionList['bindUser']['url'] = helper::createLink('gitlab', 'bindUser',"gitlabID={id}");
+
+$config->gitlab->actionList['delete']['icon'] = 'trash';
+$config->gitlab->actionList['delete']['text'] = $lang->gitlab->delete;
+$config->gitlab->actionList['delete']['hint'] = $lang->gitlab->delete;
+$config->gitlab->actionList['delete']['ajaxSubmit'] = true;
+$config->gitlab->actionList['delete']['url'] = helper::createLink('gitlab', 'delete',"gitlabID={id}");
+
+$config->gitlab->dtable->fieldList['actions']['name'] = 'actions';
+$config->gitlab->dtable->fieldList['actions']['title'] = $lang->actions;
+$config->gitlab->dtable->fieldList['actions']['type'] = 'actions';
+$config->gitlab->dtable->fieldList['actions']['width'] = '160';
+$config->gitlab->dtable->fieldList['actions']['sortType'] = false;
+$config->gitlab->dtable->fieldList['actions']['fixed'] = 'right';
+$config->gitlab->dtable->fieldList['actions']['menu'] = array('edit', 'bindUser', 'delete');
+$config->gitlab->dtable->fieldList['actions']['list'] = $config->gitlab->actionList;
diff --git a/module/gitlab/config/form.php b/module/gitlab/config/form.php
new file mode 100644
index 0000000000..5129b21400
--- /dev/null
+++ b/module/gitlab/config/form.php
@@ -0,0 +1,9 @@
+gitlab->form = new stdclass();
+
+$config->gitlab->form->create = common::formConfig('gitlab', 'create');
+
+$config->gitlab->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->gitlab->form->create['url'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->gitlab->form->create['token'] = array('type' => 'string', 'required' => true, 'default' => '');
diff --git a/module/gitlab/control.php b/module/gitlab/control.php
index 8382bf37d5..92a6f4aed5 100644
--- a/module/gitlab/control.php
+++ b/module/gitlab/control.php
@@ -38,7 +38,7 @@ class gitlab extends control
public function browse($orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
- $this->app->loadClass('pager', $static = true);
+ $this->app->loadClass('pager', true);
$pager = new pager($recTotal, $recPerPage, $pageID);
/* Admin user don't need bind. */
@@ -62,13 +62,22 @@ class gitlab extends control
{
if($_POST)
{
- $this->checkToken();
- $gitlabID = $this->gitlab->create();
+ $gitlab = form::data($this->config->gitlab->form->create)
+ ->add('type', 'gitlab')
+ ->add('private',md5(rand(10,113450)))
+ ->add('createdBy', $this->app->user->account)
+ ->add('createdDate', helper::now())
+ ->trim('url,token')
+ ->skipSpecial('url,token,account,password')
+ ->remove('account,password,appType')
+ ->get();
+ $this->checkToken($gitlab);
+ $gitlabID = $this->loadModel('pipeline')->create($gitlab);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->loadModel('action');
$actionID = $this->action->create('gitlab', $gitlabID, 'created');
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse')));
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('space', 'browse')));
}
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->lblCreate;
@@ -116,7 +125,7 @@ class gitlab extends control
$actionID = $this->action->create('gitlab', $id, 'edited');
$changes = common::createChanges($oldGitLab, $gitLab);
$this->action->logHistory($actionID, $changes);
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse')));
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('space', 'browse')));
}
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->edit;
@@ -138,7 +147,7 @@ class gitlab extends control
$gitlab = $this->gitlab->getByID($gitlabID);
$user = $this->gitlab->apiGetCurrentUser($gitlab->url, $gitlab->token);
- if(!isset($user->is_admin) or !$user->is_admin) return print(js::alert($this->lang->gitlab->tokenLimit) . js::locate($this->createLink('gitlab', 'edit', array('gitlabID' => $gitlabID))));
+ if(!isset($user->is_admin) or !$user->is_admin) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->tokenLimit, 'locate' => $this->createLink('gitlab', 'edit', array('gitlabID' => $gitlabID))));
$zentaoUsers = $this->dao->select('account,email,realname')->from(TABLE_USER)->where('deleted')->eq('0')->fetchAll('account');
@@ -185,7 +194,7 @@ class gitlab extends control
$this->loadModel('action')->create('gitlabuser', $openID, 'bind', '', sprintf($this->lang->gitlab->bindDynamic, $gitlabNames[$openID], $zentaoUsers[$account]->realname));
}
}
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->server->http_referer));
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('gitlab', 'browse')));
}
$gitlabUsers = $this->gitlab->apiGetUsers($gitlabID);
@@ -199,12 +208,43 @@ class gitlab extends control
if(in_array($item->id, $bindedUsers))
{
- $zentaoAccount = isset($item->zentaoAccount) ? zget($userPairs, $item->zentaoAccount, '') : '';
+ $zentaoAccount = isset($item->zentaoAccount) ? $item->zentaoAccount : '';
return $type == 'binded' ? !empty($zentaoAccount) : empty($zentaoAccount);
}
return $type == 'binded' ? false : true;
});
+ $bindedGitlabUsers = $unBindGitlabUsers = array();
+
+ foreach($gitlabUsers as $user)
+ {
+ $user->zentaoEmail = !empty($matchedResult[$user->email]) ? $matchedResult[$user->email]['email'] : '';
+ $user->status = 'notBind';
+ $user->realname = $user->realname . '@' . $user->account;
+
+ $user->zentaoAccount = isset($user->zentaoAccount) ? $user->zentaoAccount : '';
+ if(in_array($user->id, $bindedUsers))
+ {
+ $user->status = 'bindedError';
+ if(!empty($user->zentaoAccount)) $user->status = 'binded';
+ }
+
+ if(!empty($user->zentaoAccount))
+ {
+ $bindedGitlabUsers[] = $user;
+ }
+ else
+ {
+ $unBindGitlabUsers[] = $user;
+ }
+ }
+
+ $gitlabUsers = array_merge($unBindGitlabUsers, $bindedGitlabUsers);
+
+ $this->app->loadClass('pager', true);
+ $pager = new pager(count($gitlabUsers), 10000, 1);
+
+ $this->view->pager = $pager;
$this->view->title = $this->lang->gitlab->bindUser;
$this->view->zentaoUsers = $zentaoUsers;
$this->view->userPairs = $userPairs;
@@ -218,24 +258,32 @@ class gitlab extends control
}
/**
+ * 删除一条gitlab记录。
* Delete a gitlab.
*
* @param int $id
* @access public
* @return void
*/
- public function delete($id, $confirm = 'no')
+ public function delete($id)
{
- if($confirm != 'yes') return print(js::confirm($this->lang->gitlab->confirmDelete, inlink('delete', "id=$id&confirm=yes")));
-
$oldGitLab = $this->loadModel('pipeline')->getByID($id);
$actionID = $this->pipeline->delete($id, 'gitlab');
- if(!$actionID) return print(js::error($this->lang->pipeline->delError));
+ if(!$actionID)
+ {
+ $response['result'] = 'fail';
+ $response['callback'] = sprintf('zui.Modal.alert("%s");', $this->lang->pipeline->delError);
+
+ return $this->send($response);
+ }
$gitLab = $this->gitlab->getByID($id);
$changes = common::createChanges($oldGitLab, $gitLab);
$this->loadModel('action')->logHistory($actionID, $changes);
- echo js::reload('parent');
+
+ $response['load'] = true;
+ $response['result'] = 'success';
+ return $this->send($response);
}
/**
@@ -244,9 +292,8 @@ class gitlab extends control
* @access protected
* @return void
*/
- protected function checkToken()
+ protected function checkToken(object $gitlab)
{
- $gitlab = fixer::input('post')->trim('url,token')->get();
$this->dao->update('gitlab')->data($gitlab)->batchCheck($this->config->gitlab->create->requiredFields, 'notempty');
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
@@ -595,7 +642,7 @@ class gitlab extends control
$users = $this->loadModel('user')->getList();
$bindedUsers = $this->gitlab->getUserAccountIdPairs($gitlabID);
- $userPairs = array('' => '');
+ $userPairs = array();
$userInfos = array();
foreach($users as $key => $user)
{
@@ -636,7 +683,7 @@ class gitlab extends control
$users = $this->loadModel('user')->getList();
$bindedUsers = $this->gitlab->getUserAccountIdPairs($gitlabID);
- $userPairs = array('' => '');
+ $userPairs = array();
foreach($users as $user)
{
if(!isset($bindedUsers[$user->account]) or $user->account == $zentaoBindAccount) $userPairs[$user->account] = $user->realname;
@@ -699,7 +746,7 @@ class gitlab extends control
if(!$openID) return print(js::alert($this->lang->gitlab->mustBindUser) . js::locate($this->createLink('gitlab', 'browse')));
}
- $this->app->loadClass('pager', $static = true);
+ $this->app->loadClass('pager', true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword'); // Fix bug#16741.
@@ -860,7 +907,7 @@ class gitlab extends control
array_multisort($orderList, $sort == 'desc' ? SORT_DESC : SORT_ASC, $branchList);
/* Pager. */
- $this->app->loadClass('pager', $static = true);
+ $this->app->loadClass('pager', true);
$recTotal = count($branchList);
$pager = new pager($recTotal, $recPerPage, $pageID);
$branchList = array_chunk($branchList, $pager->recPerPage);
@@ -934,7 +981,7 @@ class gitlab extends control
$keyword = fixer::input('post')->setDefault('keyword', '')->get('keyword');
/* Pager. */
- $this->app->loadClass('pager', $static = true);
+ $this->app->loadClass('pager', true);
$pager = new pager($recTotal, $recPerPage, $pageID);
$tagList = array();
@@ -1052,7 +1099,7 @@ class gitlab extends control
$this->view->title = $this->lang->gitlab->common . $this->lang->colon . $this->lang->gitlab->importIssue;
$this->view->importable = empty($gitlabIssues) ? false : true;
- $this->view->products = array('' => '') + $products;
+ $this->view->products = $products;
$this->view->gitlabID = $gitlabID;
$this->view->gitlabProjectID = $projectID;
$this->view->objectTypes = $this->config->gitlab->objectTypes;
@@ -1249,7 +1296,7 @@ class gitlab extends control
{
if(!$productID) return $this->send(array('message' => array()));
- $executions = $this->loadModel('product')->getAllExecutionPairsByProduct($productID);
+ $executions = $this->loadModel('product')->getExecutionPairsByProduct($productID);
$options = "";
foreach($executions as $index =>$execution)
{
@@ -1271,12 +1318,14 @@ class gitlab extends control
if(!$gitlabID or !$projectID) return $this->send(array('message' => array()));
$branches = $this->gitlab->apiGetBranches($gitlabID, $projectID);
- $options = "";
+
+ $options = array();
+ $options[] = array('text' => '', 'value' => '');;
foreach($branches as $branch)
{
- $options .= "";
+ $options[] = array('text' => $branch->name, 'value' => $branch->name);
}
- $this->send($options);
+ return print(json_encode($options));
}
/**
@@ -1361,7 +1410,7 @@ class gitlab extends control
/* If the status code beginning with 20 is returned or empty is returned, it is successful. */
if(!$reponse or substr($reponse->message, 0, 2) == '20')
{
- $this->loadModel('action')->create('gitlabtag', $projectID, 'deleted', '', $project->name);
+ $this->loadModel('action')->create('gitlabtag', $projectID, 'deleted', '', $projectID);
return print(js::reload('parent'));
}
diff --git a/module/gitlab/css/binduser.ui.css b/module/gitlab/css/binduser.ui.css
new file mode 100644
index 0000000000..bb50e59dbe
--- /dev/null
+++ b/module/gitlab/css/binduser.ui.css
@@ -0,0 +1,4 @@
+#featureBar {display: flex; gap: 1rem;}
+.gitlab-account-desc {color: #7d8392;font-size: 12px;}
+.notBind {color: #fc5959}
+.bindedError {color: #fc5959}
\ No newline at end of file
diff --git a/module/gitlab/js/binduser.ui.js b/module/gitlab/js/binduser.ui.js
new file mode 100644
index 0000000000..ccad8e6b64
--- /dev/null
+++ b/module/gitlab/js/binduser.ui.js
@@ -0,0 +1,6 @@
+$('table').on('change', '.pick-value', function()
+{
+ var user = zentaoUsers[$(this).val()];
+ console.log(111, $(this).val(), user, $(this).attr('id'))
+ $('#' + $(this).attr('id').replace('users', 'zentaoEmail')).text(user.email);
+})
\ No newline at end of file
diff --git a/module/gitlab/js/browse.ui.js b/module/gitlab/js/browse.ui.js
new file mode 100644
index 0000000000..5f37b3086f
--- /dev/null
+++ b/module/gitlab/js/browse.ui.js
@@ -0,0 +1,27 @@
+window.createSortLink = function(col)
+{
+ var sort = col.name + '_asc';
+ if(sort == orderBy) sort = col.name + '_desc';
+
+ return sortLink.replace('{orderBy}', sort);
+}
+
+window.renderCell = function(result, {col, row})
+{
+ if(col.name === 'name')
+ {
+ var browseProjectLink = $.createLink('gitlab', 'browseProject', 'gitlabID=' + row.data.id);
+ if(canBrowseProject) result[0] = {html:'' + row.data.name + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ if(col.name === 'url')
+ {
+ result[0] = {html:'' + row.data.url + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ return result;
+};
diff --git a/module/gitlab/lang/de.php b/module/gitlab/lang/de.php
index 3c284a8270..67d272324b 100644
--- a/module/gitlab/lang/de.php
+++ b/module/gitlab/lang/de.php
@@ -235,3 +235,7 @@ $lang->gitlab->tag->accessLevel = 'Allow creation';
$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?';
$lang->gitlab->tag->emptyPrivNameError = 'Tag cannot be empty.';
$lang->gitlab->tag->issetPrivNameError = 'The protection tag already exists.';
+
+$lang->gitlab->featureBar['binduser']['all'] = $lang->gitlab->all;
+$lang->gitlab->featureBar['binduser']['notBind'] = $lang->gitlab->notBind;
+$lang->gitlab->featureBar['binduser']['binded'] = $lang->gitlab->binded;
diff --git a/module/gitlab/lang/en.php b/module/gitlab/lang/en.php
index 3c284a8270..67d272324b 100644
--- a/module/gitlab/lang/en.php
+++ b/module/gitlab/lang/en.php
@@ -235,3 +235,7 @@ $lang->gitlab->tag->accessLevel = 'Allow creation';
$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?';
$lang->gitlab->tag->emptyPrivNameError = 'Tag cannot be empty.';
$lang->gitlab->tag->issetPrivNameError = 'The protection tag already exists.';
+
+$lang->gitlab->featureBar['binduser']['all'] = $lang->gitlab->all;
+$lang->gitlab->featureBar['binduser']['notBind'] = $lang->gitlab->notBind;
+$lang->gitlab->featureBar['binduser']['binded'] = $lang->gitlab->binded;
diff --git a/module/gitlab/lang/fr.php b/module/gitlab/lang/fr.php
index 9b37b69f3d..6e0fa97312 100644
--- a/module/gitlab/lang/fr.php
+++ b/module/gitlab/lang/fr.php
@@ -235,3 +235,7 @@ $lang->gitlab->tag->accessLevel = 'Allow creation';
$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?';
$lang->gitlab->tag->emptyPrivNameError = 'Tag cannot be empty.';
$lang->gitlab->tag->issetPrivNameError = 'The protection tag already exists.';
+
+$lang->gitlab->featureBar['binduser']['all'] = $lang->gitlab->all;
+$lang->gitlab->featureBar['binduser']['notBind'] = $lang->gitlab->notBind;
+$lang->gitlab->featureBar['binduser']['binded'] = $lang->gitlab->binded;
diff --git a/module/gitlab/lang/vi.php b/module/gitlab/lang/vi.php
index f858af5575..afddbeef4e 100644
--- a/module/gitlab/lang/vi.php
+++ b/module/gitlab/lang/vi.php
@@ -236,3 +236,7 @@ $lang->gitlab->tag->accessLevel = 'Allow creation';
$lang->gitlab->tag->protectConfirmDel = 'Do you want to delete this GitLab tag protected?';
$lang->gitlab->tag->emptyPrivNameError = 'Tag cannot be empty.';
$lang->gitlab->tag->issetPrivNameError = 'The protection tag already exists.';
+
+$lang->gitlab->featureBar['binduser']['all'] = $lang->gitlab->all;
+$lang->gitlab->featureBar['binduser']['notBind'] = $lang->gitlab->notBind;
+$lang->gitlab->featureBar['binduser']['binded'] = $lang->gitlab->binded;
diff --git a/module/gitlab/lang/zh-cn.php b/module/gitlab/lang/zh-cn.php
index caed699e81..97de26f410 100644
--- a/module/gitlab/lang/zh-cn.php
+++ b/module/gitlab/lang/zh-cn.php
@@ -60,7 +60,7 @@ $lang->gitlab->deleteTag = '删除标签';
$lang->gitlab->svaeFailed = '『%s』保存失败';
$lang->gitlab->id = 'ID';
-$lang->gitlab->name = "服务器名称";
+$lang->gitlab->name = "应用名称";
$lang->gitlab->url = '服务器地址';
$lang->gitlab->token = 'Token';
$lang->gitlab->defaultProject = '默认项目';
@@ -235,3 +235,7 @@ $lang->gitlab->tag->accessLevel = '允许创建';
$lang->gitlab->tag->protectConfirmDel = '确认删除该GitLab标签保护吗?';
$lang->gitlab->tag->emptyPrivNameError = "标签不能为空";
$lang->gitlab->tag->issetPrivNameError = "已存在该保护标签";
+
+$lang->gitlab->featureBar['binduser']['all'] = $lang->gitlab->all;
+$lang->gitlab->featureBar['binduser']['notBind'] = $lang->gitlab->notBind;
+$lang->gitlab->featureBar['binduser']['binded'] = $lang->gitlab->binded;
diff --git a/module/gitlab/lang/zh-tw.php b/module/gitlab/lang/zh-tw.php
index 81e5f2714f..464a7c9401 100644
--- a/module/gitlab/lang/zh-tw.php
+++ b/module/gitlab/lang/zh-tw.php
@@ -224,3 +224,7 @@ $lang->gitlab->tag->protected = '受保護';
$lang->gitlab->tag->accessLevel = '允許創建';
$lang->gitlab->tag->emptyPrivNameError = '標簽不能爲空';
$lang->gitlab->tag->issetPrivNameError = '已存在該保護標簽';
+
+$lang->gitlab->featureBar['binduser']['all'] = $lang->gitlab->all;
+$lang->gitlab->featureBar['binduser']['notBind'] = $lang->gitlab->notBind;
+$lang->gitlab->featureBar['binduser']['binded'] = $lang->gitlab->binded;
diff --git a/module/gitlab/model.php b/module/gitlab/model.php
index 2f3176766c..6216331390 100644
--- a/module/gitlab/model.php
+++ b/module/gitlab/model.php
@@ -405,7 +405,6 @@ class gitlabModel extends model
$scm = $this->app->loadClass('scm');
$scm->setEngine($repo);
$comments = $scm->engine->getCommitsByPath($entry, '', '', isset($pager->recPerPage) ? $pager->recPerPage : 10, isset($pager->pageID) ? $pager->pageID : 1);
- if(empty($comments)) $comments = array();
if(isset($pager->recTotal)) $pager->recTotal = count($comments) < $pager->recPerPage ? $pager->recPerPage * $pager->pageID : $pager->recPerPage * ($pager->pageID + 1);
diff --git a/module/gitlab/ui/binduser.html.php b/module/gitlab/ui/binduser.html.php
new file mode 100644
index 0000000000..3c0006179e
--- /dev/null
+++ b/module/gitlab/ui/binduser.html.php
@@ -0,0 +1,113 @@
+
+ * @package gitlab
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+$userItems = array();
+foreach($userPairs as $enName => $name)
+{
+ $userItems[] = array('text' => $name, 'value' => $enName);
+}
+jsVar('userItems', $userItems);
+jsVar('zentaoUsers', $zentaoUsers);
+jsVar('gitlabUsers', $gitlabUsers);
+jsVar('accountDesc', $lang->gitlab->accountDesc);
+
+/* zin: Define the set::module('compile') feature bar on main menu. */
+featureBar
+(
+ to::leading(array(backBtn(set::icon('back'), set::class('secondary'), $lang->goback))),
+ set::current($type),
+ set::link($this->createLink('gitlab', 'binduser', "gitlabID=$gitlabID&type={key}")),
+);
+
+/* zin: Define the toolbar on main menu. */
+toolbar();
+
+
+$tbody = array();
+foreach($gitlabUsers as $index => $user)
+{
+ $tbody[] = h::tr
+ (
+ h::td
+ (
+ avatar($user->avatar, set::size(20), setClass('mr-2')),
+ $user->realname,
+ input(set::value($user->realname), set::name("gitlabUserNames[$user->id]"), set::type('hidden'))
+ ),
+ h::td
+ (
+ $user->email
+ ),
+ h::td
+ (
+ setID('zentaoEmail-' . $user->id),
+ $user->zentaoEmail
+ ),
+ h::td
+ (
+ picker
+ (
+ setID('users-' . $user->id),
+ set::required(false),
+ set::name("zentaoUsers[$user->id]"),
+ set::value($user->zentaoAccount),
+ set::items($userPairs)
+ ),
+ ),
+ h::td
+ (
+ span
+ (
+ setClass($user->status),
+ $lang->gitlab->{$user->status}
+ )
+ ),
+ );
+}
+
+form
+(
+ setClass('mb-4'),
+ h::table
+ (
+ setClass('table table-fixed canvas'),
+ h::tr
+ (
+ h::th
+ (
+ $lang->gitlab->gitlabAccount
+ ),
+ h::th
+ (
+ $lang->gitlab->gitlabEmail
+ ),
+ h::th
+ (
+ $lang->gitlab->zentaoEmail
+ ),
+ h::th
+ (
+ set::width('300px'),
+ $lang->gitlab->zentaoAccount,
+ span(setClass('gitlab-account-desc'), $lang->gitlab->accountDesc)
+ ),
+ h::th
+ (
+ set::width('100px'),
+ $lang->gitlab->bindingStatus
+ ),
+ ),
+ $tbody
+ )
+);
diff --git a/module/gitlab/ui/browse.html.php b/module/gitlab/ui/browse.html.php
new file mode 100644
index 0000000000..96161ca10b
--- /dev/null
+++ b/module/gitlab/ui/browse.html.php
@@ -0,0 +1,43 @@
+
+ * @package gitlab
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+featureBar();
+
+/* zin: Define the toolbar on main menu. */
+$canCreate = hasPriv('gitlab', 'create');
+$createLink = $this->createLink('gitlab', 'create');
+$createItem = array('text' => $lang->gitlab->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus');
+
+$tableData = initTableData($gitlabList, $config->gitlab->dtable->fieldList, $this->gitlab);
+
+toolbar
+(
+ $canCreate ? item(set($createItem)) : null,
+);
+
+jsVar('confirmDelete', $lang->gitlab->confirmDelete);
+jsVar('orderBy', $orderBy);
+jsVar('canBrowseProject', common::hasPriv('gitlab', 'browseProject'));
+jsVar('sortLink', helper::createLink('gitlab', 'browse', "orderBy={orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}"));
+
+dtable
+(
+ set::cols(array_values($config->gitlab->dtable->fieldList)),
+ set::data($tableData),
+ set::sortLink(jsRaw('createSortLink')),
+ set::onRenderCell(jsRaw('window.renderCell')),
+ set::footPager(usePager()),
+);
+
+render();
diff --git a/module/gitlab/ui/create.html.php b/module/gitlab/ui/create.html.php
new file mode 100644
index 0000000000..12fdbe68ce
--- /dev/null
+++ b/module/gitlab/ui/create.html.php
@@ -0,0 +1,49 @@
+
+ * @package gitlab
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('gitlabCreateForm'),
+ set::title($lang->gitlab->lblCreate),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->gitlab->name),
+ set::value($gitlab->name),
+ set::placeholder($lang->gitlab->placeholder->name)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->gitlab->url),
+ set::value($gitlab->url),
+ set::placeholder($lang->gitlab->placeholder->url)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->gitlab->token),
+ set::value($gitlab->token),
+ set::placeholder($lang->gitlab->placeholder->token)
+ )
+ ),
+);
diff --git a/module/gitlab/ui/edit.html.php b/module/gitlab/ui/edit.html.php
new file mode 100644
index 0000000000..394dc90ba4
--- /dev/null
+++ b/module/gitlab/ui/edit.html.php
@@ -0,0 +1,49 @@
+
+ * @package gitlab
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('gitlabCreateForm'),
+ set::title($lang->gitlab->edit),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->gitlab->name),
+ set::value($gitlab->name),
+ set::placeholder($lang->gitlab->placeholder->name)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->gitlab->url),
+ set::value($gitlab->url),
+ set::placeholder($lang->gitlab->placeholder->url)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->gitlab->token),
+ set::value($gitlab->token),
+ set::placeholder($lang->gitlab->placeholder->token)
+ )
+ ),
+);
diff --git a/module/gitlab/ui/view.html.php b/module/gitlab/ui/view.html.php
new file mode 100644
index 0000000000..f5829a6664
--- /dev/null
+++ b/module/gitlab/ui/view.html.php
@@ -0,0 +1,38 @@
+
+ * @package gitlab
+ * @link https://www.zentao.net
+ */
+namespace zin;
+global $lang;
+
+detailHeader
+(
+ isAjaxRequest('modal') ? to::prefix() : '',
+ to::title(
+ entityLabel(
+ set(array('entityID' => $gitlab->id, 'level' => 1, 'text' => $gitlab->name))
+ )
+ ),
+);
+
+detailBody
+(
+ sectionList
+ (
+ section
+ (
+ set::title($lang->gitlab->url),
+ set::content("{$gitlab->url}"),
+ set::useHtml(true)
+ ),
+ ),
+ history(),
+);
+
+render();
diff --git a/module/gogs/config/dtable.php b/module/gogs/config/dtable.php
new file mode 100644
index 0000000000..11ed861dd2
--- /dev/null
+++ b/module/gogs/config/dtable.php
@@ -0,0 +1,52 @@
+loadLang('gogs');
+
+$config->gogs->dtable = new stdclass();
+
+$config->gogs->dtable->fieldList['id']['title'] = 'ID';
+$config->gogs->dtable->fieldList['id']['name'] = 'id';
+$config->gogs->dtable->fieldList['id']['type'] = 'number';
+$config->gogs->dtable->fieldList['id']['sortType'] = true;
+$config->gogs->dtable->fieldList['id']['checkbox'] = false;
+$config->gogs->dtable->fieldList['id']['width'] = '80';
+
+$config->gogs->dtable->fieldList['name']['title'] = $lang->gogs->name;
+$config->gogs->dtable->fieldList['name']['name'] = 'name';
+$config->gogs->dtable->fieldList['name']['type'] = 'text';
+$config->gogs->dtable->fieldList['name']['sortType'] = true;
+$config->gogs->dtable->fieldList['name']['hint'] = true;
+$config->gogs->dtable->fieldList['name']['minWidth'] = '356';
+
+$config->gogs->dtable->fieldList['url']['title'] = $lang->gogs->url;
+$config->gogs->dtable->fieldList['url']['name'] = 'url';
+$config->gogs->dtable->fieldList['url']['type'] = 'text';
+$config->gogs->dtable->fieldList['url']['sortType'] = true;
+$config->gogs->dtable->fieldList['url']['hint'] = true;
+$config->gogs->dtable->fieldList['url']['minWidth'] = '356';
+
+$config->gogs->actionList = array();
+$config->gogs->actionList['edit']['icon'] = 'edit';
+$config->gogs->actionList['edit']['text'] = $lang->gogs->edit;
+$config->gogs->actionList['edit']['hint'] = $lang->gogs->edit;
+$config->gogs->actionList['edit']['url'] = helper::createLink('gogs', 'edit',"gogsID={id}");
+
+$config->gogs->actionList['bindUser']['icon'] = 'lock';
+$config->gogs->actionList['bindUser']['text'] = $lang->gogs->bindUser;
+$config->gogs->actionList['bindUser']['hint'] = $lang->gogs->bindUser;
+$config->gogs->actionList['bindUser']['url'] = helper::createLink('gogs', 'bindUser',"gogsID={id}");
+
+$config->gogs->actionList['delete']['icon'] = 'trash';
+$config->gogs->actionList['delete']['text'] = $lang->gogs->delete;
+$config->gogs->actionList['delete']['hint'] = $lang->gogs->delete;
+$config->gogs->actionList['delete']['ajaxSubmit'] = true;
+$config->gogs->actionList['delete']['url'] = helper::createLink('gogs', 'delete',"gogsID={id}");
+
+$config->gogs->dtable->fieldList['actions']['name'] = 'actions';
+$config->gogs->dtable->fieldList['actions']['title'] = $lang->actions;
+$config->gogs->dtable->fieldList['actions']['type'] = 'actions';
+$config->gogs->dtable->fieldList['actions']['width'] = '160';
+$config->gogs->dtable->fieldList['actions']['sortType'] = false;
+$config->gogs->dtable->fieldList['actions']['fixed'] = 'right';
+$config->gogs->dtable->fieldList['actions']['menu'] = array('edit', 'bindUser', 'delete');
+$config->gogs->dtable->fieldList['actions']['list'] = $config->gogs->actionList;
diff --git a/module/gogs/config/form.php b/module/gogs/config/form.php
new file mode 100644
index 0000000000..d4d5968bb9
--- /dev/null
+++ b/module/gogs/config/form.php
@@ -0,0 +1,10 @@
+gogs->form = new stdclass();
+
+$config->gogs->form->create = common::formConfig('gogs', 'create');
+
+$config->gogs->form->create['type'] = array('type' => 'string', 'required' => true, 'default' => 'gogs');
+$config->gogs->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->gogs->form->create['url'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->gogs->form->create['token'] = array('type' => 'string', 'required' => true, 'default' => '');
diff --git a/module/gogs/control.php b/module/gogs/control.php
index b0c57072ff..d819d9e5b5 100644
--- a/module/gogs/control.php
+++ b/module/gogs/control.php
@@ -67,8 +67,17 @@ class gogs extends control
{
if($_POST)
{
- $this->checkToken();
- $gogsID = $this->gogs->create();
+ $gogs = form::data($this->config->gogs->form->create)
+ ->add('type', 'gogs')
+ ->add('private',md5(rand(10,113450)))
+ ->add('createdBy', $this->app->user->account)
+ ->add('createdDate', helper::now())
+ ->trim('url,token')
+ ->skipSpecial('url,token')
+ ->remove('account,password,appType')
+ ->get();
+ $this->checkToken($gogs);
+ $gogsID = $this->loadModel('pipeline')->create($gogs);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
$actionID = $this->loadModel('action')->create('gogs', $gogsID, 'created');
@@ -130,24 +139,32 @@ class gogs extends control
}
/**
+ * 删除一条gogs数据。
* Delete a gogs.
*
* @param int $gogsID
* @access public
* @return void
*/
- public function delete($gogsID, $confirm = 'no')
+ public function delete($gogsID)
{
- if($confirm != 'yes') return print(js::confirm($this->lang->gogs->confirmDelete, inlink('delete', "id=$gogsID&confirm=yes")));
-
$oldGogs = $this->loadModel('pipeline')->getByID($gogsID);
$actionID = $this->pipeline->delete($gogsID, 'gogs');
- if(!$actionID) return print(js::error($this->lang->pipeline->delError));
+ if(!$actionID)
+ {
+ $response['result'] = 'fail';
+ $response['callback'] = sprintf('zui.Modal.alert("%s");', $this->lang->pipeline->delError);
+
+ return $this->send($response);
+ }
$gogs = $this->pipeline->getByID($gogsID);
$changes = common::createChanges($oldGogs, $gogs);
$this->loadModel('action')->logHistory($actionID, $changes);
- return print(js::reload('parent'));
+
+ $response['load'] = true;
+ $response['result'] = 'success';
+ return $this->send($response);
}
/**
@@ -156,9 +173,8 @@ class gogs extends control
* @access protected
* @return void
*/
- protected function checkToken()
+ protected function checkToken(object $gogs)
{
- $gogs = fixer::input('post')->trim('url,token')->get();
$this->dao->update('gogs')->data($gogs)->batchCheck($this->config->gogs->create->requiredFields, 'notempty');
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
diff --git a/module/gogs/js/browse.ui.js b/module/gogs/js/browse.ui.js
new file mode 100644
index 0000000000..ebbc90b39c
--- /dev/null
+++ b/module/gogs/js/browse.ui.js
@@ -0,0 +1,27 @@
+window.createSortLink = function(col)
+{
+ var sort = col.name + '_asc';
+ if(sort == orderBy) sort = col.name + '_desc';
+
+ return sortLink.replace('{orderBy}', sort);
+}
+
+window.renderCell = function(result, {col, row})
+{
+ if(col.name === 'name')
+ {
+ var browseProjectLink = $.createLink('gogs', 'view', 'gogsID=' + row.data.id);
+ if(canBrowseProject) result[0] = {html:'' + row.data.name + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ if(col.name === 'url')
+ {
+ result[0] = {html:'' + row.data.url + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ return result;
+};
diff --git a/module/gogs/lang/en.php b/module/gogs/lang/en.php
index ae278521c0..6299ce0044 100644
--- a/module/gogs/lang/en.php
+++ b/module/gogs/lang/en.php
@@ -21,7 +21,7 @@ $lang->gogs->browseAction = 'Gogs List';
$lang->gogs->deleteAction = 'Delete Gogs';
$lang->gogs->id = 'ID';
-$lang->gogs->name = "Server Name";
+$lang->gogs->name = "Application Name";
$lang->gogs->url = 'Server URL';
$lang->gogs->token = 'Token';
diff --git a/module/gogs/lang/zh-cn.php b/module/gogs/lang/zh-cn.php
index 2b0c798486..926e376b28 100644
--- a/module/gogs/lang/zh-cn.php
+++ b/module/gogs/lang/zh-cn.php
@@ -21,7 +21,7 @@ $lang->gogs->browseAction = 'Gogs列表';
$lang->gogs->deleteAction = '删除Gogs';
$lang->gogs->id = 'ID';
-$lang->gogs->name = "服务器名称";
+$lang->gogs->name = "应用名称";
$lang->gogs->url = '服务器地址';
$lang->gogs->token = 'Token';
diff --git a/module/gogs/ui/browse.html.php b/module/gogs/ui/browse.html.php
new file mode 100644
index 0000000000..c978e855e3
--- /dev/null
+++ b/module/gogs/ui/browse.html.php
@@ -0,0 +1,43 @@
+
+ * @package gogs
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+featureBar();
+
+/* zin: Define the toolbar on main menu. */
+$canCreate = hasPriv('gogs', 'create');
+$createLink = $this->createLink('gogs', 'create');
+$createItem = array('text' => $lang->gogs->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus');
+
+$tableData = initTableData($gogsList, $config->gogs->dtable->fieldList, $this->gogs);
+
+toolbar
+(
+ $canCreate ? item(set($createItem)) : null,
+);
+
+jsVar('confirmDelete', $lang->gogs->confirmDelete);
+jsVar('orderBy', $orderBy);
+jsVar('canBrowseProject', common::hasPriv('gogs', 'browseProject'));
+jsVar('sortLink', helper::createLink('gogs', 'browse', "orderBy={orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}"));
+
+dtable
+(
+ set::cols(array_values($config->gogs->dtable->fieldList)),
+ set::data($tableData),
+ set::sortLink(jsRaw('createSortLink')),
+ set::onRenderCell(jsRaw('window.renderCell')),
+ set::footPager(usePager()),
+);
+
+render();
diff --git a/module/gogs/ui/create.html.php b/module/gogs/ui/create.html.php
new file mode 100644
index 0000000000..e00a7b8622
--- /dev/null
+++ b/module/gogs/ui/create.html.php
@@ -0,0 +1,46 @@
+
+ * @package gogs
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('gogsCreateForm'),
+ set::title($lang->gogs->lblCreate),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->gogs->name),
+ set::value($gogs->name),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->gogs->url),
+ set::value($gogs->url),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->gogs->token),
+ set::value($gogs->token),
+ )
+ ),
+);
diff --git a/module/gogs/ui/edit.html.php b/module/gogs/ui/edit.html.php
new file mode 100644
index 0000000000..6758c48491
--- /dev/null
+++ b/module/gogs/ui/edit.html.php
@@ -0,0 +1,46 @@
+
+ * @package gogs
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('gogsCreateForm'),
+ set::title($lang->gogs->edit),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->gogs->name),
+ set::value($gogs->name),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->gogs->url),
+ set::value($gogs->url),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->gogs->token),
+ set::value($gogs->token),
+ )
+ ),
+);
diff --git a/module/gogs/ui/view.html.php b/module/gogs/ui/view.html.php
new file mode 100644
index 0000000000..367bb2102b
--- /dev/null
+++ b/module/gogs/ui/view.html.php
@@ -0,0 +1,38 @@
+
+ * @package gogs
+ * @link https://www.zentao.net
+ */
+namespace zin;
+global $lang;
+
+detailHeader
+(
+ isAjaxRequest('modal') ? to::prefix() : '',
+ to::title(
+ entityLabel(
+ set(array('entityID' => $gogs->id, 'level' => 1, 'text' => $gogs->name))
+ )
+ ),
+);
+
+detailBody
+(
+ sectionList
+ (
+ section
+ (
+ set::title($lang->gogs->url),
+ set::content("{$gogs->url}"),
+ set::useHtml(true)
+ ),
+ ),
+ history(),
+);
+
+render();
diff --git a/module/jenkins/config/dtable.php b/module/jenkins/config/dtable.php
new file mode 100644
index 0000000000..5179978090
--- /dev/null
+++ b/module/jenkins/config/dtable.php
@@ -0,0 +1,47 @@
+loadLang('jenkins');
+
+$config->jenkins->dtable = new stdclass();
+
+$config->jenkins->dtable->fieldList['id']['title'] = 'ID';
+$config->jenkins->dtable->fieldList['id']['name'] = 'id';
+$config->jenkins->dtable->fieldList['id']['type'] = 'number';
+$config->jenkins->dtable->fieldList['id']['sortType'] = 'desc';
+$config->jenkins->dtable->fieldList['id']['checkbox'] = false;
+$config->jenkins->dtable->fieldList['id']['width'] = '80';
+
+$config->jenkins->dtable->fieldList['name']['title'] = $lang->jenkins->name;
+$config->jenkins->dtable->fieldList['name']['name'] = 'name';
+$config->jenkins->dtable->fieldList['name']['type'] = 'desc';
+$config->jenkins->dtable->fieldList['name']['sortType'] = true;
+$config->jenkins->dtable->fieldList['name']['hint'] = true;
+$config->jenkins->dtable->fieldList['name']['minWidth'] = '356';
+
+$config->jenkins->dtable->fieldList['url']['title'] = $lang->jenkins->url;
+$config->jenkins->dtable->fieldList['url']['name'] = 'url';
+$config->jenkins->dtable->fieldList['url']['type'] = 'desc';
+$config->jenkins->dtable->fieldList['url']['sortType'] = true;
+$config->jenkins->dtable->fieldList['url']['hint'] = true;
+$config->jenkins->dtable->fieldList['url']['minWidth'] = '356';
+
+$config->jenkins->actionList = array();
+$config->jenkins->actionList['edit']['icon'] = 'edit';
+$config->jenkins->actionList['edit']['text'] = $lang->jenkins->edit;
+$config->jenkins->actionList['edit']['hint'] = $lang->jenkins->edit;
+$config->jenkins->actionList['edit']['url'] = helper::createLink('jenkins', 'edit',"jenkinsID={id}");
+
+$config->jenkins->actionList['delete']['icon'] = 'trash';
+$config->jenkins->actionList['delete']['text'] = $lang->jenkins->delete;
+$config->jenkins->actionList['delete']['hint'] = $lang->jenkins->delete;
+$config->jenkins->actionList['delete']['ajaxSubmit'] = true;
+$config->jenkins->actionList['delete']['url'] = helper::createLink('jenkins', 'delete',"jenkinsID={id}");
+
+$config->jenkins->dtable->fieldList['actions']['name'] = 'actions';
+$config->jenkins->dtable->fieldList['actions']['title'] = $lang->actions;
+$config->jenkins->dtable->fieldList['actions']['type'] = 'actions';
+$config->jenkins->dtable->fieldList['actions']['width'] = '160';
+$config->jenkins->dtable->fieldList['actions']['sortType'] = false;
+$config->jenkins->dtable->fieldList['actions']['fixed'] = 'right';
+$config->jenkins->dtable->fieldList['actions']['menu'] = array('edit', 'delete');
+$config->jenkins->dtable->fieldList['actions']['list'] = $config->jenkins->actionList;
diff --git a/module/jenkins/config/form.php b/module/jenkins/config/form.php
new file mode 100644
index 0000000000..271e778e04
--- /dev/null
+++ b/module/jenkins/config/form.php
@@ -0,0 +1,12 @@
+jenkins->form = new stdclass();
+
+$config->jenkins->form->create = common::formConfig('jenkins', 'create');
+
+$config->jenkins->form->create['type'] = array('type' => 'string', 'required' => true, 'default' => 'jenkins');
+$config->jenkins->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->jenkins->form->create['url'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->jenkins->form->create['account'] = array('type' => 'string', 'required' => true, 'default' => '');
+$config->jenkins->form->create['token'] = array('type' => 'string', 'required' => false, 'default' => '');
+$config->jenkins->form->create['password'] = array('type' => 'string', 'required' => false, 'default' => '');
diff --git a/module/jenkins/control.php b/module/jenkins/control.php
index d6e0a4d275..acb2a538c2 100644
--- a/module/jenkins/control.php
+++ b/module/jenkins/control.php
@@ -39,8 +39,6 @@ class jenkins extends control
$pager = new pager($recTotal, $recPerPage, $pageID);
$this->view->title = $this->lang->jenkins->common . $this->lang->colon . $this->lang->jenkins->browse;
- $this->view->position[] = $this->lang->jenkins->common;
- $this->view->position[] = $this->lang->jenkins->browse;
$this->view->jenkinsList = $this->jenkins->getList($orderBy, $pager);
$this->view->orderBy = $orderBy;
@@ -59,15 +57,23 @@ class jenkins extends control
{
if($_POST)
{
- $jenkinsID = $this->jenkins->create();
+ $jenkins = form::data($this->config->jenkins->form->create)
+ ->add('type', 'jenkins')
+ ->add('private',md5(rand(10,113450)))
+ ->add('createdBy', $this->app->user->account)
+ ->add('createdDate', helper::now())
+ ->trim('url,token,account,password')
+ ->skipSpecial('url,token,account,password')
+ ->remove('appType')
+ ->get();
+ $jenkinsID = $this->loadModel('pipeline')->create($jenkins);
+
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $jenkinsID));
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse')));
}
$this->view->title = $this->lang->jenkins->common . $this->lang->colon . $this->lang->jenkins->create;
- $this->view->position[] = html::a(inlink('browse'), $this->lang->jenkins->common);
- $this->view->position[] = $this->lang->jenkins->create;
$this->display();
}
@@ -90,8 +96,6 @@ class jenkins extends control
}
$this->view->title = $this->lang->jenkins->common . $this->lang->colon . $this->lang->jenkins->edit;
- $this->view->position[] = html::a(inlink('browse'), $this->lang->jenkins->common);
- $this->view->position[] = $this->lang->jenkins->edit;
$this->view->jenkins = $jenkins;
@@ -99,21 +103,30 @@ class jenkins extends control
}
/**
+ * 删除一条jenkins数据。
* Delete a jenkins.
*
* @param int $id
* @access public
* @return void
*/
- public function delete($id, $confim = 'no')
+ public function delete($id)
{
- if($confim != 'yes') return print(js::confirm($this->lang->jenkins->confirmDelete, inlink('delete', "id=$id&confirm=yes")));
-
$jobs = $this->dao->select('*')->from(TABLE_JOB)->where('server')->eq($id)->andWhere('engine')->eq('jenkins')->andWhere('deleted')->eq('0')->fetchAll();
- if($jobs) return print(js::alert($this->lang->jenkins->error->linkedJob));
+ if($jobs)
+ {
+ $response['result'] = 'fail';
+ $response['callback'] = sprintf('zui.Modal.alert("%s");', $this->lang->jenkins->error->linkedJob);
+
+ return $this->send($response);
+ }
$this->jenkins->delete(TABLE_PIPELINE, $id);
- echo js::reload('parent');
+
+ $response['load'] = true;
+ $response['result'] = 'success';
+
+ return $this->send($response);
}
/**
@@ -127,7 +140,9 @@ class jenkins extends control
{
if(empty($id)) return print('');
- $this->view->tasks = $this->jenkins->getTasks($id, 3);
+ $this->app->loadLang('job');
+ $tasks = $this->jenkins->getTasks($id, 3);
+ $this->view->tasks = $this->jenkinsZen->buildTree($tasks);
$this->display();
}
}
diff --git a/module/jenkins/js/browse.ui.js b/module/jenkins/js/browse.ui.js
new file mode 100644
index 0000000000..76866ec329
--- /dev/null
+++ b/module/jenkins/js/browse.ui.js
@@ -0,0 +1,19 @@
+window.createSortLink = function(col)
+{
+ var sort = col.name + '_asc';
+ if(sort == orderBy) sort = col.name + '_desc';
+
+ return sortLink.replace('{orderBy}', sort);
+}
+
+window.renderCell = function(result, {col, row})
+{
+ if(col.name === 'url')
+ {
+ result[0] = {html:'' + row.data.url + '', style:{flexDirection:"column"}};
+
+ return result;
+ }
+
+ return result;
+};
diff --git a/module/jenkins/lang/en.php b/module/jenkins/lang/en.php
index c00c117dcc..51a4bf26a3 100644
--- a/module/jenkins/lang/en.php
+++ b/module/jenkins/lang/en.php
@@ -10,7 +10,7 @@ $lang->jenkins->browseAction = 'Jenkins List';
$lang->jenkins->deleteAction = 'Delete Jenkins';
$lang->jenkins->id = 'ID';
-$lang->jenkins->name = 'Server Name';
+$lang->jenkins->name = 'Application Name';
$lang->jenkins->url = 'Server URL';
$lang->jenkins->token = 'Token';
$lang->jenkins->account = 'Username';
diff --git a/module/jenkins/lang/zh-cn.php b/module/jenkins/lang/zh-cn.php
index 61ca75e9d5..68098365b6 100644
--- a/module/jenkins/lang/zh-cn.php
+++ b/module/jenkins/lang/zh-cn.php
@@ -10,7 +10,7 @@ $lang->jenkins->browseAction = 'Jenkins列表';
$lang->jenkins->deleteAction = '删除Jenkins';
$lang->jenkins->id = 'ID';
-$lang->jenkins->name = '服务器名称';
+$lang->jenkins->name = '应用名称';
$lang->jenkins->url = '服务器地址';
$lang->jenkins->token = 'Token';
$lang->jenkins->account = '用户名';
diff --git a/module/jenkins/model.php b/module/jenkins/model.php
index 4261f464e9..6bb21a75d2 100644
--- a/module/jenkins/model.php
+++ b/module/jenkins/model.php
@@ -118,27 +118,16 @@ class jenkinsModel extends model
$job = json_decode($response);
}
- $tasks[basename($job->url)] = array();
+ $tasks[urldecode(basename($job->url))] = array();
if(empty($job->jobs)) continue;
- $tasks[basename($job->url)] = $this->getDepthJobs($job->jobs, $userPWD, $depth + 1);
+ $tasks[urldecode(basename($job->url))] = $this->getDepthJobs($job->jobs, $userPWD, $depth + 1);
}
}
return $tasks;
}
- /**
- * Create a jenkins.
- *
- * @access public
- * @return bool
- */
- public function create()
- {
- return $this->loadModel('pipeline')->create('jenkins');
- }
-
/**
* Update a jenkins.
*
diff --git a/module/jenkins/ui/ajaxgetjenkinstasks.html.php b/module/jenkins/ui/ajaxgetjenkinstasks.html.php
new file mode 100644
index 0000000000..8ba61eb747
--- /dev/null
+++ b/module/jenkins/ui/ajaxgetjenkinstasks.html.php
@@ -0,0 +1,33 @@
+
+ * @package jenkins
+ * @link https://www.zentao.net
+ */
+namespace zin;
+
+$data['pipeline'] = $tasks;
+
+$tabs = array();
+$tabs[] = array('name' => 'pipeline', 'text' => $lang->repo->pipeline);
+
+/**
+ * 定义最终的 JSON 数据。
+ * Define the final json data.
+ */
+$json = array();
+$json['data'] = $data;
+$json['tabs'] = $tabs;
+$json['searchHint'] = $lang->searchAB;
+$json['link'] = array('pipeline' => '###');
+$json['itemType'] = 'pipeline';
+
+/**
+ * 渲染 JSON 字符串并发送到客户端。
+ * Render json data to string and send to client.
+ */
+renderJson($json);
diff --git a/module/jenkins/ui/browse.html.php b/module/jenkins/ui/browse.html.php
new file mode 100644
index 0000000000..57fde0dba2
--- /dev/null
+++ b/module/jenkins/ui/browse.html.php
@@ -0,0 +1,43 @@
+
+ * @package jenkins
+ * @link http://www.zentao.net
+ */
+
+namespace zin;
+
+featureBar();
+
+/* zin: Define the toolbar on main menu. */
+$canCreate = hasPriv('jenkins', 'create');
+$createLink = $this->createLink('jenkins', 'create');
+$createItem = array('text' => $lang->jenkins->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus');
+
+$tableData = initTableData($jenkinsList, $config->jenkins->dtable->fieldList, $this->jenkins);
+
+toolbar
+(
+ $canCreate ? item(set($createItem)) : null,
+);
+
+jsVar('confirmDelete', $lang->jenkins->confirmDelete);
+jsVar('orderBy', $orderBy);
+jsVar('canBrowseProject', common::hasPriv('jenkins', 'browseProject'));
+jsVar('sortLink', helper::createLink('jenkins', 'browse', "orderBy={orderBy}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}"));
+
+dtable
+(
+ set::cols(array_values($config->jenkins->dtable->fieldList)),
+ set::data($tableData),
+ set::sortLink(jsRaw('createSortLink')),
+ set::onRenderCell(jsRaw('window.renderCell')),
+ set::footPager(usePager()),
+);
+
+render();
diff --git a/module/jenkins/ui/create.html.php b/module/jenkins/ui/create.html.php
new file mode 100644
index 0000000000..7e47144435
--- /dev/null
+++ b/module/jenkins/ui/create.html.php
@@ -0,0 +1,66 @@
+
+ * @package jenkins
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('jenkinsCreateForm'),
+ set::title($lang->jenkins->lblCreate),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->jenkins->name),
+ set::value($jenkins->name),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->jenkins->url),
+ set::value($jenkins->url),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('account'),
+ set::label($lang->jenkins->account),
+ set::value($jenkins->account),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->jenkins->token),
+ set::value($jenkins->token),
+ set::placeholder($lang->jenkins->tokenFirst)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('password'),
+ set::label($lang->jenkins->password),
+ set::value($jenkins->password),
+ set::placeholder($lang->jenkins->tips)
+ )
+ ),
+);
diff --git a/module/jenkins/ui/edit.html.php b/module/jenkins/ui/edit.html.php
new file mode 100644
index 0000000000..c8c49f98d0
--- /dev/null
+++ b/module/jenkins/ui/edit.html.php
@@ -0,0 +1,66 @@
+
+ * @package jenkins
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('jenkinsCreateForm'),
+ set::title($lang->jenkins->edit),
+ formRow
+ (
+ formGroup
+ (
+ set::name('name'),
+ set::label($lang->jenkins->name),
+ set::value($jenkins->name),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('url'),
+ set::label($lang->jenkins->url),
+ set::value($jenkins->url),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('account'),
+ set::label($lang->jenkins->account),
+ set::value($jenkins->account),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('token'),
+ set::label($lang->jenkins->token),
+ set::value($jenkins->token),
+ set::placeholder($lang->jenkins->tokenFirst)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('password'),
+ set::label($lang->jenkins->password),
+ set::value($jenkins->password),
+ set::placeholder($lang->jenkins->tips)
+ )
+ ),
+);
diff --git a/module/jenkins/zen.php b/module/jenkins/zen.php
new file mode 100644
index 0000000000..8785f7b632
--- /dev/null
+++ b/module/jenkins/zen.php
@@ -0,0 +1,46 @@
+
+ * @package jenkins
+ * @link https://www.zentao.net
+ */
+class jenkinsZen extends jenkins
+{
+ /**
+ * 构建流水线下拉菜单树。
+ * Build pipeline dropmenu tree.
+ *
+ * @param array $tasks
+ * @access public
+ * @return array
+ */
+ function buildTree(array $tasks): array
+ {
+ $result = array();
+ foreach($tasks as $groupName => $task)
+ {
+ if(empty($task)) continue;
+
+ $itemArray = array
+ (
+ 'id' => is_array($task) ? '' : $groupName,
+ 'text' => is_array($task) ? $groupName : $task,
+ 'keys' => zget(common::convert2Pinyin(array($groupName)), $groupName, ''),
+ );
+ if(is_array($task))
+ {
+ $itemArray['items'] = $this->buildTree($task);
+ $itemArray['type'] = 'folder';
+ }
+
+ $result[] = $itemArray;
+ }
+ return $result;
+ }
+}
+
diff --git a/module/mr/control.php b/module/mr/control.php
index e0ff41b593..f80b1b2d43 100644
--- a/module/mr/control.php
+++ b/module/mr/control.php
@@ -57,6 +57,7 @@ class mr extends control
}
$filterProjects = empty($repo->serviceProject) ? array() : array($repo->serviceHost => array($repo->serviceProject => $repo->serviceProject));
$MRList = $this->mr->getList($mode, $param, $orderBy, $pager, $filterProjects, $repoID);
+
if($repo->SCM == 'Gitlab')
{
$projectIds = array();
diff --git a/module/mr/model.php b/module/mr/model.php
index 146221cb89..3c80100554 100644
--- a/module/mr/model.php
+++ b/module/mr/model.php
@@ -635,7 +635,7 @@ class mrModel extends model
{
$todoDesc = $this->dao->select('*')
->from(TABLE_TODO)
- ->where('objectID')->eq($rawTodo->id)
+ ->where('idvalue')->eq($rawTodo->id)
->fetch();
if(empty($todoDesc))
{
@@ -651,7 +651,7 @@ class mrModel extends model
$todo->begin = '2400'; /* 2400 means begin is 'undefined'. */
$todo->end = '2400'; /* 2400 means end is 'undefined'. */
$todo->type = 'custom';
- $todo->objectID = $rawTodo->id;
+ $todo->idvalue = $rawTodo->id;
$todo->pri = 3;
$todo->name = $this->lang->mr->common . ": " . $rawTodo->target->title;
$todo->desc = $author . ' ' . $this->lang->mr->at . ' ' . '' . $rawTodo->project->path .'' . ' ' . $this->lang->mr->todomessage . '' . ' ' . $this->lang->mr->common .'' . '。';
diff --git a/module/mr/ui/diff.html.php b/module/mr/ui/diff.html.php
index 9ee93452af..d18dbc565a 100644
--- a/module/mr/ui/diff.html.php
+++ b/module/mr/ui/diff.html.php
@@ -135,6 +135,7 @@ panel
tree
(
set::id('monacoTree'),
+ set::canSplit(false),
set::items($tree),
set::collapsedIcon('folder'),
set::expandedIcon('folder-open'),
diff --git a/module/repo/css/browse.ui.css b/module/repo/css/browse.ui.css
index 725c2dd3e5..6d95914336 100644
--- a/module/repo/css/browse.ui.css
+++ b/module/repo/css/browse.ui.css
@@ -3,5 +3,6 @@
.repo-comment{width: 100%; display: block; word-break: keep-all; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}
.dtable-cell-html{width: 100%;}
.container .sidebar{width: 550px;}
-#actionBar .dropdown-menu {margin-top: 10px; padding: 10px;}
+#actionBar .dropdown-menu {margin-top: 10px; padding: 10px; display: none;}
+#actionBar .dropdown-menu.show{display: block;}
#actionBar>.dropdown {position: absolute!important;}
\ No newline at end of file