Merge branch 'master' into 'feedback_1796'
# Conflicts: # module/testcase/js/browse.js
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
/**
|
||||
* The host entry point of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Yuchun Li <liyuchun@easycorp.ltd>
|
||||
* @package entries
|
||||
* @version 1
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class hostHeartbeatEntry extends baseEntry
|
||||
{
|
||||
/**
|
||||
* Listen host heartbeat.
|
||||
*
|
||||
* @param int|string $userID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function post()
|
||||
{
|
||||
/* Check authorize. */
|
||||
$header = getallheaders();
|
||||
$token = isset($header['Authorization']) ? substr($header['Authorization'], 7) : '';
|
||||
$secret = isset($this->requestBody->secret) ? $this->requestBody->secret : '';
|
||||
if(!$secret and !$token) return $this->sendError(401, 'Unauthorized');
|
||||
|
||||
/* Check param. */
|
||||
$status = $this->requestBody->status;
|
||||
$vms = $this->requestBody->Vms;
|
||||
$zap = $this->requestBody->port;
|
||||
$now = helper::now();
|
||||
if(!$status) return $this->sendError(400, 'Params error.');
|
||||
|
||||
$conditionField = $secret ? 'secret' : 'tokenSN';
|
||||
$conditionValue = $secret ? $secret : $token;
|
||||
|
||||
$this->dao = $this->loadModel('common')->dao;
|
||||
$hostInfo = $this->dao->select('id,tokenSN')->from(TABLE_ZAHOST)
|
||||
->beginIF($secret)->where('secret')->eq($secret)->fi()
|
||||
->beginIF(!$secret)->where('tokenSN')->eq($token)
|
||||
->andWhere('tokenTime')->gt($now)->fi()
|
||||
->fetch();
|
||||
if(empty($hostInfo->id))
|
||||
{
|
||||
if(empty($token)) return $this->sendError(400, 'Secret error.');
|
||||
$hostInfo = $this->dao->select('id,tokenSN')->from(TABLE_ZAHOST)
|
||||
->where('oldTokenSN')->eq($token)
|
||||
->andWhere('tokenTime')->gt(date(DT_DATETIME1, strtotime($now) - 30))->fi()
|
||||
->fetch();
|
||||
if(empty($hostInfo->id)) return $this->sendError(400, 'Secret error.');
|
||||
}
|
||||
|
||||
$host = new stdclass();
|
||||
$host->status = $status;
|
||||
if($secret)
|
||||
{
|
||||
$host->tokenSN = md5($secret . $now);
|
||||
$host->tokenTime = date('Y-m-d H:i:s', time() + 7200);
|
||||
$host->oldTokenSN = $hostInfo->tokenSN;
|
||||
}
|
||||
$host->heartbeat = $now;
|
||||
$host->zap = $zap;
|
||||
$this->dao->update(TABLE_ZAHOST)->data($host)->where($conditionField)->eq($conditionValue)->exec();
|
||||
|
||||
if($vms)
|
||||
{
|
||||
foreach($vms as $vm)
|
||||
{
|
||||
$heartbeat = strtotime(substr($vm->heartbeat, 0, 19));
|
||||
$vmData = array(
|
||||
'vnc' => $vm->vncPortOnHost,
|
||||
'zap' => $vm->agentPortOnHost,
|
||||
'ztf' => $vm->ztfPortOnHost,
|
||||
'zd' => $vm->zdPortOnHost,
|
||||
'ssh' => $vm->sshPortOnHost,
|
||||
'status' => $vm->status,
|
||||
'extranet' => $vm->ip,
|
||||
);
|
||||
if($heartbeat > 0) $vmData['heartbeat'] = date("Y-m-d H:i:s", $heartbeat);
|
||||
|
||||
$this->dao->update(TABLE_ZAHOST)->data($vmData)->where('mac')->eq($vm->macAddress)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
if(!$secret) return $this->sendSuccess(200, 'success');
|
||||
|
||||
$host->tokenTimeUnix = strtotime($host->tokenTime);
|
||||
unset($host->status);
|
||||
unset($host->tokenTime);
|
||||
unset($host->oldTokenSN);
|
||||
return $this->send(200, $host);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* The host entry point of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Ke Zhao <zhaoke@easycorp.ltd>
|
||||
* @package entries
|
||||
* @version 1
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class hostSubmitEntry extends baseEntry
|
||||
{
|
||||
/**
|
||||
* Listen host task finish submit.
|
||||
*
|
||||
* @param int|string $userID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function post()
|
||||
{
|
||||
/* Check authorize. */
|
||||
$header = getallheaders();
|
||||
$token = isset($header['Authorization']) ? substr($header['Authorization'], 7) : '';
|
||||
// if(!$token) return $this->sendError(401, 'Unauthorized');
|
||||
|
||||
$now = helper::now();
|
||||
|
||||
/* Check param. */
|
||||
$image = new stdclass();
|
||||
$task = $this->requestBody->task;
|
||||
$image->status = $this->requestBody->status;
|
||||
|
||||
$this->dao = $this->loadModel('common')->dao;
|
||||
$id = $this->dao->select('id')->from(TABLE_ZAHOST)
|
||||
->where('tokenSN')->eq($token)
|
||||
->andWhere('tokenTime')->gt($now)->fi()
|
||||
->fetch('id');
|
||||
|
||||
// if(!$id) return $this->sendError(400, 'Secret error.');
|
||||
|
||||
$this->dao->update(TABLE_IMAGE)->data($image)->where("id")->eq($task)->exec();
|
||||
|
||||
return $this->sendSuccess(200, 'success');
|
||||
}
|
||||
}
|
||||
@@ -46,26 +46,28 @@ class testcaseEntry extends entry
|
||||
$oldCase = $this->loadModel('testcase')->getByID($caseID);
|
||||
|
||||
/* Set $_POST variables. */
|
||||
$fields = 'title,pri,story,type,stage,product,module,branch,precondition';
|
||||
$fields = 'title,pri,story,type,stage,product,module,branch,precondition,script';
|
||||
$this->batchSetPost($fields, $oldCase);
|
||||
if(isset($this->requestBody->script)) $this->setPost('auto', 'auto');
|
||||
|
||||
/* Set steps and expects. */
|
||||
$steps = array();
|
||||
$expects = array();
|
||||
$stepType = array();
|
||||
if(isset($this->requestBody->steps))
|
||||
{
|
||||
$steps = array();
|
||||
$expects = array();
|
||||
$stepType = array();
|
||||
foreach($this->requestBody->steps as $step)
|
||||
{
|
||||
$steps[] = $step->desc;
|
||||
$expects[] = $step->expect;
|
||||
$stepType[] = 'item';
|
||||
}
|
||||
$this->setPost('steps', $steps);
|
||||
$this->setPost('expects', $expects);
|
||||
$this->setPost('stepType', $stepType);
|
||||
}
|
||||
|
||||
$this->setPost('steps', $steps);
|
||||
$this->setPost('expects', $expects);
|
||||
$this->setPost('stepType', $stepType);
|
||||
|
||||
$control = $this->loadController('testcase', 'edit');
|
||||
$control->edit($caseID);
|
||||
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
/**
|
||||
* The host entry point of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Ke Zhao <zhaoke@easycorp.ltd>
|
||||
* @package entries
|
||||
* @version 1
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class ztfSubmitEntry extends baseEntry
|
||||
{
|
||||
/**
|
||||
* Listen ztf task finish submit.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function post()
|
||||
{
|
||||
/* Check authorize. */
|
||||
$header = getallheaders();
|
||||
$token = isset($header['Authorization']) ? substr($header['Authorization'], 7) : '';
|
||||
if(!$token) return $this->sendError(401, 'Unauthorized');
|
||||
|
||||
$now = helper::now();
|
||||
|
||||
$this->dao = $this->loadModel('common')->dao;
|
||||
$id = $this->dao->select('id')->from(TABLE_ZAHOST)
|
||||
->where('tokenSN')->eq($token)
|
||||
->andWhere('tokenTime')->gt($now)->fi()
|
||||
->fetch('id');
|
||||
|
||||
if(!$id) return $this->sendError(400, 'Secret error.');
|
||||
|
||||
$post = file_get_contents('php://input');
|
||||
$post = json_decode($post);
|
||||
|
||||
$this->loadModel('testresult');
|
||||
|
||||
if(!empty($post->task))
|
||||
{
|
||||
$post->log = !empty($post->data->log) ? $post->data->log: $post->error;
|
||||
|
||||
$this->app->user = new stdClass;
|
||||
$this->app->user->account = '';
|
||||
|
||||
if(!empty($post->data->funcResult))
|
||||
{
|
||||
$result = $this->loadModel('testtask')->parseZTFFuncResult($post->data->funcResult, "", 0, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
$result = array();
|
||||
}
|
||||
|
||||
unset($post->data);
|
||||
if(!empty($result['results'][0]))
|
||||
{
|
||||
$this->dao->update(TABLE_TESTRESULT)
|
||||
->set('caseResult')->eq($result['results'][0][0]->caseResult)
|
||||
->set('stepResults')->eq($result['results'][0][0]->stepResults)
|
||||
->set('ZTFResult')->eq(json_encode($post))
|
||||
->where('id')->eq($post->task)
|
||||
->exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->dao->update(TABLE_TESTRESULT)
|
||||
->set('ZTFResult')->eq(json_encode($post))
|
||||
->set('caseResult')->eq('n/a')
|
||||
->where('id')->eq($post->task)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
return $this->sendSuccess(200, 'success');
|
||||
}
|
||||
}
|
||||
+10
-8
@@ -318,14 +318,16 @@ $filter->execution->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
|
||||
$filter->execution->all->cookie['showExecutionBatchEdit'] = 'int';
|
||||
|
||||
$filter->testcase->browse->cookie['caseModule'] = 'int';
|
||||
$filter->testcase->browse->cookie['caseSuite'] = 'int';
|
||||
$filter->testcase->browse->cookie['preBranch'] = 'reg::word';
|
||||
$filter->testcase->create->cookie['lastCaseModule'] = 'int';
|
||||
$filter->testcase->default->cookie['lastProduct'] = 'int';
|
||||
$filter->testcase->default->cookie['preProductID'] = 'int';
|
||||
$filter->testcase->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->testcase->groupcase->cookie['preBranch'] = 'reg::word';
|
||||
$filter->testcase->browse->cookie['caseModule'] = 'int';
|
||||
$filter->testcase->browse->cookie['caseSuite'] = 'int';
|
||||
$filter->testcase->browse->cookie['preBranch'] = 'reg::word';
|
||||
$filter->testcase->browse->cookie['showAutoCase'] = 'int';
|
||||
$filter->testcase->create->cookie['lastCaseModule'] = 'int';
|
||||
$filter->testcase->default->cookie['lastProduct'] = 'int';
|
||||
$filter->testcase->default->cookie['preProductID'] = 'int';
|
||||
$filter->testcase->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->testcase->groupcase->cookie['preBranch'] = 'reg::word';
|
||||
$filter->testcase->groupcase->cookie['showAutoCase'] = 'int';
|
||||
|
||||
$filter->testreport->default->cookie['lastProduct'] = 'int';
|
||||
$filter->testreport->default->cookie['lastProject'] = 'int';
|
||||
|
||||
@@ -166,6 +166,11 @@ $routes['/modules'] = 'modules';
|
||||
|
||||
$routes['/reports'] = 'reports';
|
||||
|
||||
$routes['/host/heartbeat'] = 'hostHeartbeat';
|
||||
$routes['/host/submitResult'] = 'hostSubmit';
|
||||
|
||||
$routes['/ztf/submitResult'] = 'ztfSubmit';
|
||||
|
||||
$routes['/z/folders'] = 'zfolders';
|
||||
$routes['/z/folders/:id'] = 'zfolder';
|
||||
$routes['/z/files/:id'] = 'zfile';
|
||||
|
||||
@@ -227,6 +227,7 @@ $config->openMethods[] = 'doc.createbasicinfo';
|
||||
$config->openMethods[] = 'project.createguide';
|
||||
$config->openMethods[] = 'task.editteam';
|
||||
$config->openMethods[] = 'feedback.mergeproductmodule';
|
||||
$config->openMethods[] = 'zahost.introduction';
|
||||
|
||||
$config->openModules = array();
|
||||
$config->openModules[] = 'install';
|
||||
@@ -253,6 +254,11 @@ define('TABLE_TESTTASK', '`' . $config->db->prefix . 'testtask`');
|
||||
define('TABLE_TESTRUN', '`' . $config->db->prefix . 'testrun`');
|
||||
define('TABLE_TESTRESULT', '`' . $config->db->prefix . 'testresult`');
|
||||
define('TABLE_USERTPL', '`' . $config->db->prefix . 'usertpl`');
|
||||
define('TABLE_ZAHOST', '`' . $config->db->prefix . 'host`');
|
||||
define('TABLE_IMAGE', '`' . $config->db->prefix . 'image`');
|
||||
define('TABLE_AUTOMATION', '`' . $config->db->prefix . 'automation`');
|
||||
|
||||
if(!defined('TABLE_ASSET')) define('TABLE_ASSET', '`' . $config->db->prefix . 'asset`');
|
||||
|
||||
define('TABLE_PRODUCT', '`' . $config->db->prefix . 'product`');
|
||||
define('TABLE_BRANCH', '`' . $config->db->prefix . 'branch`');
|
||||
@@ -398,6 +404,8 @@ $config->objectTables['stage'] = TABLE_STAGE;
|
||||
$config->objectTables['apistruct'] = TABLE_APISTRUCT;
|
||||
$config->objectTables['repo'] = TABLE_REPO;
|
||||
$config->objectTables['dataview'] = TABLE_DATAVIEW;
|
||||
$config->objectTables['zahost'] = TABLE_ZAHOST;
|
||||
$config->objectTables['automation'] = TABLE_AUTOMATION;
|
||||
|
||||
$config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme', 'visions');
|
||||
$config->disabledFeatures = '';
|
||||
|
||||
File diff suppressed because one or more lines are too long
+180
-252
File diff suppressed because one or more lines are too long
@@ -1249,7 +1249,7 @@ EOT;
|
||||
}
|
||||
|
||||
/* Fix value is '0123' error. */
|
||||
if(is_numeric($value) and !preg_match('/^0[1-9]/', $value))
|
||||
if(is_numeric($value) and !preg_match('/^0[0-9]+/', $value))
|
||||
{
|
||||
$js .= "{$prefix}{$key} = {$value};";
|
||||
}
|
||||
|
||||
+55
-4
@@ -213,6 +213,8 @@ class Gitea
|
||||
if(!scm::checkRevision($fromRevision)) return array();
|
||||
if(!scm::checkRevision($toRevision)) return array();
|
||||
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
|
||||
$path = ltrim($path, DIRECTORY_SEPARATOR);
|
||||
$count = $count == 0 ? '' : "-n $count";
|
||||
/* compatible with svn. */
|
||||
@@ -278,6 +280,9 @@ class Gitea
|
||||
$blame['lines'] = 1;
|
||||
$blame['content'] = strpos($matches[6], ' ') === false ? $matches[6] : substr($matches[6], 1);
|
||||
|
||||
$log = $this->log('', '', '', 1);
|
||||
$blame['message'] = $log[0]->comment;
|
||||
|
||||
$revision = $matches[1];
|
||||
$revLine = $matches[5];
|
||||
$blames[$revLine] = $blame;
|
||||
@@ -611,6 +616,7 @@ class Gitea
|
||||
$parsedFile = new stdclass();
|
||||
$parsedFile->revision = $hash;
|
||||
$parsedFile->path = '/' . trim($path);
|
||||
$parsedFile->oldPath = isset($file[2]) ? '/' . trim($file[2]) : '';
|
||||
$parsedFile->type = 'file';
|
||||
$parsedFile->action = $action;
|
||||
$logs['files'][$hash][] = $parsedFile;
|
||||
@@ -683,12 +689,14 @@ class Gitea
|
||||
}
|
||||
elseif(strpos($line, "\t") !== false)
|
||||
{
|
||||
list($action, $entry) = explode("\t", $line);
|
||||
$lineList = explode("\t", $line);
|
||||
list($action, $entry) = $lineList;
|
||||
$entry = '/' . trim($entry);
|
||||
$pathInfo = array();
|
||||
$pathInfo['action'] = $action;
|
||||
$pathInfo['kind'] = 'file';
|
||||
$changes[$entry] = $pathInfo;
|
||||
$pathInfo['action'] = $action;
|
||||
$pathInfo['kind'] = 'file';
|
||||
$pathInfo['oldPath'] = isset($lineList[2]) ? '/' . trim($lineList[2]) : '';
|
||||
$changes[$entry] = $pathInfo;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -717,4 +725,47 @@ class Gitea
|
||||
$api = $app->control->loadModel('gitea')->getApiRoot($this->repo->serviceHost);
|
||||
return sprintf($api, "/repos/{$this->repo->serviceProject}/archive/{$branch}.zip");
|
||||
}
|
||||
|
||||
/**
|
||||
* List all files.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $revision
|
||||
* @param array $lists
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getAllFiles($path, $revision = 'HEAD', &$lists = array())
|
||||
{
|
||||
if(!scm::checkRevision($revision)) return array();
|
||||
|
||||
$path = ltrim($path, DIRECTORY_SEPARATOR);
|
||||
$sub = '';
|
||||
chdir($this->root);
|
||||
if(!empty($path)) $sub = ":$path";
|
||||
if(!empty($this->branch))$revision = $this->branch;
|
||||
$cmd = escapeCmd("$this->client ls-tree -l $revision$sub");
|
||||
$list = execCmd($cmd . ' 2>&1', 'array', $result);
|
||||
if($result) return array();
|
||||
|
||||
$infos = array();
|
||||
foreach($list as $entry)
|
||||
{
|
||||
list($mod, $kind, $revision, $size, $name) = preg_split('/[\t ]+/', $entry);
|
||||
|
||||
/* Get commit info. */
|
||||
$pathName = ltrim($path . DIRECTORY_SEPARATOR . $name, DIRECTORY_SEPARATOR);
|
||||
$info->kind = $kind == 'tree' ? 'dir' : 'file';
|
||||
if($kind == 'tree')
|
||||
{
|
||||
$this->getAllFiles($pathName, $revision, $lists);
|
||||
}
|
||||
else
|
||||
{
|
||||
$lists[] = rtrim($pathName, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
||||
return $lists;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,6 +257,7 @@ class gitlab
|
||||
$param = new stdclass;
|
||||
$param->ref = ($revision and $revision != 'HEAD') ? $revision : $this->branch;
|
||||
$results = $this->fetch($api, $param);
|
||||
if(empty($results) or isset($results->message)) return array();
|
||||
|
||||
$blames = array();
|
||||
$revLine = 0;
|
||||
@@ -268,7 +269,8 @@ class gitlab
|
||||
$line = array();
|
||||
$line['revision'] = $blame->commit->id;
|
||||
$line['committer'] = $blame->commit->committer_name;
|
||||
$line['time'] = $blame->commit->committer_name;
|
||||
$line['message'] = $blame->commit->message;
|
||||
$line['time'] = date('Y-m-d H:i:s', strtotime($blame->commit->committed_date));
|
||||
$line['line'] = $lineNumber;
|
||||
$line['lines'] = count($blame->lines);
|
||||
$line['content'] = array_shift($blame->lines);
|
||||
@@ -342,7 +344,7 @@ class gitlab
|
||||
if(!scm::checkRevision($revision)) return false;
|
||||
if($revision == 'HEAD' and $this->branch) $revision = $this->branch;
|
||||
$file = $this->files($entry, $revision);
|
||||
return base64_decode($file->content);
|
||||
return isset($file->content) ? base64_decode($file->content) : '';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -688,7 +690,7 @@ class gitlab
|
||||
/**
|
||||
* Get files by commit.
|
||||
*
|
||||
* @param string $commit
|
||||
* @param string $commit
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -717,8 +719,9 @@ class gitlab
|
||||
$file->revision = $revision;
|
||||
$file->path = '/' . $row->new_path;
|
||||
$file->type = 'file';
|
||||
$file->oldPath = '/' . $row->old_path;
|
||||
|
||||
$file->action = 'M';
|
||||
$file->action = 'M';
|
||||
if($row->new_file) $file->action = 'A';
|
||||
if($row->renamed_file) $file->action = 'R';
|
||||
if($row->deleted_file) $file->action = 'D';
|
||||
@@ -827,8 +830,9 @@ class gitlab
|
||||
foreach($commit->diffs as $diff)
|
||||
{
|
||||
$parsedLog->change[$diff->path] = array();
|
||||
$parsedLog->change[$diff->path]['action'] = $diff->action;
|
||||
$parsedLog->change[$diff->path]['kind'] = $diff->type;
|
||||
$parsedLog->change[$diff->path]['action'] = $diff->action;
|
||||
$parsedLog->change[$diff->path]['kind'] = $diff->type;
|
||||
$parsedLog->change[$diff->path]['oldPath'] = $diff->oldPath;
|
||||
}
|
||||
$parsedLogs[] = $parsedLog;
|
||||
}
|
||||
@@ -853,4 +857,44 @@ class gitlab
|
||||
|
||||
return "{$this->root}archive.{$ext}" . '?' . http_build_query($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* List all files.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $revision
|
||||
* @param array $lists
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getAllFiles($path = '', $revision = 'HEAD', &$lists = array())
|
||||
{
|
||||
if(!scm::checkRevision($revision)) return array();
|
||||
$api = "tree";
|
||||
|
||||
$param = new stdclass();
|
||||
$param->path = ltrim($path, '/');
|
||||
$param->ref = $revision;
|
||||
$param->recursive = 0;
|
||||
if(!empty($this->branch)) $param->ref = $this->branch;
|
||||
|
||||
$list = $this->fetch($api, $param, true);
|
||||
if(empty($list)) return array();
|
||||
|
||||
$infos = array();
|
||||
foreach($list as $file)
|
||||
{
|
||||
if(!isset($file->type)) continue;
|
||||
|
||||
if($file->type == 'blob')
|
||||
{
|
||||
$lists[] = $file->path;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->getAllFiles($file->path, $revision, $lists);
|
||||
}
|
||||
}
|
||||
return $lists;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,6 +201,8 @@ class GitRepo
|
||||
if(!scm::checkRevision($fromRevision)) return array();
|
||||
if(!scm::checkRevision($toRevision)) return array();
|
||||
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
|
||||
$path = ltrim($path, DIRECTORY_SEPARATOR);
|
||||
$count = $count == 0 ? '' : "-n $count";
|
||||
/* compatible with svn. */
|
||||
@@ -266,6 +268,9 @@ class GitRepo
|
||||
$blame['lines'] = 1;
|
||||
$blame['content'] = strpos($matches[6], ' ') === false ? $matches[6] : substr($matches[6], 1);
|
||||
|
||||
$log = $this->log('', '', '', 1);
|
||||
$blame['message'] = $log[0]->comment;
|
||||
|
||||
$revision = $matches[1];
|
||||
$revLine = $matches[5];
|
||||
$blames[$revLine] = $blame;
|
||||
@@ -596,9 +601,10 @@ class GitRepo
|
||||
$parsedFile = new stdclass();
|
||||
$parsedFile->revision = $hash;
|
||||
$parsedFile->path = '/' . trim($path);
|
||||
$parsedFile->oldPath = isset($file[2]) ? '/' . trim($file[2]) : '';
|
||||
$parsedFile->type = 'file';
|
||||
$parsedFile->action = $action;
|
||||
$logs['files'][$hash][] = $parsedFile;
|
||||
$logs['files'][$hash][] = $parsedFile;
|
||||
}
|
||||
}
|
||||
return $logs;
|
||||
@@ -669,12 +675,14 @@ class GitRepo
|
||||
}
|
||||
elseif(strpos($line, "\t") !== false)
|
||||
{
|
||||
list($action, $entry) = explode("\t", $line);
|
||||
$lineList = explode("\t", $line);
|
||||
list($action, $entry) = $lineList;
|
||||
$entry = '/' . trim($entry);
|
||||
$pathInfo = array();
|
||||
$pathInfo['action'] = $action;
|
||||
$pathInfo['kind'] = 'file';
|
||||
$changes[$entry] = $pathInfo;
|
||||
$pathInfo['action'] = $action;
|
||||
$pathInfo['kind'] = 'file';
|
||||
$pathInfo['oldPath'] = isset($lineList[2]) ? '/' . trim($lineList[2]) : '';
|
||||
$changes[$entry] = $pathInfo;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -714,4 +722,47 @@ class GitRepo
|
||||
|
||||
return $config->webRoot . $app->getAppName() . 'data' . DS . 'repo' . DS . "{$this->repo->name}_$branch.zip";
|
||||
}
|
||||
|
||||
/**
|
||||
* List all files.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $revision
|
||||
* @param array $lists
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getAllFiles($path, $revision = 'HEAD', &$lists = array())
|
||||
{
|
||||
if(!scm::checkRevision($revision)) return array();
|
||||
|
||||
$path = ltrim($path, DIRECTORY_SEPARATOR);
|
||||
$sub = '';
|
||||
chdir($this->root);
|
||||
if(!empty($path)) $sub = ":$path";
|
||||
if(!empty($this->branch))$revision = $this->branch;
|
||||
$cmd = escapeCmd("$this->client ls-tree -l $revision$sub");
|
||||
$list = execCmd($cmd . ' 2>&1', 'array', $result);
|
||||
if($result) return array();
|
||||
|
||||
$infos = array();
|
||||
foreach($list as $entry)
|
||||
{
|
||||
list($mod, $kind, $revision, $size, $name) = preg_split('/[\t ]+/', $entry);
|
||||
|
||||
/* Get commit info. */
|
||||
$pathName = ltrim($path . DIRECTORY_SEPARATOR . $name, DIRECTORY_SEPARATOR);
|
||||
$info->kind = $kind == 'tree' ? 'dir' : 'file';
|
||||
if($kind == 'tree')
|
||||
{
|
||||
$this->getAllFiles($pathName, $revision, $lists);
|
||||
}
|
||||
else
|
||||
{
|
||||
$lists[] = rtrim($pathName, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
||||
return $lists;
|
||||
}
|
||||
}
|
||||
|
||||
+55
-4
@@ -213,6 +213,8 @@ class Gogs
|
||||
if(!scm::checkRevision($fromRevision)) return array();
|
||||
if(!scm::checkRevision($toRevision)) return array();
|
||||
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
|
||||
$path = ltrim($path, DIRECTORY_SEPARATOR);
|
||||
$count = $count == 0 ? '' : "-n $count";
|
||||
/* compatible with svn. */
|
||||
@@ -278,6 +280,9 @@ class Gogs
|
||||
$blame['lines'] = 1;
|
||||
$blame['content'] = strpos($matches[6], ' ') === false ? $matches[6] : substr($matches[6], 1);
|
||||
|
||||
$log = $this->log('', '', '', 1);
|
||||
$blame['message'] = $log[0]->comment;
|
||||
|
||||
$revision = $matches[1];
|
||||
$revLine = $matches[5];
|
||||
$blames[$revLine] = $blame;
|
||||
@@ -611,6 +616,7 @@ class Gogs
|
||||
$parsedFile = new stdclass();
|
||||
$parsedFile->revision = $hash;
|
||||
$parsedFile->path = '/' . trim($path);
|
||||
$parsedFile->oldPath = isset($file[2]) ? '/' . trim($file[2]) : '';
|
||||
$parsedFile->type = 'file';
|
||||
$parsedFile->action = $action;
|
||||
$logs['files'][$hash][] = $parsedFile;
|
||||
@@ -704,12 +710,14 @@ class Gogs
|
||||
}
|
||||
elseif(strpos($line, "\t") !== false)
|
||||
{
|
||||
list($action, $entry) = explode("\t", $line);
|
||||
$lineList = explode("\t", $line);
|
||||
list($action, $entry) = $lineList;
|
||||
$entry = '/' . trim($entry);
|
||||
$pathInfo = array();
|
||||
$pathInfo['action'] = $action;
|
||||
$pathInfo['kind'] = 'file';
|
||||
$changes[$entry] = $pathInfo;
|
||||
$pathInfo['action'] = $action;
|
||||
$pathInfo['kind'] = 'file';
|
||||
$pathInfo['oldPath'] = isset($lineList[2]) ? '/' . trim($lineList[2]) : '';
|
||||
$changes[$entry] = $pathInfo;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -752,4 +760,47 @@ class Gogs
|
||||
|
||||
return $config->webRoot . $app->getAppName() . 'data' . DS . 'repo' . DS . "{$this->repo->name}_$branch.zip";
|
||||
}
|
||||
|
||||
/**
|
||||
* List all files.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $revision
|
||||
* @param array $lists
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getAllFiles($path, $revision = 'HEAD', &$lists = array())
|
||||
{
|
||||
if(!scm::checkRevision($revision)) return array();
|
||||
|
||||
$path = ltrim($path, DIRECTORY_SEPARATOR);
|
||||
$sub = '';
|
||||
chdir($this->root);
|
||||
if(!empty($path)) $sub = ":$path";
|
||||
if(!empty($this->branch))$revision = $this->branch;
|
||||
$cmd = escapeCmd("$this->client ls-tree -l $revision$sub");
|
||||
$list = execCmd($cmd . ' 2>&1', 'array', $result);
|
||||
if($result) return array();
|
||||
|
||||
$infos = array();
|
||||
foreach($list as $entry)
|
||||
{
|
||||
list($mod, $kind, $revision, $size, $name) = preg_split('/[\t ]+/', $entry);
|
||||
|
||||
/* Get commit info. */
|
||||
$pathName = ltrim($path . DIRECTORY_SEPARATOR . $name, DIRECTORY_SEPARATOR);
|
||||
$info->kind = $kind == 'tree' ? 'dir' : 'file';
|
||||
if($kind == 'tree')
|
||||
{
|
||||
$this->getAllFiles($pathName, $revision, $lists);
|
||||
}
|
||||
else
|
||||
{
|
||||
$lists[] = rtrim($pathName, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
||||
return $lists;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -271,6 +271,31 @@ class scm
|
||||
{
|
||||
return $this->engine->getDownloadUrl($branch, $savePath, $ext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all files.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $revision
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getAllFiles($path = '', $revision = 'HEAD')
|
||||
{
|
||||
return $this->engine->getAllFiles($path, $revision);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get files by commit.
|
||||
*
|
||||
* @param string $commit
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getFilesByCommit($revision)
|
||||
{
|
||||
return $this->engine->getFilesByCommit($revision);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -306,10 +306,14 @@ class Subversion
|
||||
$blame = array();
|
||||
$blame['revision'] = (int)$line->commit['revision'];
|
||||
$blame['committer'] = (string)$line->commit->author;
|
||||
$blame['time'] = substr($line->commit->date, 0, 10);
|
||||
$blame['time'] = date('Y-m-d H:i:s', strtotime($line->commit->date));
|
||||
$blame['line'] = (int)$line['line-number'];
|
||||
$blame['lines'] = 1;
|
||||
$blame['content'] = $content[$blame['line'] - 1];
|
||||
|
||||
$log = $this->log('', $blame['revision'], 'HEAD', 1);
|
||||
$blame['message'] = $log[0]->comment;
|
||||
|
||||
$revision = $blame['revision'];
|
||||
$revLine = $blame['line'];
|
||||
$blames[$revLine] = $blame;
|
||||
@@ -318,7 +322,7 @@ class Subversion
|
||||
{
|
||||
$blame = array();
|
||||
$blame['line'] = (int)$line['line-number'];
|
||||
$blame['content'] = $content[$blame['line'] - 1];
|
||||
$blame['content'] = zget($content, $blame['line'] - 1, '');
|
||||
|
||||
$blames[$blame['line']] = $blame;
|
||||
$blames[$revLine]['lines'] ++;
|
||||
@@ -712,4 +716,55 @@ class Subversion
|
||||
$zfile->removeDir($repoDir);
|
||||
return $config->webRoot . $app->getAppName() . 'data' . DS . 'repo' . DS . $this->repo->name . '.zip';
|
||||
}
|
||||
|
||||
/**
|
||||
* List all files.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $revision
|
||||
* @param array $lists
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getAllFiles($path = '', $revision = 'HEAD', &$lists = array())
|
||||
{
|
||||
if(!scm::checkRevision($revision)) return array();
|
||||
|
||||
$resourcePath = $path;
|
||||
$path = '"' . $this->root . '/' . str_replace(array('%2F', '+'), array('/', ' '), urlencode($path)) . '"';
|
||||
$cmd = $this->replaceAuth(escapeCmd($this->buildCMD($path, 'ls', "-r $revision --xml")));
|
||||
$list = execCmd($cmd, 'string', $result);
|
||||
if($result)
|
||||
{
|
||||
$path = '"' . $this->root . '/' . $resourcePath . '"';
|
||||
$cmd = $this->replaceAuth(escapeCmd($this->buildCMD($path, 'ls', "-r $revision --xml")));
|
||||
$list = execCmd($cmd, 'string', $result);
|
||||
if($result) $list = '';
|
||||
}
|
||||
$listObject = simplexml_load_string($list);
|
||||
if(!empty($list) and empty($listObject))
|
||||
{
|
||||
$list = helper::convertEncoding($list, $this->encoding, 'utf-8');
|
||||
$listObject = simplexml_load_string($list);
|
||||
}
|
||||
if(!empty($listObject->list->entry)) $listObject = $listObject->list->entry;
|
||||
$infos = array();
|
||||
if(empty($listObject)) return $infos;
|
||||
|
||||
foreach($listObject as $list)
|
||||
{
|
||||
$kind = (string)$list['kind'];
|
||||
$pathName = ltrim($path . DIRECTORY_SEPARATOR . (string)$list->name, DIRECTORY_SEPARATOR);
|
||||
if($kind == 'dir')
|
||||
{
|
||||
$this->getAllFiles($pathName, $revision, $lists);
|
||||
}
|
||||
else
|
||||
{
|
||||
$lists[] = rtrim($pathName, DIRECTORY_SEPARATOR);
|
||||
}
|
||||
}
|
||||
|
||||
return $lists;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ $config->action->objectNameFields['stage'] = 'name';
|
||||
$config->action->objectNameFields['apistruct'] = 'name';
|
||||
$config->action->objectNameFields['repo'] = 'name';
|
||||
$config->action->objectNameFields['dataview'] = 'name';
|
||||
$config->action->objectNameFields['zanode'] = 'name';
|
||||
|
||||
$config->action->commonImgSize = 870;
|
||||
|
||||
|
||||
+80
-51
@@ -111,6 +111,8 @@ $lang->action->objectTypes['caselib'] = 'Bibliothek';
|
||||
$lang->action->objectTypes['testsuite'] = 'Suite';
|
||||
$lang->action->objectTypes['testtask'] = 'Test Build';
|
||||
$lang->action->objectTypes['testreport'] = 'Berichte';
|
||||
$lang->action->objectTypes['zahost'] = 'Host';
|
||||
$lang->action->objectTypes['zanode'] = 'ZA Node';
|
||||
$lang->action->objectTypes['doc'] = 'Dok';
|
||||
$lang->action->objectTypes['api'] = 'Interface';
|
||||
$lang->action->objectTypes['doclib'] = 'Dok Bibliothek';
|
||||
@@ -226,8 +228,13 @@ $lang->action->desc->reopen = '$date, reopened by <strong>$actor</
|
||||
$lang->action->desc->merged = '$date, merged by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->submitreview = '$date, submitted for review by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, sort by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->suspend = '$date, the ZenAgent Node is suspended by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->relieved = '$date, relieved by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->switchtolight = '$date, Switch from ALM mode to light mode by <strong>'. $lang->admin->system .'</strong>.' . "\n";
|
||||
$lang->action->desc->getvnc = '$date, Remote control <strong>$extra</strong> by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations related to parent-child tasks. */
|
||||
@@ -305,6 +312,8 @@ $lang->action->label->unlinkedfromproject = "Unlink Project";
|
||||
$lang->action->label->unlinkedfrombuild = "Unlink Build";
|
||||
$lang->action->label->linked2release = "Link Release";
|
||||
$lang->action->label->unlinkedfromrelease = "Unlink Release";
|
||||
$lang->action->label->linked2revision = "Link Revision";
|
||||
$lang->action->label->unlinkedfromrevision = "Unlink Revision";
|
||||
$lang->action->label->linkrelatedbug = "Link to Bug";
|
||||
$lang->action->label->unlinkrelatedbug = "Unlink";
|
||||
$lang->action->label->linkrelatedcase = "Link to Case";
|
||||
@@ -397,6 +406,10 @@ $lang->action->label->tolib = 'imported';
|
||||
$lang->action->label->updatetolib = 'updated';
|
||||
$lang->action->label->ganttmove = 'sorted';
|
||||
$lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
$lang->action->label->relieved = 'relieved';
|
||||
$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
|
||||
@@ -475,6 +488,8 @@ $lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Pl
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
|
||||
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
|
||||
$lang->action->dynamicAction->story['linked2revision'] = 'Link Story to Revision';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrevision'] = 'Unlink Story from Revision';
|
||||
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
|
||||
@@ -532,62 +547,66 @@ $lang->action->dynamicAction->kanbancard['deleted'] = 'Delete Card';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Create Task';
|
||||
$lang->action->dynamicAction->task['importfromgitlab'] = "Issue associate create task";
|
||||
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
|
||||
$lang->action->dynamicAction->task['assigned'] = 'Assign Task';
|
||||
$lang->action->dynamicAction->task['confirmed'] = 'Confirm Task';
|
||||
$lang->action->dynamicAction->task['started'] = 'Start Task';
|
||||
$lang->action->dynamicAction->task['finished'] = 'Finish Task';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = 'Add Estimates';
|
||||
$lang->action->dynamicAction->task['editestimate'] = 'Edit Estimates';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = 'Delete Estimates';
|
||||
$lang->action->dynamicAction->task['paused'] = 'Pause Task';
|
||||
$lang->action->dynamicAction->task['closed'] = 'Close Task';
|
||||
$lang->action->dynamicAction->task['canceled'] = 'Cancel Task';
|
||||
$lang->action->dynamicAction->task['activated'] = 'Activate Task';
|
||||
$lang->action->dynamicAction->task['createchildren'] = 'Create Child Task';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Unlink Parent Task';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = 'Delete children task';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = 'Link Parent Task';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = 'Link Child Task';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = 'Create Child Story';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Unlink Parent Story';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Delete children story';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = 'Link Parent Story';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = 'Link Child Story';
|
||||
$lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
$lang->action->dynamicAction->task['opened'] = 'Create Task';
|
||||
$lang->action->dynamicAction->task['importfromgitlab'] = "Issue associate create task";
|
||||
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
|
||||
$lang->action->dynamicAction->task['assigned'] = 'Assign Task';
|
||||
$lang->action->dynamicAction->task['confirmed'] = 'Confirm Task';
|
||||
$lang->action->dynamicAction->task['started'] = 'Start Task';
|
||||
$lang->action->dynamicAction->task['finished'] = 'Finish Task';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = 'Add Estimates';
|
||||
$lang->action->dynamicAction->task['editestimate'] = 'Edit Estimates';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = 'Delete Estimates';
|
||||
$lang->action->dynamicAction->task['paused'] = 'Pause Task';
|
||||
$lang->action->dynamicAction->task['closed'] = 'Close Task';
|
||||
$lang->action->dynamicAction->task['canceled'] = 'Cancel Task';
|
||||
$lang->action->dynamicAction->task['activated'] = 'Activate Task';
|
||||
$lang->action->dynamicAction->task['createchildren'] = 'Create Child Task';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Unlink Parent Task';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = 'Delete children task';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = 'Link Parent Task';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = 'Link Child Task';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = 'Create Child Story';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Unlink Parent Story';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Delete children story';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = 'Link Parent Story';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = 'Link Child Story';
|
||||
$lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
$lang->action->dynamicAction->task['linked2revision'] = 'Link Task to Revision';
|
||||
$lang->action->dynamicAction->task['unlinkedfromrevision'] = 'Unlink Task from Revision';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Create Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
|
||||
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
|
||||
|
||||
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
|
||||
$lang->action->dynamicAction->bug['importfromgitlab'] = "Issue associate create bug";
|
||||
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = 'Activate Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = 'Assign Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = 'Close Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = 'Resolve Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = 'Hide Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = 'Delete Bug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change';
|
||||
$lang->action->dynamicAction->bug['tostory'] = 'Convert to Story';
|
||||
$lang->action->dynamicAction->bug['totask'] = 'Convert to Task';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Link Plan';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Link Release';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Link Build';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Unlink Build';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
|
||||
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
|
||||
$lang->action->dynamicAction->bug['importfromgitlab'] = "Issue associate create bug";
|
||||
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = 'Activate Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = 'Assign Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = 'Close Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = 'Resolve Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = 'Hide Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = 'Delete Bug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change';
|
||||
$lang->action->dynamicAction->bug['tostory'] = 'Convert to Story';
|
||||
$lang->action->dynamicAction->bug['totask'] = 'Convert to Task';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Link Plan';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Link Release';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2revision'] = 'Link Bug to Revision';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrevision'] = 'Unlink Bug from Revision';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Link Build';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Unlink Build';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
|
||||
|
||||
$lang->action->dynamicAction->testtask['opened'] = 'Create Test Request';
|
||||
$lang->action->dynamicAction->testtask['edited'] = 'Edit Test Request';
|
||||
@@ -625,6 +644,14 @@ $lang->action->dynamicAction->caselib['deleted'] = 'Delete Case Lib';
|
||||
$lang->action->dynamicAction->caselib['undeleted'] = 'Restore Case Lib';
|
||||
$lang->action->dynamicAction->caselib['hidden'] = 'Hide Case Lib';
|
||||
|
||||
$lang->action->dynamicAction->zahost['created'] = 'Create Host';
|
||||
|
||||
$lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
|
||||
$lang->action->dynamicAction->doclib['edited'] = 'Edit Doc Library';
|
||||
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
|
||||
@@ -876,6 +903,8 @@ $lang->action->apiTitle->unlinkedfromproject = "Unlinked from project";
|
||||
$lang->action->apiTitle->unlinkedfrombuild = "Unlinked from build";
|
||||
$lang->action->apiTitle->linked2release = "Linked to release";
|
||||
$lang->action->apiTitle->unlinkedfromrelease = "Unlinked from release";
|
||||
$lang->action->apiTitle->linked2revision = "Linked to revision";
|
||||
$lang->action->apiTitle->unlinkedfromrevision = "Unlinked from revision";
|
||||
$lang->action->apiTitle->linkrelatedbug = "Linked related Bug";
|
||||
$lang->action->apiTitle->unlinkrelatedbug = "Unlinked related Bug";
|
||||
$lang->action->apiTitle->linkrelatedstory = "Link related story {$lang->SRCommon}";
|
||||
|
||||
+81
-51
@@ -111,6 +111,8 @@ $lang->action->objectTypes['caselib'] = 'Library';
|
||||
$lang->action->objectTypes['testsuite'] = 'Suite';
|
||||
$lang->action->objectTypes['testtask'] = 'Test Build';
|
||||
$lang->action->objectTypes['testreport'] = 'Report';
|
||||
$lang->action->objectTypes['zahost'] = 'Host';
|
||||
$lang->action->objectTypes['zanode'] = 'ZA Node';
|
||||
$lang->action->objectTypes['doc'] = 'Document';
|
||||
$lang->action->objectTypes['api'] = 'Interface';
|
||||
$lang->action->objectTypes['doclib'] = 'Document Library';
|
||||
@@ -226,8 +228,13 @@ $lang->action->desc->reopen = '$date, reopened by <strong>$actor</
|
||||
$lang->action->desc->merged = '$date, merged by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->submitreview = '$date, submitted for review by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, sort by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->suspend = '$date, the ZenAgent Node is suspended by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->relieved = '$date, relieved by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->switchtolight = '$date, Switch from ALM mode to light mode by <strong>'. $lang->admin->system .'</strong>.' . "\n";
|
||||
$lang->action->desc->getvnc = '$date, Remote control <strong>$extra</strong> by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations related to parent-child tasks. */
|
||||
@@ -305,6 +312,8 @@ $lang->action->label->unlinkedfromproject = "unlinked from project";
|
||||
$lang->action->label->unlinkedfrombuild = "unlinked Build ";
|
||||
$lang->action->label->linked2release = "linked Release ";
|
||||
$lang->action->label->unlinkedfromrelease = "unlinked Release ";
|
||||
$lang->action->label->linked2revision = "Link Revision";
|
||||
$lang->action->label->unlinkedfromrevision = "Unlink Revision";
|
||||
$lang->action->label->linkrelatedbug = "linked Bug ";
|
||||
$lang->action->label->unlinkrelatedbug = "unlinked Bug ";
|
||||
$lang->action->label->linkrelatedcase = "linked Case ";
|
||||
@@ -397,6 +406,10 @@ $lang->action->label->tolib = 'imported';
|
||||
$lang->action->label->updatetolib = 'updated';
|
||||
$lang->action->label->ganttmove = 'sorted';
|
||||
$lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
$lang->action->label->relieved = 'relieved';
|
||||
$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
|
||||
@@ -475,6 +488,9 @@ $lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Pl
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
|
||||
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
|
||||
$lang->action->dynamicAction->story['linked2revision'] = 'Link Story to Revision';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrevision'] = 'Unlink Story from Revision';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
|
||||
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
|
||||
@@ -532,62 +548,66 @@ $lang->action->dynamicAction->kanbancard['deleted'] = 'Delete Card';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Create Task';
|
||||
$lang->action->dynamicAction->task['importfromgitlab'] = "Issue associate create task";
|
||||
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
|
||||
$lang->action->dynamicAction->task['assigned'] = 'Assign Task';
|
||||
$lang->action->dynamicAction->task['confirmed'] = 'Confirm Task';
|
||||
$lang->action->dynamicAction->task['started'] = 'Start Task';
|
||||
$lang->action->dynamicAction->task['finished'] = 'Finish Task';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = 'Add Estimates';
|
||||
$lang->action->dynamicAction->task['editestimate'] = 'Edit Estimates';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = 'Delete Estimates';
|
||||
$lang->action->dynamicAction->task['paused'] = 'Pause Task';
|
||||
$lang->action->dynamicAction->task['closed'] = 'Close Task';
|
||||
$lang->action->dynamicAction->task['canceled'] = 'Cancel Task';
|
||||
$lang->action->dynamicAction->task['activated'] = 'Activate Task';
|
||||
$lang->action->dynamicAction->task['createchildren'] = 'Create Child Task';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Unlink Parent Task';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = 'Delete children task';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = 'Link Parent Task';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = 'Link Child Task';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = 'Create Child Story';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Unlink Parent Story';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Delete children story';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = 'Link Parent Story';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = 'Link Child Story';
|
||||
$lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
$lang->action->dynamicAction->task['opened'] = 'Create Task';
|
||||
$lang->action->dynamicAction->task['importfromgitlab'] = "Issue associate create task";
|
||||
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
|
||||
$lang->action->dynamicAction->task['assigned'] = 'Assign Task';
|
||||
$lang->action->dynamicAction->task['confirmed'] = 'Confirm Task';
|
||||
$lang->action->dynamicAction->task['started'] = 'Start Task';
|
||||
$lang->action->dynamicAction->task['finished'] = 'Finish Task';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = 'Add Estimates';
|
||||
$lang->action->dynamicAction->task['editestimate'] = 'Edit Estimates';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = 'Delete Estimates';
|
||||
$lang->action->dynamicAction->task['paused'] = 'Pause Task';
|
||||
$lang->action->dynamicAction->task['closed'] = 'Close Task';
|
||||
$lang->action->dynamicAction->task['canceled'] = 'Cancel Task';
|
||||
$lang->action->dynamicAction->task['activated'] = 'Activate Task';
|
||||
$lang->action->dynamicAction->task['createchildren'] = 'Create Child Task';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Unlink Parent Task';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = 'Delete children task';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = 'Link Parent Task';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = 'Link Child Task';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = 'Create Child Story';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Unlink Parent Story';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Delete children story';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = 'Link Parent Story';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = 'Link Child Story';
|
||||
$lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
$lang->action->dynamicAction->task['linked2revision'] = 'Link Task to Revision';
|
||||
$lang->action->dynamicAction->task['unlinkedfromrevision'] = 'Unlink Task from Revision';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Create Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
|
||||
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
|
||||
|
||||
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
|
||||
$lang->action->dynamicAction->bug['importfromgitlab'] = "Issue associate create bug";
|
||||
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = 'Activate Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = 'Assign Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = 'Close Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = 'Resolve Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = 'Hide Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = 'Delete Bug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change';
|
||||
$lang->action->dynamicAction->bug['tostory'] = 'Convert to Story';
|
||||
$lang->action->dynamicAction->bug['totask'] = 'Convert to Task';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Link Plan';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Link Release';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Link Build';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Unlink Build';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
|
||||
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
|
||||
$lang->action->dynamicAction->bug['importfromgitlab'] = "Issue associate create bug";
|
||||
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = 'Activate Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = 'Assign Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = 'Close Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = 'Resolve Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = 'Hide Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = 'Delete Bug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change';
|
||||
$lang->action->dynamicAction->bug['tostory'] = 'Convert to Story';
|
||||
$lang->action->dynamicAction->bug['totask'] = 'Convert to Task';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Link Plan';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Link Release';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Unlink Plan';
|
||||
$lang->action->dynamicAction->bug['linked2revision'] = 'Link Bug to Revision';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrevision'] = 'Unlink Bug from Revision';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Link Build';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Unlink Build';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
|
||||
|
||||
$lang->action->dynamicAction->testtask['opened'] = 'Create Test Request';
|
||||
$lang->action->dynamicAction->testtask['edited'] = 'Edit Test Request';
|
||||
@@ -625,6 +645,14 @@ $lang->action->dynamicAction->caselib['deleted'] = 'Delete Case Lib';
|
||||
$lang->action->dynamicAction->caselib['undeleted'] = 'Restore Case Lib';
|
||||
$lang->action->dynamicAction->caselib['hidden'] = 'Hide Case Lib';
|
||||
|
||||
$lang->action->dynamicAction->zahost['created'] = 'Create Host';
|
||||
|
||||
$lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
|
||||
$lang->action->dynamicAction->doclib['edited'] = 'Edit Doc Library';
|
||||
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
|
||||
@@ -876,6 +904,8 @@ $lang->action->apiTitle->unlinkedfromproject = "Unlinked from project";
|
||||
$lang->action->apiTitle->unlinkedfrombuild = "Unlinked from build";
|
||||
$lang->action->apiTitle->linked2release = "Linked to release";
|
||||
$lang->action->apiTitle->unlinkedfromrelease = "Unlinked from release";
|
||||
$lang->action->apiTitle->linked2revision = "Linked to revision";
|
||||
$lang->action->apiTitle->unlinkedfromrevision = "Unlinked from revision";
|
||||
$lang->action->apiTitle->linkrelatedbug = "Linked related Bug";
|
||||
$lang->action->apiTitle->unlinkrelatedbug = "Unlinked related Bug";
|
||||
$lang->action->apiTitle->linkrelatedstory = "Link related story {$lang->SRCommon}";
|
||||
|
||||
@@ -111,6 +111,8 @@ $lang->action->objectTypes['caselib'] = 'Library';
|
||||
$lang->action->objectTypes['testsuite'] = 'Cahier recette';
|
||||
$lang->action->objectTypes['testtask'] = 'Recette';
|
||||
$lang->action->objectTypes['testreport'] = 'Edition';
|
||||
$lang->action->objectTypes['zahost'] = 'Host';
|
||||
$lang->action->objectTypes['zanode'] = 'ZA Node';
|
||||
$lang->action->objectTypes['doc'] = 'Document';
|
||||
$lang->action->objectTypes['api'] = 'Interface';
|
||||
$lang->action->objectTypes['doclib'] = 'Répertoire Documents';
|
||||
@@ -226,8 +228,13 @@ $lang->action->desc->reopen = '$date, reopened by <strong>$actor</
|
||||
$lang->action->desc->merged = '$date, merged by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->submitreview = '$date, submitted for review by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, sort by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->suspend = '$date, the ZenAgent Node is suspended by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->relieved = '$date, relieved by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->switchtolight = '$date, Switch from ALM mode to light mode by <strong>'. $lang->admin->system .'</strong>.' . "\n";
|
||||
$lang->action->desc->getvnc = '$date, Remote control <strong>$extra</strong> by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the ' . $lang->executionCommon . 's of the project from the $extra.' . "\n";
|
||||
|
||||
/* Used to describe the history of operations related to parent-child tasks. */
|
||||
@@ -305,6 +312,8 @@ $lang->action->label->unlinkedfromproject = "Unlink Project";
|
||||
$lang->action->label->unlinkedfrombuild = "a enlevé du Build ";
|
||||
$lang->action->label->linked2release = "a ajouté à une Release ";
|
||||
$lang->action->label->unlinkedfromrelease = "a enlevé de la Release ";
|
||||
$lang->action->label->linked2revision = "Link Revision";
|
||||
$lang->action->label->unlinked2revision = "Unlink Revision";
|
||||
$lang->action->label->linkrelatedbug = "a lié à un Bug ";
|
||||
$lang->action->label->unlinkrelatedbug = "a délié du Bug ";
|
||||
$lang->action->label->linkrelatedcase = "a mis en relation avec un CasTest ";
|
||||
@@ -397,6 +406,10 @@ $lang->action->label->tolib = 'Importé';
|
||||
$lang->action->label->updatetolib = 'MàJ';
|
||||
$lang->action->label->ganttmove = 'sorted';
|
||||
$lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
$lang->action->label->relieved = 'relieved';
|
||||
$lang->action->label->switchtolight = 'switch from ALM mode to light mode';
|
||||
@@ -475,6 +488,8 @@ $lang->action->dynamicAction->story['linked2plan'] = 'Inclure Story au
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Enlever Story du Plan';
|
||||
$lang->action->dynamicAction->story['linked2release'] = 'Inclure Story à la Release';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Enlever Story de la Release';
|
||||
$lang->action->dynamicAction->story['linked2revision'] = 'Inclure Story à la Revision';
|
||||
$lang->action->dynamicAction->story['unlinked2revision'] = 'Unlink Stroy to Revision';
|
||||
$lang->action->dynamicAction->story['linked2build'] = 'Ajouter Story au Build';
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Détacher Story du Build';
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Détacher du Project';
|
||||
@@ -562,6 +577,8 @@ $lang->action->dynamicAction->task['hidden'] = 'Masquer Tâche';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'Committer SVN';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'Committer GIT';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = 'Order';
|
||||
$lang->action->dynamicAction->task['linked2revision'] = 'Link Task to Revision';
|
||||
$lang->action->dynamicAction->task['unlinked2revision'] = 'Unlink Task to Revision';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Créer Build';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Editer Build';
|
||||
@@ -585,6 +602,8 @@ $lang->action->dynamicAction->bug['linked2plan'] = 'Lié au Plan';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Enlevé du Plan';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Ajouté à la Release';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Enlevé de la Release';
|
||||
$lang->action->dynamicAction->bug['linked2revision'] = 'Ajouté à la Revision';
|
||||
$lang->action->dynamicAction->bug['unlinked2revision'] = 'Unlink Bug to Revision';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Lié au Build';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Retiré du Build';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = 'Create Bug from SonarQube Issue';
|
||||
@@ -625,6 +644,14 @@ $lang->action->dynamicAction->caselib['deleted'] = 'Supprimé CasTest Lib';
|
||||
$lang->action->dynamicAction->caselib['undeleted'] = 'Restauré CasTest Lib';
|
||||
$lang->action->dynamicAction->caselib['hidden'] = 'Masqué CasTest Lib';
|
||||
|
||||
$lang->action->dynamicAction->zahost['created'] = 'Create Host';
|
||||
|
||||
$lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Créer Doc Library';
|
||||
$lang->action->dynamicAction->doclib['edited'] = 'Editer Doc Library';
|
||||
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
|
||||
@@ -876,6 +903,8 @@ $lang->action->apiTitle->unlinkedfromproject = "Unlinked from project";
|
||||
$lang->action->apiTitle->unlinkedfrombuild = "Unlinked from build";
|
||||
$lang->action->apiTitle->linked2release = "Linked to release";
|
||||
$lang->action->apiTitle->unlinkedfromrelease = "Unlinked from release";
|
||||
$lang->action->apiTitle->linked2revision = "Linked to revision";
|
||||
$lang->action->apiTitle->unlinked2revision = "Unlinked to revision";
|
||||
$lang->action->apiTitle->linkrelatedbug = "Linked related Bug";
|
||||
$lang->action->apiTitle->unlinkrelatedbug = "Unlinked related Bug";
|
||||
$lang->action->apiTitle->linkrelatedstory = "Link related story {$lang->SRCommon}";
|
||||
|
||||
+74
-47
@@ -88,6 +88,8 @@ $lang->action->objectTypes['caselib'] = 'Thư viện';
|
||||
$lang->action->objectTypes['testsuite'] = 'Suite';
|
||||
$lang->action->objectTypes['testtask'] = 'Test bản dựng';
|
||||
$lang->action->objectTypes['testreport'] = 'Báo cáo';
|
||||
$lang->action->objectTypes['zahost'] = 'Host';
|
||||
$lang->action->objectTypes['zanode'] = 'ZA Node';
|
||||
$lang->action->objectTypes['doc'] = 'Tài liệu';
|
||||
$lang->action->objectTypes['doclib'] = 'Thư viện tài liệu';
|
||||
$lang->action->objectTypes['todo'] = 'Việc làm';
|
||||
@@ -185,6 +187,10 @@ $lang->action->desc->syncexecution = '$date, starting the task sets the execut
|
||||
$lang->action->desc->reopen = '$date, reopened by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->merged = '$date, merged by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->submitreview = '$date, submitted for review by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->suspend = '$date, the ZenAgent Node is suspended by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->resume = '$date, the ZenAgent Node is resumed by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->reboot = '$date, the ZenAgent Node is reboot by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->destroy = '$date, the ZenAgent Node is destroyed by <strong>$actor</strong> .' . "\n";
|
||||
|
||||
/* Used to describe the history of operations related to parent-child tasks. */
|
||||
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
|
||||
@@ -251,6 +257,8 @@ $lang->action->label->unlinkedfromproject = "Unlink Project";
|
||||
$lang->action->label->unlinkedfrombuild = "hủy liên kết Bản dựng ";
|
||||
$lang->action->label->linked2release = "liên kết Phát hành ";
|
||||
$lang->action->label->unlinkedfromrelease = "hủy liên kết Release ";
|
||||
$lang->action->label->linked2revision = "Link Revision";
|
||||
$lang->action->label->unlinkedfromrevision = "Unlink Revision";
|
||||
$lang->action->label->linkrelatedbug = "linked Bug ";
|
||||
$lang->action->label->unlinkrelatedbug = "hủy liên kết Bug ";
|
||||
$lang->action->label->linkrelatedcase = "linked Case ";
|
||||
@@ -307,6 +315,10 @@ $lang->action->label->syncproject = 'start';
|
||||
$lang->action->label->syncexecution = 'start';
|
||||
$lang->action->label->startProgram = '(The start of the project sets the status of the program as Ongoing)';
|
||||
$lang->action->label->submitreview = 'submitted';
|
||||
$lang->action->label->suspend = 'suspended';
|
||||
$lang->action->label->resume = 'resumed';
|
||||
$lang->action->label->reboot = 'reboot';
|
||||
$lang->action->label->destroy = 'destroyed';
|
||||
$lang->action->label->synctwins = 'synchronized changes';
|
||||
$lang->action->label->linkedrepo = 'Linked Code Repo';
|
||||
$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
|
||||
@@ -365,6 +377,8 @@ $lang->action->dynamicAction->story['linked2plan'] = 'Liên kết Stor
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Hủy liên kết Story from kế hoạch';
|
||||
$lang->action->dynamicAction->story['linked2release'] = 'Liên kết Story to phát hành';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Hủy liên kết Story from kế hoạch';
|
||||
$lang->action->dynamicAction->story['linked2revision'] = 'Link Stroy to Revision';
|
||||
$lang->action->dynamicAction->story['unlinkedfromrevision'] = 'Unlink Stroy from Revision';
|
||||
$lang->action->dynamicAction->story['linked2build'] = 'Liên kết Story to bản dựng';
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Hủy liên kết Story from bản dựng';
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Hủy liên kết Project';
|
||||
@@ -389,58 +403,63 @@ $lang->action->dynamicAction->execution['moved'] = 'Nhập nhiệm vụ';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = 'Tạo nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['edited'] = 'Sửa nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task nhận xét';
|
||||
$lang->action->dynamicAction->task['assigned'] = 'Bàn giao nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['confirmed'] = 'Xác nhận nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['started'] = 'Bắt đầu nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['finished'] = 'Nhiệm vụ hoàn thành';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = 'Thêm dự tính';
|
||||
$lang->action->dynamicAction->task['editestimate'] = 'Sửa dự tính';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = 'Xóa dự tính';
|
||||
$lang->action->dynamicAction->task['paused'] = 'Pause nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['closed'] = 'Đóng nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['canceled'] = 'Hủy nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['activated'] = 'Kích hoạt nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['createchildren'] = 'Tạo Nhiệm vụ con';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Hủy liên kết Nhiệm vụ mẹ';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = 'Xóa children nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = 'Liên kết Nhiệm vụ mẹ';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = 'Liên kết Nhiệm vụ con';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = 'Tạo Câu chuyện con';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Hủy liên kết Parent câu chuyện';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Xóa children story';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = 'Liên kết Parent câu chuyện';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = 'Liên kết Câu chuyện con';
|
||||
$lang->action->dynamicAction->task['undeleted'] = 'Khôi phục nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Ẩn nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['opened'] = 'Tạo nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['edited'] = 'Sửa nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['commented'] = 'Task nhận xét';
|
||||
$lang->action->dynamicAction->task['assigned'] = 'Bàn giao nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['confirmed'] = 'Xác nhận nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['started'] = 'Bắt đầu nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['finished'] = 'Nhiệm vụ hoàn thành';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = 'Thêm dự tính';
|
||||
$lang->action->dynamicAction->task['editestimate'] = 'Sửa dự tính';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = 'Xóa dự tính';
|
||||
$lang->action->dynamicAction->task['paused'] = 'Pause nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['closed'] = 'Đóng nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['canceled'] = 'Hủy nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['activated'] = 'Kích hoạt nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['createchildren'] = 'Tạo Nhiệm vụ con';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Hủy liên kết Nhiệm vụ mẹ';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = 'Xóa children nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = 'Liên kết Nhiệm vụ mẹ';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = 'Liên kết Nhiệm vụ con';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = 'Tạo Câu chuyện con';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = 'Hủy liên kết Parent câu chuyện';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = 'Xóa children story';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = 'Liên kết Parent câu chuyện';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = 'Liên kết Câu chuyện con';
|
||||
$lang->action->dynamicAction->task['undeleted'] = 'Khôi phục nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['hidden'] = 'Ẩn nhiệm vụ';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
|
||||
$lang->action->dynamicAction->task['linked2revision'] = 'Link Task to Revision';
|
||||
$lang->action->dynamicAction->task['unlinkedfromrevision'] = 'Unlink Task from Revision';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = 'Tạo bản dựng';
|
||||
$lang->action->dynamicAction->build['edited'] = 'Sửa bản dựng';
|
||||
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
|
||||
|
||||
$lang->action->dynamicAction->bug['opened'] = 'Báo cáo Bug';
|
||||
$lang->action->dynamicAction->bug['edited'] = 'Sửa Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = 'Kích hoạt Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = 'Bàn giao Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = 'Đóng Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Xác nhận Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = 'Giải quyết Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = 'Khôi phục Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = 'Ẩn Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = 'Xóa tìBug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = 'Xác nhận thay đổi câu chuyện';
|
||||
$lang->action->dynamicAction->bug['tostory'] = 'Chuyển thành câu chuyện';
|
||||
$lang->action->dynamicAction->bug['totask'] = 'Chuyển thành nhiệm vụ';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Liên kết kế hoạch';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Hủy liên kết kế hoạch';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Liên kết phát hành';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Hủy liên kết kế hoạch';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Liên kết bản dựng';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Hủy liên kết bản dựng';
|
||||
$lang->action->dynamicAction->bug['opened'] = 'Báo cáo Bug';
|
||||
$lang->action->dynamicAction->bug['edited'] = 'Sửa Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = 'Kích hoạt Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = 'Bàn giao Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = 'Đóng Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Xác nhận Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = 'Giải quyết Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = 'Khôi phục Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = 'Ẩn Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = 'Xóa tìBug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = 'Xác nhận thay đổi câu chuyện';
|
||||
$lang->action->dynamicAction->bug['tostory'] = 'Chuyển thành câu chuyện';
|
||||
$lang->action->dynamicAction->bug['totask'] = 'Chuyển thành nhiệm vụ';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Liên kết kế hoạch';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Hủy liên kết kế hoạch';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Liên kết phát hành';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Hủy liên kết kế hoạch';
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Link Revision';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Liên kết bản dựng';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Hủy liên kết bản dựng';
|
||||
$lang->action->dynamicAction->bug['linked2revision'] = 'Link Bug to Revision';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrevision'] = 'Unlink Bug from Revision';
|
||||
|
||||
$lang->action->dynamicAction->testtask['opened'] = 'Tạo Yêu cầu Test';
|
||||
$lang->action->dynamicAction->testtask['edited'] = 'Sửa Yêu cầu Test';
|
||||
@@ -476,6 +495,14 @@ $lang->action->dynamicAction->caselib['deleted'] = 'Xóa Case Lib';
|
||||
$lang->action->dynamicAction->caselib['undeleted'] = 'Khôi phục Case Lib';
|
||||
$lang->action->dynamicAction->caselib['hidden'] = 'Ẩn Case Lib';
|
||||
|
||||
$lang->action->dynamicAction->zahost['created'] = 'Create Host';
|
||||
|
||||
$lang->action->dynamicAction->zanode['created'] = 'Create Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['suspend'] = 'Suspend Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['resume'] = 'Resume Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['reboot'] = 'Reboot Zagent Node';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = 'Destory Zagent Node';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = 'Tạo Doc thư viện';
|
||||
$lang->action->dynamicAction->doclib['edited'] = 'Sửa Doc thư viện';
|
||||
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
|
||||
|
||||
@@ -111,6 +111,8 @@ $lang->action->objectTypes['caselib'] = '用例库';
|
||||
$lang->action->objectTypes['testsuite'] = '套件';
|
||||
$lang->action->objectTypes['testtask'] = '测试单';
|
||||
$lang->action->objectTypes['testreport'] = '报告';
|
||||
$lang->action->objectTypes['zahost'] = '宿主机';
|
||||
$lang->action->objectTypes['zanode'] = '执行节点';
|
||||
$lang->action->objectTypes['doc'] = '文档';
|
||||
$lang->action->objectTypes['api'] = '接口';
|
||||
$lang->action->objectTypes['doclib'] = '文档库';
|
||||
@@ -226,8 +228,14 @@ $lang->action->desc->reopen = '$date, 由 <strong>$actor</strong>
|
||||
$lang->action->desc->merged = '$date, 由 <strong>$actor</strong> 合并。' . "\n";
|
||||
$lang->action->desc->submitreview = '$date, 由 <strong>$actor</strong> 提交评审。' . "\n";
|
||||
$lang->action->desc->ganttmove = '$date, 由 <strong>$actor</strong> 排序。' . "\n";
|
||||
$lang->action->desc->suspend = '$date, 由 <strong>$actor</strong> 休眠。' . "\n";
|
||||
$lang->action->desc->resume = '$date, 由 <strong>$actor</strong> 恢复。' . "\n";
|
||||
$lang->action->desc->reboot = '$date, 由 <strong>$actor</strong> 重启。' . "\n";
|
||||
$lang->action->desc->destroy = '$date, 由 <strong>$actor</strong> 关闭。' . "\n";
|
||||
$lang->action->desc->boot = '$date, 由 <strong>$actor</strong> 启动。' . "\n";
|
||||
$lang->action->desc->relieved = '$date, 由 <strong>$actor</strong> 解除孪生需求关系。' . "\n";
|
||||
$lang->action->desc->switchtolight = '$date, 由于 <strong>'. $lang->admin->system .'</strong> 从全生命周期管理模式切换为轻量管理模式,项目访问控制由项目集内公开调整为私有。' . "\n";
|
||||
$lang->action->desc->getvnc = '$date, <strong>$actor</strong>对执行节点 <strong>$extra</strong> 进行了远程操控。' . "\n";
|
||||
$lang->action->desc->unlinkproduct = '$date, 系统判断由于' . $lang->executionCommon . '所属项目与$extra取消关联,同步将' . $lang->executionCommon . '与$extra取消关联。' . "\n";
|
||||
|
||||
/* 用来描述和父子任务相关的操作历史记录。*/
|
||||
@@ -305,6 +313,8 @@ $lang->action->label->unlinkedfromproject = "移除了项目";
|
||||
$lang->action->label->unlinkedfrombuild = "移除了版本";
|
||||
$lang->action->label->linked2release = "关联了发布";
|
||||
$lang->action->label->unlinkedfromrelease = "移除了发布";
|
||||
$lang->action->label->linked2revision = "关联了代码提交";
|
||||
$lang->action->label->unlinkedfromrevision = "取消关联了代码提交";
|
||||
$lang->action->label->linkrelatedbug = "关联了相关Bug";
|
||||
$lang->action->label->unlinkrelatedbug = "移除了相关Bug";
|
||||
$lang->action->label->linkrelatedcase = "关联了相关用例";
|
||||
@@ -397,6 +407,11 @@ $lang->action->label->tolib = '导入了';
|
||||
$lang->action->label->updatetolib = '更新了';
|
||||
$lang->action->label->ganttmove = '排序了';
|
||||
$lang->action->label->submitreview = '提交了评审';
|
||||
$lang->action->label->suspend = '休眠了';
|
||||
$lang->action->label->resume = '恢复了';
|
||||
$lang->action->label->reboot = '重启了';
|
||||
$lang->action->label->destroy = '关闭了';
|
||||
$lang->action->label->getvnc = '远程操控';
|
||||
$lang->action->label->synctwins = '同步修改了';
|
||||
$lang->action->label->relieved = '解除了';
|
||||
$lang->action->label->switchtolight = '从全生命周期管理模式切换为轻量管理模式';
|
||||
@@ -475,6 +490,8 @@ $lang->action->dynamicAction->story['linked2plan'] = "{$lang->SRCommon
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = "计划移除{$lang->SRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2release'] = "{$lang->SRCommon}关联发布";
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "发布移除{$lang->SRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2revision'] = "{$lang->SRCommon}关联代码提交";
|
||||
$lang->action->dynamicAction->story['unlinkedfromrevision'] = "{$lang->SRCommon}取消关联代码提交";
|
||||
$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}关联版本";
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->SRCommon}";
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除项目';
|
||||
@@ -532,62 +549,66 @@ $lang->action->dynamicAction->kanbancard['deleted'] = '删除看板卡片';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = '维护团队';
|
||||
|
||||
$lang->action->dynamicAction->task['opened'] = '创建任务';
|
||||
$lang->action->dynamicAction->task['importfromgitlab'] = "从Gitlab关联创建任务";
|
||||
$lang->action->dynamicAction->task['edited'] = '编辑任务';
|
||||
$lang->action->dynamicAction->task['commented'] = '备注任务';
|
||||
$lang->action->dynamicAction->task['assigned'] = '指派任务';
|
||||
$lang->action->dynamicAction->task['confirmed'] = "确认{$lang->SRCommon}变更";
|
||||
$lang->action->dynamicAction->task['started'] = '开始任务';
|
||||
$lang->action->dynamicAction->task['finished'] = '完成任务';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = '记录工时';
|
||||
$lang->action->dynamicAction->task['editestimate'] = '编辑工时';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = '删除工时';
|
||||
$lang->action->dynamicAction->task['paused'] = '暂停任务';
|
||||
$lang->action->dynamicAction->task['closed'] = '关闭任务';
|
||||
$lang->action->dynamicAction->task['canceled'] = '取消任务';
|
||||
$lang->action->dynamicAction->task['activated'] = '激活任务';
|
||||
$lang->action->dynamicAction->task['createchildren'] = '创建子任务';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = '从父任务取消关联';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = '删除子任务';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = '关联到父任务';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = '关联子任务';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = '创建子需求';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = '从父需求取消关联';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = '删除子需求';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = '关联到父需求';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = '关联子需求';
|
||||
$lang->action->dynamicAction->task['undeleted'] = '还原任务';
|
||||
$lang->action->dynamicAction->task['hidden'] = '隐藏任务';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = '排序';
|
||||
$lang->action->dynamicAction->task['opened'] = '创建任务';
|
||||
$lang->action->dynamicAction->task['importfromgitlab'] = "从Gitlab关联创建任务";
|
||||
$lang->action->dynamicAction->task['edited'] = '编辑任务';
|
||||
$lang->action->dynamicAction->task['commented'] = '备注任务';
|
||||
$lang->action->dynamicAction->task['assigned'] = '指派任务';
|
||||
$lang->action->dynamicAction->task['confirmed'] = "确认{$lang->SRCommon}变更";
|
||||
$lang->action->dynamicAction->task['started'] = '开始任务';
|
||||
$lang->action->dynamicAction->task['finished'] = '完成任务';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = '记录工时';
|
||||
$lang->action->dynamicAction->task['editestimate'] = '编辑工时';
|
||||
$lang->action->dynamicAction->task['deleteestimate'] = '删除工时';
|
||||
$lang->action->dynamicAction->task['paused'] = '暂停任务';
|
||||
$lang->action->dynamicAction->task['closed'] = '关闭任务';
|
||||
$lang->action->dynamicAction->task['canceled'] = '取消任务';
|
||||
$lang->action->dynamicAction->task['activated'] = '激活任务';
|
||||
$lang->action->dynamicAction->task['createchildren'] = '创建子任务';
|
||||
$lang->action->dynamicAction->task['unlinkparenttask'] = '从父任务取消关联';
|
||||
$lang->action->dynamicAction->task['deletechildrentask'] = '删除子任务';
|
||||
$lang->action->dynamicAction->task['linkparenttask'] = '关联到父任务';
|
||||
$lang->action->dynamicAction->task['linkchildtask'] = '关联子任务';
|
||||
$lang->action->dynamicAction->task['createchildrenstory'] = '创建子需求';
|
||||
$lang->action->dynamicAction->task['unlinkparentstory'] = '从父需求取消关联';
|
||||
$lang->action->dynamicAction->task['deletechildrenstory'] = '删除子需求';
|
||||
$lang->action->dynamicAction->task['linkparentstory'] = '关联到父需求';
|
||||
$lang->action->dynamicAction->task['linkchildstory'] = '关联子需求';
|
||||
$lang->action->dynamicAction->task['undeleted'] = '还原任务';
|
||||
$lang->action->dynamicAction->task['hidden'] = '隐藏任务';
|
||||
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
|
||||
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
|
||||
$lang->action->dynamicAction->task['ganttmove'] = '排序';
|
||||
$lang->action->dynamicAction->task['linked2revision'] = '任务关联代码提交';
|
||||
$lang->action->dynamicAction->task['unlinkedfromrevision'] = '任务取消关联代码提交';
|
||||
|
||||
$lang->action->dynamicAction->build['opened'] = '创建版本';
|
||||
$lang->action->dynamicAction->build['edited'] = '编辑版本';
|
||||
$lang->action->dynamicAction->build['deleted'] = '删除版本';
|
||||
|
||||
$lang->action->dynamicAction->bug['opened'] = '创建Bug';
|
||||
$lang->action->dynamicAction->bug['importfromgitlab'] = "从Gitlab关联创建Bug";
|
||||
$lang->action->dynamicAction->bug['edited'] = '编辑Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = '激活Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = '指派Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = '关闭Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = '确认Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = '解决Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = '还原Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = '隐藏Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = '删除Bug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = "确认{$lang->SRCommon}变更";
|
||||
$lang->action->dynamicAction->bug['tostory'] = "转{$lang->SRCommon}";
|
||||
$lang->action->dynamicAction->bug['totask'] = '转任务';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = "Bug关联计划";
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = "计划移除Bug";
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Bug关联发布';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = '发布移除Bug';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Bug关联版本';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = '由SonarQube问题创建';
|
||||
$lang->action->dynamicAction->bug['opened'] = '创建Bug';
|
||||
$lang->action->dynamicAction->bug['importfromgitlab'] = "从Gitlab关联创建Bug";
|
||||
$lang->action->dynamicAction->bug['edited'] = '编辑Bug';
|
||||
$lang->action->dynamicAction->bug['activated'] = '激活Bug';
|
||||
$lang->action->dynamicAction->bug['assigned'] = '指派Bug';
|
||||
$lang->action->dynamicAction->bug['closed'] = '关闭Bug';
|
||||
$lang->action->dynamicAction->bug['bugconfirmed'] = '确认Bug';
|
||||
$lang->action->dynamicAction->bug['resolved'] = '解决Bug';
|
||||
$lang->action->dynamicAction->bug['undeleted'] = '还原Bug';
|
||||
$lang->action->dynamicAction->bug['hidden'] = '隐藏Bug';
|
||||
$lang->action->dynamicAction->bug['deleted'] = '删除Bug';
|
||||
$lang->action->dynamicAction->bug['confirmed'] = "确认{$lang->SRCommon}变更";
|
||||
$lang->action->dynamicAction->bug['tostory'] = "转{$lang->SRCommon}";
|
||||
$lang->action->dynamicAction->bug['totask'] = '转任务';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = "Bug关联计划";
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = "计划移除Bug";
|
||||
$lang->action->dynamicAction->bug['linked2release'] = 'Bug关联发布';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = '发布移除Bug';
|
||||
$lang->action->dynamicAction->bug['linked2revision'] = 'Bug关联代码提交';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromrevision'] = 'Bug取消关联代码提交';
|
||||
$lang->action->dynamicAction->bug['linked2bug'] = 'Bug关联版本';
|
||||
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug';
|
||||
$lang->action->dynamicAction->bug['fromsonarqube'] = '由SonarQube问题创建';
|
||||
|
||||
$lang->action->dynamicAction->testtask['opened'] = '创建测试单';
|
||||
$lang->action->dynamicAction->testtask['edited'] = '编辑测试单';
|
||||
@@ -625,6 +646,15 @@ $lang->action->dynamicAction->caselib['deleted'] = '删除用例库';
|
||||
$lang->action->dynamicAction->caselib['undeleted'] = '还原用例库';
|
||||
$lang->action->dynamicAction->caselib['hidden'] = '隐藏用例库';
|
||||
|
||||
$lang->action->dynamicAction->zahost['created'] = '创建宿主机';
|
||||
|
||||
$lang->action->dynamicAction->zanode['created'] = '创建执行节点';
|
||||
$lang->action->dynamicAction->zanode['suspend'] = '休眠执行节点';
|
||||
$lang->action->dynamicAction->zanode['resume'] = '恢复执行节点';
|
||||
$lang->action->dynamicAction->zanode['reboot'] = '重启执行节点';
|
||||
$lang->action->dynamicAction->zanode['boot'] = '启动执行节点';
|
||||
$lang->action->dynamicAction->zanode['destroy'] = '关闭执行节点';
|
||||
|
||||
$lang->action->dynamicAction->doclib['created'] = '创建文档库';
|
||||
$lang->action->dynamicAction->doclib['edited'] = '编辑文档库';
|
||||
$lang->action->dynamicAction->doclib['deleted'] = '删除文档库';
|
||||
@@ -876,6 +906,8 @@ $lang->action->apiTitle->unlinkedfromproject = "移除项目";
|
||||
$lang->action->apiTitle->unlinkedfrombuild = "移除版本";
|
||||
$lang->action->apiTitle->linked2release = "关联发布";
|
||||
$lang->action->apiTitle->unlinkedfromrelease = "移除发布";
|
||||
$lang->action->apiTitle->linked2revision = "关联代码提交";
|
||||
$lang->action->apiTitle->unlinkedfromrevision = "取消关联代码提交";
|
||||
$lang->action->apiTitle->linkrelatedbug = "关联了相关Bug";
|
||||
$lang->action->apiTitle->unlinkrelatedbug = "移除了相关Bug";
|
||||
$lang->action->apiTitle->linkrelatedstory = "关联了相关{$lang->SRCommon}";
|
||||
|
||||
+18
-6
@@ -253,6 +253,8 @@ class actionModel extends model
|
||||
case 'task':
|
||||
$fields = 'project, execution, story';
|
||||
$result = $this->dao->select($fields)->from($this->config->objectTables[$objectType])->where('id')->eq($objectID)->fetch();
|
||||
if(empty($result)) break;
|
||||
|
||||
if($result->story != 0)
|
||||
{
|
||||
$product = $this->dao->select('product')->from(TABLE_STORY)->where('id')->eq($result->story)->fetchPairs('product');
|
||||
@@ -332,29 +334,30 @@ class actionModel extends model
|
||||
*/
|
||||
public function getList($objectType, $objectID)
|
||||
{
|
||||
$modules = $objectType == 'module' ? $this->dao->select('id')->from(TABLE_MODULE)->where('root')->eq($objectID)->fetchPairs('id') : array();
|
||||
$objectID = is_array($objectID) ? $objectID : (int)$objectID;
|
||||
$modules = $objectType == 'module' ? $this->dao->select('id')->from(TABLE_MODULE)->where('root')->in($objectID)->fetchPairs('id') : array();
|
||||
$commiters = $this->loadModel('user')->getCommiters();
|
||||
$actions = $this->dao->select('*')->from(TABLE_ACTION)
|
||||
->beginIF($objectType == 'project')
|
||||
->where("objectType IN('project', 'testtask', 'build')")
|
||||
->andWhere('project')->eq((int)$objectID)
|
||||
->andWhere('project')->in($objectID)
|
||||
->fi()
|
||||
->beginIF($objectType == 'story')
|
||||
->where('objectType')->in('story,requirement')
|
||||
->andWhere('objectID')->eq((int)$objectID)
|
||||
->andWhere('objectID')->in($objectID)
|
||||
->fi()
|
||||
->beginIF($objectType == 'case')
|
||||
->where('objectType')->in('case,testcase')
|
||||
->andWhere('objectID')->eq((int)$objectID)
|
||||
->andWhere('objectID')->in($objectID)
|
||||
->fi()
|
||||
->beginIF($objectType == 'module')
|
||||
->where('objectType')->eq($objectType)
|
||||
->andWhere('((action')->ne('deleted')->andWhere('objectID')->eq((int)$objectID)->markRight(1)
|
||||
->andWhere('((action')->ne('deleted')->andWhere('objectID')->in($objectID)->markRight(1)
|
||||
->orWhere('(action')->eq('deleted')->andWhere('objectID')->in($modules)->markRight(1)->markRight(1)
|
||||
->fi()
|
||||
->beginIF(strpos('project,case,story,module', $objectType) === false)
|
||||
->where('objectType')->eq($objectType)
|
||||
->andWhere('objectID')->eq((int)$objectID)
|
||||
->andWhere('objectID')->in($objectID)
|
||||
->fi()
|
||||
->orderBy('date, id')
|
||||
->fetchAll('id');
|
||||
@@ -429,6 +432,15 @@ class actionModel extends model
|
||||
$name = $this->dao->select('name')->from(TABLE_TESTTASK)->where('id')->eq($action->extra)->fetch('name');
|
||||
if($name) $action->extra = common::hasPriv('testtask', 'view') ? html::a(helper::createLink('testtask', 'view', "taskID=$action->extra"), $name) : $name;
|
||||
}
|
||||
elseif($actionName == 'linked2revision' or $actionName == 'unlinkedfromrevision')
|
||||
{
|
||||
$commit = $this->dao->select('repo,revision')->from(TABLE_REPOHISTORY)->where('id')->eq($action->extra)->fetch();
|
||||
if($commit)
|
||||
{
|
||||
$revision = substr($commit->revision, 0, 10);
|
||||
$action->extra = common::hasPriv('repo', 'revision') ? html::a(helper::createLink('repo', 'revision', "repoID=$commit->repo&objectID=0&revision=$commit->revision"), $revision) : $revision;
|
||||
}
|
||||
}
|
||||
elseif($actionName == 'moved' and $action->objectType != 'module')
|
||||
{
|
||||
$name = $this->dao->select('name')->from(TABLE_PROJECT)->where('id')->eq($action->extra)->fetch('name');
|
||||
|
||||
@@ -938,6 +938,7 @@ class bug extends control
|
||||
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, 'all');
|
||||
$this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('bug', $bugID);
|
||||
$this->view->product = $product;
|
||||
$this->view->linkCommits = $this->loadModel('repo')->getCommitsByObject($bugID, 'bug');
|
||||
|
||||
$this->view->projects = array('' => '') + $projects;
|
||||
|
||||
|
||||
@@ -8,4 +8,5 @@
|
||||
.osContent, .browserContent {margin: 0 0 5px;}
|
||||
.browserContent {margin-left: -4px;}
|
||||
.resolution {white-space: nowrap; overflow: hidden;}
|
||||
.main-actions .btn-toolbar{display: inline-flex; flex-wrap: wrap;}
|
||||
.link-commit {overflow: hidden; white-space: nowrap; margin-right: 5px;}
|
||||
.main-actions .btn-toolbar{display: inline-flex; flex-wrap: wrap;}
|
||||
|
||||
+15
-12
@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed';
|
||||
$lang->bug->changed = 'Changed';
|
||||
$lang->bug->storyChanged = 'Story Changed';
|
||||
$lang->bug->linkMR = 'Related MRs';
|
||||
$lang->bug->linkCommit = 'Related Commits';
|
||||
$lang->bug->duplicateTip = 'Please enter keyword search';
|
||||
|
||||
/* Page tags. */
|
||||
@@ -396,18 +397,20 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Bearbeitungsschri
|
||||
|
||||
/* Operating record. */
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, gelöst von <strong>$actor</strong> und die Lösung ist <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, konvertiert von <strong>$actor</strong> zu <strong>Story</strong> mit ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, importiert von <strong>$actor</strong> als <strong>Aufgabe</strong> mit ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong>,with ID <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, verknüpft von <strong>$actor</strong> mit Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> von Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, verknüpft von <strong>$actor</strong> zum Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> von Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, verknüpft von <strong>$actor</strong> zu Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> vom Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, verknüpft von <strong>$actor</strong> mit Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> zum Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->resolved = array('main' => '$date, gelöst von <strong>$actor</strong> und die Lösung ist <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, konvertiert von <strong>$actor</strong> zu <strong>Story</strong> mit ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, importiert von <strong>$actor</strong> als <strong>Aufgabe</strong> mit ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong>,with ID <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, verknüpft von <strong>$actor</strong> mit Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> von Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, verknüpft von <strong>$actor</strong> zum Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> von Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, verknüpft von <strong>$actor</strong> zu Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> vom Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, verknüpft von <strong>$actor</strong> mit Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, verknüpfung aufgehoben von <strong>$actor</strong> zum Bug <strong>$extra</strong>.');
|
||||
|
||||
$lang->bug->placeholder = new stdclass();
|
||||
$lang->bug->placeholder->chooseBuilds = 'Build wählen...';
|
||||
|
||||
+15
-12
@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed';
|
||||
$lang->bug->changed = 'Changed';
|
||||
$lang->bug->storyChanged = 'Story Changed';
|
||||
$lang->bug->linkMR = 'Related MRs';
|
||||
$lang->bug->linkCommit = 'Related Commits';
|
||||
$lang->bug->duplicateTip = 'Please enter keyword search';
|
||||
|
||||
/* Page tags. */
|
||||
@@ -396,18 +397,20 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Handling Steps';
|
||||
|
||||
/* Operating record. */
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, resolved by <strong>$actor</strong> and the resolution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, converted by <strong>$actor</strong> to <strong>Story</strong> with ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong> with ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong>,with ID <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, linked by <strong>$actor</strong> to Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, deleted by <strong>$actor</strong> from Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, linked by <strong>$actor</strong> to Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, unlinked by <strong>$actor</strong> from Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, linked by <strong>$actor</strong> to Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, unlinked by <strong>$actor</strong> from Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, linked by <strong>$actor</strong> to Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, unlinked by <strong>$actor</strong> from Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->resolved = array('main' => '$date, resolved by <strong>$actor</strong> and the resolution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, converted by <strong>$actor</strong> to <strong>Story</strong> with ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong> with ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong>,with ID <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, linked by <strong>$actor</strong> to Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, deleted by <strong>$actor</strong> from Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, linked by <strong>$actor</strong> to Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, unlinked by <strong>$actor</strong> from Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, linked by <strong>$actor</strong> to Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, unlinked by <strong>$actor</strong> from Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, linked by <strong>$actor</strong> to Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, unlinked by <strong>$actor</strong> from Bug <strong>$extra</strong>.');
|
||||
|
||||
$lang->bug->placeholder = new stdclass();
|
||||
$lang->bug->placeholder->chooseBuilds = 'Select Build';
|
||||
|
||||
+15
-12
@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed';
|
||||
$lang->bug->changed = 'Changed';
|
||||
$lang->bug->storyChanged = 'Story Changed';
|
||||
$lang->bug->linkMR = 'Related MRs';
|
||||
$lang->bug->linkCommit = 'Related Commits';
|
||||
$lang->bug->duplicateTip = 'Please enter keyword search';
|
||||
|
||||
/* Page tags. */
|
||||
@@ -396,18 +397,20 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Etapes résolutio
|
||||
|
||||
/* Operating record. */
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, résolu par <strong>$actor</strong> et la résolution est <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, converti par <strong>$actor</strong> en <strong>Story</strong> avec ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, importé par <strong>$actor</strong> en tant que <strong>Task</strong> avec ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong>,with ID <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, lié par <strong>$actor</strong> au Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, supprimé par <strong>$actor</strong> du Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, lié par <strong>$actor</strong> au Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, retiré par <strong>$actor</strong> du Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, ajouté par <strong>$actor</strong> à la Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, retiré par <strong>$actor</strong> de la Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, associé par <strong>$actor</strong> au Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, dissocié par <strong>$actor</strong> du Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->resolved = array('main' => '$date, résolu par <strong>$actor</strong> et la résolution est <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, converti par <strong>$actor</strong> en <strong>Story</strong> avec ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, importé par <strong>$actor</strong> en tant que <strong>Task</strong> avec ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong>,with ID <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, lié par <strong>$actor</strong> au Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, supprimé par <strong>$actor</strong> du Plan <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, lié par <strong>$actor</strong> au Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, retiré par <strong>$actor</strong> du Build <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, ajouté par <strong>$actor</strong> à la Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, retiré par <strong>$actor</strong> de la Release <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, associé par <strong>$actor</strong> au Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, dissocié par <strong>$actor</strong> du Bug <strong>$extra</strong>.');
|
||||
|
||||
$lang->bug->placeholder = new stdclass();
|
||||
$lang->bug->placeholder->chooseBuilds = 'Sélect Build';
|
||||
|
||||
+15
-11
@@ -172,6 +172,8 @@ $lang->bug->legendComment = 'Ghi chú';
|
||||
$lang->bug->legendLife = 'Toàn bộ';
|
||||
$lang->bug->legendMisc = 'Khác';
|
||||
$lang->bug->legendRelated = 'Thông tin liên quan';
|
||||
$lang->bug->linkMRs = 'Related MRs';
|
||||
$lang->bug->linkCommit = 'Related Commits';
|
||||
|
||||
/* Button. */
|
||||
$lang->bug->buttonConfirm = 'Xác nhận';
|
||||
@@ -376,17 +378,19 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Cột bước';
|
||||
|
||||
/* Operating record. */
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, được giải quyết bởi <strong>$actor</strong> và giải pháp là <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, được chuyển bởi <strong>$actor</strong> thành <strong>Story</strong> với ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, nhập bởi <strong>$actor</strong> như <strong>Task</strong> with ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, liên kết bởi <strong>$actor</strong> cho kế hoạch <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, được xóa bởi <strong>$actor</strong> từ kế hoạch <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, liên kết bởi <strong>$actor</strong> tới Bản dựng <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, bị hủy bởi <strong>$actor</strong> từ bản dựng <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, liên kết bởi <strong>$actor</strong> tới Phát hành <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, bị hủy bởi <strong>$actor</strong> từ Phát hành <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, liên kết bởi <strong>$actor</strong> tới Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, bị hủy bởi <strong>$actor</strong> từ Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->resolved = array('main' => '$date, được giải quyết bởi <strong>$actor</strong> và giải pháp là <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, được chuyển bởi <strong>$actor</strong> thành <strong>Story</strong> với ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->totask = array('main' => '$date, nhập bởi <strong>$actor</strong> như <strong>Task</strong> with ID <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, liên kết bởi <strong>$actor</strong> cho kế hoạch <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, được xóa bởi <strong>$actor</strong> từ kế hoạch <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, liên kết bởi <strong>$actor</strong> tới Bản dựng <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, bị hủy bởi <strong>$actor</strong> từ bản dựng <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, liên kết bởi <strong>$actor</strong> tới Phát hành <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, bị hủy bởi <strong>$actor</strong> từ Phát hành <strong>$extra</strong>.');
|
||||
$lang->bug->action->linked2revision = array('main' => '$date, linked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, unlinked by <strong>$actor</strong> to Revision <strong>$extra</strong>.');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, liên kết bởi <strong>$actor</strong> tới Bug <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, bị hủy bởi <strong>$actor</strong> từ Bug <strong>$extra</strong>.');
|
||||
|
||||
$lang->bug->placeholder = new stdclass();
|
||||
$lang->bug->placeholder->chooseBuilds = 'Chọn bản dựng';
|
||||
|
||||
+15
-12
@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = '被延期';
|
||||
$lang->bug->changed = '已变动';
|
||||
$lang->bug->storyChanged = '需求变动';
|
||||
$lang->bug->linkMR = '相关合并请求';
|
||||
$lang->bug->linkCommit = '相关代码版本';
|
||||
$lang->bug->duplicateTip = '请输入关键字';
|
||||
|
||||
/* 页面标签。*/
|
||||
@@ -396,18 +397,20 @@ $lang->bug->report->bugHistories->graph->xAxisName = '处理步骤';
|
||||
|
||||
/* 操作记录。*/
|
||||
$lang->bug->action = new stdclass();
|
||||
$lang->bug->action->resolved = array('main' => '$date, 由 <strong>$actor</strong> 解决,方案为 <strong>$extra</strong> $appendLink。', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong> ' . $lang->SRCommon . '</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 导入为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, 由 <strong>$actor</strong> 关联到计划 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, 由 <strong>$actor</strong> 从计划 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, 由 <strong>$actor</strong> 从版本 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, 由 <strong>$actor</strong> 关联到发布 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, 由 <strong>$actor</strong> 从发布 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, 由 <strong>$actor</strong> 关联相关Bug <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, 由 <strong>$actor</strong> 移除相关Bug <strong>$extra</strong>。');
|
||||
$lang->bug->action->resolved = array('main' => '$date, 由 <strong>$actor</strong> 解决,方案为 <strong>$extra</strong> $appendLink。', 'extra' => 'resolutionList');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong> ' . $lang->SRCommon . '</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 导入为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->converttotask = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, 由 <strong>$actor</strong> 关联到计划 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, 由 <strong>$actor</strong> 从计划 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linked2build = array('main' => '$date, 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfrombuild = array('main' => '$date, 由 <strong>$actor</strong> 从版本 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->unlinkedfromrelease = array('main' => '$date, 由 <strong>$actor</strong> 从发布 <strong>$extra</strong> 移除。');
|
||||
$lang->bug->action->linked2release = array('main' => '$date, 由 <strong>$actor</strong> 关联到发布 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2revision = array('main' => '$date, 由 <strong>$actor</strong> 关联到代码提交 <strong>$extra</strong>.');
|
||||
$lang->bug->action->unlinkedfromrevision = array('main' => '$date, 由 <strong>$actor</strong> 取消关联到代码提交 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linkrelatedbug = array('main' => '$date, 由 <strong>$actor</strong> 关联相关Bug <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkrelatedbug = array('main' => '$date, 由 <strong>$actor</strong> 移除相关Bug <strong>$extra</strong>。');
|
||||
|
||||
$lang->bug->placeholder = new stdclass();
|
||||
$lang->bug->placeholder->chooseBuilds = '选择相关版本...';
|
||||
|
||||
@@ -435,6 +435,20 @@
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->linkCommit;?></th>
|
||||
<td>
|
||||
<?php
|
||||
$canViewRevision = common::hasPriv('repo', 'revision');
|
||||
foreach($linkCommits as $commit)
|
||||
{
|
||||
$revision = substr($commit->revision, 0, 10);
|
||||
$commitTitle = $revision . ' ' . $commit->comment;
|
||||
echo "<div class='link-commit' title='$commitTitle'>" . ($canViewRevision ? html::a($this->createLink('repo', 'revision', "repoID={$commit->repo}&objectID=0&revision={$commit->revision}"), $revision) . " $commit->comment" : $commitTitle) . '</div>';
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -6,3 +6,4 @@ $lang->ci->checkCompileStatus = 'Interface: Fetch Test Result.';
|
||||
$lang->ci->job = 'Construction';
|
||||
$lang->ci->task = 'Task';
|
||||
$lang->ci->history = 'History';
|
||||
$lang->ci->list = 'List';
|
||||
|
||||
@@ -6,3 +6,4 @@ $lang->ci->checkCompileStatus = 'Interface: Fetch Test Result.';
|
||||
$lang->ci->job = 'Job';
|
||||
$lang->ci->task = 'Task';
|
||||
$lang->ci->history = 'History';
|
||||
$lang->ci->list = 'List';
|
||||
|
||||
@@ -6,3 +6,4 @@ $lang->ci->checkCompileStatus = 'Interface: Fetch Test Result.';
|
||||
$lang->ci->job = 'Construction';
|
||||
$lang->ci->task = 'T鈉he';
|
||||
$lang->ci->history = 'Historique';
|
||||
$lang->ci->list = 'List';
|
||||
|
||||
@@ -5,3 +5,4 @@ $lang->ci->commitResult = 'Interface: Commit Test Result.';
|
||||
$lang->ci->job = 'Job';
|
||||
$lang->ci->task = 'Nhiệm vụ';
|
||||
$lang->ci->history = 'Lịch sử';
|
||||
$lang->ci->list = 'List';
|
||||
|
||||
@@ -6,3 +6,4 @@ $lang->ci->checkCompileStatus = '接口:获取测试结果';
|
||||
$lang->ci->job = '构建';
|
||||
$lang->ci->task = '构建任务';
|
||||
$lang->ci->history = '构建历史';
|
||||
$lang->ci->list = '列表';
|
||||
|
||||
@@ -6,3 +6,4 @@ $lang->ci->checkCompileStatus = '介面:獲取測試結果';
|
||||
$lang->ci->job = '構建';
|
||||
$lang->ci->task = '構建任務';
|
||||
$lang->ci->history = '構建歷史';
|
||||
$lang->ci->list = '列表';
|
||||
|
||||
@@ -85,6 +85,8 @@ $lang->acl = new stdclass();
|
||||
$lang->curd = new stdclass();
|
||||
$lang->sonarqube = new stdclass();
|
||||
$lang->app = new stdclass();
|
||||
$lang->zahost = new stdclass();
|
||||
$lang->zanode = new stdclass();
|
||||
|
||||
$lang->projectbuild = new stdclass();
|
||||
$lang->projectrelease = new stdclass();
|
||||
|
||||
@@ -205,6 +205,8 @@ $lang->action->trash = 'Recycle';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
$lang->review->common = 'Review';
|
||||
$lang->zahost->common = 'ZAhost';
|
||||
$lang->zanode->common = 'ZAnode';
|
||||
|
||||
$lang->personnel->common = 'Member';
|
||||
$lang->personnel->invest = 'Investment';
|
||||
@@ -287,7 +289,7 @@ $lang->testcase->case = 'Test Case';
|
||||
$lang->testcase->testsuite = 'Test Suite';
|
||||
$lang->testcase->caselib = 'Case Library';
|
||||
|
||||
$lang->devops->compile = 'Compile';
|
||||
$lang->devops->compile = 'Pipelines';
|
||||
$lang->devops->mr = 'Merge Request';
|
||||
$lang->devops->repo = 'Repo';
|
||||
$lang->devops->rules = 'Rule';
|
||||
|
||||
@@ -205,6 +205,8 @@ $lang->action->trash = 'Recycle';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
$lang->review->common = 'Review';
|
||||
$lang->zahost->common = 'ZAhost';
|
||||
$lang->zanode->common = 'ZAnode';
|
||||
|
||||
$lang->personnel->common = 'Member';
|
||||
$lang->personnel->invest = 'Investment';
|
||||
@@ -287,7 +289,7 @@ $lang->testcase->case = 'Test Case';
|
||||
$lang->testcase->testsuite = 'Test Suite';
|
||||
$lang->testcase->caselib = 'Case Library';
|
||||
|
||||
$lang->devops->compile = 'Compile';
|
||||
$lang->devops->compile = 'Pipelines';
|
||||
$lang->devops->mr = 'Merge Request';
|
||||
$lang->devops->repo = 'Repo';
|
||||
$lang->devops->rules = 'Rule';
|
||||
|
||||
@@ -205,6 +205,8 @@ $lang->action->trash = 'Recycle';
|
||||
$lang->app->common = 'APP';
|
||||
$lang->app->serverLink = 'Server Link';
|
||||
$lang->review->common = 'Review';
|
||||
$lang->zahost->common = 'ZAhost';
|
||||
$lang->zanode->common = 'ZAnode';
|
||||
|
||||
$lang->personnel->common = 'Member';
|
||||
$lang->personnel->invest = 'Investment';
|
||||
@@ -287,7 +289,7 @@ $lang->testcase->case = 'Test Case';
|
||||
$lang->testcase->testsuite = 'Test Suite';
|
||||
$lang->testcase->caselib = 'Case Library';
|
||||
|
||||
$lang->devops->compile = 'Compile';
|
||||
$lang->devops->compile = 'Pipelines';
|
||||
$lang->devops->mr = 'Merge Request';
|
||||
$lang->devops->repo = 'Repo';
|
||||
$lang->devops->rules = 'Rule';
|
||||
|
||||
+23
-20
@@ -443,14 +443,16 @@ $lang->project->noMultiple->kanban->menuOrder[15] = 'settings';
|
||||
|
||||
/* QA menu.*/
|
||||
$lang->qa->menu = new stdclass();
|
||||
$lang->qa->menu->index = array('link' => "$lang->dashboard|qa|index");
|
||||
$lang->qa->menu->bug = array('link' => "{$lang->bug->common}|bug|browse|productID=%s", 'subModule' => 'bug');
|
||||
$lang->qa->menu->testcase = array('link' => "{$lang->testcase->shortCommon}|testcase|browse|productID=%s", 'subModule' => 'testcase,story');
|
||||
$lang->qa->menu->testsuite = array('link' => "{$lang->testcase->testsuite}|testsuite|browse|productID=%s", 'subModule' => 'testsuite');
|
||||
$lang->qa->menu->testtask = array('link' => "{$lang->testtask->common}|testtask|browse|productID=%s", 'subModule' => 'testtask', 'alias' => 'view,edit,linkcase,cases,start,close,batchrun,groupcase,report,importunitresult');
|
||||
$lang->qa->menu->report = array('link' => "{$lang->testreport->common}|testreport|browse|productID=%s", 'subModule' => 'testreport');
|
||||
$lang->qa->menu->caselib = array('link' => "{$lang->testcase->caselib}|caselib|browse|libID=0", 'subModule' => 'caselib');
|
||||
$lang->qa->menu->automation = array('link' => "{$lang->automation->common}|automation|browse|productID=%s", 'subModule' => 'automation', 'alias' => '');
|
||||
$lang->qa->menu->index = array('link' => "$lang->dashboard|qa|index");
|
||||
$lang->qa->menu->bug = array('link' => "{$lang->bug->common}|bug|browse|productID=%s", 'subModule' => 'bug');
|
||||
$lang->qa->menu->testcase = array('link' => "{$lang->testcase->shortCommon}|testcase|browse|productID=%s", 'subModule' => 'testcase,story');
|
||||
$lang->qa->menu->testsuite = array('link' => "{$lang->testcase->testsuite}|testsuite|browse|productID=%s", 'subModule' => 'testsuite');
|
||||
$lang->qa->menu->testtask = array('link' => "{$lang->testtask->common}|testtask|browse|productID=%s", 'subModule' => 'testtask', 'alias' => 'view,edit,linkcase,cases,start,close,batchrun,groupcase,report,importunitresult');
|
||||
$lang->qa->menu->report = array('link' => "{$lang->testreport->common}|testreport|browse|productID=%s", 'subModule' => 'testreport');
|
||||
$lang->qa->menu->caselib = array('link' => "{$lang->testcase->caselib}|caselib|browse|libID=0", 'subModule' => 'caselib');
|
||||
$lang->qa->menu->automation = array('link' => "{$lang->automation->common}:|project|other|productID=%s", 'subModule' => 'automation', 'alias' => '', 'class' => "qa-automation-menu");
|
||||
$lang->qa->menu->zahost = array('link' => "{$lang->zahost->common}|zahost|browse", 'subModule' => 'zahost');
|
||||
$lang->qa->menu->zanode = array('link' => "{$lang->zanode->common}|zanode|browse", 'subModule' => 'zanode');
|
||||
|
||||
/* QA menu order. */
|
||||
$lang->qa->menuOrder[5] = 'product';
|
||||
@@ -464,13 +466,13 @@ $lang->qa->menuOrder[40] = 'caselib';
|
||||
$lang->qa->menuOrder[45] = 'automation';
|
||||
|
||||
// $lang->qa->menu->automation['subMenu'] = new stdclass();
|
||||
// $lang->qa->menu->automation['subMenu']->browse = array('link' => "{$lang->intro}|automation|browse|productID=%s", 'alias' => '');
|
||||
// $lang->qa->menu->automation['subMenu']->browse = array('link' => "{$lang->automation->common}|zahost|browse", 'alias' => 'create');
|
||||
// $lang->qa->menu->automation['subMenu']->framework = array('link' => '框架|automation|framework|productID=%s', 'alias' => '');
|
||||
// $lang->qa->menu->automation['subMenu']->data = array('link' => '数据|automation|date|productID=%s', 'alias' => '');
|
||||
// $lang->qa->menu->automation['subMenu']->interface = array('link' => '接口|automation|interface|productID=%s', 'alias' => '');
|
||||
// $lang->qa->menu->automation['subMenu']->environment = array('link' => '环境|automation|environment|productID=%s', 'alias' => '');
|
||||
|
||||
$lang->qa->dividerMenu = ',bug,testtask,caselib,';
|
||||
$lang->qa->dividerMenu = ',bug,testtask,caselib,automation,';
|
||||
|
||||
/* DevOps menu. */
|
||||
$lang->devops->menu = new stdclass();
|
||||
@@ -718,16 +720,17 @@ $lang->navGroup->api = 'doc';
|
||||
$lang->navGroup->screen = 'report';
|
||||
$lang->navGroup->report = 'report';
|
||||
|
||||
$lang->navGroup->qa = 'qa';
|
||||
$lang->navGroup->bug = 'qa';
|
||||
$lang->navGroup->testcase = 'qa';
|
||||
$lang->navGroup->testtask = 'qa';
|
||||
$lang->navGroup->automation = 'qa';
|
||||
$lang->navGroup->testreport = 'qa';
|
||||
$lang->navGroup->testcase = 'qa';
|
||||
$lang->navGroup->testtask = 'qa';
|
||||
$lang->navGroup->testsuite = 'qa';
|
||||
$lang->navGroup->caselib = 'qa';
|
||||
$lang->navGroup->qa = 'qa';
|
||||
$lang->navGroup->bug = 'qa';
|
||||
$lang->navGroup->testcase = 'qa';
|
||||
$lang->navGroup->testtask = 'qa';
|
||||
$lang->navGroup->zahost = 'qa';
|
||||
$lang->navGroup->zanode = 'qa';
|
||||
$lang->navGroup->testreport = 'qa';
|
||||
$lang->navGroup->testcase = 'qa';
|
||||
$lang->navGroup->testtask = 'qa';
|
||||
$lang->navGroup->testsuite = 'qa';
|
||||
$lang->navGroup->caselib = 'qa';
|
||||
|
||||
$lang->navGroup->devops = 'devops';
|
||||
$lang->navGroup->repo = 'devops';
|
||||
|
||||
@@ -219,7 +219,7 @@ $lang->system->menu->calendar = array('link' => 'Calendar|my|calendar|', 'subMod
|
||||
$lang->measurement = new stdclass();
|
||||
$lang->measurement->menu = new stdclass();
|
||||
|
||||
$lang->devops->compile = 'Compile';
|
||||
$lang->devops->compile = 'Pipelines';
|
||||
$lang->devops->mr = 'Merge Request';
|
||||
$lang->devops->repo = 'Repo';
|
||||
$lang->devops->rules = 'Rule';
|
||||
|
||||
@@ -205,6 +205,8 @@ $lang->action->trash = '回收站';
|
||||
$lang->app->common = '应用';
|
||||
$lang->app->serverLink = '服务器链接';
|
||||
$lang->review->common = '审批';
|
||||
$lang->zahost->common = '宿主机';
|
||||
$lang->zanode->common = '执行节点';
|
||||
|
||||
$lang->personnel->common = '人员';
|
||||
$lang->personnel->invest = '投入人员';
|
||||
@@ -287,7 +289,7 @@ $lang->testcase->case = '用例';
|
||||
$lang->testcase->testsuite = '套件';
|
||||
$lang->testcase->caselib = '用例库';
|
||||
|
||||
$lang->devops->compile = '构建';
|
||||
$lang->devops->compile = '流水线';
|
||||
$lang->devops->mr = '合并请求';
|
||||
$lang->devops->repo = '代码库';
|
||||
$lang->devops->rules = '指令';
|
||||
|
||||
@@ -163,7 +163,8 @@ $lang->testtask->common = '測試單';
|
||||
$lang->score->common = '我的積分';
|
||||
$lang->build->common = '版本';
|
||||
$lang->testreport->common = '測試報告';
|
||||
$lang->automation->common = '自動化';
|
||||
$lang->automation->common = '自動化:';
|
||||
$lang->zahost->common = '宿主機';
|
||||
$lang->team->common = '團隊';
|
||||
$lang->user->common = '用戶';
|
||||
$lang->custom->common = '自定義';
|
||||
@@ -265,7 +266,7 @@ $lang->testcase->case = '用例';
|
||||
$lang->testcase->testsuite = '套件';
|
||||
$lang->testcase->caselib = '用例庫';
|
||||
|
||||
$lang->devops->compile = '構建';
|
||||
$lang->devops->compile = '流水線';
|
||||
$lang->devops->mr = '合併請求';
|
||||
$lang->devops->repo = '版本庫';
|
||||
$lang->devops->rules = '指令';
|
||||
|
||||
@@ -3234,6 +3234,7 @@ EOD;
|
||||
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
|
||||
curl_setopt($curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
||||
curl_setopt($curl, CURLOPT_HEADER, FALSE);
|
||||
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 2);
|
||||
curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
|
||||
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
|
||||
curl_setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
<style>
|
||||
#successModal #modalLink{color: #2e7fff;text-decoration: underline;}
|
||||
#successModal .modal-dialog .modal-content{border: 2px solid #75e5c4; background-color: #f1fcf9; border-radius: 4px;}
|
||||
#successModal .icon-check-circle{color: #17ce97; margin-right: 10px; font-size: 20px;}
|
||||
#successModal .modal-dialog{width: fit-content;}
|
||||
#successModal .modal-dialog{border-radius: 4px;}
|
||||
#successModal .modal-header{padding:9px 15px 0px; margin:0px; border-bottom:0;}
|
||||
#successModal .modal-dialog .modal-body{padding: 5px 15px 20px 15px;}
|
||||
</style>
|
||||
<div class="modal fade" id="successModal">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<?php echo html::a($closeLink, '×', '', 'class="close"');?>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>
|
||||
<i class="icon-check-circle icon"></i><?php echo $notice;?>
|
||||
<?php $modalLink = !empty($modalLink) ? $modalLink : '';?>
|
||||
<?php $class = !empty($modalClass) ? $modalClass : '';?>
|
||||
<?php echo html::a($modalLink, $buttonName, '', "id='modalLink' class='$class'");?>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function showModal(url = '')
|
||||
{
|
||||
if(url) $("#modalLink").attr('href', url);
|
||||
$('#successModal').modal('show', 'center');
|
||||
}
|
||||
</script>
|
||||
@@ -7,7 +7,7 @@ $lang->compile->syncCompile = 'Interface: Sync Compiles.';
|
||||
$lang->compile->id = 'ID';
|
||||
$lang->compile->name = 'Nom';
|
||||
$lang->compile->buildType = 'Engine';
|
||||
$lang->compile->status = 'Statut du Build';
|
||||
$lang->compile->status = 'Statut';
|
||||
$lang->compile->time = 'Date/Heure Build';
|
||||
$lang->compile->result = 'R閟ultat';
|
||||
$lang->compile->refresh = 'Refresh';
|
||||
|
||||
@@ -6,9 +6,9 @@ $lang->compile->syncCompile = '接口:同步构建记录';
|
||||
|
||||
$lang->compile->id = 'ID';
|
||||
$lang->compile->name = '构建名称';
|
||||
$lang->compile->buildType = '构建引擎';
|
||||
$lang->compile->status = '构建状态';
|
||||
$lang->compile->time = '构建时间';
|
||||
$lang->compile->buildType = '引擎';
|
||||
$lang->compile->status = '状态';
|
||||
$lang->compile->time = '最后执行时间';
|
||||
$lang->compile->result = '构建结果';
|
||||
$lang->compile->refresh = '刷新';
|
||||
$lang->compile->job = '构建任务';
|
||||
|
||||
@@ -5,9 +5,9 @@ $lang->compile->logs = '構建日誌';
|
||||
|
||||
$lang->compile->id = 'ID';
|
||||
$lang->compile->name = '構建名稱';
|
||||
$lang->compile->buildType = '構建引擎';
|
||||
$lang->compile->status = '構建狀態';
|
||||
$lang->compile->time = '構建時間';
|
||||
$lang->compile->buildType = '引擎';
|
||||
$lang->compile->status = '狀態';
|
||||
$lang->compile->time = '最後執行時間';
|
||||
$lang->compile->result = '構建結果';
|
||||
$lang->compile->refresh = '刷新';
|
||||
$lang->compile->job = '構建任務';
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->task}</span>", '', "class='btn btn-link'");
|
||||
echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->list}</span>", '', "class='btn btn-link'");
|
||||
echo html::a($this->createLink('compile', 'browse', "repoID=$repoID&jobID=$jobID"), "<span class='text'>" . ($jobID ? $job->name : '') . " {$lang->ci->history}</span>", '', "class='btn btn-link btn-active-text'");
|
||||
?>
|
||||
</div>
|
||||
|
||||
@@ -338,7 +338,7 @@ class executionModel extends model
|
||||
$multipleProducts = $this->loadModel('product')->getMultiBranchPairs();
|
||||
foreach($_POST['products'] as $index => $productID)
|
||||
{
|
||||
if(isset($multipleProducts[$productID]) and empty($_POST['branch'][$index]))
|
||||
if(isset($multipleProducts[$productID]) and !isset($_POST['branch'][$index]))
|
||||
{
|
||||
dao::$errors[] = $this->lang->project->emptyBranch;
|
||||
return false;
|
||||
@@ -534,7 +534,7 @@ class executionModel extends model
|
||||
$multipleProducts = $this->loadModel('product')->getMultiBranchPairs();
|
||||
foreach($_POST['products'] as $index => $productID)
|
||||
{
|
||||
if(isset($multipleProducts[$productID]) and empty($_POST['branch'][$index]))
|
||||
if(isset($multipleProducts[$productID]) and !isset($_POST['branch'][$index]))
|
||||
{
|
||||
dao::$errors[] = $this->lang->project->emptyBranch;
|
||||
return false;
|
||||
|
||||
+14
-1
@@ -189,7 +189,20 @@ class gitModel extends model
|
||||
' task:' . join(' ', $objects['tasks']) .
|
||||
' bug:' . join(',', $objects['bugs']));
|
||||
|
||||
if($lastVersion != $version) $this->repo->saveAction2PMS($objects, $log, $this->repoRoot, $repo->encoding, 'git', $accountPairs);
|
||||
if($lastVersion != $version)
|
||||
{
|
||||
$this->repo->saveAction2PMS($objects, $log, $this->repoRoot, $repo->encoding, 'git', $accountPairs);
|
||||
|
||||
/* Objects link commit. */
|
||||
foreach($objects as $objectType => $objectIDs)
|
||||
{
|
||||
$objectTypeMap = array('stories' => 'story', 'bugs' => 'bug', 'tasks' => 'task');
|
||||
if(empty($objectIDs) or !isset($objectTypeMap[$objectType])) continue;
|
||||
|
||||
$this->post->$objectType = $objectIDs;
|
||||
$this->repo->link($repo->id, $log->revision, $objectTypeMap[$objectType]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -227,7 +227,7 @@ class gitlab extends control
|
||||
|
||||
$gitLab = $this->gitlab->getByID($id);
|
||||
$changes = common::createChanges($oldGitLab, $gitLab);
|
||||
$this->action->logHistory($actionID, $changes);
|
||||
$this->loadModel('action')->logHistory($actionID, $changes);
|
||||
echo js::reload('parent');
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,8 @@ $lang->moduleOrder[85] = 'testtask';
|
||||
$lang->moduleOrder[90] = 'testsuite';
|
||||
$lang->moduleOrder[95] = 'testreport';
|
||||
$lang->moduleOrder[100] = 'caselib';
|
||||
$lang->moduleOrder[105] = 'automation';
|
||||
$lang->moduleOrder[105] = 'zahost';
|
||||
$lang->moduleOrder[108] = 'zanode';
|
||||
|
||||
$lang->moduleOrder[110] = 'doc';
|
||||
$lang->moduleOrder[113] = 'screen';
|
||||
@@ -1054,6 +1055,7 @@ $lang->resource->testcase->batchCreate = 'batchCreate';
|
||||
$lang->resource->testcase->createBug = 'createBug';
|
||||
$lang->resource->testcase->view = 'view';
|
||||
$lang->resource->testcase->edit = 'edit';
|
||||
$lang->resource->testcase->showScript = 'showScript';
|
||||
$lang->resource->testcase->linkCases = 'linkCases';
|
||||
$lang->resource->testcase->linkBugs = 'linkBugs';
|
||||
$lang->resource->testcase->batchEdit = 'batchEdit';
|
||||
@@ -1076,6 +1078,7 @@ $lang->resource->testcase->confirmLibcaseChange = 'confirmLibcaseChange';
|
||||
$lang->resource->testcase->ignoreLibcaseChange = 'ignoreLibcaseChange';
|
||||
$lang->resource->testcase->batchConfirmStoryChange = 'batchConfirmStoryChange';
|
||||
$lang->resource->testcase->importToLib = 'importToLib';
|
||||
$lang->resource->testcase->automation = 'automation';
|
||||
|
||||
$lang->testcase->methodOrder[0] = 'index';
|
||||
$lang->testcase->methodOrder[5] = 'browse';
|
||||
@@ -1106,6 +1109,8 @@ $lang->testcase->methodOrder[125] = 'confirmLibcaseChange';
|
||||
$lang->testcase->methodOrder[130] = 'ignoreLibcaseChange';
|
||||
$lang->testcase->methodOrder[135] = 'batchConfirmStoryChange';
|
||||
$lang->testcase->methodOrder[140] = 'importToLib';
|
||||
$lang->testcase->methodOrder[145] = 'automation';
|
||||
$lang->testcase->methodOrder[150] = 'showScript';
|
||||
|
||||
/* Test task. */
|
||||
$lang->resource->testtask = new stdclass();
|
||||
@@ -1214,10 +1219,45 @@ $lang->caselib->methodOrder[40] = 'exportTemplate';
|
||||
$lang->caselib->methodOrder[45] = 'import';
|
||||
$lang->caselib->methodOrder[50] = 'showImport';
|
||||
|
||||
$lang->resource->automation = new stdclass();
|
||||
$lang->resource->automation->browse = 'browse';
|
||||
$lang->resource->zahost = new stdclass();
|
||||
$lang->resource->zahost->browse = 'browse';
|
||||
$lang->resource->zahost->create = 'create';
|
||||
$lang->resource->zahost->edit = 'editAction';
|
||||
$lang->resource->zahost->delete = 'deleteAction';
|
||||
$lang->resource->zahost->view = 'view';
|
||||
$lang->resource->zahost->browseImage = 'browseImage';
|
||||
|
||||
$lang->automation->methodOrder[0] = 'browse';
|
||||
$lang->zahost->methodOrder[0] = 'browse';
|
||||
$lang->zahost->methodOrder[5] = 'create';
|
||||
$lang->zahost->methodOrder[10] = 'edit';
|
||||
$lang->zahost->methodOrder[15] = 'delete';
|
||||
$lang->zahost->methodOrder[20] = 'view';
|
||||
$lang->zahost->methodOrder[25] = 'browseImage';
|
||||
|
||||
$lang->resource->zanode = new stdclass();
|
||||
$lang->resource->zanode->browse = 'browse';
|
||||
$lang->resource->zanode->create = 'create';
|
||||
$lang->resource->zanode->destroy = 'destroy';
|
||||
$lang->resource->zanode->reboot = 'reboot';
|
||||
$lang->resource->zanode->suspend = 'suspend';
|
||||
$lang->resource->zanode->resume = 'resume';
|
||||
$lang->resource->zanode->getVNC = 'getVNC';
|
||||
$lang->resource->zanode->start = 'boot';
|
||||
$lang->resource->zanode->close = 'shutdown';
|
||||
$lang->resource->zanode->view = 'view';
|
||||
$lang->resource->zanode->createImage = 'createImage';
|
||||
|
||||
$lang->zanode->methodOrder[5] = 'browse';
|
||||
$lang->zanode->methodOrder[10] = 'create';
|
||||
$lang->zanode->methodOrder[15] = 'destroy';
|
||||
$lang->zanode->methodOrder[20] = 'reboot';
|
||||
$lang->zanode->methodOrder[35] = 'suspend';
|
||||
$lang->zanode->methodOrder[30] = 'resume';
|
||||
$lang->zanode->methodOrder[35] = 'getVNC';
|
||||
$lang->zanode->methodOrder[40] = 'start';
|
||||
$lang->zanode->methodOrder[45] = 'close';
|
||||
$lang->zanode->methodOrder[50] = 'view';
|
||||
$lang->zanode->methodOrder[55] = 'createImage';
|
||||
|
||||
$lang->resource->repo = new stdclass();
|
||||
$lang->resource->repo->browse = 'browseAction';
|
||||
@@ -1235,6 +1275,10 @@ $lang->resource->repo->maintain = 'maintain';
|
||||
$lang->resource->repo->setRules = 'setRules';
|
||||
$lang->resource->repo->apiGetRepoByUrl = 'apiGetRepoByUrl';
|
||||
$lang->resource->repo->downloadCode = 'downloadCode';
|
||||
$lang->resource->repo->linkStory = 'linkStory';
|
||||
$lang->resource->repo->linkBug = 'linkBug';
|
||||
$lang->resource->repo->linkTask = 'linkTask';
|
||||
$lang->resource->repo->unlink = 'unlink';
|
||||
|
||||
$lang->repo->methodOrder[5] = 'create';
|
||||
$lang->repo->methodOrder[10] = 'edit';
|
||||
@@ -1251,6 +1295,10 @@ $lang->repo->methodOrder[60] = 'download';
|
||||
$lang->repo->methodOrder[65] = 'setRules';
|
||||
$lang->repo->methodOrder[70] = 'apiGetRepoByUrl';
|
||||
$lang->repo->methodOrder[75] = 'downloadCode';
|
||||
$lang->repo->methodOrder[80] = 'linkStory';
|
||||
$lang->repo->methodOrder[85] = 'linkBug';
|
||||
$lang->repo->methodOrder[90] = 'linkTask';
|
||||
$lang->repo->methodOrder[95] = 'unlink';
|
||||
|
||||
$lang->resource->ci = new stdclass();
|
||||
$lang->resource->ci->commitResult = 'commitResult';
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<?php
|
||||
$lang->job->common = 'Job';
|
||||
$lang->job->browse = 'Browse Job';
|
||||
$lang->job->create = 'Create Job';
|
||||
$lang->job->edit = 'Edit Job';
|
||||
$lang->job->exec = 'Execute Job';
|
||||
$lang->job->browse = 'Browse Pipeline';
|
||||
$lang->job->create = 'Create Pipeline';
|
||||
$lang->job->edit = 'Edit Pipeline';
|
||||
$lang->job->exec = 'Execute Pipeline';
|
||||
$lang->job->runPipeline = 'Run pipeline';
|
||||
$lang->job->view = 'Execute Details';
|
||||
$lang->job->delete = 'Delete Job';
|
||||
$lang->job->delete = 'Delete Pipeline';
|
||||
$lang->job->confirmDelete = 'Do you want to delete this job?';
|
||||
$lang->job->dirChange = 'Directory Changed';
|
||||
$lang->job->buildTag = 'Build Tag';
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
$lang->job->common = 'Job';
|
||||
$lang->job->browse = 'Browse Job';
|
||||
$lang->job->create = 'Create Job';
|
||||
$lang->job->edit = 'Edit Job';
|
||||
$lang->job->exec = 'Execute Job';
|
||||
$lang->job->browse = 'Browse Pipeline';
|
||||
$lang->job->create = 'Create Pipeline';
|
||||
$lang->job->edit = 'Edit Pipeline';
|
||||
$lang->job->exec = 'Execute Pipeline';
|
||||
$lang->job->runPipeline = 'Run pipeline';
|
||||
$lang->job->view = 'Execute Details';
|
||||
$lang->job->delete = 'Delete Job';
|
||||
$lang->job->confirmDelete = 'Do you want to delete this job?';
|
||||
$lang->job->delete = 'Delete Pipeline';
|
||||
$lang->job->confirmDelete = 'Do you want to delete this pipeline?';
|
||||
$lang->job->dirChange = 'Directory Changed';
|
||||
$lang->job->buildTag = 'Build Tag';
|
||||
$lang->job->execSuccess = 'Build success';
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
<?php
|
||||
$lang->job->common = 'Job';
|
||||
$lang->job->browse = 'Afficher Job';
|
||||
$lang->job->create = 'Cr閑r Job';
|
||||
$lang->job->edit = 'Editer Job';
|
||||
$lang->job->exec = 'Ex閏uter Job';
|
||||
$lang->job->browse = 'Browse Pipeline';
|
||||
$lang->job->create = 'Create Pipeline';
|
||||
$lang->job->edit = 'Edit Pipeline';
|
||||
$lang->job->exec = 'Execute Pipeline';
|
||||
$lang->job->runPipeline = 'Run pipeline';
|
||||
$lang->job->view = 'D閠ails Exec';
|
||||
$lang->job->delete = 'Supprimer Job';
|
||||
$lang->job->view = 'Execute Details';
|
||||
$lang->job->delete = 'Delete Pipeline';
|
||||
$lang->job->confirmDelete = 'Voullez-vous supprimer ce job ?';
|
||||
$lang->job->dirChange = 'R閜ertoire change';
|
||||
$lang->job->dirChange = 'Directory Changed';
|
||||
$lang->job->buildTag = 'Build Tag';
|
||||
$lang->job->execSuccess = 'Build success';
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?php
|
||||
$lang->job->common = 'Job';
|
||||
$lang->job->browse = 'Browse Job';
|
||||
$lang->job->create = 'Tạo Job';
|
||||
$lang->job->edit = 'Sửa Job';
|
||||
$lang->job->exec = 'Xử lý Job';
|
||||
$lang->job->browse = 'Browse Pipeline';
|
||||
$lang->job->create = 'Tạo Pipeline';
|
||||
$lang->job->edit = 'Sửa Pipeline';
|
||||
$lang->job->exec = 'Xử lý Pipeline';
|
||||
$lang->job->view = 'Execute Details';
|
||||
$lang->job->delete = 'Xóa Job';
|
||||
$lang->job->delete = 'Xóa Pipeline';
|
||||
$lang->job->confirmDelete = 'Bạn có muốn xóa job này?';
|
||||
$lang->job->dirChange = 'Thư mục đã thay đổi';
|
||||
$lang->job->buildTag = 'Tag bản dựng';
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
$lang->job->common = '构建任务';
|
||||
$lang->job->browse = '浏览构建任务';
|
||||
$lang->job->create = '创建构建任务';
|
||||
$lang->job->edit = '编辑构建任务';
|
||||
$lang->job->exec = '执行构建';
|
||||
$lang->job->create = '添加流水线';
|
||||
$lang->job->edit = '编辑流水线';
|
||||
$lang->job->exec = '执行流水线';
|
||||
$lang->job->runPipeline = '运行流水线';
|
||||
$lang->job->view = '执行详情';
|
||||
$lang->job->delete = '删除构建任务';
|
||||
$lang->job->confirmDelete = '确认删除该构建任务';
|
||||
$lang->job->delete = '删除流水线';
|
||||
$lang->job->confirmDelete = '确认删除该流水线';
|
||||
$lang->job->dirChange = '目录改动';
|
||||
$lang->job->buildTag = '打标签';
|
||||
$lang->job->execSuccess = '执行成功';
|
||||
@@ -23,7 +23,7 @@ $lang->job->jenkins = 'Jenkins';
|
||||
$lang->job->jkHost = 'Jenkins服务器';
|
||||
$lang->job->jkJob = 'Jenkins任务';
|
||||
$lang->job->buildSpec = '构建对象'; // 'pipeline@server'
|
||||
$lang->job->engine = '构建引擎';
|
||||
$lang->job->engine = '引擎';
|
||||
$lang->job->server = '服务器';
|
||||
$lang->job->pipeline = '流水线';
|
||||
$lang->job->buildType = '构建类型';
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
$lang->job->common = '構建任務';
|
||||
$lang->job->browse = '瀏覽構建任務';
|
||||
$lang->job->create = '創建構建任務';
|
||||
$lang->job->edit = '編輯構建任務';
|
||||
$lang->job->browse = '瀏覽流水線';
|
||||
$lang->job->create = '創建流水線';
|
||||
$lang->job->edit = '編輯流水線';
|
||||
$lang->job->exec = '執行構建';
|
||||
$lang->job->runPipeline = '運行流水綫';
|
||||
$lang->job->runPipeline = '運行流水線';
|
||||
$lang->job->view = '執行詳情';
|
||||
$lang->job->delete = '刪除構建任務';
|
||||
$lang->job->confirmDelete = '確認刪除該構建任務';
|
||||
$lang->job->delete = '刪除流水線';
|
||||
$lang->job->confirmDelete = '確認刪除該流水線';
|
||||
$lang->job->dirChange = '目錄改動';
|
||||
$lang->job->buildTag = '打標籤';
|
||||
$lang->job->execSuccess = '執行成功';
|
||||
@@ -23,9 +23,9 @@ $lang->job->jenkins = 'Jenkins';
|
||||
$lang->job->jkHost = 'Jenkins伺服器';
|
||||
$lang->job->jkJob = 'Jenkins任務';
|
||||
$lang->job->buildSpec = '構建對象'; // 'pipeline@server'
|
||||
$lang->job->engine = '構建引擎';
|
||||
$lang->job->engine = '引擎';
|
||||
$lang->job->server = '伺服器';
|
||||
$lang->job->pipeline = '流水綫';
|
||||
$lang->job->pipeline = '流水線';
|
||||
$lang->job->buildType = '構建類型';
|
||||
$lang->job->frame = '工具/框架';
|
||||
$lang->job->triggerType = '觸發方式';
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->task}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php echo html::a($this->createLink('job', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->list}</span>", '', "class='btn btn-link btn-active-text'");?>
|
||||
<?php echo html::a($this->createLink('compile', 'browse', "repoID=$repoID"), "<span class='text'>{$lang->ci->history}</span>", '', "class='btn btn-link'");?>
|
||||
</div>
|
||||
<div class="btn-toolbar pull-right">
|
||||
|
||||
@@ -455,6 +455,8 @@ class mr extends control
|
||||
$this->view->arrange = $arrange;
|
||||
$this->view->sourceBranch = $MR->sourceBranch;
|
||||
$this->view->targetBranch = $MR->targetBranch;
|
||||
$this->view->oldRevision = $MR->targetBranch;
|
||||
$this->view->newRevision = $MR->sourceBranch;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -21,3 +21,53 @@ table.diff {margin-bottom: 0px;}
|
||||
.label-exchange i {padding: 0;}
|
||||
.btn-download {border-right: none;}
|
||||
.body-modal #back {display: none;}
|
||||
|
||||
.repoCode td.code {white-space: inherit;}
|
||||
.repoCode .content, .repoCode .btn {background-color: #F4F5F7; border: none;}
|
||||
.repoCode .nav-tabs > li.active > a:before {background: none; height: 0;}
|
||||
|
||||
#fileTabs .tab-pane {display: none;}
|
||||
#fileTabs .tab-pane.active {display: block;}
|
||||
#fileTabs .tab-nav-item {max-width: none !important;}
|
||||
#fileTabs > .tabs-navbar {overflow: hidden; padding-bottom: 10px; position: relative; height: 35px;}
|
||||
#fileTabs > .tabs-navbar > .nav-tabs {position: absolute; display: flex;}
|
||||
#filesTree #modules {margin-top: 5px;}
|
||||
#filesTree {overflow-y: auto;}
|
||||
|
||||
#fileTree li {padding: 0 0 0 8px;}
|
||||
#fileTree li.has-list {padding-left: 20px;}
|
||||
#fileTree li > a {display: block; padding: 6px 0; border-radius: 2px; padding-left: 6px; height: 30px; text-decoration: none;}
|
||||
#fileTree li > a > span {display: inline-block;}
|
||||
#fileTree li > a > span + span {margin-left: 8px;}
|
||||
#fileTree li.selected > a {background-color: #E8F3FC;}
|
||||
#fileTree li.selected > a > span.title {color: #006AF1;}
|
||||
#fileTree .label-id {border-color: #cbd0db; color: #7d8599}
|
||||
#fileTree .label.label-type {background: #fff; border: 1px solid #7d8599; color:#7d8599}
|
||||
|
||||
#fileTree li > a > span.title {color: #3C4353; white-space: nowrap; max-width: 60%; overflow: hidden; text-overflow: ellipsis; vertical-align: middle;}
|
||||
#fileTree li > a > span.user {color: #838a9d;}
|
||||
#fileTree li > a > span.user > .icon-person {font-size: 14px; position: relative; top: -1px; color: #a6aab8}
|
||||
#fileTree li > a:first-child {padding-left: 18px;}
|
||||
#fileTree li a.selected {color: #e9f2fb; background-color: #0c64eb;}
|
||||
|
||||
#fileTree li > .list-toggle {transform: rotate(0deg); width: 16px; height: 16px; border: 4px solid #a6aab8; border-radius: 2px; top: 7px;}
|
||||
#fileTree li > .list-toggle:before {content: ' '; display: block; position: absolute; border: 1px solid #a6aab8; top: 2px; left: -3px; right: -3px; bottom: 2px; min-width: 0; transition: all .2s;}
|
||||
#fileTree li > .list-toggle:hover:before, #fileTree li > .list-toggle:hover {border-color: #006AF1;}
|
||||
#fileTree li.open > .list-toggle {width: 12px; height: 12px; top: 9px; background-color: #a6aab8; border-width: 3px; left: 3px;}
|
||||
#fileTree li.open > .list-toggle:before {border: none; height: 2px; width: 6px; left: 0; top: 2px; background: #fff;}
|
||||
#fileTree li.open > .list-toggle:hover {background: #006AF1;}
|
||||
|
||||
#fileTree ul > li:after {display: block; position: absolute; content: ' '; border-top: 1px dashed #cbd0db; top: 14px; left: -12px; z-index: 1; width: 10px;}
|
||||
#fileTree ul > li:before, #fileTree ul > li.has-list:before {background: none; content: ' '; display: block; position: absolute; width: auto; height: auto; border: none; border-left: 1px dashed #cbd0db; top: -13px; bottom: 12px; left: -12px;}
|
||||
#fileTree ul > li:last-child:before {bottom: auto; height: 29px;}
|
||||
#fileTree ul > li:first-child:before {top: -9px;}
|
||||
#fileTree ul > li.has-list:first-child:before {top: -13px;}
|
||||
#fileTree ul > li.tree-single-item:before {height: 23px;}
|
||||
#fileTree ul > li.has-list:after {width: 14px;}
|
||||
|
||||
#modules li {padding: 5px 0 0 15px;}
|
||||
.file-tree #modules .icon {color: #9EA3B0;}
|
||||
.file-tree #modules .icon-folder {padding-left: 5px;}
|
||||
li.selected .doc-title .icon, li.selected .doc-title a {color: #438EFF !important;}
|
||||
|
||||
.btn-left, .btn-right {display: none;}
|
||||
|
||||
@@ -69,7 +69,8 @@ $(function()
|
||||
{
|
||||
$('#repoID').html('').append(response);
|
||||
$('#repoID').val(repo.id);
|
||||
$('#repoID').chosen().trigger("chosen:updated");;
|
||||
$('#repoID').chosen().trigger("chosen:updated");
|
||||
$('#repoID').change();
|
||||
});
|
||||
|
||||
if(sourceProject) getBranchPriv(sourceProject);
|
||||
|
||||
+467
-240
@@ -1,10 +1,55 @@
|
||||
$(document).ready(function()
|
||||
{
|
||||
$("#inline").click(function(){$('#arrange').val('inline');this.form.submit();});
|
||||
$("#appose").click(function(){$('#arrange').val('appose');this.form.submit();});
|
||||
if(!browser || browser == 'ie')
|
||||
{
|
||||
$("#inline").click(function(){$('#arrange').val('inline');this.form.submit();});
|
||||
$("#appose").click(function(){$('#arrange').val('appose');this.form.submit();});
|
||||
}
|
||||
$(".label-exchange").click(function(){ $('#exchange').submit();});
|
||||
});
|
||||
|
||||
var distance = 0;
|
||||
|
||||
/**
|
||||
* Aarrow tabs area.
|
||||
*
|
||||
* @param string domID
|
||||
* @param number shift 1|-1
|
||||
* @param bool hideRightBtn
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function arrowTabs(domID, shift, hideRightBtn)
|
||||
{
|
||||
if($('#' + domID).html() == '') return;
|
||||
|
||||
$('.btn-right, .btn-left').show();
|
||||
if(hideRightBtn) $('.btn-right').hide();
|
||||
|
||||
var tabItemWidth = $('#' + domID + ' > .tabs-navbar > .nav-tabs')[0].clientWidth;
|
||||
var tabsWidth = $('#' + domID + '')[0].clientWidth;
|
||||
if(tabItemWidth < tabsWidth)
|
||||
{
|
||||
$('.btn-right, .btn-left').hide();
|
||||
return;
|
||||
}
|
||||
|
||||
distance += tabsWidth * shift * 0.2;
|
||||
if(distance > 0) distance = 0;
|
||||
if(distance == 0)
|
||||
{
|
||||
$('.btn-left').hide();
|
||||
}
|
||||
|
||||
if((tabItemWidth + distance) < tabsWidth * 0.75)
|
||||
{
|
||||
$('.btn-right').hide();
|
||||
return arrowTabs(domID, 1, true);
|
||||
}
|
||||
|
||||
$('#' + domID + ' > .tabs-navbar > .tabs-nav')[0].style.transform = 'translateX('+ distance +'px)';
|
||||
}
|
||||
|
||||
/**
|
||||
* Change encoding.
|
||||
*
|
||||
@@ -18,298 +63,480 @@ function changeEncoding(encoding)
|
||||
$('#encoding').parents('form').submit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Html code decode.
|
||||
*
|
||||
* @param string str
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function htmlspecialchars_decode(str){
|
||||
str = str.replace(/&/g, '&');
|
||||
str = str.replace(/</g, '<');
|
||||
str = str.replace(/>/g, '>');
|
||||
str = str.replace(/"/g, "''");
|
||||
str = str.replace(/'/g, "'");
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get diffs by file name.
|
||||
*
|
||||
* @param string fileName
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function getDiffs(fileName)
|
||||
{
|
||||
if(fileName.indexOf('./') === 0) fileName = fileName.substring(2);
|
||||
|
||||
var result = {
|
||||
'code': {'new': '', 'old': ''},
|
||||
'line': {'new': [], 'old': []}
|
||||
};
|
||||
$.each(diffs, function(i, diff)
|
||||
{
|
||||
if(diff.fileName == fileName)
|
||||
{
|
||||
if(typeof diff.contents[0].lines != 'object') return result;
|
||||
|
||||
var lines = diff.contents[0].lines;
|
||||
$.each(lines, function(l, code)
|
||||
{
|
||||
if(code.type == 'all' || code.type == 'new')
|
||||
{
|
||||
result.code.new += htmlspecialchars_decode(code.line.substring(2)) + "\n";
|
||||
result.line.new.push(code.newlc);
|
||||
}
|
||||
|
||||
if(code.type == 'all' || code.type == 'old')
|
||||
{
|
||||
result.code.old += htmlspecialchars_decode(code.line.substring(2)) + "\n";
|
||||
result.line.old.push(code.oldlc);
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create file tab.
|
||||
*
|
||||
* @param string filename
|
||||
* @param string filepath
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function createTab(filename, filepath)
|
||||
{
|
||||
$('[data-path="' + decodeURIComponent(filepath) + '"]').closest('li').addClass('selected');
|
||||
var tabID = Base64.encode(filepath).replaceAll('=', '-');
|
||||
return {
|
||||
title: filename,
|
||||
id: tabID,
|
||||
type: 'iframe',
|
||||
url: createLink('repo', 'ajaxGetDiffEditorContent', urlParams.replace('%s', Base64.encode(encodeURIComponent(filepath))))
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Load link object page.
|
||||
*
|
||||
* @param string $link
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadLinkPage(link)
|
||||
{
|
||||
$('#linkObject').attr('href', link);
|
||||
$('#linkObject').click()
|
||||
}
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
var $diffCode = $('.diff');
|
||||
var $rows = $diffCode.find('tr');
|
||||
var rowTip = $('#rowTip').html();
|
||||
var lastLine;
|
||||
$rows.each(function()
|
||||
if(browser != 'ie')
|
||||
{
|
||||
var $row = $(this);
|
||||
if(!$row.hasClass('empty'))
|
||||
var diffAppose = false;
|
||||
$('.dropdown #inline').hide();
|
||||
|
||||
if(!browser || browser == 'ie')
|
||||
{
|
||||
$row.children('th').first().prepend("<div class='comment-btn diff'><span class='icon-wrapper'><i class='icon-plus'></i></span></div>");
|
||||
$row.children('td').first().append(rowTip);
|
||||
$("#inline").click(function(){$('#arrange').val('inline');this.form.submit();});
|
||||
$("#appose").click(function(){$('#arrange').val('appose');this.form.submit();});
|
||||
}
|
||||
$(".label-exchange").click(function(){ $('#exchange').submit();});
|
||||
|
||||
if(lastLine && !$row.data('line'))
|
||||
$('.btn-left').click(function() {arrowTabs('fileTabs', 1);});
|
||||
$('.btn-right').click(function() {arrowTabs('fileTabs', -2);});
|
||||
if(file) $('#fileTabs').tabs({tabs: [createTab(file['basename'], entry)]});
|
||||
|
||||
/**
|
||||
* Set pane height.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function setHeight()
|
||||
{
|
||||
$row.attr('data-line', lastLine);
|
||||
var paneHeight = $(window).height() - 120;
|
||||
$('#fileTabs .tab-pane').css('height', paneHeight + 'px')
|
||||
$('#filesTree').css('height', paneHeight + 45)
|
||||
}
|
||||
else
|
||||
setHeight();
|
||||
|
||||
$(document).on('click', '.repoFileName', function()
|
||||
{
|
||||
lastLine = $row.data('line');
|
||||
}
|
||||
}).hover(function()
|
||||
{
|
||||
var $this = $(this);
|
||||
if($this.hasClass('empty')) return;
|
||||
$this.addClass("over");
|
||||
},
|
||||
function()
|
||||
{
|
||||
$(this).removeClass("over");
|
||||
});
|
||||
var path = $(this).data('path');
|
||||
var name = $(this).text();
|
||||
var $tabs = $('#fileTabs').data('zui.tabs');
|
||||
|
||||
var isInline = $.cookie('arrange') == 'inline';
|
||||
var $reviewFormRow = $('<tr class="action-row"><th></th>' + (isInline ? '<th></th><td class="action-cell"></td>' : '<td colspan="3" class="action-cell"></td>') + '</tr>');
|
||||
var $reviewForm = $('#reviewForm');
|
||||
var $reviewPanel = $('#reviewPanel');
|
||||
$reviewFormRow.find('td').append($reviewForm.removeClass('hide'));
|
||||
$tabs.open(createTab(name, path));
|
||||
setHeight();
|
||||
arrowTabs('fileTabs', -2);
|
||||
});
|
||||
|
||||
var highlight = function($e)
|
||||
{
|
||||
$('.highlight').removeClass('highlight');
|
||||
$e.addClass('highlight');
|
||||
};
|
||||
|
||||
var createReview = function(review, line, show)
|
||||
{
|
||||
var $review = $reviewPanel.clone().removeClass('hide').attr('id', review.objectType + '-' + review.id);
|
||||
$review.find('.realname').text(review.realname);
|
||||
$review.find('.openedDate').text(review.openedDate);
|
||||
$review.find('.title').text(review.title);
|
||||
$review.find('.content').toggle(review.content != '').html(review.content);
|
||||
$review.find('.code-lines').text(review.lines);
|
||||
$review.find('input[name="objectID"]').val(review.id);
|
||||
$review.data(review);
|
||||
|
||||
id = review.objectType == 'bug' ? 'Bug' : 'Task';
|
||||
id += '#' + review.id;
|
||||
if(review.view) id = "<a href='" + createLink(review.objectType, 'view', 'id=' + review.id) + "'>" + id + "</a>";
|
||||
$review.find('.title').closest('.panel-heading').find('.panel-actions').prepend(id);
|
||||
if(!review.delete) $review.find('.title').closest('.panel-heading').find('.panel-actions .reviewDelete').hide();
|
||||
|
||||
$review.toggleClass('show', show > 1);
|
||||
if(show > 2) highlight($review);
|
||||
|
||||
if(!line && review.line) line = review.line;
|
||||
if(line)
|
||||
{
|
||||
var $row = $rows.filter('[data-line="' + line + '"]').last();
|
||||
if(review.entry) $row = $('#diff[data-entry="' + review.entry + '"]').find('tr').filter('[data-line="' + line + '"]');
|
||||
if($row.length == 0) return false;
|
||||
|
||||
$commentRow = $row.next('tr');
|
||||
if($row.hasClass('commented')) $commentRow = $row.nextAll('tr.comment-row').first();
|
||||
if(!$commentRow.hasClass('comment-row'))
|
||||
/* Remove file path for opened files. */
|
||||
$('#fileTabs').on('onClose', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
var index = openedFiles.indexOf(filepath);
|
||||
if(index > -1)
|
||||
{
|
||||
$commentRow = $('<tr class="comment-row"><th></th>' + (isInline ? '<th></th><td class="comment-cell"><div class="comment-list"></div></td>' : '<td colspan="3" class="comment-cell"><div class="comment-list"></div></td>') + '</tr>');
|
||||
$row.addClass('commented').after($commentRow);
|
||||
openedFiles.splice(index, 1)
|
||||
$('[data-path="' + filepath + '"]').closest('li').removeClass('selected');
|
||||
}
|
||||
|
||||
$commentRow.find('.comment-list').append($review);
|
||||
if(index == openedFiles.length) arrowTabs('fileTabs', -2);
|
||||
});
|
||||
|
||||
if(show && $commentRow.hasClass('comment-row')) $commentRow.addClass('show');
|
||||
}
|
||||
/* Append file path into the title. */
|
||||
$('#fileTabs').on('onLoad', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
$('#tab-nav-item-' + tab.id).attr('title', filepath);
|
||||
document.getElementById('tab-iframe-' + tab.id).contentWindow.updateEditorInline(diffAppose);
|
||||
|
||||
return $review;
|
||||
};
|
||||
if(openedFiles.indexOf(filepath) == -1) openedFiles.push(filepath);
|
||||
});
|
||||
|
||||
var toggleComment = function($row, show)
|
||||
{
|
||||
var $commentRow;
|
||||
if($row.hasClass('comment-row'))
|
||||
$('#fileTabs').on('onOpen', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
var index = openedFiles.indexOf(filepath);
|
||||
if(index > -1) document.getElementById('tab-iframe-' + tab.id).contentWindow.updateEditorInline(diffAppose);
|
||||
});
|
||||
|
||||
$('.inline-appose').on('click', function()
|
||||
{
|
||||
$commentRow = $row;
|
||||
$row = $commentRow.prev('tr');
|
||||
if($row.hasClass('action-row'))
|
||||
$('.inline-appose').hide();
|
||||
diffAppose = !diffAppose;
|
||||
if(diffAppose)
|
||||
{
|
||||
$row = $row.prev('tr');
|
||||
$('.dropdown #inline').show();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$commentRow = $row.next('tr');
|
||||
if($commentRow.hasClass('action-row'))
|
||||
else
|
||||
{
|
||||
$commentRow = $commentRow.next('tr');
|
||||
$('.dropdown #appose').show();
|
||||
}
|
||||
}
|
||||
if(show === undefined)
|
||||
{
|
||||
show = !$row.hasClass('open');
|
||||
}
|
||||
if($row.hasClass('commented') && $commentRow.hasClass('comment-row'))
|
||||
{
|
||||
$commentRow.toggleClass('show', show);
|
||||
$row.toggleClass('open', show);
|
||||
}
|
||||
};
|
||||
|
||||
$diffCode.on('click', '.comment-btn', function(e)
|
||||
var type = $(this).attr('id');
|
||||
var tabID = $('.tab-nav-item.active').data('id');
|
||||
document.getElementById('tab-iframe-' + tabID).contentWindow.updateEditorInline(diffAppose);
|
||||
return;
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
$rows.removeClass('selected');
|
||||
var $row = $(this).closest('tr');
|
||||
if($diffCode.hasClass('with-action-row') && $row.hasClass('with-action-row'))
|
||||
var $diffCode = $('.diff');
|
||||
var $rows = $diffCode.find('tr');
|
||||
var rowTip = $('#rowTip').html();
|
||||
var lastLine;
|
||||
$rows.each(function()
|
||||
{
|
||||
$diffCode.removeClass('with-action-row');
|
||||
}
|
||||
else
|
||||
{
|
||||
$diffCode.addClass('with-action-row');
|
||||
var line = $row.attr('data-line');
|
||||
if(!$row.hasClass('with-action-row'))
|
||||
var $row = $(this);
|
||||
if(!$row.hasClass('empty'))
|
||||
{
|
||||
$rows.removeClass('with-action-row')
|
||||
$row.addClass('with-action-row');
|
||||
|
||||
$reviewForm.find('input[name="begin"]').val(line);
|
||||
$reviewForm.find('input[name="end"]').attr('min', line).val(line);
|
||||
$reviewForm.find('select#assignedTo').trigger("chosen:updated");
|
||||
$reviewForm.find('input#entry').val($row.closest('table#diff').data('entry'));
|
||||
|
||||
$row.after($reviewFormRow);
|
||||
|
||||
KindEditor.remove('#commentText');
|
||||
$('#commentText').kindeditor();
|
||||
$row.children('th').first().prepend("<div class='comment-btn diff'><span class='icon-wrapper'><i class='icon-plus'></i></span></div>");
|
||||
$row.children('td').first().append(rowTip);
|
||||
}
|
||||
highlight($reviewForm);
|
||||
$reviewForm.find('input[name="title"]').focus();
|
||||
$row.addClass('selected');
|
||||
}
|
||||
e.stopPropagation();
|
||||
}).on('click', '.reviewDelete', function(e)
|
||||
{
|
||||
var $review = $(this).closest('.panel-review');
|
||||
if(!$review.length) return;
|
||||
|
||||
if(confirm(confirmDelete))
|
||||
{
|
||||
var link = createLink($review.data('objectType'), 'delete', 'id=' + $review.data('id') + '&confirm=yes');
|
||||
$.get(link, function(data)
|
||||
if(lastLine && !$row.data('line'))
|
||||
{
|
||||
var $commentRow = $review.closest('.comment-row');
|
||||
if($commentRow.find('.panel-review').length === 1)
|
||||
$row.attr('data-line', lastLine);
|
||||
}
|
||||
else
|
||||
{
|
||||
lastLine = $row.data('line');
|
||||
}
|
||||
}).hover(function()
|
||||
{
|
||||
var $this = $(this);
|
||||
if($this.hasClass('empty')) return;
|
||||
$this.addClass("over");
|
||||
},
|
||||
function()
|
||||
{
|
||||
$(this).removeClass("over");
|
||||
});
|
||||
|
||||
var isInline = $.cookie('arrange') == 'inline';
|
||||
var $reviewFormRow = $('<tr class="action-row"><th></th>' + (isInline ? '<th></th><td class="action-cell"></td>' : '<td colspan="3" class="action-cell"></td>') + '</tr>');
|
||||
var $reviewForm = $('#reviewForm');
|
||||
var $reviewPanel = $('#reviewPanel');
|
||||
$reviewFormRow.find('td').append($reviewForm.removeClass('hide'));
|
||||
|
||||
var highlight = function($e)
|
||||
{
|
||||
$('.highlight').removeClass('highlight');
|
||||
$e.addClass('highlight');
|
||||
};
|
||||
|
||||
var createReview = function(review, line, show)
|
||||
{
|
||||
var $review = $reviewPanel.clone().removeClass('hide').attr('id', review.objectType + '-' + review.id);
|
||||
$review.find('.realname').text(review.realname);
|
||||
$review.find('.openedDate').text(review.openedDate);
|
||||
$review.find('.title').text(review.title);
|
||||
$review.find('.content').toggle(review.content != '').html(review.content);
|
||||
$review.find('.code-lines').text(review.lines);
|
||||
$review.find('input[name="objectID"]').val(review.id);
|
||||
$review.data(review);
|
||||
|
||||
id = review.objectType == 'bug' ? 'Bug' : 'Task';
|
||||
id += '#' + review.id;
|
||||
if(review.view) id = "<a href='" + createLink(review.objectType, 'view', 'id=' + review.id) + "'>" + id + "</a>";
|
||||
$review.find('.title').closest('.panel-heading').find('.panel-actions').prepend(id);
|
||||
if(!review.delete) $review.find('.title').closest('.panel-heading').find('.panel-actions .reviewDelete').hide();
|
||||
|
||||
$review.toggleClass('show', show > 1);
|
||||
if(show > 2) highlight($review);
|
||||
|
||||
if(!line && review.line) line = review.line;
|
||||
if(line)
|
||||
{
|
||||
var $row = $rows.filter('[data-line="' + line + '"]').last();
|
||||
if(review.entry) $row = $('#diff[data-entry="' + review.entry + '"]').find('tr').filter('[data-line="' + line + '"]');
|
||||
if($row.length == 0) return false;
|
||||
|
||||
$commentRow = $row.next('tr');
|
||||
if($row.hasClass('commented')) $commentRow = $row.nextAll('tr.comment-row').first();
|
||||
if(!$commentRow.hasClass('comment-row'))
|
||||
{
|
||||
$commentRow.removeClass('show').prev('tr').removeClass('commented');
|
||||
$commentRow = $('<tr class="comment-row"><th></th>' + (isInline ? '<th></th><td class="comment-cell"><div class="comment-list"></div></td>' : '<td colspan="3" class="comment-cell"><div class="comment-list"></div></td>') + '</tr>');
|
||||
$row.addClass('commented').after($commentRow);
|
||||
}
|
||||
$review.remove();
|
||||
});
|
||||
}
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}).on('click', 'tr.commented', function()
|
||||
{
|
||||
toggleComment($(this));
|
||||
}).on('click', '.panel-review > .panel-heading', function()
|
||||
{
|
||||
$(this).closest('.panel-review').toggleClass('show');
|
||||
});
|
||||
|
||||
$reviewForm.submit(function()
|
||||
{
|
||||
$(this).ajaxSubmit(
|
||||
$commentRow.find('.comment-list').append($review);
|
||||
|
||||
if(show && $commentRow.hasClass('comment-row')) $commentRow.addClass('show');
|
||||
}
|
||||
|
||||
return $review;
|
||||
};
|
||||
|
||||
var toggleComment = function($row, show)
|
||||
{
|
||||
success:function(json)
|
||||
var $commentRow;
|
||||
if($row.hasClass('comment-row'))
|
||||
{
|
||||
json = $.parseJSON(json);
|
||||
if(json.result == 'fail')
|
||||
$commentRow = $row;
|
||||
$row = $commentRow.prev('tr');
|
||||
if($row.hasClass('action-row'))
|
||||
{
|
||||
var message = '';
|
||||
if(typeof(json.message) != 'string')
|
||||
$row = $row.prev('tr');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$commentRow = $row.next('tr');
|
||||
if($commentRow.hasClass('action-row'))
|
||||
{
|
||||
$commentRow = $commentRow.next('tr');
|
||||
}
|
||||
}
|
||||
if(show === undefined)
|
||||
{
|
||||
show = !$row.hasClass('open');
|
||||
}
|
||||
if($row.hasClass('commented') && $commentRow.hasClass('comment-row'))
|
||||
{
|
||||
$commentRow.toggleClass('show', show);
|
||||
$row.toggleClass('open', show);
|
||||
}
|
||||
};
|
||||
|
||||
$diffCode.on('click', '.comment-btn', function(e)
|
||||
{
|
||||
$rows.removeClass('selected');
|
||||
var $row = $(this).closest('tr');
|
||||
if($diffCode.hasClass('with-action-row') && $row.hasClass('with-action-row'))
|
||||
{
|
||||
$diffCode.removeClass('with-action-row');
|
||||
}
|
||||
else
|
||||
{
|
||||
$diffCode.addClass('with-action-row');
|
||||
var line = $row.attr('data-line');
|
||||
if(!$row.hasClass('with-action-row'))
|
||||
{
|
||||
$rows.removeClass('with-action-row')
|
||||
$row.addClass('with-action-row');
|
||||
|
||||
$reviewForm.find('input[name="begin"]').val(line);
|
||||
$reviewForm.find('input[name="end"]').attr('min', line).val(line);
|
||||
$reviewForm.find('select#assignedTo').trigger("chosen:updated");
|
||||
$reviewForm.find('input#entry').val($row.closest('table#diff').data('entry'));
|
||||
|
||||
$row.after($reviewFormRow);
|
||||
|
||||
KindEditor.remove('#commentText');
|
||||
$('#commentText').kindeditor();
|
||||
}
|
||||
highlight($reviewForm);
|
||||
$reviewForm.find('input[name="title"]').focus();
|
||||
$row.addClass('selected');
|
||||
}
|
||||
e.stopPropagation();
|
||||
}).on('click', '.reviewDelete', function(e)
|
||||
{
|
||||
var $review = $(this).closest('.panel-review');
|
||||
if(!$review.length) return;
|
||||
|
||||
if(confirm(confirmDelete))
|
||||
{
|
||||
var link = createLink($review.data('objectType'), 'delete', 'id=' + $review.data('id') + '&confirm=yes');
|
||||
$.get(link, function(data)
|
||||
{
|
||||
var $commentRow = $review.closest('.comment-row');
|
||||
if($commentRow.find('.panel-review').length === 1)
|
||||
{
|
||||
for(i in json.message)
|
||||
$commentRow.removeClass('show').prev('tr').removeClass('commented');
|
||||
}
|
||||
$review.remove();
|
||||
});
|
||||
}
|
||||
e.stopPropagation();
|
||||
return false;
|
||||
}).on('click', 'tr.commented', function()
|
||||
{
|
||||
toggleComment($(this));
|
||||
}).on('click', '.panel-review > .panel-heading', function()
|
||||
{
|
||||
$(this).closest('.panel-review').toggleClass('show');
|
||||
});
|
||||
|
||||
$reviewForm.submit(function()
|
||||
{
|
||||
$(this).ajaxSubmit(
|
||||
{
|
||||
success:function(json)
|
||||
{
|
||||
json = $.parseJSON(json);
|
||||
if(json.result == 'fail')
|
||||
{
|
||||
var message = '';
|
||||
if(typeof(json.message) != 'string')
|
||||
{
|
||||
if(typeof(json.message[i]) == 'string')
|
||||
for(i in json.message)
|
||||
{
|
||||
message += json.message[i] + '\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
for(j in json.message[i])
|
||||
if(typeof(json.message[i]) == 'string')
|
||||
{
|
||||
message += json.message[i][j] + '\n';
|
||||
message += json.message[i] + '\n';
|
||||
}
|
||||
else
|
||||
{
|
||||
for(j in json.message[i])
|
||||
{
|
||||
message += json.message[i][j] + '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
message += json.message + '\n';
|
||||
}
|
||||
alert(message);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
message += json.message + '\n';
|
||||
}
|
||||
alert(message);
|
||||
return false;
|
||||
}
|
||||
|
||||
createReview(json, json.line, 3);
|
||||
$diffCode.removeClass('with-action-row');
|
||||
$diffCode.find('tr.with-action-row.selected').removeClass('selected');
|
||||
$reviewForm.find('#title').val('');
|
||||
KindEditor.html('#commentText', '');
|
||||
},
|
||||
beforeSubmit:function(formData, jqForm)
|
||||
createReview(json, json.line, 3);
|
||||
$diffCode.removeClass('with-action-row');
|
||||
$diffCode.find('tr.with-action-row.selected').removeClass('selected');
|
||||
$reviewForm.find('#title').val('');
|
||||
KindEditor.html('#commentText', '');
|
||||
},
|
||||
beforeSubmit:function(formData, jqForm)
|
||||
{
|
||||
var form = jqForm[0];
|
||||
if(!form.product.value)
|
||||
{
|
||||
alert(productError);
|
||||
return false;
|
||||
}
|
||||
if(!form.title.value)
|
||||
{
|
||||
alert(titleError);
|
||||
$reviewForm.find('input[name="title"]').focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}).on('change', 'input[name="begin"]', function()
|
||||
{
|
||||
var begin = $(this).val();
|
||||
var $end = $reviewForm.find('input[name="end"]').attr('min', begin);
|
||||
if(parseInt($end.val()) < parseInt(begin))
|
||||
{
|
||||
var form = jqForm[0];
|
||||
if(!form.product.value)
|
||||
{
|
||||
alert(productError);
|
||||
return false;
|
||||
}
|
||||
if(!form.title.value)
|
||||
{
|
||||
alert(titleError);
|
||||
$reviewForm.find('input[name="title"]').focus();
|
||||
return false;
|
||||
}
|
||||
$end.val(begin);
|
||||
}
|
||||
});
|
||||
return false;
|
||||
}).on('change', 'input[name="begin"]', function()
|
||||
{
|
||||
var begin = $(this).val();
|
||||
var $end = $reviewForm.find('input[name="end"]').attr('min', begin);
|
||||
if(parseInt($end.val()) < parseInt(begin))
|
||||
{
|
||||
$end.val(begin);
|
||||
}
|
||||
});
|
||||
|
||||
if(reviews)
|
||||
{
|
||||
var lineReviews;
|
||||
for(var line in reviews)
|
||||
if(reviews)
|
||||
{
|
||||
if(line)
|
||||
var lineReviews;
|
||||
for(var line in reviews)
|
||||
{
|
||||
lineReviews = reviews[line];
|
||||
for(var i in lineReviews) createReview(lineReviews[i], line);
|
||||
if(line)
|
||||
{
|
||||
lineReviews = reviews[line];
|
||||
for(var i in lineReviews) createReview(lineReviews[i], line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setTimeout(anchor, 200);
|
||||
setTimeout(anchor, 200);
|
||||
|
||||
$(document).on('click', function()
|
||||
{
|
||||
$('.highlight').removeClass('highlight');
|
||||
});
|
||||
|
||||
/**
|
||||
* Anchor
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function anchor()
|
||||
{
|
||||
var hash = window.location.hash;
|
||||
if(!hash) return false;
|
||||
|
||||
var line = hash.substr(1).replace('L', '');
|
||||
var $row = $('.diff tr[data-line="' + line +'"]').first();
|
||||
if($row.length) return false;
|
||||
|
||||
var anchor = $row.offset().top;
|
||||
$('body,html').animate({scrollTop:anchor - 50}, 500);
|
||||
|
||||
$row.addClass('highlight');
|
||||
if($row.hasClass('commented'))
|
||||
$(document).on('click', function()
|
||||
{
|
||||
toggleComment($row, true);
|
||||
var $commentRow = $row.next('tr');
|
||||
if($commentRow.hasClass('comment-row')) $commentRow.addClass('highlight');
|
||||
$('.highlight').removeClass('highlight');
|
||||
});
|
||||
|
||||
/**
|
||||
* Anchor
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function anchor()
|
||||
{
|
||||
var hash = window.location.hash;
|
||||
if(!hash) return false;
|
||||
|
||||
var line = hash.substr(1).replace('L', '');
|
||||
var $row = $('.diff tr[data-line="' + line +'"]').first();
|
||||
if($row.length) return false;
|
||||
|
||||
var anchor = $row.offset().top;
|
||||
$('body,html').animate({scrollTop:anchor - 50}, 500);
|
||||
|
||||
$row.addClass('highlight');
|
||||
if($row.hasClass('commented'))
|
||||
{
|
||||
toggleComment($row, true);
|
||||
var $commentRow = $row.next('tr');
|
||||
if($commentRow.hasClass('comment-row')) $commentRow.addClass('highlight');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/sortable.html.php';?>
|
||||
<?php include '../../common/view/tablesorter.html.php';?>
|
||||
<?php
|
||||
$browser = helper::getBrowser();
|
||||
js::set('browser', $browser);
|
||||
?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php common::printBack(inlink('browse'), 'btn btn-primary');?>
|
||||
@@ -30,6 +34,7 @@
|
||||
<li><?php echo html::a(inlink('link', "MRID={$MR->id}&type=bug"), html::icon($lang->icons['bug'], 'text-red') . ' ' . $lang->productplan->linkedBugs);?></a></li>
|
||||
<li><?php echo html::a(inlink('link', "MRID={$MR->id}&type=task"), html::icon('todo', 'text-info') . ' ' . $lang->mr->linkedTasks);?></a></li>
|
||||
</ul>
|
||||
<?php if($browser == 'ie'):?>
|
||||
<div class='tab-content'>
|
||||
<?php include '../../common/view/form.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
@@ -150,6 +155,18 @@
|
||||
</form>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<?php
|
||||
if(empty($diffs))
|
||||
{
|
||||
echo "<p class='detail-content'>{$lang->mr->noChanges}</p>";
|
||||
}
|
||||
else
|
||||
{
|
||||
include '../../repo/view/diffeditor.html.php';
|
||||
}
|
||||
?>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<li><?php echo html::a(inlink('diff', "MRID={$MR->id}"), $lang->mr->viewDiff);?></li>
|
||||
<li class='<?php if($type == 'story') echo 'active'?>'><a href='#stories' data-toggle='tab'><?php echo html::icon($lang->icons['story'], 'text-primary') . ' ' . $lang->productplan->linkedStories;?></a></li>
|
||||
<li class='<?php if($type == 'bug') echo 'active'?>'><a href='#bugs' data-toggle='tab'><?php echo html::icon($lang->icons['bug'], 'text-red') . ' ' . $lang->productplan->linkedBugs;?></a></li>
|
||||
<li class='<?php if($type == 'task') echo 'active'?>'><a href='#tasks' data-toggle='tab'><?php echo html::icon('todo', 'text-info') . ' ' . $lang->mr->linkedTasks;?></a></li>
|
||||
<li class='<?php if($type == 'task') echo 'active'?>'><a href='#tasks' data-toggle='tab'><?php echo html::icon('check-sign', 'text-info') . ' ' . $lang->mr->linkedTasks;?></a></li>
|
||||
</ul>
|
||||
<div class='tab-content'>
|
||||
<div id='stories' class='tab-pane <?php if($type == 'story') echo 'active'?>'>
|
||||
|
||||
@@ -244,7 +244,7 @@ class productplan extends control
|
||||
if($this->post->comments)
|
||||
{
|
||||
$allChanges = $this->productplan->batchChangeStatus($status);
|
||||
return print(js::locate(inlink('browse', "product=$productID"), 'parent'));
|
||||
return print(js::locate(inlink('browse', "product=$productID")));
|
||||
}
|
||||
|
||||
$plans = $this->dao->select('*')->from(TABLE_PRODUCTPLAN)->where('id')->in($planIDList)->fetchAll('id');
|
||||
|
||||
@@ -200,5 +200,13 @@ $config->project->noSprintPriv['auditplan'] = array('browse', 'create', 'edit',
|
||||
$config->project->includedPriv = $config->project->noSprintPriv;
|
||||
$config->project->includedPriv['project'][] = 'execution';
|
||||
$config->project->includedPriv['task'] = array('create');
|
||||
$config->project->includedPriv['story'] = array('create', 'batchCreate', 'edit', 'export', 'delete', 'view', 'change', 'review', 'batchReview', 'recall', 'close', 'batchClose', 'batchChangePlan', 'batchChangeStage', 'assignTo', 'batchAssignTo', 'activate', 'zeroCase', 'batchEdit', 'import', 'showImport', 'exportTemplate', 'importToLib', 'batchImportToLib', 'relation', 'browse');
|
||||
$config->project->includedPriv['bug'] = array('create', 'confirmBug', 'view', 'edit', 'assignTo', 'batchAssignTo', 'resolve', 'activate', 'close', 'export', 'confirmStoryChange', 'delete', 'linkBugs', 'import', 'showImport', 'exportTemplate');
|
||||
$config->project->includedPriv['testcase'] = array('groupCase', 'create', 'batchCreate', 'createBug', 'view', 'edit', 'delete', 'export', 'confirmChange', 'confirmStoryChange', 'batchEdit', 'batchDelete', 'linkCases', 'bugs', 'review', 'batchReview', 'batchConfirmStoryChange', 'importFromLib', 'batchCaseTypeChange', 'exportTemplate', 'import', 'showImport', 'confirmLibcaseChange', 'ignoreLibcaseChange', 'submit');
|
||||
$config->project->includedPriv['testtask'] = array('create', 'cases', 'groupCase', 'edit', 'delete', 'batchAssign', 'linkcase', 'unlinkcase', 'runcase', 'results', 'batchUnlinkCases', 'report', 'browseUnits', 'unitCases', 'importUnitResult', 'batchRun', 'runDeployCase', 'deployCaseResults');
|
||||
$config->project->includedPriv['doc'] = array('createLib', 'editLib', 'deleteLib', 'create', 'edit', 'delete', 'deleteFile', 'allLibs', 'objectLibs', 'collect', 'tableContents', 'showFiles', 'diff', 'manageBook', 'importToPracticeLib', 'importToComponentLib');
|
||||
$config->project->includedPriv['repo'] = array('create', 'showSyncCommit', 'browse', 'view', 'diff', 'log', 'revision', 'blame', 'download', 'apiGetRepoByUrl', 'review', 'addBug', 'deleteBug', 'addComment', 'editComment', 'deleteComment');
|
||||
$config->project->includedPriv['testreport'] = array('create', 'view', 'delete', 'edit', 'export');
|
||||
$config->project->includedPriv['auditplan'] = array('browse', 'create', 'edit', 'batchCreate', 'batchCheck', 'check', 'nc', 'result', 'assignTo');
|
||||
$config->project->includedPriv['execution'] = array('create', 'start', 'delete', 'calendar', 'effortCalendar', 'effort', 'taskEffort', 'computeTaskEffort', 'deleterelation', 'maintainrelation', 'relation', 'gantt');
|
||||
if($config->edition != 'max') $config->project->includedPriv['stakeholder'] = array('browse', 'create', 'batchCreate', 'edit', 'delete', 'view', 'communicate', 'expect', 'expectation', 'deleteExpect', 'createExpect', 'editExpect', 'viewExpect');
|
||||
|
||||
@@ -1333,7 +1333,7 @@ class project extends control
|
||||
$hasProduct = $this->dao->findByID($projectID)->from(TABLE_PROJECT)->fetch('hasProduct');
|
||||
if($hasProduct) $this->lang->modulePageNav = $this->product->select($products, $productID, 'project', 'testcase', $extra, $branch);
|
||||
|
||||
echo $this->fetch('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&orderBy=$orderBy&recTotal=$orderBy&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID");
|
||||
echo $this->fetch('testcase', 'browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=$param&caseType=&orderBy=$orderBy&recTotal=$orderBy&recPerPage=$recPerPage&pageID=$pageID&projectID=$projectID");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -26,6 +26,7 @@ $config->repo->syncTime = 10;
|
||||
$config->repo->batchNum = 100;
|
||||
$config->repo->images = '|png|gif|jpg|ico|jpeg|bmp|';
|
||||
$config->repo->binary = '|pdf|';
|
||||
$config->repo->synced = '';
|
||||
|
||||
$config->repo->editor = new stdclass();
|
||||
$config->repo->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
@@ -70,3 +71,70 @@ $config->repo->rules['mark']['consumed'] = ':';
|
||||
$config->repo->rules['mark']['left'] = ':';
|
||||
$config->repo->rules['unit']['consumed'] = 'h';
|
||||
$config->repo->rules['unit']['left'] = 'h';
|
||||
|
||||
$config->repo->fileExt["abap"] = array('.abap');
|
||||
$config->repo->fileExt["apex"] = array('.cls');
|
||||
$config->repo->fileExt["azcli"] = array('.azcli');
|
||||
$config->repo->fileExt["bat"] = array('.bat', '.cmd');
|
||||
$config->repo->fileExt["c"] = array('.c', '.h');
|
||||
$config->repo->fileExt["cameligo"] = array('.mligo');
|
||||
$config->repo->fileExt["clojure"] = array('.clj', '.cljs', '.cljc', '.edn');
|
||||
$config->repo->fileExt["coffeescript"] = array('.coffee');
|
||||
$config->repo->fileExt["cpp"] = array('.cpp', '.cc', '.cxx', '.hpp', '.hh', '.hxx');
|
||||
$config->repo->fileExt["csharp"] = array('.cs', '.csx', '.cake');
|
||||
$config->repo->fileExt["css"] = array('.css');
|
||||
$config->repo->fileExt["dart"] = array('.dart');
|
||||
$config->repo->fileExt["dockerfile"] = array('.dockerfile');
|
||||
$config->repo->fileExt["ecl"] = array('.ecl');
|
||||
$config->repo->fileExt["fsharp"] = array('.fs', '.fsi', '.ml', '.mli', '.fsx', '.fsscript');
|
||||
$config->repo->fileExt["go"] = array('.go');
|
||||
$config->repo->fileExt["graphql"] = array('.graphql', '.gql');
|
||||
$config->repo->fileExt["handlebars"] = array('.handlebars', '.hbs');
|
||||
$config->repo->fileExt["hcl"] = array('.tf', '.tfvars', '.hcl');
|
||||
$config->repo->fileExt["html"] = array('.html', '.htm', '.shtml', '.xhtml', '.mdoc', '.jsp', '.asp', '.aspx', '.jshtm');
|
||||
$config->repo->fileExt["ini"] = array('.ini', '.properties', '.gitconfig');
|
||||
$config->repo->fileExt["java"] = array('.java', '.jav');
|
||||
$config->repo->fileExt["javascript"] = array('.js', '.es6', '.jsx', '.mjs');
|
||||
$config->repo->fileExt["julia"] = array('.jl');
|
||||
$config->repo->fileExt["kotlin"] = array('.kt');
|
||||
$config->repo->fileExt["less"] = array('.less');
|
||||
$config->repo->fileExt["lexon"] = array('.lex');
|
||||
$config->repo->fileExt["lua"] = array('.lua');
|
||||
$config->repo->fileExt["m3"] = array('.m3', '.i3', '.mg', '.ig');
|
||||
$config->repo->fileExt["markdown"] = array('.md', '.markdown', '.mdown', '.mkdn', '.mkd', '.mdwn', '.mdtxt', '.mdtext');
|
||||
$config->repo->fileExt["mips"] = array('.s');
|
||||
$config->repo->fileExt["msdax"] = array('.dax', '.msdax');
|
||||
$config->repo->fileExt["objective-c"] = array('.m');
|
||||
$config->repo->fileExt["pascal"] = array('.pas', '.p', '.pp');
|
||||
$config->repo->fileExt["pascaligo"] = array('.ligo');
|
||||
$config->repo->fileExt["perl"] = array('.pl');
|
||||
$config->repo->fileExt["php"] = array('.php', '.php4', '.php5', '.phtml', '.ctp');
|
||||
$config->repo->fileExt["postiats"] = array('.dats', '.sats', '.hats');
|
||||
$config->repo->fileExt["powerquery"] = array('.pq', '.pqm');
|
||||
$config->repo->fileExt["powershell"] = array('.ps1', '.psm1', '.psd1');
|
||||
$config->repo->fileExt["pug"] = array('.jade', '.pug');
|
||||
$config->repo->fileExt["python"] = array('.py', '.rpy', '.pyw', '.cpy', '.gyp', '.gypi');
|
||||
$config->repo->fileExt["r"] = array('.r', '.rhistory', '.rmd', '.rprofile', '.rt');
|
||||
$config->repo->fileExt["razor"] = array('.cshtml');
|
||||
$config->repo->fileExt["redis"] = array('.redis');
|
||||
$config->repo->fileExt["restructuredtext"] = array('.rst');
|
||||
$config->repo->fileExt["ruby"] = array('.rb', '.rbx', '.rjs', '.gemspec', '.pp');
|
||||
$config->repo->fileExt["rust"] = array('.rs', '.rlib');
|
||||
$config->repo->fileExt["sb"] = array('.sb');
|
||||
$config->repo->fileExt["scala"] = array('.scala', '.sc', '.sbt');
|
||||
$config->repo->fileExt["scheme"] = array('.scm', '.ss', '.sch', '.rkt');
|
||||
$config->repo->fileExt["scss"] = array('.scss');
|
||||
$config->repo->fileExt["shell"] = array('.sh', '.bash');
|
||||
$config->repo->fileExt["sophia"] = array('.aes');
|
||||
$config->repo->fileExt["sol"] = array('.sol');
|
||||
$config->repo->fileExt["sql"] = array('.sql');
|
||||
$config->repo->fileExt["st"] = array('.st', '.iecst', '.iecplc', '.lc3lib');
|
||||
$config->repo->fileExt["swift"] = array('.swift');
|
||||
$config->repo->fileExt["systemverilog"] = array('.sv', '.svh');
|
||||
$config->repo->fileExt["tcl"] = array('.tcl');
|
||||
$config->repo->fileExt["twig"] = array('.twig');
|
||||
$config->repo->fileExt["typescript"] = array('.ts', '.tsx');
|
||||
$config->repo->fileExt["vb"] = array('.vb');
|
||||
$config->repo->fileExt["verilog"] = array('.v', '.vh');
|
||||
$config->repo->fileExt["xml"] = array('.xml', '.dtd', '.ascx', '.csproj', '.config', '.wxi', '.wxl', '.wxs', '.xaml', '.svg', '.svgz', '.opf', '.xsl');
|
||||
$config->repo->fileExt["yaml"] = array('.yaml', '.yml');
|
||||
|
||||
+583
-50
@@ -260,6 +260,153 @@ class repo extends control
|
||||
return print(js::reload('parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get diff editor content by ajax.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param int $objectID
|
||||
* @param string $entry
|
||||
* @param string $oldRevision
|
||||
* @param string $newRevision
|
||||
* @param string $showBug
|
||||
* @param string $encoding
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetDiffEditorContent($repoID, $objectID = 0, $entry = '', $oldRevision = '', $newRevision = '', $showBug = 'false', $encoding = '')
|
||||
{
|
||||
$file = $entry;
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$entry = urldecode($this->repo->decodePath($entry));
|
||||
$revision = str_replace('*', '-', $oldRevision);
|
||||
$nRevision = str_replace('*', '-', $newRevision);
|
||||
|
||||
$entry = urldecode($entry);
|
||||
$pathInfo = pathinfo($entry);
|
||||
$encoding = empty($encoding) ? $repo->encoding : $encoding;
|
||||
$encoding = strtolower(str_replace('_', '-', $encoding));
|
||||
|
||||
$this->scm->setEngine($repo);
|
||||
$info = $this->scm->info($entry, $nRevision);
|
||||
$path = $entry ? $info->path : '';
|
||||
|
||||
$this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->diff;
|
||||
$this->view->type = 'diff';
|
||||
$this->view->encoding = str_replace('-', '_', $encoding);
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->objectID = $objectID;
|
||||
$this->view->repo = $repo;
|
||||
$this->view->revision = $nRevision;
|
||||
$this->view->oldRevision = $revision;
|
||||
$this->view->file = $file;
|
||||
$this->view->entry = $entry;
|
||||
$this->view->info = $info;
|
||||
$this->view->content = '';
|
||||
$this->view->pathInfo = $pathInfo;
|
||||
$this->view->suffix = 'c';
|
||||
$this->view->blames = array();
|
||||
$this->view->showEditor = true;
|
||||
$this->display('repo', 'ajaxGetEditorContent');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get editor content by ajax.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param int $objectID
|
||||
* @param string $entry
|
||||
* @param string $revision
|
||||
* @param string $showBug
|
||||
* @param string $encoding
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetEditorContent($repoID, $objectID = 0, $entry = '', $revision = 'HEAD', $showBug = 'false', $encoding = '')
|
||||
{
|
||||
$file = $entry;
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$entry = urldecode($this->repo->decodePath($entry));
|
||||
$revision = str_replace('*', '-', $revision);
|
||||
|
||||
$this->scm->setEngine($repo);
|
||||
$info = $this->scm->info($entry, $revision);
|
||||
$path = $entry ? $info->path : '';
|
||||
if($info->kind == 'dir') $this->locate($this->repo->createLink('browse', "repoID=$repoID&branchID=&objectID=$objectID&path=" . $this->repo->encodePath($path) . "&revision=$revision"));
|
||||
$content = $this->scm->cat($entry, $revision);
|
||||
$entry = urldecode($entry);
|
||||
$pathInfo = pathinfo($entry);
|
||||
$encoding = empty($encoding) ? $repo->encoding : $encoding;
|
||||
$encoding = strtolower(str_replace('_', '-', $encoding));
|
||||
|
||||
$suffix = '';
|
||||
if(isset($pathInfo["extension"])) $suffix = strtolower($pathInfo["extension"]);
|
||||
if(!$suffix or (!array_key_exists($suffix, $this->config->program->suffix) and strpos($this->config->repo->images, "|$suffix|") === false)) $suffix = $this->repo->isBinary($content, $suffix) ? 'binary' : 'c';
|
||||
|
||||
if(strpos($this->config->repo->images, "|$suffix|") !== false)
|
||||
{
|
||||
$content = base64_encode($content);
|
||||
}
|
||||
elseif($encoding != 'utf-8')
|
||||
{
|
||||
$content = helper::convertEncoding($content, $encoding);
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->view;
|
||||
$this->view->type = 'view';
|
||||
$this->view->showBug = $showBug;
|
||||
$this->view->encoding = str_replace('-', '_', $encoding);
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->branchID = $this->cookie->repoBranch;
|
||||
$this->view->objectID = $objectID;
|
||||
$this->view->repo = $repo;
|
||||
$this->view->revision = $revision;
|
||||
$this->view->oldRevision = '';
|
||||
$this->view->file = $file;
|
||||
$this->view->entry = $entry;
|
||||
$this->view->path = $entry;
|
||||
$this->view->info = $info;
|
||||
$this->view->suffix = $suffix;
|
||||
$this->view->content = $content ? $content : '';
|
||||
$this->view->pathInfo = $pathInfo;
|
||||
$this->view->showEditor = (strpos($this->config->repo->images, "|$suffix|") === false and $suffix != 'binary') ? true : false;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* View repo file with monaco editor.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param int $objectID
|
||||
* @param string $entry
|
||||
* @param string $revision
|
||||
* @param string $showBug
|
||||
* @param string $encoding
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function monaco($repoID, $objectID = 0, $entry = '', $revision = 'HEAD', $showBug = 'false', $encoding = '')
|
||||
{
|
||||
$file = $entry;
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$entry = $this->repo->decodePath($entry);
|
||||
$entry = urldecode($entry);
|
||||
$pathInfo = pathinfo($entry);
|
||||
|
||||
$this->view->title = $this->lang->repo->common . $this->lang->colon . $this->lang->repo->view;
|
||||
$this->view->type = 'view';
|
||||
$this->view->branchID = $this->cookie->repoBranch;
|
||||
$this->view->showBug = $showBug;
|
||||
$this->view->encoding = $encoding;
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->objectID = $objectID;
|
||||
$this->view->repo = $repo;
|
||||
$this->view->revision = $revision;
|
||||
$this->view->file = $file;
|
||||
$this->view->entry = $entry;
|
||||
$this->view->pathInfo = $pathInfo;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* View repo file.
|
||||
*
|
||||
@@ -274,10 +421,14 @@ class repo extends control
|
||||
*/
|
||||
public function view($repoID, $objectID = 0, $entry = '', $revision = 'HEAD', $showBug = 'false', $encoding = '')
|
||||
{
|
||||
$browser = helper::getBrowser();
|
||||
if($this->get->repoPath) $entry = $this->get->repoPath;
|
||||
$this->repo->setBackSession('view', $withOtherModule = true);
|
||||
if($repoID == 0) $repoID = $this->session->repoID;
|
||||
|
||||
$this->commonAction($repoID, $objectID);
|
||||
if($browser['name'] != 'ie') return print($this->fetch('repo', 'monaco', "repoID=$repoID&objectID=$objectID&entry=$entry&revision=$revision&showBug=$showBug&encoding=$encoding"));
|
||||
|
||||
if($_POST)
|
||||
{
|
||||
$oldRevision = isset($this->post->revision[1]) ? $this->post->revision[1] : '';
|
||||
@@ -286,8 +437,6 @@ class repo extends control
|
||||
$this->locate($this->repo->createLink('diff', "repoID=$repoID&objectID=$objectID&entry=$entry&oldrevision=$oldRevision&newRevision=$newRevision"));
|
||||
}
|
||||
|
||||
$this->commonAction($repoID, $objectID);
|
||||
|
||||
$file = $entry;
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$entry = $this->repo->decodePath($entry);
|
||||
@@ -427,10 +576,8 @@ class repo extends control
|
||||
$this->repo->setRepoBranch('');
|
||||
}
|
||||
|
||||
/* Decrypt path and get cacheFile. */
|
||||
$path = $this->repo->decodePath($path);
|
||||
$cacheFile = $this->repo->getCacheFile($repoID, $path, $revision);
|
||||
$this->scm->setEngine($repo);
|
||||
/* Decrypt path. */
|
||||
$path = $this->repo->decodePath($path);
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -444,58 +591,29 @@ class repo extends control
|
||||
$this->locate($this->repo->createLink('diff', "repoID=$repoID&objectID=$objectID&entry=" . $this->repo->encodePath($path) . "&oldrevision=$oldRevision&newRevision=$newRevision"));
|
||||
}
|
||||
|
||||
/* Cache infos. */
|
||||
if($refresh or !$cacheFile or !file_exists($cacheFile) or (time() - filemtime($cacheFile)) / 60 > $this->config->repo->cacheTime)
|
||||
/* Refresh repo. */
|
||||
if($refresh)
|
||||
{
|
||||
/* Get cache infos. */
|
||||
$infos = $this->scm->ls($path, $revision);
|
||||
/* Update code commit history. */
|
||||
$commentGroup = $this->loadModel('job')->getTriggerGroup('commit', array($repo->id));
|
||||
|
||||
if($infos)
|
||||
if(in_array($repo->SCM, $this->config->repo->gitTypeList))
|
||||
{
|
||||
/* Update code commit history. */
|
||||
$commentGroup = $this->loadModel('job')->getTriggerGroup('commit', array($repo->id));
|
||||
|
||||
if($refresh and in_array($repo->SCM, $this->config->repo->gitTypeList))
|
||||
{
|
||||
$branch = $this->cookie->repoBranch;
|
||||
$this->loadModel('git')->updateCommit($repo, $commentGroup, false);
|
||||
$_COOKIE['repoBranch'] = $branch;
|
||||
}
|
||||
if($refresh and $repo->SCM == 'Subversion') $this->loadModel('svn')->updateCommit($repo, $commentGroup, false);
|
||||
|
||||
$revisionList = array();
|
||||
foreach($infos as $info) $revisionList[$info->revision] = $info->revision;
|
||||
$comments = $this->repo->getHistory($repoID, $revisionList);
|
||||
foreach($infos as $info)
|
||||
{
|
||||
if(isset($comments[$info->revision]))
|
||||
{
|
||||
$comment = $comments[$info->revision];
|
||||
$info->comment = $comment->comment;
|
||||
}
|
||||
}
|
||||
$branch = $this->cookie->repoBranch;
|
||||
$this->loadModel('git')->updateCommit($repo, $commentGroup, false);
|
||||
$_COOKIE['repoBranch'] = $branch;
|
||||
}
|
||||
|
||||
if($cacheFile)
|
||||
{
|
||||
if(!file_exists($cacheFile . '.lock'))
|
||||
{
|
||||
touch($cacheFile . '.lock');
|
||||
file_put_contents($cacheFile, serialize($infos));
|
||||
unlink($cacheFile . '.lock');
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$infos = unserialize(file_get_contents($cacheFile));
|
||||
if($repo->SCM == 'Subversion') $this->loadModel('svn')->updateCommit($repo, $commentGroup, false);
|
||||
}
|
||||
|
||||
/* Get files info. */
|
||||
$infos = $this->repo->getFileCommits($repo, $branchID, $path);
|
||||
if($this->cookie->repoRefresh) setcookie('repoRefresh', 0, 0, $this->config->webRoot, '', $this->config->cookieSecure, true);
|
||||
|
||||
/* Set logType and revisions. */
|
||||
$logType = 'dir';
|
||||
$revisions = $this->repo->getCommits($repo, $path, $revision, $logType, $pager);
|
||||
$logType = 'dir';
|
||||
$revisions = $this->repo->getCommits($repo, $path, $revision, $logType, $pager);
|
||||
$lastRevision = current($revisions);
|
||||
|
||||
/* Synchronous commit only in root path. */
|
||||
if(in_array($repo->SCM, $this->config->repo->gitTypeList) and empty($path) and $infos and empty($revisions)) $this->locate($this->repo->createLink('showSyncCommit', "repoID=$repoID&objectID=$objectID&branch=" . helper::safe64Encode(base64_encode($this->cookie->repoBranch))));
|
||||
@@ -518,8 +636,9 @@ class repo extends control
|
||||
$this->view->path = urldecode($path);
|
||||
$this->view->logType = $logType;
|
||||
$this->view->cloneUrl = $this->repo->getCloneUrl($repo);
|
||||
$this->view->cacheTime = date('m-d H:i', filemtime($cacheFile));
|
||||
$this->view->cacheTime = date('m-d H:i', strtotime($lastRevision->time));
|
||||
$this->view->branchOrTag = $branchOrTag;
|
||||
$this->view->syncedRF = strpos(",{$this->config->repo->synced},", ",$repoID,") !== false; //Check has synced rename files.
|
||||
|
||||
$this->display();
|
||||
}
|
||||
@@ -949,6 +1068,292 @@ class repo extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Link story to commit.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $revision
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkStory($repoID, $revision, $browseType = '', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
if(!empty($_POST['stories']))
|
||||
{
|
||||
$this->repo->link($repoID, $revision, 'story');
|
||||
|
||||
if(dao::isError()) return print(js::error(dao::getError()));
|
||||
return print(js::closeModal('parent', '', "parent.parent[parent.parent.length - 2].getRelation('$revision')"));
|
||||
}
|
||||
|
||||
$this->loadModel('story');
|
||||
$this->app->loadLang('productplan');
|
||||
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$product = $this->loadModel('product')->getById($repo->product);
|
||||
$modules = $this->loadModel('tree')->getOptionMenu($repo->product, 'story');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Build search form. */
|
||||
unset($this->lang->story->statusList['closed']);
|
||||
$storyStatusList = $this->lang->story->statusList;
|
||||
$queryID = $browseType == 'bySearch' ? (int)$param : 0;
|
||||
|
||||
unset($this->config->product->search['fields']['product']);
|
||||
$this->config->product->search['actionURL'] = $this->createLink('repo', 'linkStory', "repoID=$repoID&revision=$revision&browseType=bySearch&queryID=myQueryID");
|
||||
$this->config->product->search['queryID'] = $queryID;
|
||||
$this->config->product->search['style'] = 'simple';
|
||||
$this->config->product->search['params']['plan']['values'] = $this->loadModel('productplan')->getForProducts(array($product->id => $product->id));
|
||||
$this->config->product->search['params']['module']['values'] = $modules;
|
||||
$this->config->product->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => $storyStatusList);
|
||||
|
||||
if($product->type == 'normal')
|
||||
{
|
||||
unset($this->config->product->search['fields']['branch']);
|
||||
unset($this->config->product->search['params']['branch']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config->product->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$this->config->product->search['params']['branch']['values'] = array('' => '') + $this->loadModel('branch')->getPairs($product->id, 'noempty');
|
||||
}
|
||||
|
||||
session_start();
|
||||
$this->loadModel('search')->setSearchParams($this->config->product->search);
|
||||
session_write_close();
|
||||
|
||||
$linkedStories = $this->repo->getRelationByCommit($repoID, $revision, 'story');
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$allStories = $this->story->getBySearch($product->id, 0, $queryID, 'id', '', 'story', array_keys($linkedStories), $pager);
|
||||
}
|
||||
else
|
||||
{
|
||||
$allStories = $this->story->getProductStories($product->id, 0, '0', 'draft,active,changed', 'story', 'id_desc', false, array_keys($linkedStories), $pager);
|
||||
}
|
||||
|
||||
$this->view->modules = $modules;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->allStories = $allStories;
|
||||
$this->view->product = $product;
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->revision = $revision;
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->param = $param;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Link bug to commit.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $revision
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkBug($repoID, $revision = '', $browseType = '', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
if(!empty($_POST['bugs']))
|
||||
{
|
||||
$this->repo->link($repoID, $revision, 'bug');
|
||||
|
||||
if(dao::isError()) return print(js::error(dao::getError()));
|
||||
return print(js::closeModal('parent', '', "parent.parent[parent.parent.length - 2].getRelation('$revision')"));
|
||||
}
|
||||
|
||||
$this->loadModel('bug');
|
||||
$this->app->loadLang('productplan');
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$product = $this->loadModel('product')->getById($repo->product);
|
||||
$modules = $this->loadModel('tree')->getOptionMenu($product->id, 'bug');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Build search form. */
|
||||
$this->config->bug->search['actionURL'] = $this->createLink('repo', 'linkBug', "repoID=$repoID&revision=$revision&browseType=bySearch&queryID=myQueryID");
|
||||
$this->config->bug->search['queryID'] = $queryID;
|
||||
$this->config->bug->search['style'] = 'simple';
|
||||
$this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getForProducts(array($product->id => $product->id));
|
||||
$this->config->bug->search['params']['module']['values'] = $modules;
|
||||
$this->config->bug->search['params']['execution']['values'] = $this->product->getExecutionPairsByProduct($product->id);
|
||||
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getBuildPairs($product->id, $branch = 'all', $params = '');
|
||||
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->loadModel('build')->getBuildPairs($product->id, $branch = 'all', $params = '');
|
||||
|
||||
unset($this->config->bug->search['fields']['product']);
|
||||
if($product->type == 'normal')
|
||||
{
|
||||
unset($this->config->bug->search['fields']['branch']);
|
||||
unset($this->config->bug->search['params']['branch']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config->bug->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$this->config->bug->search['params']['branch']['values'] = array('' => '') + $this->loadModel('branch')->getPairs($product->id, 'noempty');
|
||||
}
|
||||
session_start();
|
||||
$this->loadModel('search')->setSearchParams($this->config->bug->search);
|
||||
session_write_close();
|
||||
|
||||
$linkedBugs = $this->repo->getRelationByCommit($repoID, $revision, 'bug');
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$allBugs = $this->bug->getBySearch($product->id, 0, $queryID, 'id_desc', array_keys($linkedBugs), $pager);
|
||||
}
|
||||
else
|
||||
{
|
||||
$allBugs = $this->bug->getActiveBugs($product->id, 0, '0', array_keys($linkedBugs), $pager);
|
||||
}
|
||||
|
||||
$this->view->modules = $modules;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->allBugs = $allBugs;
|
||||
$this->view->product = $product;
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->revision = $revision;
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->param = $param;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Link task to commit.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $revision
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkTask($repoID, $revision = '', $browseType = 'unclosed', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
if(!empty($_POST['tasks']))
|
||||
{
|
||||
$this->repo->link($repoID, $revision, 'task');
|
||||
|
||||
if(dao::isError()) return print(js::error(dao::getError()));
|
||||
return print(js::closeModal('parent', '', "parent.parent[parent.parent.length - 2].getRelation('$revision')"));
|
||||
}
|
||||
|
||||
$this->loadModel('execution');
|
||||
$this->loadModel('product');
|
||||
$this->app->loadLang('task');
|
||||
|
||||
/* Set browse type. */
|
||||
$browseType = strtolower($browseType);
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$product = $this->loadModel('product')->getById($repo->product);
|
||||
$modules = $this->loadModel('tree')->getOptionMenu($product->id, $viewType = 'task');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Build search form. */
|
||||
$this->config->execution->search['actionURL'] = $this->createLink('repo', 'linkTask', "repoID=$repoID&revision=$revision&browseType=bySearch&queryID=myQueryID", '', true);
|
||||
$this->config->execution->search['queryID'] = $queryID;
|
||||
$this->config->execution->search['style'] = 'simple';
|
||||
$this->config->execution->search['params']['module']['values'] = $modules;
|
||||
$this->config->execution->search['params']['execution']['values'] = $this->product->getExecutionPairsByProduct($product->id);
|
||||
|
||||
/* Get executions by product. */
|
||||
$productExecutions = $this->product->getExecutionPairsByProduct($product->id);
|
||||
$productExecutionIDs = array_filter(array_keys($productExecutions));
|
||||
$this->config->execution->search['params']['execution']['values'] = array_filter($productExecutions);
|
||||
|
||||
session_start();
|
||||
$this->loadModel('search')->setSearchParams($this->config->execution->search);
|
||||
session_write_close();
|
||||
|
||||
/* Get tasks by executions. */
|
||||
$allTasks = array();
|
||||
foreach($productExecutionIDs as $productExecutionID)
|
||||
{
|
||||
$tasks = $this->execution->getTasks(0, $productExecutionID, array(), $browseType, $queryID, 0, $orderBy, null);
|
||||
$allTasks = array_merge($tasks, $allTasks);
|
||||
}
|
||||
|
||||
/* Filter linked tasks. */
|
||||
$linkedTasks = $this->repo->getRelationByCommit($repoID, $revision, 'task');
|
||||
$linkedTaskIDs = array_keys($linkedTasks);
|
||||
foreach($allTasks as $key => $task)
|
||||
{
|
||||
if(in_array($task->id, $linkedTaskIDs)) unset($allTasks[$key]);
|
||||
}
|
||||
|
||||
/* Page the records. */
|
||||
$pager->setRecTotal(count($allTasks));
|
||||
$pager->setPageTotal();
|
||||
if($pager->pageID > $pager->pageTotal) $pager->setPageID($pager->pageTotal);
|
||||
$count = 1;
|
||||
$limitMin = ($pager->pageID - 1) * $pager->recPerPage;
|
||||
$limitMax = $pager->pageID * $pager->recPerPage;
|
||||
foreach($allTasks as $key => $task)
|
||||
{
|
||||
if($count <= $limitMin or $count > $limitMax) unset($allTasks[$key]);
|
||||
$count ++;
|
||||
}
|
||||
|
||||
$this->view->modules = $modules;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->allTasks = $allTasks;
|
||||
$this->view->product = $product;
|
||||
$this->view->repoID = $repoID;
|
||||
$this->view->revision = $revision;
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->param = $param;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->pager = $pager;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlink object and commit revision.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $revision
|
||||
* @param string $objectType story|task|bug
|
||||
* @param int $objectID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function unlink($repoID, $revision, $objectType, $objectID)
|
||||
{
|
||||
$this->repo->unlink($repoID, $revision, $objectType, $objectID);
|
||||
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
return $this->send(array('result' => 'success', 'revision' => $revision));
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax sync comment.
|
||||
*
|
||||
@@ -1483,4 +1888,132 @@ class repo extends control
|
||||
|
||||
$this->locate($url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax get branches and tags.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $oldRevision
|
||||
* @param string $newRevision
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetBranchesAndTags($repoID, $oldRevision = '0', $newRevision = 'HEAD')
|
||||
{
|
||||
$branchesAndTags = $this->repo->getBranchesAndTags($repoID, $oldRevision, $newRevision);
|
||||
return print(json_encode($branchesAndTags));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get file tree by ajax.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $branch
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function ajaxGetFileTree($repoID, $branch = '')
|
||||
{
|
||||
$branch = base64_decode($branch);
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
$files = $this->repo->getFileTree($repo, $branch);
|
||||
return print($files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax sync rename record.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxSyncRenameRecord($repoID)
|
||||
{
|
||||
$this->repo->insertDeleteRecord($repoID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get relation by commit.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $commit
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function ajaxGetCommitRelation($repoID, $commit)
|
||||
{
|
||||
$titleList = $this->repo->getRelationByCommit($repoID, $commit);
|
||||
return $this->send(array('titleList' => $titleList));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get relation story, task, bug info.
|
||||
*
|
||||
* @param int $objectID
|
||||
* @param string $objectType
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetRelationInfo($objectID, $objectType = 'story')
|
||||
{
|
||||
$this->app->loadLang('release');
|
||||
$this->view->object = $this->loadModel($objectType)->getById($objectID);
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->actions = $this->loadModel('action')->getList($objectType, $objectID);
|
||||
$this->view->objectID = $objectID;
|
||||
$this->view->objectType = $objectType;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax get commit info.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetCommitInfo()
|
||||
{
|
||||
$line = $this->post->line;
|
||||
$repo = $this->repo->getRepoByID($this->post->repoID);
|
||||
$entry = $this->repo->decodePath($this->post->entry);
|
||||
$revision = $this->post->revision;
|
||||
$returnType = $this->post->returnType ? $this->post->returnType : 'view';
|
||||
|
||||
$this->scm->setEngine($repo);
|
||||
$blames = $this->scm->blame($entry, $this->post->revision);
|
||||
if(!$blames) $blames =$this->scm->blame($entry, $this->post->sourceRevision);
|
||||
|
||||
while($line > 0)
|
||||
{
|
||||
if(isset($blames[$line]['revision']))
|
||||
{
|
||||
$revision = $blames[$line]['revision'];
|
||||
break;
|
||||
}
|
||||
$line--;
|
||||
}
|
||||
if($returnType == 'json') return $this->send(array('result' => 'success', 'blames' => $blames));
|
||||
|
||||
$commits = $this->scm->getCommits($revision, 1);
|
||||
if(!empty($commits['commits'][$revision]))
|
||||
{
|
||||
$commit = $commits['commits'][$revision];
|
||||
|
||||
$objects = $this->repo->getLinkedObjects($commit->comment);
|
||||
$stories = $this->dao->select('id,title')->from(TABLE_STORY)->where('deleted')->eq(0)->andWhere('id')->in($objects['stories'])->fetchPairs();
|
||||
$tasks = $this->dao->select('id,name')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('id')->in($objects['tasks'])->fetchPairs();
|
||||
$bugs = $this->dao->select('id,title')->from(TABLE_BUG)->where('deleted')->eq(0)->andWhere('id')->in($objects['bugs'])->fetchPairs();
|
||||
|
||||
$this->view->repoID = $this->post->repoID;
|
||||
$this->view->commit = $commit;
|
||||
$this->view->stories = $stories;
|
||||
$this->view->tasks = $tasks;
|
||||
$this->view->bugs = $bugs;
|
||||
$this->display();
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
.m-repo-ajaxgeteditorcontent {overflow: hidden;}
|
||||
#monacoEditor .tip-circular {background: #2e7fff; border-radius: 10px; padding: 0px 7px;}
|
||||
#log {margin-top: 8px; display: none; padding: 5px; justify-content: space-between; height: 25px; line-height: 20px; background: #efefef;}
|
||||
#log .history {margin-left: 5px; max-width: 90%;}
|
||||
#log .action-btn .btn {border: none; background: none;}
|
||||
#related {display: none; margin-top: 2px; background: #fff; height: 0px;}
|
||||
|
||||
#relationTabs .nav > li > a {padding: 8px 10px; display: flex; white-space: pre;}
|
||||
#relationTabs .nav-tabs > li > a > span {margin-right: 5px;}
|
||||
#relationTabs .tab-pane {display: none;}
|
||||
#relationTabs .tabs-navbar {background: #FFFFFF;}
|
||||
#relationTabs .tab-pane.active {display: block;}
|
||||
#relationTabs .tab-nav-item {max-width: none !important;}
|
||||
#relationTabs .tab-nav-item .icon {line-height: inherit;}
|
||||
#relationTabs > .tabs-navbar {overflow: hidden; padding-bottom: 10px; position: relative; height: 35px;}
|
||||
#relationTabs > .tabs-navbar > .nav-tabs {position: absolute; display: flex;}
|
||||
#relationTabs .tab-nav-link .title {max-width: 300px; display: inline-block; white-space: nowrap; width: 100%; overflow: hidden; text-overflow: ellipsis; padding: 0 5px;}
|
||||
#related .content, #related .btn {background-color: #F4F5F7; border: none;}
|
||||
#related .btn.pull-right {margin-right: 0;}
|
||||
#related .nav-tabs > li.active > a:before {background: none; height: 0;}
|
||||
#related .table-empty-tip {padding: 35px 10px;}
|
||||
.repoCode .binary a .icon-download {font-size: 50px;}
|
||||
.repoCode .binary, .repoCode .image {text-align: center;}
|
||||
.repoCode .binary a {margin: 100px 0px; display: block;}
|
||||
.repoCode .image {margin-top: 10px;}
|
||||
@@ -0,0 +1,13 @@
|
||||
body {background-color: #fff; padding-bottom: 20px;}
|
||||
.linkContent .panel {margin-bottom: 0; padding-bottom: 10px; border: none;}
|
||||
.left-content {padding-top: 15px;}
|
||||
.left-content {padding-left: 0px;}
|
||||
.left-content tr {line-height: 30px;}
|
||||
.left-content th {padding-top: 4px;}
|
||||
.right-content {border-left: 1px solid #EDEEF2;}
|
||||
.right-content .detail-content {margin-left: 15px;}
|
||||
.text {width: 55%; white-space: normal; word-wrap: break-word; word-break: break-all; padding-left: 10px; vertical-align: top;}
|
||||
.cell {min-height: 300px;}
|
||||
.menu-title {width: 100%;}
|
||||
.article-content {margin-top: 0;}
|
||||
.spec-content {padding-right: 20px;}
|
||||
@@ -5,10 +5,14 @@
|
||||
.btn-toolbar > .last-sync-time {display: inline-block; float: left; margin-right: 10px;}
|
||||
.btn-toolbar .page-title {line-height: 32px;}
|
||||
.dropdown-menu > li.selected > a:after {content: '';}
|
||||
.pull-left li > a.selected {color: #e9f2fb; background-color: #16a8f8;}
|
||||
.pull-left li > a {line-height: 20px; border-radius: 5px;}
|
||||
.tree li.has-list.open:before {border-left: 0px;}
|
||||
#mainMenu > div.btn-toolbar.pull-left > div.btn-group.open {line-height: 20px;}
|
||||
#dropMenuRepo > div.table-row > div > div > ul > li {padding: 0}
|
||||
#dropMenuRepo > div.table-row > div > div > ul > li > div {padding-left: 20px;}
|
||||
#dropMenuRepo > div.table-row > div > div > ul > li > ul {padding-left: 10px;}
|
||||
#repoList .hide-in-search .hidden {display: block !important; visibility: inherit !important;}
|
||||
|
||||
#branchList {line-height: 25px;}
|
||||
#branchList .hide-in-search, #branchList .tree ul {padding-left: 20px;}
|
||||
|
||||
@@ -198,3 +198,56 @@ h3 {font-size: 16px;}
|
||||
|
||||
.comment.show-form .comment-form-div {margin-top: 20px; padding-bottom: 10px;}
|
||||
.comment .avatar {margin-right: 10px;}
|
||||
|
||||
#fileTree li {padding: 0 0 0 8px;}
|
||||
#fileTree li.has-list {padding-left: 20px;}
|
||||
#fileTree li > a {display: block; padding: 6px 0; border-radius: 2px; padding-left: 6px; height: 30px; text-decoration: none;}
|
||||
#fileTree li > a > span {display: inline-block;}
|
||||
#fileTree li > a > span + span {margin-left: 8px;}
|
||||
#fileTree li.selected > a {background-color: #E8F3FC;}
|
||||
#fileTree li.selected > a > span.title {color: #006AF1;}
|
||||
#fileTree .label-id {border-color: #cbd0db; color: #7d8599}
|
||||
#fileTree .label.label-type {background: #fff; border: 1px solid #7d8599; color:#7d8599}
|
||||
|
||||
#fileTree li > a > span.title {color: #3C4353; white-space: nowrap; max-width: 60%; overflow: hidden; text-overflow: ellipsis; vertical-align: middle;}
|
||||
#fileTree li > a > span.user {color: #838a9d;}
|
||||
#fileTree li > a > span.user > .icon-person {font-size: 14px; position: relative; top: -1px; color: #a6aab8}
|
||||
#fileTree li > a:first-child {padding-left: 18px;}
|
||||
#fileTree li a.selected {color: #e9f2fb; background-color: #0c64eb;}
|
||||
|
||||
#fileTree li > .list-toggle {transform: rotate(0deg); width: 16px; height: 16px; border: 4px solid #a6aab8; border-radius: 2px; top: 7px;}
|
||||
#fileTree li > .list-toggle:before {content: ' '; display: block; position: absolute; border: 1px solid #a6aab8; top: 2px; left: -3px; right: -3px; bottom: 2px; min-width: 0; transition: all .2s;}
|
||||
#fileTree li > .list-toggle:hover:before, #fileTree li > .list-toggle:hover {border-color: #006AF1;}
|
||||
#fileTree li.open > .list-toggle {width: 12px; height: 12px; top: 9px; background-color: #a6aab8; border-width: 3px; left: 3px;}
|
||||
#fileTree li.open > .list-toggle:before {border: none; height: 2px; width: 6px; left: 0; top: 2px; background: #fff;}
|
||||
#fileTree li.open > .list-toggle:hover {background: #006AF1;}
|
||||
|
||||
#fileTree ul > li:after {display: block; position: absolute; content: ' '; border-top: 1px dashed #cbd0db; top: 14px; left: -12px; z-index: 1; width: 10px;}
|
||||
#fileTree ul > li:before, #fileTree ul > li.has-list:before {background: none; content: ' '; display: block; position: absolute; width: auto; height: auto; border: none; border-left: 1px dashed #cbd0db; top: -13px; bottom: 12px; left: -12px;}
|
||||
#fileTree ul > li:last-child:before {bottom: auto; height: 29px;}
|
||||
#fileTree ul > li:first-child:before {top: -9px;}
|
||||
#fileTree ul > li.has-list:first-child:before {top: -13px;}
|
||||
#fileTree ul > li.tree-single-item:before {height: 23px;}
|
||||
#fileTree ul > li.has-list:after {width: 14px;}
|
||||
#filesTree .tree li.has-list.open:before {border: none;}
|
||||
#fileTabs .nav-tabs > li.tab-nav-item > a {z-index: 1; background: none;}
|
||||
#fileTabs .nav-tabs > li > a::after {content: ''; position: absolute; top: 2px; left: 10px; width: 85%; right: 6px; bottom: 0; background: #f8f8f8; border: none; border-radius: 10px 10px 0 0; height: 70%; transform: perspective(4px)scale(1.1, 1.3) rotateX(5deg); z-index: -1;}
|
||||
#fileTabs .nav-tabs > li.active > a::after {background: #FFFFFF;}
|
||||
#fileTabs > .tabs-navbar {overflow: hidden; padding-bottom: 10px; position: relative; height: 35px; background: #efefef;}
|
||||
#fileTabs > .tabs-navbar > .nav-tabs {position: absolute; display: flex; padding-left: 25px;}
|
||||
.repoCode .content, .repoCode .btn:not(.btn-primary) {background-color: #efefef; border: none;}
|
||||
.repoCode .btn.btn-right, .repoCode .btn.btn-left {margin-right: 0; padding: 6px 6px;}
|
||||
#related .btn-right, #related .btn-left {padding-top: 9px;}
|
||||
#log .action-btn {margin-top: -7px;}
|
||||
|
||||
#relationTabs .nav-tabs >li > a .tab-nav-close {display: none;}
|
||||
#relationTabs .nav-tabs > li > a > i, #relationTabs .nav-tabs > li > a > span {background: #EDEEF2; font-weight: normal; padding: 1px 5px;}
|
||||
#relationTabs .nav-tabs > li.active > a > i, #relationTabs .nav-tabs > li.active > a > span {background: #E6F0FF; color: #2e7fff;}
|
||||
.linkContent strong.text-primary {cursor: pointer;}
|
||||
|
||||
#modules li {padding: 5px 0 0 15px;}
|
||||
.file-tree #modules .icon {color: #9EA3B0;}
|
||||
.file-tree #modules .icon-folder {padding-left: 5px;}
|
||||
li.selected .doc-title .icon, li.selected .doc-title a {color: #438EFF !important;}
|
||||
|
||||
.btn-left, .btn-right {display: none;}
|
||||
|
||||
@@ -16,6 +16,7 @@ table.diff {margin-bottom: 0px;}
|
||||
.repoCode .diff tr.over td.line-new, .repoCode .diff tr.over td.line-new {background: #8eff8e;}
|
||||
.repoCode .diff tr.over td.line-old, .repoCode .diff tr.over td.line-old {background: #f6b2b2;}
|
||||
|
||||
.repoCode {min-height: 500px;}
|
||||
.repoCode form > .btn {margin-right: 10px;}
|
||||
.label-exchange {background-color: #566F7C; cursor: pointer;}
|
||||
.label-exchange i {padding: 0;}
|
||||
@@ -24,3 +25,16 @@ table.diff {margin-bottom: 0px;}
|
||||
.body-modal #mainMenu {padding-bottom: 40px;}
|
||||
|
||||
.repoCode td.code {white-space: inherit;}
|
||||
.repoCode .nav-tabs > li.active > a:before {background: none; height: 0;}
|
||||
|
||||
#fileTabs .tab-pane {display: none;}
|
||||
#fileTabs .tab-pane.active {display: block;}
|
||||
#fileTabs .tab-nav-item {max-width: none !important; white-space: nowrap;}
|
||||
#fileTabs .tab-nav-item > .tab-nav-link > .close {float: none; position: inherit; right: -1px; top: 2px;}
|
||||
#filesTree #modules {margin-top: 5px;}
|
||||
#filesTree {overflow-y: auto;}
|
||||
|
||||
.file-tree {padding: 0;}
|
||||
#sidebar > .sidebar-toggle {left: auto; right: 3px;}
|
||||
#sidebar > .sidebar-toggle > .icon {left : -1px;}
|
||||
.hide-sidebar #sidebar {width: 0 !important;}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
.m-repo-monaco {overflow: hidden;}
|
||||
.repoCode .nav > li > a {padding: 8px 10px;}
|
||||
.repoCode .nav-tabs > li > a > span {margin-right: 5px;}
|
||||
.repoCode {min-height: 500px;}
|
||||
#sidebar.side-col {padding-right: 0;}
|
||||
#sidebar .sidebar-toggle {left: auto; right: -3px; z-index: 10; height: 98%;}
|
||||
#sidebar .file-tree {padding: 0;}
|
||||
#sidebar > .sidebar-toggle > .icon-angle-left {right: auto; left: -1px;}
|
||||
.hide-sidebar #sidebar {width: 0 !important;}
|
||||
|
||||
#fileTabs .tab-pane {display: none;}
|
||||
#fileTabs .tab-pane.active {display: block;}
|
||||
#fileTabs .tab-nav-item {max-width: none !important;}
|
||||
.repoCode .content {margin-left: 5px;}
|
||||
.repoCode .nav > li > a {display: flex; white-space: pre;}
|
||||
#sourceSwapper {border: 1px solid #D8DBDE; border-radius: 2px; width: 100%;}
|
||||
#sourceSwapper .repo-select {width: 100%;}
|
||||
#sourceSwapper .repo-select .caret {margin-top: 6px;}
|
||||
#sourceSwapper .hide-in-search {padding-left: 5px;}
|
||||
#sourceSwapper .tree li > a {max-width: 100%;}
|
||||
.version-name {max-width: 90%}
|
||||
#filesTree #modules {margin-top: 5px;}
|
||||
#filesTree {overflow-y: auto;}
|
||||
.repoCode .nav-tabs > li.active > a:before {background: none; height: 0;}
|
||||
@@ -109,4 +109,11 @@ $(function()
|
||||
var link = createLink('repo', 'downloadCode', 'repoID=' + repoID + '&branch=' + branch);
|
||||
window.open(link);
|
||||
})
|
||||
|
||||
/* Sync rename record. */
|
||||
if(!syncedRF)
|
||||
{
|
||||
var link = createLink('repo', 'ajaxSyncRenameRecord', 'repoID=' + repoID);
|
||||
$.get(link);
|
||||
}
|
||||
})
|
||||
|
||||
@@ -61,13 +61,81 @@ $("input:checkbox[name='revision[]']").click(function(){
|
||||
}
|
||||
});
|
||||
|
||||
var distance = 0;
|
||||
|
||||
/**
|
||||
* Aarrow tabs area.
|
||||
*
|
||||
* @param string domID
|
||||
* @param number shift 1|-1
|
||||
* @param bool hideRightBtn
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function arrowTabs(domID, shift, hideRightBtn)
|
||||
{
|
||||
if($('#' + domID).html() == '') return;
|
||||
|
||||
var hasParent = $('#' + domID + ' .btn-left').length;
|
||||
var $leftBtn = hasParent ? $('#' + domID + ' .btn-left') : $('.btn-left');
|
||||
var $rightBtn = hasParent ? $('#' + domID + ' .btn-right') : $('.btn-right');
|
||||
|
||||
$leftBtn.show();
|
||||
$rightBtn.show();
|
||||
if(hideRightBtn) $rightBtn.hide();
|
||||
|
||||
var tabItemWidth = $('#' + domID + ' > .tabs-navbar > .nav-tabs')[0].clientWidth;
|
||||
var tabsWidth = $('#' + domID)[0].clientWidth;
|
||||
if($('#' + domID + ' .close-bugs').length) tabsWidth = tabsWidth * 0.7;
|
||||
|
||||
if(tabItemWidth < tabsWidth)
|
||||
{
|
||||
$leftBtn.hide();
|
||||
$rightBtn.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
distance += tabsWidth * shift * 0.2;
|
||||
if(distance > 0) distance = 0;
|
||||
if(distance == 0)
|
||||
{
|
||||
$leftBtn.hide();
|
||||
}
|
||||
|
||||
if((tabItemWidth + distance) < tabsWidth * 0.75)
|
||||
{
|
||||
$rightBtn.hide();
|
||||
return arrowTabs(domID, 1, true);
|
||||
}
|
||||
|
||||
$('#' + domID + ' > .tabs-navbar > .nav-tabs')[0].style.transform = 'translateX('+ distance +'px)';
|
||||
}
|
||||
|
||||
/**
|
||||
* Close commit relations.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function closeRelation()
|
||||
{
|
||||
$tabs = $('#relationTabs').data('zui.tabs');
|
||||
if($tabs) $tabs.closeAll();
|
||||
$('.history').html('');
|
||||
$('#log').data('line', 0);
|
||||
$('#log').hide();
|
||||
|
||||
$('#codeContainer').css('height', codeHeight);
|
||||
$('#related').css('height', 0);
|
||||
};
|
||||
|
||||
$(function()
|
||||
{
|
||||
$(document).on('click', '.ajaxPager', function()
|
||||
{
|
||||
$('#sidebar .side-body').load($(this).attr('data-href'));
|
||||
return false;
|
||||
})
|
||||
}).on('click', '#log .btn-close', closeRelation);
|
||||
|
||||
if($("main").is(".hide-sidebar"))
|
||||
{
|
||||
|
||||
+190
-6
@@ -1,11 +1,195 @@
|
||||
$(document).ready(function()
|
||||
{
|
||||
$("#inline").click(function(){$('#arrange').val('inline');this.form.submit();});
|
||||
$("#appose").click(function(){$('#arrange').val('appose');this.form.submit();});
|
||||
$(".label-exchange").click(function(){ $('#exchange').submit();});
|
||||
});
|
||||
/**
|
||||
* Change code encoding.
|
||||
*
|
||||
* @param string encoding
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function changeEncoding(encoding)
|
||||
{
|
||||
$('#encoding').val(encoding);
|
||||
$('#encoding').parents('form').submit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Html code decode.
|
||||
*
|
||||
* @param string str
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
function htmlspecialchars_decode(str){
|
||||
str = str.replace(/&/g, '&');
|
||||
str = str.replace(/</g, '<');
|
||||
str = str.replace(/>/g, '>');
|
||||
str = str.replace(/"/g, "''");
|
||||
str = str.replace(/'/g, "'");
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get diffs by file name.
|
||||
*
|
||||
* @param string fileName
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function getDiffs(fileName)
|
||||
{
|
||||
if(fileName.indexOf('./') === 0) fileName = fileName.substring(2);
|
||||
|
||||
var result = {
|
||||
'code': {'new': '', 'old': ''},
|
||||
'line': {'new': [], 'old': []}
|
||||
};
|
||||
$.each(diffs, function(i, diff)
|
||||
{
|
||||
if(diff.fileName == fileName)
|
||||
{
|
||||
if(!diff.contents || typeof diff.contents[0].lines != 'object') return result;
|
||||
|
||||
var lines = diff.contents[0].lines;
|
||||
$.each(lines, function(l, code)
|
||||
{
|
||||
if(code.type == 'all' || code.type == 'new')
|
||||
{
|
||||
result.code.new += htmlspecialchars_decode(code.line.substring(2)) + "\n";
|
||||
result.line.new.push(parseInt(code.newlc));
|
||||
}
|
||||
|
||||
if(code.type == 'all' || code.type == 'old')
|
||||
{
|
||||
result.code.old += htmlspecialchars_decode(code.line.substring(2)) + "\n";
|
||||
result.line.old.push(parseInt(code.oldlc));
|
||||
}
|
||||
})
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create file tab.
|
||||
*
|
||||
* @param string filename
|
||||
* @param string filepath
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function createTab(filename, filepath)
|
||||
{
|
||||
$('[data-path="' + decodeURIComponent(filepath) + '"]').closest('li').addClass('selected');
|
||||
var tabID = Base64.encode(filepath).replaceAll('=', '-');
|
||||
return {
|
||||
title: filename,
|
||||
id: tabID,
|
||||
type: 'iframe',
|
||||
url: createLink('repo', 'ajaxGetDiffEditorContent', urlParams.replace('%s', Base64.encode(encodeURIComponent(filepath))))
|
||||
};
|
||||
}
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
var diffAppose = false;
|
||||
$('.dropdown #inline').hide();
|
||||
|
||||
if(!browser || browser == 'ie')
|
||||
{
|
||||
$("#inline").click(function(){$('#arrange').val('inline');this.form.submit();});
|
||||
$("#appose").click(function(){$('#arrange').val('appose');this.form.submit();});
|
||||
}
|
||||
$(".label-exchange").click(function(){ $('#exchange').submit();});
|
||||
|
||||
$('.btn-left').click(function() {arrowTabs('fileTabs', 1);});
|
||||
$('.btn-right').click(function() {arrowTabs('fileTabs', -2);});
|
||||
if(file) $('#fileTabs').tabs({tabs: [createTab(file['basename'], entry)]});
|
||||
|
||||
/**
|
||||
* Set pane height.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function setHeight()
|
||||
{
|
||||
var paneHeight = $(window).height() - 120;
|
||||
if(edition != 'open') paneHeight -= 80;
|
||||
if(isonlybody) paneHeight = 500;
|
||||
$('#fileTabs .tab-pane').css('height', paneHeight + 'px')
|
||||
$('#filesTree').css('height', paneHeight + 35)
|
||||
}
|
||||
setHeight();
|
||||
$(window).resize(setHeight);
|
||||
|
||||
$(document).on('click', '.repoFileName', function()
|
||||
{
|
||||
var path = $(this).data('path');
|
||||
var name = $(this).text();
|
||||
var $tabs = $('#fileTabs').data('zui.tabs');
|
||||
|
||||
$tabs.open(createTab(name, path));
|
||||
setHeight();
|
||||
arrowTabs('fileTabs', -2);
|
||||
});
|
||||
|
||||
/* Remove file path for opened files. */
|
||||
$('#fileTabs').on('onClose', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
var index = openedFiles.indexOf(filepath);
|
||||
if(index > -1)
|
||||
{
|
||||
openedFiles.splice(index, 1)
|
||||
$('[data-path="' + filepath + '"]').closest('li').removeClass('selected');
|
||||
}
|
||||
|
||||
if(index == openedFiles.length) arrowTabs('fileTabs', -2);
|
||||
});
|
||||
|
||||
/* Append file path into the title. */
|
||||
$('#fileTabs').on('onLoad', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
$('#tab-nav-item-' + tab.id).attr('title', filepath);
|
||||
document.getElementById('tab-iframe-' + tab.id).contentWindow.updateEditorInline(diffAppose);
|
||||
|
||||
if(openedFiles.indexOf(filepath) == -1) openedFiles.push(filepath);
|
||||
});
|
||||
|
||||
$('#fileTabs').on('onOpen', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
var index = openedFiles.indexOf(filepath);
|
||||
if(index > -1) document.getElementById('tab-iframe-' + tab.id).contentWindow.updateEditorInline(diffAppose);
|
||||
});
|
||||
|
||||
$('.inline-appose').on('click', function()
|
||||
{
|
||||
$('.inline-appose').hide();
|
||||
diffAppose = !diffAppose;
|
||||
if(diffAppose)
|
||||
{
|
||||
$('.dropdown #inline').show();
|
||||
}
|
||||
else
|
||||
{
|
||||
$('.dropdown #appose').show();
|
||||
}
|
||||
var type = $(this).attr('id');
|
||||
var tabID = $('.tab-nav-item.active').data('id');
|
||||
document.getElementById('tab-iframe-' + tabID).contentWindow.updateEditorInline(diffAppose);
|
||||
return;
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Load link object page.
|
||||
*
|
||||
* @param string $link
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadLinkPage(link)
|
||||
{
|
||||
$('#linkObject').attr('href', link);
|
||||
$('#linkObject').click()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
* Create file tab.
|
||||
*
|
||||
* @param string filename
|
||||
* @param string filepath
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function createTab(filename, filepath)
|
||||
{
|
||||
$('[data-path="' + decodeURIComponent(filepath) + '"]').closest('li').addClass('selected');
|
||||
var tabID = Base64.encode(filepath).replaceAll('=', '-');
|
||||
return {
|
||||
title: filename,
|
||||
id: tabID,
|
||||
type: 'iframe',
|
||||
url: createLink('repo', 'ajaxGetEditorContent', urlParams.replace('%s', Base64.encode(encodeURIComponent(filepath))))
|
||||
};
|
||||
}
|
||||
|
||||
$(function()
|
||||
{
|
||||
$('.btn-left').click(function() {arrowTabs('fileTabs', 1);});
|
||||
$('.btn-right').click(function() {arrowTabs('fileTabs', -2);});
|
||||
$('#fileTabs').tabs({tabs: [createTab(file['basename'], entry)]});
|
||||
|
||||
/**
|
||||
* Set pane height.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function setHeight()
|
||||
{
|
||||
var paneHeight = $(window).height() - 120;
|
||||
if(isonlybody) paneHeight = 500;
|
||||
$('#fileTabs .tab-pane').css('height', paneHeight + 'px')
|
||||
$('#filesTree').css('height', paneHeight + 35)
|
||||
}
|
||||
setHeight();
|
||||
$(window).resize(setHeight);
|
||||
|
||||
$(document).on('click', '.repoFileName', function()
|
||||
{
|
||||
var path = $(this).data('path');
|
||||
var name = $(this).text();
|
||||
var $tabs = $('#fileTabs').data('zui.tabs');
|
||||
if(openedFiles.indexOf(path) == -1) openedFiles.push(path);
|
||||
|
||||
$tabs.open(createTab(name, path));
|
||||
setHeight();
|
||||
arrowTabs('fileTabs', -1);
|
||||
});
|
||||
|
||||
/* Remove file path for opened files. */
|
||||
$('#fileTabs').on('onClose', function(event, tab) {
|
||||
var filepath = decodeURIComponent(Base64.decode(tab.id.replaceAll('-', '=')));
|
||||
var index = openedFiles.indexOf(filepath);
|
||||
if(index > -1)
|
||||
{
|
||||
openedFiles.splice(index, 1)
|
||||
$('[data-path="' + filepath + '"]').closest('li').removeClass('selected');
|
||||
}
|
||||
|
||||
if(index == openedFiles.length) arrowTabs('fileTabs', -2);
|
||||
});
|
||||
|
||||
/* Append file path into the title. */
|
||||
$('#fileTabs').on('onLoad', function(event, tab) {
|
||||
var filepath = Base64.decode(tab.id.replaceAll('-', '='));
|
||||
$('#tab-nav-item-' + tab.id).attr('title', decodeURIComponent(filepath));
|
||||
});
|
||||
|
||||
if(['Git', 'Gitlab', 'Gogs', 'Gitea'].indexOf(repo.SCM) != -1)
|
||||
{
|
||||
var link = createLink('repo', 'ajaxGetBranchesAndTags', 'repoID=' + repoID + '&oldRevision=' + branchID);
|
||||
$.get(link, function(data)
|
||||
{
|
||||
var result = $.parseJSON(data);
|
||||
$('#branchList').empty();
|
||||
$('#branchList').append(result.sourceHtml);
|
||||
$('#branchList #branchesAndTags').tree({initialState: 'expand'});
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#sourceSwapper').hide();
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh files tree.
|
||||
*
|
||||
* @param string branchOrTag
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function refreshFiles(branchOrTag)
|
||||
{
|
||||
var link = createLink('repo', 'ajaxGetFileTree', 'repoID=' + repoID + '&branch=' + Base64.encode(branchOrTag));
|
||||
$.get(link, function(data)
|
||||
{
|
||||
$('#modules').remove();
|
||||
$('#filesTree').append(data);
|
||||
$('#modules').tree();
|
||||
$('#filesTree').removeClass('loading');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).on('click', '.branch-or-tag', function()
|
||||
{
|
||||
var branchOrTag = $(this).text();
|
||||
if(branchOrTag != $.cookie('repoBranch'))
|
||||
{
|
||||
$('#filesTree').addClass('loading');
|
||||
$.cookie('repoBranch', branchOrTag);
|
||||
|
||||
$('#fileTabs').data('zui.tabs').closeAll();
|
||||
refreshFiles(branchOrTag);
|
||||
|
||||
$('.branch-or-tag').removeClass('selected');
|
||||
$(this).addClass('selected');
|
||||
$('.repo-select').attr('title', branchOrTag);
|
||||
$('.repo-select .version-name').text(branchOrTag);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
/**
|
||||
* Load link object page.
|
||||
*
|
||||
* @param string $link
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function loadLinkPage(link)
|
||||
{
|
||||
$('#linkObject').attr('href', link);
|
||||
$('#linkObject').click()
|
||||
}
|
||||
@@ -28,6 +28,8 @@ $lang->repo->branch = 'Branch';
|
||||
$lang->repo->tag = 'Tag';
|
||||
$lang->repo->addWebHook = 'Add Webhook';
|
||||
$lang->repo->apiGetRepoByUrl = 'API: Get repo by URL';
|
||||
$lang->repo->blameTmpl = 'Code for line <strong>%line</strong>, <span class="tip-circular"></span> %name commited at %time, %version %comment';
|
||||
$lang->repo->notRelated = 'There is currently no related ZenTao object';
|
||||
|
||||
$lang->repo->browseAction = 'Browse Repo';
|
||||
$lang->repo->createAction = 'Create Repo';
|
||||
@@ -42,10 +44,13 @@ $lang->repo->downloadZip = 'Download Zip file';
|
||||
$lang->repo->sshClone = 'Clone with SSH';
|
||||
$lang->repo->httpClone = 'Clone with HTTP';
|
||||
$lang->repo->cloneUrl = 'Clone URL';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
|
||||
|
||||
$lang->repo->submit = 'Submit';
|
||||
$lang->repo->cancel = 'Cancel';
|
||||
$lang->repo->addComment = 'Add Comment';
|
||||
$lang->repo->addIssue = 'Add Issue';
|
||||
|
||||
$lang->repo->copy = 'Click to copy';
|
||||
$lang->repo->copied = 'Copy successful';
|
||||
@@ -105,6 +110,11 @@ $lang->repo->job = 'Job';
|
||||
$lang->repo->fileServerUrl = 'File Server Url';
|
||||
$lang->repo->fileServerAccount = 'File Server Account';
|
||||
$lang->repo->fileServerPassword = 'File Server Password';
|
||||
$lang->repo->linkStory = 'Link ' . $lang->SRCommon;
|
||||
$lang->repo->linkBug = 'Link Bug';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlink = 'Unlink';
|
||||
$lang->repo->viewBugs = 'View Bugs';
|
||||
|
||||
$lang->repo->title = 'Title';
|
||||
$lang->repo->status = 'Status';
|
||||
|
||||
@@ -28,6 +28,8 @@ $lang->repo->branch = 'Branch';
|
||||
$lang->repo->tag = 'Tag';
|
||||
$lang->repo->addWebHook = 'Add Webhook';
|
||||
$lang->repo->apiGetRepoByUrl = 'API: Get repo by URL';
|
||||
$lang->repo->blameTmpl = 'Code for line <strong>%line</strong>, <span class="tip-circular"></span> %name commited at %time, %version %comment';
|
||||
$lang->repo->notRelated = 'There is currently no related ZenTao object';
|
||||
|
||||
$lang->repo->browseAction = 'Browse Repo';
|
||||
$lang->repo->createAction = 'Create Repo';
|
||||
@@ -42,10 +44,13 @@ $lang->repo->downloadZip = 'Download compressed package';
|
||||
$lang->repo->sshClone = 'Clone with SSH';
|
||||
$lang->repo->httpClone = 'Clone with HTTP';
|
||||
$lang->repo->cloneUrl = 'Clone URL';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
|
||||
|
||||
$lang->repo->submit = 'Submit';
|
||||
$lang->repo->cancel = 'Cancel';
|
||||
$lang->repo->addComment = 'Add Comment';
|
||||
$lang->repo->addIssue = 'Add Issue';
|
||||
|
||||
$lang->repo->copy = 'Click to copy';
|
||||
$lang->repo->copied = 'Copy successful';
|
||||
@@ -105,6 +110,11 @@ $lang->repo->job = 'Job';
|
||||
$lang->repo->fileServerUrl = 'File Server Url';
|
||||
$lang->repo->fileServerAccount = 'File Server Account';
|
||||
$lang->repo->fileServerPassword = 'File Server Password';
|
||||
$lang->repo->linkStory = 'Link ' . $lang->SRCommon;
|
||||
$lang->repo->linkBug = 'Link Bug';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlink = 'Unlink';
|
||||
$lang->repo->viewBugs = 'View Bugs';
|
||||
|
||||
$lang->repo->title = 'Title';
|
||||
$lang->repo->status = 'Status';
|
||||
|
||||
+11
-1
@@ -1,6 +1,6 @@
|
||||
<?php
|
||||
$lang->repo->common = 'Référentiel';
|
||||
$lang->repo->codeRepo = 'Code Library';
|
||||
$lang->repo->codeRepo = 'Référentiel';
|
||||
$lang->repo->browse = 'Aff';
|
||||
$lang->repo->viewRevision = 'Aff Modifs';
|
||||
$lang->repo->product = 'Product';
|
||||
@@ -28,6 +28,8 @@ $lang->repo->branch = 'Branch';
|
||||
$lang->repo->tag = 'Tag';
|
||||
$lang->repo->addWebHook = 'Add Webhook';
|
||||
$lang->repo->apiGetRepoByUrl = 'API: Get repo by URL';
|
||||
$lang->repo->blameTmpl = 'Code for line <strong>%line</strong>, <span class="tip-circular"></span> %name commited at %time, %version %comment';
|
||||
$lang->repo->notRelated = 'There is currently no related ZenTao object';
|
||||
|
||||
$lang->repo->browseAction = 'Browse Repo';
|
||||
$lang->repo->createAction = 'Créer Ref';
|
||||
@@ -42,10 +44,13 @@ $lang->repo->downloadZip = 'Download compressed package';
|
||||
$lang->repo->sshClone = 'Clone with SSH';
|
||||
$lang->repo->httpClone = 'Clone with HTTP';
|
||||
$lang->repo->cloneUrl = 'Clone URL';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
|
||||
|
||||
$lang->repo->submit = 'Soumettre';
|
||||
$lang->repo->cancel = 'Annuler';
|
||||
$lang->repo->addComment = 'Ajout Comment.';
|
||||
$lang->repo->addIssue = 'Add Issue';
|
||||
|
||||
$lang->repo->copy = 'Click to copy';
|
||||
$lang->repo->copied = 'Copy successful';
|
||||
@@ -105,6 +110,11 @@ $lang->repo->job = 'Job';
|
||||
$lang->repo->fileServerUrl = 'File Server Url';
|
||||
$lang->repo->fileServerAccount = 'File Server Account';
|
||||
$lang->repo->fileServerPassword = 'File Server Password';
|
||||
$lang->repo->linkStory = 'Link ' . $lang->SRCommon;
|
||||
$lang->repo->linkBug = 'Link Bug';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlink = 'Unlink';
|
||||
$lang->repo->viewBugs = 'View Bugs';
|
||||
|
||||
$lang->repo->title = 'Titre';
|
||||
$lang->repo->status = 'Statut';
|
||||
|
||||
@@ -27,6 +27,8 @@ $lang->repo->branch = 'Branch';
|
||||
$lang->repo->tag = 'Tag';
|
||||
$lang->repo->addWebHook = 'Add Webhook';
|
||||
$lang->repo->apiGetRepoByUrl = 'API: Get repo by URL';
|
||||
$lang->repo->blamTmpl = '%time %name commited %version %comment';
|
||||
$lang->repo->notRelated = 'There is currently no related ZenTao object';
|
||||
|
||||
$lang->repo->browseAction = 'Browse Repo';
|
||||
$lang->repo->createAction = 'Create Repo';
|
||||
@@ -41,6 +43,8 @@ $lang->repo->downloadZip = 'Download compressed package';
|
||||
$lang->repo->sshClone = 'Clone with SSH';
|
||||
$lang->repo->httpClone = 'Clone with HTTP';
|
||||
$lang->repo->cloneUrl = 'Clone URL';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlinkedTasks = 'Unlinked Tasks';
|
||||
|
||||
$lang->repo->submit = 'Gửi';
|
||||
$lang->repo->cancel = 'Hủy';
|
||||
@@ -104,6 +108,10 @@ $lang->repo->job = 'Job';
|
||||
$lang->repo->fileServerUrl = 'File Server Url';
|
||||
$lang->repo->fileServerAccount = 'File Server Account';
|
||||
$lang->repo->fileServerPassword = 'File Server Password';
|
||||
$lang->repo->linkStory = 'Link ' . $lang->SRCommon;
|
||||
$lang->repo->linkBug = 'Link Bug';
|
||||
$lang->repo->linkTask = 'Link Task';
|
||||
$lang->repo->unlink = 'Unlink';
|
||||
|
||||
$lang->repo->title = 'Tiêu đề';
|
||||
$lang->repo->status = 'Tình trạng';
|
||||
|
||||
@@ -28,6 +28,8 @@ $lang->repo->branch = '分支';
|
||||
$lang->repo->tag = '标签';
|
||||
$lang->repo->addWebHook = '添加Webhook';
|
||||
$lang->repo->apiGetRepoByUrl = '接口:通过URL获取代码库';
|
||||
$lang->repo->blameTmpl = '第 <strong>%line</strong> 行代码相关信息,<span class="tip-circular"></span> %name 于 %time 提交 %version %comment';
|
||||
$lang->repo->notRelated = '暂时没有关联禅道对象';
|
||||
|
||||
$lang->repo->browseAction = '浏览代码库';
|
||||
$lang->repo->createAction = '创建代码库';
|
||||
@@ -42,10 +44,13 @@ $lang->repo->downloadZip = '下载压缩包';
|
||||
$lang->repo->sshClone = '使用SSH克隆';
|
||||
$lang->repo->httpClone = '使用HTTP克隆';
|
||||
$lang->repo->cloneUrl = '克隆地址';
|
||||
$lang->repo->linkTask = '关联任务';
|
||||
$lang->repo->unlinkedTasks = '未关联任务';
|
||||
|
||||
$lang->repo->submit = '提交';
|
||||
$lang->repo->cancel = '取消';
|
||||
$lang->repo->addComment = '添加评论';
|
||||
$lang->repo->addIssue = '提问题';
|
||||
|
||||
$lang->repo->copy = '点击复制';
|
||||
$lang->repo->copied = '复制成功';
|
||||
@@ -105,6 +110,11 @@ $lang->repo->job = '构建任务';
|
||||
$lang->repo->fileServerUrl = '预合并后上传服务器目录';
|
||||
$lang->repo->fileServerAccount = '文件服务器登录用户名';
|
||||
$lang->repo->fileServerPassword = '文件服务器登录密码';
|
||||
$lang->repo->linkStory = '关联' . $lang->SRCommon;
|
||||
$lang->repo->linkBug = '关联Bug';
|
||||
$lang->repo->linkTask = '关联任务';
|
||||
$lang->repo->unlink = '取消关联';
|
||||
$lang->repo->viewBugs = '查看Bug';
|
||||
|
||||
$lang->repo->title = '标题';
|
||||
$lang->repo->status = '状态';
|
||||
@@ -165,7 +175,7 @@ $lang->repo->notice->syncComplete = '同步完成,正在跳转...';
|
||||
$lang->repo->notice->syncedCount = '已经同步记录条数';
|
||||
$lang->repo->notice->delete = '是否要删除该代码库?';
|
||||
$lang->repo->notice->successDelete = '已经成功删除代码库。';
|
||||
$lang->repo->notice->commentContent = '输入回复内容';
|
||||
$lang->repo->notice->commentContent = '输入评论内容';
|
||||
$lang->repo->notice->deleteReview = '确认删除该评审?';
|
||||
$lang->repo->notice->deleteBug = '确认删除该Bug?';
|
||||
$lang->repo->notice->deleteComment = '确认删除该回复?';
|
||||
|
||||
+544
-7
@@ -317,6 +317,63 @@ class repoModel extends model
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create commit link.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $revision
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function link($repoID, $revision, $type = 'story')
|
||||
{
|
||||
$this->loadModel('action');
|
||||
if($type == 'story') $links = $this->post->stories;
|
||||
if($type == 'bug') $links = $this->post->bugs;
|
||||
if($type == 'task') $links = $this->post->tasks;
|
||||
|
||||
$revisionID = $this->dao->select('id')->from(TABLE_REPOHISTORY)->where('repo')->eq($repoID)->andWhere('revision')->eq($revision)->fetch('id');
|
||||
foreach($links as $linkID)
|
||||
{
|
||||
$relation = new stdclass;
|
||||
$relation->AType = 'revision';
|
||||
$relation->AID = $revisionID;
|
||||
$relation->relation = 'commit';
|
||||
$relation->BType = $type;
|
||||
$relation->BID = $linkID;
|
||||
|
||||
$this->dao->replace(TABLE_RELATION)->data($relation)->exec();
|
||||
|
||||
if($type == 'story') $this->action->create('story', $linkID, 'linked2revision', '', $revisionID);
|
||||
if($type == 'bug') $this->action->create('bug', $linkID, 'linked2revision', '', $revisionID);
|
||||
if($type == 'task') $this->action->create('task', $linkID, 'linked2revision', '', $revisionID);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlink object and commit revision.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $revision
|
||||
* @param string $objectType story|bug|task
|
||||
* @param int $objectID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function unlink($repoID, $revision, $objectType, $objectID)
|
||||
{
|
||||
$revisionID = $this->dao->select('id')->from(TABLE_REPOHISTORY)->where('repo')->eq($repoID)->andWhere('revision')->eq($revision)->fetch('id');
|
||||
$this->dao->delete()->from(TABLE_RELATION)
|
||||
->where('AID')->eq($revisionID)
|
||||
->andWhere('AType')->eq('revision')
|
||||
->andWhere('relation')->eq('commit')
|
||||
->andWhere('BType')->eq($objectType)
|
||||
->andWhere('BID')->eq($objectID)->exec();
|
||||
|
||||
if(!dao::isError()) $this->loadModel('action')->create($objectType, $objectID, 'unlinkedfromrevision', '', $revisionID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save repo state.
|
||||
*
|
||||
@@ -881,6 +938,15 @@ class repoModel extends model
|
||||
$file->revision = $commitID;
|
||||
$file->repo = $repoID;
|
||||
$this->dao->insert(TABLE_REPOFILES)->data($file)->exec();
|
||||
|
||||
if($file->oldPath and $file->action == 'R')
|
||||
{
|
||||
$file->path = $file->oldPath;
|
||||
$file->parent = dirname($file->path);
|
||||
$file->oldPath = '';
|
||||
$file->action = 'D';
|
||||
$this->dao->insert(TABLE_REPOFILES)->data($file)->exec();
|
||||
}
|
||||
}
|
||||
}
|
||||
$revisionPairs[$commit->revision] = $commit->revision;
|
||||
@@ -937,7 +1003,20 @@ class repoModel extends model
|
||||
$repoFile->parent = $parentPath == '\\' ? '/' : $parentPath;
|
||||
$repoFile->type = $info['kind'];
|
||||
$repoFile->action = $info['action'];
|
||||
$repoFile->oldPath = $info['oldPath'];
|
||||
$this->dao->insert(TABLE_REPOFILES)->data($repoFile)->exec();
|
||||
|
||||
if($repoFile->oldPath and $repoFile->action == 'R')
|
||||
{
|
||||
$parentPath = dirname($repoFile->oldPath);
|
||||
|
||||
$repoFile->path = $repoFile->oldPath;
|
||||
$repoFile->parent = $parentPath == '\\' ? '/' : $parentPath;
|
||||
$repoFile->type = $info['kind'];
|
||||
$repoFile->action = 'D';
|
||||
$repoFile->oldPath = '';
|
||||
$this->dao->insert(TABLE_REPOFILES)->data($repoFile)->exec();
|
||||
}
|
||||
}
|
||||
$version++;
|
||||
}
|
||||
@@ -1170,7 +1249,7 @@ class repoModel extends model
|
||||
*/
|
||||
public function setRepoBranch($branch)
|
||||
{
|
||||
setcookie("repoBranch", $branch, 0, $this->config->webRoot, '', $this->config->cookieSecure, true);
|
||||
setcookie("repoBranch", $branch, 0, $this->config->webRoot, '', $this->config->cookieSecure);
|
||||
$_COOKIE['repoBranch'] = $branch;
|
||||
}
|
||||
|
||||
@@ -1716,11 +1795,10 @@ class repoModel extends model
|
||||
}
|
||||
|
||||
$action = new stdclass();
|
||||
$action->actor = $log->author;
|
||||
$action->date = $log->date;
|
||||
$action->extra = $scm == 'svn' ? $log->revision : substr($log->revision, 0, 10);
|
||||
|
||||
$comment = htmlSpecialString($this->iconvComment($log->msg, $encodings));
|
||||
$action->actor = $log->author;
|
||||
$action->date = $log->date;
|
||||
$action->extra = $scm == 'svn' ? $log->revision : substr($log->revision, 0, 10);
|
||||
$action->comment = $this->lang->repo->revisionA . ': #' . $action->extra . "<br />" . htmlSpecialString($this->iconvComment($log->msg, $encodings));
|
||||
|
||||
$this->loadModel('action');
|
||||
$actions = $objects['actions'];
|
||||
@@ -1737,7 +1815,6 @@ class repoModel extends model
|
||||
$action->objectID = $taskID;
|
||||
$action->product = $productsAndExecutions[$taskID]['product'];
|
||||
$action->execution = $productsAndExecutions[$taskID]['execution'];
|
||||
$action->comment = $this->lang->repo->revisionA . ': #' . $action->extra . "<br />" . $comment;
|
||||
foreach($taskActions as $taskAction => $params)
|
||||
{
|
||||
$_POST = array();
|
||||
@@ -2181,6 +2258,466 @@ class repoModel extends model
|
||||
}
|
||||
|
||||
/**
|
||||
* Get file commits.
|
||||
*
|
||||
* @param object $repo
|
||||
* @param string $branch
|
||||
* @param string $parent
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getFileCommits($repo, $branch, $parent = '')
|
||||
{
|
||||
$parent = '/' . ltrim($parent, '/');
|
||||
|
||||
/* Get file commits by repo. */
|
||||
if($repo->SCM != 'Subversion' and empty($branch)) $branch = $this->cookie->repoBranch;
|
||||
$fileCommits = $this->dao->select('t1.path,t1.type,t1.action,t1.oldPath,t1.parent,t2.revision,t2.comment,t2.committer,t2.time')->from(TABLE_REPOFILES)->alias('t1')
|
||||
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.revision=t2.id')
|
||||
->leftJoin(TABLE_REPOBRANCH)->alias('t3')->on('t2.id=t3.revision')
|
||||
->where('t1.repo')->eq($repo->id)
|
||||
->andWhere('left(t2.comment, 12)')->ne('Merge branch')
|
||||
->beginIF($repo->SCM != 'Subversion' and $branch)->andWhere('t3.branch')->eq($branch)->fi()
|
||||
->andWhere('t1.parent')->like("$parent%")->fi()
|
||||
->orderBy('t2.`time` asc')
|
||||
->fetchAll('path');
|
||||
|
||||
$files = array();
|
||||
$folders = array();
|
||||
$dirList = array();
|
||||
$fileSort = $dirSort = array(); // Use it to sort array.
|
||||
foreach($fileCommits as $fileCommit)
|
||||
{
|
||||
/* Filter by parent. */
|
||||
if($fileCommit->action == 'D') continue;
|
||||
if(strpos($fileCommit->path, $parent) !== 0) continue;
|
||||
|
||||
$pathList = explode('/', ltrim($fileCommit->path, '/'));
|
||||
if($fileCommit->parent == $parent and $fileCommit->type == 'file')
|
||||
{
|
||||
$file = new stdclass();
|
||||
$file->name = end($pathList);
|
||||
$file->kind = 'file';
|
||||
$file->revision = $fileCommit->revision;
|
||||
$file->comment = $fileCommit->comment;
|
||||
$file->account = $fileCommit->committer;
|
||||
$file->date = $fileCommit->time;
|
||||
|
||||
$files[] = $file;
|
||||
$fileSort[] = $file->name;
|
||||
}
|
||||
else
|
||||
{
|
||||
$childPath = ltrim(substr($fileCommit->path, strlen($parent)), '/');
|
||||
$childPath = explode('/', $childPath);
|
||||
$fileName = $fileCommit->type == 'dir' ? end($pathList) : $childPath[0];
|
||||
if(in_array($fileName, $dirList)) continue;
|
||||
|
||||
$folder = new stdclass();
|
||||
$folder->name = $fileName;
|
||||
$folder->kind = 'dir';
|
||||
$folder->revision = $fileCommit->revision;
|
||||
$folder->comment = $fileCommit->comment;
|
||||
$folder->account = $fileCommit->committer;
|
||||
$folder->date = $fileCommit->time;
|
||||
|
||||
$dirList[] = $fileName;
|
||||
$folders[] = $folder;
|
||||
$dirSort[] = $fileName;
|
||||
}
|
||||
}
|
||||
array_multisort($fileSort, SORT_ASC, $files);
|
||||
array_multisort($dirSort, SORT_ASC, $folders);
|
||||
|
||||
return array_merge($folders, $files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get html for file tree.
|
||||
*
|
||||
* @param object $repo
|
||||
* @param string $branch
|
||||
* @param array $diffs
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getFileTree($repo, $branch = '', $diffs = null)
|
||||
{
|
||||
$allFiles = array();
|
||||
if(is_null($diffs))
|
||||
{
|
||||
if($repo->SCM != 'Subversion' and empty($branch)) $branch = $this->cookie->repoBranch;
|
||||
$files = $this->dao->select('t1.path,t1.action')->from(TABLE_REPOFILES)->alias('t1')
|
||||
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.revision=t2.id')
|
||||
->leftJoin(TABLE_REPOBRANCH)->alias('t3')->on('t2.id=t3.revision')
|
||||
->where('t1.repo')->eq($repo->id)
|
||||
->andWhere('t1.type')->eq('file')
|
||||
->andWhere('left(t2.comment, 12)')->ne('Merge branch')
|
||||
->beginIF($repo->SCM != 'Subversion' and $branch)->andWhere('t3.branch')->eq($branch)->fi()
|
||||
->orderBy('t2.`time` asc')
|
||||
->fetchPairs();
|
||||
|
||||
foreach($files as $file => $action)
|
||||
{
|
||||
if($action != 'D') $allFiles[] = $file;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($diffs as $diff) $allFiles[] = $diff->fileName;
|
||||
}
|
||||
|
||||
return $this->buildFileTree($allFiles);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build file tree.
|
||||
*
|
||||
* @param array $allFiles
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function buildFileTree($allFiles = array())
|
||||
{
|
||||
$files = array();
|
||||
$id = 0;
|
||||
foreach($allFiles as $key => $file)
|
||||
{
|
||||
$fileName = explode('/', $file);
|
||||
$parent = '';
|
||||
foreach($fileName as $path)
|
||||
{
|
||||
if($path === '') continue;
|
||||
|
||||
$parentID = $parent == '' ? 0 : $files[$parent]['id'];
|
||||
$parent .= $parent == '' ? $path : '/' . $path;
|
||||
if(!isset($files[$parent])){
|
||||
$id++;
|
||||
|
||||
$files[$parent] = array(
|
||||
'id' => $id,
|
||||
'parent' => $parentID,
|
||||
'name' => $path,
|
||||
'path' => $parent,
|
||||
'key' => $key,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
sort($files);
|
||||
$fileTree = $this->buildTree($files);
|
||||
|
||||
$html = '<ul data-name="filesTree" data-ride="tree" data-initial-state="preserve" id="modules" class="tree">';
|
||||
foreach($fileTree as $file)
|
||||
{
|
||||
$html .= "<li class='open' data-id='{$file['id']}'>";
|
||||
if(isset($file['children']))
|
||||
{
|
||||
$html .= "<i class='icon icon-folder'></i> {$file['name']}";
|
||||
$html .= $this->getFrontFiles($file['children']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= "<span class='item doc-title text-ellipsis'><i class='icon icon-file-text-alt'></i> " . html::a('#filePath' . $file['key'], $file['name'], '', "class='repoFileName' data-path='{$file['path']}' title='{$file['path']}'") . '</span>';
|
||||
}
|
||||
$html .= '</li>';
|
||||
}
|
||||
$html .= '</ul>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build tree.
|
||||
*
|
||||
* @param array $files
|
||||
* @param int $parent
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function buildTree($files = array(), $parent = 0)
|
||||
{
|
||||
$treeList = [];
|
||||
$key = 0;
|
||||
$pathName = array();
|
||||
$fileName = array();
|
||||
foreach($files as $key => $file)
|
||||
{
|
||||
if ($file['parent'] == $parent)
|
||||
{
|
||||
$treeList[$key] = $file;
|
||||
$fileName[$key] = $file['name'];
|
||||
/* Default value is '~', because his ascii code is large in string. */
|
||||
$pathName[$key] = '~';
|
||||
|
||||
$children = $this->buildTree($files, $file['id']);
|
||||
if($children)
|
||||
{
|
||||
$treeList[$key]['children'] = $children;
|
||||
$fileName[$key] = '';
|
||||
$pathName[$key] = $file['path'];
|
||||
}
|
||||
|
||||
$key++;
|
||||
}
|
||||
}
|
||||
array_multisort($pathName, SORT_ASC, $fileName, SORT_ASC, $treeList);
|
||||
|
||||
return $treeList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get front files.
|
||||
*
|
||||
* @param array $nodes
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getFrontFiles($nodes)
|
||||
{
|
||||
$html = '<ul>';
|
||||
foreach($nodes as $childNode)
|
||||
{
|
||||
$html .= "<li class='open'>";
|
||||
if(isset($childNode['children']))
|
||||
{
|
||||
$html .= "<div class='tree-group'>";
|
||||
$html .= "<i class='module-name icon icon-folder'></i> {$childNode['name']}";
|
||||
$html .= '</div>';
|
||||
$html .= $this->getFrontFiles($childNode['children']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= "<span class='item doc-title text-ellipsis'><i class='file icon icon-file-text-alt'></i> " . html::a('#filePath' . $childNode['key'], $childNode['name'], '', "class='repoFileName' data-path='{$childNode['path']}' title='{$childNode['path']}'") . '</span>';
|
||||
}
|
||||
$html .= '</li>';
|
||||
}
|
||||
$html .= '</ul>';
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get git branch and tag.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $oldRevision
|
||||
* @param string $newRevision
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getBranchesAndTags($repoID, $oldRevision = '0', $newRevision = 'HEAD')
|
||||
{
|
||||
$output = new stdClass();
|
||||
|
||||
$scm = $this->app->loadClass('scm');
|
||||
$repo = $this->getRepoByID($repoID);
|
||||
if(!$repo) return $output;
|
||||
|
||||
$scm->setEngine($repo);
|
||||
$branches = $scm->branch();
|
||||
$tags = $scm->tags('');
|
||||
$branchAndtag = array('branch' => $branches, 'tag' =>$tags);
|
||||
|
||||
$html = '<ul class="tree tree-angles" data-ride="tree" data-idx="0" id="branchesAndTags">';
|
||||
foreach($branchAndtag as $type => $data)
|
||||
{
|
||||
if(empty($data)) continue;
|
||||
|
||||
$html .= "<li data-idx='$type' data-id='$type' class='has-list open in' style='cursor: pointer;'><i class='list-toggle icon'></i>";
|
||||
$html .= "<div class='hide-in-search'><a class='text-muted' title='{$this->lang->repo->{$type}}'>{$this->lang->repo->{$type}}</a></div><ul data-idx='$type'>";
|
||||
|
||||
foreach($data as $name)
|
||||
{
|
||||
$selectedSource = $name == $oldRevision ? 'selected-source' : '';
|
||||
$selectedTarget = $name == $newRevision ? 'selected-target' : '';
|
||||
$html .= "<li data-idx='$name' data-id='$type-$name'><a href='javascript:;' id='$type-$name' class='$selectedSource $selectedTarget branch-or-tag text-ellipsis' title='$name' data-key='$name'>$name</a></li>";
|
||||
}
|
||||
|
||||
$html .= '</ul></li>';
|
||||
}
|
||||
$html .= '</ul>';
|
||||
|
||||
$sourceHtml = str_replace('branch-or-tag', 'branch-or-tag source', $html);
|
||||
$targetHtml = str_replace('branch-or-tag', 'branch-or-tag target', $html);
|
||||
|
||||
$output->sourceHtml = str_replace('selected-source', 'selected', $sourceHtml);
|
||||
$output->targetHtml = str_replace('selected-target', 'selected', $targetHtml);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get relation by commit.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @param string $commit
|
||||
* @param string $type story|bug|task
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getRelationByCommit($repoID, $commit, $type = '')
|
||||
{
|
||||
$relationList = $this->dao->select('t1.BID as id, t1.BType as type')->from(TABLE_RELATION)->alias('t1')
|
||||
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.AID = t2.id')
|
||||
->where('t2.revision')->eq($commit)
|
||||
->andWhere('t2.repo')->eq($repoID)
|
||||
->andWhere('t1.AType')->eq('revision')
|
||||
->beginIF($type)->andWhere('t1.BType')->eq($type)->fi()
|
||||
->fetchAll();
|
||||
|
||||
$storyIDs = array();
|
||||
$bugIDs = array();
|
||||
$taskIDs = array();
|
||||
foreach($relationList as $relation)
|
||||
{
|
||||
if($relation->type == 'story')
|
||||
{
|
||||
$storyIDs[] = $relation->id;
|
||||
}
|
||||
elseif($relation->type == 'bug')
|
||||
{
|
||||
$bugIDs[] = $relation->id;
|
||||
}
|
||||
elseif($relation->type == 'task')
|
||||
{
|
||||
$taskIDs[] = $relation->id;
|
||||
}
|
||||
}
|
||||
$stories = empty($storyIDs) ? array() : $this->loadModel('story')->getByList($storyIDs);
|
||||
$bugs = empty($bugIDs) ? array() : $this->loadModel('bug')->getByList($bugIDs);
|
||||
$tasks = empty($taskIDs) ? array() : $this->loadModel('task')->getByList($taskIDs);
|
||||
|
||||
$titleList = array();
|
||||
foreach($relationList as $key => $relation)
|
||||
{
|
||||
if($type) $key = $relation->id;
|
||||
|
||||
$titleList[$key] = array(
|
||||
'id' => $relation->id,
|
||||
'type' => $relation->type,
|
||||
'title' => "#$relation->id "
|
||||
);
|
||||
if($relation->type == 'story')
|
||||
{
|
||||
$story = zget($stories, $relation->id, array());
|
||||
$titleList[$key]['title'] .= zget($story, 'title', '');
|
||||
}
|
||||
elseif($relation->type == 'bug')
|
||||
{
|
||||
$bug = zget($bugs, $relation->id, array());
|
||||
$titleList[$key]['title'] .= zget($bug, 'title', '');
|
||||
}
|
||||
elseif($relation->type == 'task')
|
||||
{
|
||||
$task = zget($tasks, $relation->id, array());
|
||||
$titleList[$key]['title'] .= zget($task, 'name', '');
|
||||
}
|
||||
}
|
||||
|
||||
return $titleList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get relation commit.
|
||||
*
|
||||
* @param int $objectID
|
||||
* @param string $objectType story|bug|task
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getCommitsByObject($objectID, $objectType)
|
||||
{
|
||||
return $this->dao->select('t2.*')->from(TABLE_RELATION)->alias('t1')
|
||||
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.AID = t2.id')
|
||||
->where('t1.BID')->eq($objectID)
|
||||
->andWhere('t1.BType')->eq($objectType)
|
||||
->andWhere('t1.AType')->eq('revision')
|
||||
->andWhere('t1.relation')->eq('commit')
|
||||
->fetchAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert delete record.
|
||||
*
|
||||
* @param int $repoID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function insertDeleteRecord($repoID)
|
||||
{
|
||||
set_time_limit(0);
|
||||
$repo = $this->loadModel('repo')->getRepoByID($repoID);
|
||||
if(empty($repo)) return false;
|
||||
|
||||
$scm = $this->app->loadClass('scm');
|
||||
$scm->setEngine($repo);
|
||||
|
||||
$values = '';
|
||||
if($repo->SCM == 'Gitlab')
|
||||
{
|
||||
$renameRevisions = $this->dao->select('t1.revision as revisionID,t2.revision')->from(TABLE_REPOFILES)->alias('t1')
|
||||
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.revision=t2.id')
|
||||
->where('t1.action')->eq('R')
|
||||
->andWhere('t1.repo')->eq($repoID)
|
||||
->andWhere('t1.oldPath')->eq('')
|
||||
->orderBy('t2.time desc')
|
||||
->fetchAll('revisionID');
|
||||
|
||||
foreach($renameRevisions as $revision)
|
||||
{
|
||||
$files = $scm->getFilesByCommit($revision->revision);
|
||||
foreach($files as $file)
|
||||
{
|
||||
if($file->action != 'R') continue;
|
||||
$parentPath = dirname($file->oldPath) == '\\' ? '/' : dirname($file->oldPath);
|
||||
$values .= "($repoID,{$revision->revisionID},'{$file->oldPath}','','$parentPath','{$file->type}','D'),";
|
||||
|
||||
$this->dao->update(TABLE_REPOFILES)->set('oldPath')->eq($file->oldPath)->where('revision')->eq($revision->revisionID)->andWhere('path')->eq($file->path)->exec();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$branchGroups = $this->dao->select('t1.id as fileID,t1.revision as revisionID,t2.revision,t3.branch')->from(TABLE_REPOFILES)->alias('t1')
|
||||
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.revision=t2.id')
|
||||
->leftJoin(TABLE_REPOBRANCH)->alias('t3')->on('t3.revision=t2.id')
|
||||
->where('t1.action')->eq('R')
|
||||
->andWhere('t1.repo')->eq($repoID)
|
||||
->andWhere('t1.oldPath')->eq('')
|
||||
->orderBy('t2.time desc')
|
||||
->fetchGroup('branch');
|
||||
|
||||
$revisionPairs = $this->dao->select('revision,id')->from(TABLE_REPOHISTORY)->where('repo')->eq($repoID)->fetchPairs();
|
||||
|
||||
foreach($branchGroups as $branch => $group)
|
||||
{
|
||||
$firstCommit = end($group);
|
||||
$commits = $scm->getCommits($firstCommit->revision, 0, $branch);
|
||||
foreach($commits['files'] as $revision => $commit)
|
||||
{
|
||||
if(!isset($revisionPairs[$revision])) continue;
|
||||
$revisionID = $revisionPairs[$revision];
|
||||
|
||||
foreach($commit as $file)
|
||||
{
|
||||
if(!$file->oldPath) continue;
|
||||
$parentPath = dirname($file->oldPath) == '\\' ? '/' : dirname($file->oldPath);
|
||||
$values .= "($repoID,$revisionID,'{$file->oldPath}','','$parentPath','{$file->type}','D'),";
|
||||
|
||||
$this->dao->update(TABLE_REPOFILES)->set('oldPath')->eq($file->oldPath)->where('revision')->eq($revisionID)->andWhere('path')->eq($file->path)->exec();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($values)
|
||||
{
|
||||
$sql = 'INSERT INTO ' . TABLE_REPOFILES . ' (`repo`,`revision`,`path`,`oldPath`,`parent`,`type`,`action`) VALUES ' . trim($values, ',');
|
||||
$result = $this->dao->exec($sql);
|
||||
}
|
||||
|
||||
$this->loadModel('setting')->setItem('system.repo.synced', $this->config->repo->synced . ',' . $repoID);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove projects without privileges.
|
||||
*
|
||||
* @param array $productIDList
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<div id='commit-box' class='open'>
|
||||
<div class='dropdown-menu commit-show'>
|
||||
<div class='commit-title'><?php echo $lang->repo->commitInfo;?></div>
|
||||
<table>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $lang->repo->revisionA;?></th>
|
||||
<td><?php echo html::a($this->repo->createLink('revision', "repoID=$repoID&objectID=0&revision={$commit->revision}"), substr($commit->revision, 0, 10));?></td>
|
||||
</tr>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $lang->repo->committer;?></th>
|
||||
<td><?php echo $commit->committer;?></td>
|
||||
</tr>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $lang->repo->comment;?></th>
|
||||
<td title='<?php echo $commit->comment;?>'><?php echo $commit->comment;?></td>
|
||||
</tr>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $lang->repo->time;?></th>
|
||||
<td><?php echo $commit->time;?></td>
|
||||
</tr>
|
||||
<?php $storyIndex = $taskIndex = $bugIndex = 1;?>
|
||||
<?php $canViewStory = common::hasPriv('story', 'view');?>
|
||||
<?php $canViewTask = common::hasPriv('task', 'view');?>
|
||||
<?php $canViewBug = common::hasPriv('bug', 'view');?>
|
||||
<?php foreach($stories as $storyID => $storyTitle):?>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $storyIndex == 1 ? $lang->repo->linkedStory : '';?></th>
|
||||
<td><?php echo $canViewStory ? html::a($this->createLink('story', 'view', "storyID=$storyID"), "#$storyID $storyTitle") : "#$storyID $storyTitle";?></td>
|
||||
</tr>
|
||||
<?php $storyIndex++;?>
|
||||
<?php endforeach;?>
|
||||
<?php foreach($tasks as $taskID => $taskName):?>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $taskIndex == 1 ? $lang->repo->linkedTask : '';?></th>
|
||||
<td><?php echo $canViewTask ? html::a($this->createLink('task', 'view', "taskID=$taskID"), "#$taskID $taskName") : "#$taskID $taskName";?></td>
|
||||
</tr>
|
||||
<?php $taskIndex++;?>
|
||||
<?php endforeach;?>
|
||||
<?php foreach($bugs as $bugID => $bugTitle):?>
|
||||
<tr class='empty'>
|
||||
<th><?php echo $bugIndex == 1 ? $lang->repo->linkedBug : '';?></th>
|
||||
<td><?php echo $canViewBug ? html::a($this->createLink('bug', 'view', "bugID=$bugID"), "#$bugID $bugTitle") : "#$bugID $bugTitle";?></td>
|
||||
</tr>
|
||||
<?php $bugIndex++;?>
|
||||
<?php endforeach;?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,367 @@
|
||||
<?php
|
||||
/**
|
||||
* The create view file of repo module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司 (QingDao Nature Easy Soft Network Technology Co,LTD www.cnezsoft.com)
|
||||
* @author Yanyi Cao
|
||||
* @package repo
|
||||
* @version $Id: create.html.php $
|
||||
*/
|
||||
?>
|
||||
<?php
|
||||
include '../../common/view/header.lite.html.php';
|
||||
$canLinkStory = common::hasPriv('repo', 'linkStory');
|
||||
$canLinkBug = common::hasPriv('repo', 'linkBug');
|
||||
$canLinkTask = common::hasPriv('repo', 'linkTask');
|
||||
$canUnlinkObject = common::hasPriv('repo', 'unlink');
|
||||
|
||||
js::set('jsRoot', $jsRoot);
|
||||
js::set('clientLang', $app->clientLang);
|
||||
js::set('fileExt', $this->config->repo->fileExt);
|
||||
js::set('file', $pathInfo);
|
||||
js::set('blameTmpl', $lang->repo->blameTmpl);
|
||||
js::set('repoID', $repoID);
|
||||
js::set('showEditor', $showEditor);
|
||||
js::set('canLinkStory', $canLinkStory);
|
||||
js::set('canLinkBug', $canLinkBug);
|
||||
js::set('canLinkTask', $canLinkTask);
|
||||
js::set('objectID', 0);
|
||||
js::set('objectType', 'story');
|
||||
js::set('pageType', $type);
|
||||
js::set('revision', $revision);
|
||||
js::set('sourceRevision', $oldRevision);
|
||||
js::set('encodePath', $this->repo->encodePath($entry));
|
||||
if($showEditor) js::set('codeContent', $content);
|
||||
js::import($jsRoot . '/zui/tabs/tabs.min.js');
|
||||
js::import($jsRoot . 'monaco-editor/min/vs/loader.js');
|
||||
?>
|
||||
<div id="monacoEditor" class='repoCode'>
|
||||
<?php if(strpos($config->repo->images, "|$suffix|") !== false):?>
|
||||
<div class='image'><img src='data:image/<?php echo $suffix?>;base64,<?php echo $content?>' /></div>
|
||||
<?php elseif($suffix == 'binary'):?>
|
||||
<div class='binary'><?php echo html::a($this->repo->createLink('download', "repoID=$repoID&path=" . $this->repo->encodePath($entry) . "&fromRevision=$revision"), "<i class='icon-download'></i>", 'hiddenwin', "title='{$lang->repo->download}'"); ?></div>
|
||||
<?php else:?>
|
||||
<div id="codeContainer"></div>
|
||||
<?php endif;?>
|
||||
<div id="log">
|
||||
<div class="history"></div>
|
||||
<div class="action-btn pull-right">
|
||||
<div class="btn btn-close pull-right"><i class="icon icon-close"></i></div>
|
||||
<?php if($canLinkStory or $canLinkBug or $canLinkTask or $canUnlinkObject):?>
|
||||
<div class="dropdown pull-right">
|
||||
<button class="btn" type="button" data-toggle="context-dropdown"><i class="icon icon-ellipsis-v icon-rotate-90"></i></button>
|
||||
<ul class="dropdown-menu">
|
||||
<?php
|
||||
if($canLinkStory) echo '<li id="linkStory">' . html::a('javascript:;', '<i class="icon icon-lightbulb"></i> ' . $lang->repo->linkStory) . '</li>';
|
||||
if($canLinkBug) echo '<li id="linkBug">' . html::a('javascript:;', '<i class="icon icon-bug"></i> ' . $lang->repo->linkBug) . '</li>';
|
||||
if($canLinkTask) echo '<li id="linkTask">' . html::a('javascript:;', '<i class="icon icon-todo"></i> ' . $lang->repo->linkTask) . '</li>';
|
||||
if($canUnlinkObject) echo '<li id="unlink">' . html::a('javascript:;', '<i class="icon icon-unlink"></i> ' . $lang->repo->unlink) . '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<div id="related">
|
||||
<div class="main-col main">
|
||||
<div class="content panel">
|
||||
<div class='btn-toolbar'>
|
||||
<div class="btn btn-left pull-left"><i class="icon icon-chevron-left"></i></div>
|
||||
<div class="btn btn-right pull-right"><i class="icon icon-chevron-right"></i></div>
|
||||
<div class='panel-title'>
|
||||
<div class="tabs w-10" id="relationTabs"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-empty-tip">
|
||||
<p><?php echo $lang->repo->notRelated;?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
<script>
|
||||
var editor = null;
|
||||
var modifiedEditor = null;
|
||||
var diffContent = null;
|
||||
var blames = null;
|
||||
var globalCommit = '';
|
||||
var codeHeight = $(window).innerHeight() - $('#mainHeader').height() - $('#appsBar').height() - $('#fileTabs .tabs-navbar').height();
|
||||
if(codeHeight > 0) $.cookie('codeContainerHeight', codeHeight);
|
||||
$('#codeContainer').css('height', $.cookie('codeContainerHeight'));
|
||||
|
||||
/**
|
||||
* Get relation by commit.
|
||||
*
|
||||
* @param string $commit
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function getRelation(commit)
|
||||
{
|
||||
$('.table-empty-tip').show();
|
||||
$('#codeContainer').css('height', codeHeight / 5 * 3);
|
||||
var relatedHeight = codeHeight / 5 * 2 - $('#log').height() - 10;
|
||||
$('#related').css('height', relatedHeight);
|
||||
$tabs = $('#relationTabs').data('zui.tabs');
|
||||
if($tabs) $tabs.closeAll();
|
||||
|
||||
$.post(createLink('repo', 'ajaxGetCommitRelation', 'repoID=' + repoID + '&commit=' + commit), function(data)
|
||||
{
|
||||
var titleList = JSON.parse(data).titleList;
|
||||
var tabs = [];
|
||||
$.each(titleList, function(i, titleObj)
|
||||
{
|
||||
var tab = setTab(titleObj);
|
||||
if($tabs)
|
||||
{
|
||||
$tabs.open(tab);
|
||||
}
|
||||
else
|
||||
{
|
||||
tabs.push(tab);
|
||||
}
|
||||
});
|
||||
|
||||
if(titleList.length > 0)
|
||||
{
|
||||
if($tabs)
|
||||
{
|
||||
$tabs.open(setTab(titleList[0]));
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#relationTabs').tabs({tabs: tabs});
|
||||
}
|
||||
|
||||
$('.table-empty-tip').hide();
|
||||
$('#unlink').show();
|
||||
$('#related button').show();
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#unlink').hide();
|
||||
if(!canLinkStory && !canLinkBug && !canLinkTask) $('#related button').hide();
|
||||
}
|
||||
|
||||
arrowTabs('relationTabs', 1);
|
||||
});
|
||||
|
||||
globalCommit = commit;
|
||||
var linkStory = createLink('repo', 'linkStory', 'repoID=' + repoID + '&commit=' + commit, '', true);
|
||||
var linkBug = createLink('repo', 'linkBug', 'repoID=' + repoID + '&commit=' + commit, '', true);
|
||||
var linkTask = createLink('repo', 'linkTask', 'repoID=' + repoID + '&commit=' + commit, '', true);
|
||||
$('#linkStory a').attr('data-link', linkStory);
|
||||
$('#linkBug a').attr('data-link', linkBug);
|
||||
$('#linkTask a').attr('data-link', linkTask);
|
||||
$('#related').show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set tab data.
|
||||
*
|
||||
* @param object $titleObj
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
function setTab(titleObj)
|
||||
{
|
||||
return {
|
||||
id: titleObj.type + '-' + titleObj.id,
|
||||
title: titleObj.title,
|
||||
icon: titleObj.type == 'story' ? 'icon-lightbulb' : (titleObj.type == 'task' ? 'icon-check-sign' : 'icon-bug'),
|
||||
type: 'iframe',
|
||||
url: createLink('repo', 'ajaxGetRelationInfo', 'objectID=' + titleObj.id + '&objectType=' + titleObj.type)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Update diff editor inline style.
|
||||
*
|
||||
* @param bool display
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function updateEditorInline(display){
|
||||
modifiedEditor.updateOptions({renderSideBySide: display});
|
||||
}
|
||||
|
||||
/**
|
||||
* Show commit info.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function showCommitInfo()
|
||||
{
|
||||
var link = createLink('repo', 'ajaxGetCommitInfo');
|
||||
var data = {
|
||||
repoID : repoID,
|
||||
entry : encodePath,
|
||||
revision : revision,
|
||||
sourceRevision: sourceRevision,
|
||||
line : 0,
|
||||
returnType : 'json'
|
||||
};
|
||||
|
||||
$.post(link, data, function(res)
|
||||
{
|
||||
res = JSON.parse(res);
|
||||
blames = res.blames;
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Show blame info and relations.
|
||||
*
|
||||
* @param int line
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
function showBlameAndRelation(line)
|
||||
{
|
||||
if(!blames) return;
|
||||
|
||||
if(pageType == 'diff') line = diffContent.line.new[line -1];
|
||||
|
||||
var blame = blames[line];
|
||||
if(!blame) return;
|
||||
|
||||
var p_line = parseInt(line);
|
||||
while(!blame.revision)
|
||||
{
|
||||
p_line--;
|
||||
blame = blames[p_line];
|
||||
}
|
||||
if($('#log').data('line') == line) return;
|
||||
|
||||
var time = blame.time != 'unknown' ? blame.time : '';
|
||||
var user = blame.committer != 'unknown' ? blame.committer : '';
|
||||
var version = blame.revision.toString().substring(0, 10);
|
||||
var content = blameTmpl.replace('%line', line).replace('%time', time).replace('%name', user).replace('%version', version).replace('%comment', blame.message);
|
||||
$('.history').html(content);
|
||||
$('#log').data('line', line);
|
||||
$('#log').css('display', 'flex');
|
||||
getRelation(blame.revision);
|
||||
}
|
||||
|
||||
$(function()
|
||||
{
|
||||
$('.btn-left').click(function() {arrowTabs('relationTabs', 1);});
|
||||
$('.btn-right').click(function() {arrowTabs('relationTabs', -2);});
|
||||
|
||||
if(showEditor)
|
||||
{
|
||||
require.config({
|
||||
paths: {vs: jsRoot + 'monaco-editor/min/vs'},
|
||||
'vs/nls': {
|
||||
availableLanguages: {
|
||||
'*': clientLang
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
require(['vs/editor/editor.main'], function ()
|
||||
{
|
||||
var lang = 'php';
|
||||
$.each(fileExt, function(langName, ext)
|
||||
{
|
||||
if(ext.indexOf('.' + file.extension) !== -1) lang = langName;
|
||||
});
|
||||
|
||||
if(pageType == 'diff')
|
||||
{
|
||||
diffContent = parent.getDiffs(file.dirname + '/' + file.basename);
|
||||
modifiedEditor = monaco.editor.createDiffEditor(document.getElementById('codeContainer'),
|
||||
{
|
||||
readOnly: true,
|
||||
language: lang,
|
||||
autoIndent: true,
|
||||
inDiffEditor: true,
|
||||
contextmenu: true,
|
||||
automaticLayout: true,
|
||||
renderSideBySide: false,
|
||||
EditorMinimapOptions: {enabled: false},
|
||||
lineNumbers: function(number)
|
||||
{
|
||||
var newlc = diffContent.line.new;
|
||||
var oldlc = diffContent.line.old;
|
||||
return newlc[number - 1];
|
||||
}
|
||||
});
|
||||
|
||||
modifiedEditor.setModel({
|
||||
original: monaco.editor.createModel(diffContent.code.old.trim("\n"), lang),
|
||||
modified: monaco.editor.createModel(diffContent.code.new.trim("\n"), lang),
|
||||
});
|
||||
|
||||
editor = modifiedEditor.getModifiedEditor();
|
||||
|
||||
var getOriginalEditor = modifiedEditor.getOriginalEditor();
|
||||
|
||||
getOriginalEditor.onMouseDown(function(obj)
|
||||
{
|
||||
showBlameAndRelation(obj.target.position.lineNumber);
|
||||
})
|
||||
}
|
||||
else
|
||||
{
|
||||
editor = monaco.editor.create(document.getElementById('codeContainer'),
|
||||
{
|
||||
value: codeContent.toString(),
|
||||
language: lang,
|
||||
readOnly: true,
|
||||
autoIndent: true,
|
||||
contextmenu: true,
|
||||
automaticLayout: true,
|
||||
EditorMinimapOptions: {enabled: false}
|
||||
});
|
||||
}
|
||||
|
||||
editor.onMouseDown(function(obj)
|
||||
{
|
||||
showBlameAndRelation(obj.target.position.lineNumber);
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
$('#linkStory a, #linkBug a, #linkTask a').on('click', function()
|
||||
{
|
||||
var link = $(this).attr('data-link');
|
||||
parent.loadLinkPage(link);
|
||||
});
|
||||
|
||||
$('#unlink a').on('click', function()
|
||||
{
|
||||
var link = $(this).attr('data-link');
|
||||
$.post(link, function(data)
|
||||
{
|
||||
data = JSON.parse(data);
|
||||
if(data.result)
|
||||
{
|
||||
getRelation(data.revision);
|
||||
}
|
||||
else
|
||||
{
|
||||
alert(data.message);
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
$('#relationTabs').on('onOpen', function(event, tab)
|
||||
{
|
||||
$('#tab-nav-item-' + tab.id).attr('title', tab.title);
|
||||
|
||||
var objectInfo = tab.id.split('-');
|
||||
objectID = objectInfo[0];
|
||||
objectType = objectInfo[1];
|
||||
$('#unlink a').attr('data-link', createLink('repo', 'unlink', 'repoID=' + repoID + '&commit=' + globalCommit + '&objectID=' + objectID + '&objectType=' + objectType));
|
||||
|
||||
var relatedHeight = codeHeight / 5 * 2 - $('#log').height() - 45;
|
||||
$('#relationTabs iframe').css('height', relatedHeight);
|
||||
});
|
||||
|
||||
/* Get file commits. */
|
||||
showCommitInfo();
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
/**
|
||||
* The create view file of repo module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司 (QingDao Nature Easy Soft Network Technology Co,LTD www.cnezsoft.com)
|
||||
* @author Yanyi Cao
|
||||
* @package repo
|
||||
* @version $Id: ajaxgetcommitrelation.html.php $
|
||||
*/
|
||||
?>
|
||||
<?php
|
||||
include '../../common/view/header.lite.html.php';
|
||||
js::set('objectType', $objectType);
|
||||
js::set('objectID', zget($object, 'id', ''));
|
||||
?>
|
||||
<div class="main-col linkContent main">
|
||||
<div class="content pane">
|
||||
<div class="fade main-row split-row in col-md-12">
|
||||
<div class="left-content col-md-8">
|
||||
<table class="table table-borderless">
|
||||
<?php if($objectType == 'story'):?>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<strong class='text-primary'><?php echo zget($object, 'title', '');?></strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<div class="spec-content detail-content article-content">
|
||||
<?php echo zget($object, 'spec', ''); ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<div class="detail-content article-content">
|
||||
<?php echo zget($object, 'verify', ''); ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php elseif($objectType == 'task'):?>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<strong class='text-primary'><?php echo zget($object, 'name', '');?></strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<div class="spec-content detail-content article-content">
|
||||
<?php echo zget($object, 'desc', ''); ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<div class="detail-content article-content">
|
||||
<?php echo zget($object, 'storyTitle', ''); ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php elseif($objectType == 'bug'):?>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<strong class='text-primary' data-id='<?php echo zget($object, 'id', '');?>'><?php echo zget($object, 'title', '');?></strong>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if(zget($object, 'steps', '')):?>
|
||||
<tr>
|
||||
<td class="text">
|
||||
<div class="spec-content detail-content article-content">
|
||||
<?php echo zget($object, 'steps', ''); ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.lite.html.php';?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('a').each(function()
|
||||
{
|
||||
var content = $(this).html();
|
||||
$(this).replaceWith(content);
|
||||
})
|
||||
$('blockquote a').empty();
|
||||
|
||||
$('.linkContent strong.text-primary').on('click',function()
|
||||
{
|
||||
var link = createLink(objectType, 'view', objectType + 'ID=' + objectID);
|
||||
var app = objectType == 'bug' ? 'qa' : (objectType == 'task' ? 'execution' : 'product');
|
||||
parent.parent.$.apps.open(link, app);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -13,6 +13,7 @@
|
||||
<?php js::set('branch', $branchID);?>
|
||||
<?php js::set('lang', $lang->repo);?>
|
||||
<?php js::set('cloneUrl', $cloneUrl);?>
|
||||
<?php js::set('syncedRF', $syncedRF);?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php if(!empty($branchesAndTags)):?>
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/form.html.php';?>
|
||||
<?php include '../../common/view/kindeditor.html.php';?>
|
||||
<?php
|
||||
$browser = helper::getBrowser();
|
||||
js::set('browser', $browser['name']);
|
||||
js::set('edition', $config->edition);
|
||||
?>
|
||||
<?php if(!isonlybody()):?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
@@ -55,6 +60,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php if($browser['name'] == 'ie'):?>
|
||||
<div class="repo panel">
|
||||
<div class='panel-heading'>
|
||||
<form method='post'>
|
||||
@@ -117,7 +123,7 @@
|
||||
{
|
||||
$oldlc = $line->oldlc;
|
||||
$newlc = '';
|
||||
if(isset($content->new[$oldlc]))
|
||||
if(isset($content->new[$oldlc]) and !isset($content->new[$oldlc - 1]))
|
||||
{
|
||||
$newlc = $line->oldlc;
|
||||
$line->type = 'custom';
|
||||
@@ -154,6 +160,9 @@
|
||||
</div>
|
||||
<?php endforeach?>
|
||||
</div>
|
||||
<?php elseif($diffs):?>
|
||||
<?php include 'diffeditor.html.php';?>
|
||||
<?php endif;?>
|
||||
<div class='revisions hidden'>
|
||||
<?php
|
||||
if(strpos($repo->SCM, 'Subversion') === false)
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
js::import($jsRoot . '/zui/tabs/tabs.min.js');
|
||||
js::import($jsRoot . 'misc/base64.js');
|
||||
$entry = count($diffs) ? $diffs[0]->fileName : '';
|
||||
$file = $entry ? pathinfo($entry) : array();
|
||||
$showBug = isset($showBug) ? $showBug : true;
|
||||
$objectID = isset($objectID) ? $objectID : 0;
|
||||
|
||||
js::set('diffs', $diffs);
|
||||
js::set('file', $file);
|
||||
js::set('entry', $entry);
|
||||
js::set('openedFiles', array($entry));
|
||||
js::set('urlParams', "repoID=$repoID&objectID=$objectID&entry=%s&oldRevision=$oldRevision&newRevision=$newRevision&showBug=$showBug&encoding=$encoding");
|
||||
?>
|
||||
<?php if(!isonlybody()):?>
|
||||
<div id="mainContent" class="main-row fade diff-page">
|
||||
<?php $sideWidth = common::checkNotCN() ? '270' : '240';?>
|
||||
<div class="side-col" id='sidebar' style="width: <?php echo $sideWidth + 15;?>px; padding-top: <?php echo isonlybody() ? 22 : 0;?>px;">
|
||||
<div class="sidebar-toggle"><i class="icon icon-angle-left"></i></div>
|
||||
<div class="cell file-tree" style="width: <?php echo $sideWidth;?>px;" data-min-width="<?php echo $sideWidth;?>">
|
||||
<div id="filesTree" class="cell load-indicator <?php if(isonlybody()) echo 'pull-left';?>">
|
||||
<?php echo $this->repo->getFileTree($repo, '', $diffs);?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="main-col repoCode main">
|
||||
<div class="content panel">
|
||||
<div class='btn-toolbar'>
|
||||
<?php if(!isonlybody()):?>
|
||||
<div class="btn btn-left pull-left"><i class="icon icon-chevron-left"></i></div>
|
||||
<div class="dropdown pull-right">
|
||||
<button class="btn" type="button" data-toggle="context-dropdown"><i class="icon icon-ellipsis-v icon-rotate-90"></i></button>
|
||||
<ul class="dropdown-menu">
|
||||
<?php
|
||||
if(common::hasPriv('repo', 'download')) echo '<li>' . html::a($this->repo->createLink('download', "repoID=$repoID&path=" . $this->repo->encodePath($entry) . "&fromRevison=$oldRevision&toRevision=$newRevision&type=path"), '<i class="icon icon-download"></i> ' . $lang->repo->downloadDiff, 'hiddenwin') . '</li>';
|
||||
echo '<li>' . html::a('javascript:;', '<i class="icon icon-inline"></i> ' . $lang->repo->viewDiffList['inline'], '', "class='inline-appose' id='inline'") . '</li>';
|
||||
echo '<li>' . html::a('javascript:;', '<i class="icon icon-appose"></i> ' . $lang->repo->viewDiffList['appose'], '', "class='inline-appose' id='appose'") . '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="btn btn-right pull-right"><i class="icon icon-chevron-right"></i></div>
|
||||
<?php endif;?>
|
||||
<div class='panel-title'>
|
||||
<div class="tabs w-10" id="fileTabs"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(!isonlybody()):?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<a href='' class='iframe' data-width='90%' id='linkObject'></a>
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
/**
|
||||
* The link bug view of productplan module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2021 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package mr
|
||||
* @version $Id: linkbug.html.php$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/sortable.html.php';?>
|
||||
<?php include '../../common/view/tablesorter.html.php';?>
|
||||
<style>
|
||||
#queryBox {padding-top: 25px;}
|
||||
.search-form #bug-search .form-actions {width: 115px !important;}
|
||||
</style>
|
||||
<div class='main-content' id='mainContent'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->repo->linkBug;?></h2>
|
||||
</div>
|
||||
<div id='queryBox' data-module='bug' class='show no-margin'></div>
|
||||
<div id='unlinkBugList'>
|
||||
<form class='main-table table-bug' data-ride='table' method='post' id='unlinkedBugsForm' target='hiddenwin' action='<?php echo $this->createLink('repo', 'linkBug', "repoID=$repoID&revision=$revision&browseType=$browseType¶m=$param&orderBy=$orderBy")?>'>
|
||||
<div class='table-header hl-primary text-primary strong'>
|
||||
<?php echo html::icon('unlink');?> <?php echo $lang->productplan->unlinkedBugs;?>
|
||||
</div>
|
||||
<table class='table tablesorter'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
<th class='c-id text-left'>
|
||||
<?php if($allBugs):?>
|
||||
<div class="checkbox-primary check-all tablesorter-noSort" title="<?php echo $lang->selectAll?>">
|
||||
<label></label>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php echo $lang->idAB;?>
|
||||
</th>
|
||||
<th class='c-pri' title=<?php echo $lang->pri;?>><?php echo $lang->priAB;?></th>
|
||||
<th class='text-left'><?php echo $lang->bug->title;?></th>
|
||||
<th class='c-user'><?php echo $lang->openedByAB;?></th>
|
||||
<th class='c-user'><?php echo $lang->bug->assignedToAB;?></th>
|
||||
<th class='c-status'><?php echo $lang->bug->status;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='text-center'>
|
||||
<?php $unlinkedCount = 0;?>
|
||||
<?php foreach($allBugs as $bug):?>
|
||||
<tr>
|
||||
<td class='c-id text-left'>
|
||||
<?php echo html::checkbox('bugs', array($bug->id => sprintf('%03d', $bug->id)));?>
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $bug->pri;?>' title='<?php echo zget($lang->bug->priList, $bug->pri, $bug->pri)?>'><?php echo zget($lang->bug->priList, $bug->pri, $bug->pri)?></span></td>
|
||||
<td class='text-left nobr' title='<?php echo $bug->title?>'><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id", '', true), $bug->title, '', "data-toggle='modal' data-type='iframe' data-width='90%'");?></td>
|
||||
<td><?php echo zget($users, $bug->openedBy);?></td>
|
||||
<td><?php echo zget($users, $bug->assignedTo);?></td>
|
||||
<td>
|
||||
<span class='status-bug status-<?php echo $bug->status?>'>
|
||||
<?php echo $this->processStatus('bug', $bug);?>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $unlinkedCount++;?>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class='table-footer'>
|
||||
<?php if($unlinkedCount):?>
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
<div class="table-actions btn-toolbar">
|
||||
<?php echo html::submitButton($lang->productplan->linkBug, '', 'btn');?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class='table-statistic'></div>
|
||||
<?php $pager->show('right', 'pagerjs');?>
|
||||
</div>
|
||||
</form>
|
||||
<iframe frameborder="0" name="hiddenwin" id="hiddenwin" scrolling="no" class="debugwin hidden"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#unlinkBugList .tablesorter').sortTable();
|
||||
setForm();
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
/**
|
||||
* The link story view of repo module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author yuchun li
|
||||
* @package repo
|
||||
* @version $Id: linkstory.html.php 5096 2022-07-25 07:02:43Z liycuhun@easycorp.ltd $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/sortable.html.php';?>
|
||||
<?php include '../../common/view/tablesorter.html.php';?>
|
||||
<style>
|
||||
.search-form #story-search .form-actions {width: 115px !important;}
|
||||
</style>
|
||||
<div class='main-content' id='mainContent'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->repo->linkStory;?></h2>
|
||||
</div>
|
||||
<div id='queryBox' data-module='story' class='show no-margin'></div>
|
||||
<form class="main-table table-story" data-ride="table" method="post" target='hiddenwin' id='linkStoryForm' action="<?php echo $this->createLink('repo', 'linkStory', "repoID=$repoID&revision=$revision&browseType=$browseType¶m=$param&orderBy=$orderBy")?>">
|
||||
<div class='table-header hl-primary text-primary strong'>
|
||||
<?php echo html::icon('unlink');?> <?php echo $lang->productplan->unlinkedStories;?>
|
||||
</div>
|
||||
<table class='table tablesorter'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id text-left'>
|
||||
<?php if($allStories):?>
|
||||
<div class="checkbox-primary check-all tablesorter-noSort" title="<?php echo $lang->selectAll?>">
|
||||
<label></label>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php echo $lang->idAB;?>
|
||||
</th>
|
||||
<th class='c-pri' title=<?php echo $lang->pri;?>><?php echo $lang->priAB;?></th>
|
||||
<th class='c-plan'><?php echo $lang->story->plan;?></th>
|
||||
<th class='c-module'><?php echo $lang->story->module;?></th>
|
||||
<th class='text-left'><?php echo $lang->story->title;?></th>
|
||||
<th class='c-user'><?php echo $lang->openedByAB;?></th>
|
||||
<th class='c-user'><?php echo $lang->assignedToAB;?></th>
|
||||
<th class='c-number text-right'><?php echo $lang->story->estimateAB;?></th>
|
||||
<th class='c-status'><?php echo $lang->statusAB;?></th>
|
||||
<th class='c-stage'><?php echo $lang->story->stageAB;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php $unlinkedCount = 0;?>
|
||||
<?php foreach($allStories as $story):?>
|
||||
<tr>
|
||||
<td class='c-id text-left'>
|
||||
<?php echo html::checkbox('stories', array($story->id => sprintf('%03d', $story->id)));?>
|
||||
</td>
|
||||
<td><span class='label-pri <?php echo 'label-pri-' . $story->pri;?>' title='<?php echo zget($lang->story->priList, $story->pri, $story->pri)?>'><?php echo zget($lang->story->priList, $story->pri, $story->pri)?></span></td>
|
||||
<td><?php echo $story->planTitle;?></td>
|
||||
<td title='<?php echo zget($modules, $story->module, '/')?>' class='text-left'><?php echo zget($modules, $story->module, '/');?></td>
|
||||
<td class='text-left nobr' title='<?php echo $story->title?>'>
|
||||
<?php
|
||||
if($story->parent > 0) echo "<span class='label label-badge label-light' title={$lang->story->children}>{$lang->story->childrenAB}</span>";
|
||||
echo html::a($this->createLink('story', 'view', "storyID=$story->id", '', true), $story->title, '', "data-toggle='modal' data-type='iframe' data-width='90%'");
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo zget($users, $story->openedBy);?></td>
|
||||
<td><?php echo zget($users, $story->assignedTo);?></td>
|
||||
<td class='text-right'title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit;?></td>
|
||||
<td>
|
||||
<span class='status-story status-<?php echo $story->status?>'>
|
||||
<?php echo $this->processStatus('story', $story);?>
|
||||
</span>
|
||||
</td>
|
||||
<td class='text-center'><?php echo $lang->story->stageList[$story->stage];?></td>
|
||||
</tr>
|
||||
<?php $unlinkedCount++;?>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class='table-footer'>
|
||||
<?php if($unlinkedCount):?>
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
<div class="table-actions btn-toolbar">
|
||||
<?php echo html::submitButton($lang->productplan->linkStory, '', 'btn');?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class='table-statistic'></div>
|
||||
<?php $pager->show('right', 'pagerjs');?>
|
||||
</div>
|
||||
</form>
|
||||
<iframe frameborder="0" name="hiddenwin" id="hiddenwin" scrolling="no" class="debugwin hidden"></iframe>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#unlinkStoryList .tablesorter').sortTable();
|
||||
setForm();
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
/**
|
||||
* The link task view of repo module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2022 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
* @author Yuchun Li <liyuchun@easycorp.ltd>
|
||||
* @package repo
|
||||
* @version $Id: linktask.html.php$
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/sortable.html.php';?>
|
||||
<?php include '../../common/view/tablesorter.html.php';?>
|
||||
<style>
|
||||
#queryBox {padding-top: 25px;}
|
||||
.search-form #task-search .form-actions {width: 115px !important;}
|
||||
</style>
|
||||
<div class='main-content' id='mainContent'>
|
||||
<div class='main-header'>
|
||||
<h2><?php echo $lang->repo->linkTask;?></h2>
|
||||
</div>
|
||||
<div id='queryBox' data-module='task' class='show no-margin'></div>
|
||||
<div id='unlinkTaskList'>
|
||||
<form class='main-table table-task' data-ride='table' method='post' id='unlinkedTasksForm' target='hiddenwin' action='<?php echo $this->createLink('repo', 'linkTask', "repoID=$repoID&revision=$revision&browseType=$browseType¶m=$param&orderBy=$orderBy")?>'>
|
||||
<div class='table-header hl-primary text-primary strong'>
|
||||
<?php echo html::icon('unlink');?> <?php echo $lang->repo->unlinkedTasks;?>
|
||||
</div>
|
||||
<table class='table tablesorter'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
<th class='c-id text-left'>
|
||||
<?php if($allTasks):?>
|
||||
<div class="checkbox-primary check-all tablesorter-noSort" title="<?php echo $lang->selectAll?>">
|
||||
<label></label>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php echo $lang->idAB;?>
|
||||
</th>
|
||||
<th class='c-pri' title=<?php echo $lang->pri;?>><?php echo $lang->priAB;?></th>
|
||||
<th class='text-left'><?php echo $lang->task->name;?></th>
|
||||
<th class='c-user'><?php echo $lang->task->finishedByAB;?></th>
|
||||
<th class='c-user'><?php echo $lang->task->assignedToAB;?></th>
|
||||
<th class='c-status'><?php echo $lang->task->status;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='text-center'>
|
||||
<?php $unlinkedCount = 0;?>
|
||||
<?php foreach($allTasks as $task):?>
|
||||
<tr>
|
||||
<td class='c-id text-left'>
|
||||
<?php echo html::checkbox('tasks', array($task->id => sprintf('%03d', $task->id)));?>
|
||||
</td>
|
||||
<td><span class='label-pri label-pri-<?php echo $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri, $task->pri)?>'><?php echo zget($lang->task->priList, $task->pri, $task->pri)?></span></td>
|
||||
<td class='text-left nobr' title='<?php echo $task->name?>'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', true), $task->name, '', "data-toggle='modal' data-type='iframe' data-width='90%'");?></td>
|
||||
<td><?php echo zget($users, $task->finishedBy);?></td>
|
||||
<td><?php echo zget($users, $task->assignedTo);?></td>
|
||||
<td>
|
||||
<span class='status-task status-<?php echo $task->status?>'>
|
||||
<?php echo $this->processStatus('task', $task);?>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $unlinkedCount++;?>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class='table-footer'>
|
||||
<?php if($unlinkedCount):?>
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
<div class="table-actions btn-toolbar">
|
||||
<?php echo html::submitButton($lang->repo->linkTask, '', 'btn');?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class='table-statistic'></div>
|
||||
<?php $pager->show('right', 'pagerjs');?>
|
||||
</div>
|
||||
</form>
|
||||
<iframe frameborder="0" name="hiddenwin" id="hiddenwin" scrolling="no" class="debugwin hidden"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
$('#unlinkTaskList .tablesorter').sortTable();
|
||||
setForm();
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
/**
|
||||
* The create view file of repo module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2012 青岛易软天创网络科技有限公司 (QingDao Nature Easy Soft Network Technology Co,LTD www.cnezsoft.com)
|
||||
* @author Wang Yidong, Zhu Jinyong
|
||||
* @package repo
|
||||
* @version $Id: create.html.php $
|
||||
*/
|
||||
?>
|
||||
<?php
|
||||
include '../../common/view/header.html.php';
|
||||
js::import($jsRoot . '/zui/tabs/tabs.min.js');
|
||||
js::import($jsRoot . 'misc/base64.js');
|
||||
js::set('isonlybody', isonlybody());
|
||||
js::set('entry', $entry);
|
||||
js::set('repoID', $repoID);
|
||||
js::set('repo', $repo);
|
||||
js::set('revision', $revision);
|
||||
js::set('branchID', $branchID);
|
||||
js::set('file', $pathInfo);
|
||||
js::set('openedFiles', array($entry));
|
||||
js::set('urlParams', "repoID=$repoID&objectID=$objectID&entry=%s&revision=$revision&showBug=$showBug&encoding=$encoding");
|
||||
$encodePath = $this->repo->encodePath($entry);
|
||||
?>
|
||||
<?php if(!isonlybody()):?>
|
||||
<div id="mainContent" class="main-row fade">
|
||||
<?php $sideWidth = common::checkNotCN() ? '260' : '230';?>
|
||||
<div class="side-col" id="sidebar" style="width: <?php echo $sideWidth + 10;?>px;padding-top: <?php echo isonlybody() ? 22 : 0;?>px;">
|
||||
<div class="sidebar-toggle"><i class="icon icon-angle-left"></i></div>
|
||||
<div class="cell file-tree" style="width: <?php echo $sideWidth;?>px;" data-min-width="<?php echo $sideWidth;?>">
|
||||
<div id="filesTree" class="cell load-indicator <?php if(isonlybody()) echo 'pull-left';?>">
|
||||
<div class='btn-group' id='sourceSwapper'>
|
||||
<button data-toggle='dropdown' type='button' class='btn btn-link repo-select text-ellipsis' title='<?php echo $branchID;?>'>
|
||||
<span class='text version-name pull-left text-ellipsis'><?php echo $branchID;?></span>
|
||||
<span class='caret pull-right' style='margin-bottom: -1px'></span>
|
||||
</button>
|
||||
<div id='dropMenuSource' class='dropdown-menu search-list' data-ride='searchList' data-url=''>
|
||||
<div class="input-control search-box has-icon-left has-icon-right search-example">
|
||||
<input type="search" class="form-control search-input" id="searchSource" />
|
||||
<label class="input-control-icon-left search-icon"><i class="icon icon-search"></i></label>
|
||||
<a class="input-control-icon-right search-clear-btn"><i class="icon icon-close icon-sm"></i></a>
|
||||
</div>
|
||||
<div class="table-row">
|
||||
<div class="table-col col-left">
|
||||
<div class="list-group" id="branchList"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo $this->repo->getFileTree($repo);?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="main-col repoCode main">
|
||||
<div class="content panel">
|
||||
<div class='btn-toolbar'>
|
||||
<?php if(!isonlybody()):?>
|
||||
<div class="btn btn-left pull-left"><i class="icon icon-chevron-left"></i></div>
|
||||
<?php if(common::hasPriv('repo', 'blame') or common::hasPriv('repo', 'download')):?>
|
||||
<div class="dropdown pull-right">
|
||||
<button class="btn" type="button" data-toggle="context-dropdown"><i class="icon icon-ellipsis-v icon-rotate-90"></i></button>
|
||||
<ul class="dropdown-menu">
|
||||
<?php
|
||||
if(common::hasPriv('repo', 'blame')) echo '<li>' . html::a($this->repo->createLink('blame', "repoID=$repoID&objectID=$objectID&entry=$encodePath&revision=$revision&encoding=$encoding"), '<i class="icon icon-blame"></i> ' . $lang->repo->blame, '', "data-app='{$app->tab}'") . '</li>';
|
||||
if(common::hasPriv('repo', 'download')) echo '<li>' . html::a($this->repo->createLink('download', "repoID=$repoID&path=$encodePath&fromRevision=$revision"), '<i class="icon icon-download"></i> ' . $lang->repo->download, 'hiddenwin') . '</li>';
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="btn btn-right pull-right"><i class="icon icon-chevron-right"></i></div>
|
||||
<?php endif;?>
|
||||
<div class='panel-title'>
|
||||
<div class="tabs w-10" id="fileTabs"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(!isonlybody()):?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<a href='' class='iframe' data-width='90%' id='linkObject'></a>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -1386,6 +1386,7 @@ class story extends control
|
||||
$fromBug = $this->dao->select('id,title')->from(TABLE_BUG)->where('id')->eq($story->fromBug)->fetch();
|
||||
$cases = $this->dao->select('id,title,status,pri')->from(TABLE_CASE)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll();
|
||||
$linkedMRs = $this->loadModel('mr')->getLinkedMRPairs($storyID, 'story');
|
||||
$linkedCommits = $this->loadModel('repo')->getCommitsByObject($storyID, 'story');
|
||||
$modulePath = $this->tree->getParents($story->module);
|
||||
$storyModule = empty($story->module) ? '' : $this->tree->getById($story->module);
|
||||
$linkedStories = isset($story->linkStoryTitles) ? array_keys($story->linkStoryTitles) : array();
|
||||
@@ -1461,6 +1462,7 @@ class story extends control
|
||||
$this->view->cases = $cases;
|
||||
$this->view->story = $story;
|
||||
$this->view->linkedMRs = $linkedMRs;
|
||||
$this->view->linkedCommits = $linkedCommits;
|
||||
$this->view->track = $this->story->getTrackByID($story->id);
|
||||
$this->view->users = $this->user->getPairs('noletter');
|
||||
$this->view->reviewers = $reviewers;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user