Merge branch '15.0.beta3'

This commit is contained in:
wangyidong
2021-06-06 09:27:45 +08:00
796 changed files with 25980 additions and 20316 deletions
+11 -9
View File
@@ -26,7 +26,7 @@ common:
cp -fr sdk zentaopms/
cp -fr www zentaopms && rm -fr zentaopms/www/data/ && mkdir -p zentaopms/www/data/upload
mkdir zentaopms/tmp
mkdir zentaopms/tmp/cache/
mkdir zentaopms/tmp/cache/
mkdir zentaopms/tmp/extension/
mkdir zentaopms/tmp/log/
mkdir zentaopms/tmp/model/
@@ -58,7 +58,7 @@ zentaoxx:
cd $(XUANPATH); git archive --format=zip --prefix=xuan/ $(XUANVERSION) > xuan.zip
mv $(XUANPATH)/xuan.zip .
unzip xuan.zip
cp xuan/xxb/config/ext/xuanxuan.php zentaoxx/config/ext/
cp xuan/xxb/config/ext/_0_xuanxuan.php zentaoxx/config/ext/
cp -r xuan/xxb/lib/phpaes zentaoxx/lib/
cp -r xuan/xxb/framework/xuanxuan.class.php zentaoxx/framework/
cp -r xuan/xxb/db/*.sql zentaoxx/db/
@@ -78,8 +78,7 @@ zentaoxx:
cp -r xuan/xxb/www/x.php zentaoxx/www/
mkdir zentaoxx/module/action
cp -r xuan/xxb/module/action/ext zentaoxx/module/action
cp -r xuan/xxb/config/ext/xxb.php zentaoxx/config/ext/
cp -r xuan/xxb/config/ext/maps.php zentaoxx/config/ext/
cp -r xuan/xxb/config/ext/_1_maps.php zentaoxx/config/ext/
cp -r xuanxuan/config/* zentaoxx/config/
cp -r xuanxuan/module/* zentaoxx/module/
cp -r xuanxuan/www/* zentaoxx/www/
@@ -87,8 +86,8 @@ zentaoxx:
mkdir zentaoxx/db/
cp zentaoxx/db_bak/upgradexuanxuan*.sql zentaoxx/db_bak/xuanxuan.sql zentaoxx/db/
rm -rf zentaoxx/db_bak/
sed -i 's/XXBVERSION/$(XVERSION)/g' zentaoxx/config/ext/xuanxuan.php
sed -i "/\$$config->xuanxuan->backend /c\\\$$config->xuanxuan->backend = 'zentao';" zentaoxx/config/ext/xuanxuan.php
sed -i 's/XXBVERSION/$(XVERSION)/g' zentaoxx/config/ext/_0_xuanxuan.php
sed -i "/\$$config->xuanxuan->backend /c\\\$$config->xuanxuan->backend = 'zentao';" zentaoxx/config/ext/_0_xuanxuan.php
sed -i 's/site,//' zentaoxx/module/im/model/user.php
sed -i 's/admin, g/g/' zentaoxx/module/im/model/user.php
sed -i '/password = md5/d' zentaoxx/module/im/model/user.php
@@ -110,7 +109,7 @@ zentaoxx:
sed -i '/deviceToken/d' zentaoxx/db/*.sql
sed -i '/deviceType/d' zentaoxx/db/*.sql
sed -i "/fetch('push', 'pushMessage');/d" zentaoxx/module/im/control.php
sed -i "s/marked\.html\.php';?>/marked\.html\.php';?>\n<div id='mainMenu' class='clearfix'><div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('xuanxuan');?><\/div><\/div>/g" zentaoxx/module/client/view/checkupgrade.html.php
#sed -i "s/marked\.html\.php';?>/marked\.html\.php';?>\n<div id='mainMenu' class='clearfix'><div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('xuanxuan');?><\/div><\/div>/g" zentaoxx/module/client/view/checkupgrade.html.php
sed -i '/var serverVersions/d' zentaoxx/module/client/js/checkupgrade.js
sed -i '/var currentVersion/d' zentaoxx/module/client/js/checkupgrade.js
sed -i '/setRequiredFields(/d' zentaoxx/module/common/view/header.modal.html.php
@@ -120,7 +119,10 @@ zentaoxx:
sed -i 's/helper::jsonEncode(/json_encode(/g' zentaoxx/framework/xuanxuan.class.php
sed -i "s/lang->goback,/lang->goback, '',/g" zentaoxx/module/im/view/debug.html.php
sed -i 's/v\.//g' zentaoxx/module/client/js/checkupgrade.js
sed -i 's/commonModel::getLicensePropertyValue/extCommonModel::getLicensePropertyValue/g' zentaoxx/module/im/control.php
sed -i 's/commonModel::getLicensePropertyValue/extCommonModel::getLicensePropertyValue/g' zentaoxx/module/im/model/conference.php
sed -i 's/xxb_/zt_/g' zentaoxx/db/*.sql
echo "ALTER TABLE \`zt_user\` ADD \`pinyin\` varchar(255) NOT NULL DEFAULT '' AFTER \`realname\`;" >> zentaoxx/db/xuanxuan.sql
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
cp tools/en2de.php zentaoxx/tools; cd zentaoxx/tools; php en2de.php ../
rm -rf zentaoxx/tools
@@ -141,8 +143,8 @@ package:
#rm -r zentaopms/module/misc/ext
rm -rf zentaopms/tools
pms:
make common
make zentaoxx
make common
make zentaoxx
unzip zentaoxx.*.zip
cp zentaoxx/* zentaopms/ -r
cat zentaoxx/db/xuanxuan.sql >> zentaopms/db/zentao.sql
+1 -1
View File
@@ -1 +1 @@
15.0.beta1
15.0.1
+23 -11
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '20.0.beta4'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '15.0.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
$config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php.
@@ -37,10 +37,10 @@ $config->themes['default'] = 'default';
$config->langs['zh-cn'] = '简体';
$config->langs['zh-tw'] = '繁體';
$config->langs['en'] = 'English';
$config->langs['de'] = 'Deutsch';
$config->langs['fr'] = 'Français';
$config->langs['vi'] = 'Tiếng Việt';
$config->langs['ja'] = '日本語';
//$config->langs['de'] = 'Deutsch';
//$config->langs['fr'] = 'Français';
//$config->langs['vi'] = 'Tiếng Việt';
//$config->langs['ja'] = '日本語';
/* 设备类型视图文件前缀。The prefix for view file for different device. */
$config->devicePrefix['mhtml'] = '';
@@ -89,6 +89,10 @@ $config->domainPostfix .= "|villas|foundation|expert|works|tools|watch|zone|barg
$config->domainPostfix .= "|farm|pics|photo|marketing|holiday|gift|buzz|guitars|trade|construction|";
$config->domainPostfix .= "|international|house|coffee|florist|rich|ceo|camp|education|repair|win|site|";
/* Config for Content-Security-Policy. */
$config->CSPs = array();
$config->CSPs[] = "form-action 'self';connect-src 'self'";
/* 系统框架配置。Framework settings. */
$config->framework = new stdclass();
$config->framework->autoConnectDB = true; // 是否自动连接数据库。 Whether auto connect database or not.
@@ -106,6 +110,13 @@ $config->framework->logDays = 14; // 日志文件保存的天数。
$config->framework->autoRepairTable = true;
$config->framework->autoLang = false;
$config->framework->filterCSRF = false;
$config->framework->setCookieSecure = true;
$config->framework->sendXCTO = true; // Send X-Content-Type-Options header.
$config->framework->sendXXP = true; // Send X-XSS-Protection header.
$config->framework->sendHSTS = true; // Send HTTP Strict Transport Security header.
$config->framework->sendRP = true; // Send Referrer-Policy header.
$config->framework->sendXPCDP = true; // Send X-Permitted-Cross-Domain-Policies header.
$config->framework->sendXDO = true; // Send X-Download-Options header.
$config->framework->detectDevice['zh-cn'] = true; // 在zh-cn语言情况下,是否启用设备检测功能。 Whether enable device detect or not.
$config->framework->detectDevice['zh-tw'] = true; // 在zh-tw语言情况下,是否启用设备检测功能。 Whether enable device detect or not.
@@ -127,8 +138,9 @@ $config->features->checkClient = true;
/* 文件上传设置。 Upload settings. */
$config->file = new stdclass();
$config->file->dangers = 'php,php3,php4,phtml,php5,jsp,py,rb,asp,aspx,ashx,asa,cer,cdx,aspl,shtm,shtml,html,htm';
$config->file->allowed = 'txt,doc,docx,dot,wps,wri,pdf,ppt,pptx,xls,xlsx,ett,xlt,xlsm,csv,jpg,jpeg,png,psd,gif,ico,bmp,swf,avi,rmvb,rm,mp3,mp4,3gp,flv,mov,movie,rar,zip,bz,bz2,tar,gz,mpp,rp,pdm,vsdx,vsd,sql';
$config->file->dangers = 'php,php3,php4,phtml,php5,jsp,py,rb,asp,aspx,ashx,asa,cer,cdx,aspl,shtm,shtml,html,htm';
$config->file->allowed = 'txt,doc,docx,dot,wps,wri,pdf,ppt,pptx,xls,xlsx,ett,xlt,xlsm,csv,jpg,jpeg,png,psd,gif,ico,bmp,swf,avi,rmvb,rm,mp3,mp4,3gp,flv,mov,movie,rar,zip,bz,bz2,tar,gz,mpp,rp,pdm,vsdx,vsd,sql';
$config->file->storageType = 'fs'; // fs or s3
/* Upload settings. */
$config->allowedTags = '<p><span><h1><h2><h3><h4><h5><em><u><strong><br><ol><ul><li><img><a><b><font><hr><pre><div><table><td><th><tr><tbody><embed><style>';
@@ -150,6 +162,10 @@ if(file_exists($filterConfig)) include $filterConfig;
$dbConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'db.php';
if(file_exists($dbConfig)) include $dbConfig;
/* 引用自定义的配置。 Include the custom config file. */
$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php';
if(file_exists($myConfig)) include $myConfig;
/* 禅道配置文件。zentaopms settings. */
$zentaopmsConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'zentaopms.php';
if(file_exists($zentaopmsConfig)) include $zentaopmsConfig;
@@ -157,7 +173,3 @@ if(file_exists($zentaopmsConfig)) include $zentaopmsConfig;
/* Include extension config files. */
$extConfigFiles = glob(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ext/*.php');
if($extConfigFiles) foreach($extConfigFiles as $extConfigFile) include $extConfigFile;
/* 引用自定义的配置。 Include the custom config file. */
$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php';
if(file_exists($myConfig)) include $myConfig;
+43 -34
View File
@@ -26,33 +26,36 @@ $filter->default->cookie['lang'] = 'reg::lang';
$filter->default->cookie['theme'] = 'reg::word';
$filter->default->cookie['fingerprint'] = 'reg::word';
$filter->default->cookie['hideMenu'] = 'equal::true';
$filter->default->cookie['openApp'] = 'reg::word';
$filter->bug = new stdclass();
$filter->caselib = new stdclass();
$filter->doc = new stdclass();
$filter->product = new stdclass();
$filter->qa = new stdclass();
$filter->story = new stdclass();
$filter->task = new stdclass();
$filter->testcase = new stdclass();
$filter->program = new stdclass();
$filter->project = new stdclass();
$filter->testreport = new stdclass();
$filter->testsuite = new stdclass();
$filter->todo = new stdclass();
$filter->testtask = new stdclass();
$filter->upgrade = new stdclass();
$filter->sso = new stdclass();
$filter->misc = new stdclass();
$filter->mail = new stdclass();
$filter->user = new stdclass();
$filter->block = new stdclass();
$filter->file = new stdclass();
$filter->repo = new stdclass();
$filter->webhook = new stdclass();
$filter->git = new stdclass();
$filter->svn = new stdclass();
$filter->search = new stdclass();
$filter->bug = new stdclass();
$filter->caselib = new stdclass();
$filter->doc = new stdclass();
$filter->product = new stdclass();
$filter->branch = new stdclass();
$filter->qa = new stdclass();
$filter->story = new stdclass();
$filter->task = new stdclass();
$filter->testcase = new stdclass();
$filter->program = new stdclass();
$filter->project = new stdclass();
$filter->projectstory = new stdclass();
$filter->testreport = new stdclass();
$filter->testsuite = new stdclass();
$filter->todo = new stdclass();
$filter->testtask = new stdclass();
$filter->upgrade = new stdclass();
$filter->sso = new stdclass();
$filter->misc = new stdclass();
$filter->mail = new stdclass();
$filter->user = new stdclass();
$filter->block = new stdclass();
$filter->file = new stdclass();
$filter->repo = new stdclass();
$filter->webhook = new stdclass();
$filter->git = new stdclass();
$filter->svn = new stdclass();
$filter->search = new stdclass();
$filter->block->default = new stdclass();
$filter->block->main = new stdclass();
@@ -77,6 +80,7 @@ $filter->product->default = new stdclass();
$filter->product->index = new stdclass();
$filter->product->export = new stdclass();
$filter->product->project = new stdclass();
$filter->branch->default = new stdclass();
$filter->program->default = new stdclass();
$filter->program->pgmproject = new stdclass();
$filter->program->prjbrowse = new stdclass();
@@ -85,12 +89,13 @@ $filter->program->browse = new stdclass();
$filter->program->export = new stdclass();
$filter->program->pgmbrowse = new stdclass();
$filter->program->export = new stdclass();
$filter->program->ajaxgetpgmdropmenu = new stdclass();
$filter->program->ajaxgetdropmenu = new stdclass();
$filter->project->default = new stdclass();
$filter->project->browse = new stdclass();
$filter->project->story = new stdclass();
$filter->project->export = new stdclass();
$filter->project->task = new stdclass();
$filter->projectstory->story = new stdclass();
$filter->qa->default = new stdclass();
$filter->story->create = new stdclass();
$filter->story->export = new stdclass();
@@ -165,13 +170,15 @@ $filter->product->index->cookie['preBranch'] = 'int';
$filter->product->export->cookie['checkedItem'] = 'reg::checked';
$filter->product->project->cookie['involved'] = 'code';
$filter->program->default->cookie['lastPGM'] = 'int';
$filter->program->default->cookie['lastPRJ'] = 'int';
$filter->program->prjbrowse->cookie['programType'] = 'code';
$filter->program->project->cookie['involved'] = 'code';
$filter->program->browse->cookie['showClosed'] = 'code';
$filter->program->export->cookie['checkedItem'] = 'reg::checked';
$filter->program->ajaxgetpgmdropmenu->cookie['showClosed'] = 'code';
$filter->branch->default->cookie['preBranch'] = 'int';
$filter->program->default->cookie['lastPGM'] = 'int';
$filter->program->default->cookie['lastPRJ'] = 'int';
$filter->program->prjbrowse->cookie['programType'] = 'code';
$filter->program->project->cookie['involved'] = 'code';
$filter->program->browse->cookie['showClosed'] = 'code';
$filter->program->export->cookie['checkedItem'] = 'reg::checked';
$filter->program->ajaxgetdropmenu->cookie['showClosed'] = 'code';
$filter->project->default->cookie['lastProject'] = 'int';
$filter->project->default->cookie['lastPRJ'] = 'int';
@@ -189,6 +196,8 @@ $filter->project->task->cookie['projectTaskOrder'] = 'reg::orderBy';
$filter->project->task->cookie['windowWidth'] = 'int';
$filter->project->export->cookie['checkedItem'] = 'reg::checked';
$filter->projectstory->story->cookie['storyModuleParam'] = 'int';
$filter->qa->default->cookie['lastProduct'] = 'int';
$filter->qa->default->cookie['preBranch'] = 'int';
$filter->qa->default->cookie['preProductID'] = 'int';
+4 -1
View File
@@ -136,7 +136,9 @@ define('TABLE_EXPECT', '`' . $config->db->prefix . 'expect`');
define('TABLE_STAKEHOLDER', '`' . $config->db->prefix . 'stakeholder`');
define('TABLE_STORY', '`' . $config->db->prefix . 'story`');
define('TABLE_STORYSPEC', '`' . $config->db->prefix . 'storyspec`');
define('TABLE_STORYREVIEW', '`' . $config->db->prefix . 'storyreview`');
define('TABLE_STORYSTAGE', '`' . $config->db->prefix . 'storystage`');
define('TABLE_STORYESTIMATE', '`' . $config->db->prefix . 'storyestimate`');
define('TABLE_PRODUCTPLAN', '`' . $config->db->prefix . 'productplan`');
define('TABLE_PLANSTORY', '`' . $config->db->prefix . 'planstory`');
define('TABLE_RELEASE', '`' . $config->db->prefix . 'release`');
@@ -193,8 +195,8 @@ if(!defined('TABLE_SEARCHINDEX')) define('TABLE_SEARCHINDEX', $config->db->prefi
if(!defined('TABLE_SEARCHDICT')) define('TABLE_SEARCHDICT', $config->db->prefix . 'searchdict');
$config->objectTables['product'] = TABLE_PRODUCT;
$config->objectTables['story'] = TABLE_STORY;
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
$config->objectTables['story'] = TABLE_STORY;
$config->objectTables['release'] = TABLE_RELEASE;
$config->objectTables['program'] = TABLE_PROJECT;
$config->objectTables['project'] = TABLE_PROJECT;
@@ -219,6 +221,7 @@ $config->objectTables['entry'] = TABLE_ENTRY;
$config->objectTables['webhook'] = TABLE_WEBHOOK;
$config->objectTables['stakeholder'] = TABLE_STAKEHOLDER;
$config->objectTables['job'] = TABLE_JOB;
$config->objectTables['team'] = TABLE_TEAM;
/* Program privs.*/
$config->programPriv = new stdclass();
+692 -316
View File
File diff suppressed because it is too large Load Diff
+685 -330
View File
File diff suppressed because it is too large Load Diff
+170
View File
@@ -0,0 +1,170 @@
CREATE TABLE IF NOT EXISTS `zt_im_chat` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`gid` char(40) NOT NULL DEFAULT '',
`name` varchar(60) NOT NULL DEFAULT '',
`type` varchar(20) NOT NULL DEFAULT 'group',
`admins` varchar(255) NOT NULL DEFAULT '',
`committers` varchar(255) NOT NULL DEFAULT '',
`subject` mediumint(8) unsigned NOT NULL DEFAULT 0,
`public` enum('0', '1') NOT NULL DEFAULT '0',
`createdBy` varchar(30) NOT NULL DEFAULT '',
`createdDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`editedBy` varchar(30) NOT NULL DEFAULT '',
`editedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastActiveTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastMessage` int(11) unsigned NOT NULL DEFAULT 0,
`dismissDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`pinnedMessages` text NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `gid` (`gid`),
KEY `name` (`name`),
KEY `type` (`type`),
KEY `public` (`public`),
KEY `createdBy` (`createdBy`),
KEY `editedBy` (`editedBy`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_chatuser` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`cgid` char(40) NOT NULL DEFAULT '',
`user` mediumint(8) NOT NULL DEFAULT 0,
`order` smallint(5) NOT NULL DEFAULT 0,
`star` enum('0', '1') NOT NULL DEFAULT '0',
`hide` enum('0', '1') NOT NULL DEFAULT '0',
`mute` enum('0', '1') NOT NULL DEFAULT '0',
`freeze` enum('0', '1') NOT NULL DEFAULT '0',
`join` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`quit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`category` varchar(40) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `cgid` (`cgid`),
KEY `user` (`user`),
KEY `order` (`order`),
KEY `star` (`star`),
KEY `hide` (`hide`),
UNIQUE KEY `chatuser` (`cgid`, `user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_client` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`version` char(30) NOT NULL DEFAULT '',
`desc` varchar(100) NOT NULL DEFAULT '',
`changeLog` text NOT NULL,
`strategy` varchar(10) NOT NULL DEFAULT '',
`downloads` text NOT NULL,
`createdDate` datetime NOT NULL,
`createdBy` varchar(30) NOT NULL DEFAULT '',
`editedDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL DEFAULT '',
`status` enum('released','wait') NOT NULL DEFAULT 'wait',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_message` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`gid` char(40) NOT NULL DEFAULT '',
`cgid` char(40) NOT NULL DEFAULT '',
`user` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`type` enum('normal', 'broadcast', 'notify', 'bulletin') NOT NULL DEFAULT 'normal',
`content` text NOT NULL DEFAULT '',
`contentType` enum('text', 'plain', 'emotion', 'image', 'file', 'object', 'code') NOT NULL DEFAULT 'text',
`data` text NOT NULL DEFAULT '',
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `mgid` (`gid`),
KEY `mcgid` (`cgid`),
KEY `muser` (`user`),
KEY `mtype` (`type`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_message_backup` (
`id` int(11) unsigned NOT NULL,
`gid` char(40) NOT NULL DEFAULT '',
`cgid` char(40) NOT NULL DEFAULT '',
`user` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`type` enum('normal', 'broadcast', 'notify') NOT NULL DEFAULT 'normal',
`content` text NOT NULL DEFAULT '',
`contentType` enum('text', 'plain', 'emotion', 'image', 'file', 'object', 'code') NOT NULL DEFAULT 'text',
`data` text NOT NULL DEFAULT '',
`deleted` enum('0','1') NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_message_index` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`tableName` char(64) NOT NULL,
`start` int(11) unsigned NOT NULL,
`end` int(11) unsigned NOT NULL,
`startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`chats` text NOT NULL,
PRIMARY KEY (`id`),
KEY `tableName` (`tableName`),
KEY `start` (`start`),
KEY `end` (`end`),
KEY `startDate` (`startDate`),
KEY `endDate` (`endDate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_chat_message_index` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`gid` char(40) NOT NULL,
`tableName` char(64) NOT NULL,
`start` int(11) unsigned NOT NULL,
`end` int(11) unsigned NOT NULL,
`startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`count` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `chattable` (`gid`,`tableName`),
KEY `start` (`start`),
KEY `end` (`end`),
KEY `startDate` (`startDate`),
KEY `endDate` (`endDate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_messagestatus` (
`user` mediumint(8) NOT NULL DEFAULT 0,
`message` int(11) unsigned NOT NULL,
`status` enum('waiting','sent','readed','deleted') NOT NULL DEFAULT 'waiting',
UNIQUE KEY `user` (`user`,`message`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_queue` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`type` char(30) NOT NULL,
`content` text NOT NULL,
`addDate` datetime NOT NULL,
`processDate` datetime NOT NULL,
`result` text NOT NULL,
`status` char(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_conference` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`rid` char(24) NOT NULL DEFAULT '',
`cgid` char(40) NOT NULL DEFAULT '',
`status` enum('closed','open') NOT NULL DEFAULT 'closed',
`participants` text NOT NULL,
`invitee` text NOT NULL,
`openedBy` mediumint(8) NOT NULL DEFAULT 0,
`openedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_conferenceaction` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`rid` char(24) NOT NULL DEFAULT '',
`type` enum('create','join','leave','close') NOT NULL DEFAULT 'create',
`user` mediumint(8) NOT NULL DEFAULT 0,
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`device` char(40) NOT NULL DEFAULT 'default',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_im_userdevice` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`user` mediumint(8) NOT NULL DEFAULT 0,
`device` char(40) NOT NULL DEFAULT 'default',
`deviceID` char(40) NOT NULL DEFAULT '',
`token` char(64) NOT NULL DEFAULT '',
`validUntil` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastLogin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastLogout` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `user` (`user`),
KEY `lastLogin` (`lastLogin`),
KEY `lastLogout` (`lastLogout`),
UNIQUE KEY `userdevice` (`user`, `device`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+358
View File
@@ -0,0 +1,358 @@
ALTER TABLE `zt_project` DROP `isCat`, DROP `catID`;
ALTER TABLE `zt_project` ADD `project` mediumint(8) NOT NULL DEFAULT 0 AFTER `id`;
ALTER TABLE `zt_project` ADD `model` char(30) NOT NULL AFTER `project`;
ALTER TABLE `zt_project` CHANGE `type` `lifetime` char(30) NOT NULL DEFAULT '';
ALTER TABLE `zt_project` CHANGE `acl` `acl` char(30) NOT NULL DEFAULT 'open';
ALTER TABLE `zt_project` ADD `type` char(30) NOT NULL DEFAULT 'sprint' AFTER `model`;
ALTER TABLE `zt_project` ADD `product` varchar(20) NOT NULL DEFAULT 'single' AFTER `type`;
ALTER TABLE `zt_project` ADD `budget` varchar(30) NOT NULL DEFAULT '0' AFTER `lifetime`;
ALTER TABLE `zt_project` ADD `budgetUnit` char(30) NOT NULL DEFAULT 'CNY' AFTER `budget`;
ALTER TABLE `zt_project` ADD `percent` float unsigned NOT NULL DEFAULT '0' AFTER `budgetUnit`;
ALTER TABLE `zt_project` ADD `path` varchar(255) NOT NULL AFTER `parent`;
ALTER TABLE `zt_project` ADD `grade` tinyint unsigned NOT NULL AFTER `path`;
ALTER TABLE `zt_project` ADD `auth` char(30) NOT NULL AFTER `percent`;
ALTER TABLE `zt_project` ADD `milestone` enum('0','1') NOT NULL default '0' AFTER `percent`;
ALTER TABLE `zt_project` ADD `attribute` varchar(30) NOT NULL DEFAULT '' AFTER `budgetUnit`;
ALTER TABLE `zt_project` ADD `realBegan` date NOT NULL AFTER `end`;
ALTER TABLE `zt_project` ADD `realEnd` date NOT NULL AFTER `realBegan`;
ALTER TABLE `zt_project` ADD `version` smallint(6) NOT NULL AFTER `desc`;
ALTER TABLE `zt_project` ADD `parentVersion` smallint(6) NOT NULL AFTER `version`;
ALTER TABLE `zt_project` ADD `planDuration` int(11) NOT NULL AFTER `parentVersion`;
ALTER TABLE `zt_project` ADD `realDuration` int(11) NOT NULL AFTER `planDuration`;
ALTER TABLE `zt_project` ADD `output` text NOT NULL AFTER `milestone`;
ALTER TABLE `zt_project` ADD `lastEditedBy` varchar(30) NOT NULL DEFAULT '' AFTER `openedVersion`;
ALTER TABLE `zt_project` ADD `lastEditedDate` datetime NOT NULL AFTER `lastEditedBy`;
ALTER TABLE `zt_action` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_bug` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_build` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_burn` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_doc` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_relation` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_relation` CHANGE `program` `project` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_doclib` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_task` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_testreport` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_testtask` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_webhook` CHANGE `projects` `executions` text NOT NULL;
ALTER TABLE `zt_action` ADD `project` mediumint(8) unsigned NOT NULL AFTER `product`;
ALTER TABLE `zt_task` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_doclib` ADD `project` mediumint(8) unsigned NOT NULL AFTER `product`;
ALTER TABLE `zt_doc` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_story` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_bug` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_case` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testtask` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testreport` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testsuite` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_build` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_release` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_product` ADD `bind` enum('0','1') NOT NULL DEFAULT '0' AFTER `code`;
ALTER TABLE `zt_product` ADD `program` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_repo` ADD `product` varchar(255) NOT NULL AFTER `id`;
ALTER TABLE `zt_group` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
INSERT INTO `zt_group` (`name`, `role`, `desc`) VALUES ('项目管理员', 'projectAdmin', '项目管理员可以维护项目的权限');
ALTER TABLE `zt_usergroup` ADD `project` text NOT NULL;
ALTER TABLE `zt_userview` CHANGE `projects` `sprints` mediumtext NOT NULL;
ALTER TABLE `zt_userview` ADD `programs` mediumtext NOT NULL AFTER `account`;
ALTER TABLE `zt_userview` ADD `projects` mediumtext NOT NULL AFTER `programs`;
ALTER TABLE `zt_user` ADD `company` mediumint unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_user` ADD `type` char(30) NOT NULL default 'inside' AFTER `account`;
ALTER TABLE `zt_user` ADD `nature` text NOT NULL AFTER `zipcode`;
ALTER TABLE `zt_user` ADD `analysis` text NOT NULL AFTER `nature`;
ALTER TABLE `zt_user` ADD `strategy` text NOT NULL AFTER `analysis`;
ALTER TABLE `zt_user` CHANGE `avatar` `avatar` text NOT NULL AFTER `commiter`;
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'custom', '', 'URSR', '2');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'project', '', 'unitList', 'CNY,USD');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'project', '', 'defaultCurrency', 'CNY');
ALTER TABLE `zt_config` MODIFY COLUMN `value` longtext NOT NULL AFTER `key`;
UPDATE `zt_config` SET `key` = 'CRExecution' WHERE `module` = 'common' AND `key` = 'CRProject';
-- DROP TABLE IF EXISTS `zt_stakeholder`;
CREATE TABLE IF NOT EXISTS `zt_stakeholder` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`objectID` mediumint(8) NOT NULL,
`objectType` char(30) NOT NULL,
`user` char(30) NOT NULL,
`type` char(30) NOT NULL,
`key` enum('0','1') NOT NULL,
`from` char(30) NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`editedBy` char(30) NOT NULL,
`editedDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_expect`;
CREATE TABLE IF NOT EXISTS `zt_expect` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`userID` mediumint(8) NOT NULL,
`project` mediumint(8) NOT NULL DEFAULT 0,
`expect` text NOT NULL,
`progress` text NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_projectspec`;
CREATE TABLE IF NOT EXISTS `zt_projectspec` (
`project` mediumint(8) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`milestone` enum('0','1') NOT NULL DEFAULT '0',
`begin` date NOT NULL,
`end` date NOT NULL,
UNIQUE KEY `project` (`project`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_projectcase`;
CREATE TABLE `zt_projectcase` (
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
`case` mediumint(8) unsigned NOT NULL DEFAULT '0',
`version` smallint(6) NOT NULL DEFAULT '1',
`order` smallint(6) unsigned NOT NULL,
UNIQUE KEY `project` (`project`,`case`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_task` ADD `design` mediumint(8) unsigned NOT NULL AFTER `module`;
ALTER TABLE `zt_task` ADD `version` smallint(6) NOT NULL AFTER `desc`;
ALTER TABLE `zt_task` ADD `activatedDate` date NOT NULL AFTER `lastEditedDate`;
ALTER TABLE `zt_task` ADD `planDuration` int(11) NOT NULL AFTER `closedDate`;
ALTER TABLE `zt_task` ADD `realDuration` int(11) NOT NULL AFTER `closedDate`;
ALTER TABLE `zt_task` ADD `designVersion` smallint(6) unsigned NOT NULL AFTER `storyVersion`;
ALTER TABLE `zt_burn` ADD `storyPoint` float NOT NULL AFTER `consumed`;
ALTER TABLE `zt_burn` ADD `product` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `execution`;
ALTER TABLE `zt_projectcase` ADD `count` mediumint(8) unsigned NOT NULL DEFAULT '1' AFTER `case`;
-- DROP TABLE IF EXISTS `zt_taskspec`;
CREATE TABLE IF NOT EXISTS `zt_taskspec` (
`task` mediumint(8) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`estStarted` date NOT NULL,
`deadline` date NOT NULL,
UNIQUE KEY `task` (`task`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_block` ADD `type` char(30) NOT NULL AFTER `module`;
ALTER TABLE `zt_block` ADD UNIQUE `account_module_type_order` (`account`, `module`, `type`, `order`), DROP INDEX `accountModuleOrder`;
ALTER TABLE `zt_story` ADD `URChanged` enum('0','1') NOT NULL DEFAULT '0' AFTER `version`;
ALTER TABLE `zt_team` MODIFY `type` enum('project','task','execution') NOT NULL DEFAULT 'project' AFTER `root`;
CREATE TABLE IF NOT EXISTS `zt_planstory` (
`plan` mediumint(8) unsigned NOT NULL,
`story` mediumint(8) unsigned NOT NULL,
`order` mediumint(9) NOT NULL,
UNIQUE KEY `unique` (`plan`,`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_acl` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`objectType` char(30) NOT NULL,
`objectID` mediumint(9) NOT NULL DEFAULT '0',
`type` char(40) NOT NULL DEFAULT 'whitelist',
`source` char(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_searchindex`;
CREATE TABLE IF NOT EXISTS `zt_searchindex` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` char(20) NOT NULL,
`objectID` mediumint(9) NOT NULL,
`title` text NOT NULL,
`content` text NOT NULL,
`addedDate` datetime NOT NULL,
`editedDate` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `object` (`objectType`,`objectID`),
KEY `addedDate` (`addedDate`),
FULLTEXT KEY `content` (`content`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_searchdict`;
CREATE TABLE IF NOT EXISTS `zt_searchdict` (
`key` smallint(5) unsigned NOT NULL,
`value` char(3) NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
REPLACE INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(1, 'product', 'dashboard'),
(1, 'product', 'manageLine'),
(1, 'projectstory', 'story'),
(1, 'projectstory', 'track'),
(1, 'projectstory', 'view'),
(1, 'projectstory', 'linkStory'),
(1, 'projectstory', 'unLinkStory'),
(1, 'my', 'preference'),
(1, 'my', 'uploadAvatar'),
(1, 'user', 'execution'),
(1, 'user', 'cropAvatar'),
(1, 'program', 'browse'),
(1, 'program', 'view'),
(1, 'search', 'index'),
(1, 'search', 'buildIndex'),
(2, 'product', 'dashboard'),
(2, 'product', 'manageLine'),
(2, 'projectstory', 'story'),
(2, 'projectstory', 'track'),
(2, 'projectstory', 'view'),
(2, 'my', 'preference'),
(2, 'my', 'uploadAvatar'),
(2, 'user', 'execution'),
(2, 'user', 'cropAvatar'),
(2, 'search', 'index'),
(2, 'program', 'browse'),
(3, 'product', 'dashboard'),
(3, 'product', 'manageLine'),
(3, 'projectstory', 'story'),
(3, 'projectstory', 'track'),
(3, 'projectstory', 'view'),
(3, 'my', 'preference'),
(3, 'my', 'uploadAvatar'),
(3, 'user', 'execution'),
(3, 'user', 'cropAvatar'),
(3, 'search', 'index'),
(3, 'program', 'browse'),
(4, 'product', 'dashboard'),
(4, 'product', 'manageLine'),
(4, 'projectstory', 'story'),
(4, 'projectstory', 'track'),
(4, 'projectstory', 'view'),
(4, 'my', 'preference'),
(4, 'my', 'uploadAvatar'),
(4, 'user', 'execution'),
(4, 'user', 'cropAvatar'),
(4, 'program', 'view'),
(4, 'program', 'browse'),
(4, 'search', 'index'),
(5, 'product', 'dashboard'),
(5, 'product', 'manageLine'),
(5, 'projectstory', 'story'),
(5, 'projectstory', 'track'),
(5, 'projectstory', 'view'),
(5, 'projectstory', 'linkStory'),
(5, 'projectstory', 'unLinkStory'),
(5, 'my', 'preference'),
(5, 'my', 'uploadAvatar'),
(5, 'user', 'execution'),
(5, 'user', 'cropAvatar'),
(5, 'program', 'view'),
(5, 'program', 'browse'),
(5, 'search', 'index'),
(6, 'product', 'dashboard'),
(6, 'product', 'manageLine'),
(6, 'projectstory', 'story'),
(6, 'projectstory', 'track'),
(6, 'projectstory', 'view'),
(6, 'my', 'preference'),
(6, 'my', 'uploadAvatar'),
(6, 'user', 'execution'),
(6, 'user', 'cropAvatar'),
(6, 'program', 'view'),
(6, 'program', 'browse'),
(6, 'search', 'index'),
(7, 'product', 'dashboard'),
(7, 'product', 'manageLine'),
(7, 'projectstory', 'story'),
(7, 'projectstory', 'track'),
(7, 'projectstory', 'view'),
(7, 'projectstory', 'linkStory'),
(7, 'projectstory', 'unLinkStory'),
(7, 'my', 'preference'),
(7, 'my', 'uploadAvatar'),
(7, 'user', 'execution'),
(7, 'user', 'cropAvatar'),
(7, 'program', 'view'),
(7, 'program', 'browse'),
(7, 'search', 'index'),
(8, 'product', 'dashboard'),
(8, 'product', 'manageLine'),
(8, 'projectstory', 'story'),
(8, 'projectstory', 'track'),
(8, 'projectstory', 'view'),
(8, 'my', 'preference'),
(8, 'my', 'uploadAvatar'),
(8, 'user', 'execution'),
(8, 'user', 'cropAvatar'),
(8, 'program', 'view'),
(8, 'program', 'browse'),
(8, 'search', 'index'),
(9, 'product', 'dashboard'),
(9, 'product', 'manageLine'),
(9, 'projectstory', 'story'),
(9, 'projectstory', 'track'),
(9, 'projectstory', 'view'),
(9, 'projectstory', 'linkStory'),
(9, 'projectstory', 'unLinkStory'),
(9, 'my', 'preference'),
(9, 'my', 'uploadAvatar'),
(9, 'user', 'execution'),
(9, 'user', 'cropAvatar'),
(9, 'program', 'view'),
(9, 'program', 'browse'),
(9, 'search', 'index'),
(10, 'product', 'dashboard'),
(10, 'product', 'manageLine'),
(10, 'projectstory', 'story'),
(10, 'projectstory', 'track'),
(10, 'projectstory', 'view'),
(10, 'my', 'preference'),
(10, 'my', 'uploadAvatar'),
(10, 'user', 'execution'),
(10, 'user', 'cropAvatar'),
(10, 'search', 'index'),
(10, 'program', 'browse'),
(11, 'product', 'dashboard'),
(11, 'product', 'manageLine'),
(11, 'projectstory', 'story'),
(11, 'projectstory', 'track'),
(11, 'projectstory', 'view'),
(11, 'my', 'preference'),
(11, 'my', 'uploadAvatar'),
(11, 'user', 'execution'),
(11, 'program', 'browse'),
(11, 'user', 'cropAvatar');
REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '2', '{\"SRName\":\"\\u7814\\u53d1\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '3', '{\"SRName\":\"\\u8f6f\\u9700\",\"URName\":\"\\u7528\\u9700\"}', '1'),
('zh-cn', 'custom', 'URSRList', '4', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u53f2\\u8bd7\"}', '1'),
('zh-cn', 'custom', 'URSRList', '5', '{\"SRName\":\"\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('en', 'custom', 'URSRList', '1', '{\"SRName\":\"Story\",\"URName\":\"Epic\"}', '0'),
('en', 'custom', 'URSRList', '2', '{\"SRName\":\"Story\",\"URName\":\"Requirement\"}', '0');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRExecution', '1');
update zt_config set `value`='project-browse' where `key`='projectLink';
update zt_config set `value`='program-browse' where `key`='programLink';
update zt_team set type='execution' where type='project';
update zt_action set objectType='execution' where objectType='project';
update zt_file set objectType='execution' where objectType='project';
ALTER TABLE `zt_todo` ADD `deleted` ENUM( "0", "1" ) NOT NULL DEFAULT '0';
TRUNCATE `zt_block`;
DELETE FROM `zt_config` WHERE `key` = 'blockInited';
+2
View File
@@ -0,0 +1,2 @@
DELETE FROM zt_cron WHERE command='moduleName=weekly&methodName=computeWeekly';
ALTER TABLE zt_story drop column `project`;
+8
View File
@@ -0,0 +1,8 @@
ALTER TABLE `zt_webhook` CHANGE `projects` `executions` text NOT NULL;
ALTER TABLE `zt_webhook` CHANGE `executions` `executions` text NOT NULL;
ALTER TABLE `zt_projectcase` ADD `count` mediumint(8) unsigned NOT NULL DEFAULT '1' AFTER `case`;
ALTER TABLE `zt_repo` ADD `extra` char(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `desc`;
UPDATE `zt_config` set `value`='program-browse' where `key`='programLink' and `value`='program-pgmbrowse';
UPDATE `zt_config` set `value`='project-browse' where `key`='projectLink' and `value`='program-prjbrowse';
+23 -335
View File
@@ -1,342 +1,30 @@
ALTER TABLE `zt_project` DROP `isCat`, DROP `catID`;
ALTER TABLE `zt_project` ADD `project` mediumint(8) NOT NULL DEFAULT 0 AFTER `id`;
ALTER TABLE `zt_project` ADD `model` char(30) NOT NULL AFTER `project`;
ALTER TABLE `zt_project` CHANGE `type` `type` char(30) NOT NULL DEFAULT 'sprint' AFTER `model`;
ALTER TABLE `zt_project` CHANGE `acl` `acl` char(30) NOT NULL DEFAULT 'open';
ALTER TABLE `zt_project` ADD `product` varchar(20) NOT NULL DEFAULT 'single' AFTER `type`;
ALTER TABLE `zt_project` ADD `lifetime` char(30) NOT NULL AFTER `product`;
ALTER TABLE `zt_project` ADD `budget` varchar(30) NOT NULL DEFAULT '0' AFTER `lifetime`;
ALTER TABLE `zt_project` ADD `budgetUnit` char(30) NOT NULL DEFAULT 'CNY' AFTER `budget`;
ALTER TABLE `zt_project` ADD `percent` float unsigned NOT NULL DEFAULT '0' AFTER `budgetUnit`;
ALTER TABLE `zt_project` ADD `path` varchar(255) NOT NULL AFTER `parent`;
ALTER TABLE `zt_project` ADD `grade` tinyint unsigned NOT NULL AFTER `path`;
ALTER TABLE `zt_project` ADD `auth` char(30) NOT NULL AFTER `percent`;
ALTER TABLE `zt_project` ADD `milestone` enum('0','1') NOT NULL default '0' AFTER `percent`;
ALTER TABLE `zt_project` ADD `attribute` varchar(30) NOT NULL DEFAULT '' AFTER `budgetUnit`;
ALTER TABLE `zt_project` ADD `realBegan` date NOT NULL AFTER `end`;
ALTER TABLE `zt_project` ADD `realEnd` date NOT NULL AFTER `realBegan`;
ALTER TABLE `zt_project` ADD `version` smallint(6) NOT NULL AFTER `desc`;
ALTER TABLE `zt_project` ADD `parentVersion` smallint(6) NOT NULL AFTER `version`;
ALTER TABLE `zt_project` ADD `planDuration` int(11) NOT NULL AFTER `parentVersion`;
ALTER TABLE `zt_project` ADD `realDuration` int(11) NOT NULL AFTER `planDuration`;
ALTER TABLE `zt_project` ADD `output` text NOT NULL AFTER `milestone`;
ALTER TABLE `zt_project` ADD `lastEditedBy` varchar(30) NOT NULL DEFAULT '' AFTER `openedVersion`;
ALTER TABLE `zt_project` ADD `lastEditedDate` datetime NOT NULL AFTER `lastEditedBy`;
ALTER TABLE `zt_action` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_bug` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_build` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_burn` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_doc` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_relation` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_relation` CHANGE `program` `project` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_doclib` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_task` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_testreport` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_testtask` CHANGE `project` `execution` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_webhook` CHANGE `projects` `executions` mediumint(8) unsigned NOT NULL;
ALTER TABLE `zt_task` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_doclib` ADD `project` mediumint(8) unsigned NOT NULL AFTER `product`;
ALTER TABLE `zt_doc` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_story` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_bug` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_case` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testtask` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testreport` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_testsuite` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_build` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_release` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_product` ADD `bind` enum('0','1') NOT NULL DEFAULT '0' AFTER `code`;
ALTER TABLE `zt_product` ADD `program` mediumint(8) unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_repo` ADD `product` varchar(255) NOT NULL AFTER `id`;
ALTER TABLE `zt_group` ADD `project` mediumint(8) unsigned NOT NULL AFTER `id`;
INSERT INTO `zt_group` (`name`, `role`, `desc`) VALUES ('项目管理员', 'projectAdmin', '项目管理员可以维护项目的权限');
ALTER TABLE `zt_usergroup` ADD `project` text NOT NULL;
ALTER TABLE `zt_userview` ADD `programs` mediumtext NOT NULL AFTER `account`;
ALTER TABLE `zt_userview` ADD `sprints` mediumtext NOT NULL AFTER `programs`;
ALTER TABLE `zt_user` ADD `company` mediumint unsigned NOT NULL AFTER `id`;
ALTER TABLE `zt_user` ADD `type` char(30) NOT NULL default 'inside' AFTER `account`;
ALTER TABLE `zt_user` ADD `nature` text NOT NULL AFTER `zipcode`;
ALTER TABLE `zt_user` ADD `analysis` text NOT NULL AFTER `nature`;
ALTER TABLE `zt_user` ADD `strategy` text NOT NULL AFTER `analysis`;
ALTER TABLE `zt_user` CHANGE `avatar` `avatar` text NOT NULL AFTER `commiter`;
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'custom', '', 'URSR', '6');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'project', '', 'unitList', 'CNY,USD');
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'project', '', 'defaultCurrency', 'CNY');
ALTER TABLE `zt_config` MODIFY COLUMN `value` longtext NOT NULL AFTER `key`;
UPDATE `zt_config` SET `key` = 'CRExecution' WHERE `module` = 'common' AND `key` = 'CRProject';
-- DROP TABLE IF EXISTS `zt_stakeholder`;
CREATE TABLE IF NOT EXISTS `zt_stakeholder` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`objectID` mediumint(8) NOT NULL,
`objectType` char(30) NOT NULL,
`user` char(30) NOT NULL,
`type` char(30) NOT NULL,
`key` enum('0','1') NOT NULL,
`from` char(30) NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`editedBy` char(30) NOT NULL,
`editedDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_expect`;
CREATE TABLE IF NOT EXISTS `zt_expect` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`userID` mediumint(8) NOT NULL,
`project` mediumint(8) NOT NULL DEFAULT 0,
`expect` text NOT NULL,
`progress` text NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` date NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_projectspec`;
CREATE TABLE IF NOT EXISTS `zt_projectspec` (
`project` mediumint(8) NOT NULL,
-- DROP TABLE IF EXISTS `zt_storyreview`;
CREATE TABLE IF NOT EXISTS `zt_storyreview` (
`story` mediumint(9) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`milestone` enum('0','1') NOT NULL DEFAULT '0',
`begin` date NOT NULL,
`end` date NOT NULL,
UNIQUE KEY `project` (`project`,`version`)
`reviewer` varchar(30) NOT NULL,
`result` varchar(30) NOT NULL,
`reviewDate` datetime NOT NULL,
UNIQUE KEY `story` (`story`,`version`,`reviewer`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_projectcase`;
CREATE TABLE `zt_projectcase` (
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
`case` mediumint(8) unsigned NOT NULL DEFAULT '0',
`version` smallint(6) NOT NULL DEFAULT '1',
`order` smallint(6) unsigned NOT NULL,
UNIQUE KEY `project` (`project`,`case`)
-- DROP TABLE IF EXISTS `zt_storyestimate`;
CREATE TABLE IF NOT EXISTS `zt_storyestimate` (
`story` mediumint(9) NOT NULL,
`round` smallint(6) NOT NULL,
`estimate` text NOT NULL,
`average` float(10,2) NOT NULL,
`openedBy` varchar(30) NOT NULL,
`openedDate` datetime NOT NULL,
UNIQUE KEY `story` (`story`,`round`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_task` ADD `design` mediumint(8) unsigned NOT NULL AFTER `module`;
ALTER TABLE `zt_task` ADD `version` smallint(6) NOT NULL AFTER `desc`;
ALTER TABLE `zt_task` ADD `activatedDate` date NOT NULL AFTER `lastEditedDate`;
ALTER TABLE `zt_task` ADD `planDuration` int(11) NOT NULL AFTER `closedDate`;
ALTER TABLE `zt_task` ADD `realDuration` int(11) NOT NULL AFTER `closedDate`;
ALTER TABLE `zt_task` ADD `designVersion` smallint(6) unsigned NOT NULL AFTER `storyVersion`;
ALTER TABLE `zt_project` CHANGE `lifetime` `lifetime` char(30) NOT NULL DEFAULT '';
ALTER TABLE `zt_story` ADD `category` varchar(30) NOT NULL DEFAULT 'feature' AFTER `type`;
ALTER TABLE `zt_testtask` ADD `type` varchar(255) NOT NULL DEFAULT '' AFTER `build`;
ALTER TABLE `zt_testtask` ADD `testreport` mediumint(8) unsigned NOT NULL AFTER `status`;
ALTER TABLE `zt_story` MODIFY COLUMN `reviewedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00';
ALTER TABLE `zt_burn` ADD `storyPoint` float NOT NULL AFTER `consumed`;
ALTER TABLE `zt_burn` ADD `product` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `execution`;
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'story', '', 'reviewRules', 'allpass');
-- DROP TABLE IF EXISTS `zt_taskspec`;
CREATE TABLE IF NOT EXISTS `zt_taskspec` (
`task` mediumint(8) NOT NULL,
`version` smallint(6) NOT NULL,
`name` varchar(255) NOT NULL,
`estStarted` date NOT NULL,
`deadline` date NOT NULL,
UNIQUE KEY `task` (`task`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
ALTER TABLE `zt_block` ADD `type` char(30) NOT NULL AFTER `module`;
ALTER TABLE `zt_block` ADD UNIQUE `account_module_type_order` (`account`, `module`, `type`, `order`), DROP INDEX `accountModuleOrder`;
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('1', '0', '*', '*', '*', 'moduleName=weekly&methodName=computeWeekly', '更新项目周报', 'system', 0, 'normal', '2020-08-27 10:07:53');
ALTER TABLE `zt_story` ADD `URChanged` enum('0','1') NOT NULL DEFAULT '0' AFTER `version`;
ALTER TABLE `zt_team` MODIFY `type` enum('project','task','execution') NOT NULL DEFAULT 'project' AFTER `root`;
CREATE TABLE IF NOT EXISTS `zt_planstory` (
`plan` mediumint(8) unsigned NOT NULL,
`story` mediumint(8) unsigned NOT NULL,
`order` mediumint(9) NOT NULL,
UNIQUE KEY `unique` (`plan`,`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_acl` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`objectType` char(30) NOT NULL,
`objectID` mediumint(9) NOT NULL DEFAULT '0',
`type` char(40) NOT NULL DEFAULT 'whitelist',
`source` char(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_searchindex`;
CREATE TABLE IF NOT EXISTS `zt_searchindex` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` char(20) NOT NULL,
`objectID` mediumint(9) NOT NULL,
`title` text NOT NULL,
`content` text NOT NULL,
`addedDate` datetime NOT NULL,
`editedDate` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `object` (`objectType`,`objectID`),
KEY `addedDate` (`addedDate`),
FULLTEXT KEY `content` (`content`),
FULLTEXT KEY `title` (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_searchdict`;
CREATE TABLE IF NOT EXISTS `zt_searchdict` (
`key` smallint(5) unsigned NOT NULL,
`value` char(3) NOT NULL,
PRIMARY KEY (`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
REPLACE INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(1, 'product', 'dashboard'),
(1, 'product', 'manageLine'),
(1, 'projectstory', 'story'),
(1, 'projectstory', 'track'),
(1, 'projectstory', 'view'),
(1, 'projectstory', 'linkStory'),
(1, 'projectstory', 'unLinkStory'),
(1, 'my', 'preference'),
(1, 'my', 'uploadAvatar'),
(1, 'user', 'execution'),
(1, 'user', 'cropAvatar'),
(1, 'program', 'browse'),
(1, 'program', 'view'),
(1, 'search', 'index'),
(1, 'search', 'buildIndex'),
(2, 'product', 'dashboard'),
(2, 'product', 'manageLine'),
(2, 'projectstory', 'story'),
(2, 'projectstory', 'track'),
(2, 'projectstory', 'view'),
(2, 'my', 'preference'),
(2, 'my', 'uploadAvatar'),
(2, 'user', 'execution'),
(2, 'user', 'cropAvatar'),
(2, 'search', 'index'),
(2, 'program', 'browse'),
(3, 'product', 'dashboard'),
(3, 'product', 'manageLine'),
(3, 'projectstory', 'story'),
(3, 'projectstory', 'track'),
(3, 'projectstory', 'view'),
(3, 'my', 'preference'),
(3, 'my', 'uploadAvatar'),
(3, 'user', 'execution'),
(3, 'user', 'cropAvatar'),
(3, 'search', 'index'),
(3, 'program', 'browse'),
(4, 'product', 'dashboard'),
(4, 'product', 'manageLine'),
(4, 'projectstory', 'story'),
(4, 'projectstory', 'track'),
(4, 'projectstory', 'view'),
(4, 'my', 'preference'),
(4, 'my', 'uploadAvatar'),
(4, 'user', 'execution'),
(4, 'user', 'cropAvatar'),
(4, 'program', 'view'),
(4, 'program', 'browse'),
(4, 'search', 'index'),
(5, 'product', 'dashboard'),
(5, 'product', 'manageLine'),
(5, 'projectstory', 'story'),
(5, 'projectstory', 'track'),
(5, 'projectstory', 'view'),
(5, 'projectstory', 'linkStory'),
(5, 'projectstory', 'unLinkStory'),
(5, 'my', 'preference'),
(5, 'my', 'uploadAvatar'),
(5, 'user', 'execution'),
(5, 'user', 'cropAvatar'),
(5, 'program', 'view'),
(5, 'program', 'browse'),
(5, 'search', 'index'),
(6, 'product', 'dashboard'),
(6, 'product', 'manageLine'),
(6, 'projectstory', 'story'),
(6, 'projectstory', 'track'),
(6, 'projectstory', 'view'),
(6, 'my', 'preference'),
(6, 'my', 'uploadAvatar'),
(6, 'user', 'execution'),
(6, 'user', 'cropAvatar'),
(6, 'program', 'view'),
(6, 'program', 'browse'),
(6, 'search', 'index'),
(7, 'product', 'dashboard'),
(7, 'product', 'manageLine'),
(7, 'projectstory', 'story'),
(7, 'projectstory', 'track'),
(7, 'projectstory', 'view'),
(7, 'projectstory', 'linkStory'),
(7, 'projectstory', 'unLinkStory'),
(7, 'my', 'preference'),
(7, 'my', 'uploadAvatar'),
(7, 'user', 'execution'),
(7, 'user', 'cropAvatar'),
(7, 'program', 'view'),
(7, 'program', 'browse'),
(7, 'search', 'index'),
(8, 'product', 'dashboard'),
(8, 'product', 'manageLine'),
(8, 'projectstory', 'story'),
(8, 'projectstory', 'track'),
(8, 'projectstory', 'view'),
(8, 'my', 'preference'),
(8, 'my', 'uploadAvatar'),
(8, 'user', 'execution'),
(8, 'user', 'cropAvatar'),
(8, 'program', 'view'),
(8, 'program', 'browse'),
(8, 'search', 'index'),
(9, 'product', 'dashboard'),
(9, 'product', 'manageLine'),
(9, 'projectstory', 'story'),
(9, 'projectstory', 'track'),
(9, 'projectstory', 'view'),
(9, 'projectstory', 'linkStory'),
(9, 'projectstory', 'unLinkStory'),
(9, 'my', 'preference'),
(9, 'my', 'uploadAvatar'),
(9, 'user', 'execution'),
(9, 'user', 'cropAvatar'),
(9, 'program', 'view'),
(9, 'program', 'browse'),
(9, 'search', 'index'),
(10, 'product', 'dashboard'),
(10, 'product', 'manageLine'),
(10, 'projectstory', 'story'),
(10, 'projectstory', 'track'),
(10, 'projectstory', 'view'),
(10, 'my', 'preference'),
(10, 'my', 'uploadAvatar'),
(10, 'user', 'execution'),
(10, 'user', 'cropAvatar'),
(10, 'search', 'index'),
(10, 'program', 'browse'),
(11, 'product', 'dashboard'),
(11, 'product', 'manageLine'),
(11, 'projectstory', 'story'),
(11, 'projectstory', 'track'),
(11, 'projectstory', 'view'),
(11, 'my', 'preference'),
(11, 'my', 'uploadAvatar'),
(11, 'user', 'execution'),
(11, 'program', 'browse'),
(11, 'user', 'cropAvatar');
INSERT INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '2', '{\"SRName\":\"\\u7814\\u53d1\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
('zh-cn', 'custom', 'URSRList', '3', '{\"SRName\":\"\\u8f6f\\u9700\",\"URName\":\"\\u7528\\u9700\"}', '1'),
('zh-cn', 'custom', 'URSRList', '4', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u53f2\\u8bd7\"}', '1'),
('zh-cn', 'custom', 'URSRList', '5', '{\"SRName\":\"\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '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', '', 'CRExecution', '1');
UPDATE zt_project SET lifetime = '' WHERE lifetime = 'sprint';
+647 -587
View File
File diff suppressed because it is too large Load Diff
+75 -77
View File
@@ -16,7 +16,7 @@ class baseControl
/**
* 全局对象 $app。
* The global $app object.
*
*
* @var object
* @access public
*/
@@ -25,7 +25,7 @@ class baseControl
/**
* 应用名称 $appName
* The global $appName.
*
*
* @var string
* @access public
*/
@@ -34,7 +34,7 @@ class baseControl
/**
* 全局对象 $config。
* The global $config object.
*
*
* @var object
* @access public
*/
@@ -43,7 +43,7 @@ class baseControl
/**
* 全局对象 $lang。
* The global $lang object.
*
*
* @var object
* @access public
*/
@@ -52,7 +52,7 @@ class baseControl
/**
* 全局对象 $dbh,数据库连接句柄。
* The global $dbh object, the database connection handler.
*
*
* @var object
* @access public
*/
@@ -61,7 +61,7 @@ class baseControl
/**
* $dao对象,实现sql的拼装和执行。
* The $dao object, used to join sql and excute sql.
*
*
* @var object
* @access public
*/
@@ -70,7 +70,7 @@ class baseControl
/**
* $post对象,用户可以通过$this->post->key来引用$_POST变量。
* The $post object, useer can access a post var by $this->post->key.
*
*
* @var object
* @access public
*/
@@ -79,7 +79,7 @@ class baseControl
/**
* $get对象,用户可以通过$this->get->key来引用$_GET变量。
* The $get object, useer can access a get var by $this->get->key.
*
*
* @var object
* @access public
*/
@@ -88,7 +88,7 @@ class baseControl
/**
* $session对象,用户可以通过$this->session->key来引用$_SESSION变量。
* The $session object, useer can access a session var by $this->session->key.
*
*
* @var object
* @access public
*/
@@ -97,7 +97,7 @@ class baseControl
/**
* $server对象,用户可以通过$this->server->key来引用$_SERVER变量。
* The $server object, useer can access a server var by $this->server->key.
*
*
* @var object
* @access public
*/
@@ -106,7 +106,7 @@ class baseControl
/**
* $cookie对象,用户可以通过$this->cookie->key来引用$_COOKIE变量。
* The $cookie object, useer can access a cookie var by $this->cookie->key.
*
*
* @var object
* @access public
*/
@@ -115,7 +115,7 @@ class baseControl
/**
* 当前模块的名称。
* The name of current module.
*
*
* @var string
* @access public
*/
@@ -124,16 +124,16 @@ class baseControl
/**
* $view用于存放从control传到view视图的数据。
* The vars assigned to the view page.
*
*
* @var object
* @access public
*/
public $view;
public $view;
/**
* 视图的类型,比如html, json。
* The type of the view, such html, json.
*
*
* @var string
* @access public
*/
@@ -142,7 +142,7 @@ class baseControl
/**
* 输出到浏览器的内容。
* The content to display.
*
*
* @var string
* @access public
*/
@@ -151,25 +151,25 @@ class baseControl
/**
* 客户端设备。
* The client device.
*
* @var string
*
* @var string
* @access public
*/
public $clientDevice;
/**
* 不同设备下视图文件的前缀。
* The prefix of view file for mobile or PC.
*
* @var string
* The prefix of view file for mobile or PC.
*
* @var string
* @access public
*/
public $devicePrefix;
/**
* 构造方法。
*
* 1. 将全局变量设为baseControl类的成员变量,方便baseControl的派生类调用;
* 构造方法。
*
* 1. 将全局变量设为baseControl类的成员变量,方便baseControl的派生类调用;
* 2. 设置当前模块,读取该模块的model类;
* 3. 初始化$view视图类。
*
@@ -178,10 +178,10 @@ class baseControl
* 1. global the global vars, refer them by the class member such as $this->app.
* 2. set the pathes of current module, and load it's model class.
* 3. auto assign the $lang and $config to the view.
*
* @param string $moduleName
* @param string $methodName
* @param string $appName
*
* @param string $moduleName
* @param string $methodName
* @param string $appName
* @access public
* @return void
*/
@@ -234,10 +234,10 @@ class baseControl
//-------------------- Model相关方法(Model related methods) --------------------//
/*
* 设置模块名。
* Set the module name.
*
/*
* 设置模块名。
* Set the module name.
*
* @param string $moduleName 模块名,如果为空,则从$app中获取. The module name, if empty, get it from $app.
* @access public
* @return void
@@ -250,8 +250,8 @@ class baseControl
/**
* 设置方法名。
* Set the method name.
*
* @param string $methodName 方法名,如果为空,则从$app中获取。The method name, if empty, get it from $app.
*
* @param string $methodName 方法名,如果为空,则从$app中获取。The method name, if empty, get it from $app.
* @access public
* @return void
*/
@@ -263,7 +263,7 @@ class baseControl
/**
* 加载指定模块的model文件。
* Load the model file of one module.
*
*
* @param string $moduleName 模块名,如果为空,使用当前模块。The module name, if empty, use current module's name.
* @param string $appName The app name, if empty, use current app's name.
* @access public
@@ -286,9 +286,9 @@ class baseControl
/**
* 如果没有model文件,尝试加载config配置信息。
* If no model file, try load config.
* If no model file, try load config.
*/
if(!helper::import($modelFile))
if(!helper::import($modelFile))
{
$this->app->loadModuleConfig($moduleName, $appName);
$this->app->loadLang($moduleName, $appName);
@@ -296,7 +296,7 @@ class baseControl
return false;
}
/**
/**
* 如果没有扩展文件,model类名是$moduleName + 'model',如果有扩展,还需要增加ext前缀。
* If no extension file, model class name is $moduleName + 'model', else with 'ext' as the prefix.
*/
@@ -307,7 +307,7 @@ class baseControl
if(!class_exists($modelClass)) $this->app->triggerError(" The model $modelClass not found", __FILE__, __LINE__, $exit = true);
}
/**
/**
* 初始化model对象,在control对象中可以通过$this->$moduleName来引用。同时将dao对象赋为control对象的成员变量,方便引用。
* Init the model object thus you can try $this->$moduleName to access it. Also assign the $dao object as a member of control object.
*/
@@ -320,7 +320,7 @@ class baseControl
/**
* 设置超级全局变量,方便直接引用。
* Set the super vars.
*
*
* @access public
* @return void
*/
@@ -336,7 +336,7 @@ class baseControl
/**
* 设置客户端的设备类型。
* Set client device.
*
*
* @access public
* @return void
*/
@@ -362,7 +362,7 @@ class baseControl
/**
* 设置视图文件:主视图文件,扩展视图文件, 站点扩展视图文件,以及钩子脚本。
* Set view files: the main file, extension view file, site extension view file and hook files.
*
*
* @param string $moduleName module name
* @param string $methodName method name
* @access public
@@ -401,15 +401,15 @@ class baseControl
/**
* 获取某一个视图文件的扩展。
* Get the extension file of an view.
*
* @param string $viewFile
*
* @param string $viewFile
* @access public
* @return string|bool If extension view file exists, return the path. Else return fasle.
*/
public function getExtViewFile($viewFile)
{
/**
* 首先找sitecode下的扩展文件,如果没有,再找ext下的扩展文件。
* 首先找sitecode下的扩展文件,如果没有,再找ext下的扩展文件。
* Find extViewFile in ext/_$siteCode/view first, then try ext/view/.
*/
if($this->app->siteCode)
@@ -437,9 +437,9 @@ class baseControl
/**
* 获取适用于当前方法的css:该模块公用的css + 当前方法的css + 扩展的css。
* Get css codes applied to current method: module common css + method css + extension css.
*
* @param string $moduleName
* @param string $methodName
*
* @param string $moduleName
* @param string $methodName
* @access public
* @return string
*/
@@ -504,8 +504,8 @@ class baseControl
/**
* Get extension css and extension css with lang.
*
* @param array $files
*
* @param array $files
* @access public
* @return string
*/
@@ -556,9 +556,9 @@ class baseControl
/**
* 获取适用于当前方法的js:该模块公用的js + 当前方法的js + 扩展的js。
* Get js codes applied to current method: module common js + method js + extension js.
*
* @param string $moduleName
* @param string $methodName
*
* @param string $moduleName
* @param string $methodName
* @access public
* @return string
*/
@@ -599,14 +599,14 @@ class baseControl
if(!empty($jsExtFiles) and is_array($jsExtFiles)) foreach($jsExtFiles as $jsFile) $js .= file_get_contents($jsFile);
}
}
return $js;
}
/**
* 向$view传递一个变量。
* Assign one var to the view vars.
*
*
* @param string $name the name.
* @param mixed $value the value.
* @access public
@@ -631,7 +631,7 @@ class baseControl
/**
* 渲染视图文件。
* Parse view file.
* Parse view file.
*
* @param string $moduleName module name, if empty, use current module.
* @param string $methodName method name, if empty, use current method.
@@ -698,7 +698,7 @@ class baseControl
/**
* 获得当前页面的CSS和JS。
* Get css and js codes for current method.
* Get css and js codes for current method.
*/
$css = $this->getCSS($moduleName, $methodName);
$js = $this->getJS($moduleName, $methodName);
@@ -707,7 +707,7 @@ class baseControl
/**
* 切换到视图文件所在的目录,以保证视图文件里面的include语句能够正常运行。
* Change the dir to the view file to keep the relative pathes work.
* Change the dir to the view file to keep the relative pathes work.
*/
$currentPWD = getcwd();
chdir(dirname($viewFile));
@@ -725,7 +725,7 @@ class baseControl
/**
* 渲染完毕后,再切换回之前的路径。
* At the end, chang the dir to the previous.
* At the end, chang the dir to the previous.
*/
chdir($currentPWD);
}
@@ -752,7 +752,7 @@ class baseControl
if($moduleName == '') $moduleName = $this->moduleName;
if($methodName == '') $methodName = $this->methodName;
if($appName == '') $appName = $this->appName;
if($moduleName == $this->moduleName and $methodName == $this->methodName)
if($moduleName == $this->moduleName and $methodName == $this->methodName)
{
$this->parse($moduleName, $methodName);
return $this->output;
@@ -810,7 +810,7 @@ class baseControl
/**
* 加载控制器文件。
* Load the control file.
* Load the control file.
*/
if(!is_file($file2Included)) $this->app->triggerError("The control file $file2Included not found", __FILE__, __LINE__, $exit = true);
if(!class_exists($classNameToFetch))
@@ -821,26 +821,26 @@ class baseControl
/**
* 设置调用的类名。
* Set the name of the class to be called.
* Set the name of the class to be called.
*/
$className = class_exists("my$moduleName") ? "my$moduleName" : $moduleName;
if(!class_exists($className)) $this->app->triggerError(" The class $className not found", __FILE__, __LINE__, $exit = true);
/**
* 解析参数,创建模块control对象。
* Parse the params, create the $module control object.
* Parse the params, create the $module control object.
*/
$module = new $className($moduleName, $methodName, $appName);
/**
* 调用对应方法,使用ob方法获取输出内容。
* Call the method and use ob function to get the output.
* Call the method and use ob function to get the output.
*/
ob_start();
call_user_func_array(array($module, $methodName), $params);
$output = ob_get_contents();
ob_end_clean();
unset($module);
/**
@@ -855,14 +855,14 @@ class baseControl
/**
* 返回内容。
* Return the content.
* Return the content.
*/
return $output;
}
/**
* 向浏览器输出内容。
* Print the content of the view.
* Print the content of the view.
*
* @param string $moduleName module name
* @param string $methodName method name
@@ -875,12 +875,12 @@ class baseControl
echo $this->output;
}
/**
/**
* 直接输出data数据,通常用于ajax请求中。
* Send data directly, for ajax requests.
*
* @param misc $data
* @param string $type
* @param misc $data
* @param string $type
* @access public
* @return void
*/
@@ -897,7 +897,7 @@ class baseControl
/**
* 响应非ajax的请求。
* Response request not ajax.
* Response request not ajax.
*/
if(isset($data['result']) and $data['result'] == 'success')
{
@@ -928,21 +928,19 @@ class baseControl
* @param string|array $vars the params passed, can be array(key=>value) or key1=value1&key2=value2
* @param string $viewType the view type
* @param string $onlybody remove header and footer or not in iframe
* @param string $PRJID the project id
* @param string $removePRJ if remove PRJ param
* @access public
* @return string the link string.
*/
public function createLink($moduleName, $methodName = 'index', $vars = array(), $viewType = '', $onlybody = false, $PRJID = 0, $removePRJ = false)
public function createLink($moduleName, $methodName = 'index', $vars = array(), $viewType = '', $onlybody = false)
{
if(empty($moduleName)) $moduleName = $this->moduleName;
return helper::createLink($moduleName, $methodName, $vars, $viewType, $onlybody, $PRJID, $removePRJ);
return helper::createLink($moduleName, $methodName, $vars, $viewType, $onlybody);
}
/**
* 创建当前模块的一个方法链接。
* Create a link to the inner method of current module.
*
*
* @param string $methodName method name
* @param string|array $vars the params passed, can be array(key=>value) or key1=value1&key2=value2
* @param string $viewType the view type
@@ -957,7 +955,7 @@ class baseControl
/**
* 重定向到另一个页面。
* Location to another page.
*
*
* @param string $url the target url.
* @access public
* @return void
+25 -50
View File
@@ -56,17 +56,14 @@ class baseHelper
* @param string|array $vars the params passed to the method, can be array('key' => 'value') or key1=value1&key2=value2) or key1=value1&key2=value2
* @param string $viewType the view type
* @param bool $onlyBody pass onlyBody=yes to the link thus the app can control the header and footer hide or show..
* @param bool $PRJID set PRJ id in to session.
* @param bool $removePRJ if true, remove PRJ param.
* @static
* @access public
* @return string the link string.
*/
static public function createLink($moduleName, $methodName = 'index', $vars = '', $viewType = '', $onlyBody = false, $PRJID = 0, $removePRJ = false)
static public function createLink($moduleName, $methodName = 'index', $vars = '', $viewType = '', $onlyBody = false)
{
/* 设置$appName和$moduleName。Set appName and moduleName. */
global $app, $config;
$PRJID = $PRJID ? $PRJID : $app->session->PRJ;
if(strpos($moduleName, '.') !== false)
{
@@ -98,8 +95,7 @@ class baseHelper
if($viewType != 'html') $link .= "&{$config->viewVar}=" . $viewType;
foreach($vars as $key => $value) $link .= "&$key=$value";
$link = self::processOnlyBodyParam($link, $onlyBody);
return self::processProjectParam($link, $PRJID, $onlyBody, $moduleName, $removePRJ);
return self::processOnlyBodyParam($link, $onlyBody);
}
/**
@@ -114,8 +110,7 @@ class baseHelper
foreach($vars as $value) $link .= "{$config->requestFix}$value";
$link .= '.' . $viewType;
$link = self::processOnlyBodyParam($link, $onlyBody);
return self::processProjectParam($link, $PRJID, $onlyBody, $moduleName, $removePRJ);
return self::processOnlyBodyParam($link, $onlyBody);
}
/**
@@ -126,8 +121,7 @@ class baseHelper
if($moduleName == $config->default->module)
{
$link .= $config->default->method . '.' . $viewType;
$link = self::processOnlyBodyParam($link, $onlyBody);
return self::processProjectParam($link, $PRJID, $onlyBody, $moduleName, $removePRJ);
return self::processOnlyBodyParam($link, $onlyBody);
}
/**
@@ -138,8 +132,7 @@ class baseHelper
if($viewType == $app->getViewType())
{
$link .= $moduleName . '/';
$link = self::processOnlyBodyParam($link, $onlyBody);
return self::processProjectParam($link, $PRJID, $onlyBody, $moduleName, $removePRJ);
return self::processOnlyBodyParam($link, $onlyBody);
}
/**
@@ -148,36 +141,7 @@ class baseHelper
*
*/
$link .= $moduleName . '.' . $viewType;
$link = self::processOnlyBodyParam($link, $onlyBody);
return self::processProjectParam($link, $PRJID, $onlyBody, $moduleName, $removePRJ);
}
/**
* 处理PRJ 参数。
* Process the PRJID param in url.
*
* 如果传参的时候设定了$PRJID,在生成链接的时候继续追加。
* If $progrmID in the url, append it to the link.
*
* @param string $link
* @param int $PRJID
* @param bool $onlybody
* @param string $moduleName
* @param bool $removePRJ
* @static
* @access public
* @return string
*/
public static function processProjectParam($link, $PRJID = '', $onlybody = false, $moduleName = '', $removePRJ = false)
{
global $config, $lang;
if(!$PRJID || $removePRJ) return $link;
$app = zget($lang->navGroup, $moduleName);
if($app != 'project' and $app != 'execution') return $link;
$link .= strpos($link, '?') === false ? "?PRJ=$PRJID" : "&PRJ=$PRJID";
return $link;
return self::processOnlyBodyParam($link, $onlyBody);
}
/**
@@ -251,15 +215,12 @@ class baseHelper
{
if(is_array($idList))
{
if(!function_exists('get_magic_quotes_gpc') or !get_magic_quotes_gpc())
{
foreach($idList as $key=>$value) $idList[$key] = addslashes($value);
}
foreach($idList as $key=>$value) $idList[$key] = addslashes($value);
return "IN ('" . join("','", $idList) . "')";
}
if(!is_string($idList)) $idList = json_encode($idList);
if(!function_exists('get_magic_quotes_gpc') or !get_magic_quotes_gpc()) $idList = addslashes($idList);
$idList = addslashes($idList);
return "IN ('" . str_replace(',', "','", str_replace(' ', '', $idList)) . "')";
}
@@ -302,7 +263,7 @@ class baseHelper
*/
static public function jsonEncode($data)
{
return (function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc()) ? addslashes(json_encode($data)) : json_encode($data);
return json_encode($data);
}
/**
@@ -331,7 +292,7 @@ class baseHelper
$oversize = strlen($password) % 8;
if($oversize != 0) $password .= str_repeat("\0", 8 - $oversize);
$encrypted = @openssl_encrypt($password, 'DES-CBC', $secret, OPENSSL_ZERO_PADDING);
$encrypted = @openssl_encrypt($password, 'DES-CBC', substr($secret, 0, 8), OPENSSL_ZERO_PADDING);
}
}
if(empty($encrypted)) $encrypted = $password;
@@ -357,7 +318,7 @@ class baseHelper
$secret = $config->encryptSecret;
if(function_exists('mcrypt_decrypt'))
{
$decryptedPassword = @mcrypt_decrypt(MCRYPT_DES, $secret, base64_decode($password), MCRYPT_MODE_CBC);
$decryptedPassword = @mcrypt_decrypt(MCRYPT_DES, substr($secret, 0, 8), base64_decode($password), MCRYPT_MODE_CBC);
}
elseif(function_exists('openssl_decrypt'))
{
@@ -907,3 +868,17 @@ function zget($var, $key, $valueWhenNone = false, $valueWhenExists = false)
if($valueWhenNone !== false) return $valueWhenNone;
return $key;
}
/**
* Is https.
*
* @access public
* @return bool
*/
function isHttps()
{
if(!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') return true;
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') return true;
if(!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') return true;
return false;
}
+38 -24
View File
@@ -376,13 +376,13 @@ class baseRouter
$this->loadClass('dao', $static = true);
$this->loadClass('mobile', $static = true);
$this->setCookieSecure();
$this->setOpenApp();
$this->setSuperVars();
$this->setDebug();
$this->setErrorHandler();
$this->setTimezone();
$this->startSession();
$this->setProject();
$this->setOpenApp();
if($this->config->framework->multiSite) $this->setSiteCode() && $this->loadExtraConfig();
if($this->config->framework->autoConnectDB) $this->connectDB();
@@ -600,7 +600,7 @@ class baseRouter
$this->get = new super('get');
$this->server = new super('server');
$this->cookie = new super('cookie');
$this->session = new super('session');
$this->session = new super('session', $this->openApp);
unset($GLOBALS);
unset($_REQUEST);
@@ -619,6 +619,18 @@ class baseRouter
$_COOKIE = validater::filterSuper($_COOKIE);
}
/**
* Set cookieSecure config.
*
* @access public
* @return void
*/
public function setCookieSecure()
{
$this->config->cookieSecure = false;
if($this->config->framework->setCookieSecure and isHttps()) $this->config->cookieSecure = true;
}
/**
* 设置Debug模式。
* set Debug.
@@ -841,7 +853,7 @@ class baseRouter
{
$sessionName = $this->config->sessionVar;
session_name($sessionName);
session_set_cookie_params(0, $this->config->webRoot);
session_set_cookie_params(0, $this->config->webRoot, '', $this->config->cookieSecure, true);
if($this->config->customSession) session_save_path($this->getTmpRoot() . 'session');
session_start();
@@ -854,18 +866,6 @@ class baseRouter
}
}
/**
* 从Get里取project id 设置到session中。
* Get project id from Get and set it to session.
*
* @access public
* @return void
*/
public function setProject()
{
if(isset($_GET['PRJ'])) $this->session->set('PRJ', $_GET['PRJ']); //Set project id into session.
}
/**
* 从cookie中获取当前的group, 即URL锚链接'#open=?'。
* Get current group from cookie, original source is url '#open=?'.
@@ -875,7 +875,15 @@ class baseRouter
*/
public function setOpenApp()
{
if(isset($_COOKIE['openApp'])) $this->openApp = $_COOKIE['openApp'];
if(isset($_COOKIE['openApp']) and $_COOKIE['openApp'])
{
$this->openApp = $_COOKIE['openApp'];
}
else
{
$module = $this->rawModule;
$this->openApp = isset($this->lang->navGroup->$module) ? $this->lang->navGroup->$module : 'my';
}
}
/**
@@ -906,7 +914,7 @@ class baseRouter
$this->clientLang = $this->config->default->lang;
}
setcookie('lang', $this->clientLang, $this->config->cookieLife, $this->config->webRoot, '', false, false);
setcookie('lang', $this->clientLang, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, false);
if(!isset($_COOKIE['lang'])) $_COOKIE['lang'] = $this->clientLang;
return true;
@@ -960,7 +968,7 @@ class baseRouter
$this->clientTheme = $this->config->default->theme;
}
setcookie('theme', $this->clientTheme, $this->config->cookieLife, $this->config->webRoot, '', false, false);
setcookie('theme', $this->clientTheme, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, false);
if(!isset($_COOKIE['theme'])) $_COOKIE['theme'] = $this->clientTheme;
return true;
@@ -986,7 +994,7 @@ class baseRouter
$this->clientDevice = ($mobile->isMobile() and !$mobile->isTablet()) ? 'mobile' : 'desktop';
}
setcookie('device', $this->clientDevice, $this->config->cookieLife, $this->config->webRoot, '', false, true);
setcookie('device', $this->clientDevice, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, true);
if(!isset($_COOKIE['device'])) $_COOKIE['device'] = $this->clientDevice;
return $this->clientDevice;
@@ -1830,7 +1838,6 @@ class baseRouter
global $filter;
/* Remove these three params. */
unset($passedParams['PRJ']);
unset($passedParams['onlybody']);
unset($passedParams['HTTP_X_REQUESTED_WITH']);
@@ -2269,6 +2276,9 @@ class baseRouter
extract($trace[1]);
$log .= ", last called by $file on line $line through function $function.\n";
/* Change absolute path to relative path. */
$log = str_replace($this->basePath, '', $log);
/* 触发错误(Trigger the error) */
trigger_error($log, $exit ? E_USER_ERROR : E_USER_WARNING);
}
@@ -2477,9 +2487,10 @@ class super
* @access public
* @return void
*/
public function __construct($scope)
public function __construct($scope, $openApp = '')
{
$this->scope = $scope;
$this->scope = $scope;
$this->openApp = $openApp;
}
/**
@@ -2491,7 +2502,7 @@ class super
* @access public
* @return void
*/
public function set($key, $value)
public function set($key, $value, $openApp = '')
{
if($this->scope == 'post')
{
@@ -2511,6 +2522,7 @@ class super
}
elseif($this->scope == 'session')
{
if($openApp) $_SESSION["app-$openApp"][$key] = $value;
$_SESSION[$key] = $value;
}
elseif($this->scope == 'env')
@@ -2558,6 +2570,8 @@ class super
}
elseif($this->scope == 'session')
{
$openApp = $this->openApp;
if($openApp and isset($_SESSION["app-$openApp"][$key])) return $_SESSION["app-$openApp"][$key];
if(isset($_SESSION[$key])) return $_SESSION[$key];
return false;
}
+11 -9
View File
@@ -21,11 +21,11 @@ include dirname(__FILE__) . '/base/control.class.php';
class control extends baseControl
{
/**
* Check requiredFields and set exportFields for workflow.
*
* @param string $moduleName
* @param string $methodName
* @param string $appName
* Check requiredFields and set exportFields for workflow.
*
* @param string $moduleName
* @param string $methodName
* @param string $appName
* @access public
* @return void
*/
@@ -33,6 +33,8 @@ class control extends baseControl
{
parent::__construct($moduleName, $methodName, $appName);
$this->app->setOpenApp();
if(defined('IN_USE') or (defined('RUN_MODE') and RUN_MODE == 'api')) $this->setPreference();
if(!isset($this->config->bizVersion)) return false;
@@ -78,7 +80,7 @@ class control extends baseControl
/**
* Go to preference setting page if preference not setted.
*
*
* @access public
* @return void
*/
@@ -89,7 +91,7 @@ class control extends baseControl
if($this->app->getModuleName() == 'my' and $this->app->getMethodName() == 'changepassword') return true;
if($this->app->getModuleName() == 'my' and $this->app->getMethodName() == 'preference') return true;
if(!isset($this->config->preferenceSetted))
if(!isset($this->config->preferenceSetted))
{
$this->locate(helper::createLink('my', 'preference'));
}
@@ -208,7 +210,7 @@ class control extends baseControl
chdir(dirname($viewFile));
/**
* 使用extract安定ob方法渲染$viewFile里面的代码。
* 使用extract和ob方法渲染$viewFile里面的代码。
* Use extract and ob functions to eval the codes in $viewFile.
*/
extract((array)$this->view);
@@ -293,7 +295,7 @@ class control extends baseControl
/**
* Check require with flow field when post data.
*
*
* @access public
* @return void
*/
+3 -3
View File
@@ -66,7 +66,7 @@ class helper extends baseHelper
* @access public
* @return string
*/
static public function jsonEncode4Parse($data, $options = 0)
public static function jsonEncode4Parse($data, $options = 0)
{
$json = json_encode($data);
if($options) $json = str_replace(array("'", '"'), array('\u0027', '\u0022'), $json);
@@ -86,7 +86,7 @@ class helper extends baseHelper
* @access public
* @return string
*/
static public function convertEncoding($string, $fromEncoding, $toEncoding = 'utf-8')
public static function convertEncoding($string, $fromEncoding, $toEncoding = 'utf-8')
{
$toEncoding = str_replace('utf8', 'utf-8', $toEncoding);
if(function_exists('mb_convert_encoding'))
@@ -121,7 +121,7 @@ class helper extends baseHelper
*
* @return bool|float
*/
static public function workDays($begin, $end)
public static function workDays($begin, $end)
{
$begin = strtotime($begin);
$end = strtotime($end);
+39 -15
View File
@@ -154,7 +154,6 @@ class router extends baseRouter
{
if(!defined('ITERATION_KEY')) define('ITERATION_KEY', 0);
if(!defined('SPRINT_KEY')) define('SPRINT_KEY', 1);
if(!defined('STAGE_KEY')) define('STAGE_KEY', 2);
if(!defined('PRODUCT_KEY')) define('PRODUCT_KEY', 0);
if(!defined('STORYPOINT_KEY')) define('STORYPOINT_KEY', 1);
if(!defined('FUNCTIONPOINT_KEY')) define('FUNCTIONPOINT_KEY', 2);
@@ -171,7 +170,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' or `module`='common') and `key` in ('sprintConcept', 'hourPoint', 'URSR', 'mode', 'URAndSR')")->fetchAll();
$commonSettings = $this->dbh->query('SELECT section, `key`, value FROM' . TABLE_CONFIG . "WHERE `owner`='system' AND (`module`='custom' or `module`='common') and `key` in ('sprintConcept', 'hourPoint', 'URSR', 'mode', 'URAndSR', 'scoreStatus')")->fetchAll();
}
catch (PDOException $exception)
{
@@ -179,8 +178,9 @@ class router extends baseRouter
}
}
$hourKey = $planKey = $URSR = $URAndSR = 0;
$mode = 'new';
$hourKey = $planKey = $URSR = $URAndSR = 0;
$mode = 'new';
$score = '0';
$projectKey = empty($this->config->isINT) ? ITERATION_KEY : SPRINT_KEY;
foreach($commonSettings as $setting)
@@ -190,23 +190,22 @@ class router extends baseRouter
if($setting->key == 'URSR') $URSR = $setting->value;
if($setting->key == 'URAndSR') $URAndSR = $setting->value;
if($setting->key == 'mode' and $setting->section == 'global') $mode = $setting->value;
if($setting->key == 'scoreStatus' and $setting->section == 'global') $score = $setting->value;
}
/* Record system mode. */
$config->systemMode = $mode;
if($config->systemMode == 'classic') $this->config->executionCommonList = $this->config->projectCommonList;
/* Record hour unit. */
$config->hourUnit = 'H';
if($hourKey == STORYPOINT_KEY) $config->hourUnit = 'SP';
if($hourKey == FUNCTIONPOINT_KEY) $config->hourUnit = 'FP';
/* Record system score.*/
$config->systemScore = $score;
$model = new stdclass();
$model->model = 'scrum';
if($this->session->PRJ) $model = $this->dbh->query('SELECT model FROM' . TABLE_PROJECT . "WHERE id = {$this->session->PRJ}")->fetch();
/* Record hour unit. */
$config->hourUnit = 'h';
if($hourKey == STORYPOINT_KEY) $config->hourUnit = 'sp';
if($hourKey == FUNCTIONPOINT_KEY) $config->hourUnit = 'fp';
$iterationKey = $projectKey;
if(isset($model->model) && $model->model == 'waterfall') $projectKey = STAGE_KEY;
/* Set productCommon, projectCommon and hourCommon. Default english lang. */
$lang->productCommon = $this->config->productCommonList[$this->clientLang][PRODUCT_KEY];
@@ -239,7 +238,8 @@ class router extends baseRouter
if($this->dbh and !empty($this->config->db->name) and !defined('IN_UPGRADE'))
{
/* Get story concept in project and product. */
$URSRList = $this->dbh->query('SELECT `key`, `value` FROM' . TABLE_LANG . "WHERE module = 'custom' and section = 'URSRList' and lang = \"{$this->clientLang}\"")->fetchAll();
$URSRList = $this->dbh->query('SELECT `key`, `value` FROM' . TABLE_LANG . "WHERE module = 'custom' and section = 'URSRList' and `lang` = \"{$this->clientLang}\"")->fetchAll();
if(empty($URSRList)) $URSRList = $this->dbh->query('SELECT `key`, `value` FROM' . TABLE_LANG . "WHERE module = 'custom' and section = 'URSRList' and `key` = \"{$config->URSR}\"")->fetchAll();
/* Get UR pairs and SR pairs. */
$URPairs = array();
@@ -252,8 +252,8 @@ class router extends baseRouter
}
/* Set default story concept and init UR and SR concept. */
$lang->URCommon = zget($URPairs, $config->URSR);
$lang->SRCommon = zget($SRPairs, $config->URSR);
$lang->URCommon = isset($URPairs[$config->URSR]) ? $URPairs[$config->URSR] : reset($URPairs);
$lang->SRCommon = isset($SRPairs[$config->URSR]) ? $SRPairs[$config->URSR] : reset($SRPairs);
}
}
@@ -498,6 +498,18 @@ class router extends baseRouter
/* Prepend other params. */
if($methodName == 'operate') array_unshift($params, $this->rawMethod); // $params = array('close', 1);
if($methodName == 'batchOperate') array_unshift($params, $this->rawMethod); // $params = array('close', 1);
if($methodName == 'browse')
{
if(isset($params[0]) and $params[0] == 'bysearch')
{
$params[0] = '';
array_unshift($params, 'bysearch');
}
else
{
array_unshift($params, 'browse');
}
}
array_unshift($params, $this->rawModule); // $params = array($module, 'close', 1);
array_unshift($params, $methodName); // $params = array('operate', $module, 'close', 1);
array_unshift($params, $moduleName); // $params = array('flow', 'operate', $module, 'close', 1);
@@ -519,6 +531,18 @@ class router extends baseRouter
$params = array_reverse($params); // $params = array('label' => 1, 'mode' => 'search');
/* Prepend other params. */
if($methodName == 'browse')
{
if(isset($params['label']) and $params['label'] == 'bysearch')
{
$params['label'] = '';
$params['mode'] = 'bysearch';
}
else
{
$params['mode'] = 'browse';
}
}
$params['module'] = $this->rawModule; // $param = array('label' => 1, 'mode' => 'search', 'module' => $module);
$params[$this->config->methodVar] = $methodName; // $param = array('label' => 1, 'mode' => 'search', 'module' => $module, 'f' => 'browse');
$params[$this->config->moduleVar] = $moduleName; // $param = array('label' => 1, 'mode' => 'search', 'module' => $module, 'f' => 'browse', 'm' => 'flow');
+6 -8
View File
@@ -264,9 +264,9 @@ class baseValidater
{
if(empty($date)) return true;
if($date == '0000-00-00') return true;
$stamp = strtotime($date);
if(!is_numeric($stamp)) return false;
return checkdate(date('m', $stamp), date('d', $stamp), date('Y', $stamp));
$date = substr($date, 0, 10);
if(preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) return checkdate($parts[2], $parts[3], $parts[1]);
return false;
}
/**
@@ -282,9 +282,9 @@ class baseValidater
if(empty($datetime)) return true;
if($datetime == '0000-00-00') return true;
if($datetime == '0000-00-00 00:00:00') return true;
$stamp = strtotime($datetime);
if(!is_numeric($stamp)) return false;
return checkdate(date('m', $stamp), date('d', $stamp), date('Y', $stamp));
$date = substr($datetime, 0, 10);
if(preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) return checkdate($parts[2], $parts[3], $parts[1]);
return false;
}
/**
@@ -1029,8 +1029,6 @@ class baseFixer
$fields = $this->processFields($fieldName);
foreach($fields as $fieldName)
{
if(function_exists('get_magic_quotes_gpc') and get_magic_quotes_gpc()) $this->data->$fieldName = stripslashes($this->data->$fieldName);
if(!isset($this->stripedFields[$fieldName]) and (!defined('RUN_MODE') or RUN_MODE != 'admin'))
{
$this->data->$fieldName = self::stripDataTags($this->data->$fieldName, $allowedTags, $attributes);
+20 -6
View File
@@ -813,6 +813,10 @@ class baseJS
return json_encode($output);
}
/* Convert ' to \'. */
$message = str_replace("\\'", "'", $message);
$message = str_replace("'", "\\'", $message);
return self::start($full) . "alert('" . $message . "')" . self::end() . self::resetForm();
}
@@ -885,16 +889,18 @@ class baseJS
* 显示一个确认框,点击确定跳转到$okURL,点击取消跳转到$cancelURL。
* show a confirm box, press ok go to okURL, else go to cancleURL.
*
* @param string $message 显示的内容。 the text to be showed.
* @param string $okURL 点击确定后跳转的地址。 the url to go to when press 'ok'.
* @param string $cancleURL 点击取消后跳转的地址。 the url to go to when press 'cancle'.
* @param string $okTarget 点击确定后跳转的target。 the target to go to when press 'ok'.
* @param string $cancleTarget 点击取消后跳转的target。 the target to go to when press 'cancle'.
* @param string $message 显示的内容。 the text to be showed.
* @param string $okURL 点击确定后跳转的地址。 the url to go to when press 'ok'.
* @param string $cancleURL 点击取消后跳转的地址。 the url to go to when press 'cancle'.
* @param string $okTarget 点击确定后跳转的target。 the target to go to when press 'ok'.
* @param string $cancleTarget 点击取消后跳转的target。 the target to go to when press 'cancle'.
* @param string $okOpenApp 点击确定后跳转的应用。 the app to go to when press 'ok'.
* @param string $cancleOpenApp 点击取消后跳转的应用。 the app to go to when press 'cancle'.
* @static
* @access public
* @return string
*/
static public function confirm($message = '', $okURL = '', $cancleURL = '', $okTarget = "self", $cancleTarget = "self")
static public function confirm($message = '', $okURL = '', $cancleURL = '', $okTarget = "self", $cancleTarget = "self", $okOpenApp = '', $cancleOpenApp = '')
{
global $app;
if($app->viewType == 'json')
@@ -921,6 +927,10 @@ class baseJS
{
$confirmAction = "history.back(-1);";
}
elseif(strpos($okTarget, '$.apps.open') !== false)
{
$confirmAction = "$okTarget('$okURL', '$okOpenApp');";
}
elseif(!empty($okURL))
{
$confirmAction = "$okTarget.location = '$okURL';";
@@ -931,6 +941,10 @@ class baseJS
{
$cancleAction = "history.back(-1);";
}
elseif(strpos($cancleTarget, '$.apps.open') !== false)
{
$cancleAction = "$cancleTarget('$cancleURL', '$cancleOpenApp');";
}
elseif(!empty($cancleURL))
{
$cancleAction = "$cancleTarget.location = '$cancleURL';";
+1
View File
@@ -12,6 +12,7 @@
*/
helper::import(dirname(dirname(__FILE__)) . '/base/front/front.class.php');
/**
* html类,生成html标签。
* The html class, to build html tags.
+393 -306
View File
@@ -2,86 +2,83 @@
class gitlab
{
public $client;
public $root;
public $projectID;
/**
* Construct
*
* @param string $client
* @param string $root
* Construct
*
* @param string $client gitlab api url.
* @param string $root id of gitlab project.
* @param string $username null
* @param string $password token of gitlab api.
* @param string $encoding
* @access public
* @return void
*/
public function __construct($client, $token)
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8')
{
putenv('LC_CTYPE=en_US.UTF-8');
$this->client = $client;
$this->root = rtrim($root, DIRECTORY_SEPARATOR);
$this->branch = isset($_COOKIE['repoBranch']) ? $_COOKIE['repoBranch'] : '';
chdir($this->root);
exec("{$this->client} config core.quotepath false");
}
public function projects()
{
$this->root = rtrim($root, '/') . '/';
$this->token = $password;
$this->branch = isset($_COOKIE['repoBranch']) ? $_COOKIE['repoBranch'] : 'HEAD';
}
/**
* List files.
*
* @param string $path
* @param string $revision
*
* @param string $path
* @param string $revision
* @access public
* @return array
*/
public function ls($path, $revision = 'HEAD')
{
if(!scm::checkRevision($revision)) return array();
$api = "tree";
$path = ltrim($path, DIRECTORY_SEPARATOR);
$sub = '';
chdir($this->root);
if(!empty($path)) $sub = ":$path";
if(!empty($this->branch))$revision = $this->branch;
$cmd = escapeCmd("$this->client ls-tree -l $revision$sub");
$list = execCmd($cmd . ' 2>&1', 'array', $result);
if($result) return array();
$param = new stdclass();
$param->path = ltrim($path, '/');
$param->ref = $revision;
$param->recursive = 0;
if(!empty($this->branch)) $param->ref = $this->branch;
$infos = array();
foreach($list as $entry)
$list = $this->fetch($api, $param);
if(empty($list)) return array();
$infos = array();
foreach($list as $file)
{
list($mod, $kind, $revision, $size, $name) = preg_split('/[\t ]+/', $entry);
if(!isset($file->type)) continue;
/* Get commit info. */
$pathName = ltrim($path . DIRECTORY_SEPARATOR . $name, DIRECTORY_SEPARATOR);
$cmd = escapeCmd("$this->client log -1 $this->branch -- $pathName");
$commit = execCmd($cmd, 'array');
$logs = $this->parseLog($commit);
$info = new stdClass();
if($file->type == 'blob')
{
$path = $file->path;
$file = $this->files($file->path);
if($size > 1024 * 1024)
{
$size = round($size / (1024 * 1024), 2) . 'MB';
}
else if($size > 1024)
{
$size = round($size / 1024, 2) . 'KB';
$info->name = $file->file_name;
$info->kind = 'file';
$info->account = $file->committer;
$info->date = $file->date;
$info->size = $file->size;
$info->comment = $file->comment;
$info->revision = $file->revision;
}
else
{
$size .= 'Bytes';
$commits = $this->getCommitsByPath($file->path);
if(empty($commits)) continue;
$commit = $commits[0];
$info->name = $file->name;
$info->kind = 'dir';
$info->revision = $commit->id;
$info->account = $commit->committer_name;
$info->date = date('Y-m-d H:i:s', strtotime($commit->committed_date));
$info->size = 0;
$info->comment = $commit->message;
}
$info = new stdClass();
$info->name = $name;
$info->kind = $kind == 'tree' ? 'dir' : 'file';
$info->revision = $logs ? $logs[0]->revision : $revision;
$info->size = $size;
$info->account = $logs ? $logs[0]->committer : '';
$info->date = $logs ? $logs[0]->time : '';
$info->comment = $logs ? $logs[0]->comment : '';
$infos[] = $info;
unset($info);
}
@@ -89,84 +86,97 @@ class gitlab
/* Sort by kind */
foreach($infos as $key => $info) $kinds[$key] = $info->kind;
if($infos) array_multisort($kinds, SORT_ASC, $infos);
return $infos;
}
/**
* Get tags
*
* @param string $path
* @param string $revision
* Get files info.
*
* @param string $path
* @param string $ref
* @access public
* @return array
*/
public function files($path, $ref = 'master')
{
$path = urlencode($path);
$api = "files/$path";
$param = new stdclass();
$param->ref = $ref;
$file = $this->fetch($api, $param);
$commits = $this->getCommitsByPath($path);
$file->revision = $file->commit_id;
$file->size = $this->formatBytes($file->size);
if(!empty($commits))
{
$commit = $commits[0];
$file->committer = $commit->committer_name;
$file->comment = $commit->message;
$file->date = date('Y-m-d H:i:s', strtotime($commit->committed_date));
}
return $file;
}
/**
* Get tags
*
* @param string $path
* @param string $revision
* @access public
* @return array
*/
public function tags($path, $revision = 'HEAD')
{
if(!scm::checkRevision($revision)) return array();
$api = "tags";
$list = $this->fetch($api);
chdir($this->root);
$cmd = escapeCmd("$this->client tag --sort=taggerdate");
$list = execCmd($cmd . ' 2>&1', 'array', $result);
if($result) return array();
return $list;
$tags = array();
foreach($list as $tag) $tags[] = $tag->name;
return $tags;
}
/**
* Get branch
*
* Get branch
*
* @access public
* @return array
*/
public function branch()
{
chdir($this->root);
/* Get local branch. */
$cmd = escapeCmd("$this->client branch");
$list = execCmd($cmd . ' 2>&1', 'array', $result);
if($result) return array();
$api = "branches";
$list = $this->fetch($api);
$branches = array();
foreach($list as $localBranch)
{
if($localBranch[0] == '*') $localBranch = substr($localBranch, 1);
$localBranch = trim($localBranch);
if(empty($localBranch))continue;
$branches[$localBranch] = $localBranch;
}
foreach($list as $branch) $branches[$branch->name] = $branch->name;
asort($branches);
return $branches;
}
/**
* Get last log.
*
* @param string $path
* @param int $count
* Get last log.
*
* @param string $path
* @param int $count
* @access public
* @return array
*/
public function getLastLog($path, $count = 10)
{
$path = ltrim($path, DIRECTORY_SEPARATOR);
$revision = $this->branch ? $this->branch : 'HEAD';
chdir($this->root);
$list = execCmd(escapeCmd("$this->client log -10 $revision -- $path"), 'array');
$logs = $this->parseLog($list);
return $logs;
return $this->log($path);
}
/**
* Get logs
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
* @param int $count
* Get logs.
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
* @param int $count
* @access public
* @return array
*/
@@ -177,39 +187,18 @@ class gitlab
$path = ltrim($path, DIRECTORY_SEPARATOR);
$count = $count == 0 ? '' : "-n $count";
/* compatible with svn. */
if($fromRevision == 'HEAD' and $this->branch) $fromRevision = $this->branch;
if($toRevision == 'HEAD' and $this->branch) $toRevision = $this->branch;
if($fromRevision === $toRevision)
{
$logs = array();
chdir($this->root);
$list = execCmd(escapeCmd("$this->client log --stat=1024 --name-status --stat-name-width=1000 -1 $fromRevision -- $path"), 'array');
$logs = $this->parseLog($list);
return $logs;
}
$list = $this->getCommitsByPath($path, $fromRevision, $toRevision);
foreach($list as $commit) $commit->diffs = $this->getFilesByCommit($commit->id);
if(!$fromRevision)
{
$revisions = " $toRevision";
}
else
{
$revisions = "$fromRevision..$toRevision";
}
chdir($this->root);
$list = execCmd(escapeCmd("$this->client log --stat=1024 --name-status --stat-name-width=1000 $count $revisions -- $path"), 'array');
$logs = $this->parseLog($list);
return $logs;
return $this->parseLog($list);
}
/**
* Blame file
*
* @param string $path
* @param string $revision
*
* @param string $path
* @param string $revision
* @access public
* @return array
*/
@@ -218,51 +207,47 @@ class gitlab
if(!scm::checkRevision($revision)) return array();
$path = ltrim($path, DIRECTORY_SEPARATOR);
chdir($this->root);
$list = execCmd(escapeCmd("$this->client blame -l $revision -- $path"), 'array');
$path = urlencode($path);
$api = "files/$path/blame";
$param = new stdclass;
$param->ref = $this->branch;
$results = $this->fetch($api, $param);
$blames = array();
$revLine = 0;
$revision = '';
foreach($list as $line)
$lineNumber = 1;
foreach($results as $blame)
{
if(empty($line)) continue;
if($line[0] == '^') $line = substr($line, 1);
preg_match('/^([0-9a-f]{39,40})\s.*\((\S+)\s+([\d-]+)\s(.*)\s(\d+)\)(.*)$/U', $line, $matches);
$line = array();
$line['revision'] = $blame->commit->id;
$line['committer'] = $blame->commit->committer_name;
$line['time'] = $blame->commit->committer_name;
$line['line'] = $lineNumber;
$line['lines'] = count($blame->lines);
$line['content'] = array_shift($blame->lines);
if(isset($matches[1]) and $matches[1] != $revision)
$blames[] = $line;
$lineNumber ++;
foreach($blame->lines as $line)
{
$blame = array();
$blame['revision'] = $matches[1];
$blame['committer'] = $matches[2];
$blame['time'] = $matches[3];
$blame['line'] = $matches[5];
$blame['lines'] = 1;
$blame['content'] = strpos($matches[6], ' ') === false ? $matches[6] : substr($matches[6], 1);
$revision = $matches[1];
$revLine = $matches[5];
$blames[$revLine] = $blame;
}
elseif(isset($matches[5]))
{
$blame = array();
$blame['line'] = $matches[5];
$blame['content'] = strpos($matches[6], ' ') === false ? $matches[6] : substr($matches[6], 1);
$blames[$matches[5]] = $blame;
$blames[$revLine]['lines'] ++;
$blames[] = array('line' => $lineNumber, 'content' => $line);
$lineNumber ++;
}
}
return $blames;
}
/**
* Diff file.
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
* @access public
* @return array
*/
@@ -271,44 +256,50 @@ class gitlab
if(!scm::checkRevision($fromRevision)) return array();
if(!scm::checkRevision($toRevision)) return array();
$path = ltrim($path, DIRECTORY_SEPARATOR);
chdir($this->root);
if($toRevision == 'HEAD' and $this->branch) $toRevision = $this->branch;
if($fromRevision == '^') $fromRevision = $toRevision . '^';
if(strpos($fromRevision, '^') !== false)
$api = "compare";
$params = array('from' => $fromRevision, 'to' => $toRevision, 'straight' => 1);
if($toRevision == 'HEAD' and $this->branch) $params['to'] = $this->branch;
$results = $this->fetch($api, $params);
foreach($results->diffs as $key => $diff)
{
$list = execCmd(escapeCmd("$this->client log -2 $toRevision --pretty=format:%H -- $path"), 'array');
if(isset($list[1])) $fromRevision = $list[1];
if($path != '' and strpos($diff->new_path, $path) === false) unset($results->diffs[$key]);
}
$diffs = $results->diffs;
$lines = array();
foreach($diffs as $diff)
{
$lines[] = sprintf("diff --git a/%s b/%s", $diff->old_path, $diff->new_path);
$lines[] = sprintf("index %s ... %s %s ", $fromRevision, $toRevision, $diff->b_mode);
$lines[] = sprintf("--a/%s", $diff->old_path);
$lines[] = sprintf("--b/%s", $diff->new_path);
$diffLines = explode("\n", $diff->diff);
foreach($diffLines as $diffLine) $lines[] = $diffLine;
}
$lines = execCmd(escapeCmd("$this->client diff $fromRevision $toRevision -- $path"), 'array');
return $lines;
//return $results->diffs;
}
/**
* Cat file.
*
* @param string $entry
* @param string $revision
*
* @param string $entry
* @param string $revision
* @access public
* @return string
*/
public function cat($entry, $revision = 'HEAD')
{
if(!scm::checkRevision($revision)) return false;
chdir($this->root);
if($revision == 'HEAD' and $this->branch) $revision = $this->branch;
$cmd = escapeCmd("$this->client show $revision:$entry");
$content = execCmd($cmd);
if(is_array($content)) $content = implode("\n", $content);
return $content;
$file = $this->files($entry, $revision);
return base64_decode($file->content);
}
/**
* Get info.
*
* @param string $entry
* @param string $revision
*
* @param string $entry
* @param string $revision
* @access public
* @return object
*/
@@ -316,53 +307,48 @@ class gitlab
{
if(!scm::checkRevision($revision)) return false;
chdir($this->root);
if($revision == 'HEAD' and $this->branch) $revision = $this->branch;
$path = ltrim($entry, DIRECTORY_SEPARATOR);
$cmd = escapeCmd("$this->client ls-tree $revision -- $path");
$result = execCmd($cmd);
$kind = '';
if($result)
$info = new stdclass();
$info->kind = 'dir';
$info->path = $entry;
$info->revision = $revision;
$info->root = '';
if($revision == 'HEAD' and $this->branch) $info->revision = $this->branch;
if($entry)
{
$results = explode("\n", trim($result));
if(count($results) >= 2)
{
$kind = 'dir';
}
else
{
list($mode, $type) = explode(' ', $results[0]);
$kind = $type == 'tree' ? 'dir' : 'file';
}
$parent = dirname($entry);
if($parent == '.') $parent = '/';
if($parent == '') $parent = '/';
$list = $this->tree($parent, 0);
foreach($list as $node) if($node->path == $entry) $file = $node;
$commits = $this->getCommitsByPath($entry);
if(!empty($commits)) $file->revision = zget($commits[0], 'id', '');
$info->kind = $file->type == 'tree' ? 'dir' : 'file';
}
$list = execCmd(escapeCmd("$this->client log -1 $revision --pretty=format:%H -- $path"), 'array');
$revision = $list[0];
$info = new stdclass();
$info->kind = $kind;
$info->path = $entry;
$info->revision = $revision;
$info->root = $this->root;
return $info;
}
/**
* Exec git cmd.
*
* @param string $cmd
*
* @param string $cmd
* @access public
* @todo Exec commads by gitlab api.
* @return array
*/
public function exec($cmd)
{
chdir($this->root);
return execCmd(escapeCmd("$this->client $cmd"), 'array');
}
/**
* Parse diff.
*
* @param array $lines
*
* @param array $lines
* @access public
* @return array
*/
@@ -456,9 +442,9 @@ class gitlab
/**
* Get commit count.
*
* @param int $commits
* @param string $lastVersion
*
* @param int $commits
* @param string $lastVersion
* @access public
* @return int
*/
@@ -473,7 +459,7 @@ class gitlab
/**
* Get first revision.
*
*
* @access public
* @return string
*/
@@ -485,8 +471,8 @@ class gitlab
}
/**
* Get latest revision
*
* Get latest revision
*
* @access public
* @return string
*/
@@ -500,71 +486,205 @@ class gitlab
/**
* Get commits.
*
* @param string $version
* @param int $count
* @param string $branch
*
* @param string $version
* @param int $count
* @param string $branch
* @access public
* @return array
*/
public function getCommits($version = '', $count = 0, $branch = '')
{
if(!scm::checkRevision($version)) return array();
$api = "commits";
if($version == 'HEAD' and $branch) $version = $branch;
$revision = empty($version) ? $revision : $version;
$revision = is_numeric($revision) ? "--skip=$revision $branch" : $revision;
$count = $count == 0 ? '' : "-n $count";
if(empty($count)) $count = 100;
$params = array();
$params['ref_name'] = $branch;
$params['per_page'] = $count;
$params['all'] = 1;
chdir($this->root);
$list = execCmd(escapeCmd("$this->client log $count $revision -- ./"), 'array');
$commits = $this->parseLog($list);
$logs = array();
foreach($commits as $commit)
if($version and $version != 'HEAD')
{
$hash = $commit->revision;
$log = new stdClass();
$log->committer = $commit->committer;
$log->revision = $commit->revision;
$log->comment = $commit->comment;
$log->time = $commit->time;
$logs['commits'][$hash] = $log;
$logs['files'][$hash] = array();
}
if(empty($logs)) return $logs;
$lastCommit = $this->getSingleCommit($version);
if(!isset($lastCommit->committed_date)) return array('commits' => array(), 'files' => array());
$hash = '';
$files = execCmd(escapeCmd("$this->client whatchanged $count $revision --pretty=format:%an@_@%cd@_@%H@_@%s -- ./"), 'array');
foreach($files as $commit)
{
$commit = trim($commit);
if(empty($commit)) continue;
$parsedCommit = explode('@_@', $commit);
if(count($parsedCommit) == 4)
{
list($account, $date, $hash, $comment) = $parsedCommit;
}
else
{
$file = explode(' ', $commit);
$file = end($file);
list($action, $path) = explode("\t", $file);
$parsedFile = new stdclass();
$parsedFile->revision = $hash;
$parsedFile->path = '/' . trim($path);
$parsedFile->type = 'file';
$parsedFile->action = $action;
$logs['files'][$hash][] = $parsedFile;
}
$params['until'] = $lastCommit->committed_date;
}
return $logs;
$list = $this->fetch($api, $params);
$commits = array();
foreach($list as $commit)
{
$log = new stdclass;
$log->committer = $commit->committer_name;
$log->revision = $commit->id;
$log->comment = $commit->message;
$log->time = date('Y-m-d H:i:s', strtotime($commit->created_at));
$commits[$commit->id] = $log;
$files[$commit->id] = $this->getFilesByCommit($log->revision);
}
return array('commits' => $commits, 'files' => $files);
}
/**
* getCommit
*
* @param int $sha
* @access public
* @return void
*/
public function getSingleCommit($sha)
{
if(!scm::checkRevision($sha)) return null;
$api = "commits/$sha";
return $this->fetch($api);
}
/**
* Get commits by path.
*
* @param string $path
* @access public
* @return array
*/
public function getCommitsByPath($path, $fromRevision = '', $toRevision = '')
{
$path = ltrim($path, DIRECTORY_SEPARATOR);
$api = "commits";
$param = new stdclass();
$param->path = urldecode($path);
$param->ref_name = $this->branch;
$fromRevision = ($fromRevision and $fromRevision != 'HEAD') ? $this->getSingleCommit($fromRevision) : '';
$toRevision = ($toRevision and $toRevision != 'HEAD') ? $this->getSingleCommit($toRevision) : '';
$since = '';
$until = '';
if($fromRevision and $toRevision)
{
$since = min($fromRevision->committed_date, $toRevision->committed_date);
$until = max($fromRevision->committed_date, $toRevision->committed_date);
}
elseif($fromRevision)
{
$since = $fromRevision->committed_date;
}
if($since) $param->since = $since;
if($until) $param->until = $until;
return $this->fetch($api, $param);
}
/**
* Get files by commit.
*
* @param string $commit
* @access public
* @return void
*/
public function getFilesByCommit($revision)
{
if(!scm::checkRevision($revision)) return array();
$api = "commits/{$revision}/diff";
$params = new stdclass;
$params->page = 1;
$params->per_page = 200;
$allResults = array();
while($results = $this->fetch($api, $params))
{
$params->page ++;
$allResults = $allResults + $results;
}
$files = array();
foreach($allResults as $row)
{
$file = new stdclass();
$file->revision = $revision;
$file->path = '/' . $row->new_path;
$file->type = 'file';
$file->action = 'M';
if($row->new_file) $file->action = 'A';
if($row->renamed_file) $file->action = 'R';
if($row->deleted_file) $file->action = 'D';
$files[] = $file;
}
return $files;
}
/**
* Repository/tree api.
*
* @param string $path
* @param bool $recursive
* @access public
* @return void
*/
public function tree($path, $recursive = 1)
{
$api = "tree";
$params = array();
$params['path'] = ltrim($path, '/');
$params['ref'] = $this->branch;
$params['recursive'] = (int) $recursive;
return $this->fetch($api, $params);
}
/**
* Fetch data from gitlab api.
*
* @param string $api
* @access public
* @return void
*/
public function fetch($api, $params = array())
{
$params = (array) $params;
$params['private_token'] = $this->token;
$api = ltrim($api, '/');
$api = $this->root . $api . '?' . http_build_query($params);
$response = commonModel::http($api);
if(!empty(commonModel::$requestErrors))
{
commonModel::$requestErrors = array();
return array();
}
return json_decode($response);
}
/**
* Format bytes shown.
*
* @param int $size
* @static
* @access public
* @return string
*/
public static function formatBytes($size)
{
if($size < 1024) return $size . 'Bytes';
if(round($size / (1024 * 1024), 2) > 1) return round($size / (1024 * 1024), 2) . 'G';
if(round($size / 1024, 2) > 1) return round($size / 1024, 2) . 'M';
return round($size, 2) . 'KB';
}
/**
* Parse log.
*
* @param array $logs
*
* @param array $logs
* @access public
* @return array
*/
@@ -572,54 +692,21 @@ class gitlab
{
$parsedLogs = array();
$i = 0;
foreach($logs as $line)
foreach($logs as $commit)
{
if(strpos($line, 'commit ') === 0)
$parsedLog = new stdclass();
$parsedLog->revision = $commit->id;
$parsedLog->committer = $commit->committer_name;
$parsedLog->time = date('Y-m-d H:i:s', strtotime($commit->committed_date));
$parsedLog->comment = $commit->message;
$parsedLog->change = array();
foreach($commit->diffs as $diff)
{
if(isset($log))
{
$log->comment = trim($comment);
$log->change = $changes;
$parsedLogs[$i] = $log;
$i++;
}
$log = new stdclass();
$comment = '';
$changes = array();
$log->revision = trim(preg_replace('/^commit/', '', $line));
$parsedLog->change[$diff->path] = array();
$parsedLog->change[$diff->path]['action'] = $diff->action;
$parsedLog->change[$diff->path]['kind'] = $diff->type;
}
elseif(strpos($line, 'Author:') === 0)
{
$account = preg_replace('/^Author:/', '', $line);
$log->committer = trim(preg_replace('/<[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+>/', '', $account));
}
elseif(strpos($line, 'Date:') === 0)
{
$date = trim(preg_replace('/^Date:/', '', $line));
$log->time = date('Y-m-d H:i:s', strtotime($date));
}
elseif(preg_match('/^\s{2,}/', $line))
{
$comment .= $line;
}
elseif(strpos($line, "\t") !== false)
{
list($action, $entry) = explode("\t", $line);
$entry = '/' . trim($entry);
$pathInfo = array();
$pathInfo['action'] = $action;
$pathInfo['kind'] = 'file';
$changes[$entry] = $pathInfo;
}
}
if(isset($log))
{
$log->comment = trim($comment);
$log->change = $changes;
$parsedLogs[$i] = $log;
$parsedLogs[] = $parsedLog;
}
return $parsedLogs;
+63 -63
View File
@@ -5,13 +5,13 @@ class GitRepo
public $root;
/**
* Construct
*
* @param string $client
* @param string $root
* @param string $username
* @param string $password
* @param string $encoding
* Construct
*
* @param string $client
* @param string $root
* @param string $username
* @param string $password
* @param string $encoding
* @access public
* @return void
*/
@@ -29,9 +29,9 @@ class GitRepo
/**
* List files.
*
* @param string $path
* @param string $revision
*
* @param string $path
* @param string $revision
* @access public
* @return array
*/
@@ -40,7 +40,7 @@ class GitRepo
if(!scm::checkRevision($revision)) return array();
$path = ltrim($path, DIRECTORY_SEPARATOR);
$sub = '';
$sub = '';
chdir($this->root);
if(!empty($path)) $sub = ":$path";
if(!empty($this->branch))$revision = $this->branch;
@@ -69,7 +69,7 @@ class GitRepo
}
else
{
$size .= 'Bytes';
$size .= 'Bytes';
}
$info = new stdClass();
@@ -92,10 +92,10 @@ class GitRepo
}
/**
* Get tags
*
* @param string $path
* @param string $revision
* Get tags
*
* @param string $path
* @param string $revision
* @access public
* @return array
*/
@@ -111,8 +111,8 @@ class GitRepo
}
/**
* Get branch
*
* Get branch
*
* @access public
* @return array
*/
@@ -139,10 +139,10 @@ class GitRepo
}
/**
* Get last log.
*
* @param string $path
* @param int $count
* Get last log.
*
* @param string $path
* @param int $count
* @access public
* @return array
*/
@@ -160,11 +160,11 @@ class GitRepo
/**
* Get logs
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
* @param int $count
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
* @param int $count
* @access public
* @return array
*/
@@ -194,7 +194,7 @@ class GitRepo
}
else
{
$revisions = "$fromRevision..$toRevision";
$revisions = "$fromRevision..$toRevision";
}
chdir($this->root);
$list = execCmd(escapeCmd("$this->client log --stat=1024 --name-status --stat-name-width=1000 $count $revisions -- $path"), 'array');
@@ -205,9 +205,9 @@ class GitRepo
/**
* Blame file
*
* @param string $path
* @param string $revision
*
* @param string $path
* @param string $revision
* @access public
* @return array
*/
@@ -257,10 +257,10 @@ class GitRepo
/**
* Diff file.
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
*
* @param string $path
* @param string $fromRevision
* @param string $toRevision
* @access public
* @return array
*/
@@ -284,9 +284,9 @@ class GitRepo
/**
* Cat file.
*
* @param string $entry
* @param string $revision
*
* @param string $entry
* @param string $revision
* @access public
* @return string
*/
@@ -304,9 +304,9 @@ class GitRepo
/**
* Get info.
*
* @param string $entry
* @param string $revision
*
* @param string $entry
* @param string $revision
* @access public
* @return object
*/
@@ -337,17 +337,17 @@ class GitRepo
$list = execCmd(escapeCmd("$this->client log -1 $revision --pretty=format:%H -- $path"), 'array');
$revision = $list[0];
$info = new stdclass();
$info->kind = $kind;
$info->path = $entry;
$info->revision = $revision;
$info->root = $this->root;
$info->kind = $kind;
$info->path = $entry;
$info->revision = $revision;
$info->root = $this->root;
return $info;
}
/**
* Exec git cmd.
*
* @param string $cmd
*
* @param string $cmd
* @access public
* @return array
*/
@@ -359,8 +359,8 @@ class GitRepo
/**
* Parse diff.
*
* @param array $lines
*
* @param array $lines
* @access public
* @return array
*/
@@ -454,9 +454,9 @@ class GitRepo
/**
* Get commit count.
*
* @param int $commits
* @param string $lastVersion
*
* @param int $commits
* @param string $lastVersion
* @access public
* @return int
*/
@@ -471,7 +471,7 @@ class GitRepo
/**
* Get first revision.
*
*
* @access public
* @return string
*/
@@ -483,8 +483,8 @@ class GitRepo
}
/**
* Get latest revision
*
* Get latest revision
*
* @access public
* @return string
*/
@@ -498,10 +498,10 @@ class GitRepo
/**
* Get commits.
*
* @param string $version
* @param int $count
* @param string $branch
*
* @param string $version
* @param int $count
* @param string $branch
* @access public
* @return array
*/
@@ -543,7 +543,7 @@ class GitRepo
{
list($account, $date, $hash, $comment) = $parsedCommit;
}
else
else
{
$file = explode(' ', $commit);
$file = end($file);
@@ -561,8 +561,8 @@ class GitRepo
/**
* Parse log.
*
* @param array $logs
*
* @param array $logs
* @access public
* @return array
*/
@@ -596,7 +596,7 @@ class GitRepo
elseif(strpos($line, 'Date:') === 0)
{
$date = trim(preg_replace('/^Date:/', '', $line));
$log->time = date('Y-m-d H:i:s', strtotime($date));
$log->time = date('Y-m-d H:i:s', strtotime($date));
}
elseif(preg_match('/^\s{2,}/', $line))
{
+23 -12
View File
@@ -8,22 +8,22 @@
* @package spliter
* @version $Id$
* @link http://www.chanzhi.org
* @see http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html
* @see http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html
* @see http://stackoverflow.com/questions/9361303/can-i-get-the-unicode-value-of-a-character-or-vise-versa-with-php
*/
class spliter
{
/**
* Split a utf-8 string into words, computing unicode for every word.
*
* @param string $string
*
* @param string $string
* @access public
* @return array
*/
public function utf8Split($string)
{
$string = strtolower($string);
$i = 0;
$i = 0;
$length = strlen($string);
$dict = array();
$words = '';
@@ -50,12 +50,16 @@ class spliter
$word .= $letter;
$i++;
}
/* Process intigers. */
if(is_numeric($word) and (strpos($word, '.') === false)) $word = "|" . $word . "|";
$word = str_pad(strtolower($word), 5, '_');
$words .= ' ' . $word;
}
elseif($ord == 32)
{
$words .= ' ';
}
continue;
}
@@ -76,7 +80,14 @@ class spliter
}
else
{
$words .= ' ' . $letter;
if(is_numeric(substr($words, strlen($words) - 1, 1)))
{
$words .= ' ' . $letter;
}
else
{
$words .= $letter;
}
}
$i += $offset;
}
@@ -86,13 +97,13 @@ class spliter
}
/**
* Return unicode value for a char.
*
* @param string $c
* Return unicode value for a char.
*
* @param string $c
* @access public
* @return int
*/
public function unicode($c)
public function unicode($c)
{
if(ord($c{0}) >= 0 && ord($c{0}) <= 127) return ord($c{0});
if(ord($c{0}) >= 192 && ord($c{0}) <= 223) return (ord($c{0}) - 192) * 64 + (ord($c{1}) - 128);
@@ -107,8 +118,8 @@ class spliter
/**
* Judge a char is Letter or not.
*
* @param string $letter
*
* @param string $letter
* @access public
* @return bool
*/
+3 -1
View File
@@ -29,6 +29,7 @@ $config->action->objectNameFields['design'] = 'name';
$config->action->objectNameFields['stakeholder'] = 'user';
$config->action->objectNameFields['budget'] = 'name';
$config->action->objectNameFields['job'] = 'name';
$config->action->objectNameFields['team'] = 'name';
$config->action->commonImgSize = 870;
@@ -42,4 +43,5 @@ $config->action->majorList['program'] = array('opened', 'edited');
$config->action->majorList['project'] = array('opened', 'edited');
$config->action->majorList['execution'] = array('opened', 'edited');
$config->action->needGetProjectType = 'story,build,task,bug,case,testcase,caselib,testtask,testsuite,testreport,doc,issue,release,risk,design';
$config->action->needGetProjectType = 'build,task,bug,case,testcase,caselib,testtask,testsuite,testreport,doc,issue,release,risk,design,opportunity,trainplan,gapanalysis';
$config->action->needGetRelateField = ',story,productplan,release,task,build,bug,case,testtask,testreport,doc,doclib,issue,risk,opportunity,trainplan,gapanalysis,team,whitelist,';
+16 -11
View File
@@ -28,17 +28,22 @@ class action extends control
/* Save session. */
$uri = $this->app->getURI(true);
$this->session->set('productList', $uri);
$this->session->set('productPlanList', $uri);
$this->session->set('releaseList', $uri);
$this->session->set('storyList', $uri);
$this->session->set('projectList', $uri);
$this->session->set('taskList', $uri);
$this->session->set('buildList', $uri);
$this->session->set('bugList', $uri);
$this->session->set('caseList', $uri);
$this->session->set('testtaskList', $uri);
$this->session->set('docList', $uri);
$this->session->set('productList', $uri, 'product');
$this->session->set('productPlanList', $uri, 'product');
$this->session->set('storyList', $uri, 'product');
$this->session->set('releaseList', $uri, 'product');
$this->session->set('programList', $uri, 'program');
$this->session->set('projectList', $uri, 'project');
$this->session->set('executionList', $uri, 'execution');
$this->session->set('taskList', $uri, 'execution');
$this->session->set('buildList', $uri, 'execution');
$this->session->set('bugList', $uri, 'qa');
$this->session->set('caseList', $uri, 'qa');
$this->session->set('testtaskList', $uri, 'qa');
$this->session->set('docList', $uri, 'doc');
$this->session->set('opportunityList', $uri, 'project');
$this->session->set('riskList', $uri, 'project');
$this->session->set('trainplanList', $uri, 'project');
/* Get deleted objects. */
$this->app->loadClass('pager', $static = true);
+87 -64
View File
@@ -97,53 +97,58 @@ $lang->action->objectTypes['budget'] = 'Cost Estimate';
$lang->action->objectTypes['entry'] = 'Eintrag';
$lang->action->objectTypes['webhook'] = 'Webhook';
$lang->action->objectTypes['job'] = 'Job';
$lang->action->objectTypes['team'] = 'Team';
$lang->action->objectTypes['whitelist'] = 'Whitelist';
/* 用来描述操作历史记录。*/
$lang->action->desc = new stdclass();
$lang->action->desc->common = '$date, <strong>$action</strong> von <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> als <strong>$extra</strong> von <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, erstellt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, erstellt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, hinzugefügt durch <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, bearbeitet von <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, bearbeitet von <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> zugewisen an <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, geschlossen von <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, gelöscht von <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> löschte <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> bearbeitete <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, gelöscht von <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, wiederhergestellt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, versteckt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, hinzugefügt von <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, aktiviert von <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, geblockt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, verschoben von <strong>$actor</strong> , ursprünglich "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> hat die Anpassung der Story bestätigt. Das letzte Build ist <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> hat die Anpassung des Falls bestätigt. Das letzte Build ist <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> hat den Bug bestätigt.' . "\n";
$lang->action->desc->frombug = '$date, konvertiert von <strong>$actor</strong>. Die ID war <strong>$extra</strong>.';
$lang->action->desc->started = '$date, gestartet von <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, continued by <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, zurückgestellt von <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, ausgesetzt von <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, aufgenommen von <strong>$actor</strong> und hat <strong>$extra</strong> Stunden aufgebraucht.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> Stunden angepaast.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> Stunden gelöscht.';
$lang->action->desc->canceled = '$date, abgebrochen von <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> festgelegt. Build ist <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> festgelegt. Build ist <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, abgeschlossen von <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, pausiert von <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, überprüft von <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> wurde geändert. Es war "%s" und ist jetzt "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> wurde geändert. Die Differenz ist ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'Dateiname %s wurde geändert zu %s .' . "\n";
$lang->action->desc->linked2bug = '$date Verknüpft mit <strong>$extra</strong> von <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->common = '$date, <strong>$action</strong> von <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> als <strong>$extra</strong> von <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, erstellt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, erstellt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, hinzugefügt durch <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, bearbeitet von <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, bearbeitet von <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> zugewisen an <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, geschlossen von <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, gelöscht von <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> löschte <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> bearbeitete <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, gelöscht von <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, wiederhergestellt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, versteckt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, hinzugefügt von <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, aktiviert von <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, geblockt von <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, verschoben von <strong>$actor</strong> , ursprünglich "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> hat die Anpassung der Story bestätigt. Das letzte Build ist <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> hat die Anpassung des Falls bestätigt. Das letzte Build ist <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> hat den Bug bestätigt.' . "\n";
$lang->action->desc->frombug = '$date, konvertiert von <strong>$actor</strong>. Die ID war <strong>$extra</strong>.';
$lang->action->desc->started = '$date, gestartet von <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, continued by <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, zurückgestellt von <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, ausgesetzt von <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, aufgenommen von <strong>$actor</strong> und hat <strong>$extra</strong> Stunden aufgebraucht.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> Stunden angepaast.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> Stunden gelöscht.';
$lang->action->desc->canceled = '$date, abgebrochen von <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> festgelegt. Build ist <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> festgelegt. Build ist <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, abgeschlossen von <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, pausiert von <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, überprüft von <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> wurde geändert. Es war "%s" und ist jetzt "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> wurde geändert. Die Differenz ist ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'Dateiname %s wurde geändert zu %s .' . "\n";
$lang->action->desc->linked2bug = '$date Verknüpft mit <strong>$extra</strong> von <strong>$actor</strong>';
$lang->action->desc->linked2testtask = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->estimated = '$date, by <strong>$actor</strong> estimated.' . "\n";
$lang->action->desc->run = '$date, by <strong>$actor</strong> executed.' . "\n";
/* 子任务修改父任务的历史操作记录 */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
@@ -231,6 +236,8 @@ $lang->action->label->logout = "Logout";
$lang->action->label->deleteestimate = "deleted ";
$lang->action->label->linked2build = "linked ";
$lang->action->label->linked2bug = "linked ";
$lang->action->label->linked2testtask = "linked";
$lang->action->label->unlinkedfromtesttask = "unlinked";
$lang->action->label->linkchildtask = "linked a child task";
$lang->action->label->unlinkchildrentask = "unlinked a child task";
$lang->action->label->linkparenttask = "linked a parent task";
@@ -238,6 +245,8 @@ $lang->action->label->unlinkparenttask = "unlink from parent task";
$lang->action->label->batchcreate = "batch created tasks";
$lang->action->label->createchildren = "create child tasks";
$lang->action->label->managed = "managed";
$lang->action->label->managedteam = "managed";
$lang->action->label->managedwhitelist = "managed";
$lang->action->label->deletechildrentask = "delete children task";
$lang->action->label->createchildrenstory = "create child stories";
$lang->action->label->linkchildstory = "linked a child story";
@@ -247,6 +256,13 @@ $lang->action->label->unlinkparentstory = "unlink from parent story";
$lang->action->label->deletechildrenstory = "delete children story";
$lang->action->label->tracked = 'tracked';
$lang->action->label->hangup = 'hangup';
$lang->action->label->run = 'run';
$lang->action->label->estimated = 'estimated';
$lang->action->label->reviewclosed = 'Review Failed';
$lang->action->label->passreviewed = 'Pass';
$lang->action->label->clarifyreviewed = 'Clarify';
$lang->action->label->commitsummary = 'Commit Summary';
$lang->action->label->updatetrainee = 'Update Trainee';
/* 动态信息按照对象分组 */
$lang->action->dynamicAction = new stdclass;
@@ -289,22 +305,25 @@ $lang->action->dynamicAction->release['changestatus'] = 'Change Release Status';
$lang->action->dynamicAction->release['undeleted'] = 'Restore Release';
$lang->action->dynamicAction->release['hidden'] = 'Hide Release';
$lang->action->dynamicAction->story['opened'] = 'Create Story';
$lang->action->dynamicAction->story['edited'] = 'Edit Story';
$lang->action->dynamicAction->story['activated'] = 'Activate Story';
$lang->action->dynamicAction->story['reviewed'] = 'Review Story';
$lang->action->dynamicAction->story['closed'] = 'Close Story';
$lang->action->dynamicAction->story['assigned'] = 'Assign Story';
$lang->action->dynamicAction->story['changed'] = 'Change Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restore Story';
$lang->action->dynamicAction->story['hidden'] = 'Hide Story';
$lang->action->dynamicAction->story['opened'] = 'Create Story';
$lang->action->dynamicAction->story['edited'] = 'Edit Story';
$lang->action->dynamicAction->story['activated'] = 'Activate Story';
$lang->action->dynamicAction->story['reviewed'] = 'Review Story';
$lang->action->dynamicAction->story['closed'] = 'Close Story';
$lang->action->dynamicAction->story['assigned'] = 'Assign Story';
$lang->action->dynamicAction->story['changed'] = 'Change Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restore Story';
$lang->action->dynamicAction->story['hidden'] = 'Hide Story';
$lang->action->dynamicAction->story['linked2execution'] = "Link Story";
$lang->action->dynamicAction->story['unlinkedfromexecution'] = "Unlink Story";
$lang->action->dynamicAction->story['estimated'] = "Estimate $lang->SRCommon";
$lang->action->dynamicAction->execution['opened'] = 'Create ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['edited'] = 'Edit ' . $lang->executionCommon;
@@ -319,6 +338,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->execu
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
$lang->action->dynamicAction->task['opened'] = 'Create Task';
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
@@ -348,8 +369,9 @@ $lang->action->dynamicAction->task['hidden'] = 'Hide Task';
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
$lang->action->dynamicAction->build['opened'] = 'Create Build';
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
$lang->action->dynamicAction->build['opened'] = 'Create Build';
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
@@ -407,6 +429,7 @@ $lang->action->dynamicAction->caselib['hidden'] = 'Hide Case Lib';
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
$lang->action->dynamicAction->doclib['edited'] = 'Edit Doc Library';
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
$lang->action->dynamicAction->doc['created'] = 'Create Document';
$lang->action->dynamicAction->doc['edited'] = 'Edit Document';
@@ -468,12 +491,12 @@ $lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList['product'] = $lang->productCommon;
$lang->action->search->objectTypeList['program'] = 'Program';
$lang->action->search->objectTypeList['project'] = 'Project';
$lang->action->search->objectTypeList['execution'] = $lang->sprintCommon;
$lang->action->search->objectTypeList['execution'] = 'Execution';
$lang->action->search->objectTypeList['bug'] = 'Bug';
$lang->action->search->objectTypeList['case'] = 'Fälle';
$lang->action->search->objectTypeList['caseresult'] = 'Fallergebnisse';
$lang->action->search->objectTypeList['stepresult'] = 'Fallschritte';
$lang->action->search->objectTypeList['story'] = 'Story';
$lang->action->search->objectTypeList['story'] = "$lang->SRCommon/$lang->URCommon";
$lang->action->search->objectTypeList['task'] = 'Aufgaben';
$lang->action->search->objectTypeList['testtask'] = 'Testaufgaben';
$lang->action->search->objectTypeList['user'] = 'Benutzer';
+96 -70
View File
@@ -9,6 +9,8 @@
* @version $Id: en.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
global $config;
$lang->action->common = 'Log';
$lang->action->product = $lang->productCommon;
$lang->action->project = 'Project';
@@ -30,6 +32,9 @@ $lang->action->editComment = 'Edit Comment';
$lang->action->create = 'Add Comment';
$lang->action->comment = 'Comment';
$lang->action->undeleteAction = 'Reset Data';
$lang->action->hideOneAction = 'Hide Data';
$lang->action->trashTips = 'Note: Delete in ZenTao is logic.';
$lang->action->textDiff = 'Text Format';
$lang->action->original = 'Original Format';
@@ -96,54 +101,58 @@ $lang->action->objectTypes['stakeholder'] = 'Stakeholder';
$lang->action->objectTypes['budget'] = 'Cost Estimate';
$lang->action->objectTypes['entry'] = 'Entry';
$lang->action->objectTypes['webhook'] = 'Webhook';
$lang->action->objectTypes['job'] = 'Job';
$lang->action->objectTypes['team'] = 'Team';
$lang->action->objectTypes['whitelist'] = 'Whitelist';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, added by <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, changed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, edited by <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> assigned to <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, closed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, deleted by <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> deleted <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> edited <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, deleted by <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, restored by <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, hidden by <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, added by <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, activated by <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, blocked by <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, moved by <strong>$actor</strong> , which was "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> confirmed the story change. The latest build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> confirmed the case change. The latest build is <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> confirmed Bug.' . "\n";
$lang->action->desc->frombug = '$date, converted from <strong>$actor</strong>. Its ID was <strong>$extra</strong>.';
$lang->action->desc->started = '$date, started by <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, continued by <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, postponed by <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, suspended by <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, recorded by <strong>$actor</strong> and it cost <strong>$extra</strong> hours.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> edited Hour.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> deleted Hour.';
$lang->action->desc->canceled = '$date, cancelled by <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, finished by <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, paused by <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, verified by <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> is changed. It was "%s" and it is "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> is changed. The difference is ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
$lang->action->desc->linked2bug = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, added by <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, changed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, edited by <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> assigned to <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, closed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, deleted by <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> deleted <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> edited <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, deleted by <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, restored by <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, hidden by <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, added by <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, activated by <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, blocked by <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, moved by <strong>$actor</strong> , which was "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> confirmed the story change. The latest build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> confirmed the case change. The latest build is <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> confirmed Bug.' . "\n";
$lang->action->desc->frombug = '$date, converted from <strong>$actor</strong>. Its ID was <strong>$extra</strong>.';
$lang->action->desc->started = '$date, started by <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, continued by <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, postponed by <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, suspended by <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, recorded by <strong>$actor</strong> and it cost <strong>$extra</strong> hours.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> edited Hour.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> deleted Hour.';
$lang->action->desc->canceled = '$date, cancelled by <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, finished by <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, paused by <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, verified by <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> is changed. It was "%s" and it is "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> is changed. The difference is ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
$lang->action->desc->linked2bug = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
$lang->action->desc->linked2testtask = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->estimated = '$date, by <strong>$actor</strong> estimated.' . "\n";
$lang->action->desc->run = '$date, by <strong>$actor</strong> executed.' . "\n";
/* Used to describe the history of operations related to parent-child tasks. */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
@@ -231,6 +240,8 @@ $lang->action->label->logout = "logout";
$lang->action->label->deleteestimate = "deleted ";
$lang->action->label->linked2build = "linked ";
$lang->action->label->linked2bug = "linked ";
$lang->action->label->linked2testtask = "linked";
$lang->action->label->unlinkedfromtesttask = "unlinked";
$lang->action->label->linkchildtask = "linked a child task";
$lang->action->label->unlinkchildrentask = "unlinked a child task";
$lang->action->label->linkparenttask = "linked a parent task";
@@ -238,6 +249,8 @@ $lang->action->label->unlinkparenttask = "unlink from parent task";
$lang->action->label->batchcreate = "batch created tasks";
$lang->action->label->createchildren = "create child tasks";
$lang->action->label->managed = "managed";
$lang->action->label->managedteam = "managed";
$lang->action->label->managedwhitelist = "managed";
$lang->action->label->deletechildrentask = "delete children task";
$lang->action->label->createchildrenstory = "create child stories";
$lang->action->label->linkchildstory = "linked a child story";
@@ -247,6 +260,13 @@ $lang->action->label->unlinkparentstory = "unlink from parent story";
$lang->action->label->deletechildrenstory = "delete children story";
$lang->action->label->tracked = 'tracked';
$lang->action->label->hangup = 'hangup';
$lang->action->label->run = 'run';
$lang->action->label->estimated = 'estimated';
$lang->action->label->reviewclosed = 'Review Failed';
$lang->action->label->passreviewed = 'Pass';
$lang->action->label->clarifyreviewed = 'Clarify';
$lang->action->label->commitsummary = 'Commit Summary';
$lang->action->label->updatetrainee = 'Update Trainee';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
@@ -289,22 +309,25 @@ $lang->action->dynamicAction->release['changestatus'] = 'Change Release Status';
$lang->action->dynamicAction->release['undeleted'] = 'Restore Release';
$lang->action->dynamicAction->release['hidden'] = 'Hide Release';
$lang->action->dynamicAction->story['opened'] = 'Create Story';
$lang->action->dynamicAction->story['edited'] = 'Edit Story';
$lang->action->dynamicAction->story['activated'] = 'Activate Story';
$lang->action->dynamicAction->story['reviewed'] = 'Review Story';
$lang->action->dynamicAction->story['closed'] = 'Close Story';
$lang->action->dynamicAction->story['assigned'] = 'Assign Story';
$lang->action->dynamicAction->story['changed'] = 'Change Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restore Story';
$lang->action->dynamicAction->story['hidden'] = 'Hide Story';
$lang->action->dynamicAction->story['opened'] = 'Create Story';
$lang->action->dynamicAction->story['edited'] = 'Edit Story';
$lang->action->dynamicAction->story['activated'] = 'Activate Story';
$lang->action->dynamicAction->story['reviewed'] = 'Review Story';
$lang->action->dynamicAction->story['closed'] = 'Close Story';
$lang->action->dynamicAction->story['assigned'] = 'Assign Story';
$lang->action->dynamicAction->story['changed'] = 'Change Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restore Story';
$lang->action->dynamicAction->story['hidden'] = 'Hide Story';
$lang->action->dynamicAction->story['linked2execution'] = "Link Story";
$lang->action->dynamicAction->story['unlinkedfromexecution'] = "Unlink Story";
$lang->action->dynamicAction->story['estimated'] = "Estimate $lang->SRCommon";
$lang->action->dynamicAction->execution['opened'] = 'Create ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['edited'] = 'Edit ' . $lang->executionCommon;
@@ -319,6 +342,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->execu
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
$lang->action->dynamicAction->task['opened'] = 'Create Task';
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
@@ -348,8 +373,9 @@ $lang->action->dynamicAction->task['hidden'] = 'Hide Task';
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
$lang->action->dynamicAction->build['opened'] = 'Create Build';
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
$lang->action->dynamicAction->build['opened'] = 'Create Build';
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
@@ -407,6 +433,7 @@ $lang->action->dynamicAction->caselib['hidden'] = 'Hide Case Lib';
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Library';
$lang->action->dynamicAction->doclib['edited'] = 'Edit Doc Library';
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
$lang->action->dynamicAction->doc['created'] = 'Create Document';
$lang->action->dynamicAction->doc['edited'] = 'Edit Document';
@@ -427,12 +454,11 @@ $lang->action->dynamicAction->entry['created'] = 'Add Application';
$lang->action->dynamicAction->entry['edited'] = 'Edit Application';
/* Generate the corresponding object link. */
global $config;
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
$lang->action->label->productplan = 'Plan|productplan|view|productID=%s';
$lang->action->label->release = 'Release|release|view|productID=%s';
$lang->action->label->story = 'Story|story|view|storyID=%s';
$lang->action->label->program = "Program|program|pgmproduct|programID=%s";
$lang->action->label->program = "Program|program|product|programID=%s";
$lang->action->label->project = "Project|project|index|projectID=%s";
if($config->systemMode == 'new')
{
@@ -468,15 +494,15 @@ $lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList['product'] = $lang->productCommon;
$lang->action->search->objectTypeList['program'] = 'Program';
$lang->action->search->objectTypeList['project'] = 'Project';
$lang->action->search->objectTypeList['execution'] = $lang->sprintCommon;
$lang->action->search->objectTypeList['execution'] = 'Execution';
$lang->action->search->objectTypeList['bug'] = 'Bug';
$lang->action->search->objectTypeList['case'] = 'Case';
$lang->action->search->objectTypeList['caseresult'] = 'Case Result';
$lang->action->search->objectTypeList['stepresult'] = 'Case Steps';
$lang->action->search->objectTypeList['story'] = 'UR/SR';
$lang->action->search->objectTypeList['task'] = 'Task';
$lang->action->search->objectTypeList['testtask'] = 'Request';
$lang->action->search->objectTypeList['user'] = 'User';
$lang->action->search->objectTypeList['story'] = "$lang->SRCommon/$lang->URCommon";
$lang->action->search->objectTypeList['task'] = 'Task';
$lang->action->search->objectTypeList['testtask'] = 'Request';
$lang->action->search->objectTypeList['user'] = 'User';
$lang->action->search->objectTypeList['doc'] = 'Doc';
$lang->action->search->objectTypeList['doclib'] = 'Doc Lib';
$lang->action->search->objectTypeList['todo'] = 'Todo';
+104 -68
View File
@@ -97,53 +97,58 @@ $lang->action->objectTypes['budget'] = 'Cost Estimate';
$lang->action->objectTypes['entry'] = 'Entrée';
$lang->action->objectTypes['webhook'] = 'Webhook';
$lang->action->objectTypes['job'] = 'Job';
$lang->action->objectTypes['team'] = 'Team';
$lang->action->objectTypes['whitelist'] = 'Whitelist';
/* 用来描述操作历史记录。*/
$lang->action->desc = new stdclass();
$lang->action->desc->common = '$date, <strong>$action</strong> par <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> en tant que <strong>$extra</strong> par <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, initié par <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, créé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, ajouter par <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, modifié par <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, édité par <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> affecté à <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, fermé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, supprimé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> a supprimé <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> a édité <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, supprimé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, restauré par <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, masqué par <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, ajouté par <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, activé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, bloqué par <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, déplacé par <strong>$actor</strong> , qui était "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> a confirmé la modification de la story. Le dernier build est <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> a confirmé la modification du CasTest. Le dernier build est <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> a confirmé le Bug.' . "\n";
$lang->action->desc->frombug = '$date, converti par <strong>$actor</strong>. Son ID était <strong>$extra</strong>.';
$lang->action->desc->started = '$date, commencé par <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, reprise par <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, ajourné par <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, suspendu par <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, enregistré par <strong>$actor</strong> et son coût est de <strong>$extra</strong> heures.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> a édité son temps estimé.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> a supprimé son estimation de temps.';
$lang->action->desc->canceled = '$date, annulé par <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> a validé, le build est <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> a validé, le build est <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, terminé par <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, mis en pause par <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, verifié par <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> a changé. Il est passé de "%s" à "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> a changé. La différence est ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'Le nom du fichier %s a changé pour %s .' . "\n";
$lang->action->desc->linked2bug = '$date, affecté à <strong>$extra</strong> par <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->common = '$date, <strong>$action</strong> par <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> en tant que <strong>$extra</strong> par <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, initié par <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, créé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, ajouter par <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, modifié par <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, édité par <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> affecté à <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, fermé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, supprimé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> a supprimé <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> a édité <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, supprimé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, restauré par <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, masqué par <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, ajouté par <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, activé par <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, bloqué par <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, déplacé par <strong>$actor</strong> , qui était "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> a confirmé la modification de la story. Le dernier build est <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> a confirmé la modification du CasTest. Le dernier build est <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> a confirmé le Bug.' . "\n";
$lang->action->desc->frombug = '$date, converti par <strong>$actor</strong>. Son ID était <strong>$extra</strong>.';
$lang->action->desc->started = '$date, commencé par <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, reprise par <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, ajourné par <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, suspendu par <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, enregistré par <strong>$actor</strong> et son coût est de <strong>$extra</strong> heures.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> a édité son temps estimé.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> a supprimé son estimation de temps.';
$lang->action->desc->canceled = '$date, annulé par <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> a validé, le build est <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> a validé, le build est <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, terminé par <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, mis en pause par <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, verifié par <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> a changé. Il est passé de "%s" à "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> a changé. La différence est ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'Le nom du fichier %s a changé pour %s .' . "\n";
$lang->action->desc->linked2bug = '$date, affecté à <strong>$extra</strong> par <strong>$actor</strong>';
$lang->action->desc->linked2testtask = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->estimated = '$date, by <strong>$actor</strong> estimated.' . "\n";
$lang->action->desc->run = '$date, by <strong>$actor</strong> executed.' . "\n";
/* 子任务修改父任务的历史操作记录 */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> a créé un sous-tâche <strong>$extra</strong>。' . "\n";
@@ -231,6 +236,8 @@ $lang->action->label->logout = "s'est Déconnecté";
$lang->action->label->deleteestimate = "a remis à zéro ";
$lang->action->label->linked2build = "a ajouté au Build ";
$lang->action->label->linked2bug = "a lié au Bug ";
$lang->action->label->linked2testtask = "linked";
$lang->action->label->unlinkedfromtesttask = "unlinked";
$lang->action->label->linkchildtask = "a raccroché à une sous-tâche";
$lang->action->label->unlinkchildrentask = "a décroché la sous-tâche";
$lang->action->label->linkparenttask = "a raccroché à une tâche parent";
@@ -238,6 +245,8 @@ $lang->action->label->unlinkparenttask = "a décroché de la tâche parent"
$lang->action->label->batchcreate = "a créé tâches par lot";
$lang->action->label->createchildren = "a créé sous-tâches par lot";
$lang->action->label->managed = "a managé";
$lang->action->label->managedteam = "managed";
$lang->action->label->managedwhitelist = "managed";
$lang->action->label->deletechildrentask = "a supprimé une sous-tâche";
$lang->action->label->createchildrenstory = "a créé une sous-story";
$lang->action->label->linkchildstory = "a raccroché à une sous-story";
@@ -247,6 +256,13 @@ $lang->action->label->unlinkparentstory = "a décroché de la story parent";
$lang->action->label->deletechildrenstory = "a supprimé la sous-story";
$lang->action->label->tracked = 'tracked';
$lang->action->label->hangup = 'hangup';
$lang->action->label->run = 'run';
$lang->action->label->estimated = 'estimated';
$lang->action->label->reviewclosed = 'Review Failed';
$lang->action->label->passreviewed = 'Pass';
$lang->action->label->clarifyreviewed = 'Clarify';
$lang->action->label->commitsummary = 'Commit Summary';
$lang->action->label->updatetrainee = 'Update Trainee';
/* 动态信息按照对象分组 */
$lang->action->dynamicAction = new stdclass();
@@ -289,22 +305,25 @@ $lang->action->dynamicAction->release['changestatus'] = 'Changer Statut Release'
$lang->action->dynamicAction->release['undeleted'] = 'Restaurer Release';
$lang->action->dynamicAction->release['hidden'] = 'Masquer Release';
$lang->action->dynamicAction->story['opened'] = 'Créer Story';
$lang->action->dynamicAction->story['edited'] = 'Editer Story';
$lang->action->dynamicAction->story['activated'] = 'Activer Story';
$lang->action->dynamicAction->story['reviewed'] = 'Consulter Story';
$lang->action->dynamicAction->story['closed'] = 'Fermer Story';
$lang->action->dynamicAction->story['assigned'] = 'Assigner Story';
$lang->action->dynamicAction->story['changed'] = 'Changer Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Inclure Story au Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Enlever Story du Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Inclure Story à la Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Enlever Story de la Release';
$lang->action->dynamicAction->story['linked2build'] = 'Ajouter Story au Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Détacher Story du Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Détacher du Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restaurer Story';
$lang->action->dynamicAction->story['hidden'] = 'Masquer Story';
$lang->action->dynamicAction->story['opened'] = 'Créer Story';
$lang->action->dynamicAction->story['edited'] = 'Editer Story';
$lang->action->dynamicAction->story['activated'] = 'Activer Story';
$lang->action->dynamicAction->story['reviewed'] = 'Consulter Story';
$lang->action->dynamicAction->story['closed'] = 'Fermer Story';
$lang->action->dynamicAction->story['assigned'] = 'Assigner Story';
$lang->action->dynamicAction->story['changed'] = 'Changer Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Inclure Story au Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Enlever Story du Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Inclure Story à la Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Enlever Story de la Release';
$lang->action->dynamicAction->story['linked2build'] = 'Ajouter Story au Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Détacher Story du Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Détacher du Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restaurer Story';
$lang->action->dynamicAction->story['hidden'] = 'Masquer Story';
$lang->action->dynamicAction->story['linked2execution'] = "Link Story";
$lang->action->dynamicAction->story['unlinkedfromexecution'] = "Unlink Story";
$lang->action->dynamicAction->story['estimated'] = "Estimate $lang->SRCommon";
$lang->action->dynamicAction->project['opened'] = 'Créer ' . $lang->executionCommon;
$lang->action->dynamicAction->project['edited'] = 'Editer ' . $lang->executionCommon;
@@ -319,6 +338,21 @@ $lang->action->dynamicAction->project['undeleted'] = 'Restaurer ' . $lang->execu
$lang->action->dynamicAction->project['hidden'] = 'Masquer ' . $lang->executionCommon;
$lang->action->dynamicAction->project['moved'] = 'Déplacer Tâche';
$lang->action->dynamicAction->execution['opened'] = 'Create ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['edited'] = 'Edit ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['deleted'] = 'Delete ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['started'] = 'Start ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['delayed'] = 'Delay ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['suspended'] = 'Suspend ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['activated'] = 'Activate ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['closed'] = 'Close ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['managed'] = 'Manage ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
$lang->action->dynamicAction->task['opened'] = 'Créer Tâche';
$lang->action->dynamicAction->task['edited'] = 'Editer Tâche';
$lang->action->dynamicAction->task['commented'] = 'Commenter Tâche';
@@ -348,8 +382,9 @@ $lang->action->dynamicAction->task['hidden'] = 'Masquer Tâche';
$lang->action->dynamicAction->task['svncommited'] = 'Committer SVN';
$lang->action->dynamicAction->task['gitcommited'] = 'Committer GIT';
$lang->action->dynamicAction->build['opened'] = 'Créer Build';
$lang->action->dynamicAction->build['edited'] = 'Editer Build';
$lang->action->dynamicAction->build['opened'] = 'Créer Build';
$lang->action->dynamicAction->build['edited'] = 'Editer Build';
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
$lang->action->dynamicAction->bug['opened'] = 'Remonter Bug';
$lang->action->dynamicAction->bug['edited'] = 'Editer Bug';
@@ -407,6 +442,7 @@ $lang->action->dynamicAction->caselib['hidden'] = 'Masqué CasTest Lib';
$lang->action->dynamicAction->doclib['created'] = 'Créer Doc Library';
$lang->action->dynamicAction->doclib['edited'] = 'Editer Doc Library';
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
$lang->action->dynamicAction->doc['created'] = 'Créer Document';
$lang->action->dynamicAction->doc['edited'] = 'Editer Document';
@@ -467,15 +503,15 @@ $lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList['product'] = $lang->productCommon;
$lang->action->search->objectTypeList['program'] = 'Program';
$lang->action->search->objectTypeList['project'] = 'Project';
$lang->action->search->objectTypeList['execution'] = $lang->sprintCommon;
$lang->action->search->objectTypeList['execution'] = 'Execution';
$lang->action->search->objectTypeList['bug'] = 'Bug';
$lang->action->search->objectTypeList['case'] = 'CasTest';
$lang->action->search->objectTypeList['case'] = 'CasTest';
$lang->action->search->objectTypeList['caseresult'] = 'CasTest Result';
$lang->action->search->objectTypeList['stepresult'] = 'CasTest Steps';
$lang->action->search->objectTypeList['story'] = 'UR/SR';
$lang->action->search->objectTypeList['task'] = 'Tâche';
$lang->action->search->objectTypeList['testtask'] = 'Recette';
$lang->action->search->objectTypeList['user'] = 'Utilisateur';
$lang->action->search->objectTypeList['story'] = "$lang->SRCommon/$lang->URCommon";
$lang->action->search->objectTypeList['task'] = 'Tâche';
$lang->action->search->objectTypeList['testtask'] = 'Recette';
$lang->action->search->objectTypeList['user'] = 'Utilisateur';
$lang->action->search->objectTypeList['doc'] = 'Doc';
$lang->action->search->objectTypeList['doclib'] = 'Doc Lib';
$lang->action->search->objectTypeList['todo'] = 'Todo';
+92 -69
View File
@@ -97,53 +97,58 @@ $lang->action->objectTypes['budget'] = 'Cost Estimate';
$lang->action->objectTypes['entry'] = 'Entry';
$lang->action->objectTypes['webhook'] = 'Webhook';
$lang->action->objectTypes['job'] = 'Job';
$lang->action->objectTypes['team'] = 'Team';
$lang->action->objectTypes['whitelist'] = 'Whitelist';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
$lang->action->desc->common = '$date, <strong>$action</strong> bởi <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> như <strong>$extra</strong> bởi <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, được tạo bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, được tạo bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, thêm bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, changed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, edited by <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> assigned to <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, được đóng bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, được xóa bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> đã xóa <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> đã sửa <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, được xóa bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, khôi phục bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, ẩn bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, được thêm bởi <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, kích hoạt bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, blocked by <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, chuyển bởi <strong>$actor</strong> , cái là "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> confirmed the story change. The latest build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> confirmed the case change. The latest build is <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> confirmed Bug.' . "\n";
$lang->action->desc->frombug = '$date, converted from <strong>$actor</strong>. Its ID was <strong>$extra</strong>.';
$lang->action->desc->started = '$date, started by <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, continued by <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, postponed by <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, suspended by <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, ghi nhận bởi <strong>$actor</strong> and it cost <strong>$extra</strong> giờ.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> edited Hour.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> deleted Hour.';
$lang->action->desc->canceled = '$date, cancelled by <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, finished by <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, paused by <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, verified by <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> is changed. It was "%s" and it is "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> is changed. The difference is ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
$lang->action->desc->linked2bug = '$date, liên kết tới <strong>$extra</strong> bởi <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->common = '$date, <strong>$action</strong> bởi <strong>$actor</strong>.' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> như <strong>$extra</strong> bởi <strong>$actor</strong>.' . "\n";
$lang->action->desc->opened = '$date, được tạo bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->openedbysystem = '$date, opened by system.' . "\n";
$lang->action->desc->created = '$date, được tạo bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->added = '$date, thêm bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->changed = '$date, changed by <strong>$actor</strong> .' . "\n";
$lang->action->desc->edited = '$date, edited by <strong>$actor</strong> .' . "\n";
$lang->action->desc->assigned = '$date, <strong>$actor</strong> assigned to <strong>$extra</strong>.' . "\n";
$lang->action->desc->closed = '$date, được đóng bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->closedbysystem = '$date, closed by system.' . "\n";
$lang->action->desc->deleted = '$date, được xóa bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->deletedfile = '$date, <strong>$actor</strong> đã xóa <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->editfile = '$date, <strong>$actor</strong> đã sửa <strong><i>$extra</i></strong>.' . "\n";
$lang->action->desc->erased = '$date, được xóa bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->undeleted = '$date, khôi phục bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->hidden = '$date, ẩn bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->commented = '$date, được thêm bởi <strong>$actor</strong>.' . "\n";
$lang->action->desc->activated = '$date, kích hoạt bởi <strong>$actor</strong> .' . "\n";
$lang->action->desc->blocked = '$date, blocked by <strong>$actor</strong> .' . "\n";
$lang->action->desc->moved = '$date, chuyển bởi <strong>$actor</strong> , cái là "$extra".' . "\n";
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> confirmed the story change. The latest build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> confirmed the case change. The latest build is <strong>#$extra</strong>' . "\n";
$lang->action->desc->bugconfirmed = '$date, <strong>$actor</strong> confirmed Bug.' . "\n";
$lang->action->desc->frombug = '$date, converted from <strong>$actor</strong>. Its ID was <strong>$extra</strong>.';
$lang->action->desc->started = '$date, started by <strong>$actor</strong>.' . "\n";
$lang->action->desc->restarted = '$date, continued by <strong>$actor</strong>.' . "\n";
$lang->action->desc->delayed = '$date, postponed by <strong>$actor</strong>.' . "\n";
$lang->action->desc->suspended = '$date, suspended by <strong>$actor</strong>.' . "\n";
$lang->action->desc->recordestimate = '$date, ghi nhận bởi <strong>$actor</strong> and it cost <strong>$extra</strong> giờ.';
$lang->action->desc->editestimate = '$date, <strong>$actor</strong> edited Hour.';
$lang->action->desc->deleteestimate = '$date, <strong>$actor</strong> deleted Hour.';
$lang->action->desc->canceled = '$date, cancelled by <strong>$actor</strong>.' . "\n";
$lang->action->desc->svncommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->gitcommited = '$date, <strong>$actor</strong> committed and the build is <strong>#$extra</strong>.' . "\n";
$lang->action->desc->finished = '$date, finished by <strong>$actor</strong>.' . "\n";
$lang->action->desc->paused = '$date, paused by <strong>$actor</strong>.' . "\n";
$lang->action->desc->verified = '$date, verified by <strong>$actor</strong>.' . "\n";
$lang->action->desc->diff1 = '<strong><i>%s</i></strong> is changed. It was "%s" and it is "%s".<br />' . "\n";
$lang->action->desc->diff2 = '<strong><i>%s</i></strong> is changed. The difference is ' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
$lang->action->desc->linked2bug = '$date, liên kết tới <strong>$extra</strong> bởi <strong>$actor</strong>';
$lang->action->desc->linked2testtask = '$date, linked to <strong>$extra</strong> by <strong>$actor</strong>';
$lang->action->desc->resolved = '$date, resolved by <strong>$actor</strong> ' . "\n";
$lang->action->desc->managed = '$date, by <strong>$actor</strong> managed.' . "\n";
$lang->action->desc->estimated = '$date, by <strong>$actor</strong> estimated.' . "\n";
$lang->action->desc->run = '$date, by <strong>$actor</strong> executed.' . "\n";
/* Used to describe the history of operations related to parent-child tasks. */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a child task <strong>$extra</strong>。' . "\n";
@@ -231,6 +236,8 @@ $lang->action->label->logout = "logout";
$lang->action->label->deleteestimate = "deleted ";
$lang->action->label->linked2build = "linked ";
$lang->action->label->linked2bug = "linked ";
$lang->action->label->linked2testtask = "linked";
$lang->action->label->unlinkedfromtesttask = "unlinked";
$lang->action->label->linkchildtask = "linked a child task";
$lang->action->label->unlinkchildrentask = "hủy liên kết a child task";
$lang->action->label->linkparenttask = "linked a nhiệm vụ cha";
@@ -238,6 +245,8 @@ $lang->action->label->unlinkparenttask = "unlink from nhiệm vụ cha";
$lang->action->label->batchcreate = "batch created tasks";
$lang->action->label->createchildren = "create child tasks";
$lang->action->label->managed = "managed";
$lang->action->label->managedteam = "managed";
$lang->action->label->managedwhitelist = "managed";
$lang->action->label->deletechildrentask = "delete children task";
$lang->action->label->createchildrenstory = "create child stories";
$lang->action->label->linkchildstory = "linked a child story";
@@ -247,6 +256,13 @@ $lang->action->label->unlinkparentstory = "unlink from parent story";
$lang->action->label->deletechildrenstory = "delete children story";
$lang->action->label->tracked = 'tracked';
$lang->action->label->hangup = 'hangup';
$lang->action->label->run = 'run';
$lang->action->label->estimated = 'estimated';
$lang->action->label->reviewclosed = 'Review Failed';
$lang->action->label->passreviewed = 'Pass';
$lang->action->label->clarifyreviewed = 'Clarify';
$lang->action->label->commitsummary = 'Commit Summary';
$lang->action->label->updatetrainee = 'Update Trainee';
/* Dynamic information is grouped by object. */
$lang->action->dynamicAction = new stdclass;
@@ -289,22 +305,25 @@ $lang->action->dynamicAction->release['changestatus'] = 'Thay đổi Tình trạ
$lang->action->dynamicAction->release['undeleted'] = 'Khôi phục phát hành';
$lang->action->dynamicAction->release['hidden'] = 'Ẩn phát hành';
$lang->action->dynamicAction->story['opened'] = 'Tạo câu chuyện';
$lang->action->dynamicAction->story['edited'] = 'Sửa câu chuyện';
$lang->action->dynamicAction->story['activated'] = 'Kích hoạt câu chuyện';
$lang->action->dynamicAction->story['reviewed'] = 'Duyệt câu chuyện';
$lang->action->dynamicAction->story['closed'] = 'Đóng câu chuyện';
$lang->action->dynamicAction->story['assigned'] = 'Bàn giao câu chuyện';
$lang->action->dynamicAction->story['changed'] = 'Thay đổi câu chuyện';
$lang->action->dynamicAction->story['linked2plan'] = 'Liên kết Story to kế hoạch';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Hủy liên kết Story from kế hoạch';
$lang->action->dynamicAction->story['linked2release'] = 'Liên kết Story to phát hành';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Hủy liên kết Story from kế hoạch';
$lang->action->dynamicAction->story['linked2build'] = 'Liên kết Story to bản dựng';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Hủy liên kết Story from bản dựng';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Hủy liên kết Project';
$lang->action->dynamicAction->story['undeleted'] = 'Khôi phục câu chuyện';
$lang->action->dynamicAction->story['hidden'] = 'Ẩn câu chuyện';
$lang->action->dynamicAction->story['opened'] = 'Tạo câu chuyện';
$lang->action->dynamicAction->story['edited'] = 'Sửa câu chuyện';
$lang->action->dynamicAction->story['activated'] = 'Kích hoạt câu chuyện';
$lang->action->dynamicAction->story['reviewed'] = 'Duyệt câu chuyện';
$lang->action->dynamicAction->story['closed'] = 'Đóng câu chuyện';
$lang->action->dynamicAction->story['assigned'] = 'Bàn giao câu chuyện';
$lang->action->dynamicAction->story['changed'] = 'Thay đổi câu chuyện';
$lang->action->dynamicAction->story['linked2plan'] = 'Liên kết Story to kế hoạch';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Hủy liên kết Story from kế hoạch';
$lang->action->dynamicAction->story['linked2release'] = 'Liên kết Story to phát hành';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Hủy liên kết Story from kế hoạch';
$lang->action->dynamicAction->story['linked2build'] = 'Liên kết Story to bản dựng';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Hủy liên kết Story from bản dựng';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Hủy liên kết Project';
$lang->action->dynamicAction->story['undeleted'] = 'Khôi phục câu chuyện';
$lang->action->dynamicAction->story['hidden'] = 'Ẩn câu chuyện';
$lang->action->dynamicAction->story['linked2execution'] = "Link Story";
$lang->action->dynamicAction->story['unlinkedfromexecution'] = "Unlink Story";
$lang->action->dynamicAction->story['estimated'] = "Estimate $lang->SRCommon";
$lang->action->dynamicAction->execution['opened'] = 'Tạo ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['edited'] = 'Sửa ' . $lang->executionCommon;
@@ -319,6 +338,8 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Phục hổi ' . $lang->
$lang->action->dynamicAction->execution['hidden'] = 'Ẩn ' . $lang->executionCommon;
$lang->action->dynamicAction->execution['moved'] = 'Nhập nhiệm vụ';
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
$lang->action->dynamicAction->task['opened'] = 'Tạo nhiệm vụ';
$lang->action->dynamicAction->task['edited'] = 'Sửa nhiệm vụ';
$lang->action->dynamicAction->task['commented'] = 'Task nhận xét';
@@ -348,8 +369,9 @@ $lang->action->dynamicAction->task['hidden'] = 'Ẩn nhiệm vụ';
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
$lang->action->dynamicAction->build['opened'] = 'Tạo bản dựng';
$lang->action->dynamicAction->build['edited'] = 'Sửa bản dựng';
$lang->action->dynamicAction->build['opened'] = 'Tạo bản dựng';
$lang->action->dynamicAction->build['edited'] = 'Sửa bản dựng';
$lang->action->dynamicAction->build['deleted'] = 'Delete Build';
$lang->action->dynamicAction->bug['opened'] = 'Báo cáo Bug';
$lang->action->dynamicAction->bug['edited'] = 'Sửa Bug';
@@ -407,6 +429,7 @@ $lang->action->dynamicAction->caselib['hidden'] = 'Ẩn Case Lib';
$lang->action->dynamicAction->doclib['created'] = 'Tạo Doc thư viện';
$lang->action->dynamicAction->doclib['edited'] = 'Sửa Doc thư viện';
$lang->action->dynamicAction->doclib['deleted'] = 'Delete Doc Library';
$lang->action->dynamicAction->doc['created'] = 'Tạo tài liệu';
$lang->action->dynamicAction->doc['edited'] = 'Sửa tài liệu';
@@ -464,19 +487,19 @@ $lang->action->label->stakeholder = 'Stakeholder|stakeholder|view|userID=%s';
/* Object type. */
$lang->action->search = new stdclass();
$lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList['product'] = $lang->productCommon;
$lang->action->search->objectTypeList['program'] = 'Program';
$lang->action->search->objectTypeList['project'] = 'Project';
$lang->action->search->objectTypeList['execution'] = $lang->sprintCommon;
$lang->action->search->objectTypeList['execution'] = 'Execution';
$lang->action->search->objectTypeList['bug'] = 'Bug';
$lang->action->search->objectTypeList['case'] = 'Tình huống';
$lang->action->search->objectTypeList['case'] = 'Tình huống';
$lang->action->search->objectTypeList['caseresult'] = 'Kết quả tình huống';
$lang->action->search->objectTypeList['stepresult'] = 'Các bước tình huống';
$lang->action->search->objectTypeList['story'] = 'UR/SR';
$lang->action->search->objectTypeList['task'] = 'Nhiệm vụ';
$lang->action->search->objectTypeList['testtask'] = 'Yêu cầu';
$lang->action->search->objectTypeList['user'] = 'Người dùng';
$lang->action->search->objectTypeList['story'] = "$lang->SRCommon/$lang->URCommon";
$lang->action->search->objectTypeList['task'] = 'Nhiệm vụ';
$lang->action->search->objectTypeList['testtask'] = 'Yêu cầu';
$lang->action->search->objectTypeList['user'] = 'Người dùng';
$lang->action->search->objectTypeList['doc'] = 'Tài liệu';
$lang->action->search->objectTypeList['doclib'] = 'Doc Lib';
$lang->action->search->objectTypeList['todo'] = 'Việc làm';
+95 -69
View File
@@ -9,6 +9,8 @@
* @version $Id: zh-cn.php 4955 2013-07-02 01:47:21Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
global $config;
$lang->action->common = '系统日志';
$lang->action->product = $lang->productCommon;
$lang->action->project = '项目';
@@ -30,6 +32,9 @@ $lang->action->editComment = '修改备注';
$lang->action->create = '添加备注';
$lang->action->comment = '备注';
$lang->action->undeleteAction = '还原数据';
$lang->action->hideOneAction = '隐藏数据';
$lang->action->trashTips = '提示:为了保证系统的完整性,禅道系统的删除都是标记删除。';
$lang->action->textDiff = '文本格式';
$lang->action->original = '原始格式';
@@ -73,7 +78,7 @@ $lang->action->objectTypes['productplan'] = '计划';
$lang->action->objectTypes['release'] = '发布';
$lang->action->objectTypes['program'] = '项目集';
$lang->action->objectTypes['project'] = '项目';
$lang->action->objectTypes['execution'] = $lang->executionCommon;
$lang->action->objectTypes['execution'] = $config->systemMode == 'new' ? '执行' : $lang->executionCommon;
$lang->action->objectTypes['task'] = '任务';
$lang->action->objectTypes['build'] = '版本';
$lang->action->objectTypes['job'] = '构建';
@@ -96,54 +101,58 @@ $lang->action->objectTypes['stakeholder'] = '干系人';
$lang->action->objectTypes['budget'] = '费用估算';
$lang->action->objectTypes['entry'] = '应用';
$lang->action->objectTypes['webhook'] = 'Webhook';
$lang->action->objectTypes['job'] = '构建';
$lang->action->objectTypes['team'] = '团队';
$lang->action->objectTypes['whitelist'] = '白名单';
/* 用来描述操作历史记录。*/
$lang->action->desc = new stdclass();
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->opened = '$date, 由 <strong>$actor</strong> 创建。' . "\n";
$lang->action->desc->openedbysystem = '$date, 由系统创建。' . "\n";
$lang->action->desc->created = '$date, 由 <strong>$actor</strong> 创建。' . "\n";
$lang->action->desc->added = '$date, 由 <strong>$actor</strong> 添加。' . "\n";
$lang->action->desc->changed = '$date, 由 <strong>$actor</strong> 变更。' . "\n";
$lang->action->desc->edited = '$date, 由 <strong>$actor</strong> 编辑。' . "\n";
$lang->action->desc->assigned = '$date, 由 <strong>$actor</strong> 指派给 <strong>$extra</strong>。' . "\n";
$lang->action->desc->closed = '$date, 由 <strong>$actor</strong> 关闭。' . "\n";
$lang->action->desc->closedbysystem = '$date, 由系统关闭。' . "\n";
$lang->action->desc->deleted = '$date, 由 <strong>$actor</strong> 删除。' . "\n";
$lang->action->desc->deletedfile = '$date, 由 <strong>$actor</strong> 删除了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->editfile = '$date, 由 <strong>$actor</strong> 编辑了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->erased = '$date, 由 <strong>$actor</strong> 删除。' . "\n";
$lang->action->desc->undeleted = '$date, 由 <strong>$actor</strong> 还原。' . "\n";
$lang->action->desc->hidden = '$date, 由 <strong>$actor</strong> 隐藏。' . "\n";
$lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加备注。' . "\n";
$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->SRCommon . '变动,最新版本为<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>。';
$lang->action->desc->started = '$date, 由 <strong>$actor</strong> 启动。' . "\n";
$lang->action->desc->restarted = '$date, 由 <strong>$actor</strong> 继续。' . "\n";
$lang->action->desc->delayed = '$date, 由 <strong>$actor</strong> 延期。' . "\n";
$lang->action->desc->suspended = '$date, 由 <strong>$actor</strong> 挂起。' . "\n";
$lang->action->desc->recordestimate = '$date, 由 <strong>$actor</strong> 记录工时,消耗 <strong>$extra</strong> 小时。';
$lang->action->desc->editestimate = '$date, 由 <strong>$actor</strong> 编辑工时。';
$lang->action->desc->deleteestimate = '$date, 由 <strong>$actor</strong> 删除工时。';
$lang->action->desc->canceled = '$date, 由 <strong>$actor</strong> 取消。' . "\n";
$lang->action->desc->svncommited = '$date, 由 <strong>$actor</strong> 提交代码,版本为<strong>#$extra</strong>。' . "\n";
$lang->action->desc->gitcommited = '$date, 由 <strong>$actor</strong> 提交代码,版本为<strong>#$extra</strong>。' . "\n";
$lang->action->desc->finished = '$date, 由 <strong>$actor</strong> 完成。' . "\n";
$lang->action->desc->paused = '$date, 由 <strong>$actor</strong> 暂停。' . "\n";
$lang->action->desc->verified = '$date, 由 <strong>$actor</strong> 验收。' . "\n";
$lang->action->desc->diff1 = '修改了 <strong><i>%s</i></strong>,旧值为 "%s",新值为 "%s"。<br />' . "\n";
$lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,区别为:' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
$lang->action->desc->resolved = '$date, 由 <strong>$actor</strong> 解决。' . "\n";
$lang->action->desc->managed = '$date, 由 <strong>$actor</strong> 维护。' . "\n";
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->opened = '$date, 由 <strong>$actor</strong> 创建。' . "\n";
$lang->action->desc->openedbysystem = '$date, 由系统创建。' . "\n";
$lang->action->desc->created = '$date, 由 <strong>$actor</strong> 创建。' . "\n";
$lang->action->desc->added = '$date, 由 <strong>$actor</strong> 添加。' . "\n";
$lang->action->desc->changed = '$date, 由 <strong>$actor</strong> 变更。' . "\n";
$lang->action->desc->edited = '$date, 由 <strong>$actor</strong> 编辑。' . "\n";
$lang->action->desc->assigned = '$date, 由 <strong>$actor</strong> 指派给 <strong>$extra</strong>。' . "\n";
$lang->action->desc->closed = '$date, 由 <strong>$actor</strong> 关闭。' . "\n";
$lang->action->desc->closedbysystem = '$date, 由系统关闭。' . "\n";
$lang->action->desc->deleted = '$date, 由 <strong>$actor</strong> 删除。' . "\n";
$lang->action->desc->deletedfile = '$date, 由 <strong>$actor</strong> 删除了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->editfile = '$date, 由 <strong>$actor</strong> 编辑了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->erased = '$date, 由 <strong>$actor</strong> 删除。' . "\n";
$lang->action->desc->undeleted = '$date, 由 <strong>$actor</strong> 还原。' . "\n";
$lang->action->desc->hidden = '$date, 由 <strong>$actor</strong> 隐藏。' . "\n";
$lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加备注。' . "\n";
$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->SRCommon . '变动,最新版本为<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>。';
$lang->action->desc->started = '$date, 由 <strong>$actor</strong> 启动。' . "\n";
$lang->action->desc->restarted = '$date, 由 <strong>$actor</strong> 继续。' . "\n";
$lang->action->desc->delayed = '$date, 由 <strong>$actor</strong> 延期。' . "\n";
$lang->action->desc->suspended = '$date, 由 <strong>$actor</strong> 挂起。' . "\n";
$lang->action->desc->recordestimate = '$date, 由 <strong>$actor</strong> 记录工时,消耗 <strong>$extra</strong> 小时。';
$lang->action->desc->editestimate = '$date, 由 <strong>$actor</strong> 编辑工时。';
$lang->action->desc->deleteestimate = '$date, 由 <strong>$actor</strong> 删除工时。';
$lang->action->desc->canceled = '$date, 由 <strong>$actor</strong> 取消。' . "\n";
$lang->action->desc->svncommited = '$date, 由 <strong>$actor</strong> 提交代码,版本为<strong>#$extra</strong>。' . "\n";
$lang->action->desc->gitcommited = '$date, 由 <strong>$actor</strong> 提交代码,版本为<strong>#$extra</strong>。' . "\n";
$lang->action->desc->finished = '$date, 由 <strong>$actor</strong> 完成。' . "\n";
$lang->action->desc->paused = '$date, 由 <strong>$actor</strong> 暂停。' . "\n";
$lang->action->desc->verified = '$date, 由 <strong>$actor</strong> 验收。' . "\n";
$lang->action->desc->diff1 = '修改了 <strong><i>%s</i></strong>,旧值为 "%s",新值为 "%s"。<br />' . "\n";
$lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,区别为:' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
$lang->action->desc->linked2testtask = '$date 由 <strong>$actor</strong> 关联到测试单 <strong>$extra</strong>';
$lang->action->desc->resolved = '$date, 由 <strong>$actor</strong> 解决。' . "\n";
$lang->action->desc->managed = '$date, 由 <strong>$actor</strong> 维护。' . "\n";
$lang->action->desc->estimated = '$date, 由 <strong>$actor</strong> 估算。' . "\n";
$lang->action->desc->run = '$date, 由 <strong>$actor</strong> 执行。' . "\n";
/* 用来描述和父子任务相关的操作历史记录。*/
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 创建子任务 <strong>$extra</strong>。' . "\n";
@@ -231,6 +240,8 @@ $lang->action->label->logout = "退出登录";
$lang->action->label->deleteestimate = "删除了工时";
$lang->action->label->linked2build = "关联了";
$lang->action->label->linked2bug = "关联了";
$lang->action->label->linked2testtask = "关联了";
$lang->action->label->unlinkedfromtesttask = "移除了";
$lang->action->label->linkchildtask = "关联子任务";
$lang->action->label->unlinkchildrentask = "取消关联子任务";
$lang->action->label->linkparenttask = "关联到父任务";
@@ -238,6 +249,8 @@ $lang->action->label->unlinkparenttask = "从父任务取消关联";
$lang->action->label->batchcreate = "批量创建任务";
$lang->action->label->createchildren = "创建子任务";
$lang->action->label->managed = "维护";
$lang->action->label->managedteam = "维护了";
$lang->action->label->managedwhitelist = "维护了";
$lang->action->label->deletechildrentask = "删除子任务";
$lang->action->label->createchildrenstory = "创建子需求";
$lang->action->label->linkchildstory = "关联子需求";
@@ -247,6 +260,13 @@ $lang->action->label->unlinkparentstory = "从父需求取消关联";
$lang->action->label->deletechildrenstory = "删除子需求";
$lang->action->label->tracked = '跟踪了';
$lang->action->label->hangup = '挂起了';
$lang->action->label->run = '执行了';
$lang->action->label->estimated = '估算了';
$lang->action->label->reviewclosed = '评审失败';
$lang->action->label->passreviewed = '确认通过';
$lang->action->label->clarifyreviewed = '有待明确';
$lang->action->label->commitsummary = '提交培训总结';
$lang->action->label->updatetrainee = '更新培训人员';
/* 动态信息按照对象分组 */
$lang->action->dynamicAction = new stdclass();
@@ -289,22 +309,25 @@ $lang->action->dynamicAction->release['changestatus'] = '修改发布状态';
$lang->action->dynamicAction->release['undeleted'] = '还原发布';
$lang->action->dynamicAction->release['hidden'] = '隐藏发布';
$lang->action->dynamicAction->story['opened'] = "创建{$lang->SRCommon}";
$lang->action->dynamicAction->story['edited'] = "编辑{$lang->SRCommon}";
$lang->action->dynamicAction->story['activated'] = "激活{$lang->SRCommon}";
$lang->action->dynamicAction->story['reviewed'] = "评审{$lang->SRCommon}";
$lang->action->dynamicAction->story['closed'] = "关闭{$lang->SRCommon}";
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->SRCommon}";
$lang->action->dynamicAction->story['changed'] = "变更{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->SRCommon}关联计划";
$lang->action->dynamicAction->story['unlinkedfromplan'] = "计划移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2release'] = "{$lang->SRCommon}关联发布";
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "发布移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}关联版本";
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除项目';
$lang->action->dynamicAction->story['undeleted'] = "还原{$lang->SRCommon}";
$lang->action->dynamicAction->story['hidden'] = "隐藏{$lang->SRCommon}";
$lang->action->dynamicAction->story['opened'] = "创建{$lang->SRCommon}";
$lang->action->dynamicAction->story['edited'] = "编辑{$lang->SRCommon}";
$lang->action->dynamicAction->story['activated'] = "激活{$lang->SRCommon}";
$lang->action->dynamicAction->story['reviewed'] = "评审{$lang->SRCommon}";
$lang->action->dynamicAction->story['closed'] = "关闭{$lang->SRCommon}";
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->SRCommon}";
$lang->action->dynamicAction->story['changed'] = "变更{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->SRCommon}关联计划";
$lang->action->dynamicAction->story['unlinkedfromplan'] = "计划移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2release'] = "{$lang->SRCommon}关联发布";
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "发布移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}关联版本";
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除项目';
$lang->action->dynamicAction->story['undeleted'] = "还原{$lang->SRCommon}";
$lang->action->dynamicAction->story['hidden'] = "隐藏{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2execution'] = "关联$lang->SRCommon";
$lang->action->dynamicAction->story['unlinkedfromexecution'] = "移除$lang->SRCommon";
$lang->action->dynamicAction->story['estimated'] = "估算$lang->SRCommon";
$lang->action->dynamicAction->execution['opened'] = '创建' . $lang->executionCommon;
$lang->action->dynamicAction->execution['edited'] = '编辑' . $lang->executionCommon;
@@ -319,6 +342,8 @@ $lang->action->dynamicAction->execution['undeleted'] = '还原' . $lang->executi
$lang->action->dynamicAction->execution['hidden'] = '隐藏' . $lang->executionCommon;
$lang->action->dynamicAction->execution['moved'] = '导入任务';
$lang->action->dynamicAction->team['managedTeam'] = '维护团队';
$lang->action->dynamicAction->task['opened'] = '创建任务';
$lang->action->dynamicAction->task['edited'] = '编辑任务';
$lang->action->dynamicAction->task['commented'] = '备注任务';
@@ -348,8 +373,9 @@ $lang->action->dynamicAction->task['hidden'] = '隐藏任务';
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
$lang->action->dynamicAction->build['opened'] = '创建版本';
$lang->action->dynamicAction->build['edited'] = '编辑版本';
$lang->action->dynamicAction->build['opened'] = '创建版本';
$lang->action->dynamicAction->build['edited'] = '编辑版本';
$lang->action->dynamicAction->build['deleted'] = '删除版本';
$lang->action->dynamicAction->bug['opened'] = '创建Bug';
$lang->action->dynamicAction->bug['edited'] = '编辑Bug';
@@ -407,6 +433,7 @@ $lang->action->dynamicAction->caselib['hidden'] = '隐藏用例库';
$lang->action->dynamicAction->doclib['created'] = '创建文档库';
$lang->action->dynamicAction->doclib['edited'] = '编辑文档库';
$lang->action->dynamicAction->doclib['deleted'] = '删除文档库';
$lang->action->dynamicAction->doc['created'] = '创建文档';
$lang->action->dynamicAction->doc['edited'] = '编辑文档';
@@ -427,12 +454,11 @@ $lang->action->dynamicAction->entry['created'] = '添加应用';
$lang->action->dynamicAction->entry['edited'] = '编辑应用';
/* 用来生成相应对象的链接。*/
global $config;
$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->SRCommon}|story|view|storyID=%s";
$lang->action->label->program = "项目集|program|pgmproduct|programID=%s";
$lang->action->label->program = "项目集|program|product|programID=%s";
$lang->action->label->project = "项目|project|index|projectID=%s";
if($config->systemMode == 'new')
{
@@ -450,7 +476,7 @@ $lang->action->label->testtask = '测试单|testtask|view|caseID=%s';
$lang->action->label->testsuite = '测试套件|testsuite|view|suiteID=%s';
$lang->action->label->caselib = '用例库|caselib|view|libID=%s';
$lang->action->label->todo = '待办|todo|view|todoID=%s';
$lang->action->label->doclib = '文档库|doc|browse|libID=%s';
$lang->action->label->doclib = '文档库|doc|objectLibs|type=&objectID=&libID=%s';
$lang->action->label->doc = '文档|doc|view|docID=%s';
$lang->action->label->user = '用户|user|view|account=%s';
$lang->action->label->testreport = '报告|testreport|view|report=%s';
@@ -468,12 +494,12 @@ $lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList['product'] = $lang->productCommon;
$lang->action->search->objectTypeList['program'] = '项目集';
$lang->action->search->objectTypeList['project'] = '项目';
$lang->action->search->objectTypeList['execution'] = $lang->sprintCommon;
$lang->action->search->objectTypeList['execution'] = '执行';
$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->action->search->objectTypeList['story'] = "$lang->SRCommon/$lang->URCommon";
$lang->action->search->objectTypeList['task'] = '任务';
$lang->action->search->objectTypeList['testtask'] = '测试单';
$lang->action->search->objectTypeList['user'] = '用户';
+88 -69
View File
@@ -9,6 +9,8 @@
* @version $Id: zh-tw.php 4955 2013-07-02 01:47:21Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
global $config;
$lang->action->common = '系統日誌';
$lang->action->product = $lang->productCommon;
$lang->action->project = '項目';
@@ -30,6 +32,9 @@ $lang->action->editComment = '修改備註';
$lang->action->create = '添加備註';
$lang->action->comment = '備註';
$lang->action->undeleteAction = '還原數據';
$lang->action->hideOneAction = '隱藏數據';
$lang->action->trashTips = '提示:為了保證系統的完整性,禪道系統的刪除都是標記刪除。';
$lang->action->textDiff = '文本格式';
$lang->action->original = '原始格式';
@@ -73,7 +78,7 @@ $lang->action->objectTypes['productplan'] = '計劃';
$lang->action->objectTypes['release'] = '發佈';
$lang->action->objectTypes['program'] = '項目集';
$lang->action->objectTypes['project'] = '項目';
$lang->action->objectTypes['execution'] = $lang->executionCommon;
$lang->action->objectTypes['execution'] = $config->systemMode == 'new' ? '執行' : $lang->executionCommon;
$lang->action->objectTypes['task'] = '任務';
$lang->action->objectTypes['build'] = '版本';
$lang->action->objectTypes['job'] = '構建';
@@ -96,54 +101,58 @@ $lang->action->objectTypes['stakeholder'] = '干係人';
$lang->action->objectTypes['budget'] = '費用估算';
$lang->action->objectTypes['entry'] = '應用';
$lang->action->objectTypes['webhook'] = 'Webhook';
$lang->action->objectTypes['job'] = '構建';
$lang->action->objectTypes['team'] = '團隊';
$lang->action->objectTypes['whitelist'] = '白名單';
/* 用來描述操作歷史記錄。*/
$lang->action->desc = new stdclass();
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->opened = '$date, 由 <strong>$actor</strong> 創建。' . "\n";
$lang->action->desc->openedbysystem = '$date, 由系統創建。' . "\n";
$lang->action->desc->created = '$date, 由 <strong>$actor</strong> 創建。' . "\n";
$lang->action->desc->added = '$date, 由 <strong>$actor</strong> 添加。' . "\n";
$lang->action->desc->changed = '$date, 由 <strong>$actor</strong> 變更。' . "\n";
$lang->action->desc->edited = '$date, 由 <strong>$actor</strong> 編輯。' . "\n";
$lang->action->desc->assigned = '$date, 由 <strong>$actor</strong> 指派給 <strong>$extra</strong>。' . "\n";
$lang->action->desc->closed = '$date, 由 <strong>$actor</strong> 關閉。' . "\n";
$lang->action->desc->closedbysystem = '$date, 由系統關閉。' . "\n";
$lang->action->desc->deleted = '$date, 由 <strong>$actor</strong> 刪除。' . "\n";
$lang->action->desc->deletedfile = '$date, 由 <strong>$actor</strong> 刪除了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->editfile = '$date, 由 <strong>$actor</strong> 編輯了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->erased = '$date, 由 <strong>$actor</strong> 刪除。' . "\n";
$lang->action->desc->undeleted = '$date, 由 <strong>$actor</strong> 還原。' . "\n";
$lang->action->desc->hidden = '$date, 由 <strong>$actor</strong> 隱藏。' . "\n";
$lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加備註。' . "\n";
$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->SRCommon . '變動,最新版本為<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>。';
$lang->action->desc->started = '$date, 由 <strong>$actor</strong> 啟動。' . "\n";
$lang->action->desc->restarted = '$date, 由 <strong>$actor</strong> 繼續。' . "\n";
$lang->action->desc->delayed = '$date, 由 <strong>$actor</strong> 延期。' . "\n";
$lang->action->desc->suspended = '$date, 由 <strong>$actor</strong> 掛起。' . "\n";
$lang->action->desc->recordestimate = '$date, 由 <strong>$actor</strong> 記錄工時,消耗 <strong>$extra</strong> 小時。';
$lang->action->desc->editestimate = '$date, 由 <strong>$actor</strong> 編輯工時。';
$lang->action->desc->deleteestimate = '$date, 由 <strong>$actor</strong> 刪除工時。';
$lang->action->desc->canceled = '$date, 由 <strong>$actor</strong> 取消。' . "\n";
$lang->action->desc->svncommited = '$date, 由 <strong>$actor</strong> 提交代碼,版本為<strong>#$extra</strong>。' . "\n";
$lang->action->desc->gitcommited = '$date, 由 <strong>$actor</strong> 提交代碼,版本為<strong>#$extra</strong>。' . "\n";
$lang->action->desc->finished = '$date, 由 <strong>$actor</strong> 完成。' . "\n";
$lang->action->desc->paused = '$date, 由 <strong>$actor</strong> 暫停。' . "\n";
$lang->action->desc->verified = '$date, 由 <strong>$actor</strong> 驗收。' . "\n";
$lang->action->desc->diff1 = '修改了 <strong><i>%s</i></strong>,舊值為 "%s",新值為 "%s"。<br />' . "\n";
$lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,區別為:' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = '將檔案名 %s 改為 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 關聯到版本 <strong>$extra</strong>';
$lang->action->desc->resolved = '$date, 由 <strong>$actor</strong> 解決。' . "\n";
$lang->action->desc->managed = '$date, 由 <strong>$actor</strong> 維護。' . "\n";
$lang->action->desc->common = '$date, <strong>$action</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->extra = '$date, <strong>$action</strong> as <strong>$extra</strong> by <strong>$actor</strong>。' . "\n";
$lang->action->desc->opened = '$date, 由 <strong>$actor</strong> 創建。' . "\n";
$lang->action->desc->openedbysystem = '$date, 由系統創建。' . "\n";
$lang->action->desc->created = '$date, 由 <strong>$actor</strong> 創建。' . "\n";
$lang->action->desc->added = '$date, 由 <strong>$actor</strong> 添加。' . "\n";
$lang->action->desc->changed = '$date, 由 <strong>$actor</strong> 變更。' . "\n";
$lang->action->desc->edited = '$date, 由 <strong>$actor</strong> 編輯。' . "\n";
$lang->action->desc->assigned = '$date, 由 <strong>$actor</strong> 指派給 <strong>$extra</strong>。' . "\n";
$lang->action->desc->closed = '$date, 由 <strong>$actor</strong> 關閉。' . "\n";
$lang->action->desc->closedbysystem = '$date, 由系統關閉。' . "\n";
$lang->action->desc->deleted = '$date, 由 <strong>$actor</strong> 刪除。' . "\n";
$lang->action->desc->deletedfile = '$date, 由 <strong>$actor</strong> 刪除了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->editfile = '$date, 由 <strong>$actor</strong> 編輯了附件:<strong><i>$extra</i></strong>。' . "\n";
$lang->action->desc->erased = '$date, 由 <strong>$actor</strong> 刪除。' . "\n";
$lang->action->desc->undeleted = '$date, 由 <strong>$actor</strong> 還原。' . "\n";
$lang->action->desc->hidden = '$date, 由 <strong>$actor</strong> 隱藏。' . "\n";
$lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加備註。' . "\n";
$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->SRCommon . '變動,最新版本為<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>。';
$lang->action->desc->started = '$date, 由 <strong>$actor</strong> 啟動。' . "\n";
$lang->action->desc->restarted = '$date, 由 <strong>$actor</strong> 繼續。' . "\n";
$lang->action->desc->delayed = '$date, 由 <strong>$actor</strong> 延期。' . "\n";
$lang->action->desc->suspended = '$date, 由 <strong>$actor</strong> 掛起。' . "\n";
$lang->action->desc->recordestimate = '$date, 由 <strong>$actor</strong> 記錄工時,消耗 <strong>$extra</strong> 小時。';
$lang->action->desc->editestimate = '$date, 由 <strong>$actor</strong> 編輯工時。';
$lang->action->desc->deleteestimate = '$date, 由 <strong>$actor</strong> 刪除工時。';
$lang->action->desc->canceled = '$date, 由 <strong>$actor</strong> 取消。' . "\n";
$lang->action->desc->svncommited = '$date, 由 <strong>$actor</strong> 提交代碼,版本為<strong>#$extra</strong>。' . "\n";
$lang->action->desc->gitcommited = '$date, 由 <strong>$actor</strong> 提交代碼,版本為<strong>#$extra</strong>。' . "\n";
$lang->action->desc->finished = '$date, 由 <strong>$actor</strong> 完成。' . "\n";
$lang->action->desc->paused = '$date, 由 <strong>$actor</strong> 暫停。' . "\n";
$lang->action->desc->verified = '$date, 由 <strong>$actor</strong> 驗收。' . "\n";
$lang->action->desc->diff1 = '修改了 <strong><i>%s</i></strong>,舊值為 "%s",新值為 "%s"。<br />' . "\n";
$lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,區別為:' . "\n" . "<blockquote class='textdiff'>%s</blockquote>" . "\n<blockquote class='original'>%s</blockquote>";
$lang->action->desc->diff3 = '將檔案名 %s 改為 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 關聯到版本 <strong>$extra</strong>';
$lang->action->desc->linked2testtask = '$date 由 <strong>$actor</strong> 關聯到測試單 <strong>$extra</strong>';
$lang->action->desc->resolved = '$date, 由 <strong>$actor</strong> 解決。' . "\n";
$lang->action->desc->managed = '$date, 由 <strong>$actor</strong> 維護。' . "\n";
$lang->action->desc->estimated = '$date, 由 <strong>$actor</strong> 估算。' . "\n";
$lang->action->desc->run = '$date, 由 <strong>$actor</strong> 執行。' . "\n";
/* 用來描述和父子任務相關的操作歷史記錄。*/
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 創建子任務 <strong>$extra</strong>。' . "\n";
@@ -231,6 +240,8 @@ $lang->action->label->logout = "退出登錄";
$lang->action->label->deleteestimate = "刪除了工時";
$lang->action->label->linked2build = "關聯了";
$lang->action->label->linked2bug = "關聯了";
$lang->action->label->linked2testtask = "關聯了";
$lang->action->label->unlinkedfromtesttask = "移除了";
$lang->action->label->linkchildtask = "關聯子任務";
$lang->action->label->unlinkchildrentask = "取消關聯子任務";
$lang->action->label->linkparenttask = "關聯到父任務";
@@ -238,6 +249,8 @@ $lang->action->label->unlinkparenttask = "從父任務取消關聯";
$lang->action->label->batchcreate = "批量創建任務";
$lang->action->label->createchildren = "創建子任務";
$lang->action->label->managed = "維護";
$lang->action->label->managedteam = "維護了";
$lang->action->label->managedwhitelist = "維護了";
$lang->action->label->deletechildrentask = "刪除子任務";
$lang->action->label->createchildrenstory = "創建子需求";
$lang->action->label->linkchildstory = "關聯子需求";
@@ -247,6 +260,8 @@ $lang->action->label->unlinkparentstory = "從父需求取消關聯";
$lang->action->label->deletechildrenstory = "刪除子需求";
$lang->action->label->tracked = '跟蹤了';
$lang->action->label->hangup = '掛起了';
$lang->action->label->run = '執行了';
$lang->action->label->estimated = '估算了';
/* 動態信息按照對象分組 */
$lang->action->dynamicAction = new stdclass();
@@ -289,22 +304,25 @@ $lang->action->dynamicAction->release['changestatus'] = '修改發佈狀態';
$lang->action->dynamicAction->release['undeleted'] = '還原發佈';
$lang->action->dynamicAction->release['hidden'] = '隱藏發佈';
$lang->action->dynamicAction->story['opened'] = "創建{$lang->SRCommon}";
$lang->action->dynamicAction->story['edited'] = "編輯{$lang->SRCommon}";
$lang->action->dynamicAction->story['activated'] = "激活{$lang->SRCommon}";
$lang->action->dynamicAction->story['reviewed'] = "評審{$lang->SRCommon}";
$lang->action->dynamicAction->story['closed'] = "關閉{$lang->SRCommon}";
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->SRCommon}";
$lang->action->dynamicAction->story['changed'] = "變更{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->SRCommon}關聯計劃";
$lang->action->dynamicAction->story['unlinkedfromplan'] = "計劃移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2release'] = "{$lang->SRCommon}關聯發佈";
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "發佈移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}關聯版本";
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除項目';
$lang->action->dynamicAction->story['undeleted'] = "還原{$lang->SRCommon}";
$lang->action->dynamicAction->story['hidden'] = "隱藏{$lang->SRCommon}";
$lang->action->dynamicAction->story['opened'] = "創建{$lang->SRCommon}";
$lang->action->dynamicAction->story['edited'] = "編輯{$lang->SRCommon}";
$lang->action->dynamicAction->story['activated'] = "激活{$lang->SRCommon}";
$lang->action->dynamicAction->story['reviewed'] = "評審{$lang->SRCommon}";
$lang->action->dynamicAction->story['closed'] = "關閉{$lang->SRCommon}";
$lang->action->dynamicAction->story['assigned'] = "指派{$lang->SRCommon}";
$lang->action->dynamicAction->story['changed'] = "變更{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2plan'] = "{$lang->SRCommon}關聯計劃";
$lang->action->dynamicAction->story['unlinkedfromplan'] = "計劃移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2release'] = "{$lang->SRCommon}關聯發佈";
$lang->action->dynamicAction->story['unlinkedfromrelease'] = "發佈移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2build'] = "{$lang->SRCommon}關聯版本";
$lang->action->dynamicAction->story['unlinkedfrombuild'] = "版本移除{$lang->SRCommon}";
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除項目';
$lang->action->dynamicAction->story['undeleted'] = "還原{$lang->SRCommon}";
$lang->action->dynamicAction->story['hidden'] = "隱藏{$lang->SRCommon}";
$lang->action->dynamicAction->story['linked2execution'] = "關聯$lang->SRCommon";
$lang->action->dynamicAction->story['unlinkedfromexecution'] = "移除$lang->SRCommon";
$lang->action->dynamicAction->story['estimated'] = "估算$lang->SRCommon";
$lang->action->dynamicAction->execution['opened'] = '創建' . $lang->executionCommon;
$lang->action->dynamicAction->execution['edited'] = '編輯' . $lang->executionCommon;
@@ -348,8 +366,9 @@ $lang->action->dynamicAction->task['hidden'] = '隱藏任務';
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
$lang->action->dynamicAction->build['opened'] = '創建版本';
$lang->action->dynamicAction->build['edited'] = '編輯版本';
$lang->action->dynamicAction->build['opened'] = '創建版本';
$lang->action->dynamicAction->build['edited'] = '編輯版本';
$lang->action->dynamicAction->build['deleted'] = '刪除版本';
$lang->action->dynamicAction->bug['opened'] = '創建Bug';
$lang->action->dynamicAction->bug['edited'] = '編輯Bug';
@@ -407,6 +426,7 @@ $lang->action->dynamicAction->caselib['hidden'] = '隱藏用例庫';
$lang->action->dynamicAction->doclib['created'] = '創建文檔庫';
$lang->action->dynamicAction->doclib['edited'] = '編輯文檔庫';
$lang->action->dynamicAction->doclib['deleted'] = '刪除文檔庫';
$lang->action->dynamicAction->doc['created'] = '創建文檔';
$lang->action->dynamicAction->doc['edited'] = '編輯文檔';
@@ -427,12 +447,11 @@ $lang->action->dynamicAction->entry['created'] = '添加應用';
$lang->action->dynamicAction->entry['edited'] = '編輯應用';
/* 用來生成相應對象的連結。*/
global $config;
$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->SRCommon}|story|view|storyID=%s";
$lang->action->label->program = "項目集|program|pgmproduct|programID=%s";
$lang->action->label->program = "項目集|program|product|programID=%s";
$lang->action->label->project = "項目|project|index|projectID=%s";
if($config->systemMode == 'new')
{
@@ -450,7 +469,7 @@ $lang->action->label->testtask = '測試單|testtask|view|caseID=%s';
$lang->action->label->testsuite = '測試套件|testsuite|view|suiteID=%s';
$lang->action->label->caselib = '用例庫|caselib|view|libID=%s';
$lang->action->label->todo = '待辦|todo|view|todoID=%s';
$lang->action->label->doclib = '文檔庫|doc|browse|libID=%s';
$lang->action->label->doclib = '文檔庫|doc|objectLibs|type=&objectID=&libID=%s';
$lang->action->label->doc = '文檔|doc|view|docID=%s';
$lang->action->label->user = '用戶|user|view|account=%s';
$lang->action->label->testreport = '報告|testreport|view|report=%s';
@@ -468,12 +487,12 @@ $lang->action->search->objectTypeList[''] = '';
$lang->action->search->objectTypeList['product'] = $lang->productCommon;
$lang->action->search->objectTypeList['program'] = '項目集';
$lang->action->search->objectTypeList['project'] = '項目';
$lang->action->search->objectTypeList['execution'] = $lang->sprintCommon;
$lang->action->search->objectTypeList['execution'] = '執行';
$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->action->search->objectTypeList['story'] = "$lang->SRCommon/$lang->URCommon";
$lang->action->search->objectTypeList['task'] = '任務';
$lang->action->search->objectTypeList['testtask'] = '測試單';
$lang->action->search->objectTypeList['user'] = '用戶';
+179 -54
View File
@@ -36,6 +36,7 @@ class actionModel extends model
$actor = $actor ? $actor : $this->app->user->account;
$actionType = strtolower($actionType);
$actor = $actionType == 'openedbysystem' ? '' : $actor;
if($actor == 'guest' and $actionType == 'logout') return false;
$objectType = str_replace('`', '', $objectType);
@@ -48,6 +49,9 @@ class actionModel extends model
$action->date = helper::now();
$action->extra = $extra;
if($objectType == 'story' and $actionType !== 'reviewed' and strpos('reviewclosed,passreviewed,clarifyreviewed', $actionType) !== false) $action->actor = 'System';
/* Use purifier to process comment. Fix bug #2683. */
$action->comment = fixer::stripDataTags($comment);
@@ -58,10 +62,12 @@ class actionModel extends model
if($autoDelete) $this->file->autoDelete($this->post->uid);
}
/* Get product and project for this object. */
$productAndProject = $this->getProductAndProject($action->objectType, $objectID);
$action->product = $productAndProject['product'];
$action->execution = $actionType == 'unlinkedfromproject' ? (int)$extra : (int)$productAndProject['project'];
/* Get product project and execution for this object. */
$relation = $this->getRelatedFields($action->objectType, $objectID, $actionType, $extra);
$action->product = (int)$relation['product'];
$action->project = (int)$relation['project'];
$action->execution = (int)$relation['execution'];
$this->dao->insert(TABLE_ACTION)->data($action)->autoCheck()->exec();
$actionID = $this->dbh->lastInsertID();
@@ -136,43 +142,71 @@ class actionModel extends model
}
/**
* Get product and project of an object.
* Get product, project, execution of the object.
*
* @param string $objectType
* @param int $objectID
* @param string $actionType
* @param string $extra
* @access public
* @return array
*/
public function getProductAndProject($objectType, $objectID)
public function getRelatedFields($objectType, $objectID, $actionType = '', $extra = '')
{
$emptyRecord = array('product' => ',0,', 'project' => 0);
$emptyRecord = array('product' => ',0,', 'project' => 0, 'execution' => 0);
/* If objectType is product or project, return the objectID. */
if($objectType == 'product') return array('product' => ",$objectID,", 'project' => 0);
if($objectType == 'program') return array('product' => "", 'project' => $objectID);
if($objectType == 'project')
/* If objectType is program, return empty record. */
if($objectType == 'program') return $emptyRecord;
/* If objectType is product or execution, return the objectID. */
if($objectType == 'product') return array('product' => ",$objectID,", 'project' => 0, 'execution' => 0);
/* If objectType is project or execution, return objectID products and project. */
if($objectType == 'project' or $objectType == 'execution')
{
$products = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($objectID)->fetchPairs('product');
$productList = ',' . join(',', array_keys($products)) . ',';
return array('project' => $objectID, 'product' => $productList);
$relation = array($objectType => $objectID, 'product' => $productList);
if($objectType == 'execution')
{
$project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($objectID)->fetch('project');
$relation['project'] = $project;
}
else
{
$relation['execution'] = 0;
}
return $relation;
}
/* Only process these object types. */
if(strpos(',story,productplan,release,task,build,bug,case,testtask,doc,', ",{$objectType},") !== false)
if(strpos($this->config->action->needGetRelateField, ",{$objectType},") !== false)
{
if(!isset($this->config->objectTables[$objectType])) return $emptyRecord;
/* Set fields to fetch. */
$fields = '*';
if(strpos('story, productplan, case', $objectType) !== false) $fields = 'product';
if(strpos('build, bug, testtask, doc', $objectType) !== false) $fields = 'product, project';
if(strpos('build, bug, testtask, doc', $objectType) !== false) $fields = 'product, project, execution';
if(strpos('case, repo', $objectType) !== false) $fields = 'execution';
if($objectType == 'release') $fields = 'product, build';
if($objectType == 'task') $fields = 'project, story';
if($objectType == 'task') $fields = 'project, execution, story';
$record = $this->dao->select($fields)->from($this->config->objectTables[$objectType])->where('id')->eq($objectID)->fetch();
if($objectType != 'team') $record = $this->dao->select($fields)->from($this->config->objectTables[$objectType])->where('id')->eq($objectID)->fetch();
/* Process story, release and task. */
if($objectType == 'story') $record->project = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->where('story')->eq($objectID)->orderBy('project_desc')->limit(1)->fetch('project');
if($objectType == 'story') $record->project = $this->dao->select('project')->from(TABLE_PROJECTSTORY)->where('story')->eq($objectID)->orderBy('project_desc')->limit(1)->fetch('project');
if($objectType == 'release') $record->project = $this->dao->select('project')->from(TABLE_BUILD)->where('id')->eq($record->build)->fetch('project');
if($objectType == 'team')
{
$team = $this->dao->select('type')->from(TABLE_PROJECT)->where('id')->eq($objectID)->fetch();
$type = $team->type == 'project' ? 'project' : 'execution';
$record = new stdclass();
$record->$type = $objectID;
}
if($objectType == 'task')
{
if($record->story != 0)
@@ -182,16 +216,43 @@ class actionModel extends model
}
else
{
$products = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($record->project)->fetchPairs('product');
$products = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($record->execution)->fetchPairs('product');
$record->product = join(',', array_keys($products));
}
}
if($objectType == 'story' and ($actionType == 'linked2build' or $actionType == 'unlinkedfrombuild'))
{
$build = $this->dao->select('project,execution')->from(TABLE_BUILD)->where('id')->eq((int)$extra)->fetch();
$record->project = $build->project;
$record->execution = $build->execution;
}
if($objectType == 'story' and $actionType == 'estimated')
{
$record->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq((int)$extra)->fetch('project');
$record->execution = (int)$extra;
}
if($objectType == 'case' and (strpos(',linked2testtask,unlinkedfromtesttask,assigned,run,', ',' . $actionType . ',') !== false) and (int)$extra)
{
$testtask = $this->dao->select('project,execution')->from(TABLE_TESTTASK)->where('id')->eq((int)$extra)->fetch();
$record->project = $testtask->project;
$record->execution = $testtask->execution;
}
if($objectType == 'whitelist' and $extra == 'product') $record->product = $objectID;
if($objectType == 'whitelist' and $extra == 'project') $record->project = $objectID;
if($objectType == 'whitelist' and ($extra == 'sprint' or $extra == 'stage')) $record->execution = $objectID;
if($actionType == 'unlinkedfromproject' or $actionType == 'linked2project') $record->project = (int)$extra ;
if($actionType == 'unlinkedfromexecution' or $actionType == 'linked2execution') $record->execution = (int)$extra;
if($record)
{
$record = (array)$record;
$record['product'] = isset($record['product']) ? ',' . $record['product'] . ',' : ',0,';
if(!isset($record['project'])) $record['project'] = 0;
if(empty($record['project'])) $record['project'] = 0;
if(empty($record['execution'])) $record['execution'] = 0;
return $record;
}
@@ -214,7 +275,7 @@ class actionModel extends model
$actions = $this->dao->select('*')->from(TABLE_ACTION)
->beginIF($objectType == 'project')
->where("objectType IN('project', 'testtask', 'build')")
->andWhere('execution')->eq((int)$objectID)
->andWhere('project')->eq((int)$objectID)
->fi()
->beginIF($objectType != 'project')
->where('objectType')->eq($objectType)
@@ -247,13 +308,13 @@ class actionModel extends model
elseif($actionName == 'linked2execution')
{
$name = $this->dao->select('name')->from(TABLE_PROJECT)->where('id')->eq($action->extra)->fetch('name');
if($name) $action->extra = common::hasPriv('project', 'story') ? html::a(helper::createLink('project', 'story', "projectID=$action->extra"), $name) : $name;
if($name) $action->extra = common::hasPriv('execution', 'view') ? html::a(helper::createLink('execution', 'view', "executionID=$action->execution"), $name) : $name;
}
elseif($actionName == 'linked2project')
{
$name = $this->dao->select('name')->from(TABLE_PROJECT)->where('id')->eq($action->extra)->fetch('name');
$productID = trim($action->product, ',');
if($name) $action->extra = common::hasPriv('projectstory', 'story') ? html::a(helper::createLink('projectstory', 'story', "productID=$productID"), $name) : $name;
if($name) $action->extra = common::hasPriv('project', 'view') ? html::a(helper::createLink('project', 'view', "projectID=$action->project"), $name) : $name;
}
elseif($actionName == 'linked2plan')
{
@@ -293,7 +354,7 @@ class actionModel extends model
{
$name = $this->dao->select('name')->from(TABLE_PROJECT)->where('id')->eq($action->extra)->fetch('name');
$productID = trim($action->product, ',');
if($name) $action->extra = common::hasPriv('projectstory', 'story') ? html::a(helper::createLink('projectstory', 'story', "productID=$productID"), "#$action->extra " . $name) : "#$action->extra " . $name;
if($name) $action->extra = common::hasPriv('projectstory', 'story') ? html::a(helper::createLink('projectstory', 'story', "projectID=$action->execution&productID=$productID"), "#$action->extra " . $name) : "#$action->extra " . $name;
}
elseif($actionName == 'unlinkedfrombuild')
{
@@ -396,7 +457,7 @@ class actionModel extends model
}
elseif(($actionName == 'opened' or $actionName == 'managed' or $actionName == 'edited') and ($objectType == 'execution' || $objectType == 'project'))
{
$this->app->loadLang('executon');
$this->app->loadLang('execution');
$linkedProducts = $this->dao->select('id,name')->from(TABLE_PRODUCT)->where('id')->in($action->extra)->fetchPairs('id', 'name');
$action->extra = '';
if($linkedProducts)
@@ -501,7 +562,7 @@ class actionModel extends model
foreach($typeTrashes as $objectType => $objectIds)
{
if(!isset($this->config->objectTables[$objectType]))continue;
if(!isset($this->config->objectTables[$objectType])) continue;
$objectIds = array_unique($objectIds);
$table = $this->config->objectTables[$objectType];
@@ -576,7 +637,11 @@ class actionModel extends model
*/
if(empty($desc))
{
if(isset($this->lang->$objectType) && isset($this->lang->$objectType->action->$actionType))
if($action->objectType == 'story' and $action->action == 'reviewed' and strpos($action->extra, ',') !== false)
{
$desc = $this->lang->$objectType->action->rejectreviewed;
}
elseif(isset($this->lang->$objectType) && isset($this->lang->$objectType->action->$actionType))
{
$desc = $this->lang->$objectType->action->$actionType;
}
@@ -617,14 +682,23 @@ class actionModel extends model
/* Fix bug #741. */
if(isset($desc['extra'])) $desc['extra'] = $this->lang->$objectType->{$desc['extra']};
$actionDesc = '';
if(isset($desc['extra'][$extra]))
{
echo str_replace('$extra', $desc['extra'][$extra], $desc['main']);
$actionDesc = str_replace('$extra', $desc['extra'][$extra], $desc['main']);
}
else
{
echo str_replace('$extra', $action->extra, $desc['main']);
$actionDesc = str_replace('$extra', $action->extra, $desc['main']);
}
if($action->objectType == 'story' and $action->action = 'reviewed' and strpos($action->extra, ',') !== false)
{
list($extra, $reason) = explode(',', $extra);
$desc['reason'] = $this->lang->$objectType->{$desc['reason']};
$actionDesc = str_replace(array('$extra', '$reason'), array($desc['extra'][$extra], $desc['reason'][$reason]), $desc['main']);
}
echo $actionDesc;
}
else
{
@@ -640,13 +714,14 @@ class actionModel extends model
* @param string $orderBy
* @param object $pager
* @param string|int $productID all|int(like 123)|notzero all => include zero, notzero, greater than 0
* @param string|int $projectID same as productID
* @param string|int $projectID same as productID
* @param string|int $executionID same as productID
* @param string $date
* @param string $direction
* @access public
* @return array
*/
public function getDynamic($account = 'all', $period = 'all', $orderBy = 'date_desc', $pager = null, $productID = 'all', $projectID = 'all', $date = '', $direction = 'next')
public function getDynamic($account = 'all', $period = 'all', $orderBy = 'date_desc', $pager = null, $productID = 'all', $projectID = 'all', $executionID = 'all', $date = '', $direction = 'next')
{
/* Computer the begin and end date of a period. */
$beginAndEnd = $this->computeBeginAndEnd($period);
@@ -654,32 +729,32 @@ class actionModel extends model
/* Build has priv condition. */
$condition = 1;
if($productID == 'all') $products = $this->app->user->view->products;
if($projectID == 'all') $projects = $this->app->user->view->projects;
if($productID == 'all') $products = $this->app->user->view->products;
if($projectID == 'all') $projects = $this->app->user->view->projects;
if($executionID == 'all') $executions = $this->app->user->view->sprints;
if($productID == 'all' or $projectID == 'all')
{
$projectCondition = $projectID == 'all' ? "execution " . helper::dbIN($projects) : '';
$productCondition = $productID == 'all' ? "INSTR('," . $products . ",', product) > 0" : '';
if(is_numeric($productID)) $productCondition = "product like'%,$productID,%' or product='$productID'";
if(is_numeric($projectID)) $projectCondition = "execution='$projectID'";
$productCondition = $productID == 'all' ? "INSTR('," . $products . ",', product) > 0" : '';
$projectCondition = $projectID == 'all' ? "project " . helper::dbIN($projects) : '';
$executionCondition = $executionID == 'all' ? "execution " . helper::dbIN($executions) : '';
if(is_numeric($productID)) $productCondition = "product like '%,$productID,%' or product = '$productID'";
if(is_numeric($projectID)) $projectCondition = "project = '$projectID'";
if(is_numeric($executionID)) $executionCondition = "execution = '$executionID'";
$condition = "(product =',0,' AND execution = '0')";
if($projectCondition) $condition .= ' OR ' . $projectCondition;
if($productCondition) $condition .= ' OR ' . $productCondition;
$condition = "(product =',0,' AND project = '0' AND execution = 0)";
if($productCondition) $condition .= ' OR ' . $productCondition;
if($projectCondition) $condition .= ' OR ' . $projectCondition;
if($executionCondition) $condition .= ' OR ' . $executionCondition;
if($this->app->user->admin) $condition = 1;
}
/* If is project, select its related. */
$executions = array();
if(is_numeric($projectID))
{
$project = $this->loadModel('project')->getByID($projectID);
if(isset($project->type) and $project->type == 'project') $executions = $this->loadModel('execution')->getPairs($projectID);
}
if(is_numeric($projectID)) $executions = $this->loadModel('execution')->getPairs($projectID);
$this->loadModel('doc');
$libs = $this->doc->getLibs('all');
$libs = $this->doc->getLibs('includeDeleted');
$docs = $this->doc->getPrivDocs(array_keys($libs), 0, 'all');
$actionCondition = $this->getActionCondition();
@@ -695,12 +770,14 @@ class actionModel extends model
->andWhere()
->markLeft(1)
->where(1)
->beginIF(is_numeric($projectID))->orWhere('execution')->eq($projectID)->fi()
->beginIF(is_numeric($projectID))->andWhere('project')->eq($projectID)->fi()
->beginIF(!empty($executions))->orWhere('execution')->in(array_keys($executions))->fi()
->beginIF(is_numeric($executionID))->andWhere('execution')->eq($executionID)->fi()
->markRight(1)
->beginIF($productID == 'notzero')->andWhere('product')->gt(0)->andWhere('product')->notlike('%,0,%')->fi()
->beginIF($projectID == 'notzero')->andWhere('execution')->gt(0)->fi()
->beginIF($projectID == 'all' or $productID == 'all')->andWhere("IF((objectType!= 'doc' && objectType!= 'doclib'), ($condition), '1=1')")->fi()
->beginIF($projectID == 'notzero')->andWhere('project')->gt(0)->fi()
->beginIF($executionID == 'notzero')->andWhere('execution')->gt(0)->fi()
->beginIF($productID == 'all' or $projectID == 'all' or $executionID == 'all')->andWhere("IF((objectType!= 'doc' && objectType!= 'doclib'), ($condition), '1=1')")->fi()
->beginIF($docs and !$this->app->user->admin)->andWhere("IF(objectType != 'doc', '1=1', objectID " . helper::dbIN($docs) . ")")->fi()
->beginIF($libs and !$this->app->user->admin)->andWhere("IF(objectType != 'doclib', '1=1', objectID " . helper::dbIN(array_keys($libs)) . ') ')->fi()
->beginIF($actionCondition)->andWhere("($actionCondition)")->fi()
@@ -740,6 +817,7 @@ class actionModel extends model
* Get dynamic by search.
*
* @param array $products
* @param array $projects
* @param array $executions
* @param int $queryID
* @param string $orderBy
@@ -749,7 +827,7 @@ class actionModel extends model
* @access public
* @return array
*/
public function getDynamicBySearch($products, $executions, $queryID, $orderBy = 'date_desc', $pager = null, $date = '', $direction = 'next')
public function getDynamicBySearch($products, $projects, $executions, $queryID, $orderBy = 'date_desc', $pager = null, $date = '', $direction = 'next')
{
$query = $queryID ? $this->loadModel('search')->getQuery($queryID) : '';
@@ -761,7 +839,8 @@ class actionModel extends model
}
if($this->session->actionQuery == false) $this->session->set('actionQuery', ' 1 = 1');
$allProduct = "`product` = 'all'";
$allProducts = "`product` = 'all'";
$allProjects = "`project` = 'all'";
$allExecutions = "`execution` = 'all'";
$actionQuery = $this->session->actionQuery;
@@ -770,14 +849,25 @@ class actionModel extends model
{
$productID = $out[1];
}
/* If the sql not include 'product', add check purview for product. */
if(strpos($actionQuery, $allProduct) === false)
if(strpos($actionQuery, $allProducts) === false)
{
if(!in_array($productID, array_keys($products))) return array();
}
else
{
$actionQuery = str_replace($allProduct, '1', $actionQuery);
$actionQuery = str_replace($allProducts, '1', $actionQuery);
}
/* If the sql not include 'project', add check purview for project. */
if(strpos($actionQuery, $allProjects) === false)
{
$actionQuery = $actionQuery . ' AND `project`' . helper::dbIN(array_keys($projects));
}
else
{
$actionQuery = str_replace($allProjects, '1', $actionQuery);
}
/* If the sql not include 'execution', add check purview for execution. */
@@ -831,6 +921,7 @@ class actionModel extends model
public function transformActions($actions)
{
$this->app->loadLang('todo');
$requirements = array();
/* Get commiters. */
$commiters = $this->loadModel('user')->getCommiters();
@@ -839,10 +930,10 @@ class actionModel extends model
foreach($actions as $object) $objectTypes[$object->objectType][] = $object->objectID;
foreach($objectTypes as $objectType => $objectIds)
{
if(!isset($this->config->objectTables[$objectType])) continue; // If no defination for this type, omit it.
if(!isset($this->config->objectTables[$objectType]) and $objectType != 'makeup') continue; // If no defination for this type, omit it.
$objectIds = array_unique($objectIds);
$table = $this->config->objectTables[$objectType];
$table = $objectType == 'makeup' ? '`zt_overtime`' : $this->config->objectTables[$objectType];
$field = $this->config->action->objectNameFields[$objectType];
if($table != TABLE_TODO)
{
@@ -864,6 +955,29 @@ class actionModel extends model
$objectProject[$object->id] = $object->project > 0 ? $object->project : $object->id;
}
}
elseif($objectType == 'story')
{
$objectInfo = $this->dao->select('id,title,type')->from($table)->where('id')->in($objectIds)->fetchAll();
foreach($objectInfo as $object)
{
$objectName[$object->id] = $object->title;
if($object->type == 'requirement') $requirements[$object->id] = $object->id;
}
$objectProject = array();
}
elseif($objectType == 'team')
{
$objectInfo = $this->dao->select('id,team,type')->from(TABLE_PROJECT)
->where('id')->in($objectIds)
->fetchAll();
$objectProject = array();
foreach($objectInfo as $object)
{
$objectName[$object->id] = $object->team;
if($object->type == 'project') $objectProject[$object->id] = $object->id;
}
}
else
{
$objectName = $this->dao->select("id, $field AS name")->from($table)->where('id')->in($objectIds)->fetchPairs();
@@ -909,6 +1023,10 @@ class actionModel extends model
if(isset($this->lang->action->label->$objectType))
{
$objectLabel = $this->lang->action->label->$objectType;
/* Replace story to requirement. */
if(in_array($action->objectID, $requirements)) $objectLabel = str_replace($this->lang->SRCommon, $this->lang->URCommon, $objectLabel);
if(!is_array($objectLabel)) $action->objectLabel = $objectLabel;
if(is_array($objectLabel) and isset($objectLabel[$actionType])) $action->objectLabel = $objectLabel[$actionType];
}
@@ -937,6 +1055,13 @@ class actionModel extends model
$action->objectLink = helper::createLink($moduleName, $methodName, sprintf($vars, $action->objectID), '', '', $projectID);
$action->objectLabel = $objectLabel;
}
elseif($action->objectType == 'team')
{
$action->objectLink = '';
if($action->project) $action->objectLink = helper::createLink('project', 'manageMembers', 'projectID=' . $action->project);
if($action->execution) $action->objectLink = helper::createLink('execution', 'team', 'executionID=' . $action->execution);
$action->objectLabel = zget($this->lang->action->objectTypes, $action->objectLabel);
}
else
{
$action->objectLink = '';
+5 -6
View File
@@ -12,7 +12,6 @@
?>
<?php include '../../common/view/header.html.php';?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('system');?></div>
<div class='btn-toolbar pull-right'>
<?php if($type == 'hidden') echo html::a(inLink('trash', "type=all"), $lang->goback, '', "class='btn'");?>
<?php if($type == 'all') echo html::a(inLink('trash', "type=hidden"), "<i class='icon-eye-close'></i> " . $lang->action->dynamic->hidden, '', "class='btn btn-danger'");?>
@@ -36,10 +35,10 @@
<thead>
<tr class='colhead'>
<th class='w-130px'><?php common::printOrderLink('objectType', $orderBy, $vars, $lang->action->objectType);?></th>
<th class='w-id'> <?php common::printOrderLink('objectID', $orderBy, $vars, $lang->idAB);?></th>
<th class='w-id'><?php common::printOrderLink('objectID', $orderBy, $vars, $lang->idAB);?></th>
<th><?php echo $lang->action->objectName;?></th>
<th class='w-100px'><?php common::printOrderLink('actor', $orderBy, $vars, $lang->action->actor);?></th>
<th class='w-150px'><?php common::printOrderLink('date', $orderBy, $vars, $lang->action->date);?></th>
<th class='w-100px'><?php common::printOrderLink('actor', $orderBy, $vars, $lang->action->actor);?></th>
<th class='w-150px'><?php common::printOrderLink('date', $orderBy, $vars, $lang->action->date);?></th>
<th class='w-100px'><?php echo $lang->actions;?></th>
</tr>
</thead>
@@ -55,8 +54,8 @@
$methodName = 'view';
if($module == 'caselib')
{
$methodName = 'libview';
$module = 'testsuite';
$methodName = 'view';
$module = 'caselib';
}
if(isset($config->action->customFlows[$action->objectType]))
{
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->common = 'Admin';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Datenbank prüfen';
$lang->admin->sso = 'SSO';
+1 -2
View File
@@ -9,7 +9,6 @@
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->common = 'Admin';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
@@ -80,7 +79,7 @@ $lang->admin->safe->reasonList['birthday'] = 'Same as DOB';
$lang->admin->safe->modifyPasswordList[1] = 'Yes';
$lang->admin->safe->modifyPasswordList[0] = 'No';
$lang->admin->safe->loginCaptchaList[1] = 'Yes'
$lang->admin->safe->loginCaptchaList[1] = 'Yes';
$lang->admin->safe->loginCaptchaList[0] = 'No';
$lang->admin->safe->noticeMode = 'Password will be checked when a user logs in, or a user is added or edited.';
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: en.php 4460 2013-02-26 02:28:02Z chencongzhi520@gmail.com $
* @link https://www.zentao.pm
*/
$lang->admin->common = 'Admin';
$lang->admin->index = 'Admin Home';
$lang->admin->checkDB = 'Check Database';
$lang->admin->sso = 'Zdoo';
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: vi.php 4460 2013-02-26 02:28:02Z quocnho@gmail.com $
* @link http://www.zentao.net
*/
$lang->admin->common = 'Quản trị';
$lang->admin->index = 'Trang quản trị';
$lang->admin->checkDB = 'Kiểm tra CSDL';
$lang->admin->sso = 'Zdoo';
-1
View File
@@ -9,7 +9,6 @@
* @version $Id: zh-cn.php 4767 2013-05-05 06:10:13Z wwccss $
* @link http://www.zentao.net
*/
$lang->admin->common = '后台管理';
$lang->admin->index = '后台管理首页';
$lang->admin->checkDB = '检查数据库';
$lang->admin->sso = 'ZDOO集成';
+11 -8
View File
@@ -9,7 +9,6 @@
* @version $Id: zh-tw.php 4767 2013-05-05 06:10:13Z wwccss $
* @link http://www.zentao.net
*/
$lang->admin->common = '後台管理';
$lang->admin->index = '後台管理首頁';
$lang->admin->checkDB = '檢查資料庫';
$lang->admin->sso = 'ZDOO整合';
@@ -54,13 +53,14 @@ $lang->admin->bind->caption = '關聯社區帳號';
$lang->admin->bind->success = "關聯賬戶成功";
$lang->admin->safe = new stdclass();
$lang->admin->safe->common = '安全策略';
$lang->admin->safe->set = '密碼安全設置';
$lang->admin->safe->password = '密碼安全';
$lang->admin->safe->weak = '常用弱口令';
$lang->admin->safe->reason = '類型';
$lang->admin->safe->checkWeak = '弱口令掃瞄';
$lang->admin->safe->changeWeak = '修改弱口令密碼';
$lang->admin->safe->common = '安全策略';
$lang->admin->safe->set = '密碼安全設置';
$lang->admin->safe->password = '密碼安全';
$lang->admin->safe->weak = '常用弱口令';
$lang->admin->safe->reason = '類型';
$lang->admin->safe->checkWeak = '弱口令掃瞄';
$lang->admin->safe->changeWeak = '修改弱口令密碼';
$lang->admin->safe->loginCaptcha = '登錄使用驗證碼';
$lang->admin->safe->modifyPasswordFirstLogin = '首次登錄修改密碼';
$lang->admin->safe->modeList[0] = '不檢查';
@@ -79,5 +79,8 @@ $lang->admin->safe->reasonList['birthday'] = '與生日相同';
$lang->admin->safe->modifyPasswordList[1] = '必須修改';
$lang->admin->safe->modifyPasswordList[0] = '不強制';
$lang->admin->safe->loginCaptchaList[1] = '是';
$lang->admin->safe->loginCaptchaList[0] = '否';
$lang->admin->safe->noticeMode = '系統會在登錄、創建和修改用戶、修改密碼的時候檢查用戶口令。';
$lang->admin->safe->noticeStrong = '密碼長度越長,含有大寫字母或數字或特殊符號越多,密碼字母越不重複,安全度越強!';
+4 -4
View File
@@ -248,10 +248,10 @@ class adminModel extends model
}
if(isset($weaks[$user->password])) return true;
if($user->password and md5($user->account)) return true;
if($user->phone and $user->password and md5($user->phone)) return true;
if($user->mobile and $user->password and md5($user->mobile)) return true;
if($user->birthday and $user->password and md5($user->birthday)) return true;
if($user->password == md5($user->account)) return true;
if($user->phone and $user->password == md5($user->phone)) return true;
if($user->mobile and $user->password == md5($user->mobile)) return true;
if($user->birthday and $user->password == md5($user->birthday)) return true;
return false;
}
}
-5
View File
@@ -11,11 +11,6 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('system');?></div>
</div>
</div>
<div class="main-row">
<div class='side-col' id='sidebar'>
<div class='cell'>
+1 -1
View File
@@ -14,7 +14,7 @@
<?php include '../../common/view/header.html.php';?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('system');?></div>
<div class='btn-toolbar pull-left'><?php // common::printAdminSubMenu('system');?></div>
</div>
</div>
<div class="main-row">
-3
View File
@@ -11,9 +11,6 @@
*/
?>
<?php include '../../common/view/header.html.php'; ?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left"><?php common::printAdminSubMenu('sso');?></div>
</div>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
+6
View File
@@ -1 +1,7 @@
<?php
$config->automation->ztfSite = 'https://ztf.im';
$config->automation->ztfDownload = 'https://ztf.im/ztf.html';
$config->automation->ztfManual = 'https://ztf.im/book/ztf/ztf-about-26.html';
$config->automation->zendataSite = 'https://www.zendata.cn';
$config->automation->zendataDownload = 'https://www.zendata.cn/download.html';
$config->automation->zendataManual = 'https://www.zendata.cn/book/zendata/why-zendata-115.html';
+2 -19
View File
@@ -11,14 +11,6 @@
*/
class automation extends control
{
/**
* Project id.
*
* @var int
* @access public
*/
public $projectID = 0;
/**
* Products.
*
@@ -36,16 +28,7 @@ class automation extends control
public function __construct($moduleName = '', $methodName = '')
{
parent::__construct($moduleName, $methodName);
/* Set testtask menu group. */
$this->projectID = isset($_GET['PRJ']) ? $_GET['PRJ'] : 0;
if(!$this->projectID)
{
$this->app->loadConfig('qa');
foreach($this->config->qa->menuList as $module) $this->lang->navGroup->$module = 'qa';
}
$this->view->products = $this->products = $this->loadModel('product')->getProductPairsByProject($this->projectID);
$this->view->products = $this->products = $products = $this->loadModel('product')->getPairs();
}
/**
@@ -61,7 +44,7 @@ class automation extends control
/* Set menu. */
$productID = $this->product->saveState($productID, $this->products);
if(empty($branch)) $branch = (int)$this->cookie->preBranch;
$this->automation->setMenu($this->products, $productID, $branch);
$this->loadModel('qa')->setMenu($this->products, $productID, $branch);
$this->view->title = $this->lang->automation->common;
$this->view->position[] = $this->lang->automation->browse;
+53
View File
@@ -0,0 +1,53 @@
.ztf-block {width: 100%; margin-top: 22px; background: linear-gradient(to bottom, #deeaf8 , #f4f7fe); display: inline-flex; box-shadow: 2px 2px 5px #e2dede;}
.ztf-logo {width: 40%; height: 190px; display: inline-block; line-height: 190px; text-align: right; padding-right: 65px;}
.ztf-download {width: 45%; height: 190px; display: inline-block;}
.ztf-download-trait {display: inline-block; width: 100%; margin: 45px 0px 6px 0px; font-weight:bold; font-size: 15px; color: #0c4678;}
.ztf-download-trait div {width: 35%; float: left; padding: 8px 0px;}
.ztf-download-button {width: 100%;}
.ztf-download-button a {margin-right: 15px; font-weight:bold; font-size: 14px;}
.dot-symbol{font-size: 12px; margin-right: 5px;}
.block-content {width: 100%;}
.block-details {width: 49%; display: inline-block; padding: 30px 140px; margin-top: 20px; box-shadow: 2px 2px 5px #e2dede;}
.block-details-right {float: right;}
.block-details p {font-size: 18px; font-weight:bold; margin: 0 0 10px 20px;}
.block-details li {width: 40%; float: left; padding: 6px 0px; font-size: 14px; font-weight:bold; color: #666666; text-align: left; list-style:none;}
.block-details-line li {width: 100%;}
.zendata-block {width: 100%; margin-top: 40px; background: linear-gradient(to bottom, #deeaf8 , #f4f7fe); display: inline-flex; box-shadow: 2px 2px 5px #e2dede;}
.zendata-logo {width: 40%; height: 170px; display: inline-block; line-height: 170px; text-align: right; padding-right: 90px;}
.zendata-download {width: 45%; height: 170px; display: inline-block;}
.zendata-download-trait {display: inline-block; width: 100%; margin: 60px 0px 6px 0px; font-weight:bold; font-size: 15px; color: #0c4678;}
.zendata-download-trait div {margin-right: 35px; float: left; padding: 8px 0px;}
.zendata-download-button {width: 100%;}
.zendata-download-button a {margin-right: 15px; font-weight:bold; font-size: 14px;}
.zentata-content {display: table; width: 100%; table-layout: fixed; margin-top: 20px;}
.block-zendata-block {display: table-cell;}
.block-zendata {width: 96%; display: inline-block; padding: 30px 40px; margin-top: 20px; box-shadow: 2px 2px 5px #e2dede;}
.block-zendata p {font-size: 18px; font-weight:bold; margin: 0 0 10px 20px;}
.block-zendata li {width: 100%; float: left; padding: 6px 0px; font-size: 14px; font-weight:bold; color: #666666; text-align: left; list-style:none;}
.qr-code {margin-top: 20px; padding: 20px 0px 20px 58px; box-shadow: 2px 2px 5px #e2dede;}
.qr-code-img {width: 90px; height: 90px; display: inline-block; float: left;}
.qr-code-details {display: inline-block; margin: 10px 0px 0px 10px;}
.qr-code-details div{margin: 5px 0px;}
.qr-code-group {color: #898989;}
@media screen and (max-height: 768px)
{
.qr-code {padding: 20px 0px 20px 43px;}
.block-details li {width: 50%;}
.block-details-line li {width: 100%;}
.ztf-download-trait div {width: 47%;}
.block-details {padding: 30px 60px;}
.block-zendata {padding: 30px 25px;}
}
@media screen and (max-height: 720px)
{
.zendata-download {width: 50%;}
.ztf-download-trait {margin: 35px 0px 6px 0px;}
.block-zendata {padding: 30px 14px;}
.ztf-download {width: 48%;}
.qr-code {padding: 20px 0px 20px 32px;}
}
.btn-automation {background: linear-gradient(to bottom, #0bb6fb, #0d67e1); border: 0px; padding: 8px 12px;}
+66
View File
@@ -0,0 +1,66 @@
<?php
/**
* The automation module zh-cn file 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 automation
* @version $Id: zh-cn.php 4767 2013-05-05 06:10:13Z wwccss $
* @link http://www.zentao.net
*/
$lang->automation->common = 'Automated Testing';
$lang->automation->browse = 'Home';
$lang->automation->title = 'Test Automation Solutions';
$lang->automation->ztfSite = 'ZTF Website';
$lang->automation->ztfDownload = 'ZTF Download';
$lang->automation->ztfManual = 'ZTF Manual';
$lang->automation->ztfFeature1 = 'ZTF solves problems for you.';
$lang->automation->ztfFeature2 = 'ZTF solves the following problems for you:';
$lang->automation->ztfFeature3 = 'Management of use cases';
$lang->automation->ztfFeature4 = 'Comparison of test results';
$lang->automation->ztfFeature5 = 'Execution of test scripts';
$lang->automation->ztfFeature6 = 'Bug reporting';
$lang->automation->ztfFeature7 = 'ZTF is not depended on the environment';
$lang->automation->ztfFeature8 = 'Written in Go';
$lang->automation->ztfFeature9 = 'Deploy with no dependencies';
$lang->automation->ztfFeature10 = 'Works on all platforms';
$lang->automation->ztfFeature11 = 'Has only one executable';
$lang->automation->ztfFeature12 = 'ZTF is for all automated testing types';
$lang->automation->ztfFeature13 = 'Support for common development languages';
$lang->automation->ztfFeature14 = 'Can be integrated with known testing frameworks';
$lang->automation->ztfFeature15 = 'No specific script implementation requried';
$lang->automation->ztfFeature16 = 'Export test cases to scripts in bulk';
$lang->automation->ztfFeature17 = 'Submit execution results to ZenTao';
$lang->automation->ztfFeature18 = 'Create bugs from execution results';
$lang->automation->ztfFeature19 = 'Integrate ZenTao ALM';
$lang->automation->zendataSite = 'ZenData Website';
$lang->automation->zendataDownload = 'ZenData Download';
$lang->automation->zendataManual = 'ZenData Manual';
$lang->automation->zendata = 'A generic data generation tool';
$lang->automation->zendataFeature1 = 'Easy to get started with no coding knowledge required';
$lang->automation->zendataFeature2 = 'Customizable data format with no restrictions';
$lang->automation->zendataFeature3 = 'Generate a million pieces of data with one click';
$lang->automation->zendataFeature4 = 'Cross-platform and cross-language';
$lang->automation->zendataFeature5 = 'Only one executable is required to run it';
$lang->automation->zendataFeature6 = 'For Windows, Linux, and MacOS';
$lang->automation->zendataFeature7 = 'For various languages';
$lang->automation->zendataFeature8 = 'All kinds of black tricks';
$lang->automation->zendataFeature9 = 'Interval, Step Size, Random, Repeat, and Reference';
$lang->automation->zendataFeature10 = 'Specify a list of files to be queried in Excel';
$lang->automation->zendataFeature11 = 'Parallel generation, recursive generation, and reverse parsing';
$lang->automation->groupTips = 'Welcome to the automated testing QQ group';
$lang->automation->groupTitle = 'Software testing group:';
$lang->automation->qqGroup = '522506766';
$lang->automation->groupDescription = 'Software testing community for software testers to share software testing tools and methods and improve software testing skills';
+47 -192
View File
@@ -12,200 +12,55 @@
$lang->automation->common = '自动化测试';
$lang->automation->browse = '首页';
$lang->automation->description = '自动化测试解决方案';
$lang->automation->ztf = 'ZTF自动化测试管理框架';
$lang->automation->zendata = 'ZenData数据生成工具';
$lang->automation->title = '自动化测试解决方案';
$lang->automation->details = <<<EOF
<article class="article">
<header>
<h1 class="text-center">自动化测试解决方案</h1>
<div class="abstract">
<p>
摘要:欢迎使用禅道提供的自动化解决方案,本次为大家带来了两款工具。Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。
</p>
</div>
</header>
$lang->automation->ztfSite = '禅道ZTF官网';
$lang->automation->ztfDownload = 'ZTF框架下载';
$lang->automation->ztfManual = 'ZTF框架手册';
<section class="content">
<h2>ZTF自动化测试管理框架</h2>
<p>
Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
和市面上已有的自动化测试框架相比,ZTF更聚焦于自动化测试的管理功能。
ZTF提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug的创建以及和其他自动化测框架的集成。
ZTF使用go语言开发,可以支持各种平台。ZTF支持常见的编程语言,您可以选择您喜欢用的语言来开发自动化测试脚本。
</p>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://ztf.im/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">禅道ZTF官网</a> &nbsp; &nbsp;
<a href="https://ztf.im/ztf.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架下载</a> &nbsp; &nbsp;
<a href="https://ztf.im/book/ztf/ztf-about-26.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
<h2>ZenData数据生成工具</h2>
<p>
ZenData主要两大功能:数据生成和数据解析。通过一个配置文件,可以使用ZenData生成您想要的各种数据。
同样也可以对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。还可以一键生成海量数据用于性能和压力测试。
</p>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://www.zendata.cn/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData官网</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/download.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData下载</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/book/zendata/why-zendata-115.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
</section>
</article>
EOF;
$lang->automation->ztfDetails = <<<EOF
<article class="article">
<header>
<h1 class="text-center">ZTF自动化测试管理框架</h1>
<div class="abstract">
<p>
摘要:Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
</p>
</div>
</header>
$lang->automation->ztfFeature1 = 'ZTF为你解决各种问题';
$lang->automation->ztfFeature2 = 'ZTF为你解决如下问题';
$lang->automation->ztfFeature3 = '用例信息的管理';
$lang->automation->ztfFeature4 = '测试结果的对比';
$lang->automation->ztfFeature5 = '测试脚本的执行';
$lang->automation->ztfFeature6 = '缺陷Bug的提交';
<section class="content">
<h4>一、ZTF是什么</h4>
<p>
Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
和市面上已有的自动化测试框架相比,ZTF更聚焦于自动化测试的管理功能。
ZTF提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug的创建以及和其他自动化测框架的集成。
ZTF使用go语言开发,可以支持各种平台。ZTF支持常见的编程语言,您可以选择您喜欢用的语言来开发自动化测试脚本。
</p>
<h4>二、为什么来做ZTF</h4>
<p>
市面上已经有很多自动化测试框架,我们为什么还要来做ZTF呢?ZTF主要是解决测试管理的问题。
目前市面上的自动化测试框架主要分为两大类,一类是单元测试框架,一类是某种领域的自动化测试框架。
单元测试框架是跟各个语言绑定的,比如cppunit, phpunit等。第二类框架以selenium为代表,可以用来做web的自动化测试。
也还有做GUI或者手机应用乃至游戏等场景的自动化测试的框架。
</p>
<p>
这就产生了一个问题,我们需要将这些自动化测试框架的测试脚本统一管理起来。
每一个脚本都可以和测试管理系统里面的一个用例进行关联,脚本里面的步骤信息和管理系统里面的用例信息可以互相同步。
测试执行的结果可以反映到测试管理系统中,失败的测试脚本可以创建bug。
为此我们开发了ZTF测试管理框架。
</p>
<h4>三、ZTF和其他自动化测试框架的关系</h4>
<p>
ZTF和其他的自动化测试框架是互相合作的关系。
您可以继续使用之前的自动化测试框架来进行脚本的开发,只需要通过注释的方式加入几个标签就可以转换成ztf的自动化测试脚本。
</p>
<h4>四、ZTF自动化测试框架的特点</h4>
<ol>
<li>简单:ZTF的语法标签和规则都很简单,一看就会,很容易上手。</li>
<li>跨平台:ZTF使用GO语言开发,跨平台,只有一个可执行文件,就可以运行。</li>
<li>跨语言:ZTF支持常见的编程语言,你喜欢用什么就用什么。</li>
<li>跨框架:ZTF可以和市面上常见的单元测试框架、常见的自动化测试框架都可以很好的集成。</li>
<li>工程化:使用ZTF可以真正达到工程化的自动化测试,可以大批量大规模的进行自动化测试的管理和执行。</li>
<li>跨场景:借助于其他框架,ZTF可以用来做单元测试、接口测试、web界面测试、GUI界面测试、APP测试等多种场景。</li>
</ol>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://ztf.im/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">禅道ZTF官网</a> &nbsp; &nbsp;
<a href="https://ztf.im/ztf.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架下载</a> &nbsp; &nbsp;
<a href="https://ztf.im/book/ztf/ztf-about-26.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
</section>
</article>
EOF;
$lang->automation->ztfFeature7 = 'ZTF对环境无任何依赖';
$lang->automation->ztfFeature8 = '使用Go语言开发';
$lang->automation->ztfFeature9 = '部署无任何依赖';
$lang->automation->ztfFeature10 = '所有平台均可运行';
$lang->automation->ztfFeature11 = '只有一个可执行文件';
$lang->automation->zendataDetails = <<<EOF
<article class="article">
<header>
<h1 class="text-center">ZenData数据生成工具</h1>
<div class="abstract">
<p>
摘要:ZenData使用YAML来作为数据类型配置文件实现了数据的生成和解析。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。
还可以一键生成海量数据用于性能和压力测试。
</p>
</div>
</header>
$lang->automation->ztfFeature12 = 'ZTF对自动化测试方式无要求';
$lang->automation->ztfFeature13 = '支持常见的各种开发语言';
$lang->automation->ztfFeature14 = '可以和已知测试框架集成';
$lang->automation->ztfFeature15 = '对脚本实现方式无要求';
<section class="content">
<h4>一、ZenData的实现原理</h4>
<p>
ZenData使用YAML来作为数据类型配置文件。对于每一种类型的数据来讲,我们都可以将其拆分成若干的字段。
比如我们要测试一个用户的订单表,会有订单的id,用户id或者账户名,订单的名称,订单的金额,订单的时间,订单状态等等字段。
我们可以针对每一个字段配置其取值的范围。比如订单id,我可以定义为从1到10000,用户id可以是1-100。
这样每一个字段都有了一个取值范围列表。当ZenData来生成数据的时候,从每一个字段里面依次取一个值,将其拼接在一起,就形成了一条记录。
大家可以想象成每个字段都是一个转盘,按照自己的频率进行旋转,每一次旋转都从中取出一个值,和其他的字段进行组合。
</p>
<p>上面说的是最基本的的工作原理,ZenData还提供了步长、随机、循环、引用等多种定义方式,我们会在接下来的手册里面展开讲。</p>
<h4>二、ZenData的用途</h4>
<p>
ZenData主要两大功能:数据生成和数据解析。通过一个配置文件,可以使用ZenData生成您想要的各种数据。
同样也可以对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。还可以一键生成海量数据用于性能和压力测试。
</p>
<h4>三、ZenData主要的特点</h4>
<ol>
<li>简单无依赖,只有一个可执行文件,即可满足命令行生成和HTTP接口两种数据生成服务。</li>
<li>使用配置文件来生成数据,使用人员不需要有开发知识,即可上手应用。</li>
<li>提供了功能强大的语法,分组、区间、步长、循环、随机、格式化和前后缀等,配置灵活性极强。</li>
<li>支持从文本文件中读取数据,方便用户对字段取值进行精确控制。</li>
<li>提供了Excel表格数据的标准SQL查询接口,使用更加灵活。</li>
<li>使用预制的序列(ranges)、实例(instances)、配置(config)对定义进行复用,以解决复杂数据格式的定义。</li>
<li>语法支持继承和扩展,为定义文件间的复用提供方便。</li>
<li>可以反向解析数据,可以对程序的输出进行解析,方便自动化测试脚本进行比对。</li>
<li>发行包內置了基础业务数据的定义文件(不断完善中)。</li>
<li>提供了HTTP接口数据生成服务,各种语言都可以方便调用。</li>
</ol>
<div class="section">
<div class="text-left" style="padding:25px 15px 10px 15px;">
<p>
<a href="https://www.zendata.cn/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData官网</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/download.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData下载</a> &nbsp; &nbsp;
<a href="https://www.zendata.cn/book/zendata/why-zendata-115.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData手册</a>
</p>
<div style="margin-top:15px;" class="text-muted">
<p>
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
</p>
<p>
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
</p>
</div>
</div>
</div>
</section>
</section>
</article>
EOF;
$lang->automation->ztfFeature16 = '可批量将禅道测试用例导出为脚本';
$lang->automation->ztfFeature17 = '可以将执行结果提交到禅道中';
$lang->automation->ztfFeature18 = '可以将执行结果创建为Bug';
$lang->automation->ztfFeature19 = 'ZTF和禅道深度集成';
$lang->automation->zendataSite = 'ZenData官网';
$lang->automation->zendataDownload = 'ZenData下载';
$lang->automation->zendataManual = 'ZenData手册';
$lang->automation->zendata = '通用数据生成利器';
$lang->automation->zendataFeature1 = '不懂代码也可以使用,轻松上手';
$lang->automation->zendataFeature2 = '数据格式完全自定义,无任何限制';
$lang->automation->zendataFeature3 = '一键生成百万条数据,毫无压力';
$lang->automation->zendataFeature4 = '跨平台跨语言';
$lang->automation->zendataFeature5 = '运行只需要一个可执行文件';
$lang->automation->zendataFeature6 = 'Windows、Linux、MacOS都可以用';
$lang->automation->zendataFeature7 = '各种语言都可以用';
$lang->automation->zendataFeature8 = '各种黑技巧';
$lang->automation->zendataFeature9 = '区间,步长,随机,重复,引用';
$lang->automation->zendataFeature10 = '指定文件列表,从excel中查询';
$lang->automation->zendataFeature11 = '平行生成、递归生成、反向解析';
$lang->automation->groupTips = '欢迎扫码加入自动化测试QQ交流群';
$lang->automation->groupTitle = '软件测试交流群:';
$lang->automation->qqGroup = '522506766';
$lang->automation->groupDescription = '为软件测试从业者提供的软件测试技术交流社群,分享软件测试工具与方法,帮助大家提升软件测试技能水平。';
+66
View File
@@ -0,0 +1,66 @@
<?php
/**
* The automation module zh-tw file 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 automation
* @version $Id: zh-tw.php 4767 2013-05-05 06:10:13Z wwccss $
* @link http://www.zentao.net
*/
$lang->automation->common = '自動化測試';
$lang->automation->browse = '首頁';
$lang->automation->title = '自動化測試解決方案';
$lang->automation->ztfSite = '禪道ZTF官網';
$lang->automation->ztfDownload = 'ZTF框架下載';
$lang->automation->ztfManual = 'ZTF框架手冊';
$lang->automation->ztfFeature1 = 'ZTF為你解決各種問題';
$lang->automation->ztfFeature2 = 'ZTF為你解決如下問題';
$lang->automation->ztfFeature3 = '用例信息的管理';
$lang->automation->ztfFeature4 = '測試結果的對比';
$lang->automation->ztfFeature5 = '測試腳本的執行';
$lang->automation->ztfFeature6 = '缺陷Bug的提交';
$lang->automation->ztfFeature7 = 'ZTF對環境無任何依賴';
$lang->automation->ztfFeature8 = '使用Go語言開發';
$lang->automation->ztfFeature9 = '部署無任何依賴';
$lang->automation->ztfFeature10 = '所有平台均可運行';
$lang->automation->ztfFeature11 = '只有一個執行檔';
$lang->automation->ztfFeature12 = 'ZTF對自動化測試方式無要求';
$lang->automation->ztfFeature13 = '支持常見的各種開發語言';
$lang->automation->ztfFeature14 = '可以和已知測試框架整合';
$lang->automation->ztfFeature15 = '對腳本實現方式無要求';
$lang->automation->ztfFeature16 = '可批量將禪道測試用例導出為腳本';
$lang->automation->ztfFeature17 = '可以將執行結果提交到禪道中';
$lang->automation->ztfFeature18 = '可以將執行結果創建為Bug';
$lang->automation->ztfFeature19 = 'ZTF和禪道深度整合';
$lang->automation->zendataSite = 'ZenData官網';
$lang->automation->zendataDownload = 'ZenData下載';
$lang->automation->zendataManual = 'ZenData手冊';
$lang->automation->zendata = '通用數據生成利器';
$lang->automation->zendataFeature1 = '不懂代碼也可以使用,輕鬆上手';
$lang->automation->zendataFeature2 = '數據格式完全自定義,無任何限制';
$lang->automation->zendataFeature3 = '一鍵生成百萬條數據,毫無壓力';
$lang->automation->zendataFeature4 = '跨平台跨語言';
$lang->automation->zendataFeature5 = '運行只需要一個執行檔';
$lang->automation->zendataFeature6 = 'Windows、Linux、MacOS都可以用';
$lang->automation->zendataFeature7 = '各種語言都可以用';
$lang->automation->zendataFeature8 = '各種黑技巧';
$lang->automation->zendataFeature9 = '區間,步長,隨機,重複,引用';
$lang->automation->zendataFeature10 = '指定檔案列表,從excel中查詢';
$lang->automation->zendataFeature11 = '平行生成、遞歸生成、反向解析';
$lang->automation->groupTips = '歡迎掃碼加入自動化測試QQ交流群';
$lang->automation->groupTitle = '軟件測試交流群:';
$lang->automation->qqGroup = '522506766';
$lang->automation->groupDescription = '為軟件測試從業者提供的軟件測試技術交流社群,分享軟件測試工具與方法,幫助大家提升軟件測試技能水平。';
-30
View File
@@ -13,34 +13,4 @@
<?php
class automationModel extends model
{
/**
* Set the menu.
*
* @param array $products
* @param int $productID
* @param int $branch
* @access public
* @return void
*/
public function setMenu($products, $productID, $branch = 0)
{
$this->loadModel('product');
foreach($this->lang->testtask->menu as $key => $value)
{
if($this->lang->navGroup->testtask != 'qa') $this->loadModel('qa')->setSubMenu('automation', $key, $productID);
common::setMenuVars($this->lang->testtask->menu, $key, $productID);
}
if($this->lang->navGroup->automation == 'qa')
{
foreach($this->lang->qa->subMenu->automation as $key => $menu)
{
common::setMenuVars($this->lang->qa->subMenu->automation, $key, $productID);
}
$this->lang->qa->menu = $this->lang->automation->menu;
$this->lang->automation->menu = $this->lang->qa->subMenu->automation;
$this->lang->qa->switcherMenu = $this->product->getSwitcher($productID, '', $branch);
}
}
}
+118 -14
View File
@@ -13,26 +13,130 @@
<?php include '../../common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<div class="row">
<div class="col-xs-2">
<ul class="nav nav-tabs nav-stacked">
<li class="active"><a href="###" data-target="#tab3Content1" data-toggle="tab"><?php echo $lang->automation->description;?></a></li>
<li><a href="###" data-target="#tab3Content2" data-toggle="tab"><?php echo $lang->automation->ztf;?></a></li>
<li><a href="###" data-target="#tab3Content3" data-toggle="tab"><?php echo $lang->automation->zendata;?></a></li>
</ul>
</div>
<div class="col-xs-1"></div>
<div class="col-xs-10">
<div class="tab-content col-xs-10">
<div class="tab-pane fade active in" id="tab3Content1">
<?php echo $lang->automation->details;?>
<div class='text-center'>
<h2 style='margin-top: 18px;'><?php echo $lang->automation->title;?></h1>
</div>
<div class='ztf-block'>
<div class='ztf-logo'>
<img src='<?php echo $config->webRoot . 'theme/default/images/main/ztf.png';?>' />
</div>
<div class="tab-pane fade" id="tab3Content2">
<?php echo $lang->automation->ztfDetails;?>
<div class='ztf-download'>
<div class='ztf-download-trait'>
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature1;?></span></div>
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature19;?></span></div>
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature7;?></span></div>
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature12;?></span></div>
</div>
<div class="ztf-download-button">
<a href="<?php echo $config->automation->ztfSite;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->ztfSite;?></a>
<a href="<?php echo $config->automation->ztfDownload;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->ztfDownload;?></a>
<a href="<?php echo $config->automation->ztfManual;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->ztfManual;?></a>
</div>
</div>
<div class="tab-pane fade" id="tab3Content3">
<?php echo $lang->automation->zendataDetails;?>
</div>
<div class='block-content'>
<div class='block-details'>
<p><?php echo $lang->automation->ztfFeature2;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature3;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature4;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature5;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature6;?></li>
</ul>
</div>
<div class='block-details block-details-right'>
<p><?php echo $lang->automation->ztfFeature7;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature8;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature9;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature10;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature11;?></li>
</ul>
</div>
<div class='block-details block-details-line'>
<p><?php echo $lang->automation->ztfFeature12;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature13;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature14;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature15;?></li>
</ul>
</div>
<div class='block-details block-details-line block-details-right'>
<p><?php echo $lang->automation->ztfFeature12;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature16;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature17;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature18;?></li>
</ul>
</div>
</div>
<div class='zendata-block'>
<div class='zendata-logo'>
<img src='<?php echo $config->webRoot . 'theme/default/images/main/zendata.png';?>' />
</div>
<div class='zendata-download'>
<div class='zendata-download-trait'>
<div><span class='dot-symbol'>●</span><?php echo $lang->automation->zendata;?></div>
<div><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature4;?></div>
<div><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature8;?></div>
</div>
<div class="zendata-download-button">
<a href="<?php echo $config->automation->zendataSite;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->zendataSite;?></a>
<a href="<?php echo $config->automation->zendataDownload;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->zendataDownload;?></a>
<a href="<?php echo $config->automation->zendataManual;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->zendataManual;?></a>
</div>
</div>
</div>
<div class='zentata-content'>
<div class='block-zendata-block'>
<div class='block-zendata'>
<p><?php echo $lang->automation->zendata;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature1;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature2;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature3;?></li>
</ul>
</div>
</div>
<div class='block-zendata-block'>
<div class='block-zendata'>
<p><?php echo $lang->automation->zendataFeature4;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature5;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature6;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature7;?></li>
</ul>
</div>
</div>
<div class='block-zendata-block'>
<div class='block-zendata' style='width: 100%;'>
<p><?php echo $lang->automation->zendataFeature8;?></p>
<ul>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature9;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature10;?></li>
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature11;?></li>
</ul>
</div>
</div>
</div>
<div class='qr-code'>
<div class='qr-code-img'>
<img src='<?php echo $config->webRoot . 'theme/default/images/main/qrcode.png';?>' />
</div>
<div class='qr-code-details'>
<div style='font-size: 16px; font-weight: bold;'><?php echo $lang->automation->groupTips;?></div>
<div class='qr-code-group'><span><?php echo $lang->automation->groupTitle;?></span> <span style='color: #1d7cf1;'><?php echo $lang->automation->qqGroup;?></span></div>
<div class='qr-code-group'><?php echo $lang->automation->groupDescription;?></div>
</div>
</div>
</div>
<div class="col-xs-1"></div>
</div>
</div>
<?php include '../../common/view/footer.html.php';?>
+3 -1
View File
@@ -8,6 +8,9 @@ $lang->backup->restore = 'Restore';
$lang->backup->change = 'Edit Expiration';
$lang->backup->changeAB = 'Edit';
$lang->backup->rmPHPHeader = 'Remove PHP header';
$lang->backup->setting = 'Setting';
$lang->backup->settingAction = 'Backup Setting';
$lang->backup->time = 'Date';
$lang->backup->files = 'Files';
@@ -19,7 +22,6 @@ $lang->backup->status = 'Status';
$lang->backup->statusList['success'] = 'Success';
$lang->backup->statusList['fail'] = 'Fail';
$lang->backup->setting = 'Settings';
$lang->backup->settingDir = 'Backup Directory';
$lang->backup->settingList['nofile'] = 'Do not back up files or codes.';
$lang->backup->settingList['nosafe'] = 'Do not prevent downloading PHP file header.';
+4 -2
View File
@@ -1,5 +1,5 @@
<?php
$lang->backup->common = '备份';
$lang->backup->common = '系统备份';
$lang->backup->index = '备份首页';
$lang->backup->history = '备份历史';
$lang->backup->delete = '删除备份';
@@ -8,6 +8,9 @@ $lang->backup->restore = '还原';
$lang->backup->change = '保留时间';
$lang->backup->changeAB = '修改';
$lang->backup->rmPHPHeader = '去除安全设置';
$lang->backup->setting = '设置';
$lang->backup->settingAction = '备份设置';
$lang->backup->time = '备份时间';
$lang->backup->files = '备份文件';
@@ -19,7 +22,6 @@ $lang->backup->status = '状态';
$lang->backup->statusList['success'] = '成功';
$lang->backup->statusList['fail'] = '失败';
$lang->backup->setting = '设置';
$lang->backup->settingDir = '备份目录';
$lang->backup->settingList['nofile'] = '不备份附件和代码';
$lang->backup->settingList['nosafe'] = '不需要防下载PHP文件头';
+4 -2
View File
@@ -1,5 +1,5 @@
<?php
$lang->backup->common = '備份';
$lang->backup->common = '系統備份';
$lang->backup->index = '備份首頁';
$lang->backup->history = '備份歷史';
$lang->backup->delete = '刪除備份';
@@ -8,6 +8,9 @@ $lang->backup->restore = '還原';
$lang->backup->change = '保留時間';
$lang->backup->changeAB = '修改';
$lang->backup->rmPHPHeader = '去除安全設置';
$lang->backup->setting = '設置';
$lang->backup->settingAction = '備份設置';
$lang->backup->time = '備份時間';
$lang->backup->files = '備份檔案';
@@ -19,7 +22,6 @@ $lang->backup->status = '狀態';
$lang->backup->statusList['success'] = '成功';
$lang->backup->statusList['fail'] = '失敗';
$lang->backup->setting = '設置';
$lang->backup->settingDir = '備份目錄';
$lang->backup->settingList['nofile'] = '不備份附件和代碼';
$lang->backup->settingList['nosafe'] = '不需要防下載PHP檔案頭';
+2 -2
View File
@@ -17,7 +17,7 @@
</div>
<?php endif;?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('system');?></div>
<div class='btn-toolbar pull-left'><?php // common::printAdminSubMenu('system');?></div>
</div>
<div id='mainContent' class="main-row">
<div class='side-col' id='sidebar'>
@@ -63,7 +63,7 @@
<?php if($i == 0):?>
<td <?php if($rowspan > 1) echo "rowspan='$rowspan'"?>><?php echo date(DT_DATETIME1, $backupFile->time);?></td>
<?php endif;?>
<td class='text-left' style='padding-left:5px;'><?php echo $file;?></td>
<td title=<?php echo $file;?> class='text-left' style='padding-left:5px;'><?php echo $file;?></td>
<td><?php echo zget($summary, 'allCount', '');?></td>
<td><?php echo zget($summary, 'count', '');?></td>
<td>
+100 -100
View File
@@ -205,18 +205,19 @@ class block extends control
*
* @param string $module
* @param string $type
* @param int $projectID
* @access public
* @return void
*/
public function dashboard($module, $type = '')
public function dashboard($module, $type = '', $projectID = 0)
{
if($this->loadModel('user')->isLogon()) $this->session->set('blockModule', $module);
$blocks = $this->block->getBlockList($module, $type);
$commonField = 'common';
if($module == 'project')
if($module == 'project' and $projectID)
{
$project = $this->loadModel('project')->getByID($this->session->PRJ);
$project = $this->loadModel('project')->getByID($this->session->project);
$commonField = $project->model . 'common';
}
@@ -252,10 +253,18 @@ class block extends control
/* The list assigned to me jumps to the work page when click more button. */
$block->moreLink = $this->createLink($moduleName, $method, $vars);
if($moduleName = 'my' and strpos('task|story|requirement|bug|testcase|testtask|issue|risk', $method))
if($moduleName == 'my' and strpos('task|story|requirement|bug|testcase|testtask|issue|risk', $method))
{
$block->moreLink = $this->createLink($moduleName, 'work', 'mode=' . $method . '&' . $vars);
}
elseif($moduleName == 'project' and $method == 'dynamic')
{
$block->moreLink = $this->createLink('project', 'dynamic', "projectID=$projectID&type=all");
}
elseif($moduleName == 'project' and $method == 'testtask')
{
$block->moreLink = $this->createLink('project', 'testtask', "projectID=$projectID");
}
}
elseif($block->block == 'dynamic')
{
@@ -431,7 +440,7 @@ class block extends control
/* Create a project block. */
if($dashboard == 'project')
{
$project = $this->loadModel('project')->getByID($this->session->PRJ);
$project = $this->loadModel('project')->getByID($this->session->project);
$model = $project->model;
}
@@ -561,10 +570,12 @@ class block extends control
$limit = $this->viewType == 'json' ? 0 : (int)$this->params->count;
$todos = $this->loadModel('todo')->getList('all', $this->app->user->account, 'wait, doing', $limit, $pager = null, $orderBy = 'date, begin');
$uri = $this->app->getURI(true);
$this->session->set('todoList', $uri);
$this->session->set('bugList', $uri);
$this->session->set('taskList', $uri);
$this->session->set('riskList', $uri);
$this->session->set('todoList', $uri, 'my');
$this->session->set('bugList', $uri, 'qa');
$this->session->set('taskList', $uri, 'execution');
$this->session->set('storyList', $uri, 'product');
$this->session->set('testtaskList', $uri, 'qa');
foreach($todos as $key => $todo)
{
@@ -582,13 +593,14 @@ class block extends control
*/
public function printTaskBlock()
{
$uri = $this->app->getURI(true);
$this->session->set('taskList', $uri);
$this->session->set('storyList', $uri);
$this->session->set('taskList', $this->app->getURI(true), 'execution');
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->PRJ;
$this->view->tasks = $this->loadModel('task')->getUserTasks($this->app->user->account, $this->params->type, $this->viewType == 'json' ? 0 : (int)$this->params->count, null, $this->params->orderBy, $projectID);
$account = $this->app->user->account;
$type = $this->params->type;
$this->app->loadLang('execution');
$this->view->tasks = $this->loadModel('task')->getUserTasks($account, $type, $this->viewType == 'json' ? 0 : (int)$this->params->count, null, $this->params->orderBy);
}
/**
@@ -599,10 +611,10 @@ class block extends control
*/
public function printBugBlock()
{
$this->session->set('bugList', $this->app->getURI(true));
$this->session->set('bugList', $this->app->getURI(true), 'qa');
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->PRJ : 0;
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->project : 0;
$projectID = $this->view->block->module == 'my' ? 0 : $projectID;
$this->view->bugs = $this->loadModel('bug')->getUserBugs($this->app->user->account, $this->params->type, $this->params->orderBy, $this->viewType == 'json' ? 0 : (int)$this->params->count, null, $projectID);
}
@@ -615,11 +627,11 @@ class block extends control
*/
public function printCaseBlock()
{
$this->session->set('caseList', $this->app->getURI(true));
$this->session->set('caseList', $this->app->getURI(true), 'qa');
$this->app->loadLang('testcase');
$this->app->loadLang('testtask');
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->PRJ : 0;
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->project : 0;
$projectID = $this->view->block->module == 'my' ? 0 : $projectID;
$cases = array();
@@ -660,20 +672,19 @@ class block extends control
{
$this->app->loadLang('testtask');
$this->session->set('testtaskList', $this->app->getURI(true));
$this->session->set('productList', $this->app->getURI(true), 'product');
$this->session->set('testtaskList', $this->app->getURI(true), 'qa');
$this->session->set('buildList', $this->app->getURI(true), 'execution');
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->PRJ : 0;
$projectID = $this->view->block->module == 'my' ? 0 : $projectID;
$this->view->testtasks = $this->dao->select('t1.*,t2.name as productName,t3.name as buildName,t4.name as projectName')->from(TABLE_TESTTASK)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->leftJoin(TABLE_BUILD)->alias('t3')->on('t1.build=t3.id')
->leftJoin(TABLE_PROJECT)->alias('t4')->on('t1.project=t4.id')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t5')->on('t1.project=t5.project')
->leftJoin(TABLE_PROJECT)->alias('t4')->on('t1.execution=t4.id')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t5')->on('t1.execution=t5.project')
->where('t1.deleted')->eq('0')
->beginIF($projectID)->andWhere('t1.project')->eq($projectID)->fi()
->beginIF(!$this->app->user->admin)->andWhere('t1.product')->in($this->app->user->view->products)->fi()
->beginIF(!$this->app->user->admin)->andWhere('t1.execution')->in($this->app->user->view->sprints)->fi()
->andWhere('t1.product = t5.product')
->beginIF($this->params->type != 'all')->andWhere('t1.status')->eq($this->params->type)->fi()
->orderBy('t1.id desc')
@@ -689,15 +700,16 @@ class block extends control
*/
public function printStoryBlock()
{
$this->session->set('storyList', $this->app->getURI(true));
$this->session->set('storyList', $this->app->getURI(true), 'product');
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
$this->app->loadClass('pager', $static = true);
$count = isset($this->params->count) ? (int)$this->params->count : 0;
$pager = pager::init(0, $count , 1);
$type = isset($this->params->type) ? $this->params->type : 'assignedTo';
$orderBy = isset($this->params->type) ? $this->params->orderBy : 'id_asc';
$this->view->stories = $this->loadModel('story')->getUserStories($this->app->user->account, $type, $orderBy, $this->viewType != 'json' ? $pager : '', 'story');
$this->view->stories = $this->loadModel('story')->getUserStories($this->app->user->account, $type, $orderBy, $this->viewType != 'json' ? $pager : '', 'story');
}
/**
@@ -708,7 +720,9 @@ class block extends control
*/
public function printPlanBlock()
{
$this->session->set('productPlanList', $this->app->getURI(true));
$this->session->set('productList', $this->app->getURI(true), 'product');
$this->session->set('productPlanList', $this->app->getURI(true), 'product');
$this->app->loadLang('productplan');
$this->view->plans = $this->dao->select('t1.*,t2.name as productName')->from(TABLE_PRODUCTPLAN)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
@@ -727,13 +741,15 @@ class block extends control
*/
public function printReleaseBlock()
{
$this->session->set('releaseList', $this->app->getURI(true));
$this->session->set('releaseList', $this->app->getURI(true), 'product');
$this->session->set('buildList', $this->app->getURI(true), 'execution');
$this->app->loadLang('release');
$this->view->releases = $this->dao->select('t1.*,t2.name as productName,t3.name as buildName')->from(TABLE_RELEASE)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->leftJoin(TABLE_BUILD)->alias('t3')->on('t1.build=t3.id')
->where('t1.deleted')->eq('0')
->beginIF($this->view->block->module != 'my' and $this->session->PRJ)->andWhere('t1.project')->eq((int)$this->session->PRJ)->fi()
->beginIF($this->view->block->module != 'my' and $this->session->project)->andWhere('t1.project')->eq((int)$this->session->project)->fi()
->beginIF(!$this->app->user->admin)->andWhere('t1.product')->in($this->app->user->view->products)->fi()
->orderBy('t1.id desc')
->beginIF($this->viewType != 'json')->limit((int)$this->params->count)->fi()
@@ -748,14 +764,14 @@ class block extends control
*/
public function printBuildBlock()
{
$this->session->set('buildList', $this->app->getURI(true));
$this->session->set('buildList', $this->app->getURI(true), 'execution');
$this->app->loadLang('build');
$builds = $this->dao->select('t1.*, t2.name as productName')->from(TABLE_BUILD)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->where('t1.deleted')->eq('0')
->beginIF(!$this->app->user->admin)->andWhere('t1.project')->in($this->app->user->view->projects)->fi()
->beginIF($this->view->block->module != 'my' and $this->session->PRJ)->andWhere('t1.project')->eq((int)$this->session->PRJ)->fi()
->beginIF(!$this->app->user->admin)->andWhere('t1.execution')->in($this->app->user->view->sprints)->fi()
->beginIF($this->view->block->module != 'my' and $this->session->project)->andWhere('t1.project')->eq((int)$this->session->project)->fi()
->orderBy('t1.id desc')
->beginIF($this->viewType != 'json')->limit((int)$this->params->count)->fi()
->fetchAll();
@@ -837,6 +853,7 @@ class block extends control
$this->loadModel('weekly');
$this->app->loadLang('task');
$this->app->loadLang('story');
$this->app->loadLang('bug');
/* Set project status and count. */
$status = isset($this->params->type) ? $this->params->type : 'all';
@@ -869,7 +886,7 @@ class block extends control
$this->app->loadClass('pager', $static = true);
$pager = pager::init(0, 3, 1);
$project->progress = $project->allStories == 0 ? 0 : round($project->doneStories / $project->allStories, 3) * 100;
$project->executions = $this->project->getStats($projectID, 'all', 0, 0, 30, 'id_asc', $pager);
$project->executions = $this->project->getStats($projectID, 'all', 0, 0, 30, 'id_desc', $pager);
}
elseif($project->model == 'waterfall' and isset($this->config->maxVersion))
{
@@ -959,34 +976,6 @@ class block extends control
$plans[$product] = $plan;
}
/* Get projects. */
$projects = $this->dao->select('t1.product, t2.status, t2.end')->from(TABLE_PROJECTPRODUCT)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id')
->where('t1.product')->in($productIdList)
->andWhere('t2.deleted')->eq(0)
->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->projects)->fi()
->fetchGroup('product');
foreach($projects as $product => $productProjects)
{
$undone= 0;
$done = 0;
$delay = 0;
foreach($productProjects as $project)
{
($project->status == 'done' or $project->status == 'closed') ? $done++ : $undone++;
if($project->status != 'done' && $project->status != 'closed' && $project->status != 'suspended' && $project->end < helper::today()) $delay++;
}
$project = array();
$project['undone'] = $undone;
$project['done'] = $done;
$project['delay'] = $delay;
$project['all'] = count($productProjects);
$projects[$product] = $project;
}
/* Get releases. */
$releases = $this->dao->select('product, status, COUNT(*) AS count')->from(TABLE_RELEASE)
->where('deleted')->eq(0)
@@ -1012,14 +1001,12 @@ class block extends control
{
$product->stories = isset($stories[$productID]) ? $stories[$productID] : 0;
$product->plans = isset($plans[$productID]) ? $plans[$productID] : 0;
$product->projects = isset($projects[$productID]) ? $projects[$productID] : 0;
$product->releases = isset($releases[$productID]) ? $releases[$productID] : 0;
$product->lastRelease = isset($lastReleases[$productID]) ? $lastReleases[$productID] : 0;
}
$this->app->loadLang('story');
$this->app->loadLang('productplan');
$this->app->loadLang('project');
$this->app->loadLang('release');
$this->view->products = $products;
@@ -1043,7 +1030,7 @@ class block extends control
$count = isset($this->params->count) ? (int)$this->params->count : 0;
/* Get projects. */
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->PRJ;
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
$executions = $this->loadModel('execution')->getOrderedExecutions($projectID, $status, $count);
if(empty($executions))
{
@@ -1107,7 +1094,7 @@ class block extends control
}
/* Get bugs. */
$bugs = $this->dao->select("project, status, count(status) as totalBugs, count(status = 'active' or null) as activeBugs, count(resolvedDate like '{$yesterday}%' or null) as yesterdayResolved")->from(TABLE_BUG)
$bugs = $this->dao->select("project, count(status) as totalBugs, count(status = 'active' or null) as activeBugs, count(resolvedDate like '{$yesterday}%' or null) as yesterdayResolved")->from(TABLE_BUG)
->where('project')->in($executionIdList)
->andWhere('deleted')->eq(0)
->groupBy('project')
@@ -1163,7 +1150,8 @@ class block extends control
*/
public function printWaterfallReportBlock()
{
$project = $this->loadModel('project')->getByID($this->session->PRJ);
$this->app->loadLang('programplan');
$project = $this->loadModel('project')->getByID($this->session->project);
$today = helper::today();
$date = date('Ymd', strtotime('this week Monday'));
$begin = $project->begin;
@@ -1173,19 +1161,19 @@ class block extends control
$task = $this->dao->select("
sum(consumed) as totalConsumed,
sum(if(status != 'cancel' and status != 'closed', `left`, 0)) as totalLeft")
->from(TABLE_TASK)->where('project')->eq($this->session->PRJ)
->from(TABLE_TASK)->where('project')->eq($this->session->project)
->andWhere('deleted')->eq(0)
->andWhere('parent')->lt(1)
->fetch();
$this->view->pv = $this->weekly->getPV($this->session->PRJ, $today);
$this->view->ev = $this->weekly->getEV($this->session->PRJ, $today);
$this->view->ac = $this->weekly->getAC($this->session->PRJ, $today);
$this->view->pv = $this->weekly->getPV($this->session->project, $today);
$this->view->ev = $this->weekly->getEV($this->session->project, $today);
$this->view->ac = $this->weekly->getAC($this->session->project, $today);
$this->view->sv = $this->weekly->getSV($this->view->ev, $this->view->pv);
$this->view->cv = $this->weekly->getCV($this->view->ev, $this->view->ac);
$this->view->current = $current;
$this->view->progress = ($task->totalConsumed + $task->totalLeft) ? round($task->totalConsumed / ($task->totalConsumed + $task->totalLeft), 3) * 100 : 0;
$this->view->progress = ($task->totalConsumed + $task->totalLeft) ? floor($task->totalConsumed / ($task->totalConsumed + $task->totalLeft) * 1000) / 1000 * 100 : 0;
}
/**
@@ -1196,11 +1184,11 @@ class block extends control
*/
public function printWaterfallGanttBlock()
{
$products = $this->loadModel('product')->getProductPairsByProject($this->session->PRJ);
$products = $this->loadModel('product')->getProductPairsByProject($this->session->project);
$productID = $this->session->product ? $this->session->product : 0;
$productID = isset($products[$productID]) ? $productID : key($products);
$this->view->plans = $this->loadModel('programplan')->getDataForGantt($this->session->PRJ, $productID, 0, 'task', false);
$this->view->plans = $this->loadModel('programplan')->getDataForGantt($this->session->project, $productID, 0, 'task', false);
$this->view->products = $products;
$this->view->productID = $productID;
}
@@ -1214,10 +1202,10 @@ class block extends control
public function printWaterfallIssueBlock()
{
$uri = $this->app->getURI(true);
$this->session->set('issueList', $uri);
$this->session->set('issueList', $uri, 'project');
if(preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->issues = $this->loadModel('issue')->getBlockIssues($this->session->PRJ, $this->params->type, $this->viewType == 'json' ? 0 : (int)$this->params->count, $this->params->orderBy);
$this->view->issues = $this->loadModel('issue')->getBlockIssues($this->session->project, $this->params->type, $this->viewType == 'json' ? 0 : (int)$this->params->count, $this->params->orderBy);
}
/**
@@ -1229,9 +1217,9 @@ class block extends control
public function printWaterfallRiskBlock()
{
$uri = $this->app->getURI(true);
$this->session->set('riskList', $uri);
$this->session->set('riskList', $uri, 'project');
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->view->risks = $this->loadModel('risk')->getBlockRisks($this->session->PRJ, $this->params->type, $this->viewType == 'json' ? 0 : (int)$this->params->count, $this->params->orderBy);
$this->view->risks = $this->loadModel('risk')->getBlockRisks($this->session->project, $this->params->type, $this->viewType == 'json' ? 0 : (int)$this->params->count, $this->params->orderBy);
}
/**
@@ -1243,15 +1231,19 @@ class block extends control
public function printWaterfallEstimateBlock()
{
$this->app->loadLang('durationestimation');
$projectID = $this->session->PRJ;
$members = $this->loadModel('project')->getTeamMemberPairs($projectID);
$this->loadModel('project');
$projectID = $this->session->project;
$members = $this->loadModel('user')->getTeamMemberPairs($projectID, 'project');
$budget = $this->loadModel('workestimation')->getBudget($projectID);
$workhour = $this->loadModel('project')->getWorkhour($projectID);
if(empty($budget)) $budget = new stdclass();
$this->view->people = $this->dao->select('sum(people) as people')->from(TABLE_DURATIONESTIMATION)->where('project')->eq($this->session->PRJ)->fetch('people');
$this->view->members = count($members) ? count($members) - 1 : 0;
$this->view->consumed = $this->dao->select('sum(cast(consumed as decimal(10,2))) as consumed')->from(TABLE_TASK)->where('project')->eq($projectID)->andWhere('deleted')->eq(0)->andWhere('parent')->lt(1)->fetch('consumed');
$this->view->budget = $budget;
$this->view->people = $this->dao->select('sum(people) as people')->from(TABLE_DURATIONESTIMATION)->where('project')->eq($this->session->project)->fetch('people');
$this->view->members = count($members) ? count($members) - 1 : 0;
$this->view->consumed = $this->dao->select('sum(cast(consumed as decimal(10,2))) as consumed')->from(TABLE_TASK)->where('project')->eq($projectID)->andWhere('deleted')->eq(0)->andWhere('parent')->lt(1)->fetch('consumed');
$this->view->budget = $budget;
$this->view->totalLeft = (float)$workhour->totalLeft;
}
/**
@@ -1264,7 +1256,9 @@ class block extends control
{
$this->loadModel('milestone');
$this->loadModel('weekly');
$projectID = $this->session->PRJ;
$this->app->loadLang('execution');
$projectID = $this->session->project;
$project = $this->loadModel('project')->getByID($projectID);
$begin = $project->begin;
@@ -1301,8 +1295,9 @@ class block extends control
*/
public function printScrumOverviewBlock()
{
$projectID = $this->session->PRJ;
$projectID = $this->session->project;
$this->app->loadLang('execution');
$this->app->loadLang('bug');
$totalData = $this->loadModel('project')->getOverviewList('byId', $projectID, 'id_desc', 1);
$this->view->totalData = $totalData;
@@ -1319,12 +1314,12 @@ class block extends control
{
if(!empty($this->params->type) and preg_match('/[^a-zA-Z0-9_]/', $this->params->type)) die();
$count = isset($this->params->count) ? (int)$this->params->count : 15;
$type = isset($this->params->type) ? $this->params->type : 'all';
$type = isset($this->params->type) ? $this->params->type : 'undone';
$this->app->loadClass('pager', $static = true);
$pager = pager::init(0, $count, 1);
$this->app->loadLang('execution');
$this->view->executionStats = $this->loadModel('project')->getStats($this->session->PRJ, $type, 0, 0, 30, 'id_desc', $pager);
$this->view->executionStats = $this->loadModel('project')->getStats($this->session->project, $type, 0, 0, 30, 'id_desc', $pager);
}
/**
@@ -1367,7 +1362,7 @@ class block extends control
$sprints = $this->dao->select('status, count(*) as sprints')->from(TABLE_EXECUTION)
->where('deleted')->eq(0)
->andWhere('type')->eq('sprint')
->andWhere('parent')->eq($this->session->PRJ)
->andWhere('parent')->eq($this->session->project)
->groupBy('status')
->fetchPairs();
@@ -1392,7 +1387,7 @@ class block extends control
*/
public function printProjectDynamicBlock()
{
$projectID = $this->session->PRJ;
$projectID = $this->session->project;
$executions = $this->loadModel('execution')->getPairs($projectID);
$products = $this->loadModel('product')->getProductPairsByProject($projectID);
@@ -1421,10 +1416,10 @@ class block extends control
*/
public function printScrumRoadMapBlock($productID = 0, $roadMapID = 0)
{
$this->session->set('releaseList', $this->app->getURI(true));
$this->session->set('productPlanList', $this->app->getURI(true));
$this->session->set('releaseList', $this->app->getURI(true), 'product');
$this->session->set('productPlanList', $this->app->getURI(true), 'product');
$products = $this->loadModel('product')->getPairs('', $this->session->PRJ);
$products = $this->loadModel('product')->getPairs('', $this->session->project);
if(!is_numeric($productID)) $productID = key($products);
$this->view->roadmaps = $this->product->getRoadmap($productID, 0, 6);
@@ -1448,7 +1443,10 @@ class block extends control
*/
public function printScrumTestBlock()
{
$this->session->set('testtaskList', $this->app->getURI(true));
$this->session->set('testtaskList', $this->app->getURI(true), 'qa');
$this->session->set('productList', $this->app->getURI(true), 'product');
$this->session->set('projectList', $this->app->getURI(true), 'project');
$this->session->set('buildList', $this->app->getURI(true), 'execution');
$this->app->loadLang('testtask');
$count = zget($this->params, 'count', 10);
@@ -1461,7 +1459,7 @@ class block extends control
->leftJoin(TABLE_PROJECT)->alias('t4')->on('t1.project=t4.id')
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t5')->on('t1.project=t5.project')
->where('t1.deleted')->eq('0')
->andWhere('t1.project')->eq($this->session->PRJ)->fi()
->andWhere('t1.project')->eq($this->session->project)->fi()
->andWhere('t1.product = t5.product')
->beginIF($status != 'all')->andWhere('t1.status')->eq($status)->fi()
->orderBy('t1.id desc')
@@ -1483,7 +1481,7 @@ class block extends control
$status = isset($this->params->type) ? $this->params->type : '';
$count = isset($this->params->count) ? (int)$this->params->count : 0;
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->PRJ : 0;
$projectID = $this->lang->navGroup->qa == 'project' ? $this->session->project : 0;
$products = $this->loadModel('product')->getOrderedProducts($status, $count, $projectID);
if(empty($products))
{
@@ -1587,7 +1585,7 @@ class block extends control
*/
public function printExecutionOverviewBlock()
{
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->PRJ;
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
$executions = $this->loadModel('execution')->getList($projectID);
$total = 0;
@@ -1620,7 +1618,7 @@ class block extends control
{
$casePairs = $this->dao->select('lastRunResult, COUNT(*) AS count')->from(TABLE_CASE)
->where('1=1')
->beginIF($this->view->block->module != 'my' and $this->session->PRJ)->andWhere('project')->eq((int)$this->session->PRJ)->fi()
->beginIF($this->view->block->module != 'my' and $this->session->project)->andWhere('project')->eq((int)$this->session->project)->fi()
->groupBy('lastRunResult')
->fetchPairs();
@@ -1657,7 +1655,7 @@ class block extends control
$status = isset($this->params->type) ? $this->params->type : 'all';
$pager = pager::init(0, $count, 1);
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->PRJ;
$projectID = $this->view->block->module == 'my' ? 0 : (int)$this->session->project;
$this->view->executionStats = $this->loadModel('project')->getStats($projectID, $status, 0, 0, 30, 'id_asc', $pager);
}
@@ -1687,7 +1685,9 @@ class block extends control
$stmt = $this->dao->select('*')->from(TABLE_TODO)
->where("(assignedTo = '{$this->app->user->account}' or (account='{$this->app->user->account}'))")
->andWhere('cycle')->eq(0)
->orderBy('`date`');
->andWhere('deleted')->eq(0)
->andWhere('status')->eq('wait')
->orderBy('`date` desc');
if(isset($params->todoNum)) $stmt->limit($params->todoNum);
$todos = $stmt->fetchAll();
+5
View File
@@ -26,3 +26,8 @@ body {padding-bottom: 20px;}
#dashboard .block-sm .hide-in-sm {display: none;}
#dashboard .block-dynamic .panel-body {overflow-x: hidden;}
.modal-body {padding: 10px 20px 20px 20px;}
#dashboard .block-scrumoverview .table {margin-bottom: 12px;}
#dashboard .block-scrumoverview .table thead tr th {padding-left: 0; text-align: right; border-bottom: unset;}
#dashboard .block-scrumoverview .table tbody tr td {padding-left: 0;}
#dashboard .block-scrumoverview .table tbody tr th {text-align: right;}
+31 -9
View File
@@ -9,17 +9,32 @@ $(function()
var title = $titleInput.val();
var value = $(this).find('option:selected').text();
var lang = config.clientLang;
if(lang.indexOf('zh') >= 0)
if($blocksList.find('#moduleBlock').val() == 'scrumtest' && $('#paramstype').val() != 'all')
{
blockTitle = blockTitle.replace(preValue, value);
$titleInput.val(blockTitle);
$titleInput.val(value);
}
else
{
var preIndex = blockTitle.indexOf(of + preValue);
if(preIndex >= 0) blockTitle = blockTitle.substring(0, preIndex);
$titleInput.val(blockTitle + of + value);
var lang = config.clientLang;
blockTitle = $blockParams.find('#title').val();
if(lang.indexOf('zh') >= 0)
{
if(blockTitle.indexOf(preValue) >= 0)
{
blockTitle = blockTitle.replace(preValue, value);
}
else
{
if(blockTitle.indexOf(preValue) < 0) blockTitle = value + of + title;;
}
$titleInput.val(blockTitle);
}
else
{
var preIndex = blockTitle.indexOf(of + preValue);
if(preIndex >= 0) blockTitle = blockTitle.substring(0, preIndex);
$titleInput.val(blockTitle + of + value);
}
}
preValue = value;
@@ -51,8 +66,15 @@ $(function()
var preIndex = blockTitle.indexOf(' - ' + preValue);
if(preIndex >= 0) blockTitle = blockTitle.substring(0, preIndex);
var lang = config.clientLang;
if(blockTitle.indexOf(of) < 0) lang.indexOf('zh') >= 0 ? $titleInput.val(preValue + of + blockTitle) : $titleInput.val(blockTitle + of + preValue);
if($blocksList.find('#moduleBlock').val() == 'scrumtest')
{
$titleInput.val(preValue);
}
else
{
var lang = config.clientLang;
if(!title && blockTitle.indexOf(of) < 0) lang.indexOf('zh') >= 0 ? $titleInput.val(preValue + of + blockTitle) : $titleInput.val(blockTitle + of + preValue);
}
}
};
+1
View File
@@ -88,6 +88,7 @@ function refreshBlock($panel, afterRefresh)
}
$panel.find('.tablesorter').sortTable();
$panel.find('.chosen').chosen();
$panel.children('.table-header-fixed').remove();
initTableHeader($panel);
$(".sparkline").sparkline();
}).fail(function()
+44 -27
View File
@@ -9,13 +9,18 @@
* @version $Id$
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'InfoBlock';
$lang->block->name = 'Name';
$lang->block->style = 'Style';
$lang->block->grid = 'Gitter';
$lang->block->color = 'Farbe';
$lang->block->reset = 'Zurücksetzen';
$lang->block->common = 'InfoBlock';
$lang->block->name = 'Name';
$lang->block->style = 'Style';
$lang->block->grid = 'Gitter';
$lang->block->color = 'Farbe';
$lang->block->reset = 'Zurücksetzen';
$lang->block->story = 'Story';
$lang->block->investment = 'Investment';
$lang->block->estimate = 'Estimate';
$lang->block->last = 'Last';
$lang->block->account = 'Konto';
$lang->block->module = 'Modul';
@@ -31,7 +36,7 @@ $lang->block->lblBlock = 'InfoBlock';
$lang->block->lblNum = 'Nummer';
$lang->block->lblHtml = 'HTML';
$lang->block->dynamic = 'Verlauf';
$lang->block->assignToMe = 'Mir zugewiesen';
$lang->block->assignToMe = 'Todo';
$lang->block->done = 'Done';
$lang->block->lblFlowchart = 'Workflow';
$lang->block->welcome = 'Willkommen';
@@ -46,7 +51,7 @@ $lang->block->myExecution = 'Unclosed ' . $lang->executionCommon . 's';
$lang->block->myProduct = 'Unclosed ' . $lang->productCommon . 's';
$lang->block->delayed = 'Verspätet';
$lang->block->noData = 'Keine Daten für diesen Bericht.';
$lang->block->emptyTip = 'Keine Information';
$lang->block->emptyTip = 'No Data.';
$lang->block->createdTodos = 'Todos Created';
$lang->block->createdRequirements = 'UR/Epics Created';
$lang->block->createdStories = 'SR/Stories Created';
@@ -68,6 +73,7 @@ $lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->selectProduct = 'Product selection';
$lang->block->of = ' von ';
$lang->block->remain = 'Left';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Name';
@@ -148,6 +154,10 @@ $lang->block->default['scrum']['project']['2']['title'] = $lang->executionCommon
$lang->block->default['scrum']['project']['2']['block'] = 'scrumlist';
$lang->block->default['scrum']['project']['2']['grid'] = 8;
$lang->block->default['scrum']['project']['2']['params']['type'] = 'undone';
$lang->block->default['scrum']['project']['2']['params']['count'] = '20';
$lang->block->default['scrum']['project']['2']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['3']['title'] = 'Test Version';
$lang->block->default['scrum']['project']['3']['block'] = 'scrumtest';
$lang->block->default['scrum']['project']['3']['grid'] = 8;
@@ -275,10 +285,14 @@ $lang->block->default['full']['my']['3']['grid'] = 4;
$lang->block->default['full']['my']['3']['source'] = 'todo';
$lang->block->default['full']['my']['3']['params']['count'] = '20';
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
$lang->block->default['full']['my']['4']['params']['count'] = '20';
}
$lang->block->default['full']['my']['5']['title'] = 'Personal Contribution';
$lang->block->default['full']['my']['5']['block'] = 'contribute';
@@ -290,7 +304,7 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
$lang->block->default['full']['my']['7']['title'] = 'AssignedToMe';
$lang->block->default['full']['my']['7']['title'] = 'Todo';
$lang->block->default['full']['my']['7']['block'] = 'assigntome';
$lang->block->default['full']['my']['7']['source'] = '';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -302,10 +316,13 @@ $lang->block->default['full']['my']['7']['params']['riskNum'] = '20';
$lang->block->default['full']['my']['7']['params']['issueNum'] = '20';
$lang->block->default['full']['my']['7']['params']['storyNum'] = '20';
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
}
$lang->block->default['full']['my']['9']['title'] = 'Project List';
$lang->block->default['full']['my']['9']['block'] = 'project';
@@ -320,7 +337,7 @@ $lang->block->type = 'Type';
$lang->block->orderBy = 'Order by';
$lang->block->availableBlocks = new stdclass();
$lang->block->availableBlocks->todo = 'Meine Todos';
$lang->block->availableBlocks->todo = 'Meine Zeitplan';
$lang->block->availableBlocks->task = 'Meine Aufgaben';
$lang->block->availableBlocks->bug = 'Meine Bugs';
$lang->block->availableBlocks->case = 'Meine Fälle';
@@ -334,9 +351,9 @@ $lang->block->availableBlocks->testtask = 'Testaufgaben';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->moduleList['project'] = 'Project';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
$lang->block->moduleList['execution'] = $lang->executionCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'QA';
$lang->block->moduleList['todo'] = 'Todos';
@@ -376,9 +393,9 @@ $lang->block->modules['product']->availableBlocks->release = 'Release';
$lang->block->modules['execution'] = new stdclass();
$lang->block->modules['execution']->availableBlocks = new stdclass();
$lang->block->modules['execution']->availableBlocks->statistic = $lang->executionCommon . ' Statistik';
$lang->block->modules['execution']->availableBlocks->overview = $lang->executionCommon . ' Übersicht';
$lang->block->modules['execution']->availableBlocks->list = $lang->executionCommon . ' Liste';
$lang->block->modules['execution']->availableBlocks->statistic = $lang->execution->common . ' Statistik';
$lang->block->modules['execution']->availableBlocks->overview = $lang->execution->common . ' Übersicht';
$lang->block->modules['execution']->availableBlocks->list = $lang->execution->common . ' Liste';
$lang->block->modules['execution']->availableBlocks->task = 'Aufgaben';
$lang->block->modules['execution']->availableBlocks->build = 'Build';
@@ -494,7 +511,7 @@ $lang->block->typeList->execution['all'] = 'All';
$lang->block->typeList->execution['involved'] = 'Involved';
$lang->block->typeList->scrum['undone'] = 'Unfinished';
$lang->block->typeList->scrum['doing'] = 'Ongoing中';
$lang->block->typeList->scrum['doing'] = 'Ongoing';
$lang->block->typeList->scrum['all'] = 'All';
$lang->block->typeList->scrum['involved'] = 'Involved';
@@ -512,11 +529,11 @@ $lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|'
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|all|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|all|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'company|dynamic|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
+48 -26
View File
@@ -9,13 +9,18 @@
* @version $Id$
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'Block';
$lang->block->name = 'Name';
$lang->block->style = 'Style';
$lang->block->grid = 'Position';
$lang->block->color = 'Color';
$lang->block->reset = 'Reset Layout';
$lang->block->common = 'Block';
$lang->block->name = 'Name';
$lang->block->style = 'Style';
$lang->block->grid = 'Position';
$lang->block->color = 'Color';
$lang->block->reset = 'Reset Layout';
$lang->block->story = 'Story';
$lang->block->investment = 'Investment';
$lang->block->estimate = 'Estimate';
$lang->block->last = 'Last';
$lang->block->account = 'Account';
$lang->block->module = 'Module';
@@ -31,7 +36,7 @@ $lang->block->lblBlock = 'Block';
$lang->block->lblNum = 'Number';
$lang->block->lblHtml = 'HTML';
$lang->block->dynamic = 'Dynamics';
$lang->block->assignToMe = 'Assigned To Me';
$lang->block->assignToMe = 'Todo';
$lang->block->done = 'Done';
$lang->block->lblFlowchart = 'Flowchart';
$lang->block->welcome = 'Welcome';
@@ -68,6 +73,7 @@ $lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->selectProduct = 'Product selection';
$lang->block->of = ' of ';
$lang->block->remain = 'Left';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Name';
@@ -148,6 +154,10 @@ $lang->block->default['scrum']['project']['2']['title'] = $lang->executionCommon
$lang->block->default['scrum']['project']['2']['block'] = 'scrumlist';
$lang->block->default['scrum']['project']['2']['grid'] = 8;
$lang->block->default['scrum']['project']['2']['params']['type'] = 'undone';
$lang->block->default['scrum']['project']['2']['params']['count'] = '20';
$lang->block->default['scrum']['project']['2']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['3']['title'] = 'Test Version';
$lang->block->default['scrum']['project']['3']['block'] = 'scrumtest';
$lang->block->default['scrum']['project']['3']['grid'] = 8;
@@ -275,10 +285,14 @@ $lang->block->default['full']['my']['3']['grid'] = 4;
$lang->block->default['full']['my']['3']['source'] = 'todo';
$lang->block->default['full']['my']['3']['params']['count'] = '20';
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
$lang->block->default['full']['my']['4']['params']['count'] = '20';
}
$lang->block->default['full']['my']['5']['title'] = 'Personal Contribution';
$lang->block->default['full']['my']['5']['block'] = 'contribute';
@@ -290,7 +304,7 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
$lang->block->default['full']['my']['7']['title'] = 'Assigned To Me';
$lang->block->default['full']['my']['7']['title'] = 'Todo';
$lang->block->default['full']['my']['7']['block'] = 'assigntome';
$lang->block->default['full']['my']['7']['source'] = '';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -302,15 +316,23 @@ $lang->block->default['full']['my']['7']['params']['riskNum'] = '20';
$lang->block->default['full']['my']['7']['params']['issueNum'] = '20';
$lang->block->default['full']['my']['7']['params']['storyNum'] = '20';
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
}
$lang->block->default['full']['my']['9']['title'] = 'Project List';
$lang->block->default['full']['my']['9']['block'] = 'project';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
if($config->systemMode == 'classic')
{
$lang->block->default['full']['my']['9']['block'] = 'execution';
$lang->block->default['full']['my']['9']['source'] = 'execution';
}
$lang->block->default['full']['my']['9']['params']['orderBy'] = 'id_desc';
$lang->block->default['full']['my']['9']['params']['count'] = '15';
@@ -320,7 +342,7 @@ $lang->block->type = 'Type';
$lang->block->orderBy = 'Order by';
$lang->block->availableBlocks = new stdclass();
$lang->block->availableBlocks->todo = 'My Todos';
$lang->block->availableBlocks->todo = 'My schedule';
$lang->block->availableBlocks->task = 'My Tasks';
$lang->block->availableBlocks->bug = 'My Bugs';
$lang->block->availableBlocks->case = 'My Cases';
@@ -334,9 +356,9 @@ $lang->block->availableBlocks->testtask = 'Requests';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->moduleList['project'] = 'Project';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
$lang->block->moduleList['execution'] = $lang->executionCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'Test';
$lang->block->moduleList['todo'] = 'Todo';
@@ -376,9 +398,9 @@ $lang->block->modules['product']->availableBlocks->release = 'Release';
$lang->block->modules['execution'] = new stdclass();
$lang->block->modules['execution']->availableBlocks = new stdclass();
$lang->block->modules['execution']->availableBlocks->statistic = $lang->executionCommon . ' Statistics';
$lang->block->modules['execution']->availableBlocks->overview = $lang->executionCommon . ' Overview';
$lang->block->modules['execution']->availableBlocks->list = $lang->executionCommon . ' List';
$lang->block->modules['execution']->availableBlocks->statistic = $lang->execution->common . ' Statistics';
$lang->block->modules['execution']->availableBlocks->overview = $lang->execution->common . ' Overview';
$lang->block->modules['execution']->availableBlocks->list = $lang->execution->common . ' List';
$lang->block->modules['execution']->availableBlocks->task = 'Task';
$lang->block->modules['execution']->availableBlocks->build = 'Build';
@@ -494,7 +516,7 @@ $lang->block->typeList->execution['all'] = 'All';
$lang->block->typeList->execution['involved'] = 'Involved';
$lang->block->typeList->scrum['undone'] = 'Unfinished';
$lang->block->typeList->scrum['doing'] = 'Ongoing中';
$lang->block->typeList->scrum['doing'] = 'Ongoing';
$lang->block->typeList->scrum['all'] = 'All';
$lang->block->typeList->scrum['involved'] = 'Involved';
@@ -512,11 +534,11 @@ $lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|'
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|all|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|all|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'company|dynamic|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
+43 -26
View File
@@ -9,13 +9,18 @@
* @version $Id$
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'Bloc';
$lang->block->name = 'Nom';
$lang->block->style = 'Style';
$lang->block->grid = 'Position';
$lang->block->color = 'Couleur';
$lang->block->reset = 'Réinit';
$lang->block->common = 'Bloc';
$lang->block->name = 'Nom';
$lang->block->style = 'Style';
$lang->block->grid = 'Position';
$lang->block->color = 'Couleur';
$lang->block->reset = 'Réinit';
$lang->block->story = 'Story';
$lang->block->investment = 'Investment';
$lang->block->estimate = 'Estimate';
$lang->block->last = 'Last';
$lang->block->account = 'Compte';
$lang->block->module = 'Module';
@@ -31,7 +36,7 @@ $lang->block->lblBlock = 'Bloc';
$lang->block->lblNum = 'Numéro';
$lang->block->lblHtml = 'HTML';
$lang->block->dynamic = 'Historique';
$lang->block->assignToMe = 'Assigné à moi';
$lang->block->assignToMe = 'Todo';
$lang->block->done = 'Done';
$lang->block->lblFlowchart = 'Organigramme';
$lang->block->welcome = 'Bienvenue';
@@ -68,6 +73,7 @@ $lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->selectProduct = 'Product selection';
$lang->block->of = ' di ';
$lang->block->remain = 'Left';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Nom';
@@ -148,6 +154,10 @@ $lang->block->default['scrum']['project']['2']['title'] = $lang->executionCommon
$lang->block->default['scrum']['project']['2']['block'] = 'scrumlist';
$lang->block->default['scrum']['project']['2']['grid'] = 8;
$lang->block->default['scrum']['project']['2']['params']['type'] = 'undone';
$lang->block->default['scrum']['project']['2']['params']['count'] = '20';
$lang->block->default['scrum']['project']['2']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['3']['title'] = 'Test Version';
$lang->block->default['scrum']['project']['3']['block'] = 'scrumtest';
$lang->block->default['scrum']['project']['3']['grid'] = 8;
@@ -275,10 +285,14 @@ $lang->block->default['full']['my']['3']['grid'] = 4;
$lang->block->default['full']['my']['3']['source'] = 'todo';
$lang->block->default['full']['my']['3']['params']['count'] = '20';
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
$lang->block->default['full']['my']['4']['params']['count'] = '20';
}
$lang->block->default['full']['my']['5']['title'] = 'Personal Contribution';
$lang->block->default['full']['my']['5']['block'] = 'contribute';
@@ -290,7 +304,7 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
$lang->block->default['full']['my']['7']['title'] = 'AssignedToMe';
$lang->block->default['full']['my']['7']['title'] = 'Todo';
$lang->block->default['full']['my']['7']['block'] = 'assigntome';
$lang->block->default['full']['my']['7']['source'] = '';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -302,10 +316,13 @@ $lang->block->default['full']['my']['7']['params']['riskNum'] = '20';
$lang->block->default['full']['my']['7']['params']['issueNum'] = '20';
$lang->block->default['full']['my']['7']['params']['storyNum'] = '20';
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
}
$lang->block->default['full']['my']['9']['title'] = 'Project List';
$lang->block->default['full']['my']['9']['block'] = 'project';
@@ -320,7 +337,7 @@ $lang->block->type = 'Type';
$lang->block->orderBy = 'Trié par';
$lang->block->availableBlocks = new stdclass();
$lang->block->availableBlocks->todo = 'Ma Todo List';
$lang->block->availableBlocks->todo = 'Mon emploi du temps';
$lang->block->availableBlocks->task = 'Mes Tâches';
$lang->block->availableBlocks->bug = 'Mes Bugs';
$lang->block->availableBlocks->case = 'Mes CasTests';
@@ -334,9 +351,9 @@ $lang->block->availableBlocks->testtask = 'Recettes';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->moduleList['project'] = 'Project';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
$lang->block->moduleList['execution'] = $lang->executionCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'Test';
$lang->block->moduleList['todo'] = 'Todo';
@@ -376,9 +393,9 @@ $lang->block->modules['product']->availableBlocks->release = 'Release';
$lang->block->modules['execution'] = new stdclass();
$lang->block->modules['execution']->availableBlocks = new stdclass();
$lang->block->modules['execution']->availableBlocks->statistic = $lang->executionCommon . ' Statistiques';
$lang->block->modules['execution']->availableBlocks->overview = $lang->executionCommon . " Vue d'ensemble";
$lang->block->modules['execution']->availableBlocks->list = $lang->executionCommon . ' Liste';
$lang->block->modules['execution']->availableBlocks->statistic = $lang->execution->common . ' Statistiques';
$lang->block->modules['execution']->availableBlocks->overview = $lang->execution->common . " Vue d'ensemble";
$lang->block->modules['execution']->availableBlocks->list = $lang->execution->common . ' Liste';
$lang->block->modules['execution']->availableBlocks->task = 'Tâches';
$lang->block->modules['execution']->availableBlocks->build = 'Build';
@@ -494,7 +511,7 @@ $lang->block->typeList->execution['all'] = 'All';
$lang->block->typeList->execution['involved'] = 'Involved';
$lang->block->typeList->scrum['undone'] = 'Unfinished';
$lang->block->typeList->scrum['doing'] = 'Ongoing中';
$lang->block->typeList->scrum['doing'] = 'Ongoing';
$lang->block->typeList->scrum['all'] = 'All';
$lang->block->typeList->scrum['involved'] = 'Involved';
@@ -512,11 +529,11 @@ $lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|'
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|all|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|all|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'company|dynamic|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
+44 -27
View File
@@ -9,13 +9,18 @@
* @version $Id$
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = 'Block';
$lang->block->name = 'Tên';
$lang->block->style = 'Kiểu';
$lang->block->grid = 'Vị trí';
$lang->block->color = 'Màu';
$lang->block->reset = 'Thiết lập lại giao diện';
$lang->block->common = 'Block';
$lang->block->name = 'Tên';
$lang->block->style = 'Kiểu';
$lang->block->grid = 'Vị trí';
$lang->block->color = 'Màu';
$lang->block->reset = 'Thiết lập lại giao diện';
$lang->block->story = 'Story';
$lang->block->investment = 'Investment';
$lang->block->estimate = 'Estimate';
$lang->block->last = 'Last';
$lang->block->account = 'Tài khoản';
$lang->block->module = 'Module';
@@ -31,7 +36,7 @@ $lang->block->lblBlock = 'Block';
$lang->block->lblNum = 'Số';
$lang->block->lblHtml = 'HTML';
$lang->block->dynamic = 'Lịch sử';
$lang->block->assignToMe = 'Giao cho bạn';
$lang->block->assignToMe = 'Todo';
$lang->block->done = 'Done';
$lang->block->lblFlowchart = 'Biểu đồ';
$lang->block->welcome = 'Welcome';
@@ -46,7 +51,7 @@ $lang->block->myExecution = 'Unclosed ' . $lang->executionCommon . 's';
$lang->block->myProduct = 'Unclosed ' . $lang->productCommon . 's';
$lang->block->delayed = 'Tạm ngưng';
$lang->block->noData = 'Không có dữ liệu trên loại báo cáo này.';
$lang->block->emptyTip = 'Không có dữ liệu.';
$lang->block->emptyTip = 'No Data.';
$lang->block->createdTodos = 'Todos Created';
$lang->block->createdRequirements = 'UR/Epics Created';
$lang->block->createdStories = 'SR/Stories Created';
@@ -68,6 +73,7 @@ $lang->block->time = 'No';
$lang->block->week = 'Week';
$lang->block->selectProduct = 'Product selection';
$lang->block->of = ' thực ';
$lang->block->remain = 'Left';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Tên';
@@ -148,6 +154,10 @@ $lang->block->default['scrum']['project']['2']['title'] = 'Project List';
$lang->block->default['scrum']['project']['2']['block'] = 'scrumlist';
$lang->block->default['scrum']['project']['2']['grid'] = 8;
$lang->block->default['scrum']['project']['2']['params']['type'] = 'undone';
$lang->block->default['scrum']['project']['2']['params']['count'] = '20';
$lang->block->default['scrum']['project']['2']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['3']['title'] = 'Test Version';
$lang->block->default['scrum']['project']['3']['block'] = 'scrumtest';
$lang->block->default['scrum']['project']['3']['grid'] = 8;
@@ -275,10 +285,14 @@ $lang->block->default['full']['my']['3']['grid'] = 4;
$lang->block->default['full']['my']['3']['source'] = 'todo';
$lang->block->default['full']['my']['3']['params']['count'] = '20';
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['4']['title'] = 'Project Statistic';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
$lang->block->default['full']['my']['4']['params']['count'] = '20';
}
$lang->block->default['full']['my']['5']['title'] = 'Personal Contribution';
$lang->block->default['full']['my']['5']['block'] = 'contribute';
@@ -290,7 +304,7 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
$lang->block->default['full']['my']['7']['title'] = 'AssignedToMe';
$lang->block->default['full']['my']['7']['title'] = 'Todo';
$lang->block->default['full']['my']['7']['block'] = 'assigntome';
$lang->block->default['full']['my']['7']['source'] = '';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -302,10 +316,13 @@ $lang->block->default['full']['my']['7']['params']['riskNum'] = '20';
$lang->block->default['full']['my']['7']['params']['issueNum'] = '20';
$lang->block->default['full']['my']['7']['params']['storyNum'] = '20';
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['8']['title'] = 'Human Input';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
}
$lang->block->default['full']['my']['9']['title'] = 'Project List';
$lang->block->default['full']['my']['9']['block'] = 'project';
@@ -320,7 +337,7 @@ $lang->block->type = 'Loại';
$lang->block->orderBy = 'Order by';
$lang->block->availableBlocks = new stdclass();
$lang->block->availableBlocks->todo = 'Việc của bạn';
$lang->block->availableBlocks->todo = 'Lịch của tôi';
$lang->block->availableBlocks->task = 'Nhiệm vụ';
$lang->block->availableBlocks->bug = 'Bugs của bạn';
$lang->block->availableBlocks->case = 'Tình huống của bạn';
@@ -334,9 +351,9 @@ $lang->block->availableBlocks->testtask = 'Yêu cầu';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->moduleList['project'] = 'Project';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
$lang->block->moduleList['execution'] = $lang->executionCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = 'QA';
$lang->block->moduleList['todo'] = 'Việc làm';
@@ -376,9 +393,9 @@ $lang->block->modules['product']->availableBlocks->release = 'Phát hành';
$lang->block->modules['execution'] = new stdclass();
$lang->block->modules['execution']->availableBlocks = new stdclass();
$lang->block->modules['execution']->availableBlocks->statistic = $lang->executionCommon . ' thống';
$lang->block->modules['execution']->availableBlocks->overview = $lang->executionCommon . ' xem';
$lang->block->modules['execution']->availableBlocks->list = $lang->executionCommon . ' danh sách';
$lang->block->modules['execution']->availableBlocks->statistic = $lang->execution->common . ' thống';
$lang->block->modules['execution']->availableBlocks->overview = $lang->execution->common . ' xem';
$lang->block->modules['execution']->availableBlocks->list = $lang->execution->common . ' danh sách';
$lang->block->modules['execution']->availableBlocks->task = 'Nhiệm vụ';
$lang->block->modules['execution']->availableBlocks->build = 'Bản dựng';
@@ -494,7 +511,7 @@ $lang->block->typeList->execution['all'] = 'Tất cả';
$lang->block->typeList->execution['involved'] = 'Liên đới';
$lang->block->typeList->scrum['undone'] = 'Unfinished';
$lang->block->typeList->scrum['doing'] = 'Ongoing中';
$lang->block->typeList->scrum['doing'] = 'Ongoing';
$lang->block->typeList->scrum['all'] = 'All';
$lang->block->typeList->scrum['involved'] = 'Involved';
@@ -512,11 +529,11 @@ $lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|'
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|all|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|all|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'company|dynamic|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
+52 -30
View File
@@ -9,13 +9,18 @@
* @version $Id$
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = '区块';
$lang->block->name = '区块名称';
$lang->block->style = '外观';
$lang->block->grid = '位置';
$lang->block->color = '颜色';
$lang->block->reset = '恢复默认';
$lang->block->common = '区块';
$lang->block->name = '区块名称';
$lang->block->style = '外观';
$lang->block->grid = '位置';
$lang->block->color = '颜色';
$lang->block->reset = '恢复默认';
$lang->block->story = '需求';
$lang->block->investment = '投入';
$lang->block->estimate = '预计工时';
$lang->block->last = '近期';
$lang->block->account = '所属用户';
$lang->block->module = '所属模块';
@@ -31,7 +36,7 @@ $lang->block->lblBlock = '区块';
$lang->block->lblNum = '条数';
$lang->block->lblHtml = 'HTML内容';
$lang->block->dynamic = '最新动态';
$lang->block->assignToMe = '指派给我';
$lang->block->assignToMe = '待处理';
$lang->block->done = '已完成';
$lang->block->lblFlowchart = '流程图';
$lang->block->welcome = '欢迎总览';
@@ -46,7 +51,7 @@ $lang->block->myExecution = '未关闭的' . $lang->executionCommon;
$lang->block->myProduct = '未关闭的' . $lang->productCommon;
$lang->block->delayed = '已延期';
$lang->block->noData = '当前统计类型下暂无数据';
$lang->block->emptyTip = '暂无信息';
$lang->block->emptyTip = '暂无数据';
$lang->block->createdTodos = '创建的待办数';
$lang->block->createdRequirements = '创建的' . $lang->URCommon . '数';
$lang->block->createdStories = '创建的' . $lang->SRCommon . '数';
@@ -68,6 +73,7 @@ $lang->block->time = '第';
$lang->block->week = '周';
$lang->block->selectProduct = '选择产品';
$lang->block->of = '的';
$lang->block->remain = '剩余工时';
$lang->block->params = new stdclass();
$lang->block->params->name = '参数名称';
@@ -140,7 +146,7 @@ $lang->block->default['waterfall']['project']['7']['params']['type'] = 'all';
$lang->block->default['waterfall']['project']['7']['params']['count'] = '15';
$lang->block->default['waterfall']['project']['7']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['1']['title'] = '项目整体情况';
$lang->block->default['scrum']['project']['1']['title'] = '项目概况';
$lang->block->default['scrum']['project']['1']['block'] = 'scrumoverview';
$lang->block->default['scrum']['project']['1']['grid'] = 8;
@@ -148,6 +154,10 @@ $lang->block->default['scrum']['project']['2']['title'] = $lang->executionCommon
$lang->block->default['scrum']['project']['2']['block'] = 'scrumlist';
$lang->block->default['scrum']['project']['2']['grid'] = 8;
$lang->block->default['scrum']['project']['2']['params']['type'] = 'undone';
$lang->block->default['scrum']['project']['2']['params']['count'] = '20';
$lang->block->default['scrum']['project']['2']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['3']['title'] = '待测版本';
$lang->block->default['scrum']['project']['3']['block'] = 'scrumtest';
$lang->block->default['scrum']['project']['3']['grid'] = 8;
@@ -275,10 +285,14 @@ $lang->block->default['full']['my']['3']['grid'] = 4;
$lang->block->default['full']['my']['3']['source'] = 'todo';
$lang->block->default['full']['my']['3']['params']['count'] = '20';
$lang->block->default['full']['my']['4']['title'] = '项目统计';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['4']['title'] = '项目统计';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
$lang->block->default['full']['my']['4']['params']['count'] = '20';
}
$lang->block->default['full']['my']['5']['title'] = '我的贡献';
$lang->block->default['full']['my']['5']['block'] = 'contribute';
@@ -290,7 +304,7 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
$lang->block->default['full']['my']['7']['title'] = '指派给我';
$lang->block->default['full']['my']['7']['title'] = '待处理';
$lang->block->default['full']['my']['7']['block'] = 'assigntome';
$lang->block->default['full']['my']['7']['source'] = '';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -302,15 +316,23 @@ $lang->block->default['full']['my']['7']['params']['riskNum'] = '20';
$lang->block->default['full']['my']['7']['params']['issueNum'] = '20';
$lang->block->default['full']['my']['7']['params']['storyNum'] = '20';
$lang->block->default['full']['my']['8']['title'] = '项目人力投入';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['8']['title'] = '项目人力投入';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
}
$lang->block->default['full']['my']['9']['title'] = '项目列表';
$lang->block->default['full']['my']['9']['block'] = 'project';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
if($config->systemMode == 'classic')
{
$lang->block->default['full']['my']['9']['block'] = 'execution';
$lang->block->default['full']['my']['9']['source'] = 'execution';
}
$lang->block->default['full']['my']['9']['params']['orderBy'] = 'id_desc';
$lang->block->default['full']['my']['9']['params']['count'] = '15';
@@ -320,7 +342,7 @@ $lang->block->type = '类型';
$lang->block->orderBy = '排序';
$lang->block->availableBlocks = new stdclass();
$lang->block->availableBlocks->todo = '我的待办';
$lang->block->availableBlocks->todo = '我的日程';
$lang->block->availableBlocks->task = '我的任务';
$lang->block->availableBlocks->bug = '我的Bug';
$lang->block->availableBlocks->case = '我的用例';
@@ -334,9 +356,9 @@ $lang->block->availableBlocks->testtask = '测试版本列表';
$lang->block->availableBlocks->risk = '我的风险';
$lang->block->availableBlocks->issue = '我的问题';
$lang->block->moduleList['project'] = '项目';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = '项目';
$lang->block->moduleList['product'] = $lang->productCommon;
$lang->block->moduleList['execution'] = $lang->executionCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = '测试';
$lang->block->moduleList['todo'] = '待办';
@@ -345,11 +367,11 @@ $lang->block->modules['project']->availableBlocks = new stdclass();
$lang->block->modules['project']->availableBlocks->project = '项目列表';
$lang->block->modules['project']->availableBlocks->recentproject = '近期项目';
$lang->block->modules['project']->availableBlocks->statistic = '项目统计';
$lang->block->modules['project']->availableBlocks->projectteam = '项目人力投入';
if($config->systemMode == 'new') $lang->block->modules['project']->availableBlocks->projectteam = '项目人力投入';
$lang->block->modules['scrum']['index'] = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = '项目整体情况';
$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = '项目概况';
$lang->block->modules['scrum']['index']->availableBlocks->scrumlist = $lang->executionCommon . '列表';
$lang->block->modules['scrum']['index']->availableBlocks->sprint = $lang->executionCommon . '总览';
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = '待测版本';
@@ -376,9 +398,9 @@ $lang->block->modules['product']->availableBlocks->release = '发布列表';
$lang->block->modules['execution'] = new stdclass();
$lang->block->modules['execution']->availableBlocks = new stdclass();
$lang->block->modules['execution']->availableBlocks->statistic = $lang->executionCommon . '统计';
$lang->block->modules['execution']->availableBlocks->overview = $lang->executionCommon . '总览';
$lang->block->modules['execution']->availableBlocks->list = $lang->executionCommon . '列表';
$lang->block->modules['execution']->availableBlocks->statistic = $lang->execution->common . '统计';
$lang->block->modules['execution']->availableBlocks->overview = $lang->execution->common . '总览';
$lang->block->modules['execution']->availableBlocks->list = $lang->execution->common . '列表';
$lang->block->modules['execution']->availableBlocks->task = '任务列表';
$lang->block->modules['execution']->availableBlocks->build = '版本列表';
@@ -512,11 +534,11 @@ $lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|'
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|all|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'project|testtask|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|all|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'company|dynamic|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
+52 -30
View File
@@ -9,13 +9,18 @@
* @version $Id$
* @link http://www.zentao.net
*/
global $config;
$lang->block = new stdclass();
$lang->block->common = '區塊';
$lang->block->name = '區塊名稱';
$lang->block->style = '外觀';
$lang->block->grid = '位置';
$lang->block->color = '顏色';
$lang->block->reset = '恢復預設';
$lang->block->common = '區塊';
$lang->block->name = '區塊名稱';
$lang->block->style = '外觀';
$lang->block->grid = '位置';
$lang->block->color = '顏色';
$lang->block->reset = '恢復預設';
$lang->block->story = '需求';
$lang->block->investment = '投入';
$lang->block->estimate = '預計工時';
$lang->block->last = '近期';
$lang->block->account = '所屬用戶';
$lang->block->module = '所屬模組';
@@ -31,7 +36,7 @@ $lang->block->lblBlock = '區塊';
$lang->block->lblNum = '條數';
$lang->block->lblHtml = 'HTML內容';
$lang->block->dynamic = '最新動態';
$lang->block->assignToMe = '指派給我';
$lang->block->assignToMe = '待處理';
$lang->block->done = '已完成';
$lang->block->lblFlowchart = '流程圖';
$lang->block->welcome = '歡迎總覽';
@@ -46,7 +51,7 @@ $lang->block->myExecution = '未關閉的' . $lang->executionCommon;
$lang->block->myProduct = '未關閉的' . $lang->productCommon;
$lang->block->delayed = '已延期';
$lang->block->noData = '當前統計類型下暫無數據';
$lang->block->emptyTip = '暫無信息';
$lang->block->emptyTip = '暫無數據';
$lang->block->createdTodos = '創建的待辦數';
$lang->block->createdRequirements = '創建的' . $lang->URCommon . '數';
$lang->block->createdStories = '創建的' . $lang->SRCommon . '數';
@@ -68,6 +73,7 @@ $lang->block->time = '第';
$lang->block->week = '周';
$lang->block->selectProduct = '選擇產品';
$lang->block->of = '的';
$lang->block->remain = '剩餘工時';
$lang->block->params = new stdclass();
$lang->block->params->name = '參數名稱';
@@ -140,7 +146,7 @@ $lang->block->default['waterfall']['project']['7']['params']['type'] = 'all';
$lang->block->default['waterfall']['project']['7']['params']['count'] = '15';
$lang->block->default['waterfall']['project']['7']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['1']['title'] = '項目整體情況';
$lang->block->default['scrum']['project']['1']['title'] = '項目概況';
$lang->block->default['scrum']['project']['1']['block'] = 'scrumoverview';
$lang->block->default['scrum']['project']['1']['grid'] = 8;
@@ -148,6 +154,10 @@ $lang->block->default['scrum']['project']['2']['title'] = $lang->executionCommon
$lang->block->default['scrum']['project']['2']['block'] = 'scrumlist';
$lang->block->default['scrum']['project']['2']['grid'] = 8;
$lang->block->default['scrum']['project']['2']['params']['type'] = 'undone';
$lang->block->default['scrum']['project']['2']['params']['count'] = '20';
$lang->block->default['scrum']['project']['2']['params']['orderBy'] = 'id_desc';
$lang->block->default['scrum']['project']['3']['title'] = '待測版本';
$lang->block->default['scrum']['project']['3']['block'] = 'scrumtest';
$lang->block->default['scrum']['project']['3']['grid'] = 8;
@@ -275,10 +285,14 @@ $lang->block->default['full']['my']['3']['grid'] = 4;
$lang->block->default['full']['my']['3']['source'] = 'todo';
$lang->block->default['full']['my']['3']['params']['count'] = '20';
$lang->block->default['full']['my']['4']['title'] = '項目統計';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['4']['title'] = '項目統計';
$lang->block->default['full']['my']['4']['block'] = 'statistic';
$lang->block->default['full']['my']['4']['source'] = 'project';
$lang->block->default['full']['my']['4']['grid'] = 8;
$lang->block->default['full']['my']['4']['params']['count'] = '20';
}
$lang->block->default['full']['my']['5']['title'] = '我的貢獻';
$lang->block->default['full']['my']['5']['block'] = 'contribute';
@@ -290,7 +304,7 @@ $lang->block->default['full']['my']['6']['block'] = 'recentproject';
$lang->block->default['full']['my']['6']['source'] = 'project';
$lang->block->default['full']['my']['6']['grid'] = 8;
$lang->block->default['full']['my']['7']['title'] = '指派給我';
$lang->block->default['full']['my']['7']['title'] = '待處理';
$lang->block->default['full']['my']['7']['block'] = 'assigntome';
$lang->block->default['full']['my']['7']['source'] = '';
$lang->block->default['full']['my']['7']['grid'] = 8;
@@ -302,15 +316,23 @@ $lang->block->default['full']['my']['7']['params']['riskNum'] = '20';
$lang->block->default['full']['my']['7']['params']['issueNum'] = '20';
$lang->block->default['full']['my']['7']['params']['storyNum'] = '20';
$lang->block->default['full']['my']['8']['title'] = '項目人力投入';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
if($config->systemMode == 'new')
{
$lang->block->default['full']['my']['8']['title'] = '項目人力投入';
$lang->block->default['full']['my']['8']['block'] = 'projectteam';
$lang->block->default['full']['my']['8']['source'] = 'project';
$lang->block->default['full']['my']['8']['grid'] = 8;
}
$lang->block->default['full']['my']['9']['title'] = '項目列表';
$lang->block->default['full']['my']['9']['block'] = 'project';
$lang->block->default['full']['my']['9']['source'] = 'project';
$lang->block->default['full']['my']['9']['grid'] = 8;
if($config->systemMode == 'classic')
{
$lang->block->default['full']['my']['9']['block'] = 'execution';
$lang->block->default['full']['my']['9']['source'] = 'execution';
}
$lang->block->default['full']['my']['9']['params']['orderBy'] = 'id_desc';
$lang->block->default['full']['my']['9']['params']['count'] = '15';
@@ -320,7 +342,7 @@ $lang->block->type = '類型';
$lang->block->orderBy = '排序';
$lang->block->availableBlocks = new stdclass();
$lang->block->availableBlocks->todo = '我的待辦';
$lang->block->availableBlocks->todo = '我的日程';
$lang->block->availableBlocks->task = '我的任務';
$lang->block->availableBlocks->bug = '我的Bug';
$lang->block->availableBlocks->case = '我的用例';
@@ -334,9 +356,9 @@ $lang->block->availableBlocks->testtask = '測試版本列表';
$lang->block->availableBlocks->risk = '我的風險';
$lang->block->availableBlocks->issue = '我的問題';
$lang->block->moduleList['project'] = '項目';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = '項目';
$lang->block->moduleList['product'] = $lang->productCommon;
$lang->block->moduleList['execution'] = $lang->executionCommon;
$lang->block->moduleList['execution'] = $lang->execution->common;
$lang->block->moduleList['qa'] = '測試';
$lang->block->moduleList['todo'] = '待辦';
@@ -345,11 +367,11 @@ $lang->block->modules['project']->availableBlocks = new stdclass();
$lang->block->modules['project']->availableBlocks->project = '項目列表';
$lang->block->modules['project']->availableBlocks->recentproject = '近期項目';
$lang->block->modules['project']->availableBlocks->statistic = '項目統計';
$lang->block->modules['project']->availableBlocks->projectteam = '項目人力投入';
if($config->systemMode == 'new') $lang->block->modules['project']->availableBlocks->projectteam = '項目人力投入';
$lang->block->modules['scrum']['index'] = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks = new stdclass();
$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = '項目整體情況';
$lang->block->modules['scrum']['index']->availableBlocks->scrumoverview = '項目概況';
$lang->block->modules['scrum']['index']->availableBlocks->scrumlist = $lang->executionCommon . '列表';
$lang->block->modules['scrum']['index']->availableBlocks->sprint = $lang->executionCommon . '總覽';
$lang->block->modules['scrum']['index']->availableBlocks->scrumtest = '待測版本';
@@ -376,9 +398,9 @@ $lang->block->modules['product']->availableBlocks->release = '發佈列表';
$lang->block->modules['execution'] = new stdclass();
$lang->block->modules['execution']->availableBlocks = new stdclass();
$lang->block->modules['execution']->availableBlocks->statistic = $lang->executionCommon . '統計';
$lang->block->modules['execution']->availableBlocks->overview = $lang->executionCommon . '總覽';
$lang->block->modules['execution']->availableBlocks->list = $lang->executionCommon . '列表';
$lang->block->modules['execution']->availableBlocks->statistic = $lang->execution->common . '統計';
$lang->block->modules['execution']->availableBlocks->overview = $lang->execution->common . '總覽';
$lang->block->modules['execution']->availableBlocks->list = $lang->execution->common . '列表';
$lang->block->modules['execution']->availableBlocks->task = '任務列表';
$lang->block->modules['execution']->availableBlocks->build = '版本列表';
@@ -512,11 +534,11 @@ $lang->block->modules['project']->moreLinkList->cmmireport = 'weekly|index|'
$lang->block->modules['project']->moreLinkList->cmmiestimate = 'workestimation|index|';
$lang->block->modules['project']->moreLinkList->cmmiissue = 'issue|browse|';
$lang->block->modules['project']->moreLinkList->cmmirisk = 'risk|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|all|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'testtask|browse|';
$lang->block->modules['project']->moreLinkList->scrumlist = 'project|execution|';
$lang->block->modules['project']->moreLinkList->scrumtest = 'project|testtask|';
$lang->block->modules['project']->moreLinkList->scrumproduct = 'product|all|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|all|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'company|dynamic|';
$lang->block->modules['project']->moreLinkList->sprint = 'project|execution|';
$lang->block->modules['project']->moreLinkList->projectdynamic = 'project|dynamic|';
$lang->block->modules['product']->moreLinkList = new stdclass();
$lang->block->modules['product']->moreLinkList->list = 'product|all|';
+3 -3
View File
@@ -173,9 +173,9 @@ class blockModel extends model
->andWhere('deleted')->eq(0)
->fetch('count');
$data['stories'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_STORY)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq(0)->andWhere('type')->eq('story')->fetch('count');
$data['executions'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PROJECT)
$data['executions'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_EXECUTION)
->where('status')->notIN('done,closed')
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi()
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi()
->andWhere('deleted')->eq(0)
->fetch('count');
$data['products'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PRODUCT)
@@ -201,7 +201,7 @@ class blockModel extends model
->fetch('count');
$data['delayProject'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PROJECT)
->where('status')->in('wait,doing')
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi()
->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->sprints)->fi()
->andWhere('end')->lt($today)
->andWhere('deleted')->eq(0)
->fetch('count');
+1
View File
@@ -42,5 +42,6 @@ include '../../common/view/chosen.html.php';
</form>
<?php js::set('blockID', $blockID);?>
<?php js::set('of', $lang->block->of);?>
<?php js::set('title', isset($block->title) ? $block->title : '');?>
<?php if(!empty($module)) js::set('module', $module);?>
<?php if(isset($pageJS)) js::execute($pageJS);?>
+3 -3
View File
@@ -30,7 +30,7 @@
<?php if($longBlock):?>
<th class='c-level'><?php echo $lang->bug->severityAB?></th>
<th class='c-pri'><?php echo $lang->priAB?></th>
<th class='c-date'><?php echo $lang->bug->openedDate;?></th>
<th class='c-date'><?php echo $lang->bug->deadline;?></th>
<?php endif;?>
<th class='c-status'><?php echo $lang->bug->statusAB;?></th>
</tr>
@@ -53,7 +53,7 @@
?>
<tr>
<td class='c-id-xs'><?php echo sprintf('%03d', $bug->id);?></td>
<td class='c-name' style='color: <?php echo $bug->color?>' title='<?php echo $bug->title?>'><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id", '', '', $bug->project), $bug->title)?></td>
<td class='c-name' title='<?php echo $bug->title?>'><?php echo html::a($this->createLink('bug', 'view', "bugID=$bug->id"), $bug->title, '', "style='color: $bug->color'")?></td>
<?php if($longBlock):?>
<td class='c-severity'>
<?php if($hasCustomSeverity):?>
@@ -63,7 +63,7 @@
<?php endif;?>
</td>
<td class='c-pri'><span class='label-pri label-pri-<?php echo $bug->pri?>' title='<?php echo zget($lang->bug->priList, $bug->pri);?>'><?php echo zget($lang->bug->priList, $bug->pri)?></span></td>
<td class='c-date'><?php echo $bug->openedDate;?></td>
<td class='c-date'><?php echo helper::isZeroDate($bug->deadline) ? '' : $bug->deadline;?></td>
<?php endif;?>
<?php $status = $this->processStatus('bug', $bug);?>
<td class='c-status' title='<?php echo $status;?>'>
+6 -5
View File
@@ -28,15 +28,16 @@
<tbody>
<?php foreach($builds as $build):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('build', 'view', "buildID={$build->id}");
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$buildViewLink = $this->createLink('build', 'view', "buildID={$build->id}");
$productViewLink = $this->createLink('product', 'browse', "productID={$build->product}");
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<tr <?php echo $appid?>>
<td class='text-center'><?php echo sprintf('%03d', $build->id);?></td>
<?php if($longBlock):?>
<td title='<?php echo $build->productName?>'><?php echo $build->productName?></td>
<td title='<?php echo $build->productName?>'><?php echo html::a($productViewLink, $build->productName);?></td>
<?php endif;?>
<td title='<?php echo $build->name?>'><?php echo $build->name?></td>
<td title='<?php echo $build->name?>'><?php echo html::a($buildViewLink, $build->name);?></td>
<td><?php echo $build->date?></td>
</tr>
<?php endforeach;?>
+3 -7
View File
@@ -25,16 +25,14 @@
<table class='table table-borderless table-hover table-fixed table-fixed-head tablesorter block-cases <?php if(!$longBlock) echo 'block-sm';?>'>
<thead>
<tr class='text-center'>
<?php if($longBlock):?>
<th class='c-id-xs'><?php echo $lang->idAB?></th>
<?php endif;?>
<th class='c-pri'><?php echo $lang->priAB?></th>
<th class='c-title text-left'><?php echo $lang->case->title;?></th>
<?php if($longBlock):?>
<th class='c-runtime'><?php echo $lang->testtask->lastRunTime;?></th>
<th class='c-result'><?php echo $lang->testtask->lastRunResult;?></th>
<?php endif;?>
<th class='c-status'><?php echo $lang->statusAB;?></th>
<?php endif;?>
</tr>
</thead>
<tbody>
@@ -43,22 +41,20 @@
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('testcase', 'view', "caseID={$case->id}");
?>
<tr class='text-center' data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<?php if($longBlock):?>
<tr class='text-center' <?php echo $appid?>>
<td class='c-id-xs'><?php echo sprintf('%03d', $case->id);?></td>
<?php endif;?>
<td class='c-pri'><span class='label-pri label-pri-<?php echo $case->pri?>' title='<?php echo zget($lang->case->priList, $case->pri, $case->pri);?>'><?php echo zget($lang->case->priList, $case->pri, $case->pri)?></span></td>
<td class='c-title text-left' style='color: <?php echo $case->color?>' title='<?php echo $case->title?>'><?php echo $case->title?></td>
<?php if($longBlock):?>
<td class='c-runtime'><?php if(!helper::isZeroDate($case->lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?></td>
<td class='c-result'><?php if($case->lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?></td>
<?php endif;?>
<?php $status = $this->processStatus('testcase', $case);?>
<td class='c-status' title='<?php echo $status;?>'>
<span class="case-status-<?php echo $case->status?>">
<span class='status-text'><?php echo $status;?></span>
</span>
</td>
<?php endif;?>
</tr>
<?php endforeach;?>
</tbody>
+2
View File
@@ -6,10 +6,12 @@
<div class="tile-title"><?php echo $lang->block->createdTodos;?></div>
<div class="tile-amount"><?php echo empty($data['createdTodos']) ? 0 : html::a($this->createLink('my', 'todo', 'type=all'), (int)$data['createdTodos']);?></div>
</div>
<?php if($config->URAndSR):?>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdRequirements;?></div>
<div class="tile-amount"><?php echo empty($data['createdRequirements']) ? 0 : (int)$data['createdRequirements'];?></div>
</div>
<?php endif;?>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdStories;?></div>
<div class="tile-amount"><?php echo empty($data['createdStories']) ? 0 : (int)$data['createdStories'];?></div>
+1 -16
View File
@@ -22,7 +22,7 @@ $useGuest = $this->app->user->account == 'guest';
<div class="table-empty-tip">
<p>
<span class="text-muted"><?php echo $lang->block->noData;?></span>
<?php echo html::a($this->createLink("block", "admin", "id=0&module=$module"), "<i class='icon icon-plus'></i> {$lang->block->createBlock}", '', "data-toggle='modal' data-type='ajax' data-width='700' data-title='{$lang->block->createBlock}' class='btn btn-info'")?>
<?php echo html::a($this->createLink("block", "admin", "id=0&module=$module"), "<i class='icon icon-plus'></i> {$lang->block->createBlock}", '', "data-toggle='modal' data-type='ajax' data-width='700' data-title='{$lang->block->createBlock}' class='btn btn-info'")?>
<?php echo html::a($this->createLink("block", "ajaxReset", "module=$module"), "<i class='icon icon-refresh'></i> {$lang->block->reset}", 'hiddenwin', 'class="btn btn-info"')?>
</p>
</div>
@@ -105,21 +105,6 @@ config.ordersSaved = '<?php echo $lang->block->ordersSaved; ?>';
config.confirmRemoveBlock = '<?php echo $lang->block->confirmRemoveBlock; ?>';
var module = '<?php echo $module?>';
var useGuest = <?php echo $useGuest ? 'true' : 'false';?>;
<?php if(!$useGuest):?>
<?php if(!isset($config->$module->block->initVersion) or $config->$module->block->initVersion < '2'):?>
$(function()
{
if(confirm('<?php echo $lang->block->noticeNewBlock;?>'))
{
$('#hiddenwin').attr('src', '<?php echo $this->createLink('block', 'ajaxUseNew', "module=$module&confirm=yes");?>');
}
else
{
$('#hiddenwin').attr('src', '<?php echo $this->createLink('block', 'ajaxUseNew', "module=$module&confirm=no");?>');
}
})
<?php endif;?>
<?php endif;?>
<?php $remind = $this->loadModel('misc')->getRemind();?>
<?php if(!empty($remind)):?>
var myModalTrigger = new $.zui.ModalTrigger({title:'<?php echo $lang->misc->remind;?>', custom: function(){return <?php echo json_encode($remind);?>}, width:'600px'});
+1 -1
View File
@@ -2,7 +2,7 @@
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
<?php else:?>
<style>
.block-dynamic .timeline > li .timeline-text {display: block; overflow: hidden; text-overflow: ellipsis; max-height: 20px; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; }
.block-dynamic .timeline > li .timeline-text {display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-height: 20px;}
.block-dynamic .panel-body {padding-top: 0;}
</style>
<div class='panel-body scrollbar-hover'>
+8 -9
View File
@@ -10,6 +10,7 @@
* @link http://www.zentao.net
*/
?>
<style>.table .c-progress {width: 60px;}</style>
<?php if(empty($executionStats)): ?>
<div class='empty-tip'><?php common::printLink('execution', 'create', '', "<i class='icon-plus'></i> " . $lang->execution->create, '', "class='btn btn-primary'")?></div>
<?php else:?>
@@ -39,8 +40,8 @@
$appid = isset($_GET['entry']) ? "class='app-btn text-center' data-id='{$this->get->entry}'" : "class='text-center'";
$viewLink = $this->createLink('execution', 'task', 'executionID=' . $execution->id);
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($this->createLink('execution', 'task', 'executionID=' . $execution->id), $execution->name, '', "title='$execution->name'");?></nobr></td>
<tr <?php echo $appid?>>
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($viewLink, $execution->name, '', "title='$execution->name'");?></nobr></td>
<td class="c-date"><?php echo $execution->end;?></td>
<?php if($longBlock):?>
<td class="w-70px">
@@ -51,15 +52,13 @@
<span class="status-project status-<?php echo $execution->status?>" title='<?php echo $statusName;?>'><?php echo $statusName;?></span>
<?php endif;?>
</td>
<td class="c-hours" title="<?php echo $execution->hours->totalEstimate . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalEstimate . ' ' . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalConsumed . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalConsumed . ' ' . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalEstimate . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalEstimate . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalConsumed . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalConsumed . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalLeft . $lang->execution->workHourUnit;?></td>
<?php endif;?>
<td class="c-progress">
<div class="progress progress-text-left">
<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 class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $execution->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
<div class='progress-info'><?php echo $execution->hours->progress;?></div>
</div>
</td>
<?php if($longBlock):?>
+4 -4
View File
@@ -4,7 +4,7 @@
<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-deadline {width: 95px;}
.block-issues .c-severity {width: 80px;}
.block-issues .c-status {width: 80px;}
.block-issues.block-sm .c-status {text-align: center;}
@@ -18,7 +18,7 @@
<?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>
<th class='c-identifiedDate'><?php echo $lang->issue->deadline;?></th>
<?php endif;?>
<th class='c-status'><?php echo $lang->issue->status;?></th>
</tr>
@@ -30,11 +30,11 @@
?>
<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>
<td class='c-name' title='<?php echo $issue->title?>'><?php echo html::a($this->createLink('issue', 'view', "issueID=$issue->id", '', '', $issue->project), $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>
<td class='c-deadline'><?php echo $issue->deadline == '0000-00-00' ? '' : $issue->deadline;?></td>
<?php endif;?>
<?php $status = $this->processStatus('issue', $issue);?>
<td class='c-status' title='<?php echo $status;?>'>
+5 -4
View File
@@ -30,14 +30,15 @@
<?php foreach($plans as $plan):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('productplan', 'view', "planID={$plan->id}");
$planViewLink = $this->createLink('productplan', 'view', "planID={$plan->id}");
$productViewLink = $this->createLink('product', 'view', "productID={$plan->product}");
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<tr <?php echo $appid?>>
<?php if($longBlock):?>
<td class='text-center'><?php echo $plan->id;?></td>
<td title='<?php echo $plan->productName?>'><?php echo $plan->productName?></td>
<td title='<?php echo $plan->productName?>'><?php echo html::a($productViewLink, $plan->productName);?></td>
<?php endif;?>
<td title='<?php echo $plan->title?>'><?php echo $plan->title?></td>
<td title='<?php echo $plan->title?>'><?php echo html::a($planViewLink, $plan->title);?></td>
<td class='text-center'><?php echo $plan->begin?></td>
<td class='text-center'><?php echo $plan->end?></td>
</tr>
+6 -6
View File
@@ -14,7 +14,7 @@
<div class='empty-tip'><?php common::printLink('product', 'create', '', "<i class='icon-plus'></i> " . $lang->product->create, '', "class='btn btn-primary'") ?></div>
<?php else:?>
<style>
.block-products.block-sm .c-project {display: none;}
.block-products.block-sm .c-execution {display: none;}
</style>
<div class="panel-body has-table scrollbar-hover block-products">
<table class='table table-borderless table-hover table-fixed table-fixed-head tablesorter table-fixed'>
@@ -22,7 +22,7 @@
<tr>
<th class='c-name'><?php echo $lang->product->name;?></th>
<?php if($longBlock):?>
<th class='c-name c-project'><?php echo $lang->product->currentExecution;?></th>
<th class='c-name c-execution'><?php echo $lang->product->currentExecution;?></th>
<?php endif;?>
<th title='<?php echo $lang->product->plans?>' class='c-num w-120px'><?php echo $lang->product->plans;?></th>
<th title='<?php echo $lang->product->releases?>' class='c-num w-100px'><?php echo $lang->product->releases;?></th>
@@ -36,11 +36,11 @@
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : "";
$viewLink = $this->createLink('product', 'browse', 'productID=' . $product->id);
?>
<tr class='text-center' data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<td class='c-name text-left' title='<?php echo $product->name?>'><?php echo $product->name?></td>
<tr class='text-center' <?php echo $appid?>>
<td class='c-name text-left' title='<?php echo $product->name?>'><?php echo html::a($viewLink, $product->name);?></td>
<?php if($longBlock):?>
<?php $projectName = zget($executions, $product->id, '');?>
<td class='c-name c-project text-left' title='<?php echo $projectName;?>'><?php echo $projectName;?></td>
<?php $executionName = zget($executions, $product->id, '');?>
<td class='c-name c-execution text-left' title='<?php echo $executionName;?>'><?php echo $executionName;?></td>
<?php endif;?>
<td class="c-num"><?php echo $product->plans?></td>
<td class="c-num"><?php echo $product->releases?></td>
@@ -175,10 +175,6 @@ $(function()
</div>
</div>
</div>
<?php $totalProject = $product->projects ? zget($product->projects, 'all', 0) : 0;?>
<?php $undoneProject = $product->projects ? zget($product->projects, 'undone', 0) : 0;?>
<?php $delayProject = $product->projects ? zget($product->projects, 'delay', 0) : 0;?>
<?php $undoneRate = $totalProject ? round($undoneProject / $totalProject * 100, 2) : 0;?>
<div class="product-info">
<?php $totalRelease = $product->releases ? array_sum($product->releases) : 0;?>
<?php $normalRelease = $product->releases ? zget($product->releases, 'normal', 0) : 0;?>
+7 -9
View File
@@ -10,12 +10,12 @@
<thead>
<tr>
<th class='c-name w-100px'><?php echo $lang->project->name;?></th>
<th class='w-100px'><?php echo $lang->program->PM;?></th>
<th class='w-80px'><?php echo $lang->program->status;?></th>
<th class='w-80px'><?php echo $lang->project->PM;?></th>
<th class='w-60px'><?php echo $lang->project->status;?></th>
<?php if($longBlock):?>
<th class='w-60px'><?php echo $lang->program->teamCount;?></th>
<th class='w-60px'><?php echo $lang->project->teamCount;?></th>
<th class='w-90px text-right'><?php echo $lang->task->consumed;?></th>
<th class='w-80px text-right'><?php echo $lang->program->budget;?></th>
<th class='w-80px text-right'><?php echo $lang->project->budget;?></th>
<th class='w-80px'><?php echo $lang->project->leftStories;?></th>
<th class='w-80px'><?php echo $lang->project->leftTasks;?></th>
<th class='w-80px'><?php echo $lang->project->leftBugs;?></th>
@@ -24,9 +24,7 @@
</thead>
<tbody>
<?php foreach($projects as $project):?>
<?php
$viewLink = $this->createLink('program', 'index', "programID={$project->id}");
?>
<?php $viewLink = $this->createLink('project', 'index', "programID={$project->id}");?>
<tr>
<td title='<?php echo $project->name?>'><?php echo html::a($viewLink, $project->name);?></td>
<td><?php echo zget($users, $project->PM, $project->PM)?></td>
@@ -35,8 +33,8 @@
</td>
<?php if($longBlock):?>
<td class='text-center'><?php echo $project->teamCount;?></td>
<td class='text-right' title="<?php echo $project->consumed . ' ' . $lang->execution->workHour;?>"><?php echo $project->consumed . ' ' . $lang->execution->workHourUnit;?></td>
<?php $programBudget = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']) && $project->budget >= 10000 ? number_format($project->budget / 10000, 1) . $this->lang->program->tenThousand : number_format((float)$project->budget, 1);?>
<td class='text-right' title="<?php echo $project->consumed . ' ' . $lang->execution->workHour;?>"><?php echo $project->consumed . $lang->execution->workHourUnit;?></td>
<?php $programBudget = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']) ? round((float)$project->budget / 10000, 2) . $this->lang->project->tenThousand : round((float)$project->budget, 2);?>
<td class='text-right'><?php echo $project->budget != 0 ? zget($lang->project->currencySymbol, $project->budgetUnit) . ' ' . $programBudget : $lang->project->future;?></td>
<td class='text-center'><?php echo $project->leftStories;?></td>
<td class='text-center'><?php echo $project->leftTasks;?></td>
@@ -1,6 +1,10 @@
<?php if(empty($actions)): ?>
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
<?php else:?>
<style>
.timeline > li .timeline-text {display: block; overflow: hidden; text-overflow: ellipsis; max-height: 20px; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; }
.panel-body {padding-top: 0;}
</style>
<div class='panel-body scrollbar-hover'>
<ul class="timeline timeline-tag-left no-margin">
<?php
+109 -101
View File
@@ -22,7 +22,7 @@ html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; po
.block-statistic .tile {margin-bottom: 30px;}
.block-statistic .tile-title {font-size: 18px; color: #A6AAB8;}
.block-statistic .tile-amount {font-size: 48px; margin-bottom: 10px;}
.block-statistic .col-nav {border-right: 1px solid #EBF2FB; width: 260px; padding: 0;}
.block-statistic .col-nav {border-right: 1px solid #EBF2FB; width: 210px; padding: 0;}
.block-statistic .nav-secondary > li {position: relative;}
.block-statistic .nav-secondary > li > a {font-size: 14px; color: #838A9D; position: relative; box-shadow: none; padding-left: 20px; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; transition: all .2s;}
.block-statistic .nav-secondary > li > a:first-child {padding-right: 36px;}
@@ -60,16 +60,32 @@ html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; po
.block-statistic .project-info .col-xs-5, .block-statistic .project-info .col-xs-7 {margin-top: 8px;}
.block-statistic .project-info .col-xs-5 {padding-left: 0;}
.block-statistic .data {width: 40%; text-align: left; padding: 10px 0px; font-size: 14px; font-weight: 700;}
.block-statistic .dataTitle {width: 60%; text-align: right; padding: 10px 0px; font-size: 14px;}
.block-statistic .executionName {padding: 2px 10px; font-size: 14px; text-overflow: ellipsis; overflow: hidden;}
.block-statistic .lastIteration {padding-top: 6px;}
.block-statistic .progress-text-left {margin-right: 90px}
.block-statistic .progress-text-left .progress-text {padding-top: 2px; font-size: 14px; padding-right:5px; left: -45px;}
.status-count {margin: auto;}
.status-count tr:first-child td:last-child {color: #000; font-weight: bold;}
.block-statistic .progress-group {margin-top: 20px; margin-bottom: 10px; height: 65px;}
.block-statistic .weekly-title {font-weight: bold; font-size:14px; color: #3C4253;}
.block-statistic .project-info {margin-left: 3px;}
.block-statistic .project-budget {white-space: nowrap;}
.block-statistic .progress-group {margin-top: 10px;}
.block-statistic .progress-group .col {padding-left: 0;}
.block-statistic .progress-percent {margin-top: 4px;}
.block-statistic .weekly-title {font-weight: bold; color: #3C4253;}
.block-statistic .weekly-small {font-size:12px; color: #838A9D;}
.block-statistic .weekly-progress {font-weight: bold; font-size:24px;}
.block-statistic .weekly-name {font-size: 14px; color: #838A9D;}
.block-statistic .weekly-value {font-size: 14px;}
.block-statistic .col-6 .stage {margin-left: 10px;}
.block-statistic .col-12 .stage {margin-left: 10px;}
.block-statistic .col-12 .waterfall-title {padding-top: 3px;}
.block-statistic .col-12 .waterfall-value {padding-top: 10px; font-size: 18px; font-weight: 600;}
.block-statistic .col-12 .waterfall-title .col {padding-right: 0px; padding-left: 0px;}
.forty-percent {width: 40%;}
</style>
<script>
<?php $blockNavId = 'nav-' . uniqid(); ?>
@@ -98,7 +114,7 @@ $(function()
<div class="table-row">
<?php if(empty($projects)):?>
<div class="table-empty-tip">
<p><span class="text-muted"><?php echo $lang->block->noData;?></span></p>
<p><span class="text-muted"><?php echo $lang->block->emptyTip;?></span></p>
</div>
<?php else:?>
<div class="col col-nav">
@@ -118,124 +134,116 @@ $(function()
<?php foreach($projects as $project):?>
<div class="tab-pane fade<?php if($project->id == $selected) echo ' active in';?>" id="tab3Content<?php echo $project->id;?>">
<div class="table-row">
<?php if($project->model == 'scrum'):?>
<div class="col-5 text-middle text-center">
<div class="progress-pie inline-block space" data-value="<?php echo $project->progress;?>" data-doughnut-size="84">
<canvas width="120" height="120"></canvas>
<div class="progress-info">
<small><?php echo $lang->story->common . $lang->project->doneStories;?></small>
<strong><?php echo $project->doneStories;?></strong>
<?php if($project->model == 'scrum'):?>
<div class='table-row'>
<div class="col-4 text-center">
<div><h4><?php echo $lang->block->story;?></h4></div>
<div>
<div class="col dataTitle"><?php echo $lang->project->allStories . ":";?></div>
<div class="col data"><?php echo $project->allStories;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->project->doneStories . ":";?></div>
<div class="col data"><?php echo $project->doneStories;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->project->surplus . ":";?></div>
<div class="col data"><?php echo $project->leftStories;?></div>
</div>
</div>
<div class="table-row text-center small text-muted with-padding">
<div class="col-4 text-bottom">
<div><?php echo $lang->project->allStories;?></div>
<div><?php echo $project->allStories;?></div>
<div class="col-4 text-center">
<div><h4><?php echo $lang->block->investment;?></h4></div>
<div>
<div class="col dataTitle"><?php echo $lang->block->totalPeople . ":";?></div>
<div class="col data"><?php echo $project->teamCount;?></div>
</div>
<div class="col-4">
<span class="label label-dot label-primary"></span>
<div><?php echo $lang->project->doneStories;?></div>
<div><?php echo $project->doneStories;?></div>
<div>
<div class="col dataTitle"><?php echo $lang->block->estimate . ":";?></div>
<div class="col data"><?php echo $project->estimate;?></div>
</div>
<div class="col-4">
<span class="label label-dot label-pale"></span>
<div><?php echo $lang->project->leftStories;?></div>
<div><?php echo $project->leftStories;?></div>
<div>
<div class="col dataTitle"><?php echo $lang->block->consumedHours . ":";?></div>
<div class="col data"><?php echo $project->consumed;?></div>
</div>
</div>
<div class="col-4 text-center">
<div><h4><?php echo $lang->bug->common;?></h4></div>
<div>
<div class="col dataTitle"><?php echo $lang->block->totalBug . ":";?></div>
<div class="col data"><?php echo $project->allBugs;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->bug->statusList['resolved'] . ":";?></div>
<div class="col data"><?php echo $project->doneBugs;?></div>
</div>
<div>
<div class="col dataTitle"><?php echo $lang->bug->unResolved . ":";?></div>
<div class="col data"><?php echo $project->leftBugs;?></div>
</div>
</div>
</div>
<div class="col-7">
<div class="project-info">
<h4><?php echo $lang->project->allInput;?></h4>
<div class='info'>
<span><i class='icon icon-group'></i> <?php echo sprintf($lang->project->membersUnit, $project->teamCount);?></span>
<span><i class='icon icon-clock'></i> <?php echo sprintf($lang->project->hoursUnit, $project->estimate);?></span>
<span><i class='icon icon-cost'></i> <?php echo $project->budget . ' ' . zget($lang->project->unitList, $project->budgetUnit);?></span>
</div>
</div>
<div class="project-info">
<?php $i = 0;?>
<h4><?php echo $lang->project->lastIteration;?></h4>
<?php foreach($project->executions as $execution):?>
<?php $i ++;?>
<?php if($i > 3) break;?>
<div class='col-xs-5'><?php echo $execution->name;?></div>
<div class='col-xs-7'>
<?php if(!empty($project->executions)):?>
<div class="table-row project-info">
<div class="col-2 text-right"><h4><?php echo $lang->block->last;?></h4></div>
<div class="table-row lastIteration">
<div class='col-5 text-center executionName'><?php echo html::a($this->createLink('execution', 'task', "executionID={$project->executions[0]->id}"), $project->executions[0]->name);?></div>
<div class='col-7'>
<div class='progress progress-text-left'>
<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 class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $project->executions[0]->hours->progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->executions[0]->hours->progress;?>%">
<span class='progress-text'><?php echo $project->executions[0]->hours->progress . '%';?></span>
</div>
</div>
</div>
<?php endforeach;?>
</div>
</div>
<?php else:?>
<div class="col-6">
<?php endif;?>
<?php else:?>
<div class="col-12">
<div class='table-row text-left weekly-row with-padding'>
<span class='weekly-title'><?php echo $lang->project->weekly;?></span>
<span class='stage text-muted'><?php echo $project->current;?></span>
</div>
<div class='progress-group col-10 center-block'>
<div class='progress-num text-center'>
<div class='weekly-title'><?php echo $lang->project->progress;?></div>
<div class='weekly-progress'><?php echo $project->progress . '%';?></div>
<div class='table-row text-center progress-group col-12 with-padding center-block'>
<div class='forty-percent col'>
<div class='progress-num col'>
<span><?php echo $lang->project->progress . ':';?></span>
<span class='project-info'><?php echo $project->progress . '%';?></span>
</div>
<div class='progress progress-percent col-1-8'>
<div class="progress-bar" role="progressbar" aria-valuenow="82" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->progress;?>%"></div>
</div>
</div>
<div class='progress'>
<div class="progress-bar" role="progressbar" aria-valuenow="82" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->progress;?>%"></div>
<div class="col-1-5">
<span><?php echo $lang->project->teamCount . ':';?></span>
<span class='project-info'><?php echo $project->teamCount;?></span>
</div>
<div class="col-1-5 project-budget">
<span><?php echo $lang->project->budget . ':';?></span>
<span class='project-info'>
<?php
$projectBudget = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']) ? round((float)$project->budget / 10000, 2) . $this->lang->project->tenThousand : round((float)$project->budget, 2);
echo $project->budget != 0 ? $projectBudget : $this->lang->project->future;
?>
</span>
</div>
<div class="col-1-5"></div>
</div>
<div class="table-row text-center small with-padding col-10 center-block">
<div class="col-4 text-bottom">
<div class='weekly-name'><?php echo $lang->project->pv;?></div>
<div class='weekly-value'><?php echo $project->pv;?></div>
</div>
<div class="col-4">
<div class='weekly-name'><?php echo $lang->project->ev;?></div>
<div class='weekly-value'><?php echo $project->ev;?></div>
</div>
<div class="col-4">
<div class='weekly-name'><?php echo $lang->project->sv;?></div>
<div class='weekly-value'><?php echo $project->sv;?></div>
</div>
<div class="table-row text-center waterfall-title small col-12 center-block">
<?php $isChineseLang = in_array($this->app->getClientLang(), ['zh-cn','zh-tw']);?>
<div class="col-1-5"><?php echo $isChineseLang ? $lang->project->pv . '(' . $lang->project->pvTitle . ')' : $lang->project->pv; ?></div>
<div class="col-1-5"><?php echo $isChineseLang ? $lang->project->ev . '(' . $lang->project->evTitle . ')' : $lang->project->ev;?></div>
<div class="col-1-5"><?php echo $isChineseLang ? $lang->project->ac . '(' . $lang->project->acTitle . ')' : $lang->project->ac;?></div>
<div class="col-1-5"><?php echo $isChineseLang ? $lang->project->sv . '(' . $lang->project->svTitle . ')' : $lang->project->sv;?></div>
<div class="col-1-5"><?php echo $isChineseLang ? $lang->project->cv . '(' . $lang->project->cvTitle . ')' : $lang->project->cv;?></div>
</div>
<div class="table-row text-center waterfall-value small col-12 center-block">
<div class="col-1-5"><?php echo $project->pv;?></div>
<div class="col-1-5"><?php echo $project->ev;?></div>
<div class="col-1-5"><?php echo $project->ac;?></div>
<div class="col-1-5"><?php echo $project->sv;?></div>
<div class="col-1-5"><?php echo $project->cv;?></div>
</div>
</div>
<div class='col-6'>
<div class='table-row weekly-row with-padding'>
<div class='col-4 text-center'>
<span class='weekly-title'><?php echo $lang->project->allInput;?></span>
</div>
<div class='col-8'></div>
</div>
<div class='progress-group'>
<div class="table-row text-center small with-padding">
<div class="col-4 text-bottom">
<div class='weekly-name'><?php echo $lang->project->PM;?></div>
<div class='weekly-value'><?php echo $project->PM ? zget($users, $project->PM) : $lang->project->emptyPM;?></div>
</div>
<div class="col-4">
<div class='weekly-name'><?php echo $lang->project->teamCount;?></div>
<div class='weekly-value'><?php echo $project->teamCount;?></div>
</div>
<div class="col-4">
<div class='weekly-name'><?php echo $lang->project->budget;?></div>
<div class='weekly-value'><?php echo $project->budget;?></div>
</div>
</div>
</div>
<div class="table-row text-center small with-padding">
<div class="col-4 text-bottom">
<div class='weekly-name'><?php echo $lang->project->ac;?></div>
<div class='weekly-value'><?php echo $project->ac;?></div>
</div>
<div class="col-4">
<div class='weekly-name'><?php echo $lang->project->cv;?></div>
<div class='weekly-value'><?php echo $project->cv;?></div>
</div>
<div>
</div>
</div>
</div>
<?php endif;?>
</div>
</div>
+5 -8
View File
@@ -8,7 +8,6 @@ $maxConsumed = 0;
<div class='panel-body'>
<div class='table-row'>
<div class='table-col chart-titles'>
<div class='chart-col-title strong'><span><?php echo $lang->project->name;?></span></div>
<?php foreach($projects as $project):?>
<?php
$maxTeamCount = max($maxTeamCount, $project->teamCount);
@@ -48,24 +47,22 @@ $maxConsumed = 0;
</div>
<style>
.block-projectteam .panel-body {margin-top: -10px}
.chart-titles {width: 110px; padding-right: 10px; position: relative; z-index: 1}
.chart-titles {top: 30px; width: 150px; padding-right: 10px; position: relative; z-index: 1}
.chart-rows {position: relative; z-index: 0}
.chart-title {width: 100px; line-height: 20px; padding: 5px 0; height: 30px}
.chart-title > span {background: #fff}
.chart-col-title {line-height: 20px; margin-bottom: 10px; padding: 0 10px}
.project-team, .project-consumed {padding: 0}
.project-team {border-right: 1px solid #e5e8ec}
.project-team > .chart-col-title {text-align: right}
.project-team, .project-consumed {padding: 0; border-left: 1px solid #e5e8ec}
.chart-col-item {height: 30px; padding: 5px 0}
.chart-col-text {width: 50px; position: absolute; top: 5px; line-height: 20px; left: 0}
.project-team .chart-col-item {padding-left: 50px}
.project-team .chart-col-item {padding-right: 50px}
.project-team .chart-col-item:before {content: ' '; z-index: 0; left: -100px; top: 14px; right: 0; border-top: 1px dotted #e5e8ec}
.project-consumed .chart-col-item {padding-right: 50px}
.chart-col-item .progress {background: none; border-radius: 0; overflow: visible; margin: 6px 0 0 0; position: relative; z-index: 1}
.chart-col-item .progress > .progress-bar {border-radius: 0; position: relative; min-width: 1px}
.project-team .chart-col-item .progress > .progress-bar {float: right; background-color: #39cfff}
.project-team .chart-col-item .progress > .progress-bar {background-color: #39cfff}
.chart-col-item .progress .progress-text {position: absolute; top: -6px; color: #333; width: 50px; line-height: 20px; white-space: nowrap; overflow: visible}
.project-team .progress .progress-text {text-align: right; left: -50px; padding-right: 5px}
.project-team .progress .progress-text {text-align: left; right: -55px; padding-right: 5px}
.project-consumed .progress .progress-text {text-align: left; right: -50px; padding-left: 5px}
</style>
</div>
+29 -20
View File
@@ -6,8 +6,8 @@
#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-content {margin: 10px 0; border: 1px solid #DCDCDC; border-radius: 2px; box-shadow: none; height: 146px; cursor: pointer;}
#cards .panel-content: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}
@@ -22,7 +22,7 @@
#cards .project-detail .progress {height: 4px;}
#cards .project-detail .progress-text-left .progress-text {width: 50px; left: -50px;}
#cards .panel-heading {cursor: pointer;}
#cards .project-stages-container {margin: 0 -16px -16px -16px; padding: 0 4px; height: 46px; overflow-x: auto; position: relative;}
#cards .project-stages-container {margin: 0 0 -16px 0; padding: 0 4px; height: 46px; overflow-x: auto; position: relative;}
#cards .project-stages:after {content: ' '; width: 30px; display: block; right: -16px; top: 16px; bottom: -6px; z-index: 1; background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%); position: absolute;}
#cards .project-stages-row {position: relative; height: 30px; z-index: 0;}
#cards .project-stage-item {white-space: nowrap; position: absolute; top: 0; min-width: 48px; padding-top: 13px; color: #838A9D;}
@@ -32,31 +32,37 @@
#cards .project-stage-item.is-going {color: #333;}
#cards .project-stage-item.is-going::before {background-color: #0C64EB;}
#dashboard .block-recentproject .panel-body {padding: 0;}
.execution-name {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
</style>
<div class="panel-body">
<?php if(empty($projects)):?>
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
<?php else:?>
<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");?>'>
<?php $viewLink = $config->systemMode == 'new' ? $this->createLink('project', 'index', "projectID=$project->id") : $this->createLink('execution', 'task', "projectID=$project->id");?>
<div class='col'>
<div class='panel-content'>
<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(isset($config->maxVersion)):?>
<?php if($project->model === 'waterfall'): ?>
<span class='project-type-label label label-warning label-outline'><?php echo $lang->project->waterfall; ?></span>
<?php else: ?>
<span class='project-type-label label label-info label-outline'><?php echo $lang->project->scrum; ?></span>
<?php endif; ?>
<?php endif; ?>
<strong class='project-name' title='<?php echo $project->name;?>'> <?php echo html::a($viewLink, $project->name);?> </strong>
<nav class='panel-actions nav nav-default'>
<li class='dropdown'>
<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', '', '', '', '', '', $project->id);?></li>
<li><?php common::printIcon('program', 'PRJManageMembers', "projectID=$project->id", $project, 'button', 'persons', '', '', '', '', '', $project->id);?></li>
<li><?php common::printicon('program', 'PRJActivate', "projectid=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
<li><?php common::printIcon('program', 'PRJEdit', "projectID=$project->id", $project, 'button', ' icon-edit', '', '', '', '', '', $project->id);?></li>
<li><?php common::printIcon('program', 'PRJStart', "projectID=$project->id", $project, 'button', ' icon-play', '', 'iframe', true);?></li>
<li><?php common::printIcon('program', 'PRJSuspend', "projectID=$project->id", $project, 'button', ' icon-pause', '', 'iframe', true);?></li>
<li><?php common::printIcon('program', 'PRJClose', "projectID=$project->id", $project, 'button', ' icon-off', '', 'iframe', true);?></li>
<li><?php common::printIcon('program', 'PRJDelete', "projectID=$project->id", $project, 'button', ' icon-trash', 'hiddenwin');?></li>
<li><?php common::printIcon('project', 'group', "projectID=$project->id", $project, 'button', 'group', '', '', '', '', '', $project->id);?></li>
<li><?php common::printIcon('project', 'manageMembers', "projectID=$project->id", $project, 'button', 'persons', '', '', '', '', '', $project->id);?></li>
<li><?php common::printicon('project', 'activate', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
<li><?php if(common::hasPriv('project', 'edit')) echo html::a($this->createLink('project', 'edit', "projectID=$project->id"), "<i class='icon-edit'></i> " . $lang->project->edit, '', "data-app='{$app->openApp}'");?></li>
<li><?php common::printIcon('project', 'start', "projectID=$project->id", $project, 'button', ' icon-play', '', 'iframe', true);?></li>
<li><?php common::printIcon('project', 'suspend', "projectID=$project->id", $project, 'button', ' icon-pause', '', 'iframe', true);?></li>
<li><?php common::printIcon('project', 'close', "projectID=$project->id", $project, 'button', ' icon-off', '', 'iframe', true);?></li>
<li><?php if(common::hasPriv('project', 'delete')) echo html::a($this->createLink('project', 'delete', "projectID=$project->id"), "<i class='icon-trash'></i> " . $lang->project->delete, 'hiddenwin', "data-app='{$app->openApp}'");?></li>
</ul>
</li>
</nav>
@@ -66,9 +72,9 @@
<span><i class='icon icon-group'></i> <?php printf($lang->project->membersUnit, $project->teamCount); ?></span>
<span><i class='icon icon-clock'></i> <?php printf($lang->project->hoursUnit, $project->estimate); ?></span>
</div>
<?php if($config->systemMode == 'new'):?>
<?php if($project->model === 'waterfall'): ?>
<div class='project-detail project-stages'>
<p class='text-muted'><?php echo $lang->project->ongoingStage;?></p>
<?php
$projectProjects = array();
foreach($project->executions as $project)
@@ -79,6 +85,7 @@
<?php if(empty($projectProjects)): ?>
<div class='label label-outline'><?php echo zget($lang->project->statusList, $project->status);?></div>
<?php else: ?>
<p class='text-muted'><?php echo $lang->project->ongoingStage;?></p>
<div class='project-stages-container scrollbar-hover'>
<div class='project-stages-row'>
<?php foreach ($projectProjects as $project): ?>
@@ -96,11 +103,11 @@
<p class='text-muted'><?php echo $lang->project->lastIteration; ?></p>
<?php if($project):?>
<div class='row'>
<div class='col-xs-5'><?php echo $project->name;?></div>
<div class='col-xs-5 execution-name' title="<?php echo $project->name;?>"><?php echo html::a($this->createLink('execution', 'task', "executionID={$project->id}"), $project->name);?></div>
<div class='col-xs-7'>
<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 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>
</div>
</div>
@@ -108,11 +115,13 @@
<?php endif; ?>
</div>
<?php endif; ?>
<?php endif; ?>
</div>
</div>
</div>
<?php endforeach;?>
</div>
<?php endif;?>
</div>
<script>
/* Auto resize stages */
+8 -6
View File
@@ -32,17 +32,19 @@
<tbody>
<?php foreach($releases as $release):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('release', 'view', "releaseID={$release->id}");
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$productViewLink = $this->createLink('product', 'browse', "productID={$release->product}");
$buildViewLink = $this->createLink('build', 'view', "buildID={$release->build}");
$releaseViewLink = $this->createLink('release', 'view', "releaseID={$release->id}");
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<tr <?php echo $appid?>>
<?php if($longBlock):?>
<td class='text-center'><?php echo sprintf('%03d', $release->id);?></td>
<td title='<?php echo $release->productName?>'><?php echo $release->productName?></td>
<td title='<?php echo $release->productName?>'><?php echo html::a($productViewLink, $release->productName);?></td>
<?php endif;?>
<td title='<?php echo $release->name?>'><?php echo $release->name?></td>
<td title='<?php echo $release->name?>'><?php echo html::a($releaseViewLink, $release->name);?></td>
<?php if($longBlock):?>
<td title='<?php echo $release->buildName?>'><?php echo $release->buildName?></td>
<td title='<?php echo $release->buildName?>'><?php echo html::a($buildViewLink, $release->buildName);?></td>
<?php endif;?>
<td class='text-center'><?php echo $release->date?></td>
<td class='c-status' title='<?php echo zget($lang->release->statusList, $release->status);?>'>
+4 -4
View File
@@ -4,7 +4,7 @@
<style>
.block-risks .c-id {width: 50px;}
.block-risks .c-pri {width: 50px;text-align: center;}
.block-risks .c-identifiedDate {width: 95px;}
.block-risks .c-plannedClosedDate {width: 100px;}
.block-risks .c-category {width: 80px;}
.block-risks .c-status {width: 80px;}
.block-risks.block-sm .c-status {text-align: center;}
@@ -21,7 +21,7 @@
<?php if($longBlock):?>
<th class='c-pri'><?php echo $lang->priAB?></th>
<th class='c-category'><?php echo $lang->risk->category;?></th>
<th class='c-identifiedDate'><?php echo $lang->risk->identifiedDate;?></th>
<th class='c-plannedClosedDate'><?php echo $lang->risk->plannedClosedDate;?></th>
<?php endif;?>
<th class='c-status'><?php echo $lang->risk->status;?></th>
</tr>
@@ -33,11 +33,11 @@
?>
<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->PRJ), $risk->name)?></td>
<td class='c-name' title='<?php echo $risk->name?>'><?php echo html::a($this->createLink('risk', 'view', "riskID=$risk->id", '', '', $risk->project), $risk->name)?></td>
<?php if($longBlock):?>
<td class='c-pri'><?php echo "<span class='pri-{$risk->pri}'>" . zget($lang->risk->priList, $risk->pri) . "</span>";?></td>
<td class='c-category'><?php echo zget($lang->risk->categoryList, $risk->category)?></td>
<td class='c-identifiedDate'><?php echo $risk->identifiedDate == '0000-00-00' ? '' : $risk->identifiedDate;?></td>
<td class='c-plannedClosedDate'><?php echo $risk->plannedClosedDate == '0000-00-00' ? '' : $risk->plannedClosedDate;?></td>
<?php endif;?>
<?php $status = $this->processStatus('risk', $risk);?>
<td class='c-status' title='<?php echo $status;?>'>
+7 -8
View File
@@ -10,6 +10,7 @@
* @link http://www.zentao.net
*/
?>
<style>.table .c-progress {width: 60px;}</style>
<?php if(empty($executionStats)): ?>
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
<?php else:?>
@@ -39,7 +40,7 @@
$appid = isset($_GET['entry']) ? "class='app-btn text-center' data-id='{$this->get->entry}'" : "class='text-center'";
$viewLink = $this->createLink('execution', 'task', 'executionID=' . $execution->id);
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<tr <?php echo $appid?>>
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($viewLink, $execution->name, '', "title='$execution->name'");?></nobr></td>
<td class="c-date"><?php echo $execution->end;?></td>
<?php if($longBlock):?>
@@ -51,15 +52,13 @@
<span class="status-project status-<?php echo $execution->status?>" title='<?php echo $statusName;?>'><?php echo $statusName;?></span>
<?php endif;?>
</td>
<td class="c-hours" title="<?php echo $execution->hours->totalEstimate . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalEstimate . ' ' . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalConsumed . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalConsumed . ' ' . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalEstimate . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalEstimate . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalConsumed . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalConsumed . $lang->execution->workHourUnit;?></td>
<td class="c-hours" title="<?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalLeft . $lang->execution->workHourUnit;?></td>
<?php endif;?>
<td class="c-progress">
<div class="progress progress-text-left">
<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 class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $execution->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
<div class='progress-info'><?php echo $execution->hours->progress;?></div>
</div>
</td>
<?php if($longBlock):?>
+48 -77
View File
@@ -13,81 +13,52 @@
<?php if(empty($totalData)): ?>
<div class='empty-tip'><?php common::printLink('project', 'create', '', "<i class='icon-plus'></i> " . $lang->project->create, '', "class='btn btn-primary'")?></div>
<?php else:?>
<style>
#totalInvestment {padding-bottom: 5px;}
.overview-title {font-size: 14px; color: #838a9d;}
.extra-tips {font-size: 12px; color: #a1a7b7;}
.progress {margin-bottom: 8px;}
.total-block {padding: 0px 25px;}
.hours-statistics {position: relative; padding: 0px 5px 5px; display: table-cell;text-align: center;}
.hours-statistics > small {display: block; color: #A6AAB8;}
.hours-statistics > span {display: block; color: #3c4353; font-weight: bold;}
.tile-amount {font-size: 20px;}
</style>
<div class="panel-body conatiner-fluid">
<div class="table-row">
<div class="col-6 tile">
<div class="text-left" id="totalInvestment"><strong><?php echo $lang->block->totalInvestment;?></strong></div>
<div class="table-row">
<div class="col-4 tile">
<div class="overview-title"><i class="icon-program-group icon-group"></i> <?php echo $lang->block->totalPeople;?></div>
<div class="tile-amount">
<?php echo $totalData[$projectID]->teamCount ? html::a($this->createLink('program', 'prjmanageMembers', 'projectID=' . $projectID), $totalData[$projectID]->teamCount) : 0;?>
</div>
</div>
<div class="col-4 tile">
<div class="overview-title"><i class="icon icon-clock"></i> <?php echo $lang->block->consumedHours;?></div>
<div class="tile-amount" title="<?php echo $totalData[$projectID]->consumed . $lang->execution->workHour;?>">
<?php echo $totalData[$projectID]->consumed ? html::a($this->createLink('project', 'index', 'locate=no'), $totalData[$projectID]->consumed . $lang->execution->workHourUnit) : 0;?>
</div>
<div class="tile-info">
<span class="extra-tips"><?php echo $lang->block->estimatedHours . ' ' . $totalData[$projectID]->estimate . $lang->execution->workHour;?></span>
</div>
</div>
<div class="col-4 tile">
<div class="overview-title"><i class="icon icon-cost"></i> <?php echo $lang->block->spent;?></div>
<div class="tile-amount">¥0</div>
<div class="tile-info">
<?php $budget = $totalData[$projectID]->budget != 0 ? zget($lang->project->currencySymbol, $totalData[$projectID]->budgetUnit) . number_format($totalData[$projectID]->budget, 2) : $lang->project->future;?>
<span class="extra-tips"><?php echo $lang->block->budget . ' ' . $budget;?></span>
</div>
</div>
</div>
</div>
<div class="col-3 total-block hide-in-sm">
<div><strong><?php echo $lang->block->totalStory;?></strong></div>
<div class="tile-amount">
<?php echo $totalData[$projectID]->allStories;?>
</div>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $totalData[$projectID]->doneStories;?>" aria-valuemin="0" aria-valuemax="<?php echo $totalData[$projectID]->allStories;?>" style="width: <?php echo floor(($totalData[$projectID]->doneStories/$totalData[$projectID]->allStories)*100).'%';?>"></div>
</div>
<div class="hours-statistics">
<small><?php echo $lang->block->done;?></small>
<span><?php echo $totalData[$projectID]->doneStories;?></span>
</div>
<div class="hours-statistics">
<small><?php echo $lang->block->left;?></small>
<span><?php echo $totalData[$projectID]->leftStories;?></span>
</div>
</div>
<div class="col-3 total-block hide-in-sm">
<div><strong><?php echo $lang->block->totalBug;?></strong></div>
<div class="tile-amount">
<?php echo $totalData[$projectID]->allBugs;?>
</div>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="<?php echo $totalData[$projectID]->doneBugs;?>" aria-valuemin="0" aria-valuemax="<?php echo $totalData[$projectID]->allBugs;?>" style="width: <?php echo floor(($totalData[$projectID]->doneBugs/$totalData[$projectID]->allBugs)*100).'%';?>"></div>
</div>
<div class="hours-statistics">
<small><?php echo $lang->block->done;?></small>
<span><?php echo $totalData[$projectID]->doneBugs;?></span>
</div>
<div class="hours-statistics">
<small><?php echo $lang->block->left;?></small>
<span><?php echo $totalData[$projectID]->leftBugs;?></span>
</div>
</div>
</div>
</div>
<table class="table table-data">
<thead>
<tr>
<th><?php echo $lang->block->storyNum;?></th>
<th></th>
<th><?php echo $lang->personnel->invest;?></th>
<th></th>
<th><?php echo $lang->workingHour;?></th>
<th></th>
<th><?php echo $lang->block->bugNum;?></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th><?php echo $lang->block->totalStory . ':';?></th>
<td><?php echo $totalData[$projectID]->allStories;?></td>
<th><?php echo $lang->block->totalPeople . ':';?></th>
<td><?php echo $totalData[$projectID]->teamCount ? html::a($this->createLink('project', 'manageMembers', 'projectID=' . $projectID), $totalData[$projectID]->teamCount) : 0;?></td>
<th><?php echo $lang->block->estimatedHours . ':';?></th>
<td><?php echo $totalData[$projectID]->estimate . $lang->execution->workHour;?></td>
<th><?php echo $lang->block->totalBug. ':';?></th>
<td><?php echo $totalData[$projectID]->allBugs;?></td>
</tr>
<tr>
<th><?php echo $lang->block->done . ':';?></th>
<td><?php echo $totalData[$projectID]->doneStories;?></td>
<th></th>
<td></td>
<th><?php echo $lang->block->consumedHours . ':';?></th>
<td><?php echo $totalData[$projectID]->consumed . $lang->execution->workHour;?></td>
<th><?php echo $lang->bug->statusList['resolved'] . ':';?></th>
<td><?php echo $totalData[$projectID]->doneBugs;?></td>
</tr>
<tr>
<th><?php echo $lang->block->left . ':';?></th>
<td><?php echo $totalData[$projectID]->leftStories;?></td>
<th></th>
<td></td>
<th></th>
<td></td>
<th><?php echo $lang->bug->unResolved . ':';?></th>
<td><?php echo $totalData[$projectID]->leftBugs;?></td>
</tr>
</tbody>
</table>
<?php endif;?>
+2 -2
View File
@@ -30,8 +30,8 @@
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : "";
$viewLink = $this->createLink('product', 'browse', 'productID=' . $id);
?>
<tr class='text-center' data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<td class="c-num text-ellipsis" title="<?php echo $name;?>"><?php echo $name;?></td>
<tr class='text-center' <?php echo $appid?>>
<td class="c-num text-ellipsis" title="<?php echo $name;?>"><?php echo html::a($viewLink, $name);?></td>
<td class="c-num"><?php echo empty($stories[$id]) ? 0: $stories[$id];?></td>
<td class="c-num"><?php echo empty($bugs[$id]) ? 0: $bugs[$id];?></td>
<td class="c-num"><?php echo empty($releases[$id]) ? 0: $releases[$id];?></td>
+10 -7
View File
@@ -31,18 +31,21 @@
<tbody>
<?php foreach($testtasks as $testtask):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('testtask', 'view', "testtaskID={$testtask->id}");
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$productViewLink = $this->createLink('product', 'browse', "productID={$testtask->product}");
$projectViewLink = $this->createLink('project', 'view', "projectID={$testtask->project}");
$testtaskViewLink = $this->createLink('testtask', 'view', "testtaskID={$testtask->id}");
$buildViewLink = $this->createLink('build', 'view', "buildID={$testtask->build}");
?>
<tr class='text-center' data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<td class='text-left text-ellipsis' title='<?php echo $testtask->name?>'><?php echo $testtask->name?></td>
<tr class='text-center' <?php echo $appid?>>
<td class='text-left text-ellipsis' title='<?php echo $testtask->name?>'><?php echo html::a($testtaskViewLink, $testtask->name);?></td>
<?php if($longBlock):?>
<td class='text-left text-ellipsis' title='<?php echo $testtask->productName?>'><?php echo $testtask->productName?></td>
<td class='text-left text-ellipsis' title='<?php echo $testtask->productName?>'><?php echo html::a($productViewLink, $testtask->productName);?></td>
<?php endif;?>
<?php if($longBlock):?>
<td class='text-left text-ellipsis' title='<?php echo $testtask->projectName?>'><?php echo $testtask->projectName?></td>
<td class='text-left text-ellipsis' title='<?php echo $testtask->projectName?>'><?php echo html::a($projectViewLink, $testtask->projectName);?></td>
<?php endif;?>
<td class='text-left text-ellipsis' title='<?php echo $testtask->buildName?>'><?php echo $testtask->buildName?></td>
<td class='text-left text-ellipsis' title='<?php echo $testtask->buildName?>'><?php echo html::a($buildViewLink, $testtask->buildName);?></td>
<td><?php echo zget($lang->testtask->statusList, $testtask->status)?></td>
</tr>
<?php endforeach;?>
+1 -1
View File
@@ -20,7 +20,7 @@
<div class="col-4 text-middle text-center">
<div class="tile">
<div class="tile-title"><?php echo $lang->block->allExecutions;?></div>
<?php $projectLink = $this->createLink('project', 'all', 'status=all')?>
<?php $projectLink = $this->createLink('project', 'execution')?>
<div class="tile-amount"><?php echo $summary->total ? html::a($projectLink, $summary->total) : 0;?></div>
</div>
</div>
+3 -11
View File
@@ -27,16 +27,12 @@
<table class='table table-borderless table-hover table-fixed table-fixed-head tablesorter block-stories <?php if(!$longBlock) echo 'block-sm'?>'>
<thead>
<tr>
<?php if($longBlock):?>
<th class="c-id"><?php echo $lang->idAB?></th>
<?php endif;?>
<th class="c-pri"><?php echo $lang->priAB?></th>
<th class="c-name"><?php echo $lang->SRCommon;?></th>
<?php if($longBlock):?>
<th class='c-estimate'><?php echo $lang->story->estimateAB;?></th>
<?php endif;?>
<th class="c-status"><?php echo $lang->statusAB;?></th>
<?php if($longBlock):?>
<th class='c-stage'><?php echo $lang->story->stageAB;?></th>
<?php endif;?>
</tr>
@@ -47,20 +43,16 @@
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('story', 'view', "storyID={$story->id}");
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<?php if($longBlock):?>
<tr <?php echo $appid?>>
<td class="c-id-xs"><?php echo sprintf('%03d', $story->id);?></td>
<?php endif;?>
<td class="c-pri"><span class="label-pri label-pri-<?php echo $story->pri?>" title="<?php echo zget($lang->story->priList, $story->pri, $story->pri);?>"><?php echo zget($lang->story->priList, $story->pri, $story->pri)?></span></td>
<td class="c-name" style='color: <?php echo $story->color?>' title='<?php echo $story->title?>'><?php echo $story->title?></td>
<td class="c-name" style='color: <?php echo $story->color?>' title='<?php echo $story->title?>'><?php echo html::a($viewLink, $story->title);?></td>
<?php if($longBlock):?>
<td class='c-estimate text-center' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . ' ' . $config->hourUnit?></td>
<?php endif;?>
<td class='c-estimate text-center' title="<?php echo $story->estimate . ' ' . $lang->hourCommon;?>"><?php echo $story->estimate . $config->hourUnit?></td>
<?php $status = $this->processStatus('story', $story);?>
<td class='c-status' title='<?php echo $status;?>'>
<span class="status-story status-<?php echo $story->status?>"><?php echo $status;?></span>
</td>
<?php if($longBlock):?>
<td class='c-stage'>
<span class='story-stage-<?php echo $story->stage?>'>
<?php echo zget($lang->story->stageList, $story->stage, $story->stage);?>
+1 -1
View File
@@ -46,7 +46,7 @@
<td class='c-pri <?php if($longBlock) echo "c-pri-long"?>'><span class='label-pri label-pri-<?php echo $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri, $task->pri)?>'><?php echo zget($lang->task->priList, $task->pri, $task->pri)?></span></td>
<td class='c-name' style='color: <?php echo $task->color?>' title='<?php echo $task->name?>'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->name)?></td>
<?php if($longBlock):?>
<td class='c-estimate text-center' title="<?php echo $task->estimate . ' ' . $lang->execution->workHour;?>"><?php echo $task->estimate . ' ' . $lang->execution->workHourUnit;?></td>
<td class='c-estimate text-center' title="<?php echo $task->estimate . ' ' . $lang->execution->workHour;?>"><?php echo $task->estimate . $lang->execution->workHourUnit;?></td>
<td class='c-deadline'><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
<?php endif;?>
<?php $status = $this->processStatus('task', $task);?>
+8 -6
View File
@@ -32,17 +32,19 @@
<tbody>
<?php foreach($testtasks as $testtask):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('testtask', 'view', "testtaskID={$testtask->id}");
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$productViewLink = $this->createLink('product', 'browse', "productID={$testtask->product}");
$buildViewLink = $this->createLink('build', 'view', "buildID={$testtask->build}");
$testtaskViewLink = $this->createLink('testtask', 'view', "testtaskID={$testtask->id}");
?>
<tr class='text-center' data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<tr class='text-center' <?php echo $appid?>>
<?php if($longBlock):?>
<td><?php echo sprintf('%03d', $testtask->id);?></td>
<td class='text-left' title='<?php echo $testtask->productName?>'><?php echo $testtask->productName?></td>
<td class='text-left' title='<?php echo $testtask->productName?>'><?php echo html::a($productViewLink, $testtask->productName);?></td>
<?php endif;?>
<td class='text-left' title='<?php echo $testtask->name?>'><?php echo $testtask->name?></td>
<td class='text-left' title='<?php echo $testtask->name?>'><?php echo html::a($testtaskViewLink, $testtask->name);?></td>
<?php if($longBlock):?>
<td class='text-left' title='<?php echo $testtask->projectName . '/' . $testtask->buildName?>'><?php echo $testtask->projectName . '/' . $testtask->buildName?></td>
<td class='text-left' title='<?php echo $testtask->projectName . '/' . $testtask->buildName?>'><?php echo html::a($buildViewLink, $testtask->projectName . '/' . $testtask->buildName);?></td>
<?php endif;?>
<td><?php echo $testtask->begin?></td>
<td><?php echo $testtask->end?></td>
+2 -2
View File
@@ -19,7 +19,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
.block-todoes .todoes-input .form-control:-ms-input-placeholder {font-size: 12px; line-height: 20px;color: #a4a8b6;}
.block-todoes .todoes-input .form-control::placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
.block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -20px; max-height: 350px; overflow: auto; overflow-x:hidden}
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden; width: 410px;}
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden;}
.block-todoes .todoes > li:hover {background-color: #e9f2fb;}
.block-todoes .todo-title {padding: 5px 15px 5px 5px;}
.block-todoes .todo-pri {margin: 0 5px;}
@@ -96,7 +96,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
?>
<li data-id='<?php echo $todo->id?>'>
<span class="todo-check icon icon-check-circle"></span>
<a href="<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink);?>" class='iframe' <?php echo $appid?>>
<a href="<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink);?>" class='iframe' data-toggle='modal' <?php echo $appid?>>
<?php if ($todo->date == '2030-01-01') :?>
<span class="todo-time"><?php echo $lang->todo->periods['future'] ?></span>
<?php else:?>
+3 -3
View File
@@ -28,10 +28,10 @@
<tbody>
<?php foreach($todos as $todo):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
$viewLink = $this->createLink('todo', 'view', "todo={$todo->id}");
?>
<tr data-url='<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink); ?>' <?php echo $appid?>>
<tr <?php echo $appid?>>
<td class='c-date'>
<?php if ($todo->date == '2030-01-01') :?>
<?php echo $lang->todo->periods['future'];?>
@@ -40,7 +40,7 @@
<?php endif;?>
</td>
<td class="c-pri"><span class="todo-pri label-pri label-pri-<?php echo $todo->pri?>" title="<?php echo zget($lang->todo->priList, $todo->pri);?>"><?php echo zget($lang->todo->priList, $todo->pri);?></span></td>
<td class="c-name" title='<?php echo $todo->name;?>'><?php echo $todo->name;?></td>
<td class="c-name" title='<?php echo $todo->name;?>'><?php echo html::a($viewLink, $todo->name);?></td>
<td class='c-status'><?php echo zget($lang->todo->statusList, $todo->status);?></td>
</tr>
<?php endforeach;?>

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