Merge branch 'master' of https://github.com/easysoft/zentaopms
This commit is contained in:
+10
-14
@@ -43,24 +43,20 @@ $config->projectCommonList['vi'][0] = 'Lặp lại';
|
||||
$config->projectCommonList['vi'][1] = 'Sprint';
|
||||
$config->projectCommonList['vi'][2] = 'Giai đoạn';
|
||||
|
||||
/* Story common list. */
|
||||
$config->storyCommonList['zh-cn'][0] = '需求';
|
||||
$config->storyCommonList['zh-cn'][1] = '故事';
|
||||
$config->URStory['zh-cn'] = '用户需求';
|
||||
$config->SRStory['zh-cn'] = '软件需求';
|
||||
|
||||
$config->storyCommonList['zh-tw'][0] = '需求';
|
||||
$config->storyCommonList['zh-tw'][1] = '故事';
|
||||
$config->URStory['en'] = 'Requirement';
|
||||
$config->SRStory['en'] = 'Story';
|
||||
|
||||
$config->storyCommonList['en'][0] = 'Story';
|
||||
$config->storyCommonList['en'][1] = 'Story';
|
||||
$config->URStory['vi'] = 'Requirement';
|
||||
$config->SRStory['vi'] = 'Story';
|
||||
|
||||
$config->storyCommonList['de'][0] = 'Story';
|
||||
$config->storyCommonList['de'][1] = 'Story';
|
||||
$config->URStory['fr'] = 'Requirement';
|
||||
$config->SRStory['fr'] = 'Story';
|
||||
|
||||
$config->storyCommonList['fr'][0] = 'Story';
|
||||
$config->storyCommonList['fr'][1] = 'Story';
|
||||
|
||||
$config->storyCommonList['vi'][0] = 'Câu chuyện';
|
||||
$config->storyCommonList['vi'][1] = 'Câu chuyện';
|
||||
$config->URStory['de'] = 'Requirement';
|
||||
$config->SRStory['de'] = 'Story';
|
||||
|
||||
/* Story common list. */
|
||||
$config->hourPointCommonList['zh-cn'][0] = '故事点';
|
||||
|
||||
@@ -5,3 +5,16 @@ MODIFY COLUMN `duration` decimal(10, 2) UNSIGNED NOT NULL AFTER `productivity`,
|
||||
MODIFY COLUMN `unitLaborCost` decimal(10, 2) UNSIGNED NOT NULL AFTER `duration`,
|
||||
MODIFY COLUMN `totalLaborCost` decimal(10, 2) UNSIGNED NOT NULL AFTER `unitLaborCost`,
|
||||
MODIFY COLUMN `dayHour` decimal(10, 2) NULL DEFAULT NULL AFTER `deleted`;
|
||||
|
||||
ALTER TABLE `zt_project` ADD `storyConcept` smallint(5) unsigned NOT NULL AFTER `days`;
|
||||
ALTER TABLE `zt_product` ADD `storyConcept` smallint(5) NOT NULL AFTER `RD`;
|
||||
|
||||
INSERT INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
|
||||
('zh-cn', 'custom', 'URList', '1', '用户需求', '1'),
|
||||
('zh-cn', 'custom', 'URList', '2', '用需', '1'),
|
||||
('zh-cn', 'custom', 'URList', '3', '需求', '1'),
|
||||
('zh-cn', 'custom', 'URList', '4', '史诗', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '1', '软件需求', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '2', '软需', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '3', '故事', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '4', '故事', '1');
|
||||
|
||||
+13
-2
@@ -671,6 +671,7 @@ CREATE TABLE IF NOT EXISTS `zt_product` (
|
||||
`PO` varchar(30) NOT NULL,
|
||||
`QD` varchar(30) NOT NULL,
|
||||
`RD` varchar(30) NOT NULL,
|
||||
`storyConcept` smallint(5) NOT NULL,
|
||||
`acl` enum('open','private','custom') NOT NULL default 'open',
|
||||
`whitelist` text NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
@@ -723,6 +724,7 @@ CREATE TABLE IF NOT EXISTS `zt_project` (
|
||||
`realBegan` date NOT NULL,
|
||||
`realEnd` date NOT NULL,
|
||||
`days` smallint(5) unsigned NOT NULL,
|
||||
`storyConcept` smallint(5) unsigned NOT NULL,
|
||||
`status` varchar(10) NOT NULL,
|
||||
`subStatus` varchar(30) NOT NULL DEFAULT '',
|
||||
`statge` enum('1','2','3','4','5') NOT NULL DEFAULT '1',
|
||||
@@ -4070,9 +4072,18 @@ INSERT INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`edite
|
||||
('发布','10','release','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
|
||||
('总结评审','5','review','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0');
|
||||
|
||||
INSERT INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
|
||||
('zh-cn', 'custom', 'URList', '1', '用户需求', '1'),
|
||||
('zh-cn', 'custom', 'URList', '2', '用需', '1'),
|
||||
('zh-cn', 'custom', 'URList', '3', '需求', '1'),
|
||||
('zh-cn', 'custom', 'URList', '4', '史诗', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '1', '软件需求', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '2', '软需', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '3', '故事', '1'),
|
||||
('zh-cn', 'custom', 'SRList', '4', '故事', '1');
|
||||
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES
|
||||
('system','custom','','hourPoint','1'),
|
||||
('system','custom','','URAndSR','1'),
|
||||
('system','custom','common','URSRName','{\"URCommon\":{\"zh-cn\":\"\\u7528\\u6237\\u9700\\u6c42\"},\"SRCommon\":{\"zh-cn\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\"}}');
|
||||
('system','custom','','URAndSR','1');
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1');
|
||||
INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProject', '1');
|
||||
|
||||
+34
-19
@@ -115,7 +115,7 @@ class router extends baseRouter
|
||||
/* Set productCommon and projectCommon for flow. */
|
||||
if($moduleName == 'common')
|
||||
{
|
||||
$productProject = $storyRequirement = $hourPoint = false;
|
||||
$productProject = $hourPoint = false;
|
||||
if($this->dbh and !empty($this->config->db->name))
|
||||
{
|
||||
global $config;
|
||||
@@ -126,7 +126,7 @@ class router extends baseRouter
|
||||
$commonSettings = array();
|
||||
try
|
||||
{
|
||||
$commonSettings = $this->dbh->query('SELECT section, `key`, value FROM' . TABLE_CONFIG . "WHERE `owner`='system' AND `module`='custom' and `key` in ('productProject','URAndSR','URSRName','storyRequirement','hourPoint')")->fetchAll();
|
||||
$commonSettings = $this->dbh->query('SELECT section, `key`, value FROM' . TABLE_CONFIG . "WHERE `owner`='system' AND `module`='custom' and `key` in ('productProject','hourPoint','URAndSR')")->fetchAll();
|
||||
}
|
||||
catch (PDOException $exception)
|
||||
{
|
||||
@@ -147,22 +147,14 @@ class router extends baseRouter
|
||||
}
|
||||
}
|
||||
|
||||
$productIndex = $storyIndex = $hourIndex = $planIndex = $URAndSR = 0;
|
||||
$productIndex = $hourIndex = $planIndex = $URAndSR = 0;
|
||||
$projectIndex = empty($this->config->isINT) ? 0 : 1;
|
||||
|
||||
foreach($commonSettings as $setting)
|
||||
{
|
||||
if($setting->key == 'productProject') list($productIndex, $projectIndex) = explode('_', $setting->value);
|
||||
if($setting->key == 'storyRequirement') $storyIndex = $setting->value;
|
||||
if($setting->key == 'hourPoint') $hourIndex = $setting->value;
|
||||
if($setting->key == 'URAndSR') $URAndSR = $setting->value;
|
||||
|
||||
if($setting->key == 'URSRName')
|
||||
{
|
||||
$URSRName = json_decode($setting->value, true);
|
||||
if(isset($URSRName['URCommon'][$this->clientLang])) $lang->URCommon = $URSRName['URCommon'][$this->clientLang];
|
||||
if(isset($URSRName['SRCommon'][$this->clientLang])) $lang->SRCommon = $URSRName['SRCommon'][$this->clientLang];
|
||||
}
|
||||
}
|
||||
|
||||
$model = new stdclass();
|
||||
@@ -174,21 +166,43 @@ class router extends baseRouter
|
||||
$projectIndex = 2;
|
||||
}
|
||||
|
||||
$config->storyCommon = $storyIndex;
|
||||
$config->URAndSR = $URAndSR;
|
||||
$config->URAndSR = $URAndSR;
|
||||
|
||||
/* Set productCommon, projectCommon, storyCommon, hourCommon and planCommon. Default english lang. */
|
||||
/* Set productCommon, projectCommon, hourCommon and planCommon. Default english lang. */
|
||||
$lang->productCommon = isset($this->config->productCommonList[$this->clientLang][(int)$productIndex]) ? $this->config->productCommonList[$this->clientLang][(int)$productIndex] : $this->config->productCommonList['en'][(int)$productIndex];
|
||||
$lang->projectCommon = isset($this->config->projectCommonList[$this->clientLang][(int)$projectIndex]) ? $this->config->projectCommonList[$this->clientLang][(int)$projectIndex] : $this->config->projectCommonList['en'][(int)$$projectIndex];
|
||||
$lang->storyCommon = isset($this->config->storyCommonList[$this->clientLang][(int)$storyIndex]) ? $this->config->storyCommonList[$this->clientLang][(int)$storyIndex] : $this->config->storyCommonList['en'][(int)$storyIndex];
|
||||
$lang->hourCommon = isset($this->config->hourPointCommonList[$this->clientLang][(int)$hourIndex]) ? $this->config->hourPointCommonList[$this->clientLang][(int)$hourIndex] : $this->config->hourPointCommonList['en'][(int)$hourIndex];
|
||||
$lang->planCommon = isset($this->config->planCommonList[$this->clientLang][(int)$planIndex]) ? $this->config->planCommonList[$this->clientLang][(int)$planIndex] : $this->config->planCommonList['en'][(int)$planIndex];
|
||||
|
||||
if($storyIndex == 0 and isset($URAndSR))
|
||||
{
|
||||
$config->URAndSR = $URAndSR;
|
||||
if(!empty($URAndSR) and !empty($lang->SRCommon)) $lang->storyCommon = $lang->SRCommon;
|
||||
$URLists = $this->dbh->query('SELECT `key`, `value` FROM' . TABLE_LANG . "WHERE module = 'custom' and section = 'URList' and lang = \"{$this->clientLang}\"")->fetchAll();
|
||||
$SRLists = $this->dbh->query('SELECT `key`, `value` FROM' . TABLE_LANG . "WHERE module = 'custom' and section = 'SRList' and lang = \"{$this->clientLang}\"")->fetchAll();
|
||||
|
||||
$URList = array();
|
||||
$SRList = array();
|
||||
foreach($URLists as $pair) $URList[$pair->key] = $pair->value;
|
||||
foreach($SRLists as $pair) $SRList[$pair->key] = $pair->value;
|
||||
|
||||
$lang->projectURCommon = $config->URStory[$this->clientLang];
|
||||
$lang->productURCommon = $config->URStory[$this->clientLang];
|
||||
$lang->projectSRCommon = $config->SRStory[$this->clientLang];
|
||||
$lang->productSRCommon = $config->SRStory[$this->clientLang];
|
||||
|
||||
$projectID = $this->session->PRJ;
|
||||
if($projectID)
|
||||
{
|
||||
$storyConcept = $this->dbh->query('SELECT `storyConcept` FROM' . TABLE_PROJECT . "WHERE id = {$projectID}")->fetch();
|
||||
$lang->projectURCommon = zget($URList, $storyConcept->storyConcept, $config->URStory[$this->clientLang]);
|
||||
$lang->projectSRCommon = zget($SRList, $storyConcept->storyConcept, $config->SRStory[$this->clientLang]);
|
||||
}
|
||||
|
||||
$productID = $this->session->product;
|
||||
if($productID)
|
||||
{
|
||||
$storyConcept = $this->dbh->query('SELECT `storyConcept` FROM' . TABLE_PRODUCT . "WHERE id = {$productID}")->fetch();
|
||||
$lang->productURCommon = zget($URList, $storyConcept->storyConcept, $config->URStory[$this->clientLang]);
|
||||
$lang->productSRCommon = zget($SRList, $storyConcept->storyConcept, $config->SRStory[$this->clientLang]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
parent::loadLang($moduleName, $appName);
|
||||
@@ -216,6 +230,7 @@ class router extends baseRouter
|
||||
unset($nullValue);
|
||||
}
|
||||
}
|
||||
|
||||
return $lang;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ $lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['story'] = $lang->storyCommon;
|
||||
$lang->action->objectTypes['story'] = $lang->productSRCommon;
|
||||
$lang->action->objectTypes['productplan'] = $lang->planCommon;
|
||||
$lang->action->objectTypes['release'] = '发布';
|
||||
$lang->action->objectTypes['program'] = '项目';
|
||||
@@ -109,7 +109,7 @@ $lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加
|
||||
$lang->action->desc->activated = '$date, 由 <strong>$actor</strong> 激活。' . "\n";
|
||||
$lang->action->desc->blocked = '$date, 由 <strong>$actor</strong> 阻塞。' . "\n";
|
||||
$lang->action->desc->moved = '$date, 由 <strong>$actor</strong> 移动,之前为 "$extra"。' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, 由 <strong>$actor</strong> 确认' . $lang->storyCommon . '变动,最新版本为<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, 由 <strong>$actor</strong> 确认' . $lang->productSRCommon . '变动,最新版本为<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->caseconfirmed = '$date, 由 <strong>$actor</strong> 确认用例变动,最新版本为<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->bugconfirmed = '$date, 由 <strong>$actor</strong> 确认Bug。' . "\n";
|
||||
$lang->action->desc->frombug = '$date, 由 <strong>$actor</strong> Bug转化而来,Bug编号为 <strong>$extra</strong>。';
|
||||
@@ -172,10 +172,10 @@ $lang->action->label->blocked = '阻塞了';
|
||||
$lang->action->label->resolved = '解决了';
|
||||
$lang->action->label->reviewed = '评审了';
|
||||
$lang->action->label->moved = '移动了';
|
||||
$lang->action->label->confirmed = "确认了{$lang->storyCommon}";
|
||||
$lang->action->label->confirmed = "确认了{$lang->productSRCommon}";
|
||||
$lang->action->label->bugconfirmed = '确认了';
|
||||
$lang->action->label->tostory = "转{$lang->storyCommon}";
|
||||
$lang->action->label->frombug = "转{$lang->storyCommon}";
|
||||
$lang->action->label->tostory = "转{$lang->productSRCommon}";
|
||||
$lang->action->label->frombug = "转{$lang->productSRCommon}";
|
||||
$lang->action->label->fromlib = '从用例库导入';
|
||||
$lang->action->label->totask = '转任务';
|
||||
$lang->action->label->svncommited = '提交代码';
|
||||
@@ -193,10 +193,10 @@ $lang->action->label->linkrelatedbug = "关联了相关Bug";
|
||||
$lang->action->label->unlinkrelatedbug = "移除了相关Bug";
|
||||
$lang->action->label->linkrelatedcase = "关联了相关用例";
|
||||
$lang->action->label->unlinkrelatedcase = "移除了相关用例";
|
||||
$lang->action->label->linkrelatedstory = "关联了相关{$lang->storyCommon}";
|
||||
$lang->action->label->unlinkrelatedstory = "移除了相关{$lang->storyCommon}";
|
||||
$lang->action->label->subdividestory = "细分了{$lang->storyCommon}";
|
||||
$lang->action->label->unlinkchildstory = "移除了细分{$lang->storyCommon}";
|
||||
$lang->action->label->linkrelatedstory = "关联了相关{$lang->productSRCommon}";
|
||||
$lang->action->label->unlinkrelatedstory = "移除了相关{$lang->productSRCommon}";
|
||||
$lang->action->label->subdividestory = "细分了{$lang->productSRCommon}";
|
||||
$lang->action->label->unlinkchildstory = "移除了细分{$lang->productSRCommon}";
|
||||
$lang->action->label->started = '开始了';
|
||||
$lang->action->label->restarted = '继续了';
|
||||
$lang->action->label->recordestimate = '记录了工时';
|
||||
@@ -266,22 +266,22 @@ $lang->action->dynamicAction->release['edited'] = '编辑发布';
|
||||
$lang->action->dynamicAction->release['changestatus'] = '修改发布状态';
|
||||
$lang->action->dynamicAction->release['undeleted'] = '还原发布';
|
||||
$lang->action->dynamicAction->release['hidden'] = '隐藏发布';
|
||||
$lang->action->dynamicAction->story['opened'] = "创建{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['edited'] = "编辑{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['activated'] = "激活{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['reviewed'] = "评审{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['closed'] = "关闭{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['changed'] = "变更{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->storyCommon}关联{$lang->planCommon}";
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = "{$lang->planCommon}移除{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['linked2release'] = "{$lang->storyCommon}关联发布";
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "发布移除{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['linked2build'] = "{$lang->storyCommon}关联版本";
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['opened'] = "创建{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['edited'] = "编辑{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['activated'] = "激活{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['reviewed'] = "评审{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['closed'] = "关闭{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['changed'] = "变更{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->productSRCommon}关联{$lang->planCommon}";
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = "{$lang->planCommon}移除{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2release'] = "{$lang->productSRCommon}关联发布";
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "发布移除{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2build'] = "{$lang->productSRCommon}关联版本";
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除项目';
|
||||
$lang->action->dynamicAction->story['undeleted'] = "还原{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['hidden'] = "隐藏{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['undeleted'] = "还原{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['hidden'] = "隐藏{$lang->productSRCommon}";
|
||||
|
||||
$lang->action->dynamicAction->project['opened'] = '创建' . $lang->projectCommon;
|
||||
$lang->action->dynamicAction->project['edited'] = '编辑' . $lang->projectCommon;
|
||||
@@ -299,7 +299,7 @@ $lang->action->dynamicAction->task['opened'] = '创建任务';
|
||||
$lang->action->dynamicAction->task['edited'] = '编辑任务';
|
||||
$lang->action->dynamicAction->task['commented'] = '备注任务';
|
||||
$lang->action->dynamicAction->task['assigned'] = '指派任务';
|
||||
$lang->action->dynamicAction->task['confirmed'] = "确认{$lang->storyCommon}变更";
|
||||
$lang->action->dynamicAction->task['confirmed'] = "确认{$lang->productSRCommon}变更";
|
||||
$lang->action->dynamicAction->task['started'] = '开始任务';
|
||||
$lang->action->dynamicAction->task['finished'] = '完成任务';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = '记录工时';
|
||||
@@ -336,8 +336,8 @@ $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->storyCommon}变更";
|
||||
$lang->action->dynamicAction->bug['tostory'] = "转{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->bug['confirmed'] = "确认{$lang->productSRCommon}变更";
|
||||
$lang->action->dynamicAction->bug['tostory'] = "转{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->bug['totask'] = '转任务';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = "Bug关联{$lang->planCommon}";
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = "{$lang->planCommon}移除Bug";
|
||||
@@ -357,7 +357,7 @@ $lang->action->dynamicAction->case['deleted'] = '删除用例';
|
||||
$lang->action->dynamicAction->case['undeleted'] = '还原用例';
|
||||
$lang->action->dynamicAction->case['hidden'] = '隐藏用例';
|
||||
$lang->action->dynamicAction->case['reviewed'] = '评审用例';
|
||||
$lang->action->dynamicAction->case['confirmed'] = "确认{$lang->storyCommon}变更";
|
||||
$lang->action->dynamicAction->case['confirmed'] = "确认{$lang->productSRCommon}变更";
|
||||
$lang->action->dynamicAction->case['fromlib'] = '从用例库导入';
|
||||
$lang->action->dynamicAction->testreport['opened'] = '创建测试报告';
|
||||
$lang->action->dynamicAction->testreport['edited'] = '编辑测试报告';
|
||||
@@ -399,7 +399,7 @@ $lang->action->dynamicAction->entry['edited'] = '编辑应用';
|
||||
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
|
||||
$lang->action->label->productplan = "{$lang->planCommon}|productplan|view|productID=%s";
|
||||
$lang->action->label->release = '发布|release|view|productID=%s';
|
||||
$lang->action->label->story = "{$lang->storyCommon}|story|view|storyID=%s";
|
||||
$lang->action->label->story = "{$lang->productSRCommon}|story|view|storyID=%s";
|
||||
$lang->action->label->program = "项目|program|browse|";
|
||||
$lang->action->label->project = "{$lang->projectCommon}|project|view|projectID=%s";
|
||||
$lang->action->label->task = '任务|task|view|taskID=%s';
|
||||
@@ -430,7 +430,7 @@ $lang->action->search->objectTypeList['bug'] = 'Bug';
|
||||
$lang->action->search->objectTypeList['case'] = '用例';
|
||||
$lang->action->search->objectTypeList['caseresult'] = '用例结果';
|
||||
$lang->action->search->objectTypeList['stepresult'] = '用例步骤';
|
||||
$lang->action->search->objectTypeList['story'] = $lang->storyCommon;
|
||||
$lang->action->search->objectTypeList['story'] = $lang->productSRCommon;
|
||||
$lang->action->search->objectTypeList['task'] = '任务';
|
||||
$lang->action->search->objectTypeList['testtask'] = '测试单';
|
||||
$lang->action->search->objectTypeList['user'] = '用户';
|
||||
|
||||
@@ -65,7 +65,7 @@ $lang->action->periods['thismonth'] = $lang->action->dynamic->thisMonth;
|
||||
$lang->action->periods['lastmonth'] = $lang->action->dynamic->lastMonth;
|
||||
|
||||
$lang->action->objectTypes['product'] = $lang->productCommon;
|
||||
$lang->action->objectTypes['story'] = $lang->storyCommon;
|
||||
$lang->action->objectTypes['story'] = $lang->productSRCommon;
|
||||
$lang->action->objectTypes['productplan'] = '計劃';
|
||||
$lang->action->objectTypes['release'] = '發佈';
|
||||
$lang->action->objectTypes['project'] = $lang->projectCommon;
|
||||
@@ -108,7 +108,7 @@ $lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加
|
||||
$lang->action->desc->activated = '$date, 由 <strong>$actor</strong> 激活。' . "\n";
|
||||
$lang->action->desc->blocked = '$date, 由 <strong>$actor</strong> 阻塞。' . "\n";
|
||||
$lang->action->desc->moved = '$date, 由 <strong>$actor</strong> 移動,之前為 "$extra"。' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, 由 <strong>$actor</strong> 確認' . $lang->storyCommon . '變動,最新版本為<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, 由 <strong>$actor</strong> 確認' . $lang->productSRCommon . '變動,最新版本為<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->caseconfirmed = '$date, 由 <strong>$actor</strong> 確認用例變動,最新版本為<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->bugconfirmed = '$date, 由 <strong>$actor</strong> 確認Bug。' . "\n";
|
||||
$lang->action->desc->frombug = '$date, 由 <strong>$actor</strong> Bug轉化而來,Bug編號為 <strong>$extra</strong>。';
|
||||
@@ -171,10 +171,10 @@ $lang->action->label->blocked = '阻塞了';
|
||||
$lang->action->label->resolved = '解決了';
|
||||
$lang->action->label->reviewed = '評審了';
|
||||
$lang->action->label->moved = '移動了';
|
||||
$lang->action->label->confirmed = "確認了{$lang->storyCommon}";
|
||||
$lang->action->label->confirmed = "確認了{$lang->productSRCommon}";
|
||||
$lang->action->label->bugconfirmed = '確認了';
|
||||
$lang->action->label->tostory = "轉{$lang->storyCommon}";
|
||||
$lang->action->label->frombug = "轉{$lang->storyCommon}";
|
||||
$lang->action->label->tostory = "轉{$lang->productSRCommon}";
|
||||
$lang->action->label->frombug = "轉{$lang->productSRCommon}";
|
||||
$lang->action->label->fromlib = '從用例庫導入';
|
||||
$lang->action->label->totask = '轉任務';
|
||||
$lang->action->label->svncommited = '提交代碼';
|
||||
@@ -192,10 +192,10 @@ $lang->action->label->linkrelatedbug = "關聯了相關Bug";
|
||||
$lang->action->label->unlinkrelatedbug = "移除了相關Bug";
|
||||
$lang->action->label->linkrelatedcase = "關聯了相關用例";
|
||||
$lang->action->label->unlinkrelatedcase = "移除了相關用例";
|
||||
$lang->action->label->linkrelatedstory = "關聯了相關{$lang->storyCommon}";
|
||||
$lang->action->label->unlinkrelatedstory = "移除了相關{$lang->storyCommon}";
|
||||
$lang->action->label->subdividestory = "細分了{$lang->storyCommon}";
|
||||
$lang->action->label->unlinkchildstory = "移除了細分{$lang->storyCommon}";
|
||||
$lang->action->label->linkrelatedstory = "關聯了相關{$lang->productSRCommon}";
|
||||
$lang->action->label->unlinkrelatedstory = "移除了相關{$lang->productSRCommon}";
|
||||
$lang->action->label->subdividestory = "細分了{$lang->productSRCommon}";
|
||||
$lang->action->label->unlinkchildstory = "移除了細分{$lang->productSRCommon}";
|
||||
$lang->action->label->started = '開始了';
|
||||
$lang->action->label->restarted = '繼續了';
|
||||
$lang->action->label->recordestimate = '記錄了工時';
|
||||
@@ -253,22 +253,22 @@ $lang->action->dynamicAction->release['edited'] = '編輯發佈';
|
||||
$lang->action->dynamicAction->release['changestatus'] = '修改發佈狀態';
|
||||
$lang->action->dynamicAction->release['undeleted'] = '還原發佈';
|
||||
$lang->action->dynamicAction->release['hidden'] = '隱藏發佈';
|
||||
$lang->action->dynamicAction->story['opened'] = "創建{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['edited'] = "編輯{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['activated'] = "激活{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['reviewed'] = "評審{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['closed'] = "關閉{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['changed'] = "變更{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->storyCommon}關聯計劃";
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = "計劃移除{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['linked2release'] = "{$lang->storyCommon}關聯發佈";
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "發佈移除{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['linked2build'] = "{$lang->storyCommon}關聯版本";
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['opened'] = "創建{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['edited'] = "編輯{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['activated'] = "激活{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['reviewed'] = "評審{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['closed'] = "關閉{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['changed'] = "變更{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->productSRCommon}關聯計劃";
|
||||
$lang->action->dynamicAction->story['unlinkedfromplan'] = "計劃移除{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2release'] = "{$lang->productSRCommon}關聯發佈";
|
||||
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "發佈移除{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['linked2build'] = "{$lang->productSRCommon}關聯版本";
|
||||
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除項目';
|
||||
$lang->action->dynamicAction->story['undeleted'] = "還原{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['hidden'] = "隱藏{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->story['undeleted'] = "還原{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->story['hidden'] = "隱藏{$lang->productSRCommon}";
|
||||
|
||||
$lang->action->dynamicAction->project['opened'] = '創建' . $lang->projectCommon;
|
||||
$lang->action->dynamicAction->project['edited'] = '編輯' . $lang->projectCommon;
|
||||
@@ -286,7 +286,7 @@ $lang->action->dynamicAction->task['opened'] = '創建任務';
|
||||
$lang->action->dynamicAction->task['edited'] = '編輯任務';
|
||||
$lang->action->dynamicAction->task['commented'] = '備註任務';
|
||||
$lang->action->dynamicAction->task['assigned'] = '指派任務';
|
||||
$lang->action->dynamicAction->task['confirmed'] = "確認{$lang->storyCommon}變更";
|
||||
$lang->action->dynamicAction->task['confirmed'] = "確認{$lang->productSRCommon}變更";
|
||||
$lang->action->dynamicAction->task['started'] = '開始任務';
|
||||
$lang->action->dynamicAction->task['finished'] = '完成任務';
|
||||
$lang->action->dynamicAction->task['recordestimate'] = '記錄工時';
|
||||
@@ -323,8 +323,8 @@ $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->storyCommon}變更";
|
||||
$lang->action->dynamicAction->bug['tostory'] = "轉{$lang->storyCommon}";
|
||||
$lang->action->dynamicAction->bug['confirmed'] = "確認{$lang->productSRCommon}變更";
|
||||
$lang->action->dynamicAction->bug['tostory'] = "轉{$lang->productSRCommon}";
|
||||
$lang->action->dynamicAction->bug['totask'] = '轉任務';
|
||||
$lang->action->dynamicAction->bug['linked2plan'] = 'Bug關聯計劃';
|
||||
$lang->action->dynamicAction->bug['unlinkedfromplan'] = '計劃移除Bug';
|
||||
@@ -344,7 +344,7 @@ $lang->action->dynamicAction->case['deleted'] = '刪除用例';
|
||||
$lang->action->dynamicAction->case['undeleted'] = '還原用例';
|
||||
$lang->action->dynamicAction->case['hidden'] = '隱藏用例';
|
||||
$lang->action->dynamicAction->case['reviewed'] = '評審用例';
|
||||
$lang->action->dynamicAction->case['confirmed'] = "確認{$lang->storyCommon}變更";
|
||||
$lang->action->dynamicAction->case['confirmed'] = "確認{$lang->productSRCommon}變更";
|
||||
$lang->action->dynamicAction->case['fromlib'] = '從用例庫導入';
|
||||
$lang->action->dynamicAction->testreport['opened'] = '創建測試報告';
|
||||
$lang->action->dynamicAction->testreport['edited'] = '編輯測試報告';
|
||||
@@ -386,7 +386,7 @@ $lang->action->dynamicAction->entry['edited'] = '編輯應用';
|
||||
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
|
||||
$lang->action->label->productplan = '計劃|productplan|view|productID=%s';
|
||||
$lang->action->label->release = '發佈|release|view|productID=%s';
|
||||
$lang->action->label->story = "{$lang->storyCommon}|story|view|storyID=%s";
|
||||
$lang->action->label->story = "{$lang->productSRCommon}|story|view|storyID=%s";
|
||||
$lang->action->label->project = "{$lang->projectCommon}|project|view|projectID=%s";
|
||||
$lang->action->label->task = '任務|task|view|taskID=%s';
|
||||
$lang->action->label->build = '版本|build|view|buildID=%s';
|
||||
@@ -413,7 +413,7 @@ $lang->action->search->objectTypeList['bug'] = 'Bug';
|
||||
$lang->action->search->objectTypeList['case'] = '用例';
|
||||
$lang->action->search->objectTypeList['caseresult'] = '用例結果';
|
||||
$lang->action->search->objectTypeList['stepresult'] = '用例步驟';
|
||||
$lang->action->search->objectTypeList['story'] = $lang->storyCommon;
|
||||
$lang->action->search->objectTypeList['story'] = $lang->productSRCommon;
|
||||
$lang->action->search->objectTypeList['task'] = '任務';
|
||||
$lang->action->search->objectTypeList['testtask'] = '測試單';
|
||||
$lang->action->search->objectTypeList['user'] = '用戶';
|
||||
|
||||
@@ -847,7 +847,7 @@ class block extends control
|
||||
if($project->model == 'scrum')
|
||||
{
|
||||
$project->progress = $project->allStories == 0 ? 0 : round($project->doneStories / $project->allStories, 3) * 100;
|
||||
$project->executions = $this->project->getExecutionStats($projectID, 'all', 0, 0, 1, 'id_desc', null);
|
||||
$project->executions = $this->project->getExecutionStats($projectID, 'all', 0, 0, 30, 'path_asc,id_asc');
|
||||
}
|
||||
elseif($project->model == 'waterfall')
|
||||
{
|
||||
@@ -1298,7 +1298,7 @@ class block extends control
|
||||
$count = isset($this->params->count) ? (int)$this->params->count : 15;
|
||||
$type = isset($this->params->type) ? $this->params->type : 'all';
|
||||
$pager = pager::init(0, $count, 1);
|
||||
$this->view->executionStats = $this->loadModel('project')->getExecutionStats($this->session->PRJ, $type, $productID = 0, $branch = 0, $itemCounts = 30, $orderBy = 'order_desc', $this->viewType != 'json' ? $pager : '');
|
||||
$this->view->executionStats = $this->loadModel('project')->getExecutionStats($this->session->PRJ, $type, 0, 0, 30, 'path_asc,id_asc', $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1644,10 +1644,12 @@ class block extends control
|
||||
*/
|
||||
public function printAssignToMeBlock($longBlock = true)
|
||||
{
|
||||
if(common::hasPriv('todo', 'view')) $hasViewPriv['todo'] = true;
|
||||
if(common::hasPriv('task', 'view')) $hasViewPriv['task'] = true;
|
||||
if(common::hasPriv('bug', 'view')) $hasViewPriv['bug'] = true;
|
||||
if(common::hasPriv('risk', 'view')) $hasViewPriv['risk'] = true;
|
||||
if(common::hasPriv('todo', 'view')) $hasViewPriv['todo'] = true;
|
||||
if(common::hasPriv('task', 'view')) $hasViewPriv['task'] = true;
|
||||
if(common::hasPriv('bug', 'view')) $hasViewPriv['bug'] = true;
|
||||
if(common::hasPriv('risk', 'view')) $hasViewPriv['risk'] = true;
|
||||
if(common::hasPriv('issue', 'view')) $hasViewPriv['issue'] = true;
|
||||
if(common::hasPriv('story', 'view')) $hasViewPriv['story'] = true;
|
||||
|
||||
$params = $this->get->param;
|
||||
$params = json_decode(base64_decode($params));
|
||||
@@ -1720,6 +1722,34 @@ class block extends control
|
||||
$count['risk'] = count($risks);
|
||||
$this->view->risks = $risks;
|
||||
}
|
||||
if(isset($hasViewPriv['issue']))
|
||||
{
|
||||
$this->app->loadLang('issue');
|
||||
$stmt = $this->dao->select('*')->from(TABLE_ISSUE)
|
||||
->where('assignedTo')->eq($this->app->user->account)
|
||||
->andWhere('deleted')->eq('0')
|
||||
->andWhere('status')->ne('closed')
|
||||
->orderBy('id_desc');
|
||||
if(isset($params->issueNum)) $stmt->limit($params->issueNum);
|
||||
$issues = $stmt->fetchAll();
|
||||
|
||||
$count['issue'] = count($issues);
|
||||
$this->view->issues = $issues;
|
||||
}
|
||||
if(isset($hasViewPriv['story']))
|
||||
{
|
||||
$this->app->loadLang('story');
|
||||
$stmt = $this->dao->select('*')->from(TABLE_STORY)
|
||||
->where('assignedTo')->eq($this->app->user->account)
|
||||
->andWhere('deleted')->eq('0')
|
||||
->andWhere('status')->ne('closed')
|
||||
->orderBy('id_desc');
|
||||
if(isset($params->storyNum)) $stmt->limit($params->storyNum);
|
||||
$stories = $stmt->fetchAll();
|
||||
|
||||
$count['story'] = count($stories);
|
||||
$this->view->stories = $stories;
|
||||
}
|
||||
|
||||
$this->view->selfCall = $this->selfCall;
|
||||
$this->view->hasViewPriv = $hasViewPriv;
|
||||
|
||||
@@ -237,7 +237,7 @@ $(function()
|
||||
$('#dashboard').sortable(
|
||||
{
|
||||
selector: '.panel',
|
||||
trigger: '.panel-heading,.panel-move-handler',
|
||||
trigger: '.panel-heading:not(.not-move-handler),.panel-move-handler',
|
||||
containerSelector: '.col-main,.col-side',
|
||||
start: function()
|
||||
{
|
||||
|
||||
@@ -80,7 +80,7 @@ $lang->block->hidden = 'Verstecken';
|
||||
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s'>%s</a></span>";
|
||||
|
||||
$lang->block->productName = $lang->productCommon . ' Name';
|
||||
$lang->block->totalStory = 'The Total ' . $lang->storyCommon;
|
||||
$lang->block->totalStory = 'The Total ' . $lang->productSRCommon;
|
||||
$lang->block->totalBug = 'The Total Bug';
|
||||
$lang->block->totalRelease = 'Release The Number';
|
||||
|
||||
@@ -313,6 +313,7 @@ $lang->block->availableBlocks->release = 'Release';
|
||||
$lang->block->availableBlocks->build = 'Build';
|
||||
$lang->block->availableBlocks->testtask = 'Testaufgaben';
|
||||
$lang->block->availableBlocks->risk = 'My Risks';
|
||||
$lang->block->availableBlocks->issue = 'My Issues';
|
||||
|
||||
$lang->block->moduleList['project'] = 'Project';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -424,10 +425,12 @@ $lang->block->orderByList->story['status_desc'] = 'Status Absteigend';
|
||||
$lang->block->orderByList->story['stage_asc'] = 'Phase Aufsteigend';
|
||||
$lang->block->orderByList->story['stage_desc'] = 'Phase Absteigend';
|
||||
|
||||
$lang->block->todoNum = 'Todos';
|
||||
$lang->block->taskNum = 'Aufgaben';
|
||||
$lang->block->bugNum = 'Bugs';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->todoNum = 'Todos';
|
||||
$lang->block->taskNum = 'Aufgaben';
|
||||
$lang->block->bugNum = 'Bugs';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->issueNum = 'Issues';
|
||||
$lang->block->storyNum = 'Stories';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ $lang->block->hidden = 'Hide';
|
||||
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
|
||||
|
||||
$lang->block->productName = $lang->productCommon . ' Name';
|
||||
$lang->block->totalStory = 'The Total ' . $lang->storyCommon;
|
||||
$lang->block->totalStory = 'The Total ' . $lang->productSRCommon;
|
||||
$lang->block->totalBug = 'The Total Bug';
|
||||
$lang->block->totalRelease = 'Release The Number';
|
||||
|
||||
@@ -313,6 +313,7 @@ $lang->block->availableBlocks->release = 'Releases';
|
||||
$lang->block->availableBlocks->build = 'Builds';
|
||||
$lang->block->availableBlocks->testtask = 'Requests';
|
||||
$lang->block->availableBlocks->risk = 'My Risks';
|
||||
$lang->block->availableBlocks->issue = 'My Issues';
|
||||
|
||||
$lang->block->moduleList['project'] = 'Project';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -424,10 +425,12 @@ $lang->block->orderByList->story['status_desc'] = 'Story Status DESC';
|
||||
$lang->block->orderByList->story['stage_asc'] = 'Story Phase ASC';
|
||||
$lang->block->orderByList->story['stage_desc'] = 'Story Phase DESC';
|
||||
|
||||
$lang->block->todoNum = 'Todo';
|
||||
$lang->block->taskNum = 'Task';
|
||||
$lang->block->bugNum = 'Bug';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->todoNum = 'Todo';
|
||||
$lang->block->taskNum = 'Task';
|
||||
$lang->block->bugNum = 'Bug';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->issueNum = 'Issues';
|
||||
$lang->block->storyNum = 'Stories';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ $lang->block->hidden = 'Masquer';
|
||||
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
|
||||
|
||||
$lang->block->productName = $lang->productCommon . ' Name';
|
||||
$lang->block->totalStory = 'The Total ' . $lang->storyCommon;
|
||||
$lang->block->totalStory = 'The Total ' . $lang->productSRCommon;
|
||||
$lang->block->totalBug = 'The Total Bug';
|
||||
$lang->block->totalRelease = 'Release The Number';
|
||||
|
||||
@@ -313,6 +313,7 @@ $lang->block->availableBlocks->release = 'Releases';
|
||||
$lang->block->availableBlocks->build = 'Builds';
|
||||
$lang->block->availableBlocks->testtask = 'Recettes';
|
||||
$lang->block->availableBlocks->risk = 'My Risks';
|
||||
$lang->block->availableBlocks->issue = 'My Issues';
|
||||
|
||||
$lang->block->moduleList['project'] = $lang->projectCommon;
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -424,10 +425,12 @@ $lang->block->orderByList->story['status_desc'] = 'Tri par Statut Story DESC';
|
||||
$lang->block->orderByList->story['stage_asc'] = 'Tri par Phase Story ASC';
|
||||
$lang->block->orderByList->story['stage_desc'] = 'Tri par Phase Story DESC';
|
||||
|
||||
$lang->block->todoNum = 'Todo';
|
||||
$lang->block->taskNum = 'Task';
|
||||
$lang->block->bugNum = 'Bug';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->todoNum = 'Todo';
|
||||
$lang->block->taskNum = 'Task';
|
||||
$lang->block->bugNum = 'Bug';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->issueNum = 'Issues';
|
||||
$lang->block->storyNum = 'Stories';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ $lang->block->hidden = 'Ẩn';
|
||||
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
|
||||
|
||||
$lang->block->productName = $lang->productCommon . ' Name';
|
||||
$lang->block->totalStory = 'The Total ' . $lang->storyCommon;
|
||||
$lang->block->totalStory = 'The Total ' . $lang->productSRCommon;
|
||||
$lang->block->totalBug = 'The Total Bug';
|
||||
$lang->block->totalRelease = 'Release The Number';
|
||||
|
||||
@@ -313,6 +313,7 @@ $lang->block->availableBlocks->release = 'Phát hành';
|
||||
$lang->block->availableBlocks->build = 'Bản dựng';
|
||||
$lang->block->availableBlocks->testtask = 'Yêu cầu';
|
||||
$lang->block->availableBlocks->risk = 'My Risks';
|
||||
$lang->block->availableBlocks->issue = 'My Issues';
|
||||
|
||||
$lang->block->moduleList['project'] = $lang->projectCommon;
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -424,10 +425,12 @@ $lang->block->orderByList->story['status_desc'] = 'Tình trạng câu chuyện g
|
||||
$lang->block->orderByList->story['stage_asc'] = 'Giai đoạn câu chuyện tăng dần';
|
||||
$lang->block->orderByList->story['stage_desc'] = 'Giai đoạn câu chuyện giảm dần';
|
||||
|
||||
$lang->block->todoNum = 'Việc làm';
|
||||
$lang->block->taskNum = 'Nhiệm vụ';
|
||||
$lang->block->bugNum = 'Bug';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->todoNum = 'Việc làm';
|
||||
$lang->block->taskNum = 'Nhiệm vụ';
|
||||
$lang->block->bugNum = 'Bug';
|
||||
$lang->block->riskNum = 'Risk';
|
||||
$lang->block->issueNum = 'Issues';
|
||||
$lang->block->storyNum = 'Stories';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
|
||||
+14
-11
@@ -40,7 +40,7 @@ $lang->block->contribute = '我的贡献';
|
||||
|
||||
$lang->block->leftToday = '今天剩余工作总计';
|
||||
$lang->block->myTask = '我的任务';
|
||||
$lang->block->myStory = "我的{$lang->storyCommon}";
|
||||
$lang->block->myStory = "我的{$lang->productSRCommon}";
|
||||
$lang->block->myBug = '我的BUG';
|
||||
$lang->block->myProject = '未关闭的' . $lang->projectCommon;
|
||||
$lang->block->myProduct = '未关闭的' . $lang->productCommon;
|
||||
@@ -81,7 +81,7 @@ $lang->block->hidden = '隐藏';
|
||||
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
|
||||
|
||||
$lang->block->productName = $lang->productCommon . '名称';
|
||||
$lang->block->totalStory = '总' . $lang->storyCommon;
|
||||
$lang->block->totalStory = '总' . $lang->productSRCommon;
|
||||
$lang->block->totalBug = '总Bug';
|
||||
$lang->block->totalRelease = '发布次数';
|
||||
|
||||
@@ -175,7 +175,7 @@ $lang->block->default['product']['3']['grid'] = 8;
|
||||
$lang->block->default['product']['3']['params']['count'] = 15;
|
||||
$lang->block->default['product']['3']['params']['type'] = 'noclosed';
|
||||
|
||||
$lang->block->default['product']['4']['title'] = "指派给我的{$lang->storyCommon}";
|
||||
$lang->block->default['product']['4']['title'] = "指派给我的{$lang->productSRCommon}";
|
||||
$lang->block->default['product']['4']['block'] = 'story';
|
||||
$lang->block->default['product']['4']['grid'] = 4;
|
||||
|
||||
@@ -306,7 +306,7 @@ $lang->block->availableBlocks->todo = '我的待办';
|
||||
$lang->block->availableBlocks->task = '我的任务';
|
||||
$lang->block->availableBlocks->bug = '我的Bug';
|
||||
$lang->block->availableBlocks->case = '我的用例';
|
||||
$lang->block->availableBlocks->story = "我的{$lang->storyCommon}";
|
||||
$lang->block->availableBlocks->story = "我的{$lang->productSRCommon}";
|
||||
$lang->block->availableBlocks->product = $lang->productCommon . '列表';
|
||||
$lang->block->availableBlocks->project = $lang->projectCommon . '列表';
|
||||
$lang->block->availableBlocks->plan = "{$lang->planCommon}列表";
|
||||
@@ -314,6 +314,7 @@ $lang->block->availableBlocks->release = '发布列表';
|
||||
$lang->block->availableBlocks->build = '版本列表';
|
||||
$lang->block->availableBlocks->testtask = '测试版本列表';
|
||||
$lang->block->availableBlocks->risk = '我的风险';
|
||||
$lang->block->availableBlocks->issue = '我的问题';
|
||||
|
||||
$lang->block->moduleList['project'] = '项目';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -351,7 +352,7 @@ $lang->block->modules['product']->availableBlocks = new stdclass();
|
||||
$lang->block->modules['product']->availableBlocks->statistic = $lang->productCommon . '统计';
|
||||
$lang->block->modules['product']->availableBlocks->overview = $lang->productCommon . '总览';
|
||||
$lang->block->modules['product']->availableBlocks->list = $lang->productCommon . '列表';
|
||||
$lang->block->modules['product']->availableBlocks->story = "{$lang->storyCommon}列表";
|
||||
$lang->block->modules['product']->availableBlocks->story = "{$lang->productSRCommon}列表";
|
||||
$lang->block->modules['product']->availableBlocks->plan = "{$lang->planCommon}列表";
|
||||
$lang->block->modules['product']->availableBlocks->release = '发布列表';
|
||||
|
||||
@@ -425,10 +426,12 @@ $lang->block->orderByList->story['status_desc'] = '状态倒序';
|
||||
$lang->block->orderByList->story['stage_asc'] = '阶段正序';
|
||||
$lang->block->orderByList->story['stage_desc'] = '阶段倒序';
|
||||
|
||||
$lang->block->todoNum = '待办数';
|
||||
$lang->block->taskNum = '任务数';
|
||||
$lang->block->bugNum = 'Bug数';
|
||||
$lang->block->riskNum = '风险数';
|
||||
$lang->block->todoNum = '待办数';
|
||||
$lang->block->taskNum = '任务数';
|
||||
$lang->block->bugNum = 'Bug数';
|
||||
$lang->block->riskNum = '风险数';
|
||||
$lang->block->issueNum = '问题数';
|
||||
$lang->block->storyNum = '需求数';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
@@ -521,7 +524,7 @@ $lang->block->gridOptions[4] = '右侧';
|
||||
|
||||
$lang->block->flowchart = array();
|
||||
$lang->block->flowchart['admin'] = array('管理员', '维护公司', '添加用户', '维护权限');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . '经理', '创建' . $lang->productCommon, '维护模块', "维护{$lang->planCommon}", "维护{$lang->storyCommon}", '创建发布');
|
||||
$lang->block->flowchart['project'] = array($lang->projectCommon . '经理', '创建' . $lang->projectCommon, '维护团队', '关联' . $lang->productCommon, "关联{$lang->storyCommon}", '分解任务');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . '经理', '创建' . $lang->productCommon, '维护模块', "维护{$lang->planCommon}", "维护{$lang->productSRCommon}", '创建发布');
|
||||
$lang->block->flowchart['project'] = array($lang->projectCommon . '经理', '创建' . $lang->projectCommon, '维护团队', '关联' . $lang->productCommon, "关联{$lang->productSRCommon}", '分解任务');
|
||||
$lang->block->flowchart['dev'] = array('研发人员', '领取任务和Bug', '更新状态', '完成任务和Bug');
|
||||
$lang->block->flowchart['tester'] = array('测试人员', '撰写用例', '执行用例', '提交Bug', '验证Bug', '关闭Bug');
|
||||
|
||||
+14
-11
@@ -40,7 +40,7 @@ $lang->block->contribute = '我的貢獻';
|
||||
|
||||
$lang->block->leftToday = '今天剩餘工作總計';
|
||||
$lang->block->myTask = '我的任務';
|
||||
$lang->block->myStory = "我的{$lang->storyCommon}";
|
||||
$lang->block->myStory = "我的{$lang->productSRCommon}";
|
||||
$lang->block->myBug = '我的BUG';
|
||||
$lang->block->myProject = '未關閉的' . $lang->projectCommon;
|
||||
$lang->block->myProduct = '未關閉的' . $lang->productCommon;
|
||||
@@ -81,7 +81,7 @@ $lang->block->hidden = '隱藏';
|
||||
$lang->block->dynamicInfo = "<span class='timeline-tag'>%s</span> <span class='timeline-text'>%s <em>%s</em> %s <a href='%s' title='%s'>%s</a></span>";
|
||||
|
||||
$lang->block->productName = $lang->productCommon . '名稱';
|
||||
$lang->block->totalStory = '總' . $lang->storyCommon;
|
||||
$lang->block->totalStory = '總' . $lang->productSRCommon;
|
||||
$lang->block->totalBug = '總Bug';
|
||||
$lang->block->totalRelease = '發佈次數';
|
||||
|
||||
@@ -175,7 +175,7 @@ $lang->block->default['product']['3']['grid'] = 8;
|
||||
$lang->block->default['product']['3']['params']['count'] = 15;
|
||||
$lang->block->default['product']['3']['params']['type'] = 'noclosed';
|
||||
|
||||
$lang->block->default['product']['4']['title'] = "指派給我的{$lang->storyCommon}";
|
||||
$lang->block->default['product']['4']['title'] = "指派給我的{$lang->productSRCommon}";
|
||||
$lang->block->default['product']['4']['block'] = 'story';
|
||||
$lang->block->default['product']['4']['grid'] = 4;
|
||||
|
||||
@@ -306,7 +306,7 @@ $lang->block->availableBlocks->todo = '我的待辦';
|
||||
$lang->block->availableBlocks->task = '我的任務';
|
||||
$lang->block->availableBlocks->bug = '我的Bug';
|
||||
$lang->block->availableBlocks->case = '我的用例';
|
||||
$lang->block->availableBlocks->story = "我的{$lang->storyCommon}";
|
||||
$lang->block->availableBlocks->story = "我的{$lang->productSRCommon}";
|
||||
$lang->block->availableBlocks->product = $lang->productCommon . '列表';
|
||||
$lang->block->availableBlocks->project = $lang->projectCommon . '列表';
|
||||
$lang->block->availableBlocks->plan = "{$lang->planCommon}列表";
|
||||
@@ -314,6 +314,7 @@ $lang->block->availableBlocks->release = '發佈列表';
|
||||
$lang->block->availableBlocks->build = '版本列表';
|
||||
$lang->block->availableBlocks->testtask = '測試版本列表';
|
||||
$lang->block->availableBlocks->risk = '我的風險';
|
||||
$lang->block->availableBlocks->issue = '我的問題';
|
||||
|
||||
$lang->block->moduleList['project'] = '項目';
|
||||
$lang->block->moduleList['product'] = $lang->productCommon;
|
||||
@@ -351,7 +352,7 @@ $lang->block->modules['product']->availableBlocks = new stdclass();
|
||||
$lang->block->modules['product']->availableBlocks->statistic = $lang->productCommon . '統計';
|
||||
$lang->block->modules['product']->availableBlocks->overview = $lang->productCommon . '總覽';
|
||||
$lang->block->modules['product']->availableBlocks->list = $lang->productCommon . '列表';
|
||||
$lang->block->modules['product']->availableBlocks->story = "{$lang->storyCommon}列表";
|
||||
$lang->block->modules['product']->availableBlocks->story = "{$lang->productSRCommon}列表";
|
||||
$lang->block->modules['product']->availableBlocks->plan = "{$lang->planCommon}列表";
|
||||
$lang->block->modules['product']->availableBlocks->release = '發佈列表';
|
||||
|
||||
@@ -425,10 +426,12 @@ $lang->block->orderByList->story['status_desc'] = '狀態倒序';
|
||||
$lang->block->orderByList->story['stage_asc'] = '階段正序';
|
||||
$lang->block->orderByList->story['stage_desc'] = '階段倒序';
|
||||
|
||||
$lang->block->todoNum = '待辦數';
|
||||
$lang->block->taskNum = '任務數';
|
||||
$lang->block->bugNum = 'Bug數';
|
||||
$lang->block->riskNum = '風險數';
|
||||
$lang->block->todoNum = '待辦數';
|
||||
$lang->block->taskNum = '任務數';
|
||||
$lang->block->bugNum = 'Bug數';
|
||||
$lang->block->riskNum = '風險數';
|
||||
$lang->block->issueNum = '問題數';
|
||||
$lang->block->storyNum = '需求數';
|
||||
|
||||
$lang->block->typeList = new stdclass();
|
||||
|
||||
@@ -521,7 +524,7 @@ $lang->block->gridOptions[4] = '右側';
|
||||
|
||||
$lang->block->flowchart = array();
|
||||
$lang->block->flowchart['admin'] = array('管理員', '維護公司', '添加用戶', '維護權限');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . '經理', '創建' . $lang->productCommon, '維護模組', "維護{$lang->planCommon}", "維護{$lang->storyCommon}", '創建發佈');
|
||||
$lang->block->flowchart['project'] = array($lang->projectCommon . '經理', '創建' . $lang->projectCommon, '維護團隊', '關聯' . $lang->productCommon, "關聯{$lang->storyCommon}", '分解任務');
|
||||
$lang->block->flowchart['product'] = array($lang->productCommon . '經理', '創建' . $lang->productCommon, '維護模組', "維護{$lang->planCommon}", "維護{$lang->productSRCommon}", '創建發佈');
|
||||
$lang->block->flowchart['project'] = array($lang->projectCommon . '經理', '創建' . $lang->projectCommon, '維護團隊', '關聯' . $lang->productCommon, "關聯{$lang->productSRCommon}", '分解任務');
|
||||
$lang->block->flowchart['dev'] = array('研發人員', '領取任務和Bug', '更新狀態', '完成任務和Bug');
|
||||
$lang->block->flowchart['tester'] = array('測試人員', '撰寫用例', '執行用例', '提交Bug', '驗證Bug', '關閉Bug');
|
||||
|
||||
@@ -713,6 +713,12 @@ class blockModel extends model
|
||||
return json_encode($this->appendCountParams($params));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get assign to me params.
|
||||
*
|
||||
* @access public
|
||||
* @return json
|
||||
*/
|
||||
public function getAssignToMeParams()
|
||||
{
|
||||
$params->todoNum['name'] = $this->lang->block->todoNum;
|
||||
@@ -731,6 +737,14 @@ class blockModel extends model
|
||||
$params->riskNum['default'] = 20;
|
||||
$params->riskNum['control'] = 'input';
|
||||
|
||||
$params->issueNum['name'] = $this->lang->block->issueNum;
|
||||
$params->issueNum['default'] = 20;
|
||||
$params->issueNum['control'] = 'input';
|
||||
|
||||
$params->storyNum['name'] = $this->lang->block->storyNum;
|
||||
$params->storyNum['default'] = 20;
|
||||
$params->storyNum['control'] = 'input';
|
||||
|
||||
return json_encode($params);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php if(empty($issues)): ?>
|
||||
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
|
||||
<?php else:?>
|
||||
<style>
|
||||
.block-issues .c-id {width: 50px;}
|
||||
.block-issues .c-pri {width: 50px;text-align: center;}
|
||||
.block-issues .c-createdDate {width: 95px;}
|
||||
.block-issues .c-severity {width: 80px;}
|
||||
.block-issues .c-status {width: 80px;}
|
||||
.block-issues.block-sm .c-status {text-align: center;}
|
||||
</style>
|
||||
<div class='panel-body has-table scrollbar-hover'>
|
||||
<table class='table table-borderless table-fixed table-fixed-head table-hover tablesorter block-issues <?php if(!$longBlock) echo 'block-sm'?>'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id'><?php echo $lang->idAB?></th>
|
||||
<th class='c-name'><?php echo $lang->issue->title?></th>
|
||||
<?php if($longBlock):?>
|
||||
<th class='c-pri'><?php echo $lang->priAB?></th>
|
||||
<th class='c-category'><?php echo $lang->issue->severity;?></th>
|
||||
<th class='c-identifiedDate'><?php echo $lang->issue->createdDate;?></th>
|
||||
<?php endif;?>
|
||||
<th class='c-status'><?php echo $lang->issue->status;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($issues as $issue):?>
|
||||
<?php
|
||||
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
|
||||
?>
|
||||
<tr>
|
||||
<td class='c-id-xs'><?php echo sprintf('%03d', $issue->id);?></td>
|
||||
<td class='c-name' title='<?php echo $issue->title?>'><?php echo html::a($this->createLink('issue', 'view', "issueID=$issue->id", '', '', $issue->PRJ), $issue->title)?></td>
|
||||
<?php if($longBlock):?>
|
||||
<td class='c-pri'><?php echo zget($lang->issue->priList, $issue->pri)?></td>
|
||||
<td class='c-severity'><?php echo zget($lang->issue->severityList, $issue->severity)?></td>
|
||||
<td class='c-createdDate'><?php echo $issue->createdDate == '0000-00-00' ? '' : $issue->createdDate;?></td>
|
||||
<?php endif;?>
|
||||
<?php $status = $this->processStatus('issue', $issue);?>
|
||||
<td class='c-status' title='<?php echo $status;?>'>
|
||||
<span class="status-issue status-<?php echo $issue->status?>"><?php echo $status;?></span>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
@@ -1,17 +1,19 @@
|
||||
<style>
|
||||
#cards {margin: 0 10px;}
|
||||
.cards-menu > li > a {padding-left: 5px; text-align: left;}
|
||||
.cards-menu > li > a > i {opacity: .5; display: inline-block; margin-right: 4px; width: 18px; text-align: center;}
|
||||
.cards-menu > li > a:hover > i {opacity: 1;}
|
||||
|
||||
#cards {margin: 0; padding: 0 10px 10px 10px;}
|
||||
#cards > .col {width: 33.33%;}
|
||||
.col-side #cards > .col {width: 100%;}
|
||||
#cards .panel {margin: 10px 0; border: 1px solid #DCDCDC; border-radius: 2px; box-shadow: none; height: 146px; cursor: pointer;}
|
||||
#cards .panel:hover {border-color: #006AF1; box-shadow: 0 0 10px 0 rgba(0,0,100,.25);}
|
||||
#cards .panel-heading {padding: 12px 24px 10px 16px;}
|
||||
#cards .panel-body {padding: 0 16px 16px;}
|
||||
#cards .panel-actions {padding: 7px 0; z-index: 0}
|
||||
#cards .panel-actions .dropdown-menu > li > a {padding-left: 5px; text-align: left;}
|
||||
#cards .panel-actions .dropdown-menu > li > a > i {opacity: .5; display: inline-block; margin-right: 4px; width: 18px; text-align: center;}
|
||||
#cards .panel-actions .dropdown-menu > li > a:hover > i {opacity: 1;}
|
||||
#cards .project-type-label {padding: 1px 2px;}
|
||||
#cards .project-name {font-size: 16px; font-weight: normal; display: inline-block; max-width: 75%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle;}
|
||||
#cards .project-infos {font-size: 12px;}
|
||||
#cards .project-infos {font-size: 12px; padding: 0 15px;}
|
||||
#cards .project-infos > span {display: inline-block; line-height: 12px;}
|
||||
#cards .project-infos > span > .icon {font-size: 12px; display: inline-block; position: relative; top: -1px}
|
||||
#cards .project-infos > span + span {margin-left: 10px;}
|
||||
@@ -29,14 +31,14 @@
|
||||
#cards .project-stage-item + .project-stage-item:after {content: ' '; display: block; left: -50%; right: 50%; height: 2px; background-color: #D1D1D1; top: 3px; position: absolute; z-index: 0;}
|
||||
#cards .project-stage-item.is-going {color: #333;}
|
||||
#cards .project-stage-item.is-going::before {background-color: #0C64EB;}
|
||||
.block-recentproject .panel-body{padding: 0;}
|
||||
#dashboard .block-recentproject .panel-body {padding: 0;}
|
||||
</style>
|
||||
<div class="panel-body">
|
||||
<div class='row' id='cards'>
|
||||
<?php foreach ($projects as $projectID => $project):?>
|
||||
<div class='col' data-id='<?php echo $projectID?>'>
|
||||
<div class='panel' data-url='<?php echo $this->createLink('project', 'index', "projectID=$project->id");?>'>
|
||||
<div class='panel-heading'>
|
||||
<div class='panel-heading not-move-handler'>
|
||||
<strong class='project-name' title='<?php echo $project->name;?>'> <?php echo html::a($this->createLink('project', 'index', "projectID=$project->id", '', '', $project->id), $project->name);?> </strong>
|
||||
<?php if($project->model === 'waterfall'): ?>
|
||||
<span class='project-type-label label label-warning label-outline'><?php echo $lang->program->waterfall; ?></span>
|
||||
@@ -45,8 +47,8 @@
|
||||
<?php endif; ?>
|
||||
<nav class='panel-actions nav nav-default'>
|
||||
<li class='dropdown'>
|
||||
<a href='javascript:;' data-toggle='dropdown' class='panel-action'><i class='icon icon-ellipsis-v'></i></a>
|
||||
<ul class='dropdown-menu pull-right'>
|
||||
<a href='javascript:;' data-toggle='context-dropdown' class='panel-action'><i class='icon icon-ellipsis-v'></i></a>
|
||||
<ul class='dropdown-menu pull-right cards-menu'>
|
||||
<li><?php common::printIcon('program', 'PRJGroup', "projectID=$project->id", $project, 'button', 'group');?></li>
|
||||
<li><?php common::printIcon('program', 'PRJManageMembers', "projectID=$project->id", $project, 'button', 'persons');?></li>
|
||||
<li><?php common::printicon('program', 'PRJActivate', "projectid=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
?>
|
||||
<tr>
|
||||
<td class='c-id-xs'><?php echo sprintf('%03d', $risk->id);?></td>
|
||||
<td class='c-name' title='<?php echo $risk->name?>'><?php echo html::a($this->createLink('risk', 'view', "riskID=$risk->id", '', '', $risk->program), $risk->name)?></td>
|
||||
<td class='c-name' title='<?php echo $risk->name?>'><?php echo html::a($this->createLink('risk', 'view', "riskID=$risk->id", '', '', $risk->PRJ), $risk->name)?></td>
|
||||
<?php if($longBlock):?>
|
||||
<td class='c-pri'><?php echo zget($lang->risk->priList, $risk->pri)?></td>
|
||||
<td class='c-category'><?php echo zget($lang->risk->categoryList, $risk->category)?></td>
|
||||
|
||||
@@ -451,7 +451,7 @@ class bug extends control
|
||||
$this->view->productName = $this->products[$productID];
|
||||
$this->view->moduleOptionMenu = $moduleOptionMenu;
|
||||
$this->view->stories = $stories;
|
||||
$this->view->projects = $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0, $params = 'nodeleted');
|
||||
$this->view->projects = $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0);
|
||||
$this->view->builds = $builds;
|
||||
$this->view->moduleID = (int)$moduleID;
|
||||
$this->view->projectID = $projectID;
|
||||
@@ -554,7 +554,7 @@ class bug extends control
|
||||
$this->view->stories = $stories;
|
||||
$this->view->builds = $builds;
|
||||
$this->view->users = $this->user->getPairs('devfirst|nodeleted');
|
||||
$this->view->projects = $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0, 'nodeleted');
|
||||
$this->view->projects = $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : 0);
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($productID, $viewType = 'bug', $startModuleID = 0, $branch);
|
||||
$this->view->moduleID = $moduleID;
|
||||
@@ -727,7 +727,7 @@ class bug extends control
|
||||
$this->view->plans = $this->loadModel('productplan')->getPairs($productID, $bug->branch);
|
||||
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($productID, $viewType = 'bug', $startModuleID = 0, $bug->branch);
|
||||
$this->view->currentModuleID = $currentModuleID;
|
||||
$this->view->projects = $this->product->getExecutionPairsByProduct($bug->product, $bug->branch ? "0,{$bug->branch}" : 0, 'nodeleted');
|
||||
$this->view->projects = $this->product->getExecutionPairsByProduct($bug->product, $bug->branch ? "0,{$bug->branch}" : 0);
|
||||
$this->view->stories = $bug->project ? $this->story->getProjectStoryPairs($bug->project) : $this->story->getProductStoryPairs($bug->product, $bug->branch);
|
||||
$this->view->branches = $this->session->currentProductType == 'normal' ? array() : $this->loadModel('branch')->getPairs($bug->product);
|
||||
$this->view->tasks = $this->task->getProjectTaskPairs($bug->project);
|
||||
@@ -1100,7 +1100,7 @@ class bug extends control
|
||||
$this->view->bug = $bug;
|
||||
$this->view->users = $users;
|
||||
$this->view->assignedTo = $assignedTo;
|
||||
$this->view->projects = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'nodeleted');
|
||||
$this->view->projects = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0);
|
||||
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch = $bug->branch, 'all');
|
||||
$this->view->actions = $this->action->getList('bug', $bugID);
|
||||
$this->display();
|
||||
|
||||
@@ -18,8 +18,8 @@ $lang->bug->productplan = '所属' . $lang->planCommon;
|
||||
$lang->bug->module = '所属模块';
|
||||
$lang->bug->moduleAB = '模块';
|
||||
$lang->bug->project = '所属' . $lang->projectCommon;
|
||||
$lang->bug->story = "相关{$lang->storyCommon}";
|
||||
$lang->bug->storyVersion = "{$lang->storyCommon}版本";
|
||||
$lang->bug->story = "相关{$lang->productSRCommon}";
|
||||
$lang->bug->storyVersion = "{$lang->productSRCommon}版本";
|
||||
$lang->bug->color = '标题颜色';
|
||||
$lang->bug->task = '相关任务';
|
||||
$lang->bug->title = 'Bug标题';
|
||||
@@ -39,7 +39,7 @@ $lang->bug->activatedDate = '激活日期';
|
||||
$lang->bug->confirmed = '是否确认';
|
||||
$lang->bug->confirmedAB = '确认';
|
||||
$lang->bug->toTask = '转任务';
|
||||
$lang->bug->toStory = "转{$lang->storyCommon}";
|
||||
$lang->bug->toStory = "转{$lang->productSRCommon}";
|
||||
$lang->bug->mailto = '抄送给';
|
||||
$lang->bug->openedBy = '由谁创建';
|
||||
$lang->bug->openedByAB = '创建者';
|
||||
@@ -110,7 +110,7 @@ $lang->bug->exportAction = '导出Bug';
|
||||
$lang->bug->delete = '删除';
|
||||
$lang->bug->deleteAction = '删除Bug';
|
||||
$lang->bug->deleted = '已删除';
|
||||
$lang->bug->confirmStoryChange = "确认{$lang->storyCommon}变动";
|
||||
$lang->bug->confirmStoryChange = "确认{$lang->productSRCommon}变动";
|
||||
$lang->bug->copy = '复制Bug';
|
||||
$lang->bug->search = '搜索';
|
||||
|
||||
@@ -129,7 +129,7 @@ $lang->bug->postponedBugs = '被延期';
|
||||
$lang->bug->overdueBugs = '过期Bug';
|
||||
$lang->bug->allBugs = '所有';
|
||||
$lang->bug->byQuery = '搜索';
|
||||
$lang->bug->needConfirm = "{$lang->storyCommon}变动";
|
||||
$lang->bug->needConfirm = "{$lang->productSRCommon}变动";
|
||||
$lang->bug->allProduct = '所有' . $lang->productCommon;
|
||||
$lang->bug->my = '我的';
|
||||
$lang->bug->yesterdayResolved = '昨天解决Bug数';
|
||||
@@ -159,7 +159,7 @@ $lang->bug->createBuild = '创建';
|
||||
/* legend列表。*/
|
||||
$lang->bug->legendBasicInfo = '基本信息';
|
||||
$lang->bug->legendAttatch = '附件';
|
||||
$lang->bug->legendPrjStoryTask = $lang->projectCommon . "/{$lang->storyCommon}/任务";
|
||||
$lang->bug->legendPrjStoryTask = $lang->projectCommon . "/{$lang->productSRCommon}/任务";
|
||||
$lang->bug->lblTypeAndSeverity = '类型/严重程度';
|
||||
$lang->bug->lblSystemBrowserAndHardware = '系统/浏览器';
|
||||
$lang->bug->legendSteps = '重现步骤';
|
||||
@@ -173,7 +173,7 @@ $lang->bug->buttonConfirm = '确认';
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->bug->summary = "本页共 <strong>%s</strong> 个Bug,未解决 <strong>%s</strong>。";
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->projectCommon}、{$lang->storyCommon}和任务发生变化,确定吗?";
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->projectCommon}、{$lang->productSRCommon}和任务发生变化,确定吗?";
|
||||
$lang->bug->confirmDelete = '您确认要删除该Bug吗?';
|
||||
$lang->bug->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
|
||||
@@ -270,7 +270,7 @@ $lang->bug->resolutionList['fixed'] = '已解决';
|
||||
$lang->bug->resolutionList['notrepro'] = '无法重现';
|
||||
$lang->bug->resolutionList['postponed'] = '延期处理';
|
||||
$lang->bug->resolutionList['willnotfix'] = "不予解决";
|
||||
$lang->bug->resolutionList['tostory'] = "转为{$lang->storyCommon}";
|
||||
$lang->bug->resolutionList['tostory'] = "转为{$lang->productSRCommon}";
|
||||
|
||||
/* 统计报表。*/
|
||||
$lang->bug->report = new stdclass();
|
||||
@@ -371,7 +371,7 @@ $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->storyCommon . '</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 转为<strong> ' . $lang->productSRCommon . '</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = array('main' => '$date, 由 <strong>$actor</strong> 导入为<strong>任务</strong>,编号为 <strong>$extra</strong>。');
|
||||
$lang->bug->action->linked2plan = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->planCommon . ' <strong>$extra</strong>。');
|
||||
$lang->bug->action->unlinkedfromplan = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->planCommon . ' <strong>$extra</strong> 移除。');
|
||||
|
||||
@@ -18,8 +18,8 @@ $lang->bug->productplan = '所屬計劃';
|
||||
$lang->bug->module = '所屬模組';
|
||||
$lang->bug->moduleAB = '模組';
|
||||
$lang->bug->project = '所屬' . $lang->projectCommon;
|
||||
$lang->bug->story = "相關{$lang->storyCommon}";
|
||||
$lang->bug->storyVersion = "{$lang->storyCommon}版本";
|
||||
$lang->bug->story = "相關{$lang->productSRCommon}";
|
||||
$lang->bug->storyVersion = "{$lang->productSRCommon}版本";
|
||||
$lang->bug->color = '標題顏色';
|
||||
$lang->bug->task = '相關任務';
|
||||
$lang->bug->title = 'Bug標題';
|
||||
@@ -39,7 +39,7 @@ $lang->bug->activatedDate = '激活日期';
|
||||
$lang->bug->confirmed = '是否確認';
|
||||
$lang->bug->confirmedAB = '確認';
|
||||
$lang->bug->toTask = '轉任務';
|
||||
$lang->bug->toStory = "轉{$lang->storyCommon}";
|
||||
$lang->bug->toStory = "轉{$lang->productSRCommon}";
|
||||
$lang->bug->mailto = '抄送給';
|
||||
$lang->bug->openedBy = '由誰創建';
|
||||
$lang->bug->openedByAB = '創建者';
|
||||
@@ -110,7 +110,7 @@ $lang->bug->exportAction = '導出Bug';
|
||||
$lang->bug->delete = '刪除';
|
||||
$lang->bug->deleteAction = '刪除Bug';
|
||||
$lang->bug->deleted = '已刪除';
|
||||
$lang->bug->confirmStoryChange = "確認{$lang->storyCommon}變動";
|
||||
$lang->bug->confirmStoryChange = "確認{$lang->productSRCommon}變動";
|
||||
$lang->bug->copy = '複製Bug';
|
||||
$lang->bug->search = '搜索';
|
||||
|
||||
@@ -129,7 +129,7 @@ $lang->bug->postponedBugs = '被延期';
|
||||
$lang->bug->overdueBugs = '過期Bug';
|
||||
$lang->bug->allBugs = '所有';
|
||||
$lang->bug->byQuery = '搜索';
|
||||
$lang->bug->needConfirm = "{$lang->storyCommon}變動";
|
||||
$lang->bug->needConfirm = "{$lang->productSRCommon}變動";
|
||||
$lang->bug->allProduct = '所有' . $lang->productCommon;
|
||||
$lang->bug->my = '我的';
|
||||
$lang->bug->yesterdayResolved = '昨天解決Bug數';
|
||||
@@ -159,7 +159,7 @@ $lang->bug->createBuild = '創建';
|
||||
/* legend列表。*/
|
||||
$lang->bug->legendBasicInfo = '基本信息';
|
||||
$lang->bug->legendAttatch = '附件';
|
||||
$lang->bug->legendPrjStoryTask = $lang->projectCommon . "/{$lang->storyCommon}/任務";
|
||||
$lang->bug->legendPrjStoryTask = $lang->projectCommon . "/{$lang->productSRCommon}/任務";
|
||||
$lang->bug->lblTypeAndSeverity = '類型/嚴重程度';
|
||||
$lang->bug->lblSystemBrowserAndHardware = '系統/瀏覽器';
|
||||
$lang->bug->legendSteps = '重現步驟';
|
||||
@@ -173,7 +173,7 @@ $lang->bug->buttonConfirm = '確認';
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->bug->summary = "本頁共 <strong>%s</strong> 個Bug,未解決 <strong>%s</strong>。";
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}會導致相應的{$lang->projectCommon}、{$lang->storyCommon}和任務發生變化,確定嗎?";
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}會導致相應的{$lang->projectCommon}、{$lang->productSRCommon}和任務發生變化,確定嗎?";
|
||||
$lang->bug->confirmDelete = '您確認要刪除該Bug嗎?';
|
||||
$lang->bug->remindTask = '該Bug已經轉化為任務,是否更新任務(編號:%s)狀態 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解決狀態,不能關閉。';
|
||||
@@ -270,7 +270,7 @@ $lang->bug->resolutionList['fixed'] = '已解決';
|
||||
$lang->bug->resolutionList['notrepro'] = '無法重現';
|
||||
$lang->bug->resolutionList['postponed'] = '延期處理';
|
||||
$lang->bug->resolutionList['willnotfix'] = "不予解決";
|
||||
$lang->bug->resolutionList['tostory'] = "轉為{$lang->storyCommon}";
|
||||
$lang->bug->resolutionList['tostory'] = "轉為{$lang->productSRCommon}";
|
||||
|
||||
/* 統計報表。*/
|
||||
$lang->bug->report = new stdclass();
|
||||
@@ -371,7 +371,7 @@ $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->storyCommon . '</strong>,編號為 <strong>$extra</strong>。');
|
||||
$lang->bug->action->tostory = array('main' => '$date, 由 <strong>$actor</strong> 轉為<strong> ' . $lang->productSRCommon . '</strong>,編號為 <strong>$extra</strong>。');
|
||||
$lang->bug->action->totask = 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> 移除。');
|
||||
|
||||
@@ -115,7 +115,7 @@ class build extends control
|
||||
$execution->name = '';
|
||||
}
|
||||
|
||||
$executions = $this->loadModel('product')->getExecutionPairsByProduct($build->product, $build->branch, 'nodeleted');
|
||||
$executions = $this->loadModel('product')->getExecutionPairsByProduct($build->product, $build->branch);
|
||||
if(!isset($executions[$build->project])) $executions[$build->project] = $execution->name;
|
||||
|
||||
$productGroups = $this->project->getProducts($build->project);
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
$lang->build->common = "Build";
|
||||
$lang->build->create = "Build erstellen";
|
||||
$lang->build->edit = "Bearbeiten";
|
||||
$lang->build->linkStory = "{$lang->storyCommon} verknüpfen";
|
||||
$lang->build->linkStory = "{$lang->productSRCommon} verknüpfen";
|
||||
$lang->build->linkBug = "Bug verknüpfen";
|
||||
$lang->build->delete = "Build löschen";
|
||||
$lang->build->deleted = "Gelöscht";
|
||||
$lang->build->view = "Build Details";
|
||||
$lang->build->batchUnlink = 'Batch Unlink';
|
||||
$lang->build->batchUnlinkStory = "Batch {$lang->storyCommon} Unlink";
|
||||
$lang->build->batchUnlinkStory = "Batch {$lang->productSRCommon} Unlink";
|
||||
$lang->build->batchUnlinkBug = 'Batch Bug Unlink';
|
||||
|
||||
$lang->build->confirmDelete = "Möchten Sie dieses Build löschen?";
|
||||
$lang->build->confirmUnlinkStory = "Möchten Sie diese {$lang->storyCommon} löschen?";
|
||||
$lang->build->confirmUnlinkStory = "Möchten Sie diese {$lang->productSRCommon} löschen?";
|
||||
$lang->build->confirmUnlinkBug = "Möchten Sie die Verknüpfung zum Bug aufheben?";
|
||||
|
||||
$lang->build->basicInfo = 'Basis Info';
|
||||
@@ -40,18 +40,18 @@ $lang->build->desc = 'Beschreibung';
|
||||
$lang->build->files = 'Datei Upload';
|
||||
$lang->build->last = 'Letztes Build';
|
||||
$lang->build->packageType = 'Package Typ';
|
||||
$lang->build->unlinkStory = "{$lang->storyCommon} Verknüpgung aufheben";
|
||||
$lang->build->unlinkStory = "{$lang->productSRCommon} Verknüpgung aufheben";
|
||||
$lang->build->unlinkBug = 'Bug Verknüpgung aufheben';
|
||||
$lang->build->stories = "Abgeschlossene {$lang->storyCommon}";
|
||||
$lang->build->stories = "Abgeschlossene {$lang->productSRCommon}";
|
||||
$lang->build->bugs = 'Gelöster Bug';
|
||||
$lang->build->generatedBugs = 'Left Bug';
|
||||
$lang->build->noProduct = " <span style='color:red'>Dieses {$lang->projectCommon} ist nicht mit einem {$lang->productCommon} verknüpft, daher kann das Build nicht erstellt werden. Bitte erst <a href='%s'> {$lang->productCommon} verknüpfen.</a></span>";
|
||||
$lang->build->noBuild = 'Keine Builds. ';
|
||||
|
||||
$lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "The {$lang->storyCommon} or Bug has been associated, and its product cannot be modified";
|
||||
$lang->build->notice->changeProduct = "The {$lang->productSRCommon} or Bug has been associated, and its product cannot be modified";
|
||||
|
||||
$lang->build->finishStories = " %s {$lang->storyCommon} sind abgeschlossen.";
|
||||
$lang->build->finishStories = " %s {$lang->productSRCommon} sind abgeschlossen.";
|
||||
$lang->build->resolvedBugs = ' %s Bugs sind gelöst.';
|
||||
$lang->build->createdBugs = ' %s Bugs wurden erstellt.';
|
||||
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
$lang->build->common = "Build";
|
||||
$lang->build->create = "Create Build";
|
||||
$lang->build->edit = "Edit Build";
|
||||
$lang->build->linkStory = "Link {$lang->storyCommon}";
|
||||
$lang->build->linkStory = "Link {$lang->productSRCommon}";
|
||||
$lang->build->linkBug = "Link Bug";
|
||||
$lang->build->delete = "Delete Build";
|
||||
$lang->build->deleted = "Deleted";
|
||||
$lang->build->view = "Build Detail";
|
||||
$lang->build->batchUnlink = 'Batch Unlink';
|
||||
$lang->build->batchUnlinkStory = "Batch Unlink {$lang->storyCommon}";
|
||||
$lang->build->batchUnlinkStory = "Batch Unlink {$lang->productSRCommon}";
|
||||
$lang->build->batchUnlinkBug = 'Batch Unlink Bugs';
|
||||
|
||||
$lang->build->confirmDelete = "Do you want to delete this build?";
|
||||
$lang->build->confirmUnlinkStory = "Do you want to unlink this {$lang->storyCommon}?";
|
||||
$lang->build->confirmUnlinkStory = "Do you want to unlink this {$lang->productSRCommon}?";
|
||||
$lang->build->confirmUnlinkBug = "Do you want to unlink this Bug?";
|
||||
|
||||
$lang->build->basicInfo = 'Basic Info';
|
||||
@@ -40,18 +40,18 @@ $lang->build->desc = 'Description';
|
||||
$lang->build->files = 'Files';
|
||||
$lang->build->last = 'Last Build';
|
||||
$lang->build->packageType = 'Package Type';
|
||||
$lang->build->unlinkStory = "Unlink {$lang->storyCommon}";
|
||||
$lang->build->unlinkStory = "Unlink {$lang->productSRCommon}";
|
||||
$lang->build->unlinkBug = 'Unlink Bug';
|
||||
$lang->build->stories = "Finished {$lang->storyCommon}";
|
||||
$lang->build->stories = "Finished {$lang->productSRCommon}";
|
||||
$lang->build->bugs = 'Resolved Bugs';
|
||||
$lang->build->generatedBugs = 'Reported Bugs';
|
||||
$lang->build->noProduct = " <span style='color:red'>This {$lang->projectCommon} is not linked to {$lang->productCommon}, so the Build cannot be created. Please first <a href='%s'> link {$lang->productCommon}</a></span>";
|
||||
$lang->build->noBuild = 'No builds yet.';
|
||||
|
||||
$lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "The {$lang->storyCommon} or Bug has been associated, and its product cannot be modified";
|
||||
$lang->build->notice->changeProduct = "The {$lang->productSRCommon} or Bug has been associated, and its product cannot be modified";
|
||||
|
||||
$lang->build->finishStories = " Finished {$lang->storyCommon} %s";
|
||||
$lang->build->finishStories = " Finished {$lang->productSRCommon} %s";
|
||||
$lang->build->resolvedBugs = ' Resolved Bug %s';
|
||||
$lang->build->createdBugs = ' Reported Bug %s';
|
||||
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
$lang->build->common = "Build";
|
||||
$lang->build->create = "Créer Build";
|
||||
$lang->build->edit = "Editer Build";
|
||||
$lang->build->linkStory = "Intégrer {$lang->storyCommon}";
|
||||
$lang->build->linkStory = "Intégrer {$lang->productSRCommon}";
|
||||
$lang->build->linkBug = "Intégrer Bug";
|
||||
$lang->build->delete = "Supprimer Build";
|
||||
$lang->build->deleted = "Supprimé";
|
||||
$lang->build->view = "Détail Build";
|
||||
$lang->build->batchUnlink = 'Retirer par Lot';
|
||||
$lang->build->batchUnlinkStory = "Retirer {$lang->storyCommon} par Lot";
|
||||
$lang->build->batchUnlinkStory = "Retirer {$lang->productSRCommon} par Lot";
|
||||
$lang->build->batchUnlinkBug = 'Retirer Bugs par Lot';
|
||||
|
||||
$lang->build->confirmDelete = "Voulez-vous supprimer ce build ?";
|
||||
$lang->build->confirmUnlinkStory = "Voulez-vous retirer cette {$lang->storyCommon} du Build ?";
|
||||
$lang->build->confirmUnlinkStory = "Voulez-vous retirer cette {$lang->productSRCommon} du Build ?";
|
||||
$lang->build->confirmUnlinkBug = "Voulez-vous retirer ce Bug du Build ?";
|
||||
|
||||
$lang->build->basicInfo = 'Infos de Base';
|
||||
@@ -40,7 +40,7 @@ $lang->build->desc = 'Description';
|
||||
$lang->build->files = 'Fichiers';
|
||||
$lang->build->last = 'Dernier Build';
|
||||
$lang->build->packageType = 'Type de Package';
|
||||
$lang->build->unlinkStory = "Retirer {$lang->storyCommon}";
|
||||
$lang->build->unlinkStory = "Retirer {$lang->productSRCommon}";
|
||||
$lang->build->unlinkBug = 'Retirer Bug';
|
||||
$lang->build->stories = 'Stories terminées';
|
||||
$lang->build->bugs = 'Bugs Résolus';
|
||||
@@ -49,9 +49,9 @@ $lang->build->noProduct = " <span style='color:red'>Ce {$lang->projectCommon
|
||||
$lang->build->noBuild = 'Aucun builds.';
|
||||
|
||||
$lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "La {$lang->storyCommon} ou le Bug a été associé et son product ne peut pas être modifié";
|
||||
$lang->build->notice->changeProduct = "La {$lang->productSRCommon} ou le Bug a été associé et son product ne peut pas être modifié";
|
||||
|
||||
$lang->build->finishStories = " {$lang->storyCommon} Terminées %s";
|
||||
$lang->build->finishStories = " {$lang->productSRCommon} Terminées %s";
|
||||
$lang->build->resolvedBugs = ' Bugs Résolus %s';
|
||||
$lang->build->createdBugs = ' Bugs Signalés %s';
|
||||
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
$lang->build->common = "Bản dựng";
|
||||
$lang->build->create = "Tạo bản dựng";
|
||||
$lang->build->edit = "Sửa bản dựng";
|
||||
$lang->build->linkStory = "Liên kết {$lang->storyCommon}";
|
||||
$lang->build->linkStory = "Liên kết {$lang->productSRCommon}";
|
||||
$lang->build->linkBug = "Liên kết Bug";
|
||||
$lang->build->delete = "Xóa bản dựng";
|
||||
$lang->build->deleted = "Đã xóa";
|
||||
$lang->build->view = "Chi tiết bản dựng";
|
||||
$lang->build->batchUnlink = 'Hủy liên kết hàng loạt';
|
||||
$lang->build->batchUnlinkStory = "Hủy liên kết {$lang->storyCommon} hàng loạt";
|
||||
$lang->build->batchUnlinkStory = "Hủy liên kết {$lang->productSRCommon} hàng loạt";
|
||||
$lang->build->batchUnlinkBug = 'Hủy liên kết Bug hàng loạt';
|
||||
|
||||
$lang->build->confirmDelete = "Bạn có muốn xóa bản dựng này?";
|
||||
$lang->build->confirmUnlinkStory = "Bạn có muốn hủy liên kết {$lang->storyCommon} này?";
|
||||
$lang->build->confirmUnlinkStory = "Bạn có muốn hủy liên kết {$lang->productSRCommon} này?";
|
||||
$lang->build->confirmUnlinkBug = "Bạn có muốn hủy liên kết this Bug?";
|
||||
|
||||
$lang->build->basicInfo = 'Thông tin cơ bản';
|
||||
@@ -40,18 +40,18 @@ $lang->build->desc = 'Mô tả';
|
||||
$lang->build->files = 'Files';
|
||||
$lang->build->last = 'Bản dựng cuối';
|
||||
$lang->build->packageType = 'Loại gói';
|
||||
$lang->build->unlinkStory = "Hủy liên kết {$lang->storyCommon}";
|
||||
$lang->build->unlinkStory = "Hủy liên kết {$lang->productSRCommon}";
|
||||
$lang->build->unlinkBug = 'Hủy liên kết Bug';
|
||||
$lang->build->stories = "{$lang->storyCommon} đã kết thúc";
|
||||
$lang->build->stories = "{$lang->productSRCommon} đã kết thúc";
|
||||
$lang->build->bugs = 'Bugs đã giải quyết';
|
||||
$lang->build->generatedBugs = 'Bugs đã báo cáo';
|
||||
$lang->build->noProduct = " <span style='color:red'>{$lang->projectCommon} này chưa liên kết tới {$lang->productCommon}, bởi vậy Bản dựng này không thể tạo. Vui lòng liên kết <a href='%s'> {$lang->productCommon} trước</a></span>";
|
||||
$lang->build->noBuild = 'Không có bản dựng nào';
|
||||
|
||||
$lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "{$lang->storyCommon} này hoặc Bug đã được kết hợp, và sản phẩm của nó không thể bị sửa đổi";
|
||||
$lang->build->notice->changeProduct = "{$lang->productSRCommon} này hoặc Bug đã được kết hợp, và sản phẩm của nó không thể bị sửa đổi";
|
||||
|
||||
$lang->build->finishStories = " {$lang->storyCommon} đã kết thúc %s";
|
||||
$lang->build->finishStories = " {$lang->productSRCommon} đã kết thúc %s";
|
||||
$lang->build->resolvedBugs = ' Bug đã giải quyết %s';
|
||||
$lang->build->createdBugs = ' Bug đã báo cáo %s';
|
||||
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
$lang->build->common = "版本";
|
||||
$lang->build->create = "创建版本";
|
||||
$lang->build->edit = "编辑版本";
|
||||
$lang->build->linkStory = "关联{$lang->storyCommon}";
|
||||
$lang->build->linkStory = "关联{$lang->productSRCommon}";
|
||||
$lang->build->linkBug = "关联Bug";
|
||||
$lang->build->delete = "删除版本";
|
||||
$lang->build->deleted = "已删除";
|
||||
$lang->build->view = "版本详情";
|
||||
$lang->build->batchUnlink = '批量移除';
|
||||
$lang->build->batchUnlinkStory = "批量移除{$lang->storyCommon}";
|
||||
$lang->build->batchUnlinkStory = "批量移除{$lang->productSRCommon}";
|
||||
$lang->build->batchUnlinkBug = '批量移除Bug';
|
||||
|
||||
$lang->build->confirmDelete = "您确认删除该版本吗?";
|
||||
$lang->build->confirmUnlinkStory = "您确认移除该{$lang->storyCommon}吗?";
|
||||
$lang->build->confirmUnlinkStory = "您确认移除该{$lang->productSRCommon}吗?";
|
||||
$lang->build->confirmUnlinkBug = "您确认移除该Bug吗?";
|
||||
|
||||
$lang->build->basicInfo = '基本信息';
|
||||
@@ -40,18 +40,18 @@ $lang->build->desc = '描述';
|
||||
$lang->build->files = '上传发行包';
|
||||
$lang->build->last = '上个版本';
|
||||
$lang->build->packageType = '包类型';
|
||||
$lang->build->unlinkStory = "移除{$lang->storyCommon}";
|
||||
$lang->build->unlinkStory = "移除{$lang->productSRCommon}";
|
||||
$lang->build->unlinkBug = '移除Bug';
|
||||
$lang->build->stories = "完成的{$lang->storyCommon}";
|
||||
$lang->build->stories = "完成的{$lang->productSRCommon}";
|
||||
$lang->build->bugs = '解决的Bug';
|
||||
$lang->build->generatedBugs = '产生的Bug';
|
||||
$lang->build->noProduct = " <span style='color:red'>该{$lang->projectCommon}没有关联{$lang->productCommon},无法创建版本,请先<a href='%s'>关联{$lang->productCommon}</a></span>";
|
||||
$lang->build->noBuild = '暂时没有版本。';
|
||||
|
||||
$lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "已经关联{$lang->storyCommon}或Bug的版本,不能修改其所属产品";
|
||||
$lang->build->notice->changeProduct = "已经关联{$lang->productSRCommon}或Bug的版本,不能修改其所属产品";
|
||||
|
||||
$lang->build->finishStories = " 本次共完成 %s 个{$lang->storyCommon}";
|
||||
$lang->build->finishStories = " 本次共完成 %s 个{$lang->productSRCommon}";
|
||||
$lang->build->resolvedBugs = ' 本次共解决 %s 个Bug';
|
||||
$lang->build->createdBugs = ' 本次共产生 %s 个Bug';
|
||||
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
$lang->build->common = "版本";
|
||||
$lang->build->create = "創建版本";
|
||||
$lang->build->edit = "編輯版本";
|
||||
$lang->build->linkStory = "關聯{$lang->storyCommon}";
|
||||
$lang->build->linkStory = "關聯{$lang->productSRCommon}";
|
||||
$lang->build->linkBug = "關聯Bug";
|
||||
$lang->build->delete = "刪除版本";
|
||||
$lang->build->deleted = "已刪除";
|
||||
$lang->build->view = "版本詳情";
|
||||
$lang->build->batchUnlink = '批量移除';
|
||||
$lang->build->batchUnlinkStory = "批量移除{$lang->storyCommon}";
|
||||
$lang->build->batchUnlinkStory = "批量移除{$lang->productSRCommon}";
|
||||
$lang->build->batchUnlinkBug = '批量移除Bug';
|
||||
|
||||
$lang->build->confirmDelete = "您確認刪除該版本嗎?";
|
||||
$lang->build->confirmUnlinkStory = "您確認移除該{$lang->storyCommon}嗎?";
|
||||
$lang->build->confirmUnlinkStory = "您確認移除該{$lang->productSRCommon}嗎?";
|
||||
$lang->build->confirmUnlinkBug = "您確認移除該Bug嗎?";
|
||||
|
||||
$lang->build->basicInfo = '基本信息';
|
||||
@@ -40,18 +40,18 @@ $lang->build->desc = '描述';
|
||||
$lang->build->files = '上傳發行包';
|
||||
$lang->build->last = '上個版本';
|
||||
$lang->build->packageType = '包類型';
|
||||
$lang->build->unlinkStory = "移除{$lang->storyCommon}";
|
||||
$lang->build->unlinkStory = "移除{$lang->productSRCommon}";
|
||||
$lang->build->unlinkBug = '移除Bug';
|
||||
$lang->build->stories = "完成的{$lang->storyCommon}";
|
||||
$lang->build->stories = "完成的{$lang->productSRCommon}";
|
||||
$lang->build->bugs = '解決的Bug';
|
||||
$lang->build->generatedBugs = '產生的Bug';
|
||||
$lang->build->noProduct = " <span style='color:red'>該{$lang->projectCommon}沒有關聯{$lang->productCommon},無法創建版本,請先<a href='%s'>關聯{$lang->productCommon}</a></span>";
|
||||
$lang->build->noBuild = '暫時沒有版本。';
|
||||
|
||||
$lang->build->notice = new stdclass();
|
||||
$lang->build->notice->changeProduct = "已經關聯{$lang->storyCommon}或Bug的版本,不能修改其所屬產品";
|
||||
$lang->build->notice->changeProduct = "已經關聯{$lang->productSRCommon}或Bug的版本,不能修改其所屬產品";
|
||||
|
||||
$lang->build->finishStories = " 本次共完成 %s 個{$lang->storyCommon}";
|
||||
$lang->build->finishStories = " 本次共完成 %s 個{$lang->productSRCommon}";
|
||||
$lang->build->resolvedBugs = ' 本次共解決 %s 個Bug';
|
||||
$lang->build->createdBugs = ' 本次共產生 %s 個Bug';
|
||||
|
||||
|
||||
@@ -6,17 +6,18 @@ $lang->waterfall->menuOrder[15] = 'project';
|
||||
$lang->waterfall->menuOrder[20] = 'weekly';
|
||||
$lang->waterfall->menuOrder[25] = 'review';
|
||||
$lang->waterfall->menuOrder[30] = 'doc';
|
||||
$lang->waterfall->menuOrder[35] = 'product';
|
||||
$lang->waterfall->menuOrder[40] = 'design';
|
||||
$lang->waterfall->menuOrder[45] = 'ci';
|
||||
$lang->waterfall->menuOrder[50] = 'qa';
|
||||
$lang->waterfall->menuOrder[55] = 'projectrelease';
|
||||
$lang->waterfall->menuOrder[60] = 'issue';
|
||||
$lang->waterfall->menuOrder[65] = 'risk';
|
||||
$lang->waterfall->menuOrder[70] = 'report';
|
||||
$lang->waterfall->menuOrder[75] = 'auditplan';
|
||||
$lang->waterfall->menuOrder[80] = 'cm';
|
||||
$lang->waterfall->menuOrder[85] = 'list';
|
||||
$lang->waterfall->menuOrder[35] = 'projectstory';
|
||||
$lang->waterfall->menuOrder[40] = 'product';
|
||||
$lang->waterfall->menuOrder[45] = 'design';
|
||||
$lang->waterfall->menuOrder[50] = 'ci';
|
||||
$lang->waterfall->menuOrder[55] = 'qa';
|
||||
$lang->waterfall->menuOrder[60] = 'projectrelease';
|
||||
$lang->waterfall->menuOrder[65] = 'issue';
|
||||
$lang->waterfall->menuOrder[70] = 'risk';
|
||||
$lang->waterfall->menuOrder[75] = 'report';
|
||||
$lang->waterfall->menuOrder[80] = 'auditplan';
|
||||
$lang->waterfall->menuOrder[85] = 'cm';
|
||||
$lang->waterfall->menuOrder[90] = 'list';
|
||||
|
||||
$lang->scrum->menuOrder[5] = 'program';
|
||||
$lang->scrum->menuOrder[10] = 'product';
|
||||
|
||||
@@ -165,8 +165,8 @@ $lang->product->menu->home = '主页|product|index|';
|
||||
$lang->product->menu->list = array('link' => $lang->productCommon . '|product|all|', 'alias' => 'create,batchedit');
|
||||
|
||||
$lang->product->viewMenu = new stdclass();
|
||||
if($config->URAndSR) $lang->product->viewMenu->requirement = array('link' => "$URCommon|product|browse|productID=%s&branch=&browseType=unclosed¶m=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->viewMenu->story = array('link' => "$lang->storyCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
if($config->URAndSR) $lang->product->viewMenu->requirement = array('link' => "$lang->productURCommon|product|browse|productID=%s&branch=&browseType=unclosed¶m=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->viewMenu->story = array('link' => "$lang->productSRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->viewMenu->track = array('link' => "跟踪矩阵|story|track|productID=%s");
|
||||
$lang->product->viewMenu->plan = array('link' => "计划|productplan|browse|productID=%s", 'subModule' => 'productplan');
|
||||
$lang->product->viewMenu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release');
|
||||
@@ -215,7 +215,7 @@ $lang->measurement->menu = new stdclass();
|
||||
|
||||
/* 查询条中可以选择的对象列表。*/
|
||||
$lang->searchObjects['bug'] = 'Bug';
|
||||
$lang->searchObjects['story'] = "{$lang->storyCommon}";
|
||||
$lang->searchObjects['story'] = "{$lang->productSRCommon}";
|
||||
$lang->searchObjects['task'] = '任务';
|
||||
$lang->searchObjects['testcase'] = '用例';
|
||||
$lang->searchObjects['project'] = $lang->projectCommon;
|
||||
@@ -293,7 +293,7 @@ $lang->todo->menu = $lang->my->menu;
|
||||
$lang->scrumproduct = new stdclass();
|
||||
$lang->scrumproduct->menu = new stdclass();
|
||||
|
||||
$lang->scrumproduct->menu->story = array('link' => "{$lang->storyCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->story = array('link' => "{$lang->projectSRCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->plan = array('link' => "{$lang->planCommon}|productplan|browse|productID=%s", 'subModule' => 'productplan');
|
||||
//$lang->scrumproduct->menu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release');
|
||||
$lang->scrumproduct->menu->roadmap = '路线图|product|roadmap|productID=%s';
|
||||
@@ -306,8 +306,8 @@ $lang->scrumproduct->menu->view = array('link' => '概况|product|view|produc
|
||||
|
||||
if($config->URAndSR)
|
||||
{
|
||||
$lang->scrumproduct->menu->requirement = array('link' => "{$URCommon}|product|browse|productID=%s&branch=&browseType=unclosed¶m=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->story = array('link' => "{$SRCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->requirement = array('link' => "{$lang->projectURCommon}|product|browse|productID=%s&branch=&browseType=unclosed¶m=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->story = array('link' => "{$lang->projectSRCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
}
|
||||
|
||||
$lang->product->dividerMenu = ',project,doc,';
|
||||
@@ -324,7 +324,7 @@ $lang->project->menu->task = array('link' => '任务|project|task|projectID
|
||||
$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s');
|
||||
$lang->project->menu->burn = array('link' => '燃尽图|project|burn|projectID=%s');
|
||||
$lang->project->menu->list = array('link' => '更多|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover');
|
||||
$lang->project->menu->story = array('link' => "{$lang->storyCommon}|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
|
||||
$lang->project->menu->story = array('link' => "{$lang->projectSRCommon}|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
|
||||
$lang->project->menu->qa = array('link' => '测试|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover');
|
||||
$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
|
||||
$lang->project->menu->action = array('link' => '动态|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover');
|
||||
@@ -874,6 +874,7 @@ $lang->menu->waterfall->programplan = array('link' => '计划|programplan|bro
|
||||
$lang->menu->waterfall->project = array('link' => $lang->projectCommon . '|project|task|projectID={PROJECT}', 'subModule' => ',project,task,');
|
||||
$lang->menu->waterfall->weekly = array('link' => '报告|weekly|index|program={PROGRAM}', 'subModule' => ',milestone,');
|
||||
$lang->menu->waterfall->doc = array('link' => '文档|doc|index|program={PROGRAM}');
|
||||
$lang->menu->waterfall->projectstory = array('link' => '需求|projectstory|requirement|product={PRODUCT}', 'subModule' => 'requirement,story,');
|
||||
//$lang->menu->waterfall->product = array('link' => '需求|product|browse|product={PRODUCT}', 'subModule' => ',story,');
|
||||
$lang->menu->waterfall->design = '设计|design|browse|product={PRODUCT}';
|
||||
$lang->menu->waterfall->ci = '代码|repo|browse|';
|
||||
|
||||
@@ -166,7 +166,7 @@ $lang->product->menu->list = array('link' => $lang->productCommon . '|product|al
|
||||
|
||||
$lang->product->viewMenu = new stdclass();
|
||||
if($config->URAndSR) $lang->product->viewMenu->requirement = array('link' => "$URCommon|product|browse|productID=%s&branch=&browseType=unclosed¶m=0&storyType=requirement", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->viewMenu->story = array('link' => "$lang->storyCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->viewMenu->story = array('link' => "$lang->productSRCommon|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->product->viewMenu->plan = array('link' => "計劃|productplan|browse|productID=%s", 'subModule' => 'productplan');
|
||||
$lang->product->viewMenu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release');
|
||||
$lang->product->viewMenu->roadmap = '路線圖|product|roadmap|productID=%s';
|
||||
@@ -214,7 +214,7 @@ $lang->measurement->menu = new stdclass();
|
||||
|
||||
/* 查詢條中可以選擇的對象列表。*/
|
||||
$lang->searchObjects['bug'] = 'Bug';
|
||||
$lang->searchObjects['story'] = "{$lang->storyCommon}";
|
||||
$lang->searchObjects['story'] = "{$lang->productSRCommon}";
|
||||
$lang->searchObjects['task'] = '任務';
|
||||
$lang->searchObjects['testcase'] = '用例';
|
||||
$lang->searchObjects['project'] = $lang->projectCommon;
|
||||
@@ -292,7 +292,7 @@ $lang->todo->menu = $lang->my->menu;
|
||||
$lang->scrumproduct = new stdclass();
|
||||
$lang->scrumproduct->menu = new stdclass();
|
||||
|
||||
$lang->scrumproduct->menu->story = array('link' => "{$lang->storyCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->story = array('link' => "{$lang->productSRCommon}|product|browse|productID=%s", 'alias' => 'batchedit', 'subModule' => 'story');
|
||||
$lang->scrumproduct->menu->plan = array('link' => "{$lang->planCommon}|productplan|browse|productID=%s", 'subModule' => 'productplan');
|
||||
//$lang->scrumproduct->menu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release');
|
||||
$lang->scrumproduct->menu->roadmap = '路線圖|product|roadmap|productID=%s';
|
||||
@@ -323,7 +323,7 @@ $lang->project->menu->task = array('link' => '任務|project|task|projectID
|
||||
$lang->project->menu->kanban = array('link' => '看板|project|kanban|projectID=%s');
|
||||
$lang->project->menu->burn = array('link' => '燃盡圖|project|burn|projectID=%s');
|
||||
$lang->project->menu->list = array('link' => '更多|project|grouptask|projectID=%s', 'alias' => 'grouptask,tree', 'class' => 'dropdown dropdown-hover');
|
||||
$lang->project->menu->story = array('link' => "{$lang->storyCommon}|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
|
||||
$lang->project->menu->story = array('link' => "{$lang->productSRCommon}|project|story|projectID=%s", 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
|
||||
$lang->project->menu->qa = array('link' => '測試|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover');
|
||||
$lang->project->menu->doc = array('link' => '文檔|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
|
||||
$lang->project->menu->action = array('link' => '動態|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover');
|
||||
|
||||
@@ -45,7 +45,7 @@ class commonModel extends model
|
||||
public function sendHeader()
|
||||
{
|
||||
header("Content-Type: text/html; Language={$this->config->charset}");
|
||||
header("X-Frame-Options: SAMEORIGIN");
|
||||
if(!$this->loadModel('setting')->getItem('owner=system&module=sso&key=turnon')) header("X-Frame-Options: SAMEORIGIN");
|
||||
header("Cache-control: private");
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ $lang->convert->aimTypeOfZentao = '转化为Zentao中的类型';
|
||||
|
||||
$lang->convert->directionList['bug'] = 'Bug';
|
||||
$lang->convert->directionList['task'] = '任务';
|
||||
$lang->convert->directionList['story'] = $lang->storyCommon;
|
||||
$lang->convert->directionList['story'] = $lang->productSRCommon;
|
||||
|
||||
$lang->convert->sourceList['BugFree'] = array('bugfree_1' => '1.x', 'bugfree_2' => '2.x');
|
||||
$lang->convert->sourceList['Redmine'] = array('Redmine_1.1' => '1.1');
|
||||
@@ -79,7 +79,7 @@ $lang->convert->redmine->users = '用户';
|
||||
$lang->convert->redmine->groups = '用户分组';
|
||||
$lang->convert->redmine->products = $lang->productCommon;
|
||||
$lang->convert->redmine->projects = $lang->projectCommon;
|
||||
$lang->convert->redmine->stories = $lang->storyCommon;
|
||||
$lang->convert->redmine->stories = $lang->productSRCommon;
|
||||
$lang->convert->redmine->tasks = '任务';
|
||||
$lang->convert->redmine->bugs = 'Bug';
|
||||
$lang->convert->redmine->productPlans = $lang->productCommon . '计划';
|
||||
|
||||
@@ -35,7 +35,7 @@ $lang->convert->aimTypeOfZentao = '轉化為Zentao中的類型';
|
||||
|
||||
$lang->convert->directionList['bug'] = 'Bug';
|
||||
$lang->convert->directionList['task'] = '任務';
|
||||
$lang->convert->directionList['story'] = $lang->storyCommon;
|
||||
$lang->convert->directionList['story'] = $lang->productSRCommon;
|
||||
|
||||
$lang->convert->sourceList['BugFree'] = array('bugfree_1' => '1.x', 'bugfree_2' => '2.x');
|
||||
$lang->convert->sourceList['Redmine'] = array('Redmine_1.1' => '1.1');
|
||||
@@ -79,7 +79,7 @@ $lang->convert->redmine->users = '用戶';
|
||||
$lang->convert->redmine->groups = '用戶分組';
|
||||
$lang->convert->redmine->products = $lang->productCommon;
|
||||
$lang->convert->redmine->projects = $lang->projectCommon;
|
||||
$lang->convert->redmine->stories = $lang->storyCommon;
|
||||
$lang->convert->redmine->stories = $lang->productSRCommon;
|
||||
$lang->convert->redmine->tasks = '任務';
|
||||
$lang->convert->redmine->bugs = 'Bug';
|
||||
$lang->convert->redmine->productPlans = $lang->productCommon . '計劃';
|
||||
|
||||
+22
-130
@@ -245,7 +245,7 @@ class custom extends control
|
||||
$locate = inlink('flow');
|
||||
if(!isset($this->config->conceptSetted)) $this->lang->custom->notice->conceptResult .= $this->lang->custom->notice->conceptPath;
|
||||
if(!isset($this->config->conceptSetted)) $locate = helper::createLink('my', 'index');
|
||||
$message = sprintf($this->lang->custom->notice->conceptResult, $this->lang->productCommon, $this->lang->projectCommon, $this->lang->storyCommon, $this->lang->hourCommon);
|
||||
$message = sprintf($this->lang->custom->notice->conceptResult, $this->lang->productCommon, $this->lang->projectCommon, $this->lang->productSRCommon, $this->lang->hourCommon);
|
||||
$this->send(array('result' => 'success', 'notice' => $message, 'locate' => $locate));
|
||||
}
|
||||
|
||||
@@ -398,7 +398,7 @@ class custom extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function configureWaterfall($type = 'concept')
|
||||
public function configureWaterfall()
|
||||
{
|
||||
$this->app->loadLang('custom');
|
||||
$this->lang->custom->menu = new stdclass();
|
||||
@@ -406,76 +406,22 @@ class custom extends control
|
||||
|
||||
if($_POST)
|
||||
{
|
||||
if($type == 'concept')
|
||||
{
|
||||
$result = $this->custom->setURAndSR();
|
||||
if(!$result) $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->URSREmpty));
|
||||
}
|
||||
|
||||
if($type == 'user' and isset($_POST['keys']))
|
||||
{
|
||||
$lang = $_POST['lang'];
|
||||
$oldCustoms = $this->custom->getItems("lang=$lang&module=user§ion=roleList");
|
||||
foreach($_POST['keys'] as $index => $key)
|
||||
{
|
||||
if(strlen($key) > 10) $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['ten']));
|
||||
}
|
||||
|
||||
$this->custom->deleteItems("lang=$lang&module=user§ion=roleList");
|
||||
$data = fixer::input('post')->get();
|
||||
foreach($data->keys as $index => $key)
|
||||
{
|
||||
|
||||
$value = $data->values[$index];
|
||||
$system = $data->systems[$index];
|
||||
$this->custom->setItem("{$lang}.user.roleList.{$key}.{$system}", $value);
|
||||
}
|
||||
}
|
||||
$result = $this->custom->setURAndSR();
|
||||
if(!$result) $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->URSREmpty));
|
||||
|
||||
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('custom', 'configurewaterfall', "type=$type")));
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('custom', 'configurewaterfall')));
|
||||
}
|
||||
|
||||
if($type == 'user')
|
||||
{
|
||||
$this->app->loadLang('user');
|
||||
$fieldList = zget($this->lang->user, 'roleList', '');
|
||||
$lang = $this->app->getClientLang();
|
||||
$dbFields = $this->custom->getItems("lang=$lang&module=user§ion=roleList");
|
||||
if(empty($dbFields)) $dbFields = $this->custom->getItems("lang=all&module=user§ion=roleList");
|
||||
if($dbFields)
|
||||
{
|
||||
$dbField = reset($dbFields);
|
||||
if($lang != $dbField->lang)
|
||||
{
|
||||
$lang = str_replace('-', "_", $dbField->lang);
|
||||
foreach($fieldList as $key => $value)
|
||||
{
|
||||
if(isset($dbFields[$key]) and $value != $dbFields[$key]->value) $fieldList[$key] = $dbFields[$key]->value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->view->fieldList = $fieldList;
|
||||
$this->view->dbFields = $dbFields;
|
||||
$this->view->currentLang = $lang;
|
||||
$this->view->lang2Set = str_replace('_', '-', $lang);
|
||||
}
|
||||
|
||||
if($type == 'concept')
|
||||
{
|
||||
$URSRName = $this->dao->select("`value`")->from(TABLE_CONFIG)
|
||||
->where('module')->eq('custom')
|
||||
->andWhere('section')->eq('common')
|
||||
->andWhere('`key`')->eq('URSRName')
|
||||
->fetch('value');
|
||||
|
||||
$this->view->URSRName = json_decode($URSRName);
|
||||
}
|
||||
$URSRName = $this->dao->select("`value`")->from(TABLE_CONFIG)
|
||||
->where('module')->eq('custom')
|
||||
->andWhere('section')->eq('common')
|
||||
->andWhere('`key`')->eq('URSRName')
|
||||
->fetch('value');
|
||||
|
||||
$this->view->title = $this->lang->custom->common;
|
||||
$this->view->position[] = $this->lang->custom->common;
|
||||
$this->view->type = $type;
|
||||
$this->view->URSRName = json_decode($URSRName);
|
||||
|
||||
$this->display();
|
||||
}
|
||||
@@ -486,7 +432,7 @@ class custom extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function configureScrum($type = 'concept')
|
||||
public function configureScrum()
|
||||
{
|
||||
$this->app->loadLang('custom');
|
||||
$this->lang->custom->menu = new stdclass();
|
||||
@@ -494,77 +440,23 @@ class custom extends control
|
||||
|
||||
if($_POST)
|
||||
{
|
||||
if($type == 'concept')
|
||||
{
|
||||
$this->custom->setConcept();
|
||||
$result = $this->custom->setURAndSR();
|
||||
if(!$result) $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->URSREmpty));
|
||||
}
|
||||
$this->custom->setConcept();
|
||||
$result = $this->custom->setURAndSR();
|
||||
if(!$result) $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->URSREmpty));
|
||||
|
||||
if($type == 'user' && isset($_POST['keys']))
|
||||
{
|
||||
$lang = $_POST['lang'];
|
||||
$oldCustoms = $this->custom->getItems("lang=$lang&module=user§ion=roleList");
|
||||
foreach($_POST['keys'] as $index => $key)
|
||||
{
|
||||
if(strlen($key) > 10) $this->send(array('result' => 'fail', 'message' => $this->lang->custom->notice->invalidStrlen['ten']));
|
||||
}
|
||||
|
||||
$this->custom->deleteItems("lang=$lang&module=user§ion=roleList");
|
||||
$data = fixer::input('post')->get();
|
||||
foreach($data->keys as $index => $key)
|
||||
{
|
||||
|
||||
$value = $data->values[$index];
|
||||
$system = $data->systems[$index];
|
||||
$this->custom->setItem("{$lang}.user.roleList.{$key}.{$system}", $value);
|
||||
}
|
||||
}
|
||||
|
||||
$locate = inlink('configureScrum', "type=$type");
|
||||
$locate = inlink('configureScrum');
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
|
||||
}
|
||||
|
||||
if($type == 'concept')
|
||||
{
|
||||
$URSRName = $this->dao->select("`value`")->from(TABLE_CONFIG)
|
||||
->where('module')->eq('custom')
|
||||
->andWhere('section')->eq('common')
|
||||
->andWhere('`key`')->eq('URSRName')
|
||||
->fetch('value');
|
||||
|
||||
$this->view->URSRName = json_decode($URSRName);
|
||||
}
|
||||
|
||||
if($type == 'user')
|
||||
{
|
||||
$this->app->loadLang('user');
|
||||
$fieldList = zget($this->lang->user, 'roleList', '');
|
||||
$lang = $this->app->getClientLang();
|
||||
$dbFields = $this->custom->getItems("lang=$lang&module=user§ion=roleList");
|
||||
if(empty($dbFields)) $dbFields = $this->custom->getItems("lang=all&module=user§ion=roleList");
|
||||
if($dbFields)
|
||||
{
|
||||
$dbField = reset($dbFields);
|
||||
if($lang != $dbField->lang)
|
||||
{
|
||||
$lang = str_replace('-', "_", $dbField->lang);
|
||||
foreach($fieldList as $key => $value)
|
||||
{
|
||||
if(isset($dbFields[$key]) and $value != $dbFields[$key]->value) $fieldList[$key] = $dbFields[$key]->value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->view->fieldList = $fieldList;
|
||||
$this->view->dbFields = $dbFields;
|
||||
$this->view->currentLang = $lang;
|
||||
$this->view->lang2Set = str_replace('_', '-', $lang);
|
||||
}
|
||||
$URSRName = $this->dao->select("`value`")->from(TABLE_CONFIG)
|
||||
->where('module')->eq('custom')
|
||||
->andWhere('section')->eq('common')
|
||||
->andWhere('`key`')->eq('URSRName')
|
||||
->fetch('value');
|
||||
|
||||
$this->view->title = $this->lang->custom->configureScrum;
|
||||
$this->view->position[] = $this->lang->custom->configureScrum;
|
||||
$this->view->type = $type;
|
||||
$this->view->URSRName = json_decode($URSRName);
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -5,10 +5,12 @@ $(function()
|
||||
if($(this).val() == 0)
|
||||
{
|
||||
$('#URSRName').addClass('hidden');
|
||||
$('#customURSR').addClass('hidden');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#URSRName').removeClass('hidden');
|
||||
$('#customURSR').removeClass('hidden');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -5,10 +5,12 @@ $(function()
|
||||
if($(this).val() == 0)
|
||||
{
|
||||
$('#URSRName').addClass('hidden');
|
||||
$('#customURSR').addClass('hidden');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#URSRName').removeClass('hidden');
|
||||
$('#customURSR').removeClass('hidden');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ $lang->custom->user->fields['statusList'] = 'Status';
|
||||
$lang->custom->user->fields['contactField'] = 'Available Contact';
|
||||
$lang->custom->user->fields['deleted'] = 'Show deleted user';
|
||||
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score');
|
||||
$lang->custom->system = array('required', 'score');
|
||||
|
||||
$lang->custom->block->fields['closed'] = 'Closed Block';
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ $lang->custom->user->fields['statusList'] = 'Status';
|
||||
$lang->custom->user->fields['contactField'] = 'Available Contact';
|
||||
$lang->custom->user->fields['deleted'] = 'Deleted User';
|
||||
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score', 'estimate');
|
||||
$lang->custom->system = array('required', 'score');
|
||||
|
||||
$lang->custom->block->fields['closed'] = 'Closed Block';
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ $lang->custom->user->fields['statusList'] = 'Statut';
|
||||
$lang->custom->user->fields['contactField'] = 'Contact';
|
||||
$lang->custom->user->fields['deleted'] = 'Parti';
|
||||
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score');
|
||||
$lang->custom->system = array('required', 'score');
|
||||
|
||||
$lang->custom->block->fields['closed'] = 'Bloc Fermé';
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ $lang->custom->user->fields['statusList'] = 'Tình trạng';
|
||||
$lang->custom->user->fields['contactField'] = 'Liên hệ có sẵn';
|
||||
$lang->custom->user->fields['deleted'] = 'Người dùng đã xóa';
|
||||
|
||||
$lang->custom->system = array('flow', 'working', 'required', 'score');
|
||||
$lang->custom->system = array('required', 'score');
|
||||
|
||||
$lang->custom->block->fields['closed'] = 'Đã đóng Block';
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ $lang->custom->closedProduct = '已关闭' . $lang->productCommon;
|
||||
|
||||
$lang->custom->object['product'] = $lang->productCommon;
|
||||
$lang->custom->object['project'] = $lang->projectCommon;
|
||||
$lang->custom->object['story'] = $lang->storyCommon;
|
||||
$lang->custom->object['story'] = $lang->productSRCommon;
|
||||
$lang->custom->object['task'] = '任务';
|
||||
$lang->custom->object['bug'] = 'Bug';
|
||||
$lang->custom->object['testcase'] = '用例';
|
||||
@@ -125,11 +125,12 @@ $lang->custom->todo->fields['typeList'] = '类型';
|
||||
$lang->custom->todo->fields['statusList'] = '状态';
|
||||
|
||||
$lang->custom->user = new stdClass();
|
||||
$lang->custom->user->fields['roleList'] = '职位';
|
||||
$lang->custom->user->fields['statusList'] = '状态';
|
||||
$lang->custom->user->fields['contactField'] = '可用联系方式';
|
||||
$lang->custom->user->fields['deleted'] = '列出已删除用户';
|
||||
|
||||
$lang->custom->system = array('required', 'score', 'estimate');
|
||||
$lang->custom->system = array('required', 'score');
|
||||
|
||||
$lang->custom->block->fields['closed'] = '关闭的区块';
|
||||
|
||||
@@ -151,7 +152,7 @@ $lang->custom->notice->noClosedBlock = '没有永久关闭的区
|
||||
$lang->custom->notice->required = '页面提交时,选中的字段必填';
|
||||
$lang->custom->notice->conceptResult = '我们已经根据您的选择为您设置了<b> %s-%s </b>模式,使用<b>%s</b> + <b> %s</b>。';
|
||||
$lang->custom->notice->conceptPath = '您可以在:后台 -> 自定义 -> 流程页面修改。';
|
||||
$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->storyCommon . '、Bug、用例、日志、发布、计划都禁止修改。';
|
||||
$lang->custom->notice->readOnlyOfProduct = '禁止修改后,已关闭' . $lang->productCommon . '下的' . $lang->productSRCommon . '、Bug、用例、日志、发布、计划都禁止修改。';
|
||||
$lang->custom->notice->readOnlyOfProject = '禁止修改后,已关闭' . $lang->projectCommon . '下的任务、版本、日志以及关联需求都禁止修改。';
|
||||
$lang->custom->notice->URSREmpty = '自定义需求名称不能为空!';
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ $lang->custom->closedProduct = '已關閉' . $lang->productCommon;
|
||||
|
||||
$lang->custom->object['product'] = $lang->productCommon;
|
||||
$lang->custom->object['project'] = $lang->projectCommon;
|
||||
$lang->custom->object['story'] = $lang->storyCommon;
|
||||
$lang->custom->object['story'] = $lang->productSRCommon;
|
||||
$lang->custom->object['task'] = '任務';
|
||||
$lang->custom->object['bug'] = 'Bug';
|
||||
$lang->custom->object['testcase'] = '用例';
|
||||
@@ -152,7 +152,7 @@ $lang->custom->notice->noClosedBlock = '沒有永久關閉的區
|
||||
$lang->custom->notice->required = '頁面提交時,選中的欄位必填';
|
||||
$lang->custom->notice->conceptResult = '我們已經根據您的選擇為您設置了<b> %s-%s </b>模式,使用<b>%s</b> + <b> %s</b>。';
|
||||
$lang->custom->notice->conceptPath = '您可以在:後台 -> 自定義 -> 流程頁面修改。';
|
||||
$lang->custom->notice->readOnlyOfProduct = '禁止修改後,已關閉' . $lang->productCommon . '下的' . $lang->storyCommon . '、Bug、用例、日誌、發佈、計劃都禁止修改。';
|
||||
$lang->custom->notice->readOnlyOfProduct = '禁止修改後,已關閉' . $lang->productCommon . '下的' . $lang->productSRCommon . '、Bug、用例、日誌、發佈、計劃都禁止修改。';
|
||||
$lang->custom->notice->readOnlyOfProject = '禁止修改後,已關閉' . $lang->projectCommon . '下的任務、版本、日誌以及關聯需求都禁止修改。';
|
||||
|
||||
$lang->custom->notice->indexPage['product'] = "從8.2版本起增加了產品主頁視圖,是否預設進入產品主頁?";
|
||||
|
||||
@@ -10,40 +10,19 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php
|
||||
$itemRow = <<<EOT
|
||||
<tr class='text-center'>
|
||||
<td>
|
||||
<input type='text' class="form-control" autocomplete="off" value="" name="keys[]">
|
||||
<input type='hidden' value="0" name="systems[]">
|
||||
</td>
|
||||
<td>
|
||||
<input type='text' class="form-control" value="" autocomplete="off" name="values[]">
|
||||
</td>
|
||||
<td class='c-actions'>
|
||||
<a href="javascript:void(0)" class='btn btn-link' onclick="addItem(this)"><i class='icon-plus'></i></a>
|
||||
<a href="javascript:void(0)" class='btn btn-link' onclick="delItem(this)"><i class='icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
EOT;
|
||||
?>
|
||||
<?php js::set('type', $type);?>
|
||||
<?php js::set('itemRow', $itemRow);?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php echo html::a(inlink('configurescrum', 'type=concept'), "<span class='text'>" . $lang->custom->concept . '</span>', '', "class='btn btn-link concept'");?>
|
||||
<?php echo html::a(inlink('configurescrum', 'type=user'), "<span class='text'>" . $lang->user->role . '</span>', '', "class='btn btn-link user'");?>
|
||||
<?php echo html::a(inlink('configurescrum'), "<span class='text'>" . $lang->custom->concept . '</span>', '', "class='btn btn-link btn-active-text concept'");?>
|
||||
</div>
|
||||
</div>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<form id='ajaxForm' class='form-ajax' method='post'>
|
||||
<div class='modal-body'>
|
||||
<?php if($type == 'concept'):?>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-160px'><?php echo $lang->custom->scrum->setConcept;?> </th>
|
||||
<td><?php echo html::radio('productProject', $lang->custom->productProject->relation, zget($this->config->custom, 'productProject', '0_0'))?></td>
|
||||
<td></td><td></td><td></td><td></td>
|
||||
<td colspan='3'><?php echo html::radio('productProject', $lang->custom->productProject->relation, zget($this->config->custom, 'productProject', '0_0'))?></td>
|
||||
<td></td><td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> <?php echo $lang->custom->waterfall->URAndSR;?> </th>
|
||||
@@ -64,53 +43,7 @@ EOT;
|
||||
<td class='text-right'><?php echo html::submitButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
<?php if($type == 'user'):?>
|
||||
<table class='table table-form active-disabled table-condensed mw-600px'>
|
||||
<tr class='text-center'>
|
||||
<td class='w-120px'><strong><?php echo $lang->custom->key;?></strong></td>
|
||||
<td><strong><?php echo $lang->custom->value;?></strong></td>
|
||||
<th class='w-90px'></th>
|
||||
</tr>
|
||||
<?php foreach($fieldList as $key => $value):?>
|
||||
<tr class='text-center'>
|
||||
<?php $system = isset($dbFields[$key]) ? $dbFields[$key]->system : 1;?>
|
||||
<td><?php echo $key === '' ? 'NULL' : $key; echo html::hidden('keys[]', $key) . html::hidden('systems[]', $system);?></td>
|
||||
<td>
|
||||
<?php echo html::input("values[]", isset($dbFields[$key]) ? $dbFields[$key]->value : $value, "class='form-control' " . (empty($key) ? 'readonly' : ''));?>
|
||||
</td>
|
||||
<td class='c-actions'>
|
||||
<a href="javascript:void(0)" onclick="addItem(this)" class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href="javascript:void(0)" onclick="delItem(this)" class='btn btn-link'><i class='icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'>
|
||||
<?php
|
||||
$appliedTo = array($currentLang => $lang->custom->currentLang, 'all' => $lang->custom->allLang);
|
||||
echo html::radio('lang', $appliedTo, $lang2Set);
|
||||
echo html::submitButton();
|
||||
if(common::hasPriv('custom', 'restore')) echo html::linkButton($lang->custom->restore, inlink('restore', "module=user&field=roleList"), 'hiddenwin', '', 'btn btn-wide');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
$('.' + type).addClass('btn-active-text');
|
||||
|
||||
function addItem(clickedButton)
|
||||
{
|
||||
$(clickedButton).parent().parent().after(itemRow);
|
||||
}
|
||||
|
||||
function delItem(clickedButton)
|
||||
{
|
||||
$(clickedButton).parent().parent().remove();
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -10,36 +10,15 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php
|
||||
$itemRow = <<<EOT
|
||||
<tr class='text-center'>
|
||||
<td>
|
||||
<input type='text' class="form-control" autocomplete="off" value="" name="keys[]">
|
||||
<input type='hidden' value="0" name="systems[]">
|
||||
</td>
|
||||
<td>
|
||||
<input type='text' class="form-control" value="" autocomplete="off" name="values[]">
|
||||
</td>
|
||||
<td class='c-actions'>
|
||||
<a href="javascript:void(0)" class='btn btn-link' onclick="addItem(this)"><i class='icon-plus'></i></a>
|
||||
<a href="javascript:void(0)" class='btn btn-link' onclick="delItem(this)"><i class='icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
EOT;
|
||||
?>
|
||||
<?php js::set('type', $type);?>
|
||||
<?php js::set('itemRow', $itemRow);?>
|
||||
<div id='mainMenu' class='clearfix'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php echo html::a(inlink('configurewaterfall', 'type=concept'), "<span class='text'>" . $lang->custom->concept . '</span>', '', "class='btn btn-link concept'");?>
|
||||
<?php echo html::a(inlink('configurewaterfall', 'type=user'), "<span class='text'>" . $lang->user->role . '</span>', '', "class='btn btn-link user'");?>
|
||||
<?php echo html::a(inlink('configurewaterfall'), "<span class='text'>" . $lang->custom->concept . '</span>', '', "class='btn btn-link btn-active-text concept'");?>
|
||||
</div>
|
||||
</div>
|
||||
<div id='mainContent' class='main-row'>
|
||||
<div class='main-col main-content'>
|
||||
<form class="load-indicator main-form form-ajax" method='post'>
|
||||
<div class='modal-body'>
|
||||
<?php if($type == 'concept'):?>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='w-160px'> <?php echo $lang->custom->waterfall->URAndSR;?> </th>
|
||||
@@ -61,54 +40,8 @@ EOT;
|
||||
<td class='text-right'><?php echo html::submitButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
<?php if($type == 'user'):?>
|
||||
<table class='table table-form active-disabled table-condensed mw-600px'>
|
||||
<tr class='text-center'>
|
||||
<td class='w-120px'><strong><?php echo $lang->custom->key;?></strong></td>
|
||||
<td><strong><?php echo $lang->custom->value;?></strong></td>
|
||||
<th class='w-90px'></th>
|
||||
</tr>
|
||||
<?php foreach($fieldList as $key => $value):?>
|
||||
<tr class='text-center'>
|
||||
<?php $system = isset($dbFields[$key]) ? $dbFields[$key]->system : 1;?>
|
||||
<td><?php echo $key === '' ? 'NULL' : $key; echo html::hidden('keys[]', $key) . html::hidden('systems[]', $system);?></td>
|
||||
<td>
|
||||
<?php echo html::input("values[]", isset($dbFields[$key]) ? $dbFields[$key]->value : $value, "class='form-control' " . (empty($key) ? 'readonly' : ''));?>
|
||||
</td>
|
||||
<td class='c-actions'>
|
||||
<a href="javascript:void(0)" onclick="addItem(this)" class='btn btn-link'><i class='icon-plus'></i></a>
|
||||
<a href="javascript:void(0)" onclick="delItem(this)" class='btn btn-link'><i class='icon-close'></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'>
|
||||
<?php
|
||||
$appliedTo = array($currentLang => $lang->custom->currentLang, 'all' => $lang->custom->allLang);
|
||||
echo html::radio('lang', $appliedTo, $lang2Set);
|
||||
echo html::submitButton();
|
||||
if(common::hasPriv('custom', 'restore')) echo html::linkButton($lang->custom->restore, inlink('restore', "module=user&field=roleList"), 'hiddenwin', '', 'btn btn-wide');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$('.' + type).addClass('btn-active-text');
|
||||
|
||||
function addItem(clickedButton)
|
||||
{
|
||||
$(clickedButton).parent().parent().after(itemRow);
|
||||
}
|
||||
|
||||
function delItem(clickedButton)
|
||||
{
|
||||
$(clickedButton).parent().parent().remove();
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -29,7 +29,7 @@ $lang->design->product = 'Linked Product';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->commitBy = 'Commit By';
|
||||
$lang->design->commitDate = 'Committed Date';
|
||||
$lang->design->affectedStory = "{$lang->storyCommon}";
|
||||
$lang->design->affectedStory = "{$lang->productSRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
|
||||
@@ -29,7 +29,7 @@ $lang->design->product = 'Linked Product';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->commitBy = 'Commit By';
|
||||
$lang->design->commitDate = 'Committed Date';
|
||||
$lang->design->affectedStory = "{$lang->storyCommon}";
|
||||
$lang->design->affectedStory = "{$lang->productSRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
|
||||
@@ -29,7 +29,7 @@ $lang->design->product = 'Linked Product';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->commitBy = 'Commit By';
|
||||
$lang->design->commitDate = 'Committed Date';
|
||||
$lang->design->affectedStory = "{$lang->storyCommon}";
|
||||
$lang->design->affectedStory = "{$lang->productSRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
|
||||
@@ -29,7 +29,7 @@ $lang->design->product = 'Linked Product';
|
||||
$lang->design->basicInfo = 'Basic Information';
|
||||
$lang->design->commitBy = 'Commit By';
|
||||
$lang->design->commitDate = 'Committed Date';
|
||||
$lang->design->affectedStory = "{$lang->storyCommon}";
|
||||
$lang->design->affectedStory = "{$lang->productSRCommon}";
|
||||
$lang->design->affectedTasks = 'Task';
|
||||
$lang->design->reviewObject = 'Review Object';
|
||||
$lang->design->createdBy = 'CreatedBy';
|
||||
|
||||
@@ -29,7 +29,7 @@ $lang->design->product = '所属产品';
|
||||
$lang->design->basicInfo = '基础信息';
|
||||
$lang->design->commitBy = '由谁提交';
|
||||
$lang->design->commitDate = '提交时间';
|
||||
$lang->design->affectedStory = "影响{$lang->storyCommon}";
|
||||
$lang->design->affectedStory = "影响{$lang->productSRCommon}";
|
||||
$lang->design->affectedTasks = '影响任务';
|
||||
$lang->design->reviewObject = '评审对象';
|
||||
$lang->design->createdBy = '由谁创建';
|
||||
|
||||
@@ -52,10 +52,10 @@ $lang->dev->tableList['product'] = $lang->productCommon;
|
||||
$lang->dev->tableList['productplan'] = $lang->productCommon . '计划';
|
||||
$lang->dev->tableList['project'] = $lang->projectCommon;
|
||||
$lang->dev->tableList['projectproduct'] = $lang->projectCommon . $lang->productCommon;
|
||||
$lang->dev->tableList['projectstory'] = $lang->projectCommon . $lang->storyCommon;
|
||||
$lang->dev->tableList['projectstory'] = $lang->projectCommon . $lang->productSRCommon;
|
||||
$lang->dev->tableList['release'] = '发布';
|
||||
$lang->dev->tableList['story'] = $lang->storyCommon;
|
||||
$lang->dev->tableList['storyspec'] = "{$lang->storyCommon}描述";
|
||||
$lang->dev->tableList['story'] = $lang->productSRCommon;
|
||||
$lang->dev->tableList['storyspec'] = "{$lang->productSRCommon}描述";
|
||||
$lang->dev->tableList['task'] = '任务';
|
||||
$lang->dev->tableList['taskestimate'] = '任务预计';
|
||||
$lang->dev->tableList['team'] = '团队';
|
||||
@@ -96,7 +96,7 @@ $lang->dev->tableList['datatable'] = '数据表格';
|
||||
$lang->dev->tableList['block'] = '区块';
|
||||
$lang->dev->tableList['branch'] = '平台/分支';
|
||||
$lang->dev->tableList['doccontent'] = '文档内容';
|
||||
$lang->dev->tableList['storystage'] = "{$lang->storyCommon}阶段";
|
||||
$lang->dev->tableList['storystage'] = "{$lang->productSRCommon}阶段";
|
||||
$lang->dev->tableList['tutorial'] = '新手教程';
|
||||
$lang->dev->tableList['suitecase'] = '套件用例';
|
||||
$lang->dev->tableList['score'] = '积分';
|
||||
|
||||
@@ -52,10 +52,10 @@ $lang->dev->tableList['product'] = $lang->productCommon;
|
||||
$lang->dev->tableList['productplan'] = $lang->productCommon . '計劃';
|
||||
$lang->dev->tableList['project'] = $lang->projectCommon;
|
||||
$lang->dev->tableList['projectproduct'] = $lang->projectCommon . $lang->productCommon;
|
||||
$lang->dev->tableList['projectstory'] = $lang->projectCommon . $lang->storyCommon;
|
||||
$lang->dev->tableList['projectstory'] = $lang->projectCommon . $lang->productSRCommon;
|
||||
$lang->dev->tableList['release'] = '發佈';
|
||||
$lang->dev->tableList['story'] = $lang->storyCommon;
|
||||
$lang->dev->tableList['storyspec'] = "{$lang->storyCommon}描述";
|
||||
$lang->dev->tableList['story'] = $lang->productSRCommon;
|
||||
$lang->dev->tableList['storyspec'] = "{$lang->productSRCommon}描述";
|
||||
$lang->dev->tableList['task'] = '任務';
|
||||
$lang->dev->tableList['taskestimate'] = '任務預計';
|
||||
$lang->dev->tableList['team'] = '團隊';
|
||||
@@ -96,7 +96,7 @@ $lang->dev->tableList['datatable'] = '數據表格';
|
||||
$lang->dev->tableList['block'] = '區塊';
|
||||
$lang->dev->tableList['branch'] = '平台/分支';
|
||||
$lang->dev->tableList['doccontent'] = '文檔內容';
|
||||
$lang->dev->tableList['storystage'] = "{$lang->storyCommon}階段";
|
||||
$lang->dev->tableList['storystage'] = "{$lang->productSRCommon}階段";
|
||||
$lang->dev->tableList['tutorial'] = '新手教程';
|
||||
$lang->dev->tableList['suitecase'] = '套件用例';
|
||||
$lang->dev->tableList['score'] = '積分';
|
||||
|
||||
@@ -120,7 +120,7 @@ class doc extends control
|
||||
$this->lang->navGroup->doc = 'project';
|
||||
$this->lang->doc->menu = $this->lang->project->menu;
|
||||
$this->lang->doc->menuOrder = $this->lang->project->menuOrder;
|
||||
$this->project->setMenu($this->project->getExecutionPairs($this->session->PRJ, 'all', 'nocode'), $lib->project);
|
||||
$this->project->setMenu($this->project->getExecutionsByProject($this->session->PRJ, 'all', 0, true), $lib->project);
|
||||
$this->lang->set('menugroup.doc', 'project');
|
||||
}
|
||||
else
|
||||
@@ -226,7 +226,7 @@ class doc extends control
|
||||
|
||||
$projectID = $this->session->PRJ;
|
||||
$products = $this->product->getProductPairsByProject($projectID, 'noclosed');
|
||||
$projects = $this->project->getExecutionPairs($projectID, 'all', 'noclosed');
|
||||
$projects = $this->project->getExecutionsByProject($projectID, 'all', 0, true);
|
||||
|
||||
$libTypeList = $this->lang->doc->libTypeList;
|
||||
if(empty($products)) unset($libTypeList['product']);
|
||||
@@ -355,7 +355,7 @@ class doc extends control
|
||||
$this->lang->navGroup->doc = 'program';
|
||||
$this->lang->doc->menu = $this->lang->project->menu;
|
||||
$this->lang->doc->menuOrder = $this->lang->project->menuOrder;
|
||||
$this->project->setMenu($this->project->getExecutionPairs($this->session->PRJ, 'all', 'nocode'), $lib->project);
|
||||
$this->project->setMenu($this->project->getExecutionsByProject($this->session->PRJ, 'all', 0, true), $lib->project);
|
||||
$this->lang->set('menugroup.doc', 'project');
|
||||
|
||||
$this->lang->TRActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), "<i class='icon icon-plus'></i> " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='70%'") : '';
|
||||
@@ -721,7 +721,7 @@ class doc extends control
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$libs = $this->doc->getAllLibsByType($type, $pager, $product);
|
||||
$libs = $this->doc->getAllLibsByType($type, $pager);
|
||||
$subLibs = array();
|
||||
if($type == 'product' or $type == 'project')
|
||||
{
|
||||
@@ -776,7 +776,7 @@ class doc extends control
|
||||
$this->lang->navGroup->doc = 'program';
|
||||
$this->lang->doc->menu = $this->lang->project->menu;
|
||||
$this->lang->doc->menuOrder = $this->lang->project->menuOrder;
|
||||
$this->project->setMenu($this->project->getExecutionPairs($this->session->PRJ, 'all', 'nocode'), $objectID);
|
||||
$this->project->setMenu($this->project->getExecutionsByProject($this->session->PRJ, 'all', 0, true), $objectID);
|
||||
$this->lang->set('menugroup.doc', 'project');
|
||||
}
|
||||
else
|
||||
@@ -872,7 +872,7 @@ class doc extends control
|
||||
$this->lang->navGroup->doc = 'project';
|
||||
$this->lang->doc->menu = $this->lang->project->menu;
|
||||
$this->lang->doc->menuOrder = $this->lang->project->menuOrder;
|
||||
$this->project->setMenu($this->project->getExecutionPairs($this->session->PRJ, 'all', 'nocode'), $objectID);
|
||||
$this->project->setMenu($this->project->getExecutionsByProject($this->session->PRJ, 'all', 0, true), $objectID);
|
||||
$this->lang->set('menugroup.doc', 'project');
|
||||
}
|
||||
else
|
||||
|
||||
@@ -152,15 +152,16 @@ class docModel extends model
|
||||
{
|
||||
$idList = array();
|
||||
if($type == 'product') $idList = $this->loadModel('product')->getProductIDByProject($projectID, false);
|
||||
if($type == 'project') $idList = $this->loadModel('project')->getExecutionPairs($projectID, 'all', 'noclosed');
|
||||
if($type == 'project')
|
||||
{
|
||||
$status = strpos($this->config->doc->custom->showLibs, 'unclosed') !== false ? 'undone' : 'all';
|
||||
$idList = $this->loadModel('project')->getExecutionIdList($projectID, $status);
|
||||
}
|
||||
|
||||
$table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT;
|
||||
$stmt = $this->dao->select('t1.*')->from(TABLE_DOCLIB)->alias('t1')
|
||||
->leftJoin($table)->alias('t2')->on("t1.$type=t2.id")
|
||||
->andWhere('t2.id')->in($idList)
|
||||
->beginIF($type == 'project' and strpos($this->config->doc->custom->showLibs, 'unclosed') !== false)->andWhere('t2.status')->notin('done,closed')->fi()
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->orderBy("t2.order desc, t1.order, t1.id")
|
||||
$stmt = $this->dao->select('*')->from(TABLE_DOCLIB)
|
||||
->where($type)->in($idList)
|
||||
->andWhere('deleted')->eq('0')
|
||||
->query();
|
||||
}
|
||||
elseif($type == 'all')
|
||||
|
||||
@@ -179,7 +179,7 @@ $lang->misc->feature->all['11.5.stable'][] = array('title'=>'集成新版本客
|
||||
|
||||
$lang->misc->feature->all['11.4.1'][] = array('title'=>'完善细节,修复Bug', 'desc' => '');
|
||||
|
||||
$lang->misc->feature->all["11.4.stable"][] = array("title"=>"完善细节,修复Bug", "desc" => "<p>增强测试任务管理</p><p>优化计划、发布、版本关联{$lang->storyCommon}和bug的交互</p><p>文档库可以自定义是否显示子分类里的文档</p><p>修复bug,完善细节</p>");
|
||||
$lang->misc->feature->all["11.4.stable"][] = array("title"=>"完善细节,修复Bug", "desc" => "<p>增强测试任务管理</p><p>优化计划、发布、版本关联{$lang->productSRCommon}和bug的交互</p><p>文档库可以自定义是否显示子分类里的文档</p><p>修复bug,完善细节</p>");
|
||||
|
||||
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '<p>计划添加子计划功能</p><p>优化chosen交互</p><p>添加时区设置</p><p>优化文档库和文档</p>');
|
||||
|
||||
@@ -231,14 +231,14 @@ $lang->misc->feature->all['8.3.stable'][] = array('title'=>'调整文档功能',
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'首页自定义', 'desc' => '<p>我的地盘由我做主。现在开始,你可以向首页添加多种多样的内容区块,而且还可以决定如何排列和显示他们。</p><p>我的地盘、产品、项目、测试模块下均支持首页自定义功能。</p>');
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'导航定制', 'desc' => '<p>导航上显示的项目现在完全由你来决定,不仅仅可以决定在导航上展示哪些内容,还可以决定展示的顺序。</p><p>将鼠标悬浮在导航上稍后会在右侧显示定制按钮,点击打开定制对话框,通过点击切换是否显示,拖放操作来更改显示顺序。</p>');
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'批量添加、编辑自定义', 'desc' => '<p>可以在批量添加和批量编辑页面自定义操作的字段。</p>');
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"添加{$lang->storyCommon}、任务、Bug、用例自定义", 'desc' => "<p>可以在添加{$lang->storyCommon}、任务、Bug、用例页面,自定义部分字段是否显示。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'导出自定义', 'desc' => "<p>在导出{$lang->storyCommon}、任务、Bug、用例的时候,用户可以自定义导出的字段,也可以保存模板方便每次导出。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"{$lang->storyCommon}、任务、Bug、用例组合检索功能", 'desc' => "<p>在{$lang->storyCommon}、任务、Bug、用例列表页面,可以实现模块和标签的组合检索。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"添加{$lang->productSRCommon}、任务、Bug、用例自定义", 'desc' => "<p>可以在添加{$lang->productSRCommon}、任务、Bug、用例页面,自定义部分字段是否显示。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'导出自定义', 'desc' => "<p>在导出{$lang->productSRCommon}、任务、Bug、用例的时候,用户可以自定义导出的字段,也可以保存模板方便每次导出。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"{$lang->productSRCommon}、任务、Bug、用例组合检索功能", 'desc' => "<p>在{$lang->productSRCommon}、任务、Bug、用例列表页面,可以实现模块和标签的组合检索。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'增加新手教程', 'desc' => '<p>增加新手教程,方便新用户了解禅道使用。</p>');
|
||||
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'产品实现分支功能', 'desc' => "<p>产品增加分支/平台类型,相应的{$lang->storyCommon}、计划、Bug、用例、模块等都增加分支。</p>");
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'产品实现分支功能', 'desc' => "<p>产品增加分支/平台类型,相应的{$lang->productSRCommon}、计划、Bug、用例、模块等都增加分支。</p>");
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'调整发布模块', 'desc' => '<p>发布增加停止维护操作,当发布停止维护时,创建Bug将不显示这个发布。</p><p>发布中遗留的bug改为手工关联。</p>');
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>"调整{$lang->storyCommon}和Bug的创建页面", 'desc' => '');
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>"调整{$lang->productSRCommon}和Bug的创建页面", 'desc' => '');
|
||||
|
||||
$lang->misc->feature->all['7.2.stable'][] = array('title'=>'增强安全', 'desc' => '<p>加强对管理员弱口令的检查。</p><p>写插件,上传插件的时候需要创建ok文件。</p><p>敏感操作增加管理员口令的检查</p><p>对输入内容做striptags, specialchars处理。</p>');
|
||||
$lang->misc->feature->all['7.2.stable'][] = array('title'=>'完善细节', 'desc' => '');
|
||||
|
||||
@@ -176,7 +176,7 @@ $lang->misc->feature->all['11.5.stable'][] = array('title'=>'整合新版本客
|
||||
|
||||
$lang->misc->feature->all['11.4.1'][] = array('title'=>'完善細節,修復Bug', 'desc' => '');
|
||||
|
||||
$lang->misc->feature->all["11.4.stable"][] = array("title"=>"完善細節,修復Bug", "desc" => "<p>增強測試任務管理</p><p>優化計劃、發佈、版本關聯{$lang->storyCommon}和bug的交互</p><p>文檔庫可以自定義是否顯示子分類裡的文檔</p><p>修復bug,完善細節</p>");
|
||||
$lang->misc->feature->all["11.4.stable"][] = array("title"=>"完善細節,修復Bug", "desc" => "<p>增強測試任務管理</p><p>優化計劃、發佈、版本關聯{$lang->productSRCommon}和bug的交互</p><p>文檔庫可以自定義是否顯示子分類裡的文檔</p><p>修復bug,完善細節</p>");
|
||||
|
||||
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '<p>計劃添加子計劃功能</p><p>優化chosen交互</p><p>添加時區設置</p><p>優化文檔庫和文檔</p>');
|
||||
|
||||
@@ -228,14 +228,14 @@ $lang->misc->feature->all['8.3.stable'][] = array('title'=>'調整文檔功能',
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'首頁自定義', 'desc' => '<p>我的地盤由我做主。現在開始,你可以向首頁添加多種多樣的內容區塊,而且還可以決定如何排列和顯示他們。</p><p>我的地盤、產品、項目、測試模組下均支持首頁自定義功能。</p>');
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'導航定製', 'desc' => '<p>導航上顯示的項目現在完全由你來決定,不僅僅可以決定在導航上展示哪些內容,還可以決定展示的順序。</p><p>將滑鼠懸浮在導航上稍後會在右側顯示定製按鈕,點擊打開定製對話框,通過點擊切換是否顯示,拖放操作來更改顯示順序。</p>');
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'批量添加、編輯自定義', 'desc' => '<p>可以在批量添加和批量編輯頁面自定義操作的欄位。</p>');
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"添加{$lang->storyCommon}、任務、Bug、用例自定義", 'desc' => "<p>可以在添加{$lang->storyCommon}、任務、Bug、用例頁面,自定義部分欄位是否顯示。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'導出自定義', 'desc' => "<p>在導出{$lang->storyCommon}、任務、Bug、用例的時候,用戶可以自定義導出的欄位,也可以保存模板方便每次導出。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"{$lang->storyCommon}、任務、Bug、用例組合檢索功能", 'desc' => "<p>在{$lang->storyCommon}、任務、Bug、用例列表頁面,可以實現模組和標籤的組合檢索。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"添加{$lang->productSRCommon}、任務、Bug、用例自定義", 'desc' => "<p>可以在添加{$lang->productSRCommon}、任務、Bug、用例頁面,自定義部分欄位是否顯示。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'導出自定義', 'desc' => "<p>在導出{$lang->productSRCommon}、任務、Bug、用例的時候,用戶可以自定義導出的欄位,也可以保存模板方便每次導出。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"{$lang->productSRCommon}、任務、Bug、用例組合檢索功能", 'desc' => "<p>在{$lang->productSRCommon}、任務、Bug、用例列表頁面,可以實現模組和標籤的組合檢索。</p>");
|
||||
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'增加新手教程', 'desc' => '<p>增加新手教程,方便新用戶瞭解禪道使用。</p>');
|
||||
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'產品實現分支功能', 'desc' => "<p>產品增加分支/平台類型,相應的{$lang->storyCommon}、計劃、Bug、用例、模組等都增加分支。</p>");
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'產品實現分支功能', 'desc' => "<p>產品增加分支/平台類型,相應的{$lang->productSRCommon}、計劃、Bug、用例、模組等都增加分支。</p>");
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'調整發佈模組', 'desc' => '<p>發佈增加停止維護操作,當發佈停止維護時,創建Bug將不顯示這個發佈。</p><p>發佈中遺留的bug改為手工關聯。</p>');
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>"調整{$lang->storyCommon}和Bug的創建頁面", 'desc' => '');
|
||||
$lang->misc->feature->all['7.4.beta'][] = array('title'=>"調整{$lang->productSRCommon}和Bug的創建頁面", 'desc' => '');
|
||||
|
||||
$lang->misc->feature->all['7.2.stable'][] = array('title'=>'增強安全', 'desc' => '<p>加強對管理員弱口令的檢查。</p><p>寫插件,上傳插件的時候需要創建ok檔案。</p><p>敏感操作增加管理員口令的檢查</p><p>對輸入內容做striptags, specialchars處理。</p>');
|
||||
$lang->misc->feature->all['7.2.stable'][] = array('title'=>'完善細節', 'desc' => '');
|
||||
|
||||
@@ -27,6 +27,11 @@ $lang->my->score = 'Meine Wertung';
|
||||
$lang->my->scoreRule = 'Wertungs regeln';
|
||||
$lang->my->noTodo = 'Keine toDos. ';
|
||||
|
||||
$lang->my->myExecutions = "My Stage/{$lang->projectCommon}/Kanban";
|
||||
$lang->my->name = 'Name';
|
||||
$lang->my->code = 'Code';
|
||||
$lang->my->projects = 'Project';
|
||||
|
||||
$lang->my->taskMenu = new stdclass();
|
||||
$lang->my->taskMenu->assignedToMe = 'Mir zuweisen';
|
||||
$lang->my->taskMenu->openedByMe = 'Von mir angelegt';
|
||||
|
||||
@@ -27,6 +27,11 @@ $lang->my->score = 'My Points';
|
||||
$lang->my->scoreRule = 'Point Rules';
|
||||
$lang->my->noTodo = 'No todos yet. ';
|
||||
|
||||
$lang->my->myExecutions = "My Stage/{$lang->projectCommon}/Kanban";
|
||||
$lang->my->name = 'Name';
|
||||
$lang->my->code = 'Code';
|
||||
$lang->my->projects = 'Project';
|
||||
|
||||
$lang->my->taskMenu = new stdclass();
|
||||
$lang->my->taskMenu->assignedToMe = 'AssignedToMe';
|
||||
$lang->my->taskMenu->openedByMe = 'CreatedByMe';
|
||||
|
||||
@@ -27,6 +27,11 @@ $lang->my->score = 'Mes Points';
|
||||
$lang->my->scoreRule = 'Règles Point';
|
||||
$lang->my->noTodo = "Je n'ai rien à faire pour l'instant.";
|
||||
|
||||
$lang->my->myExecutions = "My Stage/{$lang->projectCommon}/Kanban";
|
||||
$lang->my->name = 'Name';
|
||||
$lang->my->code = 'Code';
|
||||
$lang->my->projects = 'Project';
|
||||
|
||||
$lang->my->taskMenu = new stdclass();
|
||||
$lang->my->taskMenu->assignedToMe = "Tâches qui me sont affectées";
|
||||
$lang->my->taskMenu->openedByMe = "Tâches que j'ai créées";
|
||||
|
||||
@@ -27,6 +27,11 @@ $lang->my->score = 'Điểm của bạn';
|
||||
$lang->my->scoreRule = 'Quy định điểm';
|
||||
$lang->my->noTodo = 'Chưa có việc nào.';
|
||||
|
||||
$lang->my->myExecutions = "My Stage/{$lang->projectCommon}/Kanban";
|
||||
$lang->my->name = 'Name';
|
||||
$lang->my->code = 'Code';
|
||||
$lang->my->projects = 'Project';
|
||||
|
||||
$lang->my->taskMenu = new stdclass();
|
||||
$lang->my->taskMenu->assignedToMe = 'Giao cho bạn';
|
||||
$lang->my->taskMenu->openedByMe = 'Tạo bởi bạn';
|
||||
|
||||
@@ -9,8 +9,8 @@ $lang->my->task = '我的任务';
|
||||
$lang->my->bug = '我的Bug';
|
||||
$lang->my->testTask = '我的版本';
|
||||
$lang->my->testCase = '我的用例';
|
||||
$lang->my->story = "我的{$lang->storyCommon}";
|
||||
$lang->my->requirement = "我的用户{$lang->storyCommon}";
|
||||
$lang->my->story = "我的{$lang->productSRCommon}";
|
||||
$lang->my->requirement = "我的用户{$lang->productSRCommon}";
|
||||
$lang->my->createProgram = '添加项目';
|
||||
$lang->my->project = "我的项目";
|
||||
$lang->my->execution = '我的执行';
|
||||
@@ -27,6 +27,11 @@ $lang->my->score = '我的积分';
|
||||
$lang->my->scoreRule = '积分规则';
|
||||
$lang->my->noTodo = '暂时没有待办。';
|
||||
|
||||
$lang->my->myExecutions = "我参与的阶段/{$lang->projectCommon}/看板";
|
||||
$lang->my->name = '名称';
|
||||
$lang->my->code = '代号';
|
||||
$lang->my->projects = '项目';
|
||||
|
||||
$lang->my->taskMenu = new stdclass();
|
||||
$lang->my->taskMenu->assignedToMe = '指派给我';
|
||||
$lang->my->taskMenu->openedByMe = '由我创建';
|
||||
|
||||
@@ -9,8 +9,8 @@ $lang->my->task = '我的任務';
|
||||
$lang->my->bug = '我的Bug';
|
||||
$lang->my->testTask = '我的版本';
|
||||
$lang->my->testCase = '我的用例';
|
||||
$lang->my->story = "我的{$lang->storyCommon}";
|
||||
$lang->my->requirement = "我的用戶{$lang->storyCommon}";
|
||||
$lang->my->story = "我的{$lang->productSRCommon}";
|
||||
$lang->my->requirement = "我的用戶{$lang->productSRCommon}";
|
||||
$lang->my->createProgram = '添加項目';
|
||||
$lang->my->project = "我的項目";
|
||||
$lang->my->execution = '我的執行';
|
||||
@@ -27,6 +27,11 @@ $lang->my->score = '我的積分';
|
||||
$lang->my->scoreRule = '積分規則';
|
||||
$lang->my->noTodo = '暫時沒有待辦。';
|
||||
|
||||
$lang->my->myExecutions = "我參與的階段/{$lang->projectCommon}/看板";
|
||||
$lang->my->name = '名稱';
|
||||
$lang->my->code = '代號';
|
||||
$lang->my->projects = '項目';
|
||||
|
||||
$lang->my->taskMenu = new stdclass();
|
||||
$lang->my->taskMenu->assignedToMe = '指派給我';
|
||||
$lang->my->taskMenu->openedByMe = '由我創建';
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<div class="btn-toolbar pull-left">
|
||||
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->my->execution;?></span></span>
|
||||
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->my->myExecutions;?></span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="mainContent" class='main-table'>
|
||||
@@ -28,8 +28,10 @@
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
<th class='w-id'><?php echo $lang->idAB;?></th>
|
||||
<th class='w-160px text-left'><?php echo $lang->project->code;?></th>
|
||||
<th class='c-name text-left'><?php echo $lang->project->name;?></th>
|
||||
<th class='c-name text-left'><?php echo $lang->my->name;?></th>
|
||||
<th class='w-160px text-left'><?php echo $lang->my->code;?></th>
|
||||
<th class='w-160px text-left'><?php echo $lang->typeAB;?></th>
|
||||
<th class='c-name text-left'><?php echo $lang->my->projects;?></th>
|
||||
<th class='c-date'><?php echo $lang->project->begin;?></th>
|
||||
<th class='c-date'><?php echo $lang->project->end;?></th>
|
||||
<th class='c-status'><?php echo $lang->statusAB;?></th>
|
||||
@@ -43,8 +45,10 @@
|
||||
<?php $link = $this->createLink('project', 'browse', "id=$execution->id", '', '', $execution->project);?>
|
||||
<tr class='text-center'>
|
||||
<td><?php echo html::a($link, $execution->id);?></td>
|
||||
<td class='text-left'><?php echo $execution->code;?></td>
|
||||
<td class='c-name text-left'><?php echo html::a($link, $execution->name);?></td>
|
||||
<td class='text-left'><?php echo $execution->code;?></td>
|
||||
<td class='text-left'><?php echo zget($lang->project->typeList, $execution->type);?></td>
|
||||
<td class='c-name text-left'><?php echo html::a($this->createLink('project', 'browse', "id=$execution->project", '', '', $execution->project), $execution->parentName, '', "title='$execution->parentName'");?></td>
|
||||
<td><?php echo $execution->begin;?></td>
|
||||
<td><?php echo $execution->end;?></td>
|
||||
<td class="c-status">
|
||||
|
||||
@@ -199,7 +199,7 @@ class product extends control
|
||||
/* Change for requirement story title. */
|
||||
if($storyType == 'requirement' and $this->config->URAndSR)
|
||||
{
|
||||
$this->lang->story->title = str_replace($this->lang->SRCommon, $this->lang->URCommon, $this->lang->story->title);
|
||||
$this->lang->story->title = str_replace($this->lang->productSRCommon, $this->lang->productURCommon, $this->lang->story->title);
|
||||
$this->config->product->search['fields']['title'] = $this->lang->story->title;
|
||||
}
|
||||
|
||||
@@ -640,7 +640,7 @@ class product extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$projects = $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : $branch, 'nodeleted');
|
||||
$projects = $this->product->getExecutionPairsByProduct($productID, $branch ? "0,$branch" : $branch);
|
||||
}
|
||||
if($this->app->getViewType() == 'json') die(json_encode($projects));
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
*/
|
||||
$lang->product->common = $lang->productCommon . '视图';
|
||||
$lang->product->index = $lang->productCommon . '主页';
|
||||
$lang->product->browse = "{$lang->storyCommon}列表";
|
||||
$lang->product->browse = "{$lang->productSRCommon}列表";
|
||||
$lang->product->dynamic = '产品动态';
|
||||
$lang->product->view = "{$lang->productCommon}概况";
|
||||
$lang->product->edit = "编辑{$lang->productCommon}";
|
||||
@@ -48,14 +48,14 @@ $lang->product->build = '版本列表';
|
||||
$lang->product->projectInfo = "所有与此产品关联的{$lang->projectCommon}";
|
||||
|
||||
$lang->product->currentProject = '当前' . $lang->projectCommon;
|
||||
$lang->product->activeStories = "激活{$lang->storyCommon}";
|
||||
$lang->product->activeStoriesTitle = "激活{$lang->storyCommon}";
|
||||
$lang->product->changedStories = "已变更{$lang->storyCommon}";
|
||||
$lang->product->changedStoriesTitle = "已变更{$lang->storyCommon}";
|
||||
$lang->product->draftStories = "草稿{$lang->storyCommon}";
|
||||
$lang->product->draftStoriesTitle = "草稿{$lang->storyCommon}";
|
||||
$lang->product->closedStories = "已关闭{$lang->storyCommon}";
|
||||
$lang->product->closedStoriesTitle = "已关闭{$lang->storyCommon}";
|
||||
$lang->product->activeStories = "激活{$lang->productSRCommon}";
|
||||
$lang->product->activeStoriesTitle = "激活{$lang->productSRCommon}";
|
||||
$lang->product->changedStories = "已变更{$lang->productSRCommon}";
|
||||
$lang->product->changedStoriesTitle = "已变更{$lang->productSRCommon}";
|
||||
$lang->product->draftStories = "草稿{$lang->productSRCommon}";
|
||||
$lang->product->draftStoriesTitle = "草稿{$lang->productSRCommon}";
|
||||
$lang->product->closedStories = "已关闭{$lang->productSRCommon}";
|
||||
$lang->product->closedStoriesTitle = "已关闭{$lang->productSRCommon}";
|
||||
$lang->product->unResolvedBugs = '未解决Bug';
|
||||
$lang->product->unResolvedBugsTitle = '未解决Bug';
|
||||
$lang->product->assignToNullBugs = '未指派Bug';
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
*/
|
||||
$lang->product->common = $lang->productCommon . '視圖';
|
||||
$lang->product->index = $lang->productCommon . '主頁';
|
||||
$lang->product->browse = "{$lang->storyCommon}列表";
|
||||
$lang->product->browse = "{$lang->productSRCommon}列表";
|
||||
$lang->product->dynamic = '產品動態';
|
||||
$lang->product->view = "{$lang->productCommon}概況";
|
||||
$lang->product->edit = "編輯{$lang->productCommon}";
|
||||
@@ -48,14 +48,14 @@ $lang->product->build = '版本列表';
|
||||
$lang->product->projectInfo = "所有與此產品關聯的{$lang->projectCommon}";
|
||||
|
||||
$lang->product->currentProject = '當前' . $lang->projectCommon;
|
||||
$lang->product->activeStories = "激活{$lang->storyCommon}";
|
||||
$lang->product->activeStoriesTitle = "激活{$lang->storyCommon}";
|
||||
$lang->product->changedStories = "已變更{$lang->storyCommon}";
|
||||
$lang->product->changedStoriesTitle = "已變更{$lang->storyCommon}";
|
||||
$lang->product->draftStories = "草稿{$lang->storyCommon}";
|
||||
$lang->product->draftStoriesTitle = "草稿{$lang->storyCommon}";
|
||||
$lang->product->closedStories = "已關閉{$lang->storyCommon}";
|
||||
$lang->product->closedStoriesTitle = "已關閉{$lang->storyCommon}";
|
||||
$lang->product->activeStories = "激活{$lang->productSRCommon}";
|
||||
$lang->product->activeStoriesTitle = "激活{$lang->productSRCommon}";
|
||||
$lang->product->changedStories = "已變更{$lang->productSRCommon}";
|
||||
$lang->product->changedStoriesTitle = "已變更{$lang->productSRCommon}";
|
||||
$lang->product->draftStories = "草稿{$lang->productSRCommon}";
|
||||
$lang->product->draftStoriesTitle = "草稿{$lang->productSRCommon}";
|
||||
$lang->product->closedStories = "已關閉{$lang->productSRCommon}";
|
||||
$lang->product->closedStoriesTitle = "已關閉{$lang->productSRCommon}";
|
||||
$lang->product->unResolvedBugs = '未解決Bug';
|
||||
$lang->product->unResolvedBugsTitle = '未解決Bug';
|
||||
$lang->product->assignToNullBugs = '未指派Bug';
|
||||
|
||||
+25
-12
@@ -758,26 +758,39 @@ class productModel extends model
|
||||
*
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @param string $status all|nodeleted
|
||||
* @param string $orderBy
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getExecutionPairsByProduct($productID, $branch = 0, $status = 'all')
|
||||
public function getExecutionPairsByProduct($productID, $branch = 0, $orderBy = 'path_asc,id_asc')
|
||||
{
|
||||
if(!$this->session->PRJ || !$productID) return array();
|
||||
|
||||
$executions = $this->dao->select('t2.id, t2.name')->from(TABLE_PROJECTPRODUCT)
|
||||
->alias('t1')->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
$executions = $this->dao->select('t2.id,t2.name,t2.grade,t2.parent')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
->where('t1.product')->eq($productID)
|
||||
->andWhere('t2.project')->eq($this->session->PRJ)
|
||||
->beginIF($branch)->andWhere('t1.branch')->in($branch)->fi()
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi()
|
||||
->beginIF($status == 'nodeleted')->andWhere('t2.deleted')->eq('0')->fi()
|
||||
->orderBy('t2.begin asc')
|
||||
->fetchPairs();
|
||||
->andWhere('t2.deleted')->eq('0')
|
||||
->orderBy($orderBy)
|
||||
->fetchAll('id');
|
||||
|
||||
$executions = array('0' => '') + $executions;
|
||||
return $executions;
|
||||
/* The waterfall project needs to show the hierarchy and remove the parent stage. */
|
||||
$project = $this->loadModel('program')->getPRJByID($this->session->PRJ);
|
||||
if($project->model == 'waterfall')
|
||||
{
|
||||
foreach($executions as $execution)
|
||||
{
|
||||
if($execution->parent and isset($executions[$execution->parent])) $executions[$execution->id]->name = $executions[$execution->parent]->name . '/' . $execution->name;
|
||||
}
|
||||
|
||||
foreach($executions as $execution) if($execution->grade == 2) unset($executions[$execution->parent]);
|
||||
}
|
||||
|
||||
$executionList = array('0' => '');
|
||||
foreach($executions as $execution) $executionList[$execution->id] = $execution->name;
|
||||
return $executionList;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1160,11 +1173,11 @@ class productModel extends model
|
||||
$cases = $this->dao->select('story')->from(TABLE_CASE)->where('story')->in($storyIdList)->andWhere('deleted')->eq(0)->fetchAll('story');
|
||||
$rate = count($stories) == 0 || $rateCount == 0 ? 0 : round(count($cases) / $rateCount, 2);
|
||||
|
||||
$storyCommon = $this->lang->storyCommon;
|
||||
$storyCommon = $this->lang->productSRCommon;
|
||||
if($this->config->URAndSR)
|
||||
{
|
||||
if($storyType == 'requirement') $storyCommon = $this->lang->URCommon;
|
||||
if($storyType == 'story') $storyCommon = $this->lang->SRCommon;
|
||||
if($storyType == 'requirement') $storyCommon = $this->lang->productURCommon;
|
||||
if($storyType == 'story') $storyCommon = $this->lang->productSRCommon;
|
||||
}
|
||||
|
||||
return sprintf($this->lang->product->storySummary, $allCount, $storyCommon, $totalEstimate, $rate * 100 . "%");
|
||||
|
||||
@@ -441,14 +441,7 @@ $('#branch' + branchID).closest('li').addClass('active');
|
||||
$(function()
|
||||
{
|
||||
// Update table summary text
|
||||
<?php
|
||||
$storyCommon = $lang->storyCommon;
|
||||
if($config->URAndSR)
|
||||
{
|
||||
if($storyType == 'requirement') $storyCommon = $lang->URCommon;
|
||||
if($storyType == 'story') $storyCommon = $lang->SRCommon;
|
||||
}
|
||||
?>
|
||||
<?php $storyCommon = $lang->productSRCommon;?>
|
||||
var checkedSummary = '<?php echo str_replace('%storyCommon%', $storyCommon, $lang->product->checkedSummary)?>';
|
||||
$('#productStoryForm').table(
|
||||
{
|
||||
|
||||
@@ -21,12 +21,12 @@ $lang->productplan->basicInfo = '基本信息';
|
||||
$lang->productplan->batchEdit = '批量编辑';
|
||||
|
||||
$lang->productplan->batchUnlink = "批量移除";
|
||||
$lang->productplan->linkStory = "关联{$lang->storyCommon}";
|
||||
$lang->productplan->unlinkStory = "移除{$lang->storyCommon}";
|
||||
$lang->productplan->linkStory = "关联{$lang->productSRCommon}";
|
||||
$lang->productplan->unlinkStory = "移除{$lang->productSRCommon}";
|
||||
$lang->productplan->unlinkStoryAB = "移除";
|
||||
$lang->productplan->batchUnlinkStory = "批量移除{$lang->storyCommon}";
|
||||
$lang->productplan->linkedStories = $lang->storyCommon;
|
||||
$lang->productplan->unlinkedStories = "未关联{$lang->storyCommon}";
|
||||
$lang->productplan->batchUnlinkStory = "批量移除{$lang->productSRCommon}";
|
||||
$lang->productplan->linkedStories = $lang->productSRCommon;
|
||||
$lang->productplan->unlinkedStories = "未关联{$lang->productSRCommon}";
|
||||
$lang->productplan->updateOrder = '排序';
|
||||
$lang->productplan->createChildren = "创建子{$lang->planCommon}";
|
||||
|
||||
@@ -39,7 +39,7 @@ $lang->productplan->unexpired = "未过期{$lang->planCommon}";
|
||||
$lang->productplan->all = "所有{$lang->planCommon}";
|
||||
|
||||
$lang->productplan->confirmDelete = "您确认删除该{$lang->planCommon}吗?";
|
||||
$lang->productplan->confirmUnlinkStory = "您确认移除该{$lang->storyCommon}吗?";
|
||||
$lang->productplan->confirmUnlinkStory = "您确认移除该{$lang->productSRCommon}吗?";
|
||||
$lang->productplan->confirmUnlinkBug = "您确认移除该Bug吗?";
|
||||
$lang->productplan->noPlan = "暂时没有{$lang->planCommon}。";
|
||||
$lang->productplan->cannotDeleteParent = "不能删除父{$lang->planCommon}";
|
||||
@@ -53,7 +53,7 @@ $lang->productplan->begin = '开始日期';
|
||||
$lang->productplan->end = '结束日期';
|
||||
$lang->productplan->last = "上次{$lang->planCommon}";
|
||||
$lang->productplan->future = '待定';
|
||||
$lang->productplan->stories = "{$lang->storyCommon}数";
|
||||
$lang->productplan->stories = "{$lang->productSRCommon}数";
|
||||
$lang->productplan->bugs = 'Bug数';
|
||||
$lang->productplan->hour = $lang->hourCommon;
|
||||
$lang->productplan->project = $lang->projectCommon;
|
||||
|
||||
@@ -21,12 +21,12 @@ $lang->productplan->basicInfo = '基本信息';
|
||||
$lang->productplan->batchEdit = '批量編輯';
|
||||
|
||||
$lang->productplan->batchUnlink = "批量移除";
|
||||
$lang->productplan->linkStory = "關聯{$lang->storyCommon}";
|
||||
$lang->productplan->unlinkStory = "移除{$lang->storyCommon}";
|
||||
$lang->productplan->linkStory = "關聯{$lang->productSRCommon}";
|
||||
$lang->productplan->unlinkStory = "移除{$lang->productSRCommon}";
|
||||
$lang->productplan->unlinkStoryAB = "移除";
|
||||
$lang->productplan->batchUnlinkStory = "批量移除{$lang->storyCommon}";
|
||||
$lang->productplan->linkedStories = $lang->storyCommon;
|
||||
$lang->productplan->unlinkedStories = "未關聯{$lang->storyCommon}";
|
||||
$lang->productplan->batchUnlinkStory = "批量移除{$lang->productSRCommon}";
|
||||
$lang->productplan->linkedStories = $lang->productSRCommon;
|
||||
$lang->productplan->unlinkedStories = "未關聯{$lang->productSRCommon}";
|
||||
$lang->productplan->updateOrder = '排序';
|
||||
$lang->productplan->createChildren = "創建子計劃";
|
||||
|
||||
@@ -39,7 +39,7 @@ $lang->productplan->unexpired = '未過期計劃';
|
||||
$lang->productplan->all = '所有計劃';
|
||||
|
||||
$lang->productplan->confirmDelete = "您確認刪除該計劃嗎?";
|
||||
$lang->productplan->confirmUnlinkStory = "您確認移除該{$lang->storyCommon}嗎?";
|
||||
$lang->productplan->confirmUnlinkStory = "您確認移除該{$lang->productSRCommon}嗎?";
|
||||
$lang->productplan->confirmUnlinkBug = "您確認移除該Bug嗎?";
|
||||
$lang->productplan->noPlan = '暫時沒有計劃。';
|
||||
$lang->productplan->cannotDeleteParent = '不能刪除父計劃';
|
||||
@@ -53,7 +53,7 @@ $lang->productplan->begin = '開始日期';
|
||||
$lang->productplan->end = '結束日期';
|
||||
$lang->productplan->last = '上次計劃';
|
||||
$lang->productplan->future = '待定';
|
||||
$lang->productplan->stories = "{$lang->storyCommon}數";
|
||||
$lang->productplan->stories = "{$lang->productSRCommon}數";
|
||||
$lang->productplan->bugs = 'Bug數';
|
||||
$lang->productplan->hour = $lang->hourCommon;
|
||||
$lang->productplan->project = $lang->projectCommon;
|
||||
|
||||
@@ -68,6 +68,7 @@ class program extends control
|
||||
if(common::hasPriv('program', 'pgmcreate')) $this->lang->pageActions = html::a($this->createLink('program', 'pgmcreate'), "<i class='icon icon-sm icon-plus'></i> " . $this->lang->program->PGMCreate, '', "class='btn btn-secondary'");
|
||||
|
||||
$this->app->session->set('programList', $this->app->getURI(true));
|
||||
$this->app->session->set('taskList', $this->app->getURI(true). "?PRJ=6");
|
||||
|
||||
$programType = $this->cookie->programType ? $this->cookie->programType : 'bylist';
|
||||
|
||||
@@ -691,6 +692,7 @@ class program extends control
|
||||
*/
|
||||
public function PRJCreate($model = 'waterfall', $programID = 0, $from = 'PRJ', $copyProjectID = '', $projectID = 0)
|
||||
{
|
||||
$this->app->loadLang('custom');
|
||||
if($from == 'PRJ')
|
||||
{
|
||||
$this->lang->navGroup->program = 'project';
|
||||
|
||||
@@ -33,10 +33,10 @@ $lang->program->unbindWhielist = 'Project Remove Whitelist';
|
||||
$lang->program->PRJManageProducts = 'Manage Products';
|
||||
$lang->program->copyTitle = 'Please select an project to copy';
|
||||
$lang->program->errorSameProducts = 'Project cannot be associated with multiple identical products.';
|
||||
$lang->program->errorNoProducts = 'At least one product is linked with the project.';
|
||||
$lang->program->errorNoProducts = 'At least one product is associated';
|
||||
$lang->program->copyNoProject = 'There are no items available to copy.';
|
||||
$lang->program->PRJSource = 'Project source:';
|
||||
$lang->program->PRJStandalone = 'Standalone Projects';
|
||||
$lang->program->PRJStandalone = 'Projects that do not belong to a program.';
|
||||
$lang->program->tips = 'Note';
|
||||
$lang->program->setTeam = 'Set Team';
|
||||
$lang->program->goback = 'Go Back';
|
||||
|
||||
@@ -33,10 +33,10 @@ $lang->program->unbindWhielist = 'Project Remove Whitelist';
|
||||
$lang->program->PRJManageProducts = 'Manage Products';
|
||||
$lang->program->copyTitle = 'Please select an project to copy';
|
||||
$lang->program->errorSameProducts = 'Project cannot be associated with multiple identical products.';
|
||||
$lang->program->errorNoProducts = 'At least one product is linked with the project.';
|
||||
$lang->program->errorNoProducts = 'At least one product is associated';
|
||||
$lang->program->copyNoProject = 'There are no items available to copy.';
|
||||
$lang->program->PRJSource = 'Project source:';
|
||||
$lang->program->PRJStandalone = 'Standalone Projects';
|
||||
$lang->program->PRJStandalone = 'Projects that do not belong to a program.';
|
||||
$lang->program->tips = 'Note';
|
||||
$lang->program->setTeam = 'Set Team';
|
||||
$lang->program->goback = 'Go Back';
|
||||
|
||||
@@ -33,10 +33,10 @@ $lang->program->unbindWhielist = 'Project Remove Whitelist';
|
||||
$lang->program->PRJManageProducts = 'Manage Products';
|
||||
$lang->program->copyTitle = 'Please select an project to copy';
|
||||
$lang->program->errorSameProducts = 'Project cannot be associated with multiple identical products.';
|
||||
$lang->program->errorNoProducts = 'At least one product is linked with the project.';
|
||||
$lang->program->errorNoProducts = 'At least one product is associated';
|
||||
$lang->program->copyNoProject = 'There are no items available to copy.';
|
||||
$lang->program->PRJSource = 'Project source:';
|
||||
$lang->program->PRJStandalone = 'Standalone Projects';
|
||||
$lang->program->PRJStandalone = 'Projects that do not belong to a program.';
|
||||
$lang->program->tips = 'Note';
|
||||
$lang->program->setTeam = 'Set Team';
|
||||
$lang->program->goback = 'Go Back';
|
||||
|
||||
@@ -33,10 +33,10 @@ $lang->program->unbindWhielist = 'Project Remove Whitelist';
|
||||
$lang->program->PRJManageProducts = 'Manage Products';
|
||||
$lang->program->copyTitle = 'Please select an project to copy';
|
||||
$lang->program->errorSameProducts = 'Project cannot be associated with multiple identical products.';
|
||||
$lang->program->errorNoProducts = 'At least one product is linked with the project.';
|
||||
$lang->program->errorNoProducts = 'At least one product is associated';
|
||||
$lang->program->copyNoProject = 'There are no items available to copy.';
|
||||
$lang->program->PRJSource = 'Project source:';
|
||||
$lang->program->PRJStandalone = 'Standalone Projects';
|
||||
$lang->program->PRJStandalone = 'Projects that do not belong to a program.';
|
||||
$lang->program->tips = 'Note';
|
||||
$lang->program->setTeam = 'Set Team';
|
||||
$lang->program->goback = 'Go Back';
|
||||
|
||||
@@ -29,14 +29,15 @@ $lang->program->PRJUpdateOrder = '排序';
|
||||
$lang->program->PRJSort = '项目排序';
|
||||
$lang->program->PRJWhitelist = '项目白名单';
|
||||
$lang->program->PRJAddWhitelist = '项目添加白名单';
|
||||
$lang->program->PRJStoryConcept = '需求概念组合';
|
||||
$lang->program->unbindWhielist = '项目删除白名单';
|
||||
$lang->program->PRJManageProducts = '关联产品';
|
||||
$lang->program->copyTitle = '请选择一个项目来复制';
|
||||
$lang->program->errorSameProducts = '项目不能关联多个相同的产品。';
|
||||
$lang->program->errorNoProducts = '项目最少关联一个产品。';
|
||||
$lang->program->errorNoProducts = '最少关联一个产品';
|
||||
$lang->program->copyNoProject = '没有可用的项目来复制';
|
||||
$lang->program->PRJSource = '项目来源:';
|
||||
$lang->program->PRJStandalone = '独立项目';
|
||||
$lang->program->PRJStandalone = '没有所属项目集的项目';
|
||||
$lang->program->tips = '提示';
|
||||
$lang->program->setTeam = '设置团队';
|
||||
$lang->program->goback = '返回项目列表';
|
||||
|
||||
@@ -23,22 +23,27 @@ $lang->program->PRJManagePriv = '項目維護權限';
|
||||
$lang->program->PRJManageMembers = '項目團隊';
|
||||
$lang->program->export = '導出';
|
||||
$lang->program->PRJManageGroupMember = '維護分組用戶';
|
||||
$lang->program->PRJModuleSetting = '項目集設置';
|
||||
$lang->program->PRJModuleSetting = '列表設置';
|
||||
$lang->program->PRJModuleOpen = '顯示項目集名';
|
||||
$lang->program->PRJUpdateOrder = '排序';
|
||||
$lang->program->PRJSort = '項目排序';
|
||||
$lang->program->PRJWhitelist = '項目白名單';
|
||||
$lang->program->PRJAddWhitelist = '項目添加白名單';
|
||||
$lang->program->unbindWhielist = '項目刪除白名單';
|
||||
$lang->program->PRJManageProducts = '項目關聯產品';
|
||||
$lang->program->PRJManageProducts = '關聯產品';
|
||||
$lang->program->copyTitle = '請選擇一個項目來複制';
|
||||
$lang->program->errorSameProducts = '項目不能關聯多個相同的產品。';
|
||||
$lang->program->errorNoProducts = '最少關聯一個產品';
|
||||
$lang->program->copyNoProject = '沒有可用的項目來複制';
|
||||
$lang->program->PRJSource = '項目來源:';
|
||||
$lang->program->PRJStandalone = '獨立項目';
|
||||
$lang->program->PRJStandalone = '沒有所屬項目集的項目';
|
||||
$lang->program->tips = '提示';
|
||||
$lang->program->setTeam = '設置團隊';
|
||||
$lang->program->goback = '返回項目列表';
|
||||
|
||||
/* Fields. */
|
||||
$lang->program->common = '項目集';
|
||||
$lang->program->project = '項目';
|
||||
$lang->program->stage = '階段';
|
||||
$lang->program->PRJName = '項目名稱';
|
||||
$lang->program->PRJModel = '管理類型';
|
||||
@@ -148,6 +153,7 @@ $lang->program->cannotCancelCat = "該項目下已經有子項目,無法取
|
||||
$lang->program->parentBeginEnd = "父項目起止時間:%s ~ %s";
|
||||
$lang->program->childLongTime = "子項目中有長期項目,父項目也應該是長期項目";
|
||||
$lang->program->readjustTime = '重新調整項目起止時間';
|
||||
$lang->program->afterInfo = "項目添加成功,您現在可以進行以下操作:";
|
||||
|
||||
$lang->program->PRJProgramTitle['0'] = '不顯示';
|
||||
$lang->program->PRJProgramTitle['base'] = '只顯示一級項目集';
|
||||
@@ -220,12 +226,12 @@ $lang->program->PGMShowClosed = '顯示已關閉';
|
||||
$lang->program->PGMTips = '修改父項目集,可關聯產品也會發生變化,並且變為必填,如果未選擇任何項目集,則系統會預設創建一個和該項目同名的產品並關聯到該項目。';
|
||||
$lang->program->PGMChangeTips = '修改父項目集後,項目已關聯的產品會被清空,並且項目下的需求、bug等數據也會受影響,是否修改?';
|
||||
|
||||
$lang->program->PGMAclList['open'] = "公開(有項目集視圖權限,即可訪問)";
|
||||
$lang->program->PGMAclList['private'] = "私有(項目集負責人和干係人可訪問)";
|
||||
$lang->program->PGMAclList['open'] = "公開(有項目集視圖權限,即可訪問)";
|
||||
|
||||
$lang->program->subPGMAclList['private'] = "私有(本項目集負責人和干係人可訪問)";
|
||||
$lang->program->subPGMAclList['open'] = "全部公開(有項目集視圖權限,即可訪問)";
|
||||
$lang->program->subPGMAclList['program'] = "項目集內公開 (所有上級項目集負責人和干係人、本項目集負責人和干係人可訪問)";
|
||||
$lang->program->subPGMAclList['private'] = "私有(本項目集負責人和干係人可訪問)";
|
||||
|
||||
$lang->program->PGMAuthList['extend'] = '繼承(取項目權限與組織權限的並集)';
|
||||
$lang->program->PGMAuthList['reset'] = '重新定義(只取項目權限)';
|
||||
|
||||
@@ -534,8 +534,6 @@ class programModel extends model
|
||||
if(empty($program)) return true;
|
||||
if(!isset($program->type)) return true;
|
||||
|
||||
if($program->type == 'program' && ($action == 'prjstart' || $action == 'prjsuspend')) return false;
|
||||
|
||||
if($action == 'pgmclose') return $program->status != 'closed';
|
||||
if($action == 'pgmactivate') return $program->status == 'done' or $program->status == 'closed';
|
||||
|
||||
@@ -838,15 +836,16 @@ class programModel extends model
|
||||
->groupBy('PRJ')
|
||||
->fetchAll('PRJ');
|
||||
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
foreach($projects as $projectID => $project)
|
||||
{
|
||||
$orderBy = $project->model == 'waterfall' ? 'id_asc' : 'id_desc';
|
||||
$project->executions = $this->project->getExecutionStats($projectID, $status, 0, 0, $itemCounts, $orderBy);
|
||||
$orderBy = $project->model == 'waterfall' ? 'path_asc,id_asc' : 'id_desc';
|
||||
$pager = $project->model == 'waterfall' ? null : new pager(0, 1, 1);
|
||||
$project->executions = $this->project->getExecutionStats($projectID, 'undone', 0, 0, 30, $orderBy, $pager);
|
||||
$project->teamCount = isset($teams[$projectID]) ? $teams[$projectID]->count : 0;
|
||||
$project->estimate = isset($estimates[$projectID]) ? $estimates[$projectID]->estimate : 0;
|
||||
$project->parentName = $this->getPRJParentName($project->parent);
|
||||
}
|
||||
|
||||
return $projects;
|
||||
}
|
||||
|
||||
@@ -1077,6 +1076,23 @@ class programModel extends model
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get project by id list.
|
||||
*
|
||||
* @param array $projectIdList
|
||||
* @access public
|
||||
* @return object
|
||||
*/
|
||||
public function getPRJByIdList($projectIdList = array())
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_PROJECT)
|
||||
->where('type')->eq('project')
|
||||
->andWhere('deleted')->eq(0)
|
||||
->andWhere('id')->in($projectIdList)
|
||||
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi()
|
||||
->fetchAll('id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the query.
|
||||
*
|
||||
@@ -1362,7 +1378,7 @@ class programModel extends model
|
||||
}
|
||||
if(empty($linkedProductsCount))
|
||||
{
|
||||
dao::$errors[] = $this->lang->program->productNotEmpty;
|
||||
dao::$errors[] = $this->lang->program->errorNoProducts;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<span class='prefix label-id'><strong><?php echo $program->id;?></strong></span>
|
||||
<?php echo isonlybody() ? ("<span title='$program->name'>" . $program->name . '</span>') : html::a($this->createLink('program', 'view', 'program=' . $program->id), $program->name, '_blank');?>
|
||||
<?php if(!isonlybody()):?>
|
||||
<small><?php echo $lang->arrow . $lang->program->activate;?></small>
|
||||
<small><?php echo $lang->arrow . $lang->project->activate;?></small>
|
||||
<?php endif;?>
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
@@ -59,22 +59,28 @@
|
||||
<td class='text-right c-actions'>
|
||||
<?php if($program->type == 'program'):?>
|
||||
<?php common::printIcon('program', 'PRJStart', "programID=$program->id", $program, 'list', 'play', '', 'iframe', true);?>
|
||||
<?php common::printIcon('program', 'PGMActivate', "programID=$program->id", $program, 'list', 'magic', '', 'iframe', true);?>
|
||||
<?php common::printIcon('program', 'PRJSuspend', "programID=$program->id", $program, 'list', 'pause', '', 'iframe', true);?>
|
||||
<?php common::printIcon('program', 'PGMClose', "programID=$program->id", $program, 'list', 'off', '', 'iframe', true);?>
|
||||
<?php if(common::hasPriv('program', 'PGMEdit')) echo html::a($this->createLink("program", "pgmedit", "programID=$program->id"), "<i class='icon-edit'></i>", '', "class='btn' title='{$lang->edit}'");?>
|
||||
<?php common::printIcon('program', 'PGMCreate', "programID=$program->id", '', 'list', 'treemap-alt', '', '', '', '', $this->lang->program->PGMChildren);?>
|
||||
<?php if(common::hasPriv('program', 'PGMDelete')) echo html::a($this->createLink("program", "pgmdelete", "programID=$program->id"), "<i class='icon-trash'></i>", 'hiddenwin', "class='btn' title='{$lang->delete}'");?>
|
||||
<button type='button' class='btn icon-ellipsis-v' data-toggle='context-dropdown'></button>
|
||||
<div class='dropdown-menu pull-right w-120px'>
|
||||
<?php common::printIcon('program', 'PGMActivate', "programID=$program->id", $program, 'list', 'magic', '', 'iframe btn-action', true);?>
|
||||
<?php common::printIcon('program', 'PRJSuspend', "programID=$program->id", $program, 'list', 'pause', '', 'iframe btn-action', true);?>
|
||||
<?php common::printIcon('program', 'PGMClose', "programID=$program->id", $program, 'list', 'off', '', 'iframe btn-action', true);?>
|
||||
<?php if(common::hasPriv('program', 'PGMDelete')) echo html::a($this->createLink("program", "pgmdelete", "programID=$program->id"), "<i class='icon-trash'></i>", 'hiddenwin', "class='btn btn-action' title='{$lang->delete}'");?>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<?php common::printIcon('program', 'PRJGroup', "programID=$program->id", $program, 'list', 'icon icon-lock');?>
|
||||
<?php common::printIcon('program', 'PRJManageMembers', "programID=$program->id", $program, 'list', 'persons');?>
|
||||
<?php common::printIcon('program', 'PRJStart', "programID=$program->id", $program, 'list', 'play', '', 'iframe', true);?>
|
||||
<?php common::printIcon('program', 'PRJActivate', "programID=$program->id", $program, 'list', 'magic', '', 'iframe', true);?>
|
||||
<?php common::printIcon('program', 'PRJSuspend', "programID=$program->id", $program, 'list', 'pause', '', 'iframe', true);?>
|
||||
<?php common::printIcon('program', 'PRJClose', "programID=$program->id", $program, 'list', 'off', '', 'iframe', true);?>
|
||||
<?php if(common::hasPriv('program','PRJEdit')) echo html::a($this->createLink("program", "prjedit", "programID=$program->id"), "<i class='icon-edit'></i>", '', "class='btn' title='{$lang->edit}'");?>
|
||||
<?php common::printIcon('program', 'PRJCreate', "programID=$program->id", '', 'list', 'treemap-alt', '', 'disabled', '', '', $this->lang->program->PGMChildren);?>
|
||||
<?php if(common::hasPriv('program','PRJDelete')) echo html::a($this->createLink("program", "prjdelete", "programID=$program->id"), "<i class='icon-trash'></i>", 'hiddenwin', "class='btn' title='{$lang->delete}'");?>
|
||||
<button type='button' class='btn icon-ellipsis-v' data-toggle='context-dropdown'></button>
|
||||
<div class='dropdown-menu pull-right w-120px'>
|
||||
<?php common::printIcon('program', 'PRJActivate', "programID=$program->id", $program, 'list', 'magic', '', 'iframe btn-action', true);?>
|
||||
<?php common::printIcon('program', 'PRJSuspend', "programID=$program->id", $program, 'list', 'pause', '', 'iframe btn-action', true);?>
|
||||
<?php common::printIcon('program', 'PRJClose', "programID=$program->id", $program, 'list', 'off', '', 'iframe btn-action', true);?>
|
||||
<?php if(common::hasPriv('program','PRJDelete')) echo html::a($this->createLink("program", "prjdelete", "programID=$program->id"), "<i class='icon-trash'></i>", 'hiddenwin', "class='btn btn-action' title='{$lang->delete}'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -157,6 +157,12 @@ else
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php $this->printExtendFields('', 'table');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->program->PRJStoryConcept;?></th>
|
||||
<td>
|
||||
<?php echo html::select('storyConcept', $lang->custom->URSRList, zget($config->custom, 'URSRName', 1), "class='form-control chosen'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->program->PRJDesc;?></th>
|
||||
<td colspan='3'>
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<div class='col-sm-4'>
|
||||
<?php $hasBranch = $product->type != 'normal' and isset($branchGroups[$product->id]);?>
|
||||
<div class="input-group<?php if($hasBranch) echo ' has-branch';?>">
|
||||
<?php echo html::select("products[$i]", $allProducts, $product->id, "class='form-control chosen' onchange='loadBranches(this)' data-last='" . $product->id . "'");?>
|
||||
<?php echo html::select("products[$i]", $allProducts, $product->id, "class='form-control chosen' data-placeholder={$lang->program->errorNoProducts} onchange='loadBranches(this)' data-last='" . $product->id . "'");?>
|
||||
<span class='input-group-addon fix-border'></span>
|
||||
<?php if($hasBranch) echo html::select("branch[$i]", $branchGroups[$product->id], $product->branch, "class='form-control chosen' onchange=\"loadPlans('#products{$i}', this.value)\"");?>
|
||||
</div>
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
<?php $i ++; $memberCount ++;?>
|
||||
<?php endfor;?>
|
||||
</tbody>
|
||||
<tfoot><tr><td colspan='6' class='text-center form-actions'><?php echo html::submitButton() . ' ' . html::backButton(); ?></td></tr></tfoot>
|
||||
<tfoot><tr><td colspan='6' class='text-center form-actions'><?php echo html::submitButton() . ' ' . html::a($this->createLink('program', 'PRJBrowse', '', '', '', $project->id), $lang->goback, '', 'class="btn btn-back btn-wide"');?></td></tr></tfoot>
|
||||
</table>
|
||||
<?php js::set('i', $i);?>
|
||||
</form>
|
||||
|
||||
@@ -52,15 +52,16 @@ class programplanModel extends model
|
||||
*/
|
||||
public function getStage($projectID = 0, $productID = 0, $browseType = 'all', $orderBy = 'id_asc')
|
||||
{
|
||||
$executions = empty($projectID) ? array() : $this->loadModel('product')->getExecutionPairsByProduct($productID);
|
||||
if(empty($projectID) || empty($productID)) return array();
|
||||
|
||||
$plans = $this->dao->select('*')->from(TABLE_PROJECT)
|
||||
->where('type')->eq('stage')
|
||||
->beginIF($browseType == 'all')->andWhere('project')->eq($projectID)->fi()
|
||||
->beginIF($browseType == 'parent')->andWhere('parent')->eq($projectID)->fi()
|
||||
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi()
|
||||
->beginIF($productID)->andWhere('id')->in(array_keys($executions))->fi()
|
||||
->andWhere('deleted')->eq(0)
|
||||
$plans = $this->dao->select('t2.*')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
->where('t1.product')->eq($productID)
|
||||
->andWhere('t2.type')->eq('stage')
|
||||
->beginIF($browseType == 'all')->andWhere('t2.project')->eq($projectID)->fi()
|
||||
->beginIF($browseType == 'parent')->andWhere('t2.parent')->eq($projectID)->fi()
|
||||
->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi()
|
||||
->andWhere('t2.deleted')->eq('0')
|
||||
->orderBy($orderBy)
|
||||
->fetchAll('id');
|
||||
|
||||
@@ -663,6 +664,8 @@ class programplanModel extends model
|
||||
|
||||
$childrenTotalPercent = $this->getTotalPercent($parentPlan, true);
|
||||
$childrenTotalPercent = $plan->parent == $oldPlan->parent ? ($childrenTotalPercent - $oldPlan->percent + $plan->percent) : ($childrenTotalPercent + $plan->percent);
|
||||
|
||||
/* The sum of the workload of the child phases cannot be greater than that of the parent phase. */
|
||||
if($childrenTotalPercent > $parentPercent)
|
||||
{
|
||||
dao::$errors['message'][] = sprintf($this->lang->programplan->error->parentWorkload, $parentPercent . '%');
|
||||
@@ -672,12 +675,15 @@ class programplanModel extends model
|
||||
/* If child plan has milestone, update parent plan set milestone eq 0 . */
|
||||
if($plan->milestone and $parentPlan->milestone) $this->dao->update(TABLE_PROJECT)->set('milestone')->eq(0)->where('id')->eq($oldPlan->parent)->exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The workload of the parent plan cannot exceed 100%. */
|
||||
$oldPlan->parent = $plan->parent;
|
||||
$totalPercent = $this->getTotalPercent($oldPlan);
|
||||
$totalPercent = $totalPercent + $plan->percent;
|
||||
if($totalPercent > 100) return dao::$errors['percent'][] = $this->lang->programplan->error->percentOver;
|
||||
}
|
||||
|
||||
/* The workload of the parent plan cannot exceed 100%. */
|
||||
$oldPlan->parent = $plan->parent;
|
||||
$totalPercent = $this->getTotalPercent($oldPlan);
|
||||
$totalPercent = $totalPercent + $plan->percent;
|
||||
if($totalPercent > 100) return dao::$errors['percent'][] = $this->lang->programplan->error->percentOver;
|
||||
|
||||
/* Set planDuration and realDuration. */
|
||||
$plan->planDuration = $this->getDuration($plan->begin, $plan->end);
|
||||
@@ -798,14 +804,16 @@ class programplanModel extends model
|
||||
break;
|
||||
case 'actions':
|
||||
common::printIcon('project', 'start', "projectID={$plan->id}", $plan, 'list', '', '', 'iframe', true);
|
||||
common::printIcon('task', 'create', "projectID={$plan->id}", $plan, 'list');
|
||||
if($this->isCreateTask($plan->id))
|
||||
$class = !empty($plan->children) ? 'disabled' : '';
|
||||
common::printIcon('task', 'create', "projectID={$plan->id}", $plan, 'list', '', '', $class);
|
||||
|
||||
if($plan->grade == 1 && $this->isCreateTask($plan->id))
|
||||
{
|
||||
common::printIcon('programplan', 'create', "program={$plan->parent}&productID=$plan->product&planID=$plan->id", $plan, 'list', 'treemap', '', '', '', '', $this->lang->programplan->createSubPlan);
|
||||
}
|
||||
else
|
||||
{
|
||||
$disabled = ($plan->parent == 0) ? ' disabled' : '';
|
||||
$disabled = ($plan->grade == 2) ? ' disabled' : '';
|
||||
echo html::a('javascript:alert("' . $this->lang->programplan->error->createdTask . '");', '<i class="icon-programplan-create icon-treemap"></i>', '', 'class="btn ' . $disabled . '"');
|
||||
}
|
||||
|
||||
|
||||
+22
-11
@@ -1084,6 +1084,8 @@ class project extends control
|
||||
public function create($productID = '', $projectID = '', $copyProjectID = '', $planID = 0, $confirm = 'no')
|
||||
{
|
||||
$this->app->loadLang('program');
|
||||
$this->app->loadLang('stage');
|
||||
$this->app->loadLang('programplan');
|
||||
if($projectID)
|
||||
{
|
||||
if(!empty($planID))
|
||||
@@ -1204,6 +1206,7 @@ class project extends control
|
||||
$this->view->copyProjectID = $copyProjectID;
|
||||
$this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($products));
|
||||
$this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed');
|
||||
$this->view->isStage = $project->model == 'waterfall' ? true : false;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1220,6 +1223,8 @@ class project extends control
|
||||
public function edit($projectID, $action = 'edit', $extra = '')
|
||||
{
|
||||
$this->app->loadLang('program');
|
||||
$this->app->loadLang('stage');
|
||||
$this->app->loadLang('programplan');
|
||||
$browseProjectLink = $this->createLink('project', 'browse', "projectID=$projectID");
|
||||
if(!empty($_POST))
|
||||
{
|
||||
@@ -1323,6 +1328,7 @@ class project extends control
|
||||
$this->view->linkedProducts = $linkedProducts;
|
||||
$this->view->productPlans = $productPlans;
|
||||
$this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($linkedProducts), '', $linkedBranches);
|
||||
$this->view->isStage = $PRJData->model == 'waterfall' ? true : false;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -1335,6 +1341,8 @@ class project extends control
|
||||
*/
|
||||
public function batchEdit($projectID = 0)
|
||||
{
|
||||
$this->app->loadLang('stage');
|
||||
|
||||
if($this->post->names)
|
||||
{
|
||||
$allChanges = $this->project->batchUpdate();
|
||||
@@ -1383,6 +1391,8 @@ class project extends control
|
||||
$rdUsers = $this->user->getPairs('noclosed|nodeleted|devfirst', $appendRdUsers, $this->config->maxCount);
|
||||
if(!empty($this->config->user->moreLink)) $this->config->moreLinks["RD"] = $this->config->user->moreLink;
|
||||
|
||||
$PRJData = $this->project->getById($this->session->PRJ);
|
||||
|
||||
$this->view->title = $this->lang->project->batchEdit;
|
||||
$this->view->position[] = $this->lang->project->batchEdit;
|
||||
$this->view->projectIDList = $projectIDList;
|
||||
@@ -1391,6 +1401,7 @@ class project extends control
|
||||
$this->view->poUsers = $poUsers;
|
||||
$this->view->qdUsers = $qdUsers;
|
||||
$this->view->rdUsers = $rdUsers;
|
||||
$this->view->isStage = $PRJData->model == 'waterfall' ? true : false;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -2458,7 +2469,7 @@ class project extends control
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function all($status = 'undone', $projectID = 0, $orderBy = 'order_desc', $productID = 0, $recTotal = 0, $recPerPage = 10, $pageID = 1)
|
||||
public function all($status = 'all', $projectID = 0, $orderBy = 'path_asc,id_asc', $productID = 0, $recTotal = 0, $recPerPage = 10, $pageID = 1)
|
||||
{
|
||||
$this->app->loadLang('my');
|
||||
$this->app->loadLang('programplan');
|
||||
@@ -2473,17 +2484,17 @@ class project extends control
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
$this->view->title = $this->lang->project->allProject;
|
||||
$this->view->position[] = $this->lang->project->allProject;
|
||||
$this->view->title = $this->lang->project->allProject;
|
||||
$this->view->position[] = $this->lang->project->allProject;
|
||||
|
||||
$this->view->projectStats = $this->project->getExecutionStats($this->session->PRJ, $status == 'byproduct' ? 'all' : $status, $productID, 0, 30, $orderBy, $pager);
|
||||
$this->view->products = array(0 => $this->lang->product->select) + $this->loadModel('product')->getProductPairsByProject($this->session->PRJ);
|
||||
$this->view->productID = $productID;
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->pager = $pager;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->status = $status;
|
||||
$this->view->executionStats = $this->project->getExecutionStats($this->session->PRJ, $status, $productID, 0, 30, $orderBy, $pager);
|
||||
$this->view->products = array(0 => $this->lang->product->select) + $this->loadModel('product')->getProductPairsByProject($this->session->PRJ);
|
||||
$this->view->productID = $productID;
|
||||
$this->view->projectID = $projectID;
|
||||
$this->view->pager = $pager;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->status = $status;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ $lang->project->createStory = "Story erstellen";
|
||||
$lang->project->all = 'Alle';
|
||||
$lang->project->undone = 'Unabgeschlossen ';
|
||||
$lang->project->unclosed = 'Geschlossen';
|
||||
$lang->project->typeDesc = "Keine {$lang->storyCommon}, Bug, Build, Testaufgabe oder ist bei OPS erlaubt";
|
||||
$lang->project->typeDesc = "Keine {$lang->productSRCommon}, Bug, Build, Testaufgabe oder ist bei OPS erlaubt";
|
||||
$lang->project->mine = 'Meine Zuständigkeit: ';
|
||||
$lang->project->other = 'Andere:';
|
||||
$lang->project->deleted = 'Gelöscht';
|
||||
@@ -342,6 +342,11 @@ $lang->printKanban->taskStatus = 'Status';
|
||||
$lang->printKanban->typeList['all'] = 'Alle';
|
||||
$lang->printKanban->typeList['increment'] = 'Erhöhen';
|
||||
|
||||
$lang->project->typeList[''] = '';
|
||||
$lang->project->typeList['stage'] = 'Stage';
|
||||
$lang->project->typeList['sprint'] = $lang->projectCommon;
|
||||
$lang->project->typeList['kanban'] = 'Kanban';
|
||||
|
||||
$lang->project->featureBar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
|
||||
@@ -62,7 +62,7 @@ $lang->project->createStory = "Create Story";
|
||||
$lang->project->all = "All {$lang->projectCommon}s";
|
||||
$lang->project->undone = 'Unfinished ';
|
||||
$lang->project->unclosed = 'Unclosed';
|
||||
$lang->project->typeDesc = "OPS {$lang->projectCommon} has no {$lang->storyCommon}, Bug, Build, or Test features.";
|
||||
$lang->project->typeDesc = "OPS {$lang->projectCommon} has no {$lang->productSRCommon}, Bug, Build, or Test features.";
|
||||
$lang->project->mine = 'Mine: ';
|
||||
$lang->project->other = 'Others:';
|
||||
$lang->project->deleted = 'Deleted';
|
||||
@@ -342,6 +342,11 @@ $lang->printKanban->taskStatus = 'Status';
|
||||
$lang->printKanban->typeList['all'] = 'All';
|
||||
$lang->printKanban->typeList['increment'] = 'Increment';
|
||||
|
||||
$lang->project->typeList[''] = '';
|
||||
$lang->project->typeList['stage'] = 'Stage';
|
||||
$lang->project->typeList['sprint'] = $lang->projectCommon;
|
||||
$lang->project->typeList['kanban'] = 'Kanban';
|
||||
|
||||
$lang->project->featureBar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
|
||||
@@ -62,7 +62,7 @@ $lang->project->createStory = "Créer une Story";
|
||||
$lang->project->all = "Tous les {$lang->projectCommon}s";
|
||||
$lang->project->undone = 'Non Terminé';
|
||||
$lang->project->unclosed = 'Non Fermées';
|
||||
$lang->project->typeDesc = "Aucune {$lang->storyCommon}, bug, build, test, ou graphe d'atterrissage n'est disponible";
|
||||
$lang->project->typeDesc = "Aucune {$lang->productSRCommon}, bug, build, test, ou graphe d'atterrissage n'est disponible";
|
||||
$lang->project->mine = 'A Moi: ';
|
||||
$lang->project->other = 'Autres:';
|
||||
$lang->project->deleted = 'Supprimé';
|
||||
@@ -342,6 +342,11 @@ $lang->printKanban->taskStatus = 'Statut';
|
||||
$lang->printKanban->typeList['all'] = 'Tout';
|
||||
$lang->printKanban->typeList['increment'] = 'Incrément';
|
||||
|
||||
$lang->project->typeList[''] = '';
|
||||
$lang->project->typeList['stage'] = 'Stage';
|
||||
$lang->project->typeList['sprint'] = $lang->projectCommon;
|
||||
$lang->project->typeList['kanban'] = 'Kanban';
|
||||
|
||||
$lang->project->featureBar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
|
||||
@@ -342,6 +342,11 @@ $lang->printKanban->taskStatus = 'Tình trạng';
|
||||
$lang->printKanban->typeList['all'] = 'Tất cả';
|
||||
$lang->printKanban->typeList['increment'] = 'Tăng dần';
|
||||
|
||||
$lang->project->typeList[''] = '';
|
||||
$lang->project->typeList['stage'] = 'Stage';
|
||||
$lang->project->typeList['sprint'] = $lang->projectCommon;
|
||||
$lang->project->typeList['kanban'] = 'Kanban';
|
||||
|
||||
$lang->project->featureBar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
|
||||
@@ -58,11 +58,11 @@ $lang->project->progress = '进度';
|
||||
$lang->project->hours = '预计 %s 消耗 %s 剩余 %s';
|
||||
$lang->project->viewBug = '查看bug';
|
||||
$lang->project->noProduct = "无{$lang->productCommon}{$lang->projectCommon}";
|
||||
$lang->project->createStory = "添加{$lang->storyCommon}";
|
||||
$lang->project->createStory = "添加{$lang->productSRCommon}";
|
||||
$lang->project->all = '所有';
|
||||
$lang->project->undone = '未完成';
|
||||
$lang->project->unclosed = '未关闭';
|
||||
$lang->project->typeDesc = "运维{$lang->projectCommon}没有{$lang->storyCommon}、bug、版本、测试功能。";
|
||||
$lang->project->typeDesc = "运维{$lang->projectCommon}没有{$lang->productSRCommon}、bug、版本、测试功能。";
|
||||
$lang->project->mine = '我负责:';
|
||||
$lang->project->other = '其他:';
|
||||
$lang->project->deleted = '已删除';
|
||||
@@ -126,7 +126,7 @@ $lang->project->burnByList['storyPoint'] = '按故事点查看';
|
||||
$lang->project->index = "{$lang->projectCommon}主页";
|
||||
$lang->project->task = '任务列表';
|
||||
$lang->project->groupTask = '分组浏览任务';
|
||||
$lang->project->story = "{$lang->storyCommon}列表";
|
||||
$lang->project->story = "{$lang->productSRCommon}列表";
|
||||
$lang->project->bug = 'Bug列表';
|
||||
$lang->project->dynamic = '动态';
|
||||
$lang->project->latestDynamic = '最新动态';
|
||||
@@ -140,10 +140,10 @@ $lang->project->team = '团队成员';
|
||||
$lang->project->doc = '文档列表';
|
||||
$lang->project->doclib = '文档库列表';
|
||||
$lang->project->manageProducts = '关联' . $lang->productCommon;
|
||||
$lang->project->linkStory = "关联{$lang->storyCommon}";
|
||||
$lang->project->linkStory = "关联{$lang->productSRCommon}";
|
||||
$lang->project->linkStoryByPlan = "按照{$lang->planCommon}关联";
|
||||
$lang->project->linkPlan = "关联{$lang->planCommon}";
|
||||
$lang->project->unlinkStoryTasks = "未关联{$lang->storyCommon}任务";
|
||||
$lang->project->unlinkStoryTasks = "未关联{$lang->productSRCommon}任务";
|
||||
$lang->project->linkedProducts = '已关联';
|
||||
$lang->project->unlinkedProducts = '未关联';
|
||||
$lang->project->view = "{$lang->projectCommon}概况";
|
||||
@@ -167,21 +167,21 @@ $lang->project->edit = "编辑{$lang->projectCommon}";
|
||||
$lang->project->batchEdit = "批量编辑";
|
||||
$lang->project->manageMembers = '团队管理';
|
||||
$lang->project->unlinkMember = '移除成员';
|
||||
$lang->project->unlinkStory = "移除{$lang->storyCommon}";
|
||||
$lang->project->unlinkStoryAB = "移除{$lang->storyCommon}";
|
||||
$lang->project->batchUnlinkStory = "批量移除{$lang->storyCommon}";
|
||||
$lang->project->unlinkStory = "移除{$lang->productSRCommon}";
|
||||
$lang->project->unlinkStoryAB = "移除{$lang->productSRCommon}";
|
||||
$lang->project->batchUnlinkStory = "批量移除{$lang->productSRCommon}";
|
||||
$lang->project->importTask = '转入任务';
|
||||
$lang->project->importPlanStories = "按{$lang->planCommon}关联{$lang->storyCommon}";
|
||||
$lang->project->importPlanStories = "按{$lang->planCommon}关联{$lang->productSRCommon}";
|
||||
$lang->project->importBug = '导入Bug';
|
||||
$lang->project->updateOrder = "{$lang->projectCommon}排序";
|
||||
$lang->project->tree = '树状图';
|
||||
$lang->project->treeTask = '只看任务';
|
||||
$lang->project->treeStory = "只看{$lang->storyCommon}";
|
||||
$lang->project->treeStory = "只看{$lang->productSRCommon}";
|
||||
$lang->project->treeOnlyTask = '树状图只看任务';
|
||||
$lang->project->treeOnlyStory = "树状图只看{$lang->storyCommon}";
|
||||
$lang->project->storyKanban = "{$lang->storyCommon}看板";
|
||||
$lang->project->storySort = "{$lang->storyCommon}排序";
|
||||
$lang->project->importPlanStory = '创建' . $lang->projectCommon . '成功!\n是否导入' . $lang->planCommon . '关联的相关' . $lang->storyCommon . '?';
|
||||
$lang->project->treeOnlyStory = "树状图只看{$lang->productSRCommon}";
|
||||
$lang->project->storyKanban = "{$lang->productSRCommon}看板";
|
||||
$lang->project->storySort = "{$lang->productSRCommon}排序";
|
||||
$lang->project->importPlanStory = '创建' . $lang->projectCommon . '成功!\n是否导入' . $lang->planCommon . '关联的相关' . $lang->productSRCommon . '?';
|
||||
$lang->project->iteration = '版本迭代';
|
||||
$lang->project->iterationInfo = '迭代%s次';
|
||||
$lang->project->viewAll = '查看所有';
|
||||
@@ -201,7 +201,7 @@ $lang->project->statusSelects['closed'] = '已关闭';
|
||||
$lang->project->statusSelects['cancel'] = '已取消';
|
||||
|
||||
$lang->project->groups[''] = '分组查看';
|
||||
$lang->project->groups['story'] = "{$lang->storyCommon}分组";
|
||||
$lang->project->groups['story'] = "{$lang->productSRCommon}分组";
|
||||
$lang->project->groups['status'] = '状态分组';
|
||||
$lang->project->groups['pri'] = '优先级分组';
|
||||
$lang->project->groups['assignedTo'] = '指派给分组';
|
||||
@@ -210,7 +210,7 @@ $lang->project->groups['closedBy'] = '关闭者分组';
|
||||
$lang->project->groups['type'] = '类型分组';
|
||||
|
||||
$lang->project->groupFilter['story']['all'] = '所有';
|
||||
$lang->project->groupFilter['story']['linked'] = "已关联{$lang->storyCommon}的任务";
|
||||
$lang->project->groupFilter['story']['linked'] = "已关联{$lang->productSRCommon}的任务";
|
||||
$lang->project->groupFilter['pri']['all'] = '所有';
|
||||
$lang->project->groupFilter['pri']['noset'] = '未设置';
|
||||
$lang->project->groupFilter['assignedTo']['undone'] = '未完成';
|
||||
@@ -224,7 +224,7 @@ $lang->project->aboveAllProduct = "以上所有{$lang->productCommon}";
|
||||
$lang->project->aboveAllProject = "以上所有{$lang->projectCommon}";
|
||||
|
||||
/* 页面提示。*/
|
||||
$lang->project->linkStoryByPlanTips = "此操作会将所选{$lang->planCommon}下面的{$lang->storyCommon}全部关联到此{$lang->projectCommon}中";
|
||||
$lang->project->linkStoryByPlanTips = "此操作会将所选{$lang->planCommon}下面的{$lang->productSRCommon}全部关联到此{$lang->projectCommon}中";
|
||||
$lang->project->selectProject = "请选择{$lang->projectCommon}";
|
||||
$lang->project->beginAndEnd = '起止时间';
|
||||
$lang->project->begin = '开始日期';
|
||||
@@ -242,9 +242,9 @@ $lang->project->groupSummaryAB = "<div>总任务 <strong>%s : </strong><spa
|
||||
$lang->project->wbs = "分解任务";
|
||||
$lang->project->batchWBS = "批量分解";
|
||||
$lang->project->howToUpdateBurn = "<a href='https://api.zentao.net/goto.php?item=burndown&lang=zh-cn' target='_blank' title='如何更新燃尽图?' class='btn btn-link'>帮助 <i class='icon icon-help'></i></a>";
|
||||
$lang->project->whyNoStories = "看起来没有{$lang->storyCommon}可以关联。请检查下{$lang->projectCommon}关联的{$lang->productCommon}中有没有{$lang->storyCommon},而且要确保它们已经审核通过。";
|
||||
$lang->project->productStories = "{$lang->projectCommon}关联的{$lang->storyCommon}是{$lang->productCommon}{$lang->storyCommon}的子集,并且只有评审通过的{$lang->storyCommon}才能关联。请<a href='%s'>关联{$lang->storyCommon}</a>。";
|
||||
$lang->project->haveDraft = "有%s条草稿状态的{$lang->storyCommon}无法关联到该{$lang->projectCommon}";
|
||||
$lang->project->whyNoStories = "看起来没有{$lang->productSRCommon}可以关联。请检查下{$lang->projectCommon}关联的{$lang->productCommon}中有没有{$lang->productSRCommon},而且要确保它们已经审核通过。";
|
||||
$lang->project->productStories = "{$lang->projectCommon}关联的{$lang->productSRCommon}是{$lang->productCommon}{$lang->productSRCommon}的子集,并且只有评审通过的{$lang->productSRCommon}才能关联。请<a href='%s'>关联{$lang->productSRCommon}</a>。";
|
||||
$lang->project->haveDraft = "有%s条草稿状态的{$lang->productSRCommon}无法关联到该{$lang->projectCommon}";
|
||||
$lang->project->doneProjects = '已结束';
|
||||
$lang->project->selectDept = '选择部门';
|
||||
$lang->project->selectDeptTitle = '选择一个部门的成员';
|
||||
@@ -264,14 +264,14 @@ $lang->project->noMembers = '暂时没有团队成员。';
|
||||
/* 交互提示。*/
|
||||
$lang->project->confirmDelete = "您确定删除{$lang->projectCommon}[%s]吗?";
|
||||
$lang->project->confirmUnlinkMember = "您确定从该{$lang->projectCommon}中移除该用户吗?";
|
||||
$lang->project->confirmUnlinkStory = "您确定从该{$lang->projectCommon}中移除该{$lang->storyCommon}吗?";
|
||||
$lang->project->confirmUnlinkStory = "您确定从该{$lang->projectCommon}中移除该{$lang->productSRCommon}吗?";
|
||||
$lang->project->errorNoLinkedProducts = "该{$lang->projectCommon}没有关联的{$lang->productCommon},系统将转到{$lang->productCommon}关联页面";
|
||||
$lang->project->errorSameProducts = "{$lang->projectCommon}不能关联多个相同的{$lang->productCommon}。";
|
||||
$lang->project->accessDenied = "您无权访问该{$lang->projectCommon}!";
|
||||
$lang->project->tips = '提示';
|
||||
$lang->project->afterInfo = "{$lang->projectCommon}添加成功,您现在可以进行以下操作:";
|
||||
$lang->project->setTeam = '设置团队';
|
||||
$lang->project->linkStory = "关联{$lang->storyCommon}";
|
||||
$lang->project->linkStory = "关联{$lang->productSRCommon}";
|
||||
$lang->project->createTask = '创建任务';
|
||||
$lang->project->goback = "返回任务列表";
|
||||
$lang->project->noweekend = '去除周末';
|
||||
@@ -310,12 +310,12 @@ $lang->project->placeholder->totalLeft = "{$lang->projectCommon}开始时的总
|
||||
$lang->project->selectGroup = new stdclass();
|
||||
$lang->project->selectGroup->done = '(已结束)';
|
||||
|
||||
$lang->project->orderList['order_asc'] = "{$lang->storyCommon}排序正序";
|
||||
$lang->project->orderList['order_desc'] = "{$lang->storyCommon}排序倒序";
|
||||
$lang->project->orderList['pri_asc'] = "{$lang->storyCommon}优先级正序";
|
||||
$lang->project->orderList['pri_desc'] = "{$lang->storyCommon}优先级倒序";
|
||||
$lang->project->orderList['stage_asc'] = "{$lang->storyCommon}阶段正序";
|
||||
$lang->project->orderList['stage_desc'] = "{$lang->storyCommon}阶段倒序";
|
||||
$lang->project->orderList['order_asc'] = "{$lang->productSRCommon}排序正序";
|
||||
$lang->project->orderList['order_desc'] = "{$lang->productSRCommon}排序倒序";
|
||||
$lang->project->orderList['pri_asc'] = "{$lang->productSRCommon}优先级正序";
|
||||
$lang->project->orderList['pri_desc'] = "{$lang->productSRCommon}优先级倒序";
|
||||
$lang->project->orderList['stage_asc'] = "{$lang->productSRCommon}阶段正序";
|
||||
$lang->project->orderList['stage_desc'] = "{$lang->productSRCommon}阶段倒序";
|
||||
|
||||
$lang->project->kanban = "看板";
|
||||
$lang->project->kanbanSetting = "看板设置";
|
||||
@@ -342,12 +342,17 @@ $lang->printKanban->taskStatus = '状态';
|
||||
$lang->printKanban->typeList['all'] = '全部';
|
||||
$lang->printKanban->typeList['increment'] = '增量';
|
||||
|
||||
$lang->project->typeList[''] = '';
|
||||
$lang->project->typeList['stage'] = '阶段';
|
||||
$lang->project->typeList['sprint'] = $lang->projectCommon;
|
||||
$lang->project->typeList['kanban'] = '看板';
|
||||
|
||||
$lang->project->featureBar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
$lang->project->featureBar['task']['myinvolved'] = $lang->project->myInvolved;
|
||||
$lang->project->featureBar['task']['delayed'] = '已延期';
|
||||
$lang->project->featureBar['task']['needconfirm'] = "{$lang->storyCommon}变更";
|
||||
$lang->project->featureBar['task']['needconfirm'] = "{$lang->productSRCommon}变更";
|
||||
$lang->project->featureBar['task']['status'] = $lang->project->statusSelects[''];
|
||||
|
||||
$lang->project->featureBar['all']['all'] = $lang->project->all;
|
||||
@@ -361,4 +366,4 @@ $lang->project->treeLevel = array();
|
||||
$lang->project->treeLevel['all'] = '全部展开';
|
||||
$lang->project->treeLevel['root'] = '全部折叠';
|
||||
$lang->project->treeLevel['task'] = '全部显示';
|
||||
$lang->project->treeLevel['story'] = "只看{$lang->storyCommon}";
|
||||
$lang->project->treeLevel['story'] = "只看{$lang->productSRCommon}";
|
||||
|
||||
@@ -58,11 +58,11 @@ $lang->project->progress = '進度';
|
||||
$lang->project->hours = '預計 %s 消耗 %s 剩餘 %s';
|
||||
$lang->project->viewBug = '查看bug';
|
||||
$lang->project->noProduct = "無{$lang->productCommon}{$lang->projectCommon}";
|
||||
$lang->project->createStory = "添加{$lang->storyCommon}";
|
||||
$lang->project->createStory = "添加{$lang->productSRCommon}";
|
||||
$lang->project->all = '所有';
|
||||
$lang->project->undone = '未完成';
|
||||
$lang->project->unclosed = '未關閉';
|
||||
$lang->project->typeDesc = "運維{$lang->projectCommon}沒有{$lang->storyCommon}、bug、版本、測試功能。";
|
||||
$lang->project->typeDesc = "運維{$lang->projectCommon}沒有{$lang->productSRCommon}、bug、版本、測試功能。";
|
||||
$lang->project->mine = '我負責:';
|
||||
$lang->project->other = '其他:';
|
||||
$lang->project->deleted = '已刪除';
|
||||
@@ -126,7 +126,7 @@ $lang->project->burnByList['storyPoint'] = '按故事點查看';
|
||||
$lang->project->index = "{$lang->projectCommon}主頁";
|
||||
$lang->project->task = '任務列表';
|
||||
$lang->project->groupTask = '分組瀏覽任務';
|
||||
$lang->project->story = "{$lang->storyCommon}列表";
|
||||
$lang->project->story = "{$lang->productSRCommon}列表";
|
||||
$lang->project->bug = 'Bug列表';
|
||||
$lang->project->dynamic = '動態';
|
||||
$lang->project->latestDynamic = '最新動態';
|
||||
@@ -140,10 +140,10 @@ $lang->project->team = '團隊成員';
|
||||
$lang->project->doc = '文檔列表';
|
||||
$lang->project->doclib = '文檔庫列表';
|
||||
$lang->project->manageProducts = '關聯' . $lang->productCommon;
|
||||
$lang->project->linkStory = "關聯{$lang->storyCommon}";
|
||||
$lang->project->linkStory = "關聯{$lang->productSRCommon}";
|
||||
$lang->project->linkStoryByPlan = '按照計劃關聯';
|
||||
$lang->project->linkPlan = '關聯計劃';
|
||||
$lang->project->unlinkStoryTasks = "未關聯{$lang->storyCommon}任務";
|
||||
$lang->project->unlinkStoryTasks = "未關聯{$lang->productSRCommon}任務";
|
||||
$lang->project->linkedProducts = '已關聯';
|
||||
$lang->project->unlinkedProducts = '未關聯';
|
||||
$lang->project->view = "{$lang->projectCommon}概況";
|
||||
@@ -167,21 +167,21 @@ $lang->project->edit = "編輯{$lang->projectCommon}";
|
||||
$lang->project->batchEdit = "批量編輯";
|
||||
$lang->project->manageMembers = '團隊管理';
|
||||
$lang->project->unlinkMember = '移除成員';
|
||||
$lang->project->unlinkStory = "移除{$lang->storyCommon}";
|
||||
$lang->project->unlinkStoryAB = "移除{$lang->storyCommon}";
|
||||
$lang->project->batchUnlinkStory = "批量移除{$lang->storyCommon}";
|
||||
$lang->project->unlinkStory = "移除{$lang->productSRCommon}";
|
||||
$lang->project->unlinkStoryAB = "移除{$lang->productSRCommon}";
|
||||
$lang->project->batchUnlinkStory = "批量移除{$lang->productSRCommon}";
|
||||
$lang->project->importTask = '轉入任務';
|
||||
$lang->project->importPlanStories = "按計劃關聯{$lang->storyCommon}";
|
||||
$lang->project->importPlanStories = "按計劃關聯{$lang->productSRCommon}";
|
||||
$lang->project->importBug = '導入Bug';
|
||||
$lang->project->updateOrder = "{$lang->projectCommon}排序";
|
||||
$lang->project->tree = '樹狀圖';
|
||||
$lang->project->treeTask = '只看任務';
|
||||
$lang->project->treeStory = "只看{$lang->storyCommon}";
|
||||
$lang->project->treeStory = "只看{$lang->productSRCommon}";
|
||||
$lang->project->treeOnlyTask = '樹狀圖只看任務';
|
||||
$lang->project->treeOnlyStory = "樹狀圖只看{$lang->storyCommon}";
|
||||
$lang->project->storyKanban = "{$lang->storyCommon}看板";
|
||||
$lang->project->storySort = "{$lang->storyCommon}排序";
|
||||
$lang->project->importPlanStory = '創建' . $lang->projectCommon . '成功!\n是否導入計劃關聯的相關' . $lang->storyCommon . '?';
|
||||
$lang->project->treeOnlyStory = "樹狀圖只看{$lang->productSRCommon}";
|
||||
$lang->project->storyKanban = "{$lang->productSRCommon}看板";
|
||||
$lang->project->storySort = "{$lang->productSRCommon}排序";
|
||||
$lang->project->importPlanStory = '創建' . $lang->projectCommon . '成功!\n是否導入計劃關聯的相關' . $lang->productSRCommon . '?';
|
||||
$lang->project->iteration = '版本迭代';
|
||||
$lang->project->iterationInfo = '迭代%s次';
|
||||
$lang->project->viewAll = '查看所有';
|
||||
@@ -201,7 +201,7 @@ $lang->project->statusSelects['closed'] = '已關閉';
|
||||
$lang->project->statusSelects['cancel'] = '已取消';
|
||||
|
||||
$lang->project->groups[''] = '分組查看';
|
||||
$lang->project->groups['story'] = "{$lang->storyCommon}分組";
|
||||
$lang->project->groups['story'] = "{$lang->productSRCommon}分組";
|
||||
$lang->project->groups['status'] = '狀態分組';
|
||||
$lang->project->groups['pri'] = '優先順序分組';
|
||||
$lang->project->groups['assignedTo'] = '指派給分組';
|
||||
@@ -210,7 +210,7 @@ $lang->project->groups['closedBy'] = '關閉者分組';
|
||||
$lang->project->groups['type'] = '類型分組';
|
||||
|
||||
$lang->project->groupFilter['story']['all'] = '所有';
|
||||
$lang->project->groupFilter['story']['linked'] = "已關聯{$lang->storyCommon}的任務";
|
||||
$lang->project->groupFilter['story']['linked'] = "已關聯{$lang->productSRCommon}的任務";
|
||||
$lang->project->groupFilter['pri']['all'] = '所有';
|
||||
$lang->project->groupFilter['pri']['noset'] = '未設置';
|
||||
$lang->project->groupFilter['assignedTo']['undone'] = '未完成';
|
||||
@@ -224,7 +224,7 @@ $lang->project->aboveAllProduct = "以上所有{$lang->productCommon}";
|
||||
$lang->project->aboveAllProject = "以上所有{$lang->projectCommon}";
|
||||
|
||||
/* 頁面提示。*/
|
||||
$lang->project->linkStoryByPlanTips = "此操作會將所選計划下面的{$lang->storyCommon}全部關聯到此{$lang->projectCommon}中";
|
||||
$lang->project->linkStoryByPlanTips = "此操作會將所選計划下面的{$lang->productSRCommon}全部關聯到此{$lang->projectCommon}中";
|
||||
$lang->project->selectProject = "請選擇{$lang->projectCommon}";
|
||||
$lang->project->beginAndEnd = '起止時間';
|
||||
$lang->project->begin = '開始日期';
|
||||
@@ -242,9 +242,9 @@ $lang->project->groupSummaryAB = "<div>總任務 <strong>%s : </strong><spa
|
||||
$lang->project->wbs = "分解任務";
|
||||
$lang->project->batchWBS = "批量分解";
|
||||
$lang->project->howToUpdateBurn = "<a href='https://api.zentao.net/goto.php?item=burndown&lang=zh-tw' target='_blank' title='如何更新燃盡圖?' class='btn btn-link'>幫助 <i class='icon icon-help'></i></a>";
|
||||
$lang->project->whyNoStories = "看起來沒有{$lang->storyCommon}可以關聯。請檢查下{$lang->projectCommon}關聯的{$lang->productCommon}中有沒有{$lang->storyCommon},而且要確保它們已經審核通過。";
|
||||
$lang->project->productStories = "{$lang->projectCommon}關聯的{$lang->storyCommon}是{$lang->productCommon}{$lang->storyCommon}的子集,並且只有評審通過的{$lang->storyCommon}才能關聯。請<a href='%s'>關聯{$lang->storyCommon}</a>。";
|
||||
$lang->project->haveDraft = "有%s條草稿狀態的{$lang->storyCommon}無法關聯到該{$lang->projectCommon}";
|
||||
$lang->project->whyNoStories = "看起來沒有{$lang->productSRCommon}可以關聯。請檢查下{$lang->projectCommon}關聯的{$lang->productCommon}中有沒有{$lang->productSRCommon},而且要確保它們已經審核通過。";
|
||||
$lang->project->productStories = "{$lang->projectCommon}關聯的{$lang->productSRCommon}是{$lang->productCommon}{$lang->productSRCommon}的子集,並且只有評審通過的{$lang->productSRCommon}才能關聯。請<a href='%s'>關聯{$lang->productSRCommon}</a>。";
|
||||
$lang->project->haveDraft = "有%s條草稿狀態的{$lang->productSRCommon}無法關聯到該{$lang->projectCommon}";
|
||||
$lang->project->doneProjects = '已結束';
|
||||
$lang->project->selectDept = '選擇部門';
|
||||
$lang->project->selectDeptTitle = '選擇一個部門的成員';
|
||||
@@ -264,14 +264,14 @@ $lang->project->noMembers = '暫時沒有團隊成員。';
|
||||
/* 交互提示。*/
|
||||
$lang->project->confirmDelete = "您確定刪除{$lang->projectCommon}[%s]嗎?";
|
||||
$lang->project->confirmUnlinkMember = "您確定從該{$lang->projectCommon}中移除該用戶嗎?";
|
||||
$lang->project->confirmUnlinkStory = "您確定從該{$lang->projectCommon}中移除該{$lang->storyCommon}嗎?";
|
||||
$lang->project->confirmUnlinkStory = "您確定從該{$lang->projectCommon}中移除該{$lang->productSRCommon}嗎?";
|
||||
$lang->project->errorNoLinkedProducts = "該{$lang->projectCommon}沒有關聯的{$lang->productCommon},系統將轉到{$lang->productCommon}關聯頁面";
|
||||
$lang->project->errorSameProducts = "{$lang->projectCommon}不能關聯多個相同的{$lang->productCommon}。";
|
||||
$lang->project->accessDenied = "您無權訪問該{$lang->projectCommon}!";
|
||||
$lang->project->tips = '提示';
|
||||
$lang->project->afterInfo = "{$lang->projectCommon}添加成功,您現在可以進行以下操作:";
|
||||
$lang->project->setTeam = '設置團隊';
|
||||
$lang->project->linkStory = "關聯{$lang->storyCommon}";
|
||||
$lang->project->linkStory = "關聯{$lang->productSRCommon}";
|
||||
$lang->project->createTask = '創建任務';
|
||||
$lang->project->goback = "返回任務列表";
|
||||
$lang->project->noweekend = '去除周末';
|
||||
@@ -310,12 +310,12 @@ $lang->project->placeholder->totalLeft = "{$lang->projectCommon}開始時的總
|
||||
$lang->project->selectGroup = new stdclass();
|
||||
$lang->project->selectGroup->done = '(已結束)';
|
||||
|
||||
$lang->project->orderList['order_asc'] = "{$lang->storyCommon}排序正序";
|
||||
$lang->project->orderList['order_desc'] = "{$lang->storyCommon}排序倒序";
|
||||
$lang->project->orderList['pri_asc'] = "{$lang->storyCommon}優先順序正序";
|
||||
$lang->project->orderList['pri_desc'] = "{$lang->storyCommon}優先順序倒序";
|
||||
$lang->project->orderList['stage_asc'] = "{$lang->storyCommon}階段正序";
|
||||
$lang->project->orderList['stage_desc'] = "{$lang->storyCommon}階段倒序";
|
||||
$lang->project->orderList['order_asc'] = "{$lang->productSRCommon}排序正序";
|
||||
$lang->project->orderList['order_desc'] = "{$lang->productSRCommon}排序倒序";
|
||||
$lang->project->orderList['pri_asc'] = "{$lang->productSRCommon}優先順序正序";
|
||||
$lang->project->orderList['pri_desc'] = "{$lang->productSRCommon}優先順序倒序";
|
||||
$lang->project->orderList['stage_asc'] = "{$lang->productSRCommon}階段正序";
|
||||
$lang->project->orderList['stage_desc'] = "{$lang->productSRCommon}階段倒序";
|
||||
|
||||
$lang->project->kanban = "看板";
|
||||
$lang->project->kanbanSetting = "看板設置";
|
||||
@@ -342,12 +342,17 @@ $lang->printKanban->taskStatus = '狀態';
|
||||
$lang->printKanban->typeList['all'] = '全部';
|
||||
$lang->printKanban->typeList['increment'] = '增量';
|
||||
|
||||
$lang->project->typeList[''] = '';
|
||||
$lang->project->typeList['stage'] = '階段';
|
||||
$lang->project->typeList['sprint'] = $lang->projectCommon;
|
||||
$lang->project->typeList['kanban'] = '看板';
|
||||
|
||||
$lang->project->featureBar['task']['all'] = $lang->project->allTasks;
|
||||
$lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed;
|
||||
$lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe;
|
||||
$lang->project->featureBar['task']['myinvolved'] = $lang->project->myInvolved;
|
||||
$lang->project->featureBar['task']['delayed'] = '已延期';
|
||||
$lang->project->featureBar['task']['needconfirm'] = "{$lang->storyCommon}變更";
|
||||
$lang->project->featureBar['task']['needconfirm'] = "{$lang->productSRCommon}變更";
|
||||
$lang->project->featureBar['task']['status'] = $lang->project->statusSelects[''];
|
||||
|
||||
$lang->project->featureBar['all']['all'] = $lang->project->all;
|
||||
@@ -361,4 +366,4 @@ $lang->project->treeLevel = array();
|
||||
$lang->project->treeLevel['all'] = '全部展開';
|
||||
$lang->project->treeLevel['root'] = '全部摺疊';
|
||||
$lang->project->treeLevel['task'] = '全部顯示';
|
||||
$lang->project->treeLevel['story'] = "只看{$lang->storyCommon}";
|
||||
$lang->project->treeLevel['story'] = "只看{$lang->productSRCommon}";
|
||||
|
||||
+72
-40
@@ -332,6 +332,17 @@ class projectModel extends model
|
||||
->remove('products, workDays, delta, branch, uid, plans')
|
||||
->get();
|
||||
|
||||
/* Check the workload format. */
|
||||
if(!empty($sprint->percent) and !preg_match("/^[0-9]+(.[0-9]{1,3})?$/", $sprint->percent))
|
||||
{
|
||||
dao::$errors['percent'] = $this->lang->programplan->error->percentNumber;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Set planDuration and realDuration. */
|
||||
$sprint->planDuration = $this->loadModel('programplan')->getDuration($sprint->begin, $sprint->end);
|
||||
if(!empty($sprint->realBegan) and !empty($sprint->realEnd)) $sprint->realDuration = $this->loadModel('programplan')->getDuration($sprint->realBegan, $sprint->realEnd);
|
||||
|
||||
$sprint = $this->loadModel('file')->processImgURL($sprint, $this->config->project->editor->create['id'], $this->post->uid);
|
||||
$this->dao->insert(TABLE_PROJECT)->data($sprint)
|
||||
->autoCheck($skipFields = 'begin,end')
|
||||
@@ -433,6 +444,18 @@ class projectModel extends model
|
||||
->get();
|
||||
|
||||
$project = $this->loadModel('file')->processImgURL($project, $this->config->project->editor->edit['id'], $this->post->uid);
|
||||
|
||||
/* Check the workload format. */
|
||||
if(!empty($project->percent) and !preg_match("/^[0-9]+(.[0-9]{1,3})?$/", $project->percent))
|
||||
{
|
||||
dao::$errors['percent'] = $this->lang->programplan->error->percentNumber;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Set planDuration and realDuration. */
|
||||
$project->planDuration = $this->loadModel('programplan')->getDuration($project->begin, $project->end);
|
||||
if(!empty($project->realBegan) and !empty($project->realEnd)) $project->realDuration = $this->loadModel('programplan')->getDuration($project->realBegan, $project->realEnd);
|
||||
|
||||
$this->dao->update(TABLE_PROJECT)->data($project)
|
||||
->autoCheck($skipFields = 'begin,end')
|
||||
->batchcheck($this->config->project->edit->requiredFields, 'notempty')
|
||||
@@ -502,20 +525,21 @@ class projectModel extends model
|
||||
|
||||
$projectID = (int)$projectID;
|
||||
$projects[$projectID] = new stdClass();
|
||||
$projects[$projectID]->name = $projectName;
|
||||
$projects[$projectID]->code = $projectCode;
|
||||
$projects[$projectID]->PM = $data->PMs[$projectID];
|
||||
$projects[$projectID]->PO = $data->POs[$projectID];
|
||||
$projects[$projectID]->QD = $data->QDs[$projectID];
|
||||
$projects[$projectID]->RD = $data->RDs[$projectID];
|
||||
$projects[$projectID]->lifetime = $data->lifetimes[$projectID];
|
||||
$projects[$projectID]->status = $data->statuses[$projectID];
|
||||
$projects[$projectID]->begin = $data->begins[$projectID];
|
||||
$projects[$projectID]->end = $data->ends[$projectID];
|
||||
$projects[$projectID]->team = $data->teams[$projectID];
|
||||
$projects[$projectID]->desc = htmlspecialchars_decode($data->descs[$projectID]);
|
||||
$projects[$projectID]->days = $data->dayses[$projectID];
|
||||
$projects[$projectID]->order = $data->orders[$projectID];
|
||||
$projects[$projectID]->name = $projectName;
|
||||
$projects[$projectID]->code = $projectCode;
|
||||
$projects[$projectID]->PM = $data->PMs[$projectID];
|
||||
$projects[$projectID]->PO = $data->POs[$projectID];
|
||||
$projects[$projectID]->QD = $data->QDs[$projectID];
|
||||
$projects[$projectID]->RD = $data->RDs[$projectID];
|
||||
$projects[$projectID]->lifetime = $data->lifetimes[$projectID];
|
||||
$projects[$projectID]->attribute = $data->attributes[$projectID];
|
||||
$projects[$projectID]->status = $data->statuses[$projectID];
|
||||
$projects[$projectID]->begin = $data->begins[$projectID];
|
||||
$projects[$projectID]->end = $data->ends[$projectID];
|
||||
$projects[$projectID]->team = $data->teams[$projectID];
|
||||
$projects[$projectID]->desc = htmlspecialchars_decode($data->descs[$projectID]);
|
||||
$projects[$projectID]->days = $data->dayses[$projectID];
|
||||
$projects[$projectID]->order = $data->orders[$projectID];
|
||||
|
||||
/* Check unique name for edited projects. */
|
||||
if(isset($nameList[$projectName])) dao::$errors['name'][] = 'project#' . $projectID . sprintf($this->lang->error->unique, $this->lang->project->name, $projectName);
|
||||
@@ -911,10 +935,11 @@ class projectModel extends model
|
||||
* @param int $projectID
|
||||
* @param string $status
|
||||
* @param int $limit
|
||||
* @param string $pairs
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getExecutionsByProject($projectID, $status = 'all', $limit = 0)
|
||||
public function getExecutionsByProject($projectID, $status = 'all', $limit = 0, $pairs = false)
|
||||
{
|
||||
if(!$projectID) return array();
|
||||
|
||||
@@ -924,7 +949,7 @@ class projectModel extends model
|
||||
->beginIF($status == 'undone')->andWhere('status')->notIN('done,closed')->fi()
|
||||
->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi()
|
||||
->andWhere('deleted')->eq('0')
|
||||
->orderBy('begin_asc')
|
||||
->orderBy('path_asc,id_asc')
|
||||
->beginIF($limit)->limit($limit)->fi()
|
||||
->fetchAll('id');
|
||||
|
||||
@@ -935,9 +960,17 @@ class projectModel extends model
|
||||
{
|
||||
if($execution->parent and isset($executions[$execution->parent])) $executions[$execution->id]->name = $executions[$execution->parent]->name . '/' . $execution->name;
|
||||
}
|
||||
|
||||
foreach($executions as $execution) if($execution->grade == 2) unset($executions[$execution->parent]);
|
||||
}
|
||||
|
||||
if($pairs)
|
||||
{
|
||||
$executionPairs = array();
|
||||
foreach($executions as $execution) $executionPairs[$execution->id] = $execution->name;
|
||||
$executions = $executionPairs;
|
||||
}
|
||||
|
||||
return $executions;
|
||||
}
|
||||
|
||||
@@ -953,37 +986,35 @@ class projectModel extends model
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function getExecutionStats($projectID = 0, $status = 'undone', $productID = 0, $branch = 0, $itemCounts = 30, $orderBy = 'order_desc', $pager = null)
|
||||
public function getExecutionStats($projectID = 0, $status = 'undone', $productID = 0, $branch = 0, $itemCounts = 30, $orderBy = 'path_asc,id_asc', $pager = null)
|
||||
{
|
||||
/* Init vars. */
|
||||
$executions = $this->getExecutionList($projectID, $status, 0, $productID, $branch);
|
||||
$executions = $this->dao->select('*')->from(TABLE_EXECUTION)
|
||||
->where('id')->in(array_keys($executions))
|
||||
->andWhere('grade')->eq(1)
|
||||
->andWhere('deleted')->eq('0')
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
|
||||
if(empty($executions)) return array();
|
||||
|
||||
/* In case of a waterfall model, obtain sub-stage data. */
|
||||
$project = $this->loadModel('program')->getPRJById($this->session->PRJ);
|
||||
if($project and $project->model == 'waterfall')
|
||||
if(empty($productID))
|
||||
{
|
||||
$childrens = $this->dao->select('*')->from(TABLE_PROJECT)
|
||||
->where('parent')->in(array_keys($executions))
|
||||
->andWhere('grade')->eq(2)
|
||||
$executions = $this->dao->select('*')->from(TABLE_EXECUTION)
|
||||
->where('project')->eq($projectID)
|
||||
->beginIF($status == 'undone')->andWhere('status')->notIN('done,closed')->fi()
|
||||
->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->eq($status)->fi()
|
||||
->andWhere('deleted')->eq('0')
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
|
||||
$executions += $childrens;
|
||||
}
|
||||
else
|
||||
{
|
||||
$executions = $this->dao->select('t2.*')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.project=t2.id')
|
||||
->where('t1.product')->eq($productID)
|
||||
->andWhere('t2.project')->eq($projectID)
|
||||
->beginIF($status == 'undone')->andWhere('t2.status')->notIN('done,closed')->fi()
|
||||
->beginIF($status != 'all' and $status != 'undone')->andWhere('t2.status')->eq($status)->fi()
|
||||
->andWhere('t2.deleted')->eq('0')
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
}
|
||||
|
||||
$hours = array();
|
||||
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
|
||||
$hours = array();
|
||||
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
|
||||
|
||||
/* Get all tasks and compute totalEstimate, totalConsumed, totalLeft, progress according to them. */
|
||||
$tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason')
|
||||
@@ -1074,6 +1105,7 @@ class projectModel extends model
|
||||
}
|
||||
|
||||
/* In the case of the waterfall model, calculate the sub-stage. */
|
||||
$project = $this->loadModel('program')->getPRJById($this->session->PRJ);
|
||||
if($project and $project->model == 'waterfall')
|
||||
{
|
||||
foreach($parents as $id => $execution) $execution->children = isset($children[$id]) ? $children[$id] : array();
|
||||
@@ -1453,7 +1485,7 @@ class projectModel extends model
|
||||
*/
|
||||
public function getOrderedExecutions($projectID, $status, $num = 0)
|
||||
{
|
||||
$executionList = $this->getExecutionList($projectID, $status);
|
||||
$executionList = $this->getExecutionList($projectID, 'all', $status);
|
||||
if(empty($executionIdList)) return $executionList;
|
||||
|
||||
$executions = $mineExecutions = $otherExecutions = $closedExecutions = array();
|
||||
|
||||
@@ -69,54 +69,54 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='sortable' id='projectTableList'>
|
||||
<?php foreach($projectStats as $project):?>
|
||||
<tr data-id='<?php echo $project->id ?>' data-order='<?php echo $project->order ?>'>
|
||||
<?php foreach($executionStats as $execution):?>
|
||||
<tr data-id='<?php echo $execution->id ?>' data-order='<?php echo $execution->order ?>'>
|
||||
<td class='c-id'>
|
||||
<?php if($canBatchEdit):?>
|
||||
<div class="checkbox-primary">
|
||||
<input type='checkbox' name='projectIDList[<?php echo $project->id;?>]' value='<?php echo $project->id;?>' />
|
||||
<input type='checkbox' name='projectIDList[<?php echo $execution->id;?>]' value='<?php echo $execution->id;?>' />
|
||||
<label></label>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php printf('%03d', $project->id);?>
|
||||
<?php printf('%03d', $execution->id);?>
|
||||
</td>
|
||||
<td class='text-left <?php if(!empty($project->children)) echo 'has-child';?>' title='<?php echo $project->name?>'>
|
||||
<td class='text-left <?php if(!empty($execution->children)) echo 'has-child';?>' title='<?php echo $execution->name?>'>
|
||||
<?php
|
||||
if(isset($project->delay)) echo "<span class='label label-danger label-badge'>{$lang->project->delayed}</span> ";
|
||||
echo html::a($this->createLink('project', 'view', 'project=' . $project->id), $project->name);
|
||||
if(isset($execution->delay)) echo "<span class='label label-danger label-badge'>{$lang->project->delayed}</span> ";
|
||||
echo html::a($this->createLink('project', 'view', 'project=' . $execution->id), $execution->name);
|
||||
?>
|
||||
<?php if(!empty($project->children)):?>
|
||||
<a class="plan-toggle" data-id="<?php echo $project->id;?>"><i class="icon icon-angle-double-right"></i></a>
|
||||
<?php if(!empty($execution->children)):?>
|
||||
<a class="plan-toggle" data-id="<?php echo $execution->id;?>"><i class="icon icon-angle-double-right"></i></a>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<td class='text-left' title="<?php echo $project->code;?>"><?php echo $project->code;?></td>
|
||||
<td><?php echo zget($users, $project->PM);?></td>
|
||||
<td><?php echo $project->end;?></td>
|
||||
<?php $projectStatus = $this->processStatus('project', $project);?>
|
||||
<td class='text-left' title="<?php echo $execution->code;?>"><?php echo $execution->code;?></td>
|
||||
<td><?php echo zget($users, $execution->PM);?></td>
|
||||
<td><?php echo $execution->end;?></td>
|
||||
<?php $projectStatus = $this->processStatus('project', $execution);?>
|
||||
<td class='c-status' title='<?php echo $projectStatus;?>'>
|
||||
<span class="status-project status-<?php echo $project->status?>"><?php echo $projectStatus;?></span>
|
||||
<span class="status-project status-<?php echo $execution->status?>"><?php echo $projectStatus;?></span>
|
||||
</td>
|
||||
<td><?php echo $project->hours->totalEstimate;?></td>
|
||||
<td><?php echo $project->hours->totalConsumed;?></td>
|
||||
<td><?php echo $project->hours->totalLeft;?></td>
|
||||
<td><?php echo $execution->hours->totalEstimate;?></td>
|
||||
<td><?php echo $execution->hours->totalConsumed;?></td>
|
||||
<td><?php echo $execution->hours->totalLeft;?></td>
|
||||
<td class="c-progress">
|
||||
<div class="progress progress-text-left">
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $project->hours->progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->hours->progress;?>%">
|
||||
<span class="progress-text"><?php echo $project->hours->progress;?>%</span>
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $execution->hours->progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $execution->hours->progress;?>%">
|
||||
<span class="progress-text"><?php echo $execution->hours->progress;?>%</span>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td id='spark-<?php echo $project->id?>' class='sparkline text-left no-padding' values='<?php echo join(',', $project->burns);?>'></td>
|
||||
<td id='spark-<?php echo $execution->id?>' class='sparkline text-left no-padding' values='<?php echo join(',', $execution->burns);?>'></td>
|
||||
<?php if($canOrder):?>
|
||||
<td class='sort-handler'><i class="icon icon-move"></i></td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php if(!empty($project->children)):?>
|
||||
<?php if(!empty($execution->children)):?>
|
||||
<?php $i = 0;?>
|
||||
<?php foreach($project->children as $key => $child):?>
|
||||
<?php foreach($execution->children as $key => $child):?>
|
||||
<?php $class = $i == 0 ? ' table-child-top' : '';?>
|
||||
<?php $class .= ($i + 1 == count($project->children)) ? ' table-child-bottom' : '';?>
|
||||
<tr class='table-children<?php echo $class;?> parent-<?php echo $project->id;?>' data-id='<?php echo $child->id?>'>
|
||||
<?php $class .= ($i + 1 == count($execution->children)) ? ' table-child-bottom' : '';?>
|
||||
<tr class='table-children<?php echo $class;?> parent-<?php echo $execution->id;?>' data-id='<?php echo $child->id?>'>
|
||||
<td class='c-id'>
|
||||
<?php if($canBatchEdit):?>
|
||||
<div class="checkbox-primary">
|
||||
@@ -161,7 +161,7 @@
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php if($projectStats):?>
|
||||
<?php if($executionStats):?>
|
||||
<div class='table-footer'>
|
||||
<?php if($canBatchEdit):?>
|
||||
<div class="checkbox-primary check-all"><label><?php echo $lang->selectAll?></label></div>
|
||||
|
||||
@@ -74,7 +74,18 @@
|
||||
<td class='text-left<?php echo zget($visibleFields, 'PO', ' hidden')?>' style='overflow:visible'><?php echo html::select("POs[$projectID]", $poUsers, $projects[$projectID]->PO, "class='form-control chosen'");?></td>
|
||||
<td class='text-left<?php echo zget($visibleFields, 'QD', ' hidden')?>' style='overflow:visible'><?php echo html::select("QDs[$projectID]", $qdUsers, $projects[$projectID]->QD, "class='form-control chosen'");?></td>
|
||||
<td class='text-left<?php echo zget($visibleFields, 'RD', ' hidden')?>' style='overflow:visible'><?php echo html::select("RDs[$projectID]", $rdUsers, $projects[$projectID]->RD, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?>'><?php echo html::select("lifetimes[$projectID]", $lang->program->PRJLifeTimeList, $projects[$projectID]->type, 'class=form-control');?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?>'>
|
||||
<?php
|
||||
if($isStage)
|
||||
{
|
||||
echo html::select("attributes[$projectID]", $lang->stage->typeList, $projects[$projectID]->attribute, 'class=form-control');
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::select("lifetimes[$projectID]", $lang->program->PRJLifeTimeList, $projects[$projectID]->lifetime, 'class=form-control');
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td class='<?php echo zget($visibleFields, 'status', 'hidden')?>'><?php echo html::select("statuses[$projectID]", $lang->project->statusList, $projects[$projectID]->status, 'class=form-control');?></td>
|
||||
<td><?php echo html::input("begins[$projectID]", $projects[$projectID]->begin, "class='form-control form-date' onchange='computeWorkDays(this.id)'");?></td>
|
||||
<td><?php echo html::input("ends[$projectID]", $projects[$projectID]->end, "class='form-control form-date' onchange='computeWorkDays(this.id)'");?></td>
|
||||
|
||||
@@ -81,10 +81,32 @@
|
||||
<?php if(!$isSprint):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->project->type;?></th>
|
||||
<td><?php echo html::select('lifetime', $lang->program->PRJLifeTimeList, '', "class='form-control' onchange='showLifeTimeTips()'");?></td>
|
||||
<td>
|
||||
<?php
|
||||
if($isStage)
|
||||
{
|
||||
echo html::select('attribute', $lang->stage->typeList, '', "class='form-control'");
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::select('lifetime', $lang->program->PRJLifeTimeList, '', "class='form-control' onchange='showLifeTimeTips()'");
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td class='muted' colspan='2'><div id='lifeTimeTips'><?php echo $lang->project->typeDesc;?></div></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php if($isStage):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->programplan->percent;?></th>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('percent', '', "class='form-control'");?>
|
||||
<span class='input-group-addon'>%</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->project->status;?></th>
|
||||
<td><?php echo html::hidden('status', 'wait');?></td>
|
||||
|
||||
@@ -63,7 +63,29 @@
|
||||
<?php if(!$isSprint):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->project->type;?></th>
|
||||
<td><?php echo html::select('lifetime', $lang->program->PRJLifeTimeList, $project->type, "class='form-control'");?></td>
|
||||
<td>
|
||||
<?php
|
||||
if($isStage)
|
||||
{
|
||||
echo html::select('attribute', $lang->stage->typeList, $project->attribute, "class='form-control'");
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::select('lifetime', $lang->program->PRJLifeTimeList, $project->lifetime, "class='form-control' onchange='showLifeTimeTips()'");
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php if($isStage):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->programplan->percent;?></th>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::input('percent', $project->percent, "class='form-control'");?>
|
||||
<span class='input-group-addon'>%</span>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
|
||||
@@ -356,10 +356,7 @@
|
||||
$(function()
|
||||
{
|
||||
// Update table summary text
|
||||
<?php
|
||||
$storyCommon = $lang->storyCommon;
|
||||
if(!empty($config->URAndSR)) $storyCommon = $lang->SRCommon;
|
||||
?>
|
||||
<?php $storyCommon = $lang->projectSRCommon;?>
|
||||
var checkedSummary = '<?php echo str_replace('%storyCommon%', $storyCommon, $lang->product->checkedSummary)?>';
|
||||
$('#projectStoryForm').table(
|
||||
{
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
$config->release = new stdclass();
|
||||
$config->release->create = new stdclass();
|
||||
$config->release->edit = new stdclass();
|
||||
$config->release->create->requiredFields = 'name,date';
|
||||
$config->release->edit->requiredFields = 'name,date,build';
|
||||
|
||||
$config->release->editor = new stdclass();
|
||||
$config->release->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
$config->release->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
|
||||
@@ -0,0 +1,603 @@
|
||||
<?php
|
||||
/**
|
||||
* The control file of release module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package release
|
||||
* @version $Id: control.php 4178 2013-01-20 09:32:11Z wwccss $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
class projectrelease extends control
|
||||
{
|
||||
public $products = array();
|
||||
|
||||
/**
|
||||
* Construct function, load module auto.
|
||||
*
|
||||
* @param string $moduleName
|
||||
* @param string $methodName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($moduleName = '', $methodName = '')
|
||||
{
|
||||
parent::__construct($moduleName, $methodName);
|
||||
$products = array();
|
||||
$this->loadModel('product');
|
||||
$this->view->products = $this->products = $this->product->getProductPairsByProject($this->session->PRJ);
|
||||
}
|
||||
|
||||
/**
|
||||
* Common actions.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function commonAction($productID, $branch = 0)
|
||||
{
|
||||
$this->lang->product->menu = $this->lang->product->viewMenu;
|
||||
$this->lang->product->switcherMenu = $this->loadModel('product')->getSwitcher($productID);
|
||||
|
||||
$this->loadModel('product');
|
||||
$product = $this->product->getById($productID);
|
||||
if(empty($product)) $this->locate($this->createLink('product', 'create'));
|
||||
$this->view->product = $product;
|
||||
$this->view->branch = $branch;
|
||||
$this->view->branches = $product->type == 'normal' ? array() : $this->loadModel('branch')->getPairs($product->id);
|
||||
$this->view->position[] = html::a($this->createLink('product', 'browse', "productID={$this->view->product->id}&branch=$branch"), $this->view->product->name);
|
||||
$this->product->setMenu($this->product->getPairs(), $productID, $branch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Browse releases.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function browse($productID, $branch = 0, $type = 'all')
|
||||
{
|
||||
$this->commonAction($productID, $branch);
|
||||
$this->session->set('releaseList', $this->app->getURI(true));
|
||||
|
||||
$this->view->title = $this->view->product->name . $this->lang->colon . $this->lang->release->browse;
|
||||
$this->view->position[] = $this->lang->release->browse;
|
||||
$this->view->releases = $this->projectrelease->getList($productID, $branch, $type);
|
||||
$this->view->type = $type;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a release.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function create($productID, $branch = 0)
|
||||
{
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$releaseID = $this->projectrelease->create($productID, $branch);
|
||||
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
$this->loadModel('action')->create('release', $releaseID, 'opened');
|
||||
|
||||
$this->executeHooks($releaseID);
|
||||
|
||||
if(isonlybody()) $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.loadProductBuilds($productID)"));
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "releaseID=$releaseID")));
|
||||
}
|
||||
|
||||
$builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch, 'notrunk|withbranch', false);
|
||||
$releaseBuilds = $this->projectrelease->getReleaseBuilds($productID, $branch);
|
||||
foreach($releaseBuilds as $build) unset($builds[$build]);
|
||||
unset($builds['trunk']);
|
||||
|
||||
$this->commonAction($productID, $branch);
|
||||
$this->view->title = $this->view->product->name . $this->lang->colon . $this->lang->release->create;
|
||||
$this->view->position[] = $this->lang->release->create;
|
||||
$this->view->builds = $builds;
|
||||
$this->view->productID = $productID;
|
||||
$this->view->lastRelease = $this->projectrelease->getLast($productID, $branch);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit a release.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function edit($releaseID)
|
||||
{
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$changes = $this->projectrelease->update($releaseID);
|
||||
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
$files = $this->loadModel('file')->saveUpload('release', $releaseID);
|
||||
if($changes or $files)
|
||||
{
|
||||
$fileAction = '';
|
||||
if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
|
||||
$actionID = $this->loadModel('action')->create('release', $releaseID, 'Edited', $fileAction);
|
||||
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
$this->executeHooks($releaseID);
|
||||
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "releaseID=$releaseID")));
|
||||
}
|
||||
$this->loadModel('story');
|
||||
$this->loadModel('bug');
|
||||
$this->loadModel('build');
|
||||
|
||||
/* Get release and build. */
|
||||
$release = $this->projectrelease->getById((int)$releaseID);
|
||||
$this->commonAction($release->product, $release->branch);
|
||||
$build = $this->build->getById($release->build);
|
||||
|
||||
$this->view->title = $this->view->product->name . $this->lang->colon . $this->lang->release->edit;
|
||||
$this->view->position[] = $this->lang->release->edit;
|
||||
$this->view->release = $release;
|
||||
$this->view->build = $build;
|
||||
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($release->product, $release->branch, 'notrunk|withbranch', false);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* View a release.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param string $type
|
||||
* @param string $link
|
||||
* @param string $param
|
||||
* @param string $orderBy
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function view($releaseID, $type = 'story', $link = 'false', $param = '', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
if($type == 'story') $this->session->set('storyList', $this->app->getURI(true));
|
||||
if($type == 'bug' or $type == 'leftBug') $this->session->set('bugList', $this->app->getURI(true));
|
||||
|
||||
$this->loadModel('story');
|
||||
$this->loadModel('bug');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
if($this->app->getViewType() == 'mhtml') $recPerPage = 10;
|
||||
|
||||
$release = $this->projectrelease->getById((int)$releaseID, true);
|
||||
if(!$release) die(js::error($this->lang->notFound) . js::locate('back'));
|
||||
|
||||
$storyPager = new pager($type == 'story' ? $recTotal : 0, $recPerPage, $type == 'story' ? $pageID : 1);
|
||||
$stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0)
|
||||
->beginIF($type == 'story')->orderBy($orderBy)->fi()
|
||||
->page($storyPager)
|
||||
->fetchAll('id');
|
||||
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story');
|
||||
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
|
||||
foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage;
|
||||
|
||||
$bugPager = new pager($type == 'bug' ? $recTotal : 0, $recPerPage, $type == 'bug' ? $pageID : 1);
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->bugs)->andWhere('deleted')->eq(0)
|
||||
->beginIF($type == 'bug')->orderBy($orderBy)->fi()
|
||||
->page($bugPager)
|
||||
->fetchAll();
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'linkedBug');
|
||||
|
||||
$leftBugPager = new pager($type == 'leftBug' ? $recTotal : 0, $recPerPage, $type == 'leftBug' ? $pageID : 1);
|
||||
$leftBugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($release->leftBugs)->andWhere('deleted')->eq(0)
|
||||
->beginIF($type == 'leftBug')->orderBy($orderBy)->fi()
|
||||
->page($leftBugPager)
|
||||
->fetchAll();
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'leftBugs');
|
||||
|
||||
$this->commonAction($release->product);
|
||||
$product = $this->product->getById($release->product);
|
||||
|
||||
$this->executeHooks($releaseID);
|
||||
|
||||
$this->view->title = "RELEASE #$release->id $release->name/" . $product->name;
|
||||
$this->view->position[] = $this->lang->release->view;
|
||||
$this->view->release = $release;
|
||||
$this->view->stories = $stories;
|
||||
$this->view->bugs = $bugs;
|
||||
$this->view->leftBugs = $leftBugs;
|
||||
$this->view->actions = $this->loadModel('action')->getList('release', $releaseID);
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->type = $type;
|
||||
$this->view->link = $link;
|
||||
$this->view->param = $param;
|
||||
$this->view->orderBy = $orderBy;
|
||||
$this->view->branchName = $release->productType == 'normal' ? '' : $this->loadModel('branch')->getById($release->branch);
|
||||
$this->view->storyPager = $storyPager;
|
||||
$this->view->bugPager = $bugPager;
|
||||
$this->view->leftBugPager = $leftBugPager;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Export the stories of release to HTML.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function export()
|
||||
{
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$type = $this->post->type;
|
||||
$html = '';
|
||||
|
||||
if($type == 'story' or $type == 'all')
|
||||
{
|
||||
$html .= "<h3>{$this->lang->release->stories}</h3>";
|
||||
$this->loadModel('story');
|
||||
|
||||
$stories = $this->dao->select('id, title')->from(TABLE_STORY)->where($this->session->storyQueryCondition)
|
||||
->beginIF($this->session->storyOrderBy != false)->orderBy($this->session->storyOrderBy)->fi()
|
||||
->fetchAll('id');
|
||||
|
||||
foreach($stories as $story) $story->title = "<a href='" . common::getSysURL() . $this->createLink('story', 'view', "storyID=$story->id") . "' target='_blank'>$story->title</a>";
|
||||
|
||||
$fields = array('id' => $this->lang->story->id, 'title' => $this->lang->story->title);
|
||||
$rows = $stories;
|
||||
|
||||
$html .= '<table><tr>';
|
||||
foreach($fields as $fieldLabel) $html .= "<th><nobr>$fieldLabel</nobr></th>\n";
|
||||
$html .= '</tr>';
|
||||
foreach($rows as $row)
|
||||
{
|
||||
$html .= "<tr valign='top'>\n";
|
||||
foreach($fields as $fieldName => $fieldLabel)
|
||||
{
|
||||
$fieldValue = isset($row->$fieldName) ? $row->$fieldName : '';
|
||||
$html .= "<td><nobr>$fieldValue</nobr></td>\n";
|
||||
}
|
||||
$html .= "</tr>\n";
|
||||
}
|
||||
$html .= '</table>';
|
||||
}
|
||||
|
||||
if($type == 'bug' or $type == 'all')
|
||||
{
|
||||
$html .= "<h3>{$this->lang->release->bugs}</h3>";
|
||||
$this->loadModel('bug');
|
||||
|
||||
$bugs = $this->dao->select('id, title')->from(TABLE_BUG)->where($this->session->linkedBugQueryCondition)
|
||||
->beginIF($this->session->bugOrderBy != false)->orderBy($this->session->bugOrderBy)->fi()
|
||||
->fetchAll('id');
|
||||
|
||||
foreach($bugs as $bug) $bug->title = "<a href='" . common::getSysURL() . $this->createLink('bug', 'view', "bugID=$bug->id") . "' target='_blank'>$bug->title</a>";
|
||||
|
||||
$fields = array('id' => $this->lang->bug->id, 'title' => $this->lang->bug->title);
|
||||
$rows = $bugs;
|
||||
|
||||
$html .= '<table><tr>';
|
||||
foreach($fields as $fieldLabel) $html .= "<th><nobr>$fieldLabel</nobr></th>\n";
|
||||
$html .= '</tr>';
|
||||
foreach($rows as $row)
|
||||
{
|
||||
$html .= "<tr valign='top'>\n";
|
||||
foreach($fields as $fieldName => $fieldLabel)
|
||||
{
|
||||
$fieldValue = isset($row->$fieldName) ? $row->$fieldName : '';
|
||||
$html .= "<td><nobr>$fieldValue</nobr></td>\n";
|
||||
}
|
||||
$html .= "</tr>\n";
|
||||
}
|
||||
$html .= '</table>';
|
||||
}
|
||||
|
||||
if($type == 'leftbug' or $type == 'all')
|
||||
{
|
||||
$html .= "<h3>{$this->lang->release->generatedBugs}</h3>";
|
||||
|
||||
$bugs = $this->dao->select('id, title')->from(TABLE_BUG)->where($this->session->leftBugsQueryCondition)
|
||||
->beginIF($this->session->bugOrderBy != false)->orderBy($this->session->bugOrderBy)->fi()
|
||||
->fetchAll('id');
|
||||
|
||||
foreach($bugs as $bug) $bug->title = "<a href='" . common::getSysURL() . $this->createLink('bug', 'view', "bugID=$bug->id") . "' target='_blank'>$bug->title</a>";
|
||||
|
||||
$fields = array('id' => $this->lang->bug->id, 'title' => $this->lang->bug->title);
|
||||
$rows = $bugs;
|
||||
|
||||
$html .= '<table><tr>';
|
||||
foreach($fields as $fieldLabel) $html .= "<th><nobr>$fieldLabel</nobr></th>\n";
|
||||
$html .= '</tr>';
|
||||
foreach($rows as $row)
|
||||
{
|
||||
$html .= "<tr valign='top'>\n";
|
||||
foreach($fields as $fieldName => $fieldLabel)
|
||||
{
|
||||
$fieldValue = isset($row->$fieldName) ? $row->$fieldName : '';
|
||||
$html .= "<td><nobr>$fieldValue</nobr></td>\n";
|
||||
}
|
||||
$html .= "</tr>\n";
|
||||
}
|
||||
$html .= '</table>';
|
||||
}
|
||||
|
||||
$html = "<html><head><meta charset='utf-8'><title>{$this->post->fileName}</title><style>table, th, td{font-size:12px; border:1px solid gray; border-collapse:collapse;}</style></head><body>$html</body></html>";
|
||||
die($this->fetch('file', 'sendDownHeader', array('fileName' => $this->post->fileName, 'html', $html)));
|
||||
}
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Link stories
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkStory($releaseID = 0, $browseType = '', $param = 0, $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
if(!empty($_POST['stories']))
|
||||
{
|
||||
$this->projectrelease->linkStory($releaseID);
|
||||
die(js::locate(inlink('view', "releaseID=$releaseID&type=story"), 'parent'));
|
||||
}
|
||||
$this->session->set('storyList', inlink('view', "releaseID=$releaseID&type=story&link=true¶m=" . helper::safe64Encode("&browseType=$browseType&queryID=$param")));
|
||||
|
||||
$release = $this->projectrelease->getById($releaseID);
|
||||
$build = $this->loadModel('build')->getByID($release->build);
|
||||
$this->commonAction($release->product);
|
||||
$this->loadModel('story');
|
||||
$this->loadModel('tree');
|
||||
$this->loadModel('product');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Build search form. */
|
||||
$queryID = ($browseType == 'bySearch') ? (int)$param : 0;
|
||||
unset($this->config->product->search['fields']['product']);
|
||||
unset($this->config->product->search['fields']['project']);
|
||||
$this->config->product->search['actionURL'] = $this->createLink('release', 'view', "releaseID=$releaseID&type=story&link=true¶m=" . helper::safe64Encode('&browseType=bySearch&queryID=myQueryID'));
|
||||
$this->config->product->search['queryID'] = $queryID;
|
||||
$this->config->product->search['style'] = 'simple';
|
||||
$this->config->product->search['params']['plan']['values'] = $this->loadModel('productplan')->getForProducts(array($release->product => $release->product));
|
||||
$this->config->product->search['params']['module']['values'] = $this->tree->getOptionMenu($release->product, $viewType = 'story', $startModuleID = 0);
|
||||
$this->config->product->search['params']['status'] = array('operator' => '=', 'control' => 'select', 'values' => $this->lang->story->statusList);
|
||||
if($this->session->currentProductType == 'normal')
|
||||
{
|
||||
unset($this->config->product->search['fields']['branch']);
|
||||
unset($this->config->product->search['params']['branch']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config->product->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$branches = array('' => '') + $this->loadModel('branch')->getPairs($release->product, 'noempty');
|
||||
if($release->branch) $branches = array('' => '', $release->branch => $branches[$release->branch]);
|
||||
$this->config->product->search['params']['branch']['values'] = $branches;
|
||||
}
|
||||
$this->loadModel('search')->setSearchParams($this->config->product->search);
|
||||
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$allStories = $this->story->getBySearch($release->product, $release->branch, $queryID, 'id', $build->project ? $build->project : '', 'story', $release->stories, $pager);
|
||||
}
|
||||
else
|
||||
{
|
||||
$allStories = $this->story->getProjectStories($build->project, 't1.`order`_desc', 'byProduct', $release->product, 'story', $release->stories, $pager);
|
||||
}
|
||||
|
||||
$this->view->allStories = $allStories;
|
||||
$this->view->release = $release;
|
||||
$this->view->releaseStories = empty($release->stories) ? array() : $this->story->getByList($release->stories);
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->param = $param;
|
||||
$this->view->pager = $pager;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlink story
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param int $storyID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function unlinkStory($releaseID, $storyID)
|
||||
{
|
||||
$this->projectrelease->unlinkStory($releaseID, $storyID);
|
||||
|
||||
/* if ajax request, send result. */
|
||||
if($this->server->ajax)
|
||||
{
|
||||
if(dao::isError())
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = dao::getError();
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['result'] = 'success';
|
||||
$response['message'] = '';
|
||||
}
|
||||
$this->send($response);
|
||||
}
|
||||
die(js::reload('parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch unlink story.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function batchUnlinkStory($releaseID)
|
||||
{
|
||||
$this->projectrelease->batchUnlinkStory($releaseID);
|
||||
die(js::locate($this->createLink('release', 'view', "releaseID=$releaseID&type=story"), 'parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Link bugs.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param string $browseType
|
||||
* @param int $param
|
||||
* @param string $type
|
||||
* @param int $recTotal
|
||||
* @param int $recPerPage
|
||||
* @param int $pageID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function linkBug($releaseID = 0, $browseType = '', $param = 0, $type = 'bug', $recTotal = 0, $recPerPage = 100, $pageID = 1)
|
||||
{
|
||||
if(!empty($_POST['bugs']))
|
||||
{
|
||||
$this->projectrelease->linkBug($releaseID, $type);
|
||||
die(js::locate(inlink('view', "releaseID=$releaseID&type=$type"), 'parent'));
|
||||
}
|
||||
|
||||
$this->session->set('bugList', inlink('view', "releaseID=$releaseID&type=$type&link=true¶m=" . helper::safe64Encode("&browseType=$browseType&queryID=$param")));
|
||||
/* Set menu. */
|
||||
$release = $this->projectrelease->getByID($releaseID);
|
||||
$build = $this->loadModel('build')->getByID($release->build);
|
||||
$this->commonAction($release->product);
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$pager = new pager($recTotal, $recPerPage, $pageID);
|
||||
|
||||
/* Build the search form. */
|
||||
$this->loadModel('bug');
|
||||
$queryID = ($browseType == 'bysearch') ? (int)$param : 0;
|
||||
unset($this->config->bug->search['fields']['product']);
|
||||
$this->config->bug->search['actionURL'] = $this->createLink('release', 'view', "releaseID=$releaseID&type=$type&link=true¶m=" . helper::safe64Encode('&browseType=bySearch&queryID=myQueryID'));
|
||||
$this->config->bug->search['queryID'] = $queryID;
|
||||
$this->config->bug->search['style'] = 'simple';
|
||||
$this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getForProducts(array($release->product => $release->product));
|
||||
$this->config->bug->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($release->product, $viewType = 'bug', $startModuleID = 0);
|
||||
$this->config->bug->search['params']['project']['values'] = $this->loadModel('product')->getExecutionPairsByProduct($release->product);
|
||||
$this->config->bug->search['params']['openedBuild']['values'] = $this->loadModel('build')->getProductBuildPairs($release->product, $branch = 0, $params = '');
|
||||
$this->config->bug->search['params']['resolvedBuild']['values'] = $this->config->bug->search['params']['openedBuild']['values'];
|
||||
if($this->session->currentProductType == 'normal')
|
||||
{
|
||||
unset($this->config->bug->search['fields']['branch']);
|
||||
unset($this->config->bug->search['params']['branch']);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->config->bug->search['fields']['branch'] = $this->lang->product->branch;
|
||||
$branches = array('' => '') + $this->loadModel('branch')->getPairs($release->product, 'noempty');
|
||||
if($release->branch) $branches = array('' => '', $release->branch => $branches[$release->branch]);
|
||||
$this->config->bug->search['params']['branch']['values'] = $branches;
|
||||
}
|
||||
$this->loadModel('search')->setSearchParams($this->config->bug->search);
|
||||
|
||||
$allBugs = array();
|
||||
$releaseBugs = $type == 'bug' ? $release->bugs : $release->leftBugs;
|
||||
if($browseType == 'bySearch')
|
||||
{
|
||||
$allBugs = $this->bug->getBySearch($release->product, $release->branch, $queryID, 'id_desc', $releaseBugs, $pager);
|
||||
}
|
||||
elseif($build->project)
|
||||
{
|
||||
if($type == 'bug')
|
||||
{
|
||||
$allBugs = $this->bug->getReleaseBugs($build->id, $release->product, $release->branch, $releaseBugs, $pager);
|
||||
}
|
||||
elseif($type == 'leftBug')
|
||||
{
|
||||
$allBugs = $this->bug->getProductLeftBugs($build->id, $release->product, $release->branch, $releaseBugs, $pager);
|
||||
}
|
||||
}
|
||||
|
||||
$this->view->allBugs = $allBugs;
|
||||
$this->view->releaseBugs = empty($releaseBugs) ? array() : $this->bug->getByList($releaseBugs);
|
||||
$this->view->release = $release;
|
||||
$this->view->users = $this->loadModel('user')->getPairs('noletter');
|
||||
$this->view->browseType = $browseType;
|
||||
$this->view->param = $param;
|
||||
$this->view->type = $type;
|
||||
$this->view->pager = $pager;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlink story
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param int $bugID
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function unlinkBug($releaseID, $bugID, $type = 'bug')
|
||||
{
|
||||
$this->projectrelease->unlinkBug($releaseID, $bugID, $type);
|
||||
|
||||
/* if ajax request, send result. */
|
||||
if($this->server->ajax)
|
||||
{
|
||||
if(dao::isError())
|
||||
{
|
||||
$response['result'] = 'fail';
|
||||
$response['message'] = dao::getError();
|
||||
}
|
||||
else
|
||||
{
|
||||
$response['result'] = 'success';
|
||||
$response['message'] = '';
|
||||
}
|
||||
$this->send($response);
|
||||
}
|
||||
die(js::reload('parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch unlink story.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param string $type
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function batchUnlinkBug($releaseID, $type = 'bug')
|
||||
{
|
||||
$this->projectrelease->batchUnlinkBug($releaseID, $type);
|
||||
die(js::locate($this->createLink('release', 'view', "releaseID=$releaseID&type=$type"), 'parent'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Change status.
|
||||
*
|
||||
* @param int $releaseID
|
||||
* @param string $status
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function changeStatus($releaseID, $status)
|
||||
{
|
||||
$this->projectrelease->changeStatus($releaseID, $status);
|
||||
if(dao::isError()) die(js::error(dao::getError()));
|
||||
$actionID = $this->loadModel('action')->create('release', $releaseID, 'changestatus', '', $status);
|
||||
die(js::reload('parent'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
#releaseList {font-size: 13px;}
|
||||
td{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user