This commit is contained in:
holan20180123
2020-11-25 14:30:47 +08:00
162 changed files with 3719 additions and 1115 deletions
+10 -14
View File
@@ -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] = '故事点';
+13
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+30 -30
View File
@@ -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'] = '用户';
+30 -30
View File
@@ -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'] = '用戶';
+36 -6
View File
@@ -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;
+1 -1
View File
@@ -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()
{
+8 -5
View File
@@ -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();
+8 -5
View File
@@ -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();
+8 -5
View File
@@ -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();
+8 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);
}
+48
View File
@@ -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;?>
+11 -9
View File
@@ -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>
+1 -1
View File
@@ -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>
+4 -4
View File
@@ -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();
+9 -9
View File
@@ -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> 移除。');
+9 -9
View File
@@ -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> 移除。');
+1 -1
View File
@@ -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);
+7 -7
View File
@@ -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.';
+7 -7
View File
@@ -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';
+6 -6
View File
@@ -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';
+7 -7
View File
@@ -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';
+7 -7
View File
@@ -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';
+7 -7
View File
@@ -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 -11
View File
@@ -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';
+8 -7
View File
@@ -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&param=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&param=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&param=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&param=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|';
+4 -4
View File
@@ -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&param=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');
+1 -1
View File
@@ -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");
}
+2 -2
View File
@@ -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 . '计划';
+2 -2
View File
@@ -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
View File
@@ -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&section=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&section=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&section=roleList");
if(empty($dbFields)) $dbFields = $this->custom->getItems("lang=all&module=user&section=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&section=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&section=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&section=roleList");
if(empty($dbFields)) $dbFields = $this->custom->getItems("lang=all&module=user&section=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();
}
+2
View File
@@ -5,10 +5,12 @@ $(function()
if($(this).val() == 0)
{
$('#URSRName').addClass('hidden');
$('#customURSR').addClass('hidden');
}
else
{
$('#URSRName').removeClass('hidden');
$('#customURSR').removeClass('hidden');
}
});
+2
View File
@@ -5,10 +5,12 @@ $(function()
if($(this).val() == 0)
{
$('#URSRName').addClass('hidden');
$('#customURSR').addClass('hidden');
}
else
{
$('#URSRName').removeClass('hidden');
$('#customURSR').removeClass('hidden');
}
});
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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é';
+1 -1
View File
@@ -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';
+4 -3
View File
@@ -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 = '自定义需求名称不能为空!';
+2 -2
View File
@@ -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版本起增加了產品主頁視圖,是否預設進入產品主頁?";
+3 -70
View File
@@ -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';?>
+1 -68
View File
@@ -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';?>
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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';
+1 -1
View File
@@ -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 = '由谁创建';
+4 -4
View File
@@ -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'] = '积分';
+4 -4
View File
@@ -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'] = '積分';
+6 -6
View File
@@ -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
+8 -7
View File
@@ -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')
+6 -6
View File
@@ -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' => '');
+6 -6
View File
@@ -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' => '');
+5
View File
@@ -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';
+5
View File
@@ -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';
+5
View File
@@ -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";
+5
View File
@@ -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';
+7 -2
View File
@@ -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 = '由我创建';
+7 -2
View File
@@ -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 = '由我創建';
+8 -4
View File
@@ -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">
+2 -2
View File
@@ -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));
+9 -9
View File
@@ -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';
+9 -9
View File
@@ -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
View File
@@ -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 . "%");
+1 -8
View File
@@ -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(
{
+7 -7
View File
@@ -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;
+7 -7
View File
@@ -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;
+2
View File
@@ -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';
+2 -2
View File
@@ -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';
+2 -2
View File
@@ -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';
+2 -2
View File
@@ -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';
+2 -2
View File
@@ -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';
+3 -2
View File
@@ -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 = '返回项目列表';
+11 -5
View File
@@ -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'] = '重新定義(只取項目權限)';
+22 -6
View File
@@ -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;
}
+1 -1
View File
@@ -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>
+14 -8
View File
@@ -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>
+6
View File
@@ -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'>
+1 -1
View File
@@ -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>
+24 -16
View File
@@ -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
View File
@@ -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();
}
+6 -1
View File
@@ -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;
+6 -1
View File
@@ -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;
+6 -1
View File
@@ -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;
+5
View File
@@ -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;
+35 -30
View File
@@ -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}";
+35 -30
View File
@@ -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
View File
@@ -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();
+25 -25
View File
@@ -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>
+12 -1
View File
@@ -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>
+23 -1
View File
@@ -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>
+23 -1
View File
@@ -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>
+1 -4
View File
@@ -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(
{
+10
View File
@@ -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');
+603
View File
@@ -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&param=" . 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&param=" . 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&param=" . 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&param=" . 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'));
}
}
+2
View File
@@ -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