Merge branch 'zenops_46' into sprint/220

This commit is contained in:
tanghucheng
2022-12-09 13:49:30 +08:00
1391 changed files with 943851 additions and 1505 deletions
+85
View File
@@ -0,0 +1,85 @@
<?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;
$host = new stdclass();
$host->status = $status;
if($secret)
{
$host->tokenSN = md5($secret . $now);
$host->tokenTime = date('Y-m-d H:i:s', time() + 7200);
}
$this->dao = $this->loadModel('common')->dao;
$id = $this->dao->select('id')->from(TABLE_ZAHOST)
->beginIF($secret)->where('secret')->eq($secret)->fi()
->beginIF(!$secret)->where('tokenSN')->eq($token)
->andWhere('tokenTime')->gt($now)->fi()
->fetch('id');
if(!$id) return $this->sendError(400, 'Secret error.');
$this->dao->update(TABLE_ZAHOST)->data($host)->where($conditionField)->eq($conditionValue)->exec();
$this->dao->update(TABLE_ZAHOST)
->set('heartbeat')->eq($now)
->set('zap')->eq($zap)
->where('id')->eq($id)->exec();
if($vms)
{
foreach($vms as $vm)
{
if(!empty($vm->vncPortOnHost))
{
$this->dao->update(TABLE_ZAHOST)
->set('vnc')->eq($vm->vncPortOnHost)
->set('zap')->eq($vm->agentPortOnHost)
->set('ztf')->eq($vm->ztfPortOnHost)
->set('zd')->eq($vm->zdPortOnHost)
->set('ssh')->eq($vm->sshPortOnHost)
->set('status')->eq($vm->status)
->where('mac')->eq($vm->macAddress)->exec();
}
}
}
if(!$secret) return $this->sendSuccess(200, 'success');
$host->tokenTimeUnix = strtotime($host->tokenTime);
unset($host->status);
unset($host->tokenTime);
return $this->send(200, $host);
}
}
+47
View File
@@ -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');
}
}
+81
View File
@@ -0,0 +1,81 @@
<?php
/**
* The zanode 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 zanodeHeartbeatEntry extends baseEntry
{
/**
* Listen vm 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 = isset($this->requestBody->status) ? $this->requestBody->status : '';
$mac = isset($this->requestBody->macAddress) ? $this->requestBody->macAddress : '';
$now = helper::now();
if(!$status || !$mac) return $this->sendError(400, 'Params error.');
$this->dao = $this->loadModel('common')->dao;
$host = $this->dao->select('id,extranet')->from(TABLE_ZAHOST)
->beginIF($secret)->where('secret')->eq($secret)->fi()
->beginIF(!$secret)->where('tokenSN')->eq($token)
->andWhere('tokenTime')->gt($now)->fi()
->fetch();
if(empty($host)) return $this->sendError(400, 'Secret error.');
$node = $this->dao->select('id,parent')->from(TABLE_ZAHOST)
->where('mac')->eq($mac)
->fetch();
if(empty($node) || ($node->parent != $host->id && $node->id != $host->id)) return $this->sendError(400, 'Secret error.');
$node->zap = $this->requestBody->agentPortOnHost;
$node->status = $this->requestBody->status;
if($secret)
{
$node->tokenSN = md5($secret . $now);
$node->tokenTime = date('Y-m-d H:i:s', time() + 7200);
}
$this->dao->update(TABLE_ZAHOST)->data($node)->where('id')->eq($node->id)->exec();
if($secret)
{
//install services
$node->ip = $host->extranet;
$nodeStatus = $this->loadModel('zanode')->getServiceStatus($node);
if($nodeStatus['ZTF'] != "ready")
{
$node->secret = $secret;
$node->extranet = $host->extranet;
$this->loadModel('zanode')->installService($node, "ZTF");
}
}
if(!$secret) return $this->sendSuccess(200, 'success');
$node->tokenTimeUnix = strtotime($node->tokenTime);
unset($node->status);
unset($node->tokenTime);
return $this->send(200, $node);
}
}
+5
View File
@@ -161,6 +161,11 @@ $routes['/modules'] = 'modules';
$routes['/reports'] = 'reports';
$routes['/host/heartbeat'] = 'hostHeartbeat';
$routes['/host/submitResult'] = 'hostSubmit';
$routes['/zanode/heartbeat'] = 'zanodeHeartbeat';
$routes['/z/folders'] = 'zfolders';
$routes['/z/folders/:id'] = 'zfolder';
$routes['/z/files/:id'] = 'zfile';
+55 -48
View File
@@ -253,6 +253,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`');
@@ -346,54 +351,56 @@ define('TABLE_CHART', '`' . $config->db->prefix . 'chart`');
define('TABLE_DASHBOARD', '`' . $config->db->prefix . 'dashboard`');
define('TABLE_DATASET', '`' . $config->db->prefix . 'dataset`');
$config->objectTables['product'] = TABLE_PRODUCT;
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
$config->objectTables['story'] = TABLE_STORY;
$config->objectTables['requirement'] = TABLE_STORY;
$config->objectTables['release'] = TABLE_RELEASE;
$config->objectTables['program'] = TABLE_PROJECT;
$config->objectTables['project'] = TABLE_PROJECT;
$config->objectTables['execution'] = TABLE_PROJECT;
$config->objectTables['task'] = TABLE_TASK;
$config->objectTables['build'] = TABLE_BUILD;
$config->objectTables['bug'] = TABLE_BUG;
$config->objectTables['case'] = TABLE_CASE;
$config->objectTables['testcase'] = TABLE_CASE;
$config->objectTables['testtask'] = TABLE_TESTTASK;
$config->objectTables['testsuite'] = TABLE_TESTSUITE;
$config->objectTables['testreport'] = TABLE_TESTREPORT;
$config->objectTables['user'] = TABLE_USER;
$config->objectTables['api'] = TABLE_API;
$config->objectTables['doc'] = TABLE_DOC;
$config->objectTables['doclib'] = TABLE_DOCLIB;
$config->objectTables['todo'] = TABLE_TODO;
$config->objectTables['custom'] = TABLE_LANG;
$config->objectTables['branch'] = TABLE_BRANCH;
$config->objectTables['module'] = TABLE_MODULE;
$config->objectTables['caselib'] = TABLE_TESTSUITE;
$config->objectTables['entry'] = TABLE_ENTRY;
$config->objectTables['webhook'] = TABLE_WEBHOOK;
$config->objectTables['stakeholder'] = TABLE_STAKEHOLDER;
$config->objectTables['job'] = TABLE_JOB;
$config->objectTables['team'] = TABLE_TEAM;
$config->objectTables['pipeline'] = TABLE_PIPELINE;
$config->objectTables['mr'] = TABLE_MR;
$config->objectTables['kanban'] = TABLE_KANBAN;
$config->objectTables['kanbanspace'] = TABLE_KANBANSPACE;
$config->objectTables['kanbanregion'] = TABLE_KANBANREGION;
$config->objectTables['kanbancolumn'] = TABLE_KANBANCOLUMN;
$config->objectTables['kanbanlane'] = TABLE_KANBANLANE;
$config->objectTables['kanbanorder'] = TABLE_KANBANORDER;
$config->objectTables['kanbangroup'] = TABLE_KANBANGROUP;
$config->objectTables['kanbancard'] = TABLE_KANBANCARD;
$config->objectTables['sonarqube'] = TABLE_PIPELINE;
$config->objectTables['gitea'] = TABLE_PIPELINE;
$config->objectTables['gogs'] = TABLE_PIPELINE;
$config->objectTables['gitlab'] = TABLE_PIPELINE;
$config->objectTables['jebkins'] = TABLE_PIPELINE;
$config->objectTables['stage'] = TABLE_STAGE;
$config->objectTables['apistruct'] = TABLE_APISTRUCT;
$config->objectTables['repo'] = TABLE_REPO;
$config->objectTables['product'] = TABLE_PRODUCT;
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
$config->objectTables['story'] = TABLE_STORY;
$config->objectTables['requirement'] = TABLE_STORY;
$config->objectTables['release'] = TABLE_RELEASE;
$config->objectTables['program'] = TABLE_PROJECT;
$config->objectTables['project'] = TABLE_PROJECT;
$config->objectTables['execution'] = TABLE_PROJECT;
$config->objectTables['task'] = TABLE_TASK;
$config->objectTables['build'] = TABLE_BUILD;
$config->objectTables['bug'] = TABLE_BUG;
$config->objectTables['case'] = TABLE_CASE;
$config->objectTables['testcase'] = TABLE_CASE;
$config->objectTables['testtask'] = TABLE_TESTTASK;
$config->objectTables['testsuite'] = TABLE_TESTSUITE;
$config->objectTables['testreport'] = TABLE_TESTREPORT;
$config->objectTables['user'] = TABLE_USER;
$config->objectTables['api'] = TABLE_API;
$config->objectTables['doc'] = TABLE_DOC;
$config->objectTables['doclib'] = TABLE_DOCLIB;
$config->objectTables['todo'] = TABLE_TODO;
$config->objectTables['custom'] = TABLE_LANG;
$config->objectTables['branch'] = TABLE_BRANCH;
$config->objectTables['module'] = TABLE_MODULE;
$config->objectTables['caselib'] = TABLE_TESTSUITE;
$config->objectTables['entry'] = TABLE_ENTRY;
$config->objectTables['webhook'] = TABLE_WEBHOOK;
$config->objectTables['stakeholder'] = TABLE_STAKEHOLDER;
$config->objectTables['job'] = TABLE_JOB;
$config->objectTables['team'] = TABLE_TEAM;
$config->objectTables['pipeline'] = TABLE_PIPELINE;
$config->objectTables['mr'] = TABLE_MR;
$config->objectTables['kanban'] = TABLE_KANBAN;
$config->objectTables['kanbanspace'] = TABLE_KANBANSPACE;
$config->objectTables['kanbanregion'] = TABLE_KANBANREGION;
$config->objectTables['kanbancolumn'] = TABLE_KANBANCOLUMN;
$config->objectTables['kanbanlane'] = TABLE_KANBANLANE;
$config->objectTables['kanbanorder'] = TABLE_KANBANORDER;
$config->objectTables['kanbangroup'] = TABLE_KANBANGROUP;
$config->objectTables['kanbancard'] = TABLE_KANBANCARD;
$config->objectTables['sonarqube'] = TABLE_PIPELINE;
$config->objectTables['gitea'] = TABLE_PIPELINE;
$config->objectTables['gogs'] = TABLE_PIPELINE;
$config->objectTables['gitlab'] = TABLE_PIPELINE;
$config->objectTables['jebkins'] = TABLE_PIPELINE;
$config->objectTables['stage'] = TABLE_STAGE;
$config->objectTables['apistruct'] = TABLE_APISTRUCT;
$config->objectTables['repo'] = TABLE_REPO;
$config->objectTables['zahost'] = TABLE_ZAHOST;
$config->objectTables['automation'] = TABLE_AUTOMATION;
$config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme', 'visions');
$config->disabledFeatures = '';
+14
View File
@@ -1 +1,15 @@
ALTER TABLE `zt_host` ADD `type` varchar(30) NOT NULL DEFAULT 'normal' AFTER `admin`;
ALTER TABLE `zt_host` ADD `secret` varchar(50) NOT NULL DEFAULT '' AFTER `type`;
ALTER TABLE `zt_host` ADD `token` varchar(50) NOT NULL DEFAULT '' AFTER `secret`;
ALTER TABLE `zt_host` ADD `expiredDate` datetime NOT NULL AFTER `token`;
ALTER TABLE `zt_host` ADD `virtualSoftware` varchar(30) NOT NULL DEFAULT '' AFTER `expiredDate`;
ALTER TABLE `zt_asset` ADD `registerDate` datetime NOT NULL AFTER `editedDate`;
ALTER TABLE `zt_vmtemplate` ADD `type` varchar(30) NOT NULL DEFAULT 'normal' AFTER `hostID`;
ALTER TABLE `zt_vmtemplate` ADD `imageName` varchar(50) NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `createdBy` varchar(30) NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `createdDate` datetime NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `editedBy` varchar(30) NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `editedDate` datetime NOT NULL;
ALTER TABLE `zt_vm` ADD `osVersion` varchar(50) NOT NULL DEFAULT '' AFTER `osCategory`;
UPDATE `zt_workflowlabel` SET `label` = '全部' where `label` = '所有' AND `action` = 'browse';
+14
View File
@@ -1,3 +1,17 @@
ALTER TABLE `zt_host` ADD `type` varchar(30) NOT NULL DEFAULT 'normal' AFTER `admin`;
ALTER TABLE `zt_host` ADD `secret` varchar(50) NOT NULL DEFAULT '' AFTER `type`;
ALTER TABLE `zt_host` ADD `token` varchar(50) NOT NULL DEFAULT '' AFTER `secret`;
ALTER TABLE `zt_host` ADD `expiredDate` datetime NOT NULL AFTER `token`;
ALTER TABLE `zt_host` ADD `virtualSoftware` varchar(30) NOT NULL DEFAULT '' AFTER `expiredDate`;
ALTER TABLE `zt_asset` ADD `registerDate` datetime NOT NULL AFTER `editedDate`;
ALTER TABLE `zt_vmtemplate` ADD `type` varchar(30) NOT NULL DEFAULT 'normal' AFTER `hostID`;
ALTER TABLE `zt_vmtemplate` ADD `imageName` varchar(50) NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `createdBy` varchar(30) NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `createdDate` datetime NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `editedBy` varchar(30) NOT NULL;
ALTER TABLE `zt_vmtemplate` ADD `editedDate` datetime NOT NULL;
ALTER TABLE `zt_vm` ADD `osVersion` varchar(50) NOT NULL DEFAULT '' AFTER `osCategory`;
ALTER TABLE `zt_vm` ADD `unit` enum('GB','TB') NOT NULL DEFAULT 'GB' AFTER `osDisk`;
update zt_kanban
set
colWidth = if(colWidth < 200, 200, colWidth),
+105
View File
@@ -8,6 +8,109 @@ ALTER TABLE `zt_release` CHANGE `branch` `branch` varchar(255) NOT NULL;
ALTER TABLE `zt_release` CHANGE `build` `build` varchar(255) NOT NULL;
ALTER TABLE `zt_release` ADD `shadow` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `branch`;
ALTER TABLE `zt_host`
DROP COLUMN `cabinet`,
DROP COLUMN `cpuRate`,
DROP COLUMN `diskType`,
DROP COLUMN `unit`,
DROP COLUMN `nic`,
DROP COLUMN `webserver`,
DROP COLUMN `database`,
DROP COLUMN `language`,
DROP COLUMN `instanceNum`,
DROP COLUMN `pri`,
DROP COLUMN `tags`,
DROP COLUMN `bridgeID`,
DROP COLUMN `cloudKey`,
DROP COLUMN `cloudSecret`,
DROP COLUMN `cloudRegion`,
DROP COLUMN `cloudNamespace`,
DROP COLUMN `cloudUser`,
DROP COLUMN `cloudAccount`,
DROP COLUMN `cloudPassword`,
DROP COLUMN `couldVPC`,
ADD COLUMN `name` varchar(255) NOT NULL DEFAULT '' AFTER `id`,
MODIFY COLUMN `type` varchar(30) NOT NULL DEFAULT 'normal' AFTER `name`,
MODIFY COLUMN `hostType` varchar(30) NOT NULL DEFAULT '' AFTER `type`,
MODIFY COLUMN `mac` varchar(128) NOT NULL AFTER `hostType`,
MODIFY COLUMN `memory` varchar(30) NOT NULL AFTER `mac`,
MODIFY COLUMN `diskSize` varchar(30) NOT NULL AFTER `memory`,
MODIFY COLUMN `status` varchar(50) NOT NULL AFTER `diskSize`,
MODIFY COLUMN `secret` varchar(50) NOT NULL DEFAULT '' AFTER `status`,
ADD COLUMN `desc` text NOT NULL AFTER `secret`,
CHANGE COLUMN `token` `tokenSN` varchar(50) NOT NULL DEFAULT '' AFTER `desc`,
CHANGE COLUMN `expiredDate` `tokenTime` datetime NOT NULL AFTER `tokenSN`,
CHANGE COLUMN `virtualSoftware` `vsoft` varchar(30) NOT NULL DEFAULT '' AFTER `tokenTime`,
CHANGE COLUMN `heartbeatTime` `heartbeat` datetime NOT NULL AFTER `vsoft`,
CHANGE COLUMN `agentPort` `zap` varchar(10) NOT NULL AFTER `heartbeat`,
MODIFY COLUMN `provider` varchar(255) NOT NULL DEFAULT '' AFTER `zap`,
ADD COLUMN `vnc` int(11) NOT NULL AFTER `provider`,
ADD COLUMN `ztf` int(11) NOT NULL AFTER `vnc`,
ADD COLUMN `zd` int(11) NOT NULL AFTER `ztf`,
ADD COLUMN `ssh` int(11) NOT NULL AFTER `zd`,
ADD COLUMN `parent` int(11) unsigned NOT NULL DEFAULT '0' AFTER `vnc`,
ADD COLUMN `image` int(11) unsigned NOT NULL DEFAULT '0' AFTER `parent`,
ADD COLUMN `group` varchar(128) NOT NULL DEFAULT '' AFTER `osVersion`,
ADD COLUMN `createdBy` varchar(30) NOT NULL,
ADD COLUMN `createdDate` datetime NOT NULL,
ADD COLUMN `editedBy` varchar(30) NOT NULL,
ADD COLUMN `editedDate` datetime NOT NULL,
ADD COLUMN `deleted` enum('0','1') NOT NULL DEFAULT '0',
CHANGE COLUMN `privateIP` `intranet` varchar(128) NOT NULL AFTER `cpuCores`,
CHANGE COLUMN `publicIP` `extranet` varchar(128) NOT NULL AFTER `intranet`;
UPDATE zt_host h,
zt_asset a
SET h.`name` = a.`name`,
h.`createdBy` = a.`createdBy`,
h.`createdDate` = a.`createdDate`,
h.`editedBy` = a.`editedBy`,
h.`editedDate` = a.`editedDate`,
h.`group` = a.`group`,
h.`type` = a.`type`,
h.`deleted` = a.`deleted`
WHERE
h.`assetID` = a.`id`;
ALTER TABLE `zt_host` DROP COLUMN `assetID`;
DROP TABLE IF EXISTS `zt_asset`;
DROP TABLE IF EXISTS `zt_baseimagebrowser`;
DROP TABLE IF EXISTS `zt_browser`;
DROP TABLE IF EXISTS `zt_baseimage`;
DROP TABLE IF EXISTS `zt_vmtemplate`;
DROP TABLE IF EXISTS `zt_vm`;
CREATE TABLE `zt_image` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`host` int(11) unsigned NOT NULL DEFAULT 0,
`name` varchar(64) NOT NULL DEFAULT '',
`address` varchar(64) NOT NULL DEFAULT '',
`path` varchar(64) NOT NULL DEFAULT '',
`status` varchar(20) NOT NULL DEFAULT '',
`osName` varchar(32) NOT NULL DEFAULT '',
`from` varchar(10) NOT NULL DEFAULT 'zentao',
`memory` float unsigned NOT NULL,
`disk` float unsigned NOT NULL,
`fileSize` float unsigned NOT NULL,
`md5` varchar(64) NOT NULL,
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `zt_automation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`node` int(11) unsigned NOT NULL DEFAULT 0,
`product` int(11) unsigned NOT NULL DEFAULT 0,
`scriptPath` varchar(255) NOT NULL DEFAULT '',
`shell` mediumtext NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE OR REPLACE VIEW `ztv_normalproduct` AS SELECT * FROM `zt_product` WHERE `shadow` = 0;
REPLACE INTO `zt_report` (`code`, `name`, `module`, `sql`, `vars`, `langs`, `params`, `step`, `desc`, `addedBy`, `addedDate`) VALUES
@@ -43,3 +146,5 @@ ALTER TABLE `zt_build` ADD `builds` varchar(255) NOT NULL AFTER `execution`;
UPDATE `zt_block` SET block = 'scrumrisk' WHERE module = 'project' AND type = 'scrum' AND block = 'waterfallrisk';
UPDATE `zt_block` SET block = 'scrumissue' WHERE module = 'project' AND type = 'scrum' AND block = 'waterfallissue';
ALTER TABLE `zt_repofiles` ADD `oldPath` varchar(255) DEFAULT '' AFTER `path`;
+69 -132
View File
@@ -7250,65 +7250,81 @@ CREATE TABLE IF NOT EXISTS `zt_account` (
key `status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_asset`;
CREATE TABLE IF NOT EXISTS `zt_asset` (
-- DROP TABLE IF EXISTS `zt_host`;
CREATE TABLE `zt_host` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`status` varchar(30) NOT NULL,
`type` varchar(30) NOT NULL,
`group` varchar(128) NOT NULL,
`createdBy` char(30) NOT NULL,
`name` varchar(255) NOT NULL DEFAULT '',
`type` varchar(30) NOT NULL DEFAULT 'normal',
`hostType` varchar(30) NOT NULL DEFAULT '',
`mac` varchar(128) NOT NULL,
`memory` varchar(30) NOT NULL,
`diskSize` varchar(30) NOT NULL,
`status` varchar(50) NOT NULL,
`secret` varchar(50) NOT NULL DEFAULT '',
`desc` text NOT NULL,
`tokenSN` varchar(50) NOT NULL DEFAULT '',
`tokenTime` datetime NOT NULL,
`vsoft` varchar(30) NOT NULL DEFAULT '',
`heartbeat` datetime NOT NULL,
`zap` varchar(10) NOT NULL,
`provider` varchar(255) NOT NULL DEFAULT '',
`vnc` int(11) NOT NULL,
`ztf` int(11) NOT NULL,
`zd` int(11) NOT NULL,
`ssh` int(11) NOT NULL,
`parent` int(11) unsigned NOT NULL DEFAULT '0',
`image` int(11) unsigned NOT NULL DEFAULT '0',
`assetID` mediumint(8) unsigned NOT NULL,
`admin` smallint(5) unsigned NOT NULL DEFAULT '0',
`serverRoom` mediumint(8) unsigned NOT NULL,
`serverModel` varchar(256) NOT NULL,
`hardwareType` varchar(64) NOT NULL,
`cpuBrand` varchar(128) NOT NULL,
`cpuModel` varchar(128) NOT NULL,
`cpuNumber` varchar(16) NOT NULL,
`cpuCores` varchar(30) NOT NULL,
`intranet` varchar(128) NOT NULL,
`extranet` varchar(128) NOT NULL,
`osName` varchar(64) NOT NULL,
`osVersion` varchar(64) NOT NULL,
`group` varchar(128) NOT NULL DEFAULT '',
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` char(30) NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- DROP TABLE IF EXISTS `zt_image`;
CREATE TABLE `zt_image` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`host` int(11) unsigned NOT NULL DEFAULT 0,
`name` varchar(64) NOT NULL DEFAULT '',
`address` varchar(64) NOT NULL DEFAULT '',
`path` varchar(64) NOT NULL DEFAULT '',
`status` varchar(20) NOT NULL DEFAULT '',
`osName` varchar(32) NOT NULL DEFAULT '',
`from` varchar(10) NOT NULL DEFAULT 'zentao',
`memory` float unsigned NOT NULL,
`disk` float unsigned NOT NULL,
`fileSize` float unsigned NOT NULL,
`md5` varchar(64) NOT NULL,
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_host`;
CREATE TABLE IF NOT EXISTS `zt_host` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`assetID` mediumint(8) UNSIGNED NOT NULL,
`admin` smallint(5) UNSIGNED NOT NULL DEFAULT 0,
`serverRoom` mediumint(8) UNSIGNED NOT NULL,
`cabinet` varchar(128) NOT NULL,
`serverModel` varchar(256) NOT NULL,
`hardwareType` varchar(64) NOT NULL,
`hostType` enum('physical','virtual') NOT NULL,
`cpuBrand` varchar(128) NOT NULL,
`cpuModel` varchar(128) NOT NULL,
`cpuNumber` varchar(16) NOT NULL,
`cpuCores` varchar(30) NOT NULL,
`cpuRate` varchar(30) NOT NULL,
`memory` varchar(30) NOT NULL,
`diskType` varchar(30) NOT NULL,
`diskSize` varchar(30) NOT NULL,
`unit` enum('GB','TB') NOT NULL DEFAULT 'GB',
`privateIP` varchar(128) NOT NULL,
`publicIP` varchar(128) NOT NULL,
`nic` varchar(128) NOT NULL,
`mac` varchar(128) NOT NULL,
`osName` varchar(64) NOT NULL,
`osVersion` varchar(64) NOT NULL,
`webserver` varchar(128) NOT NULL,
`database` varchar(128) NOT NULL,
`language` varchar(16) NOT NULL,
`status` varchar(50) NOT NULL,
`agentPort` varchar(10) NOT NULL,
`instanceNum` tinyint(0) NOT NULL DEFAULT 0,
`pri` smallint(5) unsigned NOT NULL DEFAULT 0,
`heartbeatTime` datetime NOT NULL,
`tags` varchar(50) NOT NULL DEFAULT '',
`provider` varchar(255) NOT NULL DEFAULT '',
`bridgeID` varchar(255) NOT NULL DEFAULT '',
`cloudKey` varchar(255) NOT NULL DEFAULT '',
`cloudSecret` varchar(255) NOT NULL DEFAULT '',
`cloudRegion` varchar(255) NOT NULL DEFAULT '',
`cloudNamespace` varchar(255) NOT NULL DEFAULT '',
`cloudUser` varchar(255) NOT NULL DEFAULT '',
`cloudAccount` varchar(255) NOT NULL DEFAULT '',
`cloudPassword` varchar(255) NOT NULL DEFAULT '',
`couldVPC` varchar(255) NOT NULL DEFAULT '',
-- DROP TABLE IF EXISTS `zt_automation`;
CREATE TABLE `zt_automation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`node` int(11) unsigned NOT NULL DEFAULT 0,
`product` int(11) unsigned NOT NULL DEFAULT 0,
`scriptPath` varchar(255) NOT NULL DEFAULT '',
`shell` mediumtext NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -7555,86 +7571,6 @@ CREATE TABLE IF NOT EXISTS `zt_deployscope` (
`remove` text NOT NULL,
`add` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_vm`;
CREATE TABLE IF NOT EXISTS `zt_vm` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hostID` int(10) unsigned NOT NULL DEFAULT 0,
`name` varchar(255) NOT NULL DEFAULT '',
`osCategory` varchar(50) NOT NULL DEFAULT '',
`osType` varchar(50) NOT NULL DEFAULT '',
`osArch` varchar(50) NOT NULL DEFAULT '',
`osLang` varchar(50) NOT NULL DEFAULT '',
`osCpu` tinyint(2) NOT NULL DEFAULT 0,
`osMemory` smallint(6) NOT NULL DEFAULT 0,
`osDisk` smallint(6) NOT NULL DEFAULT 0,
`status` varchar(50) NOT NULL DEFAULT '',
`destroyAt` datetime NULL,
`macAddress` varchar(255) NOT NULL DEFAULT '',
`workspace` varchar(255) NOT NULL DEFAULT '',
`templateID` int(10) unsigned NOT NULL DEFAULT 0,
`baseImageID` int(10) unsigned NOT NULL DEFAULT 0,
`baseImagePath` varchar(255) NOT NULL DEFAULT '',
`desc` varchar(255) NOT NULL DEFAULT '',
`heatbeat` datetime NULL,
`vncPort` int(10) NOT NULL DEFAULT 0,
`instance` varchar(255) NOT NULL DEFAULT '',
`eip` varchar(255) NOT NULL DEFAULT '',
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`public` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_baseimage`;
CREATE TABLE IF NOT EXISTS `zt_baseimage` (
`id` SMALLINT(7) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`path` varchar(255) NOT NULL DEFAULT '',
`osType` varchar(50) NOT NULL DEFAULT '',
`os` varchar(50) NOT NULL DEFAULT '',
`osCategory` varchar(50) NOT NULL DEFAULT '',
`osArch` varchar(50) NOT NULL DEFAULT '',
`osLang` varchar(50) NOT NULL DEFAULT '',
`suggestCore` tinyint(1) unsigned NOT NULL DEFAULT 0,
`suggestMemory` mediumint(6) unsigned NOT NULL DEFAULT 0,
`suggestVolume` mediumint(6) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_vmtemplate`;
CREATE TABLE IF NOT EXISTS `zt_vmtemplate` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`hostID` int(10) unsigned NOT NULL DEFAULT 0,
`templateName` varchar(255) NOT NULL DEFAULT '',
`osType` varchar(50) NOT NULL DEFAULT '',
`osCategory` varchar(50) NOT NULL DEFAULT '',
`osVersion` varchar(50) NOT NULL DEFAULT '',
`osLang` varchar(50) NOT NULL,
`cpuCoreNum` smallint(4) NOT NULL DEFAULT 0,
`memorySize` int NOT NULL DEFAULT 0,
`diskSize` int NOT NULL DEFAULT 0,
`osArch` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_browser`;
CREATE TABLE IF NOT EXISTS `zt_browser` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`type` varchar(255) NOT NULL DEFAULT '',
`version` varchar(255) NOT NULL DEFAULT '',
`lang` varchar(255) NOT NULL DEFAULT '',
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_baseimagebrowser`;
CREATE TABLE IF NOT EXISTS `zt_baseimagebrowser` (
`vmBackingID` int(10) NOT NULL,
`browserID` int(10) NOT NULL,
PRIMARY KEY (`vmBackingID`, `browserID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_traincourse`;
CREATE TABLE IF NOT EXISTS `zt_traincourse` (
@@ -9642,6 +9578,7 @@ CREATE TABLE IF NOT EXISTS `zt_assetlib` (
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`registerDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;
+6 -3
View File
@@ -734,10 +734,13 @@ class baseRouter
$account = $sql->quote($account);
$vision = $this->dbh->query("SELECT * FROM " . TABLE_CONFIG . " WHERE owner = $account AND `key` = 'vision' LIMIT 1")->fetch();
if($vision) $vision = $vision->value;
if(empty($vision))
$user = $this->dbh->query("SELECT * FROM " . TABLE_USER . " WHERE account = $account AND deleted = '0' LIMIT 1")->fetch();
if(!empty($user->visions))
{
$user = $this->dbh->query("SELECT * FROM " . TABLE_USER . " WHERE account = $account AND deleted = '0' LIMIT 1")->fetch();
if(!empty($user->visions)) list($vision) = explode(',', $user->visions);
$userVisions = explode(',', $user->visions);
if(!in_array($vision, $userVisions)) $vision = '';
if(empty($vision)) list($vision) = $userVisions;
}
}
+1 -1
View File
@@ -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
View File
@@ -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;
}
}
+50 -6
View File
@@ -257,6 +257,7 @@ class gitlab
$param = new stdclass;
$param->ref = ($revision and $revision != 'HEAD') ? $revision : $this->branch;
$results = $this->fetch($api, $param);
if(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;
}
}
+59 -6
View File
@@ -28,7 +28,9 @@ class GitRepo
if($branch)
{
$branches = $this->branch();
if(isset($branches[$branch])) $branch = "origin/$branch";
$cmd = escapeCmd("$this->client branch -r");
execCmd($cmd . ' 2>&1', 'string', $result);
if(isset($branches[$branch]) and !empty($result)) $branch = "origin/$branch";
}
$this->branch = $branch;
$this->repo = $repo;
@@ -199,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. */
@@ -264,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;
@@ -594,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;
@@ -667,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;
}
}
@@ -712,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
View File
@@ -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;
}
}
+25
View File
@@ -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);
}
}
/**
+57 -2
View File
@@ -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;
}
}
+18 -6
View File
@@ -18,10 +18,12 @@ class zfile
* @param string $to
* @param bool $logLevel
* @param string $logFile
* @param array $excludeFiles
* @param bool $toIsLink
* @access public
* @return array copied files, count, size or message.
*/
public function copyDir($from, $to, $logLevel = false, $logFile = '')
public function copyDir($from, $to, $logLevel = false, $logFile = '', $excludeFiles = array(), $toIsLink = false)
{
static $copiedFiles = array();
static $errorFiles = array();
@@ -41,12 +43,21 @@ class zfile
if(!empty($log['message'])) return $log;
$from = realpath($from) . '/';
$to = realpath($to) . '/';
if(is_link($to) || $toIsLink)
{
$to = $to . '/';
$toIsLink = true;
}
else
{
$to = realpath($to) . '/';
}
$entries = scandir($from);
foreach($entries as $entry)
{
if($entry == '.' or $entry == '..' or $entry == '.svn' or $entry == '.git') continue;
if($entry == '.' or $entry == '..' or $entry == '.svn' or $entry == '.git' or in_array($entry, $excludeFiles)) continue;
$fullEntry = $from . $entry;
if(is_file($fullEntry))
@@ -82,7 +93,7 @@ class zfile
{
$nextFrom = $fullEntry;
$nextTo = $to . $entry;
$result = $this->copyDir($nextFrom, $nextTo, $logLevel, $logFile);
$result = $this->copyDir($nextFrom, $nextTo, $logLevel, $logFile, array(), $toIsLink);
$count += $result['count'];
$size += $result['size'];
}
@@ -101,10 +112,11 @@ class zfile
* Get count.
*
* @param string $dir
* @param array $excludeFiles
* @access public
* @return int
*/
public function getCount($dir)
public function getCount($dir, $excludeFiles = array())
{
if(!file_exists($dir)) return 0;
if(is_file($dir)) return 1;
@@ -113,7 +125,7 @@ class zfile
$entries = scandir($dir);
foreach($entries as $entry)
{
if($entry == '.' or $entry == '..' or $entry == '.svn' or $entry == '.git') continue;
if($entry == '.' or $entry == '..' or $entry == '.svn' or $entry == '.git' or in_array($entry, $excludeFiles)) continue;
$fullEntry = $dir . '/' . $entry;
$count += $this->getCount($fullEntry);
+50 -49
View File
@@ -1,53 +1,54 @@
<?php
$config->action->objectNameFields['product'] = 'name';
$config->action->objectNameFields['story'] = 'title';
$config->action->objectNameFields['requirement'] = 'title';
$config->action->objectNameFields['productplan'] = 'title';
$config->action->objectNameFields['release'] = 'name';
$config->action->objectNameFields['program'] = 'name';
$config->action->objectNameFields['project'] = 'name';
$config->action->objectNameFields['execution'] = 'name';
$config->action->objectNameFields['task'] = 'name';
$config->action->objectNameFields['build'] = 'name';
$config->action->objectNameFields['bug'] = 'title';
$config->action->objectNameFields['testcase'] = 'title';
$config->action->objectNameFields['case'] = 'title';
$config->action->objectNameFields['testtask'] = 'name';
$config->action->objectNameFields['user'] = 'account';
$config->action->objectNameFields['api'] = 'title';
$config->action->objectNameFields['doc'] = 'title';
$config->action->objectNameFields['doclib'] = 'name';
$config->action->objectNameFields['todo'] = 'name';
$config->action->objectNameFields['branch'] = 'name';
$config->action->objectNameFields['module'] = 'name';
$config->action->objectNameFields['testsuite'] = 'name';
$config->action->objectNameFields['caselib'] = 'name';
$config->action->objectNameFields['testreport'] = 'title';
$config->action->objectNameFields['entry'] = 'name';
$config->action->objectNameFields['webhook'] = 'name';
$config->action->objectNameFields['risk'] = 'name';
$config->action->objectNameFields['issue'] = 'title';
$config->action->objectNameFields['design'] = 'name';
$config->action->objectNameFields['stakeholder'] = 'user';
$config->action->objectNameFields['budget'] = 'name';
$config->action->objectNameFields['job'] = 'name';
$config->action->objectNameFields['team'] = 'name';
$config->action->objectNameFields['pipeline'] = 'name';
$config->action->objectNameFields['mr'] = 'title';
$config->action->objectNameFields['reviewcl'] = 'title';
$config->action->objectNameFields['kanbancolumn'] = 'name';
$config->action->objectNameFields['kanbanlane'] = 'name';
$config->action->objectNameFields['kanbanspace'] = 'name';
$config->action->objectNameFields['kanbanregion'] = 'name';
$config->action->objectNameFields['kanban'] = 'name';
$config->action->objectNameFields['kanbancard'] = 'name';
$config->action->objectNameFields['sonarqube'] = 'name';
$config->action->objectNameFields['gitlab'] = 'name';
$config->action->objectNameFields['gitea'] = 'name';
$config->action->objectNameFields['gogs'] = 'name';
$config->action->objectNameFields['stage'] = 'name';
$config->action->objectNameFields['apistruct'] = 'name';
$config->action->objectNameFields['repo'] = 'name';
$config->action->objectNameFields['product'] = 'name';
$config->action->objectNameFields['story'] = 'title';
$config->action->objectNameFields['requirement'] = 'title';
$config->action->objectNameFields['productplan'] = 'title';
$config->action->objectNameFields['release'] = 'name';
$config->action->objectNameFields['program'] = 'name';
$config->action->objectNameFields['project'] = 'name';
$config->action->objectNameFields['execution'] = 'name';
$config->action->objectNameFields['task'] = 'name';
$config->action->objectNameFields['build'] = 'name';
$config->action->objectNameFields['bug'] = 'title';
$config->action->objectNameFields['testcase'] = 'title';
$config->action->objectNameFields['case'] = 'title';
$config->action->objectNameFields['testtask'] = 'name';
$config->action->objectNameFields['user'] = 'account';
$config->action->objectNameFields['api'] = 'title';
$config->action->objectNameFields['doc'] = 'title';
$config->action->objectNameFields['doclib'] = 'name';
$config->action->objectNameFields['todo'] = 'name';
$config->action->objectNameFields['branch'] = 'name';
$config->action->objectNameFields['module'] = 'name';
$config->action->objectNameFields['testsuite'] = 'name';
$config->action->objectNameFields['caselib'] = 'name';
$config->action->objectNameFields['testreport'] = 'title';
$config->action->objectNameFields['entry'] = 'name';
$config->action->objectNameFields['webhook'] = 'name';
$config->action->objectNameFields['risk'] = 'name';
$config->action->objectNameFields['issue'] = 'title';
$config->action->objectNameFields['design'] = 'name';
$config->action->objectNameFields['stakeholder'] = 'user';
$config->action->objectNameFields['budget'] = 'name';
$config->action->objectNameFields['job'] = 'name';
$config->action->objectNameFields['team'] = 'name';
$config->action->objectNameFields['pipeline'] = 'name';
$config->action->objectNameFields['mr'] = 'title';
$config->action->objectNameFields['reviewcl'] = 'title';
$config->action->objectNameFields['kanbancolumn'] = 'name';
$config->action->objectNameFields['kanbanlane'] = 'name';
$config->action->objectNameFields['kanbanspace'] = 'name';
$config->action->objectNameFields['kanbanregion'] = 'name';
$config->action->objectNameFields['kanban'] = 'name';
$config->action->objectNameFields['kanbancard'] = 'name';
$config->action->objectNameFields['sonarqube'] = 'name';
$config->action->objectNameFields['gitlab'] = 'name';
$config->action->objectNameFields['gitea'] = 'name';
$config->action->objectNameFields['gogs'] = 'name';
$config->action->objectNameFields['stage'] = 'name';
$config->action->objectNameFields['apistruct'] = 'name';
$config->action->objectNameFields['repo'] = 'name';
$config->action->objectNameFields['zanode'] = 'name';
$config->action->commonImgSize = 870;
+81 -52
View File
@@ -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';
@@ -225,8 +227,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 execution node is suspended by <strong>$actor</strong> .' . "\n";
$lang->action->desc->resume = '$date, the execution node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the execution node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the execution node is destroyed 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->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the sprints of the project from the $extra.' . "\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. */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
@@ -303,6 +310,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";
@@ -395,6 +404,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->switchtolight = 'switch from ALM mode to light mode';
$lang->action->label->linkedrepo = 'Linked Code Repo';
$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
@@ -471,6 +484,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';
@@ -528,62 +543,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';
@@ -621,6 +640,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';
@@ -871,6 +898,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}";
+82 -52
View File
@@ -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';
@@ -225,8 +227,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 execution node is suspended by <strong>$actor</strong> .' . "\n";
$lang->action->desc->resume = '$date, the execution node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the execution node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the execution node is destroyed 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->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the sprints of the project from the $extra.' . "\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. */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
@@ -303,6 +310,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 ";
@@ -395,6 +404,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->switchtolight = 'switch from ALM mode to light mode';
$lang->action->label->linkedrepo = 'Linked Code Repo';
$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
@@ -471,6 +484,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';
@@ -528,62 +544,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';
@@ -621,6 +641,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';
@@ -871,6 +899,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}";
+30 -1
View File
@@ -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';
@@ -225,8 +227,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 execution node is suspended by <strong>$actor</strong> .' . "\n";
$lang->action->desc->resume = '$date, the execution node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the execution node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the execution node is destroyed 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->unlinkproduct = '$date, the project is disassociated from the $extra, synchronization disassociates the sprints of the project from the $extra.' . "\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. */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> a créé un sous-tâche <strong>$extra</strong>。' . "\n";
@@ -303,6 +310,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 ";
@@ -395,6 +404,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->switchtolight = 'switch from ALM mode to light mode';
$lang->action->label->linkedrepo = 'Linked Code Repo';
$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
@@ -471,6 +484,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';
@@ -558,6 +573,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';
@@ -581,6 +598,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';
@@ -621,6 +640,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';
@@ -871,6 +898,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
View File
@@ -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';
@@ -184,6 +186,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 execution node is suspended by <strong>$actor</strong> .' . "\n";
$lang->action->desc->resume = '$date, the execution node is resumed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->reboot = '$date, the execution node is reboot by <strong>$actor</strong> .' . "\n";
$lang->action->desc->destroy = '$date, the execution 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";
@@ -250,6 +256,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 ";
@@ -306,6 +314,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->linkedrepo = 'Linked Code Repo';
$lang->action->label->unlinkedrepo = 'Unlinked Code Repo';
@@ -363,6 +375,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';
@@ -387,58 +401,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';
@@ -474,6 +493,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';
+82 -52
View File
@@ -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'] = '文档库';
@@ -225,8 +227,13 @@ $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->switchtolight = '$date, 由于 <strong>'. $lang->admin->system .'</strong> 从全生命周期管理模式切换为轻量管理模式,项目访问控制由项目集内公开调整为私有。' . "\n";
$lang->action->desc->unlinkproduct = '$date, 系统判断由于迭代所属项目与$extra取消关联,同步将迭代与$extra取消关联。' . "\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";
/* 用来描述和父子任务相关的操作历史记录。*/
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 创建子任务 <strong>$extra</strong>。' . "\n";
@@ -303,6 +310,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 = "关联了相关用例";
@@ -395,6 +404,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->switchtolight = '从全生命周期管理模式切换为轻量管理模式';
$lang->action->label->linkedrepo = '关联代码库到';
$lang->action->label->unlinkedrepo = '取消了项目与代码库的关联';
@@ -471,6 +485,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'] = '移除项目';
@@ -528,62 +544,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'] = '编辑测试单';
@@ -621,6 +641,14 @@ $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['destroy'] = '销毁执行节点';
$lang->action->dynamicAction->doclib['created'] = '创建文档库';
$lang->action->dynamicAction->doclib['edited'] = '编辑文档库';
$lang->action->dynamicAction->doclib['deleted'] = '删除文档库';
@@ -871,6 +899,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
View File
@@ -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');
@@ -323,29 +325,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');
@@ -420,6 +423,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');
+1
View File
@@ -141,3 +141,4 @@ $lang->admin->safe->resetPWDList[0] = 'Off';
$lang->admin->safe->noticeMode = 'The password will be checked when creating and modifying user information, and changing passwords.';
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
+1
View File
@@ -141,3 +141,4 @@ $lang->admin->safe->resetPWDList[0] = 'Off';
$lang->admin->safe->noticeMode = 'The password will be checked when creating and modifying user information, and changing passwords.';
$lang->admin->safe->noticeWeakMode = 'The password will be checked when logging into the system, creating and modifying user information, and changing passwords.';
$lang->admin->safe->noticeStrong = 'The longer the password, the more letters, numbers, or special characters it contains, and the less repetitive the password, the more secure it is!';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
+1
View File
@@ -141,3 +141,4 @@ $lang->admin->safe->resetPWDList[0] = 'Off';
$lang->admin->safe->noticeMode = "Le mot de passe sera vérifié lors de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
$lang->admin->safe->noticeWeakMode = "Le mot de passe sera vérifié lors de la connexion au système, de la création et de la modification des coordonnées de l'utilisateur, et du changement de mot de passe.";
$lang->admin->safe->noticeStrong = "Le mot de passe est d'autant plus sécurisé qu'il est long, qu'il contient plus de lettres, de chiffres ou de caractères spéciaux, et que les lettres du mot de passe sont peu répétitives !";
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
+1
View File
@@ -84,3 +84,4 @@ $lang->admin->safe->loginCaptchaList[0] = 'No';
$lang->admin->safe->noticeMode = 'Mật khẩu sẽ được kiểm tra khi người dùng đăng nhập hoặc người dùng thêm hoặc sửa.';
$lang->admin->safe->noticeStrong = '';
$lang->admin->safe->noticeGd = 'Your server does not have GD module installed, you cannot use the Captcha function, Please use it after installation.';
+1
View File
@@ -141,3 +141,4 @@ $lang->admin->safe->resetPWDList[0] = '关闭';
$lang->admin->safe->noticeMode = '系统会在创建和修改用户、修改密码的时候检查用户口令。';
$lang->admin->safe->noticeWeakMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
$lang->admin->safe->noticeGd = '系统检测到您的服务器未安装GD模块,无法使用验证码功能,请安装后使用。';
+4 -2
View File
@@ -82,5 +82,7 @@ $lang->admin->safe->modifyPasswordList[0] = '不強制';
$lang->admin->safe->loginCaptchaList[1] = '是';
$lang->admin->safe->loginCaptchaList[0] = '否';
$lang->admin->safe->noticeMode = '系統會在登錄、創建和修改用戶、修改密碼的時候檢查用戶口令。';
$lang->admin->safe->noticeStrong = '密碼長度越長,含有大寫字母或數字或特殊符號越多,密碼字母越不重複,安全度越強!';
$lang->admin->safe->noticeMode = '系統會在創建和修改用戶、修改密碼的時候檢查用戶口令。';
$lang->admin->safe->noticeWeakMode = '系統會在登錄、創建和修改用戶、修改密碼的時候檢查用戶口令。';
$lang->admin->safe->noticeStrong = '密碼長度越長,含有大寫字母或數字或特殊符號越多,密碼字母越不重複,安全度越強!';
$lang->admin->safe->noticeGd = '系統檢測到您的伺服器未安裝GD模組,無法使用驗證碼功能,請安裝後使用。';
+4 -1
View File
@@ -16,6 +16,7 @@
.notice {color:#2667E3; margin-left: 12px;}
</style>
<?php js::set('adminLang', $lang->admin);?>
<?php js::set('loadedGD', extension_loaded('gd'));?>
<?php include '../../common/view/header.html.php';?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
@@ -71,7 +72,8 @@
</tr>
<tr>
<th><?php echo $lang->admin->safe->loginCaptcha?></th>
<td colspan='2'><?php echo html::radio('loginCaptcha', $lang->admin->safe->loginCaptchaList, isset($config->safe->loginCaptcha) ? $config->safe->loginCaptcha : 0)?></td>
<td><?php echo html::radio('loginCaptcha', $lang->admin->safe->loginCaptchaList, isset($config->safe->loginCaptcha) ? $config->safe->loginCaptcha : 0)?></td>
<td class='notice'><?php if(!extension_loaded('gd')) echo $lang->admin->safe->noticeGd;?></td>
</tr>
<tr>
<td colspan='3' class='text-center form-actions'>
@@ -89,6 +91,7 @@ $(function()
{
var mode = $("input[name='mode']:checked").val();
showModeRule(mode);
if(!loadedGD) $('#loginCaptcha1').attr('disabled', true);
});
function showModeRule(mode)
{
+4 -4
View File
@@ -33,7 +33,7 @@
<?php $code = $group . ucfirst($feature);?>
<?php if(strpos(",$disabledFeatures,", ",$code,") !== false) continue;?>
<?php $hasData = true;?>
<?php endForeach;?>
<?php endforeach;?>
<?php if($hasData):?>
<tr>
@@ -52,11 +52,11 @@
<?php echo html::checkbox("module[{$code}]", array('1' => $lang->admin->setModule->{$feature}), $value, "data-code='{$code}'", 'inline');?>
<?php echo html::hidden("module[{$code}][]", $value, $value ? 'disabled' : '');?>
</div>
<?php endForeach;?>
<?php endforeach;?>
</td>
</tr>
<?php endif;?>
<?php endForeach;?>
<?php endforeach;?>
<tr>
<td class='text-middle text-right thWidth'>
<div class="checkbox-primary checkbox-inline checkbox-right check-all">
@@ -68,7 +68,7 @@
</tr>
</tbody>
</table>
</form>`
</form>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>
+3 -2
View File
@@ -34,6 +34,7 @@ class backupModel extends model
public function backFile($backupFile)
{
$zfile = $this->app->loadClass('zfile');
$return = new stdclass();
$return->result = true;
$return->error = '';
@@ -42,10 +43,10 @@ class backupModel extends model
$tmpLogFile = $this->getTmpLogFile($backupFile);
$dataDir = $this->app->getAppRoot() . 'www/data/';
$count = $zfile->getCount($dataDir);
$count = $zfile->getCount($dataDir, array('course'));
file_put_contents($tmpLogFile, json_encode(array('allCount' => $count)));
$result = $zfile->copyDir($dataDir, $backupFile, $logLevel = false, $tmpLogFile);
$result = $zfile->copyDir($dataDir, $backupFile, $logLevel = false, $tmpLogFile, array('course'));
$this->processSummary($backupFile, $result['count'], $result['size'], $result['errorFiles'], $count);
unlink($tmpLogFile);
@@ -19,8 +19,9 @@
<?php $isFirstTab = true;?>
<?php $printMore = false;?>
<?php $i = 0;?>
<?php $maxItem = common::checkNotCN() ? 6 : 8;?>
<?php foreach($hasViewPriv as $type => $bool):?>
<?php if(!common::checkNotCN() or $i <= 6):?>
<?php if($i <= $maxItem):?>
<li<?php if($isFirstTab) {echo ' class="active"';}?>>
<a data-tab href='#assigntomeTab-<?php echo $type;?>' onClick="changeLabel('<?php echo $type;?>')">
<?php echo $type == 'review' ? $lang->my->audit : $lang->block->availableBlocks->$type;?>
@@ -36,7 +37,7 @@
<?php endif;?>
<li<?php if($isFirstTab) {echo ' class="active"';}?>>
<a data-tab href='#assigntomeTab-<?php echo $type;?>' class='<?php echo "$type"?>' onClick="changeMoreBtn('<?php echo $type;?>', this);">
<?php echo $lang->block->availableBlocks->$type;?>
<?php echo $type == 'review' ? $lang->my->audit : $lang->block->availableBlocks->$type;?>
<span class='label label-light label-badge label-assignto <?php echo $type . "-count "; echo $isFirstTab ? '' : 'hidden'; $isFirstTab = false ?>'><?php echo $count[$type];?></span>
</a>
</li>
+2
View File
@@ -328,11 +328,13 @@ $config->bug->datatable->fieldList['os']['title'] = 'os';
$config->bug->datatable->fieldList['os']['fixed'] = 'no';
$config->bug->datatable->fieldList['os']['width'] = '80';
$config->bug->datatable->fieldList['os']['required'] = 'no';
$config->bug->datatable->fieldList['os']['control'] = 'multiple';
$config->bug->datatable->fieldList['browser']['title'] = 'browser';
$config->bug->datatable->fieldList['browser']['fixed'] = 'no';
$config->bug->datatable->fieldList['browser']['width'] = '80';
$config->bug->datatable->fieldList['browser']['required'] = 'no';
$config->bug->datatable->fieldList['browser']['control'] = 'multiple';
$config->bug->datatable->fieldList['mailto']['title'] = 'mailto';
$config->bug->datatable->fieldList['mailto']['fixed'] = 'no';
+40 -23
View File
@@ -227,7 +227,8 @@ class bug extends control
$this->view->product = $product;
$this->view->projectProducts = $this->product->getProducts($this->projectID);
$this->view->productName = $productName;
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'withreleased');
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $branch);
$this->view->releasedBuilds = $this->loadModel('release')->getReleasedBuilds($productID, $branch);
$this->view->modules = $this->tree->getOptionMenu($productID, $viewType = 'bug', $startModuleID = 0, $branch);
$this->view->moduleTree = $moduleTree;
$this->view->moduleName = $moduleID ? $this->tree->getById($moduleID)->name : $this->lang->tree->all;
@@ -558,13 +559,13 @@ class bug extends control
/* If executionID is setted, get builds and stories of this execution. */
if($executionID)
{
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noterminate,nodone', $executionID, 'execution');
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noterminate,nodone,noreleased', $executionID, 'execution');
$stories = $this->story->getExecutionStoryPairs($executionID);
if(!$projectID) $projectID = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch('project');
}
else
{
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noterminate,nodone,withbranch');
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noterminate,nodone,withbranch,noreleased');
$stories = $this->story->getProductStoryPairs($productID, $branch, 0, 'all','id_desc', 0, 'full', 'story', false);
}
@@ -655,6 +656,7 @@ class bug extends control
$this->view->projectExecutionPairs = $this->loadModel('project')->getProjectExecutionPairs();
$this->view->executions = defined('TUTORIAL') ? $this->loadModel('tutorial')->getExecutionPairs() : $executions;
$this->view->builds = $builds;
$this->view->releasedBuilds = $this->loadModel('release')->getReleasedBuilds($productID, $branch);
$this->view->moduleID = (int)$moduleID;
$this->view->projectID = $projectID;
$this->view->projectModel = $projectModel;
@@ -765,7 +767,7 @@ class bug extends control
/* If executionID is setted, get builds and stories of this execution. */
if($executionID)
{
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty', $executionID, 'execution');
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noreleased', $executionID, 'execution');
$stories = $this->story->getExecutionStoryPairs($executionID);
$execution = $this->loadModel('execution')->getById($executionID);
if($execution->type == 'kanban')
@@ -785,7 +787,7 @@ class bug extends control
}
else
{
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty');
$builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noreleased');
$stories = $this->story->getProductStoryPairs($productID, $branch);
}
@@ -933,9 +935,10 @@ class bug extends control
$this->view->branchName = $product->type == 'normal' ? '' : zget($branches, $bug->branch, '');
$this->view->users = $this->user->getPairs('noletter');
$this->view->actions = $this->action->getList('bug', $bugID);
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'withreleased');
$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;
@@ -1079,18 +1082,18 @@ class bug extends control
$this->view->position[] = $this->lang->bug->edit;
/* Assign. */
$allBuilds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'noempty,withreleased');
$allBuilds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'noempty');
if($executionID)
{
$openedBuilds = $this->build->getBuildPairs($productID, $bug->branch, 'noempty,noterminate,nodone,withbranch', $executionID, 'execution');
$openedBuilds = $this->build->getBuildPairs($productID, $bug->branch, 'noempty,noterminate,nodone,withbranch,noreleased', $executionID, 'execution');
}
elseif($projectID)
{
$openedBuilds = $this->build->getBuildPairs($productID, $bug->branch, 'noempty,noterminate,nodone,withbranch', $projectID, 'project');
$openedBuilds = $this->build->getBuildPairs($productID, $bug->branch, 'noempty,noterminate,nodone,withbranch,noreleased', $projectID, 'project');
}
else
{
$openedBuilds = $this->build->getBuildPairs($productID, $bug->branch, 'noempty,noterminate,nodone,withbranch');
$openedBuilds = $this->build->getBuildPairs($productID, $bug->branch, 'noempty,noterminate,nodone,withbranch,noreleased');
}
/* Set the openedBuilds list. */
@@ -1163,7 +1166,6 @@ class bug extends control
if($product->shadow) $this->view->project = $this->loadModel('project')->getByShadowProduct($bug->product);
$this->view->bug = $bug;
$this->view->productID = $productID;
$this->view->product = $product;
$this->view->execution = $execution;
$this->view->productBugs = $productBugs;
@@ -1828,15 +1830,15 @@ class bug extends control
$this->bug->checkBugExecutionPriv($bug);
$this->qa->setMenu($this->products, $productID, $bug->branch);
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->resolve;
$this->view->bug = $bug;
$this->view->users = $users;
$this->view->assignedTo = $assignedTo;
$this->view->productBugs = $productBugs;
$this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID, 'stagefilter');
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'withbranch');
$this->view->actions = $this->action->getList('bug', $bugID);
$this->view->execution = isset($execution) ? $execution : '';
$this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->bug->resolve;
$this->view->bug = $bug;
$this->view->users = $users;
$this->view->assignedTo = $assignedTo;
$this->view->productBugs = $productBugs;
$this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID, 'stagefilter');
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'withbranch,noreleased');
$this->view->actions = $this->action->getList('bug', $bugID);
$this->view->execution = isset($execution) ? $execution : '';
$this->display();
}
@@ -1933,7 +1935,7 @@ class bug extends control
$this->view->bug = $bug;
$this->view->users = $this->user->getPairs('noclosed', $bug->resolvedBy);
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'noempty', 0, 'execution', $bug->openedBuild);
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'noempty,noreleased', 0, 'execution', $bug->openedBuild);
$this->view->actions = $this->action->getList('bug', $bugID);
$this->display();
@@ -2150,7 +2152,7 @@ class bug extends control
$this->view->bugs = $bugs;
$this->view->users = $this->user->getPairs();
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty');
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'noempty,noreleased');
$this->display();
}
@@ -2412,7 +2414,7 @@ class bug extends control
public function ajaxGetBugFieldOptions($productID, $executionID = 0)
{
$modules = $this->loadModel('tree')->getOptionMenu($productID, 'bug');
$builds = $this->loadModel('build')->getBuildPairs($productID, 'all', '', $executionID, 'execution');
$builds = $this->loadModel('build')->getBuildPairs($productID, 'all', 'noreleased', $executionID, 'execution');
$type = $this->lang->bug->typeList;
$pri = $this->lang->bug->priList;
$severity = $this->lang->bug->severityList;
@@ -2500,4 +2502,19 @@ class bug extends control
if($project->model == 'kanban') return print($this->lang->bug->kanban);
return print($this->lang->bug->execution);
}
/**
* Ajax get released builds.
*
* @param int $productID
* @param int|string $branch
* @access public
* @return string
*/
public function ajaxGetReleasedBuilds($productID, $branch = 'all')
{
$releasedBuilds = $this->loadModel('release')->getReleasedBuilds($productID, $branch);
return print(helper::jsonEncode($releasedBuilds));
}
}
+2 -1
View File
@@ -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;}
+2 -2
View File
@@ -38,13 +38,13 @@ function setOpenedBuilds(link, index)
var selected = $('#buildBox' + index).find('select').val();
$('#buildBox' + index).html(builds);
$('#buildBox' + index).find('select').val(selected);
$('#openedBuilds' + index + '_chosen').remove();
$('#pickerDropMenu-pk_openedBuild' + index).remove();
$('#openedBuilds' + index).next('.picker').remove();
$('#buildBox' + index + ' select').removeClass('select-3');
$('#buildBox' + index + ' select').addClass('select-1');
$('#buildBox' + index + ' select').attr('name','openedBuilds[' + index + '][]');
$('#buildBox' + index + ' select').attr('id','openedBuilds' + index);
$('#buildBox' + index + ' select').chosen();
$('#buildBox' + index + ' select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
index++;
if($('#executions' + index).val() != 'ditto') break;
+99 -26
View File
@@ -19,6 +19,27 @@ $(function()
}
});
if($('#openedBuild').length || $('#resolvedBuild').length || $('[name^=openedBuilds]').length)
{
$.get(createLink('bug', 'ajaxGetReleasedBuilds', 'productID=' + productID), function(data){releasedBuilds = data;}, 'json');
$('#openedBuild, #resolvedBuild, [name^=openedBuilds]').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
}
function markReleasedBuilds($option)
{
var build = $option.attr('data-value');
if($.inArray(build, releasedBuilds) != -1)
{
if(!$option.find('.label-released').length)
{
var optionText = $option.find('.picker-option-text').html();
$option.find('.picker-option-text').replaceWith("<p class='picker-option-text no-margin'><span class='label label-released label-primary label-outline'>" + releasedBuild + "</span> " + optionText + "</p>");
}
}
}
/**
* Load all fields.
*
@@ -178,6 +199,8 @@ function loadAllExecutionBuilds(executionID, productID, buildBox)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
$.get(createLink('bug', 'ajaxGetReleasedBuilds', 'productID=' + productID), function(data){releasedBuilds = data;}, 'json');
if(page == 'create')
{
oldOpenedBuild = $('#openedBuild').val() ? $('#openedBuild').val() : 0;
@@ -186,10 +209,10 @@ function loadAllExecutionBuilds(executionID, productID, buildBox)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$('#pickerDropMenu-pk_openedBuild').remove();
$('#openedBuild').next('.picker').remove();
$("#openedBuild").chosen();
notice();
$("#openedBuild").picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
})
}
if(page == 'edit')
@@ -197,12 +220,12 @@ function loadAllExecutionBuilds(executionID, productID, buildBox)
if(buildBox == 'openedBuildBox')
{
link = createLink('build', 'ajaxGetExecutionBuilds', 'executionID=' + executionID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&needCreate=true&type=all');
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
$('#openedBuildBox').load(link, function(){$(this).find('select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
if(buildBox == 'resolvedBuildBox')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch + '&index=0&type=all');
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
$('#resolvedBuildBox').load(link, function(){$(this).find('select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
}
}
@@ -219,6 +242,9 @@ function loadAllProductBuilds(productID, buildBox)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
$.get(createLink('bug', 'ajaxGetReleasedBuilds', 'productID=' + productID), function(data){releasedBuilds = data;}, 'json');
if(page == 'create')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&type=all');
@@ -226,10 +252,10 @@ function loadAllProductBuilds(productID, buildBox)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$('#pickerDropMenu-pk_openedBuild').remove();
$('#openedBuild').next('.picker').remove();
$("#openedBuild").chosen();
notice();
$("#openedBuild").picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
})
}
if(page == 'edit')
@@ -237,12 +263,12 @@ function loadAllProductBuilds(productID, buildBox)
if(buildBox == 'openedBuildBox')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&type=all');
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
$('#openedBuildBox').load(link, function(){$(this).find('select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
if(buildBox == 'resolvedBuildBox')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch + '&index=0&type=all');
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
$('#resolvedBuildBox').load(link, function(){$(this).find('select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
}
}
@@ -294,7 +320,7 @@ function loadProductStories(productID)
function loadProductProjects(productID)
{
required = $('#project_chosen').hasClass('required');
branch = $('#branch').val();
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('product', 'ajaxGetProjects', 'productID=' + productID + '&branch=' + branch + '&projectID=' + oldProjectID);
$('#projectBox').load(link, function()
@@ -437,23 +463,25 @@ function loadProductBuilds(productID)
if(typeof(oldOpenedBuild) == 'undefined') oldOpenedBuild = 0;
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch);
$.get(createLink('bug', 'ajaxGetReleasedBuilds', 'productID=' + productID), function(data){releasedBuilds = data;}, 'json');
if(page == 'create')
{
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$('#pickerDropMenu-pk_openedBuild').remove();
$('#openedBuild').next('.picker').remove();
$("#openedBuild").chosen();
notice();
$("#openedBuild").picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
})
}
else
{
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
$('#openedBuildBox').load(link, function(){$(this).find('select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch);
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
$('#resolvedBuildBox').load(link, function(){$(this).find('select').picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
}
@@ -466,9 +494,12 @@ function loadProductBuilds(productID)
*/
function loadExecutionRelated(executionID)
{
executionID = parseInt(executionID);
executionID = parseInt(executionID);
currentProjectID = $('#project').val() == 'undefined' ? 0 : $('#project').val();
if(executionID)
{
if(currentProjectID == 0) loadProjectByExecutionID(executionID);
loadExecutionTasks(executionID);
loadExecutionStories(executionID);
loadExecutionBuilds(executionID);
@@ -477,7 +508,6 @@ function loadExecutionRelated(executionID)
}
else
{
var currentProjectID = $('#project').val() == 'undefined' ? 0 : $('#project').val();
var currentProductID = $('#product').val();
$('#taskIdBox').innerHTML = '<select id="task"></select>'; // Reset the task.
@@ -496,6 +526,43 @@ function loadExecutionRelated(executionID)
}
}
/**
* Load a project by execution id.
*
* @param executionID $executionID
* @access public
* @return void
*/
function loadProjectByExecutionID(executionID)
{
link = createLink('project', 'ajaxGetPairsByExecution', 'executionID=' + executionID, 'json');
required = $('#project_chosen').hasClass('required');
productID = $('#product').val();
$.post(link, function(data)
{
var originProject = $('#project').html();
if($('#project').find('option[value="' + data.id + '"]').length > 0)
{
$('#project').find('option[value="' + data.id + '"]').attr('selected', 'selected');
originProject = $('#project').html();
$('#project').replaceWith('<select id="project" name="project" class="form-control" onchange="loadProductExecutions(' + productID + ', this.value)">' + originProject + '</select>');
}
else
{
var newProject = '<option value="' + data.id + '" data-keys="' + data.namePinyin + '" selected="selected">' + data.name + '</option>';
$('#project').replaceWith('<select id="project" name="project" class="form-control" onchange="loadProductExecutions(' + productID + ', this.value)">' + originProject + newProject+ '</select>');
}
$('#project_chosen').remove();
$('#project').next('.picker').remove();
$('#project').chosen();
if(required) $('#project_chosen').addClass('required');
}, 'json')
}
/**
* Load execution tasks.
*
@@ -552,28 +619,30 @@ function loadProjectBuilds(projectID)
var productID = $('#product').val();
var oldOpenedBuild = $('#openedBuild').val() ? $('#openedBuild').val() : 0;
$.get(createLink('bug', 'ajaxGetReleasedBuilds', 'productID=' + productID), function(data){releasedBuilds = data;}, 'json');
if(page == 'create')
{
var link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=&branch=' + branch);
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control picker-select" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild').val(oldOpenedBuild);
$('#openedBuild_chosen').remove();
$('#pickerDropMenu-pk_openedBuild').remove();
$('#openedBuild').next('.picker').remove();
$("#openedBuild").chosen();
notice();
$("#openedBuild").picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
})
}
else
{
var link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch);
$('#openedBuildBox').load(link, function(){$(this).find('select').val(oldOpenedBuild).chosen()});
$('#openedBuildBox').load(link, function(){$(this).find('select').val(oldOpenedBuild).picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
var oldResolvedBuild = $('#resolvedBuild').val() ? $('#resolvedBuild').val() : 0;
var link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch);
$('#resolvedBuildBox').load(link, function(){$(this).find('select').val(oldResolvedBuild).chosen()});
$('#resolvedBuildBox').load(link, function(){$(this).find('select').val(oldResolvedBuild).picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
}
@@ -595,28 +664,30 @@ function loadExecutionBuilds(executionID, num)
if(typeof(branch) == 'undefined') var branch = 0;
if(typeof(productID) == 'undefined') var productID = 0;
$.get(createLink('bug', 'ajaxGetReleasedBuilds', 'productID=' + productID), function(data){releasedBuilds = data;}, 'json');
if(page == 'create')
{
link = createLink('build', 'ajaxGetExecutionBuilds', 'executionID=' + executionID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + "&branch=" + branch + "&index=0&needCreate=true");
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control picker-select" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild').val(oldOpenedBuild);
$('#openedBuild_chosen').remove();
$('#pickerDropMenu-pk_openedBuild').remove();
$('#openedBuild').next('.picker').remove();
$("#openedBuild").chosen();
notice();
$("#openedBuild").picker({optionRender: markReleasedBuilds, dropWidth: 'auto'});
})
}
else
{
link = createLink('build', 'ajaxGetExecutionBuilds', 'executionID=' + executionID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&needCreate=false&type=normal&number=' + num);
$('#openedBuildBox' + num).load(link, function(){$(this).find('select').val(oldOpenedBuild).chosen()});
$('#openedBuildBox' + num).load(link, function(){$(this).find('select').val(oldOpenedBuild).picker({optionRender: markReleaseBuilds, dropWidth: 'auto'})});
oldResolvedBuild = $('#resolvedBuild').val() ? $('#resolvedBuild').val() : 0;
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch);
$('#resolvedBuildBox').load(link, function(){$(this).find('select').val(oldResolvedBuild).chosen()});
$('#resolvedBuildBox').load(link, function(){$(this).find('select').val(oldResolvedBuild).picker({optionRender: markReleasedBuilds, dropWidth: 'auto'})});
}
}
@@ -776,7 +847,9 @@ function notice()
if(page == 'edit') return;
$('#buildBoxActions').empty().hide();
if($('#openedBuild').find('option').length <= 1)
var itemCount = $('#openedBuild').find('option').length;
if($('#openedBuild').attr('data-items') != undefined) var itemCount = $('#openedBuild').attr('data-items');
if(itemCount <= 1)
{
var html = '';
if($('#execution').length == 0 || $('#execution').val() == 0)
+2 -1
View File
@@ -124,6 +124,7 @@ $(function()
});
});
$(window).unload(function(){
$(window).unload(function()
{
if(blockID) window.parent.refreshBlock($('#block' + blockID));
});
+15 -12
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 = '选择相关版本...';
+1 -5
View File
@@ -81,8 +81,6 @@ class bugModel extends model
->remove('files,labels,uid,oldTaskID,contactListMenu,region,lane,ticket')
->get();
if($bug->execution != 0) $bug->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->execution)->fetch('project');
/* Check repeat bug. */
$result = $this->loadModel('common')->removeDuplicate('bug', $bug, "product={$bug->product}");
if($result and $result['stop']) return array('status' => 'exists', 'id' => $result['duplicate']);
@@ -219,8 +217,6 @@ class bugModel extends model
if(isset($data->lanes[$i])) $bug->laneID = $data->lanes[$i];
if($bug->execution != 0) $bug->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->execution)->fetch('project');
/* Assign the bug to the person in charge of the module. */
if(!empty($moduleOwners[$bug->module]))
{
@@ -1623,7 +1619,7 @@ class bugModel extends model
$this->config->bug->search['params']['module']['values'] = $modules;
$this->config->bug->search['params']['execution']['values'] = $this->loadModel('product')->getExecutionPairsByProduct($productID, 0, 'id_desc', $projectID);
$this->config->bug->search['params']['severity']['values'] = array(0 => '') + $this->lang->bug->severityList; //Fix bug #939.
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getBuildPairs($productID, 'all', 'withbranch');
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getBuildPairs($productID, 'all', 'withbranch|releasetag');
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->config->bug->search['params']['openedBuild']['values'];
if($this->session->currentProductType == 'normal')
{
+5 -1
View File
@@ -37,7 +37,7 @@
<?php $this->printExtendFields($bug, 'table');?>
<tr>
<th><?php echo $lang->bug->openedBuild;?></th>
<td colspan='2'><?php echo html::select('openedBuild[]', $builds, $bug->openedBuild, 'size=4 multiple=multiple class="form-control chosen"');?></td>
<td colspan='2'><?php echo html::select('openedBuild[]', $builds, $bug->openedBuild, 'size=4 multiple=multiple class="form-control picker-select"');?></td>
</tr>
<tr>
<th><?php echo $lang->comment;?></th>
@@ -56,4 +56,8 @@
<div class='main'><?php include '../../common/view/action.html.php';?></div>
</div>
</div>
<?php
js::set('productID', $bug->product);
js::set('releasedBuild', $lang->build->releasedBuild);
?>
<?php include '../../common/view/footer.html.php';?>
+6 -4
View File
@@ -13,6 +13,8 @@
<?php
include '../../common/view/header.html.php';
js::set('requiredFields', $config->bug->create->requiredFields);
js::set('productID', $productID);
js::set('releasedBuild', $lang->build->releasedBuild);
?>
<?php
$visibleFields = array();
@@ -107,7 +109,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange='loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, 'trunk', "class='form-control chosen' multiple");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, 'trunk', "class='form-control picker-select' multiple");?></td>
<td>
<div class='input-group'>
<div class="input-control has-icon-right">
@@ -163,7 +165,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control chosen' multiple");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control picker-select' multiple");?></td>
<td>
<div class='input-group'>
<div class="input-control has-icon-right">
@@ -224,7 +226,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
<td><?php echo html::select("modules[%s]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[%s]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, \"%s\")'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[%s]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, \"%s\")'");?></td>
<td id='buildBox%s'><?php echo html::select("openedBuilds[%s][]", $builds, '', "class='form-control chosen' multiple");?></td>
<td id='buildBox%s'><?php echo html::select("openedBuilds[%s][]", $builds, '', "class='form-control picker-select' multiple");?></td>
<td>
<div class='input-group'>
<div class="input-control has-icon-right">
@@ -267,7 +269,7 @@ foreach(explode(',', $config->bug->create->requiredFields) as $field)
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control chosen' multiple");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control picker-select' multiple");?></td>
<td>
<div class='input-group'>
<div class="input-control has-icon-right">
+1 -1
View File
@@ -328,7 +328,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
{
$actionLink = $this->createLink('bug', 'batchResolve', "resolution=fixed&resolvedBuild=$key");
echo "<li class='option' data-key='$key'>";
echo html::a('javascript:;', $build, '', "onclick=\"setFormAction('$actionLink', 'hiddenwin', '#bugList')\"");
echo html::a('javascript:;', (in_array($key, $releasedBuilds) ? "<span class='label label-primary label-outline'>{$lang->build->releasedBuild}</span> " : '') . $build, '', "onclick=\"setFormAction('$actionLink', 'hiddenwin', '#bugList')\"");
echo "</li>";
}
echo "</ul>";
+3 -1
View File
@@ -30,6 +30,8 @@ js::set('tab', $this->app->tab);
js::set('requiredFields', $config->bug->create->requiredFields);
js::set('showFields', $showFields);
js::set('projectExecutionPairs', $projectExecutionPairs);
js::set('productID', $productID);
js::set('releasedBuild', $lang->build->releasedBuild);
if($this->app->tab == 'execution') js::set('objectID', zget($execution, 'id', ''));
if($this->app->tab == 'project') js::set('objectID', $projectID);
?>
@@ -128,7 +130,7 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
<td>
<div class='input-group' id='buildBox'>
<span class="input-group-addon"><?php echo $lang->bug->openedBuild?></span>
<?php echo html::select('openedBuild[]', $builds, empty($buildID) ? '' : $buildID, "multiple=multiple class='chosen form-control'");?>
<?php echo html::select('openedBuild[]', $builds, empty($buildID) ? '' : $buildID, "multiple=multiple class='picker-select form-control' data-items='" . count($builds) . "'");?>
<span class='input-group-addon fix-border' id='buildBoxActions'></span>
<div class='input-group-btn'><?php echo html::commonButton($lang->bug->allBuilds, "class='btn' id='all' data-toggle='tooltip' onclick='loadAllBuilds()'")?></div>
</div>
+7 -5
View File
@@ -30,6 +30,8 @@ js::set('bugID' , $bug->id);
js::set('bugBranch' , $bug->branch);
js::set('isClosedBug' , $bug->status == 'closed');
js::set('projectExecutionPairs' , $projectExecutionPairs);
js::set('productID' , $product->id);
js::set('releasedBuild' , $lang->build->releasedBuild);
if($this->app->tab == 'execution') js::set('objectID', $bug->execution);
if($this->app->tab == 'project') js::set('objectID', $bug->project);
?>
@@ -100,7 +102,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
<th class='w-80px'><?php echo $lang->bug->product;?></th>
<td>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAll(this.value)' class='form-control chosen'");?>
<?php echo html::select('product', $products, $product->id, "onchange='loadAll(this.value)' class='form-control chosen'");?>
<?php if($product->type != 'normal') echo html::select('branch', $branchTagOption, $bug->branch, "onchange='loadBranch();' class='form-control'");?>
</div>
</td>
@@ -114,9 +116,9 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=bug&currentModuleID=0&branch=$bug->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo html::a($this->createLink('tree', 'browse', "rootID={$product->id}&view=bug&currentModuleID=0&branch=$bug->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo '&nbsp; ';
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='$lang->refresh' onclick='loadProductModules($productID)'");
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='$lang->refresh' onclick='loadProductModules($product->id)'");
echo '</span>';
}
?>
@@ -240,7 +242,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
<th><?php echo $lang->bug->openedBuild;?></th>
<td>
<div id='openedBuildBox' class='input-group'>
<?php echo html::select('openedBuild[]', $openedBuilds, $bug->openedBuild, 'size=4 multiple=multiple class="chosen form-control"');?>
<?php echo html::select('openedBuild[]', $openedBuilds, $bug->openedBuild, 'size=4 multiple=multiple class="picker-select form-control"');?>
<span class='input-group-btn'><?php echo html::commonButton($lang->bug->allBuilds, "class='btn' onclick='loadAllBuilds(this)'")?></span>
</div>
</td>
@@ -257,7 +259,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
<th><?php echo $lang->bug->resolvedBuild;?></th>
<td>
<div id='resolvedBuildBox' class='input-group'>
<?php echo html::select('resolvedBuild', $resolvedBuilds, $bug->resolvedBuild, "class='form-control chosen'");?>
<?php echo html::select('resolvedBuild', $resolvedBuilds, $bug->resolvedBuild, "class='form-control picker-select'");?>
<span class='input-group-btn'><?php echo html::commonButton($lang->bug->allBuilds, "class='btn' onclick='loadAllBuilds(this)'")?></span>
</div>
</td>
+4 -3
View File
@@ -14,8 +14,9 @@
<?php include '../../common/view/kindeditor.html.php';?>
<?php include '../../common/view/datepicker.html.php';?>
<?php
js::set('page' , 'resolve');
js::set('productID' , $bug->product);
js::set('page', 'resolve');
js::set('productID', $bug->product);
js::set('releasedBuild', $lang->build->releasedBuild);
?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
@@ -49,7 +50,7 @@ js::set('productID' , $bug->product);
</div>
</td>
<td>
<div id='resolvedBuildBox'><?php echo html::select('resolvedBuild', $builds, '', "class='form-control chosen'");?></div>
<div id='resolvedBuildBox'><?php echo html::select('resolvedBuild', $builds, '', "class='form-control picker-select'");?></div>
<div id='newBuildBox' class='hidden required'><?php echo html::input('buildName', '', "class='form-control' placeholder='{$lang->bug->placeholder->newBuildName}'");?></div>
</td>
<td>
+14
View File
@@ -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>
+19 -13
View File
@@ -385,32 +385,38 @@ class build extends control
* @param string|int $branch
* @param int $index the index of batch create bug.
* @param string $type get all builds or some builds belong to normal releases and executions are not done.
* @param string $extra
* @access public
* @return string
*/
public function ajaxGetProductBuilds($productID, $varName, $build = '', $branch = 'all', $index = 0, $type = 'normal')
public function ajaxGetProductBuilds($productID, $varName, $build = '', $branch = 'all', $index = 0, $type = 'normal', $extra = '')
{
$isJsonView = $this->app->getViewType() == 'json';
if($varName == 'openedBuild' )
{
$params = ($type == 'all') ? 'noempty,withbranch' : 'noempty,noterminate,nodone,withbranch';
$params = ($type == 'all') ? 'noempty,withbranch,noreleased' : 'noempty,noterminate,nodone,withbranch,noreleased';
$builds = $this->build->getBuildPairs($productID, $branch, $params, 0, 'project', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName . '[]', $builds, $build, 'size=4 class=form-control multiple'));
}
if($varName == 'openedBuilds' )
{
$builds = $this->build->getBuildPairs($productID, $branch, 'noempty', 0, 'project', $build);
$builds = $this->build->getBuildPairs($productID, $branch, 'noempty,noreleased', 0, 'project', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName . "[$index][]", $builds, $build, 'size=4 class=form-control multiple'));
}
if($varName == 'resolvedBuild')
{
$params = ($type == 'all') ? 'withbranch' : 'noterminate,nodone,withbranch';
$params = ($type == 'all') ? 'withbranch,noreleased' : 'noterminate,nodone,withbranch,noreleased';
$builds = $this->build->getBuildPairs($productID, $branch, $params, 0, 'project', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName, $builds, $build, "class='form-control'"));
}
$builds = $this->build->getBuildPairs($productID, $branch, $type, 0, 'project', $build);
if(strpos($extra, 'multiple') !== false) $varName .= '[]';
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName, $builds, $build, "class='form-control chosen' $extra"));
}
/**
@@ -434,7 +440,7 @@ class build extends control
{
if(empty($projectID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type);
$params = ($type == 'all') ? 'noempty,withbranch' : 'noempty,noterminate,nodone,withbranch';
$params = ($type == 'all') ? 'noempty,withbranch,noreleased' : 'noempty,noterminate,nodone,withbranch,noreleased';
$builds = $this->build->getBuildPairs($productID, $branch, $params, $projectID, 'project', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName . '[]', $builds , '', 'size=4 class=form-control multiple'));
@@ -443,13 +449,13 @@ class build extends control
{
if(empty($projectID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type);
$params = ($type == 'all') ? 'withbranch' : 'noterminate,nodone,withbranch';
$params = ($type == 'all') ? 'withbranch,noreleased' : 'noterminate,nodone,withbranch,noreleased';
$builds = $this->build->getBuildPairs($productID, $branch, $params, $projectID, 'project', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName, $builds, $build, "class='form-control'"));
}
if(empty($projectID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type);
if(empty($projectID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type, $extra);
$builds = $this->build->getBuildPairs($productID, $branch, $type, $projectID, 'project', $build, false);
if(strpos($extra, 'multiple') !== false) $varName .= '[]';
if($isJsonView) return print(json_encode($builds));
@@ -478,7 +484,7 @@ class build extends control
{
if(empty($executionID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type);
$params = ($type == 'all') ? 'noempty' : 'noempty,noterminate,nodone';
$params = ($type == 'all') ? 'noempty,noreleased' : 'noempty,noterminate,nodone,noreleased';
$builds = $this->build->getBuildPairs($productID, $branch, $params, $executionID, 'execution', $build);
if($isJsonView) return print(json_encode($builds));
@@ -489,7 +495,7 @@ class build extends control
{
if(empty($executionID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type);
$builds = $this->build->getBuildPairs($productID, $branch, 'noempty', $executionID, 'execution', $build);
$builds = $this->build->getBuildPairs($productID, $branch, 'noempty,noreleased', $executionID, 'execution', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName . "[$index][]", $builds , $build, 'size=4 class=form-control multiple'));
}
@@ -497,14 +503,14 @@ class build extends control
{
if(empty($executionID)) return $this->ajaxGetProductBuilds($productID, $varName, $build, $branch, $index, $type);
$params = ($type == 'all') ? '' : 'noterminate,nodone';
$params = ($type == 'all') ? ',noreleased' : 'noterminate,nodone,noreleased';
$builds = $this->build->getBuildPairs($productID, $branch, $params, $executionID, 'execution', $build);
if($isJsonView) return print(json_encode($builds));
return print(html::select($varName, $builds, $build, "class='form-control'"));
}
if($varName == 'testTaskBuild')
{
$builds = $this->build->getBuildPairs($productID, $branch, 'noempty,notrunk', $executionID, 'execution');
$builds = $this->build->getBuildPairs($productID, $branch, 'noempty,notrunk', $executionID, 'execution', '', false);
if($isJsonView) return print(json_encode($builds));
if(empty($builds))
@@ -543,7 +549,7 @@ class build extends control
{
$lastBuild = $this->build->getLast($executionID, $projectID);
if($lastBuild)
{
{
echo "<div class='help-block'> &nbsp; " . $this->lang->build->last . ": <a class='code label label-badge label-light' id='lastBuildBtn'>" . $lastBuild->name . "</a></div>";
}
else
@@ -714,7 +720,7 @@ class build extends control
$this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairsForStory($build->product, $build->branch, 'skipParent');
$this->config->bug->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($build->product, 'bug', 0, $build->branch);
$this->config->bug->search['params']['execution']['values'] = $this->loadModel('product')->getExecutionPairsByProduct($build->product, $build->branch, 'id_desc', $this->session->project);
$this->config->bug->search['params']['openedBuild']['values'] = $this->build->getBuildPairs($build->product, $branch = 'all', $params = '');
$this->config->bug->search['params']['openedBuild']['values'] = $this->build->getBuildPairs($build->product, $branch = 'all', $params = 'releasetag');
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->config->bug->search['params']['openedBuild']['values'];
unset($this->config->bug->search['fields']['product']);
+2
View File
@@ -36,6 +36,7 @@ $lang->build->execution = $lang->executionCommon;
$lang->build->integrated = 'Integrated';
$lang->build->singled = 'Singled';
$lang->build->builds = 'Included Builds';
$lang->build->releasedBuild = 'Released Build';
$lang->build->name = 'Name';
$lang->build->date = 'Datum';
$lang->build->builder = 'Builder';
@@ -60,6 +61,7 @@ $lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the vers
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
$lang->build->notice->createTest = "The execution of this version has been deleted, and the test cannot be submitted";
$lang->build->finishStories = " %s {$lang->SRCommon} sind abgeschlossen.";
$lang->build->resolvedBugs = ' %s Bugs sind gelöst.';
+2
View File
@@ -36,6 +36,7 @@ $lang->build->execution = $lang->executionCommon;
$lang->build->integrated = 'Integrated';
$lang->build->singled = 'Singled';
$lang->build->builds = 'Included Builds';
$lang->build->releasedBuild = 'Released Build';
$lang->build->name = 'Name';
$lang->build->date = 'Date';
$lang->build->builder = 'Builder';
@@ -60,6 +61,7 @@ $lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the vers
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
$lang->build->notice->createTest = "The execution of this version has been deleted, and the test cannot be submitted";
$lang->build->finishStories = " Finished {$lang->SRCommon} %s";
$lang->build->resolvedBugs = ' Resolved Bug %s';
+2
View File
@@ -36,6 +36,7 @@ $lang->build->execution = $lang->executionCommon;
$lang->build->integrated = 'Integrated';
$lang->build->singled = 'Singled';
$lang->build->builds = 'Included Builds';
$lang->build->releasedBuild = 'Released Build';
$lang->build->name = 'Nom';
$lang->build->date = 'Date';
$lang->build->builder = 'Builder';
@@ -60,6 +61,7 @@ $lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the vers
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
$lang->build->notice->createTest = "The execution of this version has been deleted, and the test cannot be submitted";
$lang->build->finishStories = " {$lang->SRCommon} Terminées %s";
$lang->build->resolvedBugs = ' Bugs Résolus %s';
+1
View File
@@ -54,6 +54,7 @@ $lang->build->notice->changeProduct = "The {$lang->SRCommon}, bug, or the vers
$lang->build->notice->changeExecution = "The version of the submitted test order cannot be modified {$lang->executionCommon}";
$lang->build->notice->changeBuilds = "The version of the submitted test order cannot be modified builds";
$lang->build->notice->autoRelation = "The completed requirements, resolved bugs, and generated bugs under the relevant version will be automatically associated with the project version";
$lang->build->notice->createTest = "The execution of this version has been deleted, and the test cannot be submitted";
$lang->build->finishStories = " {$lang->SRCommon} đã kết thúc %s";
$lang->build->resolvedBugs = ' Bug đã giải quyết %s';
+3 -1
View File
@@ -28,7 +28,7 @@ $lang->build->confirmUnlinkBug = "您确认移除该Bug吗?";
$lang->build->basicInfo = '基本信息';
$lang->build->id = 'ID';
$lang->build->product = $lang->productCommon;
$lang->build->product = '所属' . $lang->productCommon;
$lang->build->project = '所属项目';
$lang->build->branch = '平台/分支';
$lang->build->branchName = '所属%s';
@@ -36,6 +36,7 @@ $lang->build->execution = '所属' . $lang->executionCommon;
$lang->build->integrated = '集成版本';
$lang->build->singled = '单一版本';
$lang->build->builds = '包含版本';
$lang->build->releasedBuild = '发布版本';
$lang->build->name = '名称编号';
$lang->build->date = '打包日期';
$lang->build->builder = '构建者';
@@ -60,6 +61,7 @@ $lang->build->notice->changeProduct = "已经关联{$lang->SRCommon}、Bug或
$lang->build->notice->changeExecution = "提交测试单的版本,不能修改其所属{$lang->executionCommon}";
$lang->build->notice->changeBuilds = "提交测试单的版本,不能修改关联版本";
$lang->build->notice->autoRelation = "相关版本下完成的需求、解决的Bug、产生的Bug将会自动关联到项目版本中";
$lang->build->notice->createTest = "该版本所属执行已删除,不能提交测试";
$lang->build->finishStories = " 本次共完成 %s 个{$lang->SRCommon}";
$lang->build->resolvedBugs = ' 本次共解决 %s 个Bug';
+44 -5
View File
@@ -181,6 +181,38 @@ class buildModel extends model
return $this->getExecutionBuilds($executionID, 'bysearch', $buildQuery);
}
/**
* Filter linked stories or bugs builds.
*
* @param array $buildIdList
* @access public
* @return array
*/
public function filterLinked($buildIdList)
{
$linkeds = array();
$buildList = $this->getByList($buildIdList);
foreach($buildList as $build)
{
if(!$build->execution && !empty($build->builds))
{
$childBuilds = $this->getByList($build->builds);
foreach($childBuilds as $childBuild)
{
$childBuild->stories = trim($childBuild->stories, ',');
$childBuild->bugs = trim($childBuild->bugs, ',');
if($childBuild->stories) $build->stories .= ',' . $childBuild->stories;
if($childBuild->bugs) $build->bugs .= ',' . $childBuild->bugs;
}
}
if(!empty($build->stories) or !empty($build->bugs)) $linkeds[$build->id] = $build->id;
}
return $linkeds;
}
/**
* Get story builds.
*
@@ -202,7 +234,7 @@ class buildModel extends model
*
* @param int|array $products
* @param string|int $branch
* @param string $params noempty|notrunk|noterminate|withbranch|hasproject|noDeleted|singled|withreleased, can be a set of them
* @param string $params noempty|notrunk|noterminate|withbranch|hasproject|noDeleted|singled|noreleased|releasedtag, can be a set of them
* @param string|int $objectID
* @param string $objectType
* @param int|array $buildIdList
@@ -227,7 +259,7 @@ class buildModel extends model
}
$branchs = strpos($params, 'separate') === false ? "0,$branch" : $branch;
$allBuilds = $this->dao->select('t1.id, t1.name, t1.date, t1.deleted, t2.status as objectStatus, t3.id as releaseID, t3.status as releaseStatus, t4.name as branchName, t5.type as productType')->from(TABLE_BUILD)->alias('t1')
$allBuilds = $this->dao->select('t1.id, t1.name, t1.execution, t1.date, t1.deleted, t2.status as objectStatus, t3.id as releaseID, t3.status as releaseStatus, t4.name as branchName, t5.type as productType')->from(TABLE_BUILD)->alias('t1')
->beginIF($objectType === 'execution')->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id')->fi()
->beginIF($objectType === 'project')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')->fi()
->leftJoin(TABLE_RELEASE)->alias('t3')->on("FIND_IN_SET(t1.id,t3.build)")
@@ -243,6 +275,8 @@ class buildModel extends model
->beginIF($branch !== 'all')->andWhere('t1.branch')->in("$branchs")->fi()
->orderBy('t1.date desc, t1.id desc')->fetchAll('id');
$deletedExecutions = $this->dao->select('id, deleted')->from(TABLE_EXECUTION)->where('type')->eq('sprint')->andWhere('deleted')->eq('1')->fetchPairs();
/* Set builds and filter done executions and terminate releases. */
$builds = array();
$buildIdList = array();
@@ -251,6 +285,7 @@ class buildModel extends model
{
if(empty($build->releaseID) and (strpos($params, 'nodone') !== false) and ($build->objectStatus === 'done')) continue;
if((strpos($params, 'noterminate') !== false) and ($build->releaseStatus === 'terminate')) continue;
if((strpos($params, 'withexecution') !== false) and $build->execution and isset($executions[$build->execution])) continue;
if($build->deleted == 1) $build->name .= ' (' . $this->lang->build->deleted . ')';
$branchName = $build->branchName ? $build->branchName : $this->lang->branch->main;
@@ -292,12 +327,13 @@ class buildModel extends model
$releaseName = $release->name;
$branchName = $release->branchName ? $release->branchName : $this->lang->branch->main;
if($release->productType != 'normal') $releaseName = (strpos($params, 'withbranch') !== false ? $branchName . '/' : '') . $releaseName;
if(strpos($params, 'releasetag') !== false) $releaseName = "[{$this->lang->build->releasedBuild}] " . $releaseName;
$builds[$release->date][$release->shadow] = $releaseName;
foreach(explode(',', trim($release->build, ',')) as $buildID)
{
if(!isset($allBuilds[$buildID])) continue;
$build = $allBuilds[$buildID];
if(strpos($params, 'withreleased') === false) unset($builds[$build->date][$buildID]);
if(strpos($params, 'noreleased') !== false) unset($builds[$build->date][$buildID]);
}
}
}
@@ -621,7 +657,7 @@ class buildModel extends model
{
$action = strtolower($action);
if($module == 'testtask' && $action == 'create') return !!$object->execution;
if($module == 'testtask' and $action == 'create') return !$object->executionDeleted;
return true;
}
@@ -651,11 +687,14 @@ class buildModel extends model
{
$executionID = $tab == 'execution' ? $extraParams['executionID'] : $build->execution;
$execution = $this->loadModel('execution')->getByID($executionID);
$build->executionDeleted = $execution ? $execution->deleted : 0;
$testtaskApp = (!empty($execution->type) and $execution->type == 'kanban') ? 'data-app="qa"' : "data-app='{$tab}'";
if(common::hasPriv($module, 'linkstory') and common::canBeChanged('build', $build)) $menu .= $this->buildMenu($module, 'view', "{$params}&type=story&link=true", $build, $type, 'link', '', '', '', "data-app={$tab}", $this->lang->build->linkStory);
$menu .= $this->buildMenu('testtask', 'create', "product=$build->product&execution={$executionID}&build=$build->id&projectID=$build->project", $build, $type, 'bullhorn', '', '', '', $testtaskApp);
$title = ($execution and $execution->deleted === '1') ? $this->lang->build->notice->createTest : '';
$menu .= $this->buildMenu('testtask', 'create', "product=$build->product&execution={$executionID}&build=$build->id&projectID=$build->project", $build, $type, 'bullhorn', '', '', '', $testtaskApp, $title);
if($tab == 'execution' and !empty($execution->type) and $execution->type != 'kanban') $menu .= $this->buildMenu('execution', 'bug', "execution={$extraParams['executionID']}&productID={$extraParams['productID']}&branchID=all&orderBy=status&build=$build->id", $build, $type, '', '', '', '', $this->lang->execution->viewBug);
if($tab == 'project' or empty($execution->type) or $execution->type == 'kanban') $menu .= $this->buildMenu($module, 'view', "{$params}&type=generatedBug", $build, $type, 'bug', '', '', '', "data-app='$tab'", $this->lang->project->bug);
+5 -1
View File
@@ -26,7 +26,11 @@ tbody tr td:first-child input {display: none;}
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<?php $browseLink = $this->session->buildList ? $this->session->buildList : $this->createLink('execution', 'build', "executionID=$build->execution");?>
<?php common::printBack($browseLink, 'btn btn-secondary');?>
<?php
$dataApp = strpos($browseLink, 'release') !== false ? 'data-app=product' : '';
if(strpos($browseLink, 'projectrelease') !== false) $dataApp = 'data-app=project';
?>
<?php common::printBack($browseLink, 'btn btn-secondary', $dataApp);?>
<div class='divider'></div>
<div class='page-title'>
<span title='<?php echo $build->name;?>'>
+87 -85
View File
@@ -1,89 +1,91 @@
<?php
$lang->common = new stdclass();
$lang->index = new stdclass();
$lang->my = new stdclass();
$lang->todo = new stdclass();
$lang->program = new stdclass();
$lang->programplan = new stdclass();
$lang->product = new stdclass();
$lang->project = new stdclass();
$lang->design = new stdclass();
$lang->stage = new stdclass();
$lang->scrum = new stdclass();
$lang->waterfall = new stdclass();
$lang->execution = new stdclass();
$lang->kanban = new stdclass();
$lang->story = new stdclass();
$lang->requirement = new stdclass();
$lang->release = new stdclass();
$lang->branch = new stdclass();
$lang->productplan = new stdclass();
$lang->measurement = new stdclass();
$lang->review = new stdclass();
$lang->milestone = new stdclass();
$lang->qa = new stdclass();
$lang->doc = new stdclass();
$lang->system = new stdclass();
$lang->testcase = new stdclass();
$lang->testtask = new stdclass();
$lang->testreport = new stdclass();
$lang->score = new stdclass();
$lang->auditplan = new stdclass();
$lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->task = new stdclass();
$lang->build = new stdclass();
$lang->bug = new stdclass();
$lang->company = new stdclass();
$lang->dept = new stdclass();
$lang->group = new stdclass();
$lang->user = new stdclass();
$lang->report = new stdclass();
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
$lang->gitlab = new stdclass();
$lang->gitea = new stdclass();
$lang->gogs = new stdclass();
$lang->mr = new stdclass();
$lang->compile = new stdclass();
$lang->job = new stdclass();
$lang->svn = new stdclass();
$lang->git = new stdclass();
$lang->subject = new stdclass();
$lang->company = new stdclass();
$lang->admin = new stdclass();
$lang->convert = new stdclass();
$lang->upgrade = new stdclass();
$lang->action = new stdclass();
$lang->backup = new stdclass();
$lang->extension = new stdclass();
$lang->custom = new stdclass();
$lang->mail = new stdclass();
$lang->cron = new stdclass();
$lang->dev = new stdclass();
$lang->entry = new stdclass();
$lang->webhook = new stdclass();
$lang->message = new stdclass();
$lang->search = new stdclass();
$lang->devops = new stdclass();
$lang->team = new stdclass();
$lang->automation = new stdclass();
$lang->personnel = new stdclass();
$lang->mail = new stdclass();
$lang->testsuite = new stdclass();
$lang->caselib = new stdclass();
$lang->ci = new stdclass();
$lang->datatable = new stdclass();
$lang->tree = new stdclass();
$lang->api = new stdclass();
$lang->file = new stdclass();
$lang->misc = new stdclass();
$lang->acl = new stdclass();
$lang->curd = new stdclass();
$lang->sonarqube = new stdclass();
$lang->app = new stdclass();
$lang->common = new stdclass();
$lang->index = new stdclass();
$lang->my = new stdclass();
$lang->todo = new stdclass();
$lang->program = new stdclass();
$lang->programplan = new stdclass();
$lang->product = new stdclass();
$lang->project = new stdclass();
$lang->design = new stdclass();
$lang->stage = new stdclass();
$lang->scrum = new stdclass();
$lang->waterfall = new stdclass();
$lang->execution = new stdclass();
$lang->kanban = new stdclass();
$lang->story = new stdclass();
$lang->requirement = new stdclass();
$lang->release = new stdclass();
$lang->branch = new stdclass();
$lang->productplan = new stdclass();
$lang->measurement = new stdclass();
$lang->review = new stdclass();
$lang->milestone = new stdclass();
$lang->qa = new stdclass();
$lang->doc = new stdclass();
$lang->system = new stdclass();
$lang->testcase = new stdclass();
$lang->testtask = new stdclass();
$lang->testreport = new stdclass();
$lang->score = new stdclass();
$lang->auditplan = new stdclass();
$lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->task = new stdclass();
$lang->build = new stdclass();
$lang->bug = new stdclass();
$lang->company = new stdclass();
$lang->dept = new stdclass();
$lang->group = new stdclass();
$lang->user = new stdclass();
$lang->report = new stdclass();
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
$lang->gitlab = new stdclass();
$lang->gitea = new stdclass();
$lang->gogs = new stdclass();
$lang->mr = new stdclass();
$lang->compile = new stdclass();
$lang->job = new stdclass();
$lang->svn = new stdclass();
$lang->git = new stdclass();
$lang->subject = new stdclass();
$lang->company = new stdclass();
$lang->admin = new stdclass();
$lang->convert = new stdclass();
$lang->upgrade = new stdclass();
$lang->action = new stdclass();
$lang->backup = new stdclass();
$lang->extension = new stdclass();
$lang->custom = new stdclass();
$lang->mail = new stdclass();
$lang->cron = new stdclass();
$lang->dev = new stdclass();
$lang->entry = new stdclass();
$lang->webhook = new stdclass();
$lang->message = new stdclass();
$lang->search = new stdclass();
$lang->devops = new stdclass();
$lang->team = new stdclass();
$lang->automation = new stdclass();
$lang->zahost = new stdclass();
$lang->zanode = new stdclass();
$lang->personnel = new stdclass();
$lang->mail = new stdclass();
$lang->testsuite = new stdclass();
$lang->caselib = new stdclass();
$lang->ci = new stdclass();
$lang->datatable = new stdclass();
$lang->tree = new stdclass();
$lang->api = new stdclass();
$lang->file = new stdclass();
$lang->misc = new stdclass();
$lang->acl = new stdclass();
$lang->curd = new stdclass();
$lang->sonarqube = new stdclass();
$lang->app = new stdclass();
$lang->projectbuild = new stdclass();
$lang->projectrelease = new stdclass();
+51 -49
View File
@@ -155,55 +155,57 @@ $lang->code = 'Code';
$lang->pri = 'Priority';
$lang->delayed = 'Delayed';
$lang->common->common = 'Standard Module';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
$lang->execution->common = 'Execution';
$lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->report->common = 'Statistics';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
$lang->task->common = 'Task';
$lang->bug->common = 'Bug';
$lang->testcase->common = 'Testcase';
$lang->testtask->common = 'Request';
$lang->score->common = 'Score';
$lang->build->common = 'Build';
$lang->testreport->common = 'Report';
$lang->automation->common = 'Automation';
$lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
$lang->upgrade->common = 'Update';
$lang->program->list = 'Program List';
$lang->program->kanban = 'Program Kanban';
$lang->design->common = 'Design';
$lang->design->HLDS = 'HLDS';
$lang->design->DDS = 'DDS';
$lang->design->DBDS = 'DBDS';
$lang->design->ADS = 'ADS';
$lang->stage->common = 'Stage';
$lang->stage->list = 'Stage List';
$lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->review->common = 'Review';
$lang->common->common = 'Standard Module';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
$lang->execution->common = 'Execution';
$lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->report->common = 'Statistics';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
$lang->task->common = 'Task';
$lang->bug->common = 'Bug';
$lang->testcase->common = 'Testcase';
$lang->testtask->common = 'Request';
$lang->score->common = 'Score';
$lang->build->common = 'Build';
$lang->testreport->common = 'Report';
$lang->automation->common = 'Automation:';
$lang->zahost->common = 'ZAhost';
$lang->zanode->common = 'ZAnode';
$lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
$lang->upgrade->common = 'Update';
$lang->program->list = 'Program List';
$lang->program->kanban = 'Program Kanban';
$lang->design->common = 'Design';
$lang->design->HLDS = 'HLDS';
$lang->design->DDS = 'DDS';
$lang->design->DBDS = 'DBDS';
$lang->design->ADS = 'ADS';
$lang->stage->common = 'Stage';
$lang->stage->list = 'Stage List';
$lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->review->common = 'Review';
$lang->personnel->common = 'Member';
$lang->personnel->invest = 'Investment';
+51 -49
View File
@@ -155,55 +155,57 @@ $lang->code = 'Code';
$lang->pri = 'Priority';
$lang->delayed = 'Delayed';
$lang->common->common = 'Common Module';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
$lang->execution->common = 'Execution';
$lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->report->common = 'Statistics';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
$lang->task->common = 'Task';
$lang->bug->common = 'Bug';
$lang->testcase->common = 'Testcase';
$lang->testtask->common = 'Request';
$lang->score->common = 'Score';
$lang->build->common = 'Build';
$lang->testreport->common = 'Report';
$lang->automation->common = 'Automation';
$lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
$lang->upgrade->common = 'Update';
$lang->program->list = 'Program List';
$lang->program->kanban = 'Program Kanban';
$lang->design->common = 'Design';
$lang->design->HLDS = 'Preliminary Design';
$lang->design->DDS = 'Detailed Design';
$lang->design->DBDS = 'Database Design';
$lang->design->ADS = 'Interface Design';
$lang->stage->common = 'Stage';
$lang->stage->list = 'Stage List';
$lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->review->common = 'Review';
$lang->common->common = 'Common Module';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
$lang->execution->common = 'Execution';
$lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->report->common = 'Statistics';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
$lang->task->common = 'Task';
$lang->bug->common = 'Bug';
$lang->testcase->common = 'Testcase';
$lang->testtask->common = 'Request';
$lang->score->common = 'Score';
$lang->build->common = 'Build';
$lang->testreport->common = 'Report';
$lang->automation->common = 'Automation:';
$lang->zahost->common = 'ZAhost';
$lang->zanode->common = 'ZAnode';
$lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
$lang->upgrade->common = 'Update';
$lang->program->list = 'Program List';
$lang->program->kanban = 'Program Kanban';
$lang->design->common = 'Design';
$lang->design->HLDS = 'Preliminary Design';
$lang->design->DDS = 'Detailed Design';
$lang->design->DBDS = 'Database Design';
$lang->design->ADS = 'Interface Design';
$lang->stage->common = 'Stage';
$lang->stage->list = 'Stage List';
$lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->review->common = 'Review';
$lang->personnel->common = 'Member';
$lang->personnel->invest = 'Investment';
+51 -49
View File
@@ -155,55 +155,57 @@ $lang->code = 'Code';
$lang->pri = 'Priority';
$lang->delayed = 'Delayed';
$lang->common->common = 'Module Commun';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
$lang->execution->common = 'Execution';
$lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->report->common = 'Statistics';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
$lang->task->common = 'Task';
$lang->bug->common = 'Bug';
$lang->testcase->common = 'Testcase';
$lang->testtask->common = 'Request';
$lang->score->common = 'Score';
$lang->build->common = 'Build';
$lang->testreport->common = 'Report';
$lang->automation->common = 'Automation';
$lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
$lang->upgrade->common = 'Update';
$lang->program->list = 'Program List';
$lang->program->kanban = 'Program Kanban';
$lang->design->common = 'Design';
$lang->design->HLDS = 'HLDS';
$lang->design->DDS = 'DDS';
$lang->design->DBDS = 'DBDS';
$lang->design->ADS = 'ADS';
$lang->stage->common = 'Stage';
$lang->stage->list = 'Stage List';
$lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->review->common = 'Review';
$lang->common->common = 'Module Commun';
$lang->common->story = 'Story';
$lang->my->common = 'My';
$lang->program->common = 'Program';
$lang->product->common = 'Product';
$lang->project->common = 'Project';
$lang->execution->common = 'Execution';
$lang->kanban->common = 'Kanban';
$lang->qa->common = 'QA';
$lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->report->common = 'Statistics';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
$lang->task->common = 'Task';
$lang->bug->common = 'Bug';
$lang->testcase->common = 'Testcase';
$lang->testtask->common = 'Request';
$lang->score->common = 'Score';
$lang->build->common = 'Build';
$lang->testreport->common = 'Report';
$lang->automation->common = 'Automation:';
$lang->zahost->common = 'ZAhost';
$lang->zanode->common = 'ZAnode';
$lang->team->common = 'Team';
$lang->user->common = 'User';
$lang->custom->common = 'Custom';
$lang->custom->mode = 'Mode';
$lang->extension->common = 'Extension';
$lang->company->common = 'Company';
$lang->dept->common = 'Dept';
$lang->upgrade->common = 'Update';
$lang->program->list = 'Program List';
$lang->program->kanban = 'Program Kanban';
$lang->design->common = 'Design';
$lang->design->HLDS = 'HLDS';
$lang->design->DDS = 'DDS';
$lang->design->DBDS = 'DBDS';
$lang->design->ADS = 'ADS';
$lang->stage->common = 'Stage';
$lang->stage->list = 'Stage List';
$lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->review->common = 'Review';
$lang->personnel->common = 'Member';
$lang->personnel->invest = 'Investment';
+23 -20
View File
@@ -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();
@@ -717,16 +719,17 @@ $lang->navGroup->api = 'doc';
$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';
+51 -49
View File
@@ -155,55 +155,57 @@ $lang->code = '代号';
$lang->pri = '优先级';
$lang->delayed = '已延期';
$lang->common->common = '公有模块';
$lang->common->story = '需求';
$lang->my->common = '地盘';
$lang->program->common = '项目集';
$lang->product->common = '产品';
$lang->project->common = '项目';
$lang->execution->common = '执行';
$lang->kanban->common = '看板';
$lang->qa->common = '测试';
$lang->devops->common = 'DevOps';
$lang->doc->common = '文档';
$lang->repo->common = '代码';
$lang->repo->codeRepo = '代码库';
$lang->report->common = '统计';
$lang->system->common = '组织';
$lang->admin->common = '后台';
$lang->story->common = $lang->SRCommon;
$lang->task->common = '任务';
$lang->bug->common = 'Bug';
$lang->testcase->common = '用例';
$lang->testtask->common = '测试单';
$lang->score->common = '我的积分';
$lang->build->common = '版本';
$lang->testreport->common = '测试报告';
$lang->automation->common = '自动化';
$lang->team->common = '团队';
$lang->user->common = '用户';
$lang->custom->common = '自定义';
$lang->custom->mode = '模式';
$lang->extension->common = '插件';
$lang->company->common = '公司';
$lang->dept->common = '部门';
$lang->upgrade->common = '升级';
$lang->program->list = '项目集列表';
$lang->program->kanban = '项目集看板';
$lang->design->common = '设计';
$lang->design->HLDS = '概要设计';
$lang->design->DDS = '详细设计';
$lang->design->DBDS = '数据库设计';
$lang->design->ADS = '接口设计';
$lang->stage->common = '阶段';
$lang->stage->list = '阶段列表';
$lang->execution->list = "{$lang->executionCommon}列表";
$lang->kanban->common = '看板';
$lang->backup->common = '备份';
$lang->action->trash = '回收站';
$lang->app->common = '应用';
$lang->app->serverLink = '服务器链接';
$lang->review->common = '审批';
$lang->common->common = '公有模块';
$lang->common->story = '需求';
$lang->my->common = '地盘';
$lang->program->common = '项目集';
$lang->product->common = '产品';
$lang->project->common = '项目';
$lang->execution->common = '执行';
$lang->kanban->common = '看板';
$lang->qa->common = '测试';
$lang->devops->common = 'DevOps';
$lang->doc->common = '文档';
$lang->repo->common = '代码';
$lang->repo->codeRepo = '代码库';
$lang->report->common = '统计';
$lang->system->common = '组织';
$lang->admin->common = '后台';
$lang->story->common = $lang->SRCommon;
$lang->task->common = '任务';
$lang->bug->common = 'Bug';
$lang->testcase->common = '用例';
$lang->testtask->common = '测试单';
$lang->score->common = '我的积分';
$lang->build->common = '版本';
$lang->testreport->common = '测试报告';
$lang->automation->common = '自动化:';
$lang->zahost->common = '宿主机';
$lang->zanode->common = '执行节点';
$lang->team->common = '团队';
$lang->user->common = '用户';
$lang->custom->common = '自定义';
$lang->custom->mode = '模式';
$lang->extension->common = '插件';
$lang->company->common = '公司';
$lang->dept->common = '部门';
$lang->upgrade->common = '升级';
$lang->program->list = '项目集列表';
$lang->program->kanban = '项目集看板';
$lang->design->common = '设计';
$lang->design->HLDS = '概要设计';
$lang->design->DDS = '详细设计';
$lang->design->DBDS = '数据库设计';
$lang->design->ADS = '接口设计';
$lang->stage->common = '阶段';
$lang->stage->list = '阶段列表';
$lang->execution->list = "{$lang->executionCommon}列表";
$lang->kanban->common = '看板';
$lang->backup->common = '备份';
$lang->action->trash = '回收站';
$lang->app->common = '应用';
$lang->app->serverLink = '服务器链接';
$lang->review->common = '审批';
$lang->personnel->common = '人员';
$lang->personnel->invest = '投入人员';
+2 -1
View File
@@ -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 = '自定義';
+3
View File
@@ -2365,6 +2365,8 @@ EOD;
*/
public function checkSafeFile()
{
if($this->app->isContainer()) return false;
if($this->app->getModuleName() == 'upgrade' and $this->session->upgrading) return false;
$statusFile = $this->app->getAppRoot() . 'www' . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'ok.txt';
@@ -3200,6 +3202,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);
+32
View File
@@ -0,0 +1,32 @@
<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 echo html::a($modalLink, $buttonName, '', 'id="modalLink"');?>
</p>
</div>
</div>
</div>
</div>
<script>
function showModal(url = '')
{
if(url) $("#modalLink").attr('href', url);
$('#successModal').modal('show', 'center');
}
</script>
+1
View File
@@ -652,6 +652,7 @@ class custom extends control
$this->view->disabledFeatures = $disabledFeatures;
$this->view->enabledScrumFeatures = $enabledScrumFeatures;
$this->view->disabledScrumFeatures = $disabledScrumFeatures;
$this->view->currentModeTips = sprintf($this->lang->custom->currentModeTips, $this->lang->custom->modeList[$mode], $this->lang->custom->modeList[$mode == 'light' ? 'ALM' : 'light']);
$this->display();
}
+9 -9
View File
@@ -20,7 +20,7 @@
<h2><?php echo $lang->custom->modeManagement;?></h2>
</div>
<div class='main-table'>
<p class='strong'><?php echo sprintf($lang->custom->currentModeTips, $lang->custom->modeList[$mode], $lang->custom->modeList[$mode == 'light' ? 'ALM' : 'light']);?> </p>
<p class='strong'><?php echo $currentModeTips;?></p>
<table class='table table-bordered'>
<thead>
<tr>
@@ -55,15 +55,15 @@
<?php endforeach;?>
<tr class='text-center select-mode'>
<td class='text-left strong'><?php echo $this->lang->custom->selectUsage;?></td>
<td>
<?php $primaryClass = $mode == 'light' ? '' : 'btn-primary';?>
<?php $disabled = $mode == 'light' ? 'disabled' : '';?>
<?php echo html::commonButton($lang->custom->useLight, "id='useLight' data-mode='light' $disabled", "btn btn-wide $primaryClass");?>
<?php $title = $mode == 'light' ? "title='{$currentModeTips}'" : '';?>
<td <?php echo $title;?>>
<?php $disabled = $mode == 'light' ? 'disabled' : '';?>
<?php echo html::commonButton($lang->custom->useLight, "id='useLight' data-mode='light' $disabled", "btn btn-wide btn-primary");?>
</td>
<td>
<?php $primaryClass = $mode == 'ALM' ? '' : 'btn-primary';?>
<?php $disabled = $mode == 'ALM' ? 'disabled' : '';?>
<?php echo html::commonButton($lang->custom->useALM, "id='useALM' data-mode='ALM' $disabled", "btn btn-wide $primaryClass");?>
<?php $title = $mode == 'ALM' ? "title='{$currentModeTips}'" : '';?>
<td <?php echo $title;?>>
<?php $disabled = $mode == 'ALM' ? 'disabled' : '';?>
<?php echo html::commonButton($lang->custom->useALM, "id='useALM' data-mode='ALM' $disabled", "btn btn-wide btn-primary");?>
<?php echo html::hidden('mode', $mode);?>
</td>
</tr>
+1
View File
@@ -249,6 +249,7 @@ $lang->doc->errorEmptyLib = 'No data in document library.';
$lang->doc->confirmUpdateContent = 'You have a document that is not saved from last time. Do you want to continue editing it?';
$lang->doc->selectLibType = 'Please select a type of doc library.';
$lang->doc->noLibreOffice = 'You does not have access to office conversion settings!';
$lang->doc->errorParentChapter = 'The parent chapter cannot be its own chapter or sub chapter!';
$lang->doc->noticeAcl['lib']['product']['default'] = 'Users who can access the selected product can access it.';
$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users who can access the selected product or users in the whiltelist can access it.';
+1
View File
@@ -249,6 +249,7 @@ $lang->doc->errorEmptyLib = 'No data in document library.';
$lang->doc->confirmUpdateContent = 'You have a document that is not saved from last time. Do you want to continue editing it?';
$lang->doc->selectLibType = 'Please select a type of doc library.';
$lang->doc->noLibreOffice = 'You does not have access to office conversion settings!';
$lang->doc->errorParentChapter = 'The parent chapter cannot be its own chapter or sub chapter!';
$lang->doc->noticeAcl['lib']['product']['default'] = 'Users who can access the selected product can access it.';
$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users who can access the selected product or users in the whiltelist can access it.';
+1
View File
@@ -249,6 +249,7 @@ $lang->doc->errorEmptyLib = 'No data in document library.';
$lang->doc->confirmUpdateContent = 'You have a document that is not saved from last time. Do you want to continue editing it?';
$lang->doc->selectLibType = 'Please select a type of doc library.';
$lang->doc->noLibreOffice = 'You does not have access to office conversion settings!';
$lang->doc->errorParentChapter = 'The parent chapter cannot be its own chapter or sub chapter!';
$lang->doc->noticeAcl['lib']['product']['default'] = 'Les utilisateurs qui ont accès au Product peuvent y accéder.';
$lang->doc->noticeAcl['lib']['product']['custom'] = 'Les utilisateurs qui ont accès au Product ou les utilisateurs de la Liste Blanche peuvent y accéder.';
+1
View File
@@ -249,6 +249,7 @@ $lang->doc->errorEmptyLib = '文档库暂无数据。';
$lang->doc->confirmUpdateContent = '检查到您有未保存的文档内容,是否继续编辑?';
$lang->doc->selectLibType = '请选择文档库类型';
$lang->doc->noLibreOffice = '您还没有office转换设置访问权限!';
$lang->doc->errorParentChapter = '父章节不能是自身章节及子章节!';
$lang->doc->noticeAcl['lib']['product']['default'] = '有所选产品访问权限的用户可以访问。';
$lang->doc->noticeAcl['lib']['product']['custom'] = '有所选产品访问权限或白名单里的用户可以访问。';
+10
View File
@@ -821,6 +821,16 @@ class docModel extends model
->remove('comment,files,labels,uid,contactListMenu')
->get();
if($doc->type == 'chapter' and $doc->parent)
{
$parentDoc = $this->dao->select('*')->from(TABLE_DOC)->where('id')->eq((int)$doc->parent)->fetch();
if(strpos($parentDoc->path, ",$docID,") !== false)
{
dao::$errors['parent'] = $this->lang->doc->errorParentChapter;
return false;
}
}
if(!empty($doc->acl) and $doc->acl == 'private') $doc->users = $oldDoc->addedBy;
$oldDocContent = $this->dao->select('*')->from(TABLE_DOCCONTENT)->where('doc')->eq($docID)->andWhere('version')->eq($oldDoc->version)->fetch();
+2 -12
View File
@@ -1097,7 +1097,7 @@ class execution extends control
$modules = $this->tree->getAllModulePairs('bug');
/* Get module tree.*/
$extra = array('executionID' => $executionID, 'orderBy' => $orderBy, 'type' => $type, 'build' => $build, 'branchID' => $branch);
$extra = array('projectID' => $executionID, 'orderBy' => $orderBy, 'type' => $type, 'build' => $build, 'branchID' => $branch);
if($executionID and empty($productID) and count($products) > 1)
{
$moduleTree = $this->tree->getBugTreeMenu($executionID, $productID, 0, array('treeModel', 'createBugLink'), $extra);
@@ -1205,7 +1205,7 @@ class execution extends control
}
else
{
$moduleTree = $this->tree->getTreeMenu($productID, 'case', 0, array('treeModel', 'createCaseLink'), array('executionID' => $executionID, 'productID' => $productID), $branchID);
$moduleTree = $this->tree->getTreeMenu($productID, 'case', 0, array('treeModel', 'createCaseLink'), array('projectID' => $executionID, 'productID' => $productID), $branchID);
}
$tree = $moduleID ? $this->tree->getByID($moduleID) : '';
@@ -3867,22 +3867,12 @@ class execution extends control
$executionStats = $this->execution->getStatData(0, $status, $productID, 0, false, $queryID, $orderBy, $pager);
$parentIdList = array();
foreach($executionStats as $execution)
{
if($execution->type != 'stage') continue;
if($execution->grade == 2 and $execution->project != $execution->parent) $parentIdList[$execution->parent] = $execution->parent;
}
$parents = array();
if($parentIdList) $parents = $this->execution->getByIdList($parentIdList);
$allExecutionsNum = $this->execution->getStatData(0, 'all');
$this->view->allExecutionsNum = count($allExecutionsNum);
$this->view->executionStats = $executionStats;
$this->view->productList = $this->loadModel('product')->getProductPairsByProject(0);
$this->view->productID = $productID;
$this->view->parents = $parents;
$this->view->pager = $pager;
$this->view->orderBy = $orderBy;
$this->view->users = $this->loadModel('user')->getPairs('noletter');
+5 -3
View File
@@ -67,7 +67,8 @@ function renderUserAvatar(user, objectType, objectID, size, objectStatus)
if(objectType == 'bug' && !priv.canAssignBug) return $noPrivAvatar;
var realname = user.realname ? user.realname : user.account;
return objectStatus == 'closed' ? '' : $('<a class="avatar has-text ' + avatarSizeClass + ' avatar-circle iframe" title="' + realname + '" href="' + link + '"/>').avatar({user: user});
var title = user.title ? user.title : realname;
return objectStatus == 'closed' ? '' : $('<a class="avatar has-text ' + avatarSizeClass + ' avatar-circle iframe" title="' + title + '" href="' + link + '"/>').avatar({user: user});
}
/**
@@ -286,8 +287,9 @@ function renderTaskItem(item, $item, col)
{
var priHtml = '<span class="info info-pri' + (item.pri ? ' label-pri label-pri-' + item.pri : '') + '" title="' + item.pri + '">' + item.pri + '</span>';
var hoursHtml = scaleSize <= 1 && item.status != 'wait' ? ('<span class="info info-estimate text-muted">' + taskLang.leftAB + ' ' + item.left + 'h</span>') : ('<span class="info info-estimate text-muted">' + taskLang.estimateAB + ' ' + item.estimate + 'h</span>');
var avatarHtml = renderUserAvatar(item.assignedTo, 'task', item.id, '', col.type);
var avatarHtml = '';
if(item.assignedTo == '' && item.mode == 'multi') avatarHtml = renderUserAvatar({title: item.teamMembers, realname: teamWords}, 'task', item.id, '', col.type);
else avatarHtml = renderUserAvatar(item.assignedTo, 'task', item.id, '', col.type);
var $infos = $item.find('.infos');
if(!$infos.length) $infos = $('<div class="infos"></div>');
$infos.html([priHtml, hoursHtml].join(''));
+3 -1
View File
@@ -345,7 +345,7 @@ $lang->execution->timeSummary = '<div class="table-col"><div class="cle
$lang->execution->groupSummaryAB = "<div>Aufgaben <strong>%s</strong></div><div><span class='text-muted'>Wartend</span> %s &nbsp; <span class='text-muted'>In Arbeit</span> %s</div><div>Geplant <strong>%s</strong></div><div><span class='text-muted'>Genutzt</span> %s &nbsp; <span class='text-muted'>Rest</span> %s</div>";
$lang->execution->wbs = "Aufgaben aufteilen";
$lang->execution->batchWBS = "Mehrere aufteilen";
$lang->execution->howToUpdateBurn = "<a href='http://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='Wie wird der Burndown Chart aktualisiert?' class='btn btn-link'>Hilfe <i class='icon icon-help'></i></a>";
$lang->execution->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='Wie wird der Burndown Chart aktualisiert?' class='btn btn-link'>Hilfe <i class='icon icon-help'></i></a>";
$lang->execution->whyNoStories = "Keine Story kann verknüpft werden. Bitte prüfen Sie ob ein Story mit {$lang->executionCommon} verknüpft ist {$lang->productCommon} und stellen Sie sicher das diese geprüft ist.";
$lang->execution->projectNoStories = "No story can be linked. Please check whether there is any story in project and make sure it has been reviewed.";
$lang->execution->productStories = "{$lang->executionCommon} verknüpfte Story ist ein Subset von {$lang->productCommon}, welche nur nach überprüfung verknüpft werden kann. Bitte <a href='%s'> Story verknüpfen</a>。";
@@ -478,6 +478,8 @@ $lang->execution->kanbanViewList['story'] = "{$lang->SRCommon}";
$lang->execution->kanbanViewList['bug'] = 'Bug';
$lang->execution->kanbanViewList['task'] = 'Task';
$lang->execution->teamWords = 'Team';
$lang->kanbanSetting = new stdclass();
$lang->kanbanSetting->noticeReset = 'Möchten Sie die Einstellungen des Kanbans zurücksetzen?';
$lang->kanbanSetting->optionList['0'] = 'Verstecken';
+2
View File
@@ -478,6 +478,8 @@ $lang->execution->kanbanViewList['story'] = "{$lang->SRCommon}";
$lang->execution->kanbanViewList['bug'] = 'Bug';
$lang->execution->kanbanViewList['task'] = 'Task';
$lang->execution->teamWords = 'Team';
$lang->kanbanSetting = new stdclass();
$lang->kanbanSetting->noticeReset = 'Do you want to reset Kanban?';
$lang->kanbanSetting->optionList['0'] = 'Hide';
+2
View File
@@ -478,6 +478,8 @@ $lang->execution->kanbanViewList['story'] = "{$lang->SRCommon}";
$lang->execution->kanbanViewList['bug'] = 'Bug';
$lang->execution->kanbanViewList['task'] = 'Task';
$lang->execution->teamWords = 'Team';
$lang->kanbanSetting = new stdclass();
$lang->kanbanSetting->noticeReset = 'Voulez-vous réinitialiser le tableau Kanban ?';
$lang->kanbanSetting->optionList['0'] = 'Masquer';
+2
View File
@@ -436,4 +436,6 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->teamWords = 'đội';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+2
View File
@@ -478,6 +478,8 @@ $lang->execution->kanbanViewList['story'] = "{$lang->SRCommon}看板";
$lang->execution->kanbanViewList['bug'] = 'Bug看板';
$lang->execution->kanbanViewList['task'] = '任务看板';
$lang->execution->teamWords = '团队';
$lang->kanbanSetting = new stdclass();
$lang->kanbanSetting->noticeReset = '是否恢复看板默认设置?';
$lang->kanbanSetting->optionList['0'] = '隐藏';
+2
View File
@@ -453,4 +453,6 @@ $lang->execution->statusColorList['doing'] = '#0BD986';
$lang->execution->statusColorList['suspended'] = '#fdc137';
$lang->execution->statusColorList['closed'] = '#838A9D';
$lang->execution->teamWords = '團隊';
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
+10 -11
View File
@@ -114,14 +114,12 @@ class executionModel extends model
}
$stageFilter = array('request', 'design', 'review');
if(isset($execution->attribute))
if(isset($execution->attribute) and in_array($execution->attribute, $stageFilter))
{
if($this->config->edition == 'open' and in_array($execution->attribute, $stageFilter))
{
unset($this->lang->execution->menu->story);
unset($this->lang->execution->menu->qa);
unset($this->lang->execution->menu->build);
}
unset($this->lang->execution->menu->story);
unset($this->lang->execution->menu->devops);
unset($this->lang->execution->menu->qa);
unset($this->lang->execution->menu->build);
}
if($executions and (!isset($executions[$executionID]) or !$this->checkPriv($executionID))) $this->accessDenied();
@@ -1627,7 +1625,7 @@ class executionModel extends model
}
/* In the case of the waterfall model, calculate the sub-stage. */
if($param == 'skipParent')
if($param === 'skipParent')
{
if($execution->parent < 0 and $execution->type == 'stage') unset($executions[$key]);
if($execution->projectName) $execution->name = $execution->projectName . ' / ' . $execution->name;
@@ -3178,12 +3176,12 @@ class executionModel extends model
{
dao::$errors['message'][] = sprintf($this->lang->execution->daysGreaterProject, $execution->days);
return false;
}
}
if((float)$hours[$key] > 24)
{
dao::$errors['message'][] = $this->lang->execution->errorHours;
return false;
}
}
}
$this->dao->delete()->from(TABLE_TEAM)->where('root')->eq($executionID)->andWhere('type')->eq($executionType)->exec();
@@ -5191,7 +5189,6 @@ class executionModel extends model
$_POST = array();
$_POST['project'] = $projectID;
$_POST['name'] = $project->name;
$_POST['code'] = $project->code;
$_POST['begin'] = $project->begin;
$_POST['end'] = $project->end;
$_POST['realBegan'] = $project->realBegan;
@@ -5205,6 +5202,8 @@ class executionModel extends model
$_POST['status'] = $project->status;
$_POST['acl'] = 'open';
if(!empty($_POST['code'])) $_POST['code'] = $project->code;
$projectProducts = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($projectID)->fetchAll();
foreach($projectProducts as $projectProduct)
{
@@ -187,7 +187,7 @@ $closedExecutionsHtml .= '</ul>';
<script>
$(function()
{
<?php if($currentExecution->status == 'done' or $currentExecution->status == 'closed'):?>
<?php if($currentExecution and ($currentExecution->status == 'done' or $currentExecution->status == 'closed')):?>
$('.col-footer .toggle-right-col').click(function(){ scrollToSelected(); })
<?php else:?>
scrollToSelected();
+2 -1
View File
@@ -161,7 +161,8 @@
</div>
</td>
</tr>
<?php if(isset($project->model) and $project->model == 'scrum') $hidden = '';?>
<?php $hidden = 'hide'?>
<?php if(isset($project->model) and !empty($project->hasProduct) and $project->model == 'scrum') $hidden = '';?>
<tr class="<?php echo $hidden?>">
<th><?php echo $lang->execution->linkPlan;?></th>
<td colspan="3" id="plansBox">
@@ -231,4 +231,5 @@ js::set('priv',
<?php js::set('orderBy', $storyOrder);?>
<?php js::set('defaultMinColWidth', $this->config->minColWidth);?>
<?php js::set('defaultMaxColWidth', $this->config->maxColWidth);?>
<?php js::set('teamWords', $lang->execution->teamWords);?>
<?php include '../../common/view/footer.html.php';?>
+3 -4
View File
@@ -780,11 +780,10 @@ class extensionModel extends model
/**
* Update an extension.
*
* @param string $extension
* @param string $status
* @param array $files
* @param string $extension
* @param array|object $data
* @access public
* @return void
* @return int
*/
public function updateExtension($extension, $data)
{
+9 -23
View File
@@ -221,34 +221,20 @@ class file extends control
$this->view->fields = $this->post->fields;
$this->view->rows = $this->post->rows;
$this->host = common::getSysURL();
$kind = $this->post->kind;
switch($this->post->kind)
foreach($this->view->rows as $row)
{
case 'task':
foreach($this->view->rows as $row)
foreach($row as &$field)
{
$row->name = html::a($this->host . $this->createLink('task', 'view', "taskID=$row->id"), $row->name);
if(empty($field)) continue;
$field = preg_replace('/ src="{([0-9]+)(\.(\w+))?}" /', ' src="' . $this->host . helper::createLink('file', 'read', "fileID=$1", "$3") . '" ', $field);
}
break;
case 'story':
foreach($this->view->rows as $row)
{
$row->title= html::a($this->host . $this->createLink('story', 'view', "storyID=$row->id"), $row->title);
}
break;
case 'bug':
foreach($this->view->rows as $row)
{
$row->title= html::a($this->host . $this->createLink('bug', 'view', "bugID=$row->id"), $row->title);
}
break;
case 'testcase':
foreach($this->view->rows as $row)
{
$row->title= html::a($this->host . $this->createLink('testcase', 'view', "caseID=$row->id"), $row->title);
}
break;
if(in_array($kind, array('story', 'bug', 'testcase'))) $row->title = html::a($this->host . $this->createLink($kind, 'view', "{$kind}ID=$row->id"), $row->title);
if($kind == 'task') $row->name = html::a($this->host . $this->createLink('task', 'view', "taskID=$row->id"), $row->name);
}
$this->view->fileName = $this->post->fileName;
$output = $this->parse('file', 'export2Html');
+2 -2
View File
@@ -667,7 +667,6 @@ class fileModel extends model
public function pasteImage($data, $uid = '', $safe = false)
{
if(empty($data)) return '';
$data = str_replace('\"', '"', $data);
$dataLength = strlen($data);
if(ini_get('pcre.backtrack_limit') < $dataLength) ini_set('pcre.backtrack_limit', $dataLength);
@@ -676,7 +675,8 @@ class fileModel extends model
{
foreach($out[3] as $key => $base64Image)
{
$extension = strtolower($out[2][$key]);
$base64Image = str_replace('\"', '"', $base64Image);
$extension = strtolower($out[2][$key]);
if(!in_array($extension, $this->config->file->imageExtensions)) helper::end();
$imageData = base64_decode($base64Image);
+14 -1
View File
@@ -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
{
+1 -1
View File
@@ -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');
}
+68 -21
View File
@@ -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[115] = 'report';
@@ -1074,6 +1075,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';
@@ -1085,26 +1087,27 @@ $lang->testcase->methodOrder[30] = 'createBug';
$lang->testcase->methodOrder[35] = 'view';
$lang->testcase->methodOrder[40] = 'edit';
$lang->testcase->methodOrder[45] = 'delete';
$lang->testcase->methodOrder[50] = 'showScript';
$lang->testcase->methodOrder[55] = 'export';
$lang->testcase->methodOrder[60] = 'confirmChange';
$lang->testcase->methodOrder[65] = 'confirmStoryChange';
$lang->testcase->methodOrder[70] = 'batchEdit';
$lang->testcase->methodOrder[75] = 'batchDelete';
$lang->testcase->methodOrder[80] = 'batchChangeModule';
$lang->testcase->methodOrder[85] = 'batchChangeBranch';
$lang->testcase->methodOrder[90] = 'linkCases';
$lang->testcase->methodOrder[95] = 'linkBugs';
$lang->testcase->methodOrder[100] = 'bugs';
$lang->testcase->methodOrder[105] = 'review';
$lang->testcase->methodOrder[110] = 'batchReview';
$lang->testcase->methodOrder[115] = 'batchConfirmStoryChange';
$lang->testcase->methodOrder[120] = 'importFromLib';
$lang->testcase->methodOrder[125] = 'batchCaseTypeChange';
$lang->testcase->methodOrder[130] = 'confirmLibcaseChange';
$lang->testcase->methodOrder[135] = 'ignoreLibcaseChange';
$lang->testcase->methodOrder[140] = 'batchConfirmStoryChange';
$lang->testcase->methodOrder[145] = 'importToLib';
$lang->testcase->methodOrder[50] = 'export';
$lang->testcase->methodOrder[55] = 'confirmChange';
$lang->testcase->methodOrder[60] = 'confirmStoryChange';
$lang->testcase->methodOrder[65] = 'batchEdit';
$lang->testcase->methodOrder[70] = 'batchDelete';
$lang->testcase->methodOrder[75] = 'batchChangeModule';
$lang->testcase->methodOrder[80] = 'batchChangeBranch';
$lang->testcase->methodOrder[85] = 'linkCases';
$lang->testcase->methodOrder[87] = 'linkBugs';
$lang->testcase->methodOrder[90] = 'bugs';
$lang->testcase->methodOrder[95] = 'review';
$lang->testcase->methodOrder[100] = 'batchReview';
$lang->testcase->methodOrder[110] = 'batchConfirmStoryChange';
$lang->testcase->methodOrder[115] = 'importFromLib';
$lang->testcase->methodOrder[120] = 'batchCaseTypeChange';
$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();
@@ -1218,6 +1221,42 @@ $lang->resource->automation->browse = 'browse';
$lang->automation->methodOrder[0] = '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->browseTemplate = 'browseTemplate';
$lang->resource->zahost->createTemplate = 'createTemplate';
$lang->resource->zahost->editTemplate = 'editTemplate';
$lang->resource->zahost->deleteTemplate = 'deleteTemplate';
$lang->zahost->methodOrder[0] = 'browse';
$lang->zahost->methodOrder[5] = 'create';
$lang->zahost->methodOrder[10] = 'edit';
$lang->zahost->methodOrder[15] = 'delete';
$lang->zahost->methodOrder[20] = 'browseTemplate';
$lang->zahost->methodOrder[25] = 'createTemplate';
$lang->zahost->methodOrder[30] = 'editTemplate';
$lang->zahost->methodOrder[35] = 'deleteTemplate';
$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->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->resource->repo = new stdclass();
$lang->resource->repo->browse = 'browseAction';
$lang->resource->repo->view = 'view';
@@ -1234,6 +1273,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';
@@ -1250,6 +1293,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';
+4 -1
View File
@@ -266,7 +266,10 @@ class install extends control
$this->setting->setItem('system.common.safe.changeWeak', '1');
$this->setting->setItem('system.common.global.cron', 1);
if(strpos($this->app->getClientLang(), 'zh') === 0) $this->loadModel('api')->createDemoData($this->lang->api->zentaoAPI, 'http://' . $_SERVER['HTTP_HOST'] . $this->app->config->webRoot . 'api.php/v1', '16.0');
$httpType = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 'https' : 'http';
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) and strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https') $httpType = 'https';
if(isset($_SERVER['REQUEST_SCHEME']) and strtolower($_SERVER['REQUEST_SCHEME']) == 'https') $httpType = 'https';
if(strpos($this->app->getClientLang(), 'zh') === 0) $this->loadModel('api')->createDemoData($this->lang->api->zentaoAPI, "{$httpType}://{$_SERVER['HTTP_HOST']}" . $this->app->config->webRoot . 'api.php/v1', '16.0');
return print(js::locate(inlink('step6'), 'parent'));
}
+1
View File
@@ -9,6 +9,7 @@
#mainContent tr td {background-color: rgb(255, 255, 255); border-bottom: 1px solid rgb(238, 238, 238); border-right: 1px solid rgb(238, 238, 238);}
.btn-wide {padding: 6px 85px;}
#useLight:hover, #useALM:hover{color: #fff; background-color: #2e7fff; border-color: transparent;}
#mainContent .datatable {cursor: default;}
.container {padding-top: 20px;}
+2
View File
@@ -1511,6 +1511,8 @@ class kanbanModel extends model
$cardData['status'] = $object->status;
$cardData['left'] = $object->left;
$cardData['estStarted'] = $object->estStarted;
$cardData['mode'] = $object->mode;
if($object->mode == 'multi') $cardData['teamMembers'] = $object->teamMembers;
}
else
{
+8 -1
View File
@@ -114,7 +114,6 @@ class messageModel extends model
$this->loadModel('webhook')->send($objectType, $objectID, $actionType, $actionID, $actor);
}
}
if(isset($messageSetting['message']))
{
$actions = $messageSetting['message']['setting'];
@@ -201,6 +200,14 @@ class messageModel extends model
if(!empty($notifyPersons)) $toList = implode(',', $notifyPersons);
}
if(empty($toList) and $objectType == 'task' and $object->mode == 'multi')
{
$teamMembers = $this->loadModel('task')->getTeamMembers($object->id);
$toList = array_filter($teamMembers, function($account){
return $account != $this->app->user->account;
});
$toList = implode(',', $toList);
}
if($toList == 'closed') $toList = '';
if($objectType == 'feedback' and $object->status == 'replied') $toList = ',' . $object->openedBy . ',';

Some files were not shown because too many files have changed in this diff Show More