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