<\/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
+ sed -i 's/v\.//g' zentaoxx/module/client/js/checkupgrade.js
+ sed -i 's/xxb_/zt_/g' zentaoxx/db/*.sql
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
- rm -rf zentaopms/tools
+ rm -rf zentaoxx/tools
zip -rqm -9 zentaoxx.$(VERSION).zip zentaoxx/*
rm -rf xuan.zip xuan zentaoxx
package:
@@ -104,18 +124,6 @@ pms:
make package
zip -rq -9 ZenTaoPMS.$(VERSION).zip zentaopms
rm -fr zentaopms zentaoxx zentaoxx.*.zip
-en:
- make common
- cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
- cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
- cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
- make package
- zip -r -9 ZenTaoPMS.$(VERSION).int.zip zentaopms
- rm -fr zentaopms
- echo $(VERSION).int > VERSION
- make deb
- make rpm
- echo $(VERSION) > VERSION
deb:
mkdir buildroot
cp -r build/debian/DEBIAN buildroot
@@ -143,6 +151,47 @@ rpm:
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
cp ~/rpmbuild/RPMS/noarch/zentaopms-${VERSION}-1.noarch.rpm ./
rm -rf ~/rpmbuild
+en:
+ make common
+ cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
+ cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
+ cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
+ make package
+ mv zentaopms zentaoalm
+ zip -r -9 ZenTaoALM.$(VERSION).int.zip zentaoalm
+ rm -fr zentaoalm
+ echo $(VERSION).int > VERSION
+ make endeb
+ make enrpm
+ echo $(VERSION) > VERSION
+endeb:
+ mkdir buildroot
+ cp -r build/debian/DEBIAN buildroot
+ sed -i '/^Version/cVersion: ${VERSION}' buildroot/DEBIAN/control
+ mkdir buildroot/opt
+ mkdir buildroot/etc/apache2/sites-enabled/ -p
+ cp build/debian/zentaopms.conf buildroot/etc/apache2/sites-enabled/
+ cp ZenTaoALM.${VERSION}.zip buildroot/opt
+ cd buildroot/opt; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm zentao; rm ZenTaoALM.${VERSION}.zip
+ sed -i 's/index.php/\/zentao\/index.php/' buildroot/opt/zentao/www/.htaccess
+ sudo dpkg -b buildroot/ ZenTaoALM_${VERSION}_1_all.deb
+ rm -rf buildroot
+enrpm:
+ mkdir ~/rpmbuild/SPECS -p
+ cp build/rpm/zentaopms.spec ~/rpmbuild/SPECS
+ sed -i '/^Version/cVersion:${VERSION}' ~/rpmbuild/SPECS/zentaopms.spec
+ sed -i '/^Name:/cName:zentaoalm' ~/rpmbuild/SPECS/zentaopms.spec
+ mkdir ~/rpmbuild/SOURCES
+ cp ZenTaoALM.${VERSION}.zip ~/rpmbuild/SOURCES
+ mkdir ~/rpmbuild/SOURCES/etc/httpd/conf.d/ -p
+ cp build/debian/zentaopms.conf ~/rpmbuild/SOURCES/etc/httpd/conf.d/zentaoalm.conf
+ mkdir ~/rpmbuild/SOURCES/opt/ -p
+ cd ~/rpmbuild/SOURCES; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm opt/zentao;
+ sed -i 's/index.php/\/zentao\/index.php/' ~/rpmbuild/SOURCES/opt/zentao/www/.htaccess
+ cd ~/rpmbuild/SOURCES; tar -czvf zentaoalm-${VERSION}.tar.gz etc opt; rm -rf ZenTaoALM.${VERSION}.zip etc opt;
+ rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
+ cp ~/rpmbuild/RPMS/noarch/zentaoalm-${VERSION}-1.noarch.rpm ./
+ rm -rf ~/rpmbuild
patchphpdoc:
sudo cp misc/doc/phpdoc/*.tpl /usr/share/php/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/phphtmllib/templates/
phpdoc:
diff --git a/VERSION b/VERSION
index a6e5b12f92..3833f0f6a2 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-11.4.1
+11.5.stable
diff --git a/config/config.php b/config/config.php
index b5a81a8646..f0beabeba7 100644
--- a/config/config.php
+++ b/config/config.php
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
-$config->version = '11.4.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
+$config->version = '11.5'; // 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.
diff --git a/db/standard/zentao11.5.sql b/db/standard/zentao11.5.sql
new file mode 100644
index 0000000000..a809afd69f
--- /dev/null
+++ b/db/standard/zentao11.5.sql
@@ -0,0 +1,910 @@
+CREATE TABLE `zt_action` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `objectType` varchar(30) NOT NULL DEFAULT '',
+ `objectID` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `product` varchar(255) NOT NULL,
+ `project` mediumint(9) NOT NULL,
+ `actor` varchar(30) NOT NULL DEFAULT '',
+ `action` varchar(30) NOT NULL DEFAULT '',
+ `date` datetime NOT NULL,
+ `comment` text NOT NULL,
+ `extra` text NOT NULL,
+ `read` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `date` (`date`),
+ KEY `actor` (`actor`),
+ KEY `project` (`project`),
+ KEY `objectID` (`objectID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_block` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `module` varchar(20) NOT NULL,
+ `title` varchar(100) NOT NULL,
+ `source` varchar(20) NOT NULL,
+ `block` varchar(20) NOT NULL,
+ `params` text NOT NULL,
+ `order` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `grid` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `height` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `hidden` tinyint(1) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `accountModuleOrder` (`account`,`module`,`order`),
+ KEY `account` (`account`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_branch` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `order` smallint(5) unsigned NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_bug` (
+ `id` mediumint(8) NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `module` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `project` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `plan` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `story` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `storyVersion` smallint(6) NOT NULL DEFAULT '1',
+ `task` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `toTask` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `toStory` mediumint(8) NOT NULL DEFAULT '0',
+ `title` varchar(255) NOT NULL,
+ `keywords` varchar(255) NOT NULL,
+ `severity` tinyint(4) NOT NULL DEFAULT '0',
+ `pri` tinyint(3) unsigned NOT NULL,
+ `type` varchar(30) NOT NULL DEFAULT '',
+ `os` varchar(30) NOT NULL DEFAULT '',
+ `browser` varchar(30) NOT NULL DEFAULT '',
+ `hardware` varchar(30) NOT NULL,
+ `found` varchar(30) NOT NULL DEFAULT '',
+ `steps` text NOT NULL,
+ `status` enum('active','resolved','closed') NOT NULL DEFAULT 'active',
+ `color` char(7) NOT NULL,
+ `confirmed` tinyint(1) NOT NULL DEFAULT '0',
+ `activatedCount` smallint(6) NOT NULL,
+ `activatedDate` datetime NOT NULL,
+ `mailto` text,
+ `openedBy` varchar(30) NOT NULL DEFAULT '',
+ `openedDate` datetime NOT NULL,
+ `openedBuild` varchar(255) NOT NULL,
+ `assignedTo` varchar(30) NOT NULL DEFAULT '',
+ `assignedDate` datetime NOT NULL,
+ `deadline` date NOT NULL,
+ `resolvedBy` varchar(30) NOT NULL DEFAULT '',
+ `resolution` varchar(30) NOT NULL DEFAULT '',
+ `resolvedBuild` varchar(30) NOT NULL DEFAULT '',
+ `resolvedDate` datetime NOT NULL,
+ `closedBy` varchar(30) NOT NULL DEFAULT '',
+ `closedDate` datetime NOT NULL,
+ `duplicateBug` mediumint(8) unsigned NOT NULL,
+ `linkBug` varchar(255) NOT NULL,
+ `case` mediumint(8) unsigned NOT NULL,
+ `caseVersion` smallint(6) NOT NULL DEFAULT '1',
+ `result` mediumint(8) unsigned NOT NULL,
+ `testtask` mediumint(8) unsigned NOT NULL,
+ `lastEditedBy` varchar(30) NOT NULL DEFAULT '',
+ `lastEditedDate` datetime NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `project` (`project`),
+ KEY `status` (`status`),
+ KEY `plan` (`plan`),
+ KEY `story` (`story`),
+ KEY `case` (`case`),
+ KEY `assignedTo` (`assignedTo`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_build` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `project` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `name` char(150) NOT NULL,
+ `scmPath` char(255) NOT NULL,
+ `filePath` char(255) NOT NULL,
+ `date` date NOT NULL,
+ `stories` text NOT NULL,
+ `bugs` text NOT NULL,
+ `builder` char(30) NOT NULL DEFAULT '',
+ `desc` text NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `project` (`project`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_burn` (
+ `project` mediumint(8) unsigned NOT NULL,
+ `task` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `date` date NOT NULL,
+ `estimate` float NOT NULL,
+ `left` float NOT NULL,
+ `consumed` float NOT NULL,
+ PRIMARY KEY (`project`,`date`,`task`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_case` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `lib` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `module` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `path` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `story` mediumint(30) unsigned NOT NULL DEFAULT '0',
+ `storyVersion` smallint(6) NOT NULL DEFAULT '1',
+ `title` varchar(255) NOT NULL,
+ `precondition` text NOT NULL,
+ `keywords` varchar(255) NOT NULL,
+ `pri` tinyint(3) unsigned NOT NULL DEFAULT '3',
+ `type` char(30) NOT NULL DEFAULT '1',
+ `stage` varchar(255) NOT NULL,
+ `howRun` varchar(30) NOT NULL,
+ `scriptedBy` varchar(30) NOT NULL,
+ `scriptedDate` date NOT NULL,
+ `scriptStatus` varchar(30) NOT NULL,
+ `scriptLocation` varchar(255) NOT NULL,
+ `status` char(30) NOT NULL DEFAULT '1',
+ `color` char(7) NOT NULL,
+ `frequency` enum('1','2','3') NOT NULL DEFAULT '1',
+ `order` tinyint(30) unsigned NOT NULL DEFAULT '0',
+ `openedBy` char(30) NOT NULL DEFAULT '',
+ `openedDate` datetime NOT NULL,
+ `reviewedBy` varchar(255) NOT NULL,
+ `reviewedDate` date NOT NULL,
+ `lastEditedBy` char(30) NOT NULL DEFAULT '',
+ `lastEditedDate` datetime NOT NULL,
+ `version` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `linkCase` varchar(255) NOT NULL,
+ `fromBug` mediumint(8) unsigned NOT NULL,
+ `fromCaseID` mediumint(8) unsigned NOT NULL,
+ `fromCaseVersion` mediumint(8) unsigned NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ `lastRunner` varchar(30) NOT NULL,
+ `lastRunDate` datetime NOT NULL,
+ `lastRunResult` char(30) NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `story` (`story`),
+ KEY `module` (`module`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_casestep` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `case` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `version` smallint(3) unsigned NOT NULL DEFAULT '0',
+ `type` varchar(10) NOT NULL DEFAULT 'step',
+ `desc` text NOT NULL,
+ `expect` text NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `case` (`case`),
+ KEY `version` (`version`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_company` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` char(120) DEFAULT NULL,
+ `phone` char(20) DEFAULT NULL,
+ `fax` char(20) DEFAULT NULL,
+ `address` char(120) DEFAULT NULL,
+ `zipcode` char(10) DEFAULT NULL,
+ `website` char(120) DEFAULT NULL,
+ `backyard` char(120) DEFAULT NULL,
+ `guest` enum('1','0') NOT NULL DEFAULT '0',
+ `admins` char(255) DEFAULT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_config` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `owner` char(30) NOT NULL DEFAULT '',
+ `module` varchar(30) NOT NULL,
+ `section` char(30) NOT NULL DEFAULT '',
+ `key` char(30) NOT NULL DEFAULT '',
+ `value` text NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `unique` (`owner`,`module`,`section`,`key`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_cron` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `m` varchar(20) NOT NULL,
+ `h` varchar(20) NOT NULL,
+ `dom` varchar(20) NOT NULL,
+ `mon` varchar(20) NOT NULL,
+ `dow` varchar(20) NOT NULL,
+ `command` text NOT NULL,
+ `remark` varchar(255) NOT NULL,
+ `type` varchar(20) NOT NULL,
+ `buildin` tinyint(1) NOT NULL DEFAULT '0',
+ `status` varchar(20) NOT NULL,
+ `lastTime` datetime NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `lastTime` (`lastTime`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_dept` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` char(60) NOT NULL,
+ `parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `path` char(255) NOT NULL DEFAULT '',
+ `grade` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `order` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `position` char(30) NOT NULL DEFAULT '',
+ `function` char(255) NOT NULL DEFAULT '',
+ `manager` char(30) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ KEY `parent` (`parent`),
+ KEY `path` (`path`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_doc` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL,
+ `project` mediumint(8) unsigned NOT NULL,
+ `lib` varchar(30) NOT NULL,
+ `module` varchar(30) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `keywords` varchar(255) NOT NULL,
+ `type` varchar(30) NOT NULL,
+ `views` smallint(5) unsigned NOT NULL,
+ `collector` text NOT NULL,
+ `addedBy` varchar(30) NOT NULL,
+ `addedDate` datetime NOT NULL,
+ `editedBy` varchar(30) NOT NULL,
+ `editedDate` datetime NOT NULL,
+ `acl` varchar(10) NOT NULL DEFAULT 'open',
+ `groups` varchar(255) NOT NULL,
+ `users` text NOT NULL,
+ `version` smallint(5) unsigned NOT NULL DEFAULT '1',
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `project` (`project`),
+ KEY `lib` (`lib`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_doccontent` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `doc` mediumint(8) unsigned NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `digest` varchar(255) NOT NULL,
+ `content` text NOT NULL,
+ `files` text NOT NULL,
+ `type` varchar(10) NOT NULL,
+ `version` smallint(5) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `doc_version` (`doc`,`version`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_doclib` (
+ `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `type` varchar(30) NOT NULL,
+ `product` mediumint(8) unsigned NOT NULL,
+ `project` mediumint(8) unsigned NOT NULL,
+ `name` varchar(60) NOT NULL,
+ `acl` varchar(10) NOT NULL DEFAULT 'open',
+ `groups` varchar(255) NOT NULL,
+ `users` text NOT NULL,
+ `main` enum('0','1') NOT NULL DEFAULT '0',
+ `collector` text NOT NULL,
+ `order` tinyint(5) unsigned NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `project` (`project`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_effort` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `user` char(30) NOT NULL DEFAULT '',
+ `todo` enum('1','0') NOT NULL DEFAULT '1',
+ `date` date NOT NULL,
+ `begin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `type` enum('1','2','3') NOT NULL DEFAULT '1',
+ `idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `name` char(30) NOT NULL DEFAULT '',
+ `desc` char(255) NOT NULL DEFAULT '',
+ `status` enum('1','2','3') NOT NULL DEFAULT '1',
+ PRIMARY KEY (`id`),
+ KEY `user` (`user`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `zt_entry` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(50) NOT NULL,
+ `account` varchar(30) NOT NULL DEFAULT '',
+ `code` varchar(20) NOT NULL,
+ `key` varchar(32) NOT NULL,
+ `ip` varchar(100) NOT NULL,
+ `desc` text NOT NULL,
+ `createdBy` varchar(30) NOT NULL,
+ `createdDate` datetime NOT NULL,
+ `calledTime` int(10) unsigned NOT NULL DEFAULT '0',
+ `editedBy` varchar(30) NOT NULL,
+ `editedDate` datetime NOT NULL,
+ `deleted` enum('0', '1') NOT NULL DEFAULT '0',
+ PRIMARY KEY `id` (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_extension` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(150) NOT NULL,
+ `code` varchar(30) NOT NULL,
+ `version` varchar(50) NOT NULL,
+ `author` varchar(100) NOT NULL,
+ `desc` text NOT NULL,
+ `license` text NOT NULL,
+ `type` varchar(20) NOT NULL DEFAULT 'extension',
+ `site` varchar(150) NOT NULL,
+ `zentaoCompatible` varchar(100) NOT NULL,
+ `installedTime` datetime NOT NULL,
+ `depends` varchar(100) NOT NULL,
+ `dirs` mediumtext NOT NULL,
+ `files` mediumtext NOT NULL,
+ `status` varchar(20) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `code` (`code`),
+ KEY `name` (`name`),
+ KEY `installedTime` (`installedTime`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_file` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `pathname` char(100) NOT NULL,
+ `title` char(255) NOT NULL,
+ `extension` char(30) NOT NULL,
+ `size` int(10) unsigned NOT NULL DEFAULT '0',
+ `objectType` char(30) NOT NULL,
+ `objectID` mediumint(9) NOT NULL,
+ `addedBy` char(30) NOT NULL DEFAULT '',
+ `addedDate` datetime NOT NULL,
+ `downloads` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `extra` varchar(255) NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `objectType` (`objectType`),
+ KEY `objectID` (`objectID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_group` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` char(30) NOT NULL,
+ `role` char(30) NOT NULL DEFAULT '',
+ `desc` char(255) NOT NULL DEFAULT '',
+ `acl` text,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_grouppriv` (
+ `group` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `module` char(30) NOT NULL DEFAULT '',
+ `method` char(30) NOT NULL DEFAULT '',
+ UNIQUE KEY `group` (`group`,`module`,`method`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_history` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `action` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `field` varchar(30) NOT NULL DEFAULT '',
+ `old` text NOT NULL,
+ `new` text NOT NULL,
+ `diff` mediumtext NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `action` (`action`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_lang` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `lang` varchar(30) NOT NULL,
+ `module` varchar(30) NOT NULL,
+ `section` varchar(30) NOT NULL,
+ `key` varchar(60) NOT NULL,
+ `value` text NOT NULL,
+ `system` enum('0','1') NOT NULL DEFAULT '1',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_log` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `objectType` varchar(30) NOT NULL,
+ `objectID` mediumint(8) unsigned NOT NULL,
+ `action` mediumint(8) unsigned NOT NULL,
+ `date` datetime NOT NULL,
+ `url` varchar(255) NOT NULL,
+ `contentType` varchar(30) NOT NULL,
+ `data` text NOT NULL,
+ `result` text NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `objectType` (`objectType`),
+ KEY `obejctID` (`objectID`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_module` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `root` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `name` char(60) NOT NULL DEFAULT '',
+ `parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `path` char(255) NOT NULL DEFAULT '',
+ `grade` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `order` smallint(5) unsigned NOT NULL DEFAULT '0',
+ `type` char(30) NOT NULL,
+ `owner` varchar(30) NOT NULL,
+ `collector` text NOT NULL,
+ `short` varchar(30) NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `root` (`root`),
+ KEY `type` (`type`),
+ KEY `path` (`path`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_notify` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `objectType` varchar(50) NOT NULL,
+ `objectID` mediumint(8) unsigned NOT NULL,
+ `action` mediumint(9) NOT NULL,
+ `toList` varchar(255) NOT NULL,
+ `ccList` text NOT NULL,
+ `subject` varchar(255) NOT NULL,
+ `data` text NOT NULL,
+ `createdBy` char(30) NOT NULL,
+ `createdDate` datetime NOT NULL,
+ `sendTime` datetime NOT NULL,
+ `status` varchar(10) NOT NULL DEFAULT 'wait',
+ `failReason` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_product` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(90) NOT NULL,
+ `code` varchar(45) NOT NULL,
+ `line` mediumint(8) NOT NULL,
+ `type` varchar(30) NOT NULL DEFAULT 'normal',
+ `status` varchar(30) NOT NULL DEFAULT '',
+ `desc` text NOT NULL,
+ `PO` varchar(30) NOT NULL,
+ `QD` varchar(30) NOT NULL,
+ `RD` varchar(30) NOT NULL,
+ `acl` enum('open','private','custom') NOT NULL DEFAULT 'open',
+ `whitelist` text NOT NULL,
+ `createdBy` varchar(30) NOT NULL,
+ `createdDate` datetime NOT NULL,
+ `createdVersion` varchar(20) NOT NULL,
+ `order` mediumint(8) unsigned NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `order` (`order`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_productplan` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL,
+ `branch` mediumint(8) unsigned NOT NULL,
+ `parent` mediumint(9) NOT NULL DEFAULT '0',
+ `title` varchar(90) NOT NULL,
+ `desc` text NOT NULL,
+ `begin` date NOT NULL,
+ `end` date NOT NULL,
+ `order` text NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `end` (`end`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_project` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `isCat` enum('1','0') NOT NULL DEFAULT '0',
+ `catID` mediumint(8) unsigned NOT NULL,
+ `type` varchar(20) NOT NULL DEFAULT 'sprint',
+ `parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `name` varchar(90) NOT NULL,
+ `code` varchar(45) NOT NULL,
+ `begin` date NOT NULL,
+ `end` date NOT NULL,
+ `days` smallint(5) unsigned NOT NULL,
+ `status` varchar(10) NOT NULL,
+ `statge` enum('1','2','3','4','5') NOT NULL DEFAULT '1',
+ `pri` enum('1','2','3','4') NOT NULL DEFAULT '1',
+ `desc` text NOT NULL,
+ `openedBy` varchar(30) NOT NULL DEFAULT '',
+ `openedDate` datetime NOT NULL,
+ `openedVersion` varchar(20) NOT NULL,
+ `closedBy` varchar(30) NOT NULL DEFAULT '',
+ `closedDate` datetime NOT NULL,
+ `canceledBy` varchar(30) NOT NULL DEFAULT '',
+ `canceledDate` datetime NOT NULL,
+ `PO` varchar(30) NOT NULL DEFAULT '',
+ `PM` varchar(30) NOT NULL DEFAULT '',
+ `QD` varchar(30) NOT NULL DEFAULT '',
+ `RD` varchar(30) NOT NULL DEFAULT '',
+ `team` varchar(90) NOT NULL,
+ `acl` enum('open','private','custom') NOT NULL DEFAULT 'open',
+ `whitelist` text NOT NULL,
+ `order` mediumint(8) unsigned NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `parent` (`parent`),
+ KEY `begin` (`begin`),
+ KEY `end` (`end`),
+ KEY `status` (`status`),
+ KEY `order` (`order`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_projectproduct` (
+ `project` mediumint(8) unsigned NOT NULL,
+ `product` mediumint(8) unsigned NOT NULL,
+ `branch` mediumint(8) unsigned NOT NULL,
+ `plan` mediumint(8) unsigned NOT NULL,
+ PRIMARY KEY (`project`,`product`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_projectstory` (
+ `project` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `product` mediumint(8) unsigned NOT NULL,
+ `story` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `version` smallint(6) NOT NULL DEFAULT '1',
+ `order` smallint(6) unsigned NOT NULL,
+ UNIQUE KEY `project` (`project`,`story`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_release` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `build` mediumint(8) unsigned NOT NULL,
+ `name` varchar(255) NOT NULL DEFAULT '',
+ `marker` enum('0','1') NOT NULL DEFAULT '0',
+ `date` date NOT NULL,
+ `stories` text NOT NULL,
+ `bugs` text NOT NULL,
+ `leftBugs` text NOT NULL,
+ `desc` text NOT NULL,
+ `status` varchar(20) NOT NULL DEFAULT 'normal',
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `build` (`build`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_score` (
+ `id` bigint(12) unsigned NOT NULL AUTO_INCREMENT,
+ `account` varchar(30) NOT NULL,
+ `module` varchar(30) NOT NULL DEFAULT '',
+ `method` varchar(30) NOT NULL,
+ `desc` varchar(250) NOT NULL DEFAULT '',
+ `before` int(11) NOT NULL DEFAULT '0',
+ `score` int(11) NOT NULL DEFAULT '0',
+ `after` int(11) NOT NULL DEFAULT '0',
+ `time` datetime NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `account` (`account`),
+ KEY `model` (`module`),
+ KEY `method` (`method`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `zt_story` (
+ `id` mediumint(8) unsigned NOT NULL auto_increment,
+ `product` mediumint(8) unsigned NOT NULL default '0',
+ `branch` mediumint(8) unsigned NOT NULL default '0',
+ `module` mediumint(8) unsigned NOT NULL default '0',
+ `plan` text,
+ `source` varchar(20) NOT NULL,
+ `sourceNote` varchar(255) NOT NULL,
+ `fromBug` mediumint(8) unsigned NOT NULL default '0',
+ `title` varchar(255) NOT NULL,
+ `keywords` varchar(255) NOT NULL,
+ `type` varchar(30) NOT NULL default '',
+ `pri` tinyint(3) unsigned NOT NULL default '3',
+ `estimate` float unsigned NOT NULL,
+ `status` enum('','changed','active','draft','closed') NOT NULL default '',
+ `color` char(7) NOT NULL,
+ `stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released', 'closed') NOT NULL DEFAULT 'wait',
+ `stagedBy` char(30) NOT NULL,
+ `mailto` text,
+ `openedBy` varchar(30) NOT NULL default '',
+ `openedDate` datetime NOT NULL,
+ `assignedTo` varchar(30) NOT NULL default '',
+ `assignedDate` datetime NOT NULL,
+ `lastEditedBy` varchar(30) NOT NULL default '',
+ `lastEditedDate` datetime NOT NULL,
+ `reviewedBy` varchar(255) NOT NULL,
+ `reviewedDate` date NOT NULL,
+ `closedBy` varchar(30) NOT NULL default '',
+ `closedDate` datetime NOT NULL,
+ `closedReason` varchar(30) NOT NULL,
+ `toBug` mediumint(8) unsigned NOT NULL,
+ `childStories` varchar(255) NOT NULL,
+ `linkStories` varchar(255) NOT NULL,
+ `duplicateStory` mediumint(8) unsigned NOT NULL,
+ `version` smallint(6) NOT NULL default '1',
+ `deleted` enum('0','1') NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `status` (`status`),
+ KEY `assignedTo` (`assignedTo`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_storyspec` (
+ `story` mediumint(9) NOT NULL,
+ `version` smallint(6) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `spec` text NOT NULL,
+ `verify` text NOT NULL,
+ UNIQUE KEY `story` (`story`,`version`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `zt_storystage` (
+ `story` mediumint(8) unsigned NOT NULL,
+ `branch` mediumint(8) unsigned NOT NULL,
+ `stage` varchar(50) NOT NULL,
+ `stagedBy` char(30) NOT NULL,
+ UNIQUE KEY `story_branch` (`story`,`branch`),
+ KEY `story` (`story`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_suitecase` (
+ `suite` mediumint(8) unsigned NOT NULL,
+ `product` mediumint(8) unsigned NOT NULL,
+ `case` mediumint(8) unsigned NOT NULL,
+ `version` smallint(5) unsigned NOT NULL,
+ UNIQUE KEY `suitecase` (`suite`,`case`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_task` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `parent` mediumint(8) NOT NULL DEFAULT '0',
+ `project` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `module` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `story` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `storyVersion` smallint(6) NOT NULL DEFAULT '1',
+ `fromBug` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `name` varchar(255) NOT NULL,
+ `type` varchar(20) NOT NULL,
+ `pri` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `estimate` float unsigned NOT NULL,
+ `consumed` float unsigned NOT NULL,
+ `left` float unsigned NOT NULL,
+ `deadline` date NOT NULL,
+ `status` enum('wait','doing','done','pause','cancel','closed') NOT NULL DEFAULT 'wait',
+ `color` char(7) NOT NULL,
+ `mailto` text,
+ `desc` text NOT NULL,
+ `openedBy` varchar(30) NOT NULL,
+ `openedDate` datetime NOT NULL,
+ `assignedTo` varchar(30) NOT NULL,
+ `assignedDate` datetime NOT NULL,
+ `estStarted` date NOT NULL,
+ `realStarted` date NOT NULL,
+ `finishedBy` varchar(30) NOT NULL,
+ `finishedDate` datetime NOT NULL,
+ `finishedList` text NOT NULL,
+ `canceledBy` varchar(30) NOT NULL,
+ `canceledDate` datetime NOT NULL,
+ `closedBy` varchar(30) NOT NULL,
+ `closedDate` datetime NOT NULL,
+ `closedReason` varchar(30) NOT NULL,
+ `lastEditedBy` varchar(30) NOT NULL,
+ `lastEditedDate` datetime NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `project` (`project`),
+ KEY `story` (`story`),
+ KEY `assignedTo` (`assignedTo`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_taskestimate` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `task` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `date` date NOT NULL,
+ `left` float unsigned NOT NULL DEFAULT '0',
+ `consumed` float unsigned NOT NULL,
+ `account` char(30) NOT NULL DEFAULT '',
+ `work` text,
+ PRIMARY KEY (`id`),
+ KEY `task` (`task`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_team` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `root` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `type` enum('project','task') NOT NULL DEFAULT 'project',
+ `account` char(30) NOT NULL DEFAULT '',
+ `role` char(30) NOT NULL DEFAULT '',
+ `limited` char(8) NOT NULL DEFAULT 'no',
+ `join` date NOT NULL DEFAULT '0000-00-00',
+ `days` smallint(5) unsigned NOT NULL,
+ `hours` float(2,1) unsigned NOT NULL DEFAULT '0.0',
+ `estimate` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
+ `consumed` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
+ `left` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
+ `order` tinyint(3) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `team` (`root`,`type`,`account`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_testreport` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL,
+ `project` mediumint(8) unsigned NOT NULL,
+ `tasks` varchar(255) NOT NULL,
+ `builds` varchar(255) NOT NULL,
+ `title` varchar(255) NOT NULL,
+ `begin` date NOT NULL,
+ `end` date NOT NULL,
+ `owner` char(30) NOT NULL,
+ `members` text NOT NULL,
+ `stories` text NOT NULL,
+ `bugs` text NOT NULL,
+ `cases` text NOT NULL,
+ `report` text NOT NULL,
+ `objectType` varchar(20) NOT NULL,
+ `objectID` mediumint(8) unsigned NOT NULL,
+ `createdBy` char(30) NOT NULL,
+ `createdDate` datetime NOT NULL,
+ `deleted` enum('0','1') NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_testresult` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `run` mediumint(8) unsigned NOT NULL,
+ `case` mediumint(8) unsigned NOT NULL,
+ `version` smallint(5) unsigned NOT NULL,
+ `caseResult` char(30) NOT NULL,
+ `stepResults` text NOT NULL,
+ `lastRunner` varchar(30) NOT NULL,
+ `date` datetime NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `case` (`case`),
+ KEY `version` (`version`),
+ KEY `run` (`run`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_testrun` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `task` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `case` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `version` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `assignedTo` char(30) NOT NULL DEFAULT '',
+ `lastRunner` varchar(30) NOT NULL,
+ `lastRunDate` datetime NOT NULL,
+ `lastRunResult` char(30) NOT NULL,
+ `status` char(30) NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `task` (`task`,`case`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_testsuite` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `product` mediumint(8) unsigned NOT NULL,
+ `name` varchar(255) NOT NULL,
+ `desc` text NOT NULL,
+ `type` varchar(20) NOT NULL,
+ `addedBy` char(30) NOT NULL,
+ `addedDate` datetime NOT NULL,
+ `lastEditedBy` char(30) NOT NULL,
+ `lastEditedDate` datetime NOT NULL,
+ `deleted` enum('0','1') NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_testtask` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` char(90) NOT NULL,
+ `product` mediumint(8) unsigned NOT NULL,
+ `project` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `build` char(30) NOT NULL,
+ `owner` varchar(30) NOT NULL,
+ `pri` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `begin` date NOT NULL,
+ `end` date NOT NULL,
+ `mailto` text,
+ `desc` text NOT NULL,
+ `report` text NOT NULL,
+ `status` enum('blocked','doing','wait','done') NOT NULL DEFAULT 'wait',
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `product` (`product`),
+ KEY `build` (`build`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_todo` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `date` date NOT NULL,
+ `begin` smallint(4) unsigned zerofill NOT NULL,
+ `end` smallint(4) unsigned zerofill NOT NULL,
+ `type` char(10) NOT NULL,
+ `cycle` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `pri` tinyint(3) unsigned NOT NULL,
+ `name` char(150) NOT NULL,
+ `desc` text NOT NULL,
+ `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait',
+ `private` tinyint(1) NOT NULL,
+ `config` varchar(255) NOT NULL,
+ `assignedTo` varchar(30) NOT NULL DEFAULT '',
+ `assignedBy` varchar(30) NOT NULL DEFAULT '',
+ `assignedDate` datetime NOT NULL,
+ `finishedBy` varchar(30) NOT NULL DEFAULT '',
+ `finishedDate` datetime NOT NULL,
+ `closedBy` varchar(30) NOT NULL DEFAULT '',
+ `closedDate` datetime NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `account` (`account`),
+ KEY `assignedTo` (`assignedTo`),
+ KEY `finishedBy` (`finishedBy`),
+ KEY `date` (`date`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_user` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `dept` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `account` char(30) NOT NULL DEFAULT '',
+ `password` char(32) NOT NULL DEFAULT '',
+ `role` char(10) NOT NULL DEFAULT '',
+ `realname` varchar(100) NOT NULL DEFAULT '',
+ `nickname` char(60) NOT NULL DEFAULT '',
+ `commiter` varchar(100) NOT NULL,
+ `avatar` char(30) NOT NULL DEFAULT '',
+ `birthday` date NOT NULL DEFAULT '0000-00-00',
+ `gender` enum('f','m') NOT NULL DEFAULT 'f',
+ `email` char(90) NOT NULL DEFAULT '',
+ `skype` char(90) NOT NULL DEFAULT '',
+ `qq` char(20) NOT NULL DEFAULT '',
+ `mobile` char(11) NOT NULL DEFAULT '',
+ `phone` char(20) NOT NULL DEFAULT '',
+ `weixin` varchar(90) NOT NULL DEFAULT '',
+ `dingding` varchar(90) NOT NULL DEFAULT '',
+ `slack` varchar(90) NOT NULL DEFAULT '',
+ `whatsapp` varchar(90) NOT NULL DEFAULT '',
+ `address` char(120) NOT NULL DEFAULT '',
+ `zipcode` char(10) NOT NULL DEFAULT '',
+ `join` date NOT NULL DEFAULT '0000-00-00',
+ `visits` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ `ip` char(15) NOT NULL DEFAULT '',
+ `last` int(10) unsigned NOT NULL DEFAULT '0',
+ `fails` tinyint(5) NOT NULL DEFAULT '0',
+ `locked` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ranzhi` char(30) NOT NULL DEFAULT '',
+ `score` int(11) NOT NULL DEFAULT '0',
+ `scoreLevel` int(11) NOT NULL DEFAULT '0',
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `account` (`account`),
+ KEY `dept` (`dept`),
+ KEY `email` (`email`),
+ KEY `commiter` (`commiter`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_usercontact` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `listName` varchar(60) NOT NULL,
+ `userList` text NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `account` (`account`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_usergroup` (
+ `account` char(30) NOT NULL DEFAULT '',
+ `group` mediumint(8) unsigned NOT NULL DEFAULT '0',
+ UNIQUE KEY `account` (`account`,`group`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_userquery` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `module` varchar(30) NOT NULL,
+ `title` varchar(90) NOT NULL,
+ `form` text NOT NULL,
+ `sql` text NOT NULL,
+ `shortcut` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `account` (`account`),
+ KEY `module` (`module`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_usertpl` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `type` char(30) NOT NULL,
+ `title` varchar(150) NOT NULL,
+ `content` text NOT NULL,
+ `public` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `account` (`account`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_userview` (
+ `account` char(30) NOT NULL,
+ `products` mediumtext NOT NULL,
+ `projects` mediumtext NOT NULL,
+ UNIQUE KEY `account` (`account`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_webhook` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `type` varchar(10) NOT NULL DEFAULT 'default',
+ `name` varchar(50) NOT NULL,
+ `url` varchar(255) NOT NULL,
+ `domain` varchar(255) NOT NULL,
+ `contentType` varchar(30) NOT NULL DEFAULT 'application/json',
+ `sendType` enum('sync','async') NOT NULL DEFAULT 'sync',
+ `products` text NOT NULL,
+ `projects` text NOT NULL,
+ `params` varchar(100) NOT NULL,
+ `actions` text NOT NULL,
+ `desc` text NOT NULL,
+ `createdBy` varchar(30) NOT NULL,
+ `createdDate` datetime NOT NULL,
+ `editedBy` varchar(30) NOT NULL,
+ `editedDate` datetime NOT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/db/update11.4.1.sql b/db/update11.4.1.sql
new file mode 100644
index 0000000000..5f456e6cf6
--- /dev/null
+++ b/db/update11.4.1.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `zt_entry` ADD `calledTime` int(10) unsigned NOT NULL DEFAULT '0' AFTER `createdDate`;
+ALTER TABLE `zt_story` CHANGE `toBug` `toBug` mediumint(8) unsigned NOT NULL AFTER `closedReason`;
+UPDATE `zt_story` SET `stage` = 'closed' WHERE `status` = 'closed';
+ALTER TABLE `zt_story` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `stage`;
+ALTER TABLE `zt_storystage` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL;
diff --git a/db/zentao.sql b/db/zentao.sql
index 6f1175eb92..046cb8230a 100644
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -567,6 +567,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
`status` enum('','changed','active','draft','closed') NOT NULL default '',
`color` char(7) NOT NULL,
`stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released', 'closed') NOT NULL DEFAULT 'wait',
+ `stagedBy` char(30) NOT NULL,
`mailto` text,
`openedBy` varchar(30) NOT NULL default '',
`openedDate` datetime NOT NULL,
@@ -579,7 +580,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
`closedBy` varchar(30) NOT NULL default '',
`closedDate` datetime NOT NULL,
`closedReason` varchar(30) NOT NULL,
- `toBug` mediumint(9) NOT NULL,
+ `toBug` mediumint(8) unsigned NOT NULL,
`childStories` varchar(255) NOT NULL,
`linkStories` varchar(255) NOT NULL,
`duplicateStory` mediumint(8) unsigned NOT NULL,
@@ -604,6 +605,8 @@ CREATE TABLE IF NOT EXISTS `zt_storystage` (
`story` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`stage` varchar(50) NOT NULL,
+ `stagedBy` char(30) NOT NULL,
+ UNIQUE KEY `story_branch` (`story`,`branch`),
KEY `story` (`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_suitecase`;
@@ -899,6 +902,7 @@ CREATE TABLE IF NOT EXISTS `zt_entry` (
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
+ `calledTime` int(10) unsigned NOT NULL DEFAULT '0',
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0', '1') NOT NULL DEFAULT '0',
diff --git a/doc/CHANGELOG b/doc/CHANGELOG
index 293cc42f50..19c85fcc6c 100644
--- a/doc/CHANGELOG
+++ b/doc/CHANGELOG
@@ -1,3 +1,41 @@
+2019-05-08 11.5.stable
+完成的需求:
+3505 产品和项目增加填写备注功能
+3557 增加动态的显示内容的过滤功能
+3602 xxb代码独立,调整禅道集成喧喧的代码
+3608 优化多平台下面的排版
+3612 打开首次登录修改密码后,使用客户端可以正常登录禅道
+3627 调整接口的调用逻辑
+3637 计划关联需求时弹窗里面的按钮保持居中对齐
+3638 创建需求时的优先级按照1234的顺序排列
+3639 创建操作增加类似提bug页面的模板功能
+3640 创建文档的时候增加动作记录,记录上传附件的动作,记录上传者和文件名
+3650 需求复制页面不要弹窗
+3652 调整Bug添加页面操作系统控件的宽度
+3656 更改禅道登录页的PMS 英文
+3664 多人任务的工时计算逻辑需要调整
+3668 任务详情页面增加创建子任务的链接
+3669 父子任务间关联、取消动作记录到父任务历史记录中
+3672 子任务维护的内容可以在父任务显示
+修复的bug:
+2432 官方docker镜像启动问题
+2470 测试管理方式创建项目版本功能异常
+2479 项目激活顺延任务的起止日期不生效
+2489 对客户端中消息直接创建需求,需求来源选择不上
+2490 产品项目编辑修改新负责人无法访问产品项目
+2491 后台下载喧喧服务端和下载配置文件没有反应
+2492 测试单报表统计问题
+2493 禅道无法记录客户端日志信息
+2494 去掉后台"捐助我们"的入口
+2495 源码安装mysql8报错
+2496 取消路线图权限后,还是在可以在产品概况页面看到
+2497 zbox中的数据库adminer访问存在问题
+2501 报表默认显示功能异常
+2505 bug统计报表问题
+2506 版本关联需求页面搜索会显示已经关联的需求页面
+2510 待办添加备注后,窗口关闭按钮消失
+2512 需求批量编辑状态不生效
+
2019-03-25 11.4.1
完善细节,修复bug。
完成相关调整支持专业版里相关功能。
diff --git a/framework/control.class.php b/framework/control.class.php
index 7d90e848c1..0415ebb1ab 100644
--- a/framework/control.class.php
+++ b/framework/control.class.php
@@ -41,7 +41,7 @@ class control extends baseControl
$mainViewFile = $modulePath . 'view' . DS . $this->devicePrefix . $methodName . '.' . $viewType . '.php';
/* If the main view file doesn't exist, set the device prefix to empty and reset the main view file. */
- if(!file_exists($mainViewFile))
+ if(!file_exists($mainViewFile) and $this->app->clientDevice != 'mobile')
{
$originalPrefix = $this->devicePrefix;
$this->devicePrefix = '';
@@ -60,15 +60,7 @@ class control extends baseControl
$viewFile = (!empty($siteExtViewFile) and file_exists($siteExtViewFile)) ? $siteExtViewFile : $viewFile;
if(!is_file($viewFile))
{
- if($this->config->debug === false)
- {
- die(js::locate($this->createLink('misc','ajaxerror', ".mhtml"), 'parent'));
- }
- else
- {
- $this->app->triggerError("the view file $viewFile not found", __FILE__, __LINE__, $exit = true);
- }
-
+ die(js::error($this->lang->notPage) . js::locate('back'));
}
$commonExtHookFiles = glob($viewExtPath['common'] . $this->devicePrefix . $methodName . ".*.{$viewType}.hook.php");
diff --git a/module/action/lang/en.php b/module/action/lang/en.php
index 85eab81095..6f000e475e 100755
--- a/module/action/lang/en.php
+++ b/module/action/lang/en.php
@@ -32,7 +32,7 @@ $lang->action->trashTips = 'Note: Delete in ZenTao is logic.';
$lang->action->textDiff = 'Text Format';
$lang->action->original = 'Original Format';
$lang->action->confirmHideAll = 'Do you want to hide all the records?';
-$lang->action->needEdit = '%s that you want to restore exists. Please edit it.';
+$lang->action->needEdit = '%s that you want to restore. Please edit it.';
$lang->action->historyEdit = 'The history EditBy cannot be empty.';
$lang->action->noDynamic = 'No dynamics. ';
@@ -41,7 +41,7 @@ $lang->action->history->action = 'Link';
$lang->action->history->field = 'Field';
$lang->action->history->old = 'Old value';
$lang->action->history->new = 'New value';
-$lang->action->history->diff = 'Diff';
+$lang->action->history->diff = 'Compare';
$lang->action->dynamic = new stdclass();
$lang->action->dynamic->today = 'Today';
@@ -77,7 +77,7 @@ $lang->action->objectTypes['stepresult'] = 'Case Steps';
$lang->action->objectTypes['testtask'] = 'Test Build';
$lang->action->objectTypes['user'] = 'User';
$lang->action->objectTypes['doc'] = 'Doc';
-$lang->action->objectTypes['doclib'] = 'Doc Lib';
+$lang->action->objectTypes['doclib'] = 'Doc Library';
$lang->action->objectTypes['todo'] = 'Todo';
$lang->action->objectTypes['branch'] = 'Branch';
$lang->action->objectTypes['module'] = 'Module';
@@ -129,9 +129,17 @@ $lang->action->desc->diff2 = '
%s is changed. Th
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
$lang->action->desc->linked2bug = '$date Linked to
$extra by
$actor';
+/* 子任务修改父任务的历史操作记录 */
+$lang->action->desc->createchildren = '$date,
$actor created a Child Task
$extra。' . "\n";
+$lang->action->desc->linkchildtask = '$date,
$actor linked a Child Task
$extra。' . "\n";
+$lang->action->desc->linkchildtask = '$date,
$actor linked a Child Task
$extra。' . "\n";
+$lang->action->desc->unlinkchildrentask = '$date,
$actor unlinked a Child Task
$extra。' . "\n";
+$lang->action->desc->linkparenttask = '$date,
$actor linked to a Parent Task
$extra。' . "\n";
+$lang->action->desc->unlinkparenttask = '$date,
$actor unlinked a Parent Task
$extra。' . "\n";
+
/* 关联用例和移除用例时的历史操作记录。*/
-$lang->action->desc->linkrelatedcase = '$date,
$actor linked to use case
$extra.' . "\n";
-$lang->action->desc->unlinkrelatedcase = '$date,
$actor unlinked use case
$extra.' . "\n";
+$lang->action->desc->linkrelatedcase = '$date,
$actor linked a Use Case
$extra.' . "\n";
+$lang->action->desc->unlinkrelatedcase = '$date,
$actor unlinked a Use Case
$extra.' . "\n";
/* 用来显示动态信息。*/
$lang->action->label = new stdclass();
@@ -150,34 +158,34 @@ $lang->action->label->hidden = 'hid ';
$lang->action->label->commented = 'commented ';
$lang->action->label->activated = 'activated ';
$lang->action->label->blocked = 'blocked ';
-$lang->action->label->resolved = 'resolved ';
+$lang->action->label->resolved = 'solved ';
$lang->action->label->reviewed = 'reviewed ';
$lang->action->label->moved = 'moved ';
-$lang->action->label->confirmed = 'Confirmed Story';
-$lang->action->label->bugconfirmed = 'Confirmed';
-$lang->action->label->tostory = 'Convert to Story';
+$lang->action->label->confirmed = 'confirmed Story';
+$lang->action->label->bugconfirmed = 'confirmed';
+$lang->action->label->tostory = 'converted to Story';
$lang->action->label->frombug = 'Converted from Bug';
-$lang->action->label->fromlib = 'Import from library';
-$lang->action->label->totask = 'Convert to Task';
-$lang->action->label->svncommited = 'SVN Commit';
-$lang->action->label->gitcommited = 'Git Commit';
-$lang->action->label->linked2plan = 'Link to Plan';
-$lang->action->label->unlinkedfromplan = 'Unlink';
-$lang->action->label->changestatus = 'Change Status';
+$lang->action->label->fromlib = 'imported from Library';
+$lang->action->label->totask = 'converted to Task';
+$lang->action->label->svncommited = 'SVN committed';
+$lang->action->label->gitcommited = 'Git committed';
+$lang->action->label->linked2plan = 'linked to Plan';
+$lang->action->label->unlinkedfromplan = 'unlinked from';
+$lang->action->label->changestatus = 'changed Status';
$lang->action->label->marked = 'marked';
-$lang->action->label->linked2project = "Link {$lang->projectCommon}";
-$lang->action->label->unlinkedfromproject = "Unlink {$lang->projectCommon}";
-$lang->action->label->unlinkedfrombuild = "Unlink Build";
-$lang->action->label->linked2release = "Link Release";
-$lang->action->label->unlinkedfromrelease = "Unlink Release";
-$lang->action->label->linkrelatedbug = "Linked Bug";
-$lang->action->label->unlinkrelatedbug = "Unlinked Bug";
-$lang->action->label->linkrelatedcase = "Linked Case";
-$lang->action->label->unlinkrelatedcase = "Unlinked Case";
-$lang->action->label->linkrelatedstory = "Linked Story";
-$lang->action->label->unlinkrelatedstory = "Unlinked Story";
-$lang->action->label->subdividestory = "Decomposed Story";
-$lang->action->label->unlinkchildstory = "Unlinked Story";
+$lang->action->label->linked2project = "link {$lang->projectCommon}";
+$lang->action->label->unlinkedfromproject = "unlink {$lang->projectCommon}";
+$lang->action->label->unlinkedfrombuild = "unlink Build";
+$lang->action->label->linked2release = "link Release";
+$lang->action->label->unlinkedfromrelease = "unlink Release";
+$lang->action->label->linkrelatedbug = "linked Bug";
+$lang->action->label->unlinkrelatedbug = "unlinked Bug";
+$lang->action->label->linkrelatedcase = "linked Case";
+$lang->action->label->unlinkrelatedcase = "unlinked Case";
+$lang->action->label->linkrelatedstory = "linked Story";
+$lang->action->label->unlinkrelatedstory = "unlinked Story";
+$lang->action->label->subdividestory = "decomposed Story";
+$lang->action->label->unlinkchildstory = "unlinked Story";
$lang->action->label->started = 'started ';
$lang->action->label->restarted = 'continued ';
$lang->action->label->recordestimate = 'recorded ';
@@ -188,11 +196,166 @@ $lang->action->label->paused = 'paused ';
$lang->action->label->verified = 'verified ';
$lang->action->label->delayed = 'delayed ';
$lang->action->label->suspended = 'suspended ';
-$lang->action->label->login = 'Login';
-$lang->action->label->logout = "Logout";
+$lang->action->label->login = 'log in';
+$lang->action->label->logout = "log out";
$lang->action->label->deleteestimate = "deleted ";
$lang->action->label->linked2build = "linked ";
$lang->action->label->linked2bug = "linked ";
+$lang->action->label->linkchildtask = "linked a child task";
+$lang->action->label->unlinkchildrentask = "unlinked a child task";
+$lang->action->label->linkparenttask = "linked a parent task";
+$lang->action->label->unlinkparenttask = "unlink from parent task";
+$lang->action->label->batchcreate = "batch created tasks";
+$lang->action->label->createchildren = "create children task";
+$lang->action->label->managed = "managed";
+
+/* 动态信息按照对象分组 */
+$lang->action->dynamicAction = new stdclass;
+$lang->action->dynamicAction->todo['opened'] = 'Create Todo';
+$lang->action->dynamicAction->todo['edited'] = 'Edit Todo';
+$lang->action->dynamicAction->todo['erased'] = 'Delete Todo';
+$lang->action->dynamicAction->todo['finished'] = 'Finish Todo';
+$lang->action->dynamicAction->todo['activated'] = 'Activate Todo';
+$lang->action->dynamicAction->todo['closed'] = 'Close Todo';
+$lang->action->dynamicAction->todo['deleted'] = 'Delete Todo';
+$lang->action->dynamicAction->todo['assigned'] = 'Assign Todo';
+$lang->action->dynamicAction->todo['undeleted'] = 'Restore Todo';
+$lang->action->dynamicAction->todo['hidden'] = 'Hide Todo';
+
+$lang->action->dynamicAction->product['opened'] = 'Create ' . $lang->productCommon;
+$lang->action->dynamicAction->product['edited'] = 'Edit ' . $lang->productCommon;
+$lang->action->dynamicAction->product['deleted'] = 'Delete ' . $lang->productCommon;
+$lang->action->dynamicAction->product['closed'] = 'Close ' . $lang->productCommon;
+$lang->action->dynamicAction->product['undeleted'] = 'Restore ' . $lang->productCommon;
+$lang->action->dynamicAction->product['hidden'] = 'Hide ' . $lang->productCommon;
+$lang->action->dynamicAction->productplan['opened'] = 'Create Plan';
+$lang->action->dynamicAction->productplan['edited'] = 'Edit Plan';
+$lang->action->dynamicAction->release['opened'] = 'Create Release';
+$lang->action->dynamicAction->release['edited'] = 'Edit Release';
+$lang->action->dynamicAction->release['changestatus'] = 'Change 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';
+$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->project['opened'] = 'Create ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['edited'] = 'Edit ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['deleted'] = 'Delete ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['started'] = 'Start ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['delayed'] = 'Delay ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['suspended'] = 'Suspend ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['activated'] = 'Activate ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['closed'] = 'Close ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['managed'] = 'Manage ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['undeleted'] = 'Restore ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['hidden'] = 'Hide ' . $lang->projectCommon;
+$lang->action->dynamicAction->project['moved'] = 'Improt Task';
+$lang->action->dynamicAction->task['opened'] = 'Create Task';
+$lang->action->dynamicAction->task['edited'] = 'Edit Task';
+$lang->action->dynamicAction->task['commented'] = 'Task Comment';
+$lang->action->dynamicAction->task['assigned'] = 'Assign Task';
+$lang->action->dynamicAction->task['confirmed'] = 'Confirm Task';
+$lang->action->dynamicAction->task['started'] = 'Start Task';
+$lang->action->dynamicAction->task['finished'] = 'Finish Task';
+$lang->action->dynamicAction->task['recordestimate'] = 'Add Estimates';
+$lang->action->dynamicAction->task['editestimate'] = 'Edit Estimates';
+$lang->action->dynamicAction->task['deleteestimate'] = 'Delete Estimates';
+$lang->action->dynamicAction->task['paused'] = 'Pause Task';
+$lang->action->dynamicAction->task['closed'] = 'Close Task';
+$lang->action->dynamicAction->task['canceled'] = 'Cancel Task';
+$lang->action->dynamicAction->task['activated'] = 'Activate Task';
+$lang->action->dynamicAction->task['createchildren'] = 'Create Child Task';
+$lang->action->dynamicAction->task['unlinkparenttask'] = 'Unlink Parent Task';
+$lang->action->dynamicAction->task['linkparenttask'] = 'Link Parent Task';
+$lang->action->dynamicAction->task['linkchildtask'] = 'Link Child Task';
+$lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
+$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
+$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
+$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
+$lang->action->dynamicAction->build['opened'] = 'Create Build';
+$lang->action->dynamicAction->build['edited'] = 'Edit Build';
+
+$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
+$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
+$lang->action->dynamicAction->bug['activated'] = 'Activate Bug';
+$lang->action->dynamicAction->bug['assigned'] = 'Assign Bug';
+$lang->action->dynamicAction->bug['closed'] = 'Close Bug';
+$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug';
+$lang->action->dynamicAction->bug['resolved'] = 'Solve Bug';
+$lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug';
+$lang->action->dynamicAction->bug['hidden'] = 'Hide Bug';
+$lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change';
+$lang->action->dynamicAction->bug['tostory'] = 'Convert to Story';
+$lang->action->dynamicAction->bug['totask'] = 'Convert to Task';
+$lang->action->dynamicAction->bug['linked2plan'] = 'Link Plan';
+$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Unlink Plan';
+$lang->action->dynamicAction->bug['linked2release'] = 'Link Release';
+$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Unlink Plan';
+$lang->action->dynamicAction->bug['linked2bug'] = 'Link Build';
+$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Unlink Build';
+$lang->action->dynamicAction->testtask['opened'] = 'Create Case';
+$lang->action->dynamicAction->testtask['edited'] = 'Edit Case';
+$lang->action->dynamicAction->testtask['started'] = 'Start Case';
+$lang->action->dynamicAction->testtask['activated'] = 'Activate Case';
+$lang->action->dynamicAction->testtask['closed'] = 'Close Case';
+$lang->action->dynamicAction->testtask['blocked'] = 'Blocked Case';
+$lang->action->dynamicAction->case['opened'] = 'Create Case';
+$lang->action->dynamicAction->case['edited'] = 'Edit Case';
+$lang->action->dynamicAction->case['deleted'] = 'Delete Case';
+$lang->action->dynamicAction->case['undeleted'] = 'Restore Case';
+$lang->action->dynamicAction->case['hidden'] = 'Hide Case';
+$lang->action->dynamicAction->case['reviewed'] = 'Add Review Result';
+$lang->action->dynamicAction->case['confirmed'] = 'Confirm Case';
+$lang->action->dynamicAction->case['fromlib'] = 'Import from Case Lib';
+$lang->action->dynamicAction->testreport['opened'] = 'Create Test Report';
+$lang->action->dynamicAction->testreport['edited'] = 'Edit Test Report';
+$lang->action->dynamicAction->testreport['deleted'] = 'Delete Test Report';
+$lang->action->dynamicAction->testreport['undeleted'] = 'Restore Test Report';
+$lang->action->dynamicAction->testreport['hidden'] = 'Hide Test Report';
+$lang->action->dynamicAction->testsuite['opened'] = 'Create Test Suite';
+$lang->action->dynamicAction->testsuite['edited'] = 'Edit Test Suite';
+$lang->action->dynamicAction->testsuite['deleted'] = 'Deleted Test Suite';
+$lang->action->dynamicAction->testsuite['undeleted'] = 'Restore Test Suite';
+$lang->action->dynamicAction->testsuite['hidden'] = 'Hidden Test Suite';
+$lang->action->dynamicAction->caselib['opened'] = 'Create Case Lib';
+$lang->action->dynamicAction->caselib['edited'] = 'Edit Case Lib';
+$lang->action->dynamicAction->caselib['deleted'] = 'Deleted Case Lib';
+$lang->action->dynamicAction->caselib['undeleted'] = 'Restore Case Lib';
+$lang->action->dynamicAction->caselib['hidden'] = 'Hidden Case Lib';
+
+$lang->action->dynamicAction->doclib['created'] = 'Create Doc Lib';
+$lang->action->dynamicAction->doclib['edited'] = 'Edit Doc Lib';
+$lang->action->dynamicAction->doc['created'] = 'Create Doc';
+$lang->action->dynamicAction->doc['edited'] = 'Edit Doc';
+$lang->action->dynamicAction->doc['commented'] = 'Comment Doc';
+$lang->action->dynamicAction->doc['deleted'] = 'Delete Doc';
+$lang->action->dynamicAction->doc['undeleted'] = 'Restore Doc';
+$lang->action->dynamicAction->doc['hidden'] = 'Hide Doc';
+
+$lang->action->dynamicAction->user['created'] = 'Create User';
+$lang->action->dynamicAction->user['edited'] = 'Edit User';
+$lang->action->dynamicAction->user['login'] = 'User Login';
+$lang->action->dynamicAction->user['logout'] = 'User Logout';
+$lang->action->dynamicAction->user['undeleted'] = 'Restore User';
+$lang->action->dynamicAction->user['hidden'] = 'Hide User';
+$lang->action->dynamicAction->user['loginxuanxuan'] = 'Login Xuan';
+
+$lang->action->dynamicAction->entry['created'] = 'Add Entry';
+$lang->action->dynamicAction->entry['edited'] = 'Edit Entry';
/* 用来生成相应对象的链接。*/
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
@@ -204,11 +367,11 @@ $lang->action->label->task = 'Task|task|view|taskID=%s';
$lang->action->label->build = 'Build|build|view|buildID=%s';
$lang->action->label->bug = 'Bug|bug|view|bugID=%s';
$lang->action->label->case = 'Case|testcase|view|caseID=%s';
-$lang->action->label->testtask = 'Test Task|testtask|view|caseID=%s';
+$lang->action->label->testtask = 'Test|testtask|view|caseID=%s';
$lang->action->label->testsuite = 'Test Suite|testsuite|view|suiteID=%s';
$lang->action->label->caselib = 'Case Library|testsuite|libview|libID=%s';
$lang->action->label->todo = 'Todo|todo|view|todoID=%s';
-$lang->action->label->doclib = 'Doc Lib|doc|browse|libID=%s';
+$lang->action->label->doclib = 'Doc Library|doc|browse|libID=%s';
$lang->action->label->doc = 'Doc|doc|view|docID=%s';
$lang->action->label->user = 'User|user|view|account=%s';
$lang->action->label->testreport = 'Report|testreport|view|report=%s';
@@ -226,7 +389,7 @@ $lang->action->search->objectTypeList['caseresult'] = 'Case Results';
$lang->action->search->objectTypeList['stepresult'] = 'Case Steps';
$lang->action->search->objectTypeList['story'] = 'Story';
$lang->action->search->objectTypeList['task'] = 'Task';
-$lang->action->search->objectTypeList['testtask'] = 'Test Task';
+$lang->action->search->objectTypeList['testtask'] = 'Test';
$lang->action->search->objectTypeList['user'] = 'User';
$lang->action->search->objectTypeList['doc'] = 'Doc';
$lang->action->search->objectTypeList['doclib'] = 'Doc Lib';
diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php
index 9618185b8c..5666def159 100755
--- a/module/action/lang/zh-cn.php
+++ b/module/action/lang/zh-cn.php
@@ -129,6 +129,14 @@ $lang->action->desc->diff2 = '修改了
%s,
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由
$actor 关联到版本
$extra';
+/* 子任务修改父任务的历史操作记录 */
+$lang->action->desc->createchildren = '$date, 由
$actor 创建子任务
$extra。' . "\n";
+$lang->action->desc->linkchildtask = '$date, 由
$actor 关联子任务
$extra。' . "\n";
+$lang->action->desc->linkchildtask = '$date, 由
$actor 关联子任务
$extra。' . "\n";
+$lang->action->desc->unlinkchildrentask = '$date, 由
$actor 移除子任务
$extra。' . "\n";
+$lang->action->desc->linkparenttask = '$date, 由
$actor 关联到父任务
$extra。' . "\n";
+$lang->action->desc->unlinkparenttask = '$date, 由
$actor 从父任务
$extra取消关联。' . "\n";
+
/* 关联用例和移除用例时的历史操作记录。*/
$lang->action->desc->linkrelatedcase = '$date, 由
$actor 关联相关用例
$extra。' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, 由
$actor 移除相关用例
$extra。' . "\n";
@@ -193,6 +201,161 @@ $lang->action->label->logout = "退出登录";
$lang->action->label->deleteestimate = "删除了工时";
$lang->action->label->linked2build = "关联了";
$lang->action->label->linked2bug = "关联了";
+$lang->action->label->linkchildtask = "关联子任务";
+$lang->action->label->unlinkchildrentask = "取消关联子任务";
+$lang->action->label->linkparenttask = "关联到父任务";
+$lang->action->label->unlinkparenttask = "从父任务取消关联";
+$lang->action->label->batchcreate = "批量创建任务";
+$lang->action->label->createchildren = "创建子任务";
+$lang->action->label->managed = "维护";
+
+/* 动态信息按照对象分组 */
+$lang->action->dynamicAction = new stdclass;
+$lang->action->dynamicAction->todo['opened'] = '创建待办';
+$lang->action->dynamicAction->todo['edited'] = '编辑待办';
+$lang->action->dynamicAction->todo['erased'] = '删除待办';
+$lang->action->dynamicAction->todo['finished'] = '完成待办';
+$lang->action->dynamicAction->todo['activated'] = '激活待办';
+$lang->action->dynamicAction->todo['closed'] = '关闭待办';
+$lang->action->dynamicAction->todo['deleted'] = '删除待办';
+$lang->action->dynamicAction->todo['assigned'] = '指派待办';
+$lang->action->dynamicAction->todo['undeleted'] = '还原待办';
+$lang->action->dynamicAction->todo['hidden'] = '隐藏待办';
+
+$lang->action->dynamicAction->product['opened'] = '创建' . $lang->productCommon;
+$lang->action->dynamicAction->product['edited'] = '编辑' . $lang->productCommon;
+$lang->action->dynamicAction->product['deleted'] = '删除' . $lang->productCommon;
+$lang->action->dynamicAction->product['closed'] = '关闭' . $lang->productCommon;
+$lang->action->dynamicAction->product['undeleted'] = '还原' . $lang->productCommon;
+$lang->action->dynamicAction->product['hidden'] = '隐藏' . $lang->productCommon;
+$lang->action->dynamicAction->productplan['opened'] = '创建计划';
+$lang->action->dynamicAction->productplan['edited'] = '编辑计划';
+$lang->action->dynamicAction->release['opened'] = '创建发布';
+$lang->action->dynamicAction->release['edited'] = '编辑发布';
+$lang->action->dynamicAction->release['changestatus'] = '修改发布状态';
+$lang->action->dynamicAction->release['undeleted'] = '还原发布';
+$lang->action->dynamicAction->release['hidden'] = '隐藏发布';
+$lang->action->dynamicAction->story['opened'] = '创建需求';
+$lang->action->dynamicAction->story['edited'] = '编辑需求';
+$lang->action->dynamicAction->story['activated'] = '激活需求';
+$lang->action->dynamicAction->story['reviewed'] = '评审需求';
+$lang->action->dynamicAction->story['closed'] = '关闭需求';
+$lang->action->dynamicAction->story['assigned'] = '指派需求';
+$lang->action->dynamicAction->story['changed'] = '变更需求';
+$lang->action->dynamicAction->story['linked2plan'] = '需求关联计划';
+$lang->action->dynamicAction->story['unlinkedfromplan'] = '计划移除需求';
+$lang->action->dynamicAction->story['linked2release'] = '需求关联发布';
+$lang->action->dynamicAction->story['unlinkedfromrelease'] = '发布移除需求';
+$lang->action->dynamicAction->story['linked2build'] = '需求关联版本';
+$lang->action->dynamicAction->story['unlinkedfrombuild'] = '版本移除需求';
+$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除项目';
+$lang->action->dynamicAction->story['undeleted'] = '还原需求';
+$lang->action->dynamicAction->story['hidden'] = '隐藏需求';
+
+$lang->action->dynamicAction->project['opened'] = '创建' . $lang->projectCommon;
+$lang->action->dynamicAction->project['edited'] = '编辑' . $lang->projectCommon;
+$lang->action->dynamicAction->project['deleted'] = '删除' . $lang->projectCommon;
+$lang->action->dynamicAction->project['started'] = '开始' . $lang->projectCommon;
+$lang->action->dynamicAction->project['delayed'] = '延期' . $lang->projectCommon;
+$lang->action->dynamicAction->project['suspended'] = '挂起' . $lang->projectCommon;
+$lang->action->dynamicAction->project['activated'] = '激活' . $lang->projectCommon;
+$lang->action->dynamicAction->project['closed'] = '关闭' . $lang->projectCommon;
+$lang->action->dynamicAction->project['managed'] = '维护' . $lang->projectCommon;
+$lang->action->dynamicAction->project['undeleted'] = '还原' . $lang->projectCommon;
+$lang->action->dynamicAction->project['hidden'] = '隐藏' . $lang->projectCommon;
+$lang->action->dynamicAction->project['moved'] = '导入任务';
+$lang->action->dynamicAction->task['opened'] = '创建任务';
+$lang->action->dynamicAction->task['edited'] = '编辑任务';
+$lang->action->dynamicAction->task['commented'] = '备注任务';
+$lang->action->dynamicAction->task['assigned'] = '指派任务';
+$lang->action->dynamicAction->task['confirmed'] = '确认需求变更';
+$lang->action->dynamicAction->task['started'] = '开始任务';
+$lang->action->dynamicAction->task['finished'] = '完成任务';
+$lang->action->dynamicAction->task['recordestimate'] = '记录工时';
+$lang->action->dynamicAction->task['editestimate'] = '编辑工时';
+$lang->action->dynamicAction->task['deleteestimate'] = '删除工时';
+$lang->action->dynamicAction->task['paused'] = '暂停任务';
+$lang->action->dynamicAction->task['closed'] = '关闭任务';
+$lang->action->dynamicAction->task['canceled'] = '取消任务';
+$lang->action->dynamicAction->task['activated'] = '激活任务';
+$lang->action->dynamicAction->task['createchildren'] = '创建子任务';
+$lang->action->dynamicAction->task['unlinkparenttask'] = '从父任务取消关联';
+$lang->action->dynamicAction->task['linkparenttask'] = '关联到父任务';
+$lang->action->dynamicAction->task['linkchildtask'] = '关联子任务';
+$lang->action->dynamicAction->task['undeleted'] = '还原任务';
+$lang->action->dynamicAction->task['hidden'] = '隐藏任务';
+$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
+$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
+$lang->action->dynamicAction->build['opened'] = '创建版本';
+$lang->action->dynamicAction->build['edited'] = '编辑版本';
+
+$lang->action->dynamicAction->bug['opened'] = '创建Bug';
+$lang->action->dynamicAction->bug['edited'] = '编辑Bug';
+$lang->action->dynamicAction->bug['activated'] = '激活Bug';
+$lang->action->dynamicAction->bug['assigned'] = '指派Bug';
+$lang->action->dynamicAction->bug['closed'] = '关闭Bug';
+$lang->action->dynamicAction->bug['bugconfirmed'] = '确认Bug';
+$lang->action->dynamicAction->bug['resolved'] = '解决Bug';
+$lang->action->dynamicAction->bug['undeleted'] = '还原Bug';
+$lang->action->dynamicAction->bug['hidden'] = '隐藏Bug';
+$lang->action->dynamicAction->bug['confirmed'] = '确认需求变更';
+$lang->action->dynamicAction->bug['tostory'] = '转需求';
+$lang->action->dynamicAction->bug['totask'] = '转任务';
+$lang->action->dynamicAction->bug['linked2plan'] = 'Bug关联计划';
+$lang->action->dynamicAction->bug['unlinkedfromplan'] = '计划移除Bug';
+$lang->action->dynamicAction->bug['linked2release'] = 'Bug关联发布';
+$lang->action->dynamicAction->bug['unlinkedfromrelease'] = '发布移除Bug';
+$lang->action->dynamicAction->bug['linked2bug'] = 'Bug关联版本';
+$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug';
+$lang->action->dynamicAction->testtask['opened'] = '创建测试单';
+$lang->action->dynamicAction->testtask['edited'] = '编辑测试单';
+$lang->action->dynamicAction->testtask['started'] = '启动测试单';
+$lang->action->dynamicAction->testtask['activated'] = '激活测试单';
+$lang->action->dynamicAction->testtask['closed'] = '完成测试单';
+$lang->action->dynamicAction->testtask['blocked'] = '阻塞测试单';
+$lang->action->dynamicAction->case['opened'] = '创建用例';
+$lang->action->dynamicAction->case['edited'] = '编辑用例';
+$lang->action->dynamicAction->case['deleted'] = '删除用例';
+$lang->action->dynamicAction->case['undeleted'] = '还原用例';
+$lang->action->dynamicAction->case['hidden'] = '隐藏用例';
+$lang->action->dynamicAction->case['reviewed'] = '评审用例';
+$lang->action->dynamicAction->case['confirmed'] = '确认需求变更';
+$lang->action->dynamicAction->case['fromlib'] = '从用例库导入';
+$lang->action->dynamicAction->testreport['opened'] = '创建测试报告';
+$lang->action->dynamicAction->testreport['edited'] = '编辑测试报告';
+$lang->action->dynamicAction->testreport['deleted'] = '删除测试报告';
+$lang->action->dynamicAction->testreport['undeleted'] = '还原测试报告';
+$lang->action->dynamicAction->testreport['hidden'] = '隐藏测试报告';
+$lang->action->dynamicAction->testsuite['opened'] = '创建测试套件';
+$lang->action->dynamicAction->testsuite['edited'] = '编辑测试套件';
+$lang->action->dynamicAction->testsuite['deleted'] = '删除测试套件';
+$lang->action->dynamicAction->testsuite['undeleted'] = '还原测试套件';
+$lang->action->dynamicAction->testsuite['hidden'] = '隐藏测试套件';
+$lang->action->dynamicAction->caselib['opened'] = '创建用例库';
+$lang->action->dynamicAction->caselib['edited'] = '编辑用例库';
+$lang->action->dynamicAction->caselib['deleted'] = '删除用例库';
+$lang->action->dynamicAction->caselib['undeleted'] = '还原用例库';
+$lang->action->dynamicAction->caselib['hidden'] = '隐藏用例库';
+
+$lang->action->dynamicAction->doclib['created'] = '创建文档库';
+$lang->action->dynamicAction->doclib['edited'] = '编辑文档库';
+$lang->action->dynamicAction->doc['created'] = '创建文档';
+$lang->action->dynamicAction->doc['edited'] = '编辑文档';
+$lang->action->dynamicAction->doc['commented'] = '备注文档';
+$lang->action->dynamicAction->doc['deleted'] = '删除文档';
+$lang->action->dynamicAction->doc['undeleted'] = '还原文档';
+$lang->action->dynamicAction->doc['hidden'] = '隐藏文档';
+
+$lang->action->dynamicAction->user['created'] = '创建用户';
+$lang->action->dynamicAction->user['edited'] = '编辑用户';
+$lang->action->dynamicAction->user['login'] = '用户登录';
+$lang->action->dynamicAction->user['logout'] = '用户退出';
+$lang->action->dynamicAction->user['undeleted'] = '还原用户';
+$lang->action->dynamicAction->user['hidden'] = '隐藏用户';
+$lang->action->dynamicAction->user['loginxuanxuan'] = '登录客户端';
+
+$lang->action->dynamicAction->entry['created'] = '添加应用';
+$lang->action->dynamicAction->entry['edited'] = '编辑应用';
/* 用来生成相应对象的链接。*/
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
diff --git a/module/action/lang/zh-tw.php b/module/action/lang/zh-tw.php
index 11e7d88f13..725b62d782 100755
--- a/module/action/lang/zh-tw.php
+++ b/module/action/lang/zh-tw.php
@@ -129,6 +129,14 @@ $lang->action->desc->diff2 = '修改了
%s,
$lang->action->desc->diff3 = '將檔案名 %s 改為 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由
$actor 關聯到版本
$extra';
+/* 子任務修改父任務的歷史操作記錄 */
+$lang->action->desc->createchildren = '$date, 由
$actor 創建子任務
$extra。' . "\n";
+$lang->action->desc->linkchildtask = '$date, 由
$actor 關聯子任務
$extra。' . "\n";
+$lang->action->desc->linkchildtask = '$date, 由
$actor 關聯子任務
$extra。' . "\n";
+$lang->action->desc->unlinkchildrentask = '$date, 由
$actor 移除子任務
$extra。' . "\n";
+$lang->action->desc->linkparenttask = '$date, 由
$actor 關聯到父任務
$extra。' . "\n";
+$lang->action->desc->unlinkparenttask = '$date, 由
$actor 從父任務
$extra取消關聯。' . "\n";
+
/* 關聯用例和移除用例時的歷史操作記錄。*/
$lang->action->desc->linkrelatedcase = '$date, 由
$actor 關聯相關用例
$extra。' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, 由
$actor 移除相關用例
$extra。' . "\n";
@@ -193,6 +201,161 @@ $lang->action->label->logout = "退出登錄";
$lang->action->label->deleteestimate = "刪除了工時";
$lang->action->label->linked2build = "關聯了";
$lang->action->label->linked2bug = "關聯了";
+$lang->action->label->linkchildtask = "關聯子任務";
+$lang->action->label->unlinkchildrentask = "取消關聯子任務";
+$lang->action->label->linkparenttask = "關聯到父任務";
+$lang->action->label->unlinkparenttask = "從父任務取消關聯";
+$lang->action->label->batchcreate = "批量創建任務";
+$lang->action->label->createchildren = "創建子任務";
+$lang->action->label->managed = "維護";
+
+/* 動態信息按照對象分組 */
+$lang->action->dynamicAction = new stdclass;
+$lang->action->dynamicAction->todo['opened'] = '創建待辦';
+$lang->action->dynamicAction->todo['edited'] = '編輯待辦';
+$lang->action->dynamicAction->todo['erased'] = '刪除待辦';
+$lang->action->dynamicAction->todo['finished'] = '完成待辦';
+$lang->action->dynamicAction->todo['activated'] = '激活待辦';
+$lang->action->dynamicAction->todo['closed'] = '關閉待辦';
+$lang->action->dynamicAction->todo['deleted'] = '刪除待辦';
+$lang->action->dynamicAction->todo['assigned'] = '指派待辦';
+$lang->action->dynamicAction->todo['undeleted'] = '還原待辦';
+$lang->action->dynamicAction->todo['hidden'] = '隱藏待辦';
+
+$lang->action->dynamicAction->product['opened'] = '創建' . $lang->productCommon;
+$lang->action->dynamicAction->product['edited'] = '編輯' . $lang->productCommon;
+$lang->action->dynamicAction->product['deleted'] = '刪除' . $lang->productCommon;
+$lang->action->dynamicAction->product['closed'] = '關閉' . $lang->productCommon;
+$lang->action->dynamicAction->product['undeleted'] = '還原' . $lang->productCommon;
+$lang->action->dynamicAction->product['hidden'] = '隱藏' . $lang->productCommon;
+$lang->action->dynamicAction->productplan['opened'] = '創建計劃';
+$lang->action->dynamicAction->productplan['edited'] = '編輯計劃';
+$lang->action->dynamicAction->release['opened'] = '創建發佈';
+$lang->action->dynamicAction->release['edited'] = '編輯發佈';
+$lang->action->dynamicAction->release['changestatus'] = '修改發佈狀態';
+$lang->action->dynamicAction->release['undeleted'] = '還原發佈';
+$lang->action->dynamicAction->release['hidden'] = '隱藏發佈';
+$lang->action->dynamicAction->story['opened'] = '創建需求';
+$lang->action->dynamicAction->story['edited'] = '編輯需求';
+$lang->action->dynamicAction->story['activated'] = '激活需求';
+$lang->action->dynamicAction->story['reviewed'] = '評審需求';
+$lang->action->dynamicAction->story['closed'] = '關閉需求';
+$lang->action->dynamicAction->story['assigned'] = '指派需求';
+$lang->action->dynamicAction->story['changed'] = '變更需求';
+$lang->action->dynamicAction->story['linked2plan'] = '需求關聯計劃';
+$lang->action->dynamicAction->story['unlinkedfromplan'] = '計劃移除需求';
+$lang->action->dynamicAction->story['linked2release'] = '需求關聯發佈';
+$lang->action->dynamicAction->story['unlinkedfromrelease'] = '發佈移除需求';
+$lang->action->dynamicAction->story['linked2build'] = '需求關聯版本';
+$lang->action->dynamicAction->story['unlinkedfrombuild'] = '版本移除需求';
+$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除項目';
+$lang->action->dynamicAction->story['undeleted'] = '還原需求';
+$lang->action->dynamicAction->story['hidden'] = '隱藏需求';
+
+$lang->action->dynamicAction->project['opened'] = '創建' . $lang->projectCommon;
+$lang->action->dynamicAction->project['edited'] = '編輯' . $lang->projectCommon;
+$lang->action->dynamicAction->project['deleted'] = '刪除' . $lang->projectCommon;
+$lang->action->dynamicAction->project['started'] = '開始' . $lang->projectCommon;
+$lang->action->dynamicAction->project['delayed'] = '延期' . $lang->projectCommon;
+$lang->action->dynamicAction->project['suspended'] = '掛起' . $lang->projectCommon;
+$lang->action->dynamicAction->project['activated'] = '激活' . $lang->projectCommon;
+$lang->action->dynamicAction->project['closed'] = '關閉' . $lang->projectCommon;
+$lang->action->dynamicAction->project['managed'] = '維護' . $lang->projectCommon;
+$lang->action->dynamicAction->project['undeleted'] = '還原' . $lang->projectCommon;
+$lang->action->dynamicAction->project['hidden'] = '隱藏' . $lang->projectCommon;
+$lang->action->dynamicAction->project['moved'] = '導入任務';
+$lang->action->dynamicAction->task['opened'] = '創建任務';
+$lang->action->dynamicAction->task['edited'] = '編輯任務';
+$lang->action->dynamicAction->task['commented'] = '備註任務';
+$lang->action->dynamicAction->task['assigned'] = '指派任務';
+$lang->action->dynamicAction->task['confirmed'] = '確認需求變更';
+$lang->action->dynamicAction->task['started'] = '開始任務';
+$lang->action->dynamicAction->task['finished'] = '完成任務';
+$lang->action->dynamicAction->task['recordestimate'] = '記錄工時';
+$lang->action->dynamicAction->task['editestimate'] = '編輯工時';
+$lang->action->dynamicAction->task['deleteestimate'] = '刪除工時';
+$lang->action->dynamicAction->task['paused'] = '暫停任務';
+$lang->action->dynamicAction->task['closed'] = '關閉任務';
+$lang->action->dynamicAction->task['canceled'] = '取消任務';
+$lang->action->dynamicAction->task['activated'] = '激活任務';
+$lang->action->dynamicAction->task['createchildren'] = '創建子任務';
+$lang->action->dynamicAction->task['unlinkparenttask'] = '從父任務取消關聯';
+$lang->action->dynamicAction->task['linkparenttask'] = '關聯到父任務';
+$lang->action->dynamicAction->task['linkchildtask'] = '關聯子任務';
+$lang->action->dynamicAction->task['undeleted'] = '還原任務';
+$lang->action->dynamicAction->task['hidden'] = '隱藏任務';
+$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
+$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
+$lang->action->dynamicAction->build['opened'] = '創建版本';
+$lang->action->dynamicAction->build['edited'] = '編輯版本';
+
+$lang->action->dynamicAction->bug['opened'] = '創建Bug';
+$lang->action->dynamicAction->bug['edited'] = '編輯Bug';
+$lang->action->dynamicAction->bug['activated'] = '激活Bug';
+$lang->action->dynamicAction->bug['assigned'] = '指派Bug';
+$lang->action->dynamicAction->bug['closed'] = '關閉Bug';
+$lang->action->dynamicAction->bug['bugconfirmed'] = '確認Bug';
+$lang->action->dynamicAction->bug['resolved'] = '解決Bug';
+$lang->action->dynamicAction->bug['undeleted'] = '還原Bug';
+$lang->action->dynamicAction->bug['hidden'] = '隱藏Bug';
+$lang->action->dynamicAction->bug['confirmed'] = '確認需求變更';
+$lang->action->dynamicAction->bug['tostory'] = '轉需求';
+$lang->action->dynamicAction->bug['totask'] = '轉任務';
+$lang->action->dynamicAction->bug['linked2plan'] = 'Bug關聯計劃';
+$lang->action->dynamicAction->bug['unlinkedfromplan'] = '計劃移除Bug';
+$lang->action->dynamicAction->bug['linked2release'] = 'Bug關聯發佈';
+$lang->action->dynamicAction->bug['unlinkedfromrelease'] = '發佈移除Bug';
+$lang->action->dynamicAction->bug['linked2bug'] = 'Bug關聯版本';
+$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug';
+$lang->action->dynamicAction->testtask['opened'] = '創建測試單';
+$lang->action->dynamicAction->testtask['edited'] = '編輯測試單';
+$lang->action->dynamicAction->testtask['started'] = '啟動測試單';
+$lang->action->dynamicAction->testtask['activated'] = '激活測試單';
+$lang->action->dynamicAction->testtask['closed'] = '完成測試單';
+$lang->action->dynamicAction->testtask['blocked'] = '阻塞測試單';
+$lang->action->dynamicAction->case['opened'] = '創建用例';
+$lang->action->dynamicAction->case['edited'] = '編輯用例';
+$lang->action->dynamicAction->case['deleted'] = '刪除用例';
+$lang->action->dynamicAction->case['undeleted'] = '還原用例';
+$lang->action->dynamicAction->case['hidden'] = '隱藏用例';
+$lang->action->dynamicAction->case['reviewed'] = '評審用例';
+$lang->action->dynamicAction->case['confirmed'] = '確認需求變更';
+$lang->action->dynamicAction->case['fromlib'] = '從用例庫導入';
+$lang->action->dynamicAction->testreport['opened'] = '創建測試報告';
+$lang->action->dynamicAction->testreport['edited'] = '編輯測試報告';
+$lang->action->dynamicAction->testreport['deleted'] = '刪除測試報告';
+$lang->action->dynamicAction->testreport['undeleted'] = '還原測試報告';
+$lang->action->dynamicAction->testreport['hidden'] = '隱藏測試報告';
+$lang->action->dynamicAction->testsuite['opened'] = '創建測試套件';
+$lang->action->dynamicAction->testsuite['edited'] = '編輯測試套件';
+$lang->action->dynamicAction->testsuite['deleted'] = '刪除測試套件';
+$lang->action->dynamicAction->testsuite['undeleted'] = '還原測試套件';
+$lang->action->dynamicAction->testsuite['hidden'] = '隱藏測試套件';
+$lang->action->dynamicAction->caselib['opened'] = '創建用例庫';
+$lang->action->dynamicAction->caselib['edited'] = '編輯用例庫';
+$lang->action->dynamicAction->caselib['deleted'] = '刪除用例庫';
+$lang->action->dynamicAction->caselib['undeleted'] = '還原用例庫';
+$lang->action->dynamicAction->caselib['hidden'] = '隱藏用例庫';
+
+$lang->action->dynamicAction->doclib['created'] = '創建文檔庫';
+$lang->action->dynamicAction->doclib['edited'] = '編輯文檔庫';
+$lang->action->dynamicAction->doc['created'] = '創建文檔';
+$lang->action->dynamicAction->doc['edited'] = '編輯文檔';
+$lang->action->dynamicAction->doc['commented'] = '備註文檔';
+$lang->action->dynamicAction->doc['deleted'] = '刪除文檔';
+$lang->action->dynamicAction->doc['undeleted'] = '還原文檔';
+$lang->action->dynamicAction->doc['hidden'] = '隱藏文檔';
+
+$lang->action->dynamicAction->user['created'] = '創建用戶';
+$lang->action->dynamicAction->user['edited'] = '編輯用戶';
+$lang->action->dynamicAction->user['login'] = '用戶登錄';
+$lang->action->dynamicAction->user['logout'] = '用戶退出';
+$lang->action->dynamicAction->user['undeleted'] = '還原用戶';
+$lang->action->dynamicAction->user['hidden'] = '隱藏用戶';
+$lang->action->dynamicAction->user['loginxuanxuan'] = '登錄客戶端';
+
+$lang->action->dynamicAction->entry['created'] = '添加應用';
+$lang->action->dynamicAction->entry['edited'] = '編輯應用';
/* 用來生成相應對象的連結。*/
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
diff --git a/module/action/model.php b/module/action/model.php
index 353c5adae1..11a69d2cc8 100755
--- a/module/action/model.php
+++ b/module/action/model.php
@@ -36,7 +36,7 @@ class actionModel extends model
$actor = $actor ? $actor : $this->app->user->account;
$actionType = strtolower($actionType);
if($actor == 'guest' and $actionType == 'logout') return false;
-
+
$action = new stdclass();
$objectType = str_replace('`', '', $objectType);
@@ -291,7 +291,17 @@ class actionModel extends model
$title = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($action->extra)->fetch('title');
if($title) $action->extra = common::hasPriv('story', 'view') ? html::a(helper::createLink('story', 'view', "storyID=$action->extra"), "#$action->extra " . $title) : "#$action->extra " . $title;
}
- elseif($actionName == 'totask')
+ elseif($actionName == 'createchildren')
+ {
+ $names = $this->dao->select('id,name')->from(TABLE_TASK)->where('id')->in($action->extra)->fetchPairs('id', 'name');
+ $action->extra = '';
+ if($names)
+ {
+ foreach($names as $id => $name) $action->extra .= common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$id"), "#$id " . $name) . ', ' : "#$id " . $name . ', ';
+ }
+ $action->extra = trim(trim($action->extra), ',');
+ }
+ elseif($actionName == 'totask' or $actionName == 'linkchildtask' or $actionName == 'unlinkchildrentask' or $actionName == 'linkparenttask' or $actionName == 'unlinkparenttask')
{
$name = $this->dao->select('name')->from(TABLE_TASK)->where('id')->eq($action->extra)->fetch('name');
if($name) $action->extra = common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$action->extra"), "#$action->extra " . $name) : "#$action->extra " . $name;
@@ -346,7 +356,11 @@ class actionModel extends model
{
$linkedProducts = $this->dao->select('id,name')->from(TABLE_PRODUCT)->where('id')->in($action->extra)->fetchPairs('id', 'name');
$action->extra = '';
- if($linkedProducts) $action->extra = sprintf($this->lang->project->action->extra, '
' . join(', ', $linkedProducts) . '');
+ if($linkedProducts)
+ {
+ foreach($linkedProducts as $productID => $productName) $linkedProducts[$productID] = html::a(helper::createLink('product', 'browse', "productID=$productID"), "#{$productID} {$productName}");
+ $action->extra = sprintf($this->lang->project->action->extra, '
' . join(', ', $linkedProducts) . '');
+ }
}
$action->history = isset($histories[$actionID]) ? $histories[$actionID] : array();
@@ -365,7 +379,7 @@ class actionModel extends model
if($history->field == 'git') $history->diff = str_replace('+', '%2B', $history->diff);
}
}
-
+
$action->comment = $this->file->setImgSize($action->comment, $this->config->action->commonImgSize);
$actions[$actionID] = $action;
}
@@ -488,7 +502,7 @@ class actionModel extends model
* @access public
* @return void
*/
- public function printAction($action)
+ public function printAction($action, $desc = '')
{
if(!isset($action->objectType) or !isset($action->action)) return false;
@@ -502,17 +516,20 @@ class actionModel extends model
* 2. If no defined in the module language, search the common action define.
* 3. If not found in the lang->action->desc, use the $lang->action->desc->common or $lang->action->desc->extra as the default.
*/
- if(isset($this->lang->$objectType) && isset($this->lang->$objectType->action->$actionType))
+ if(empty($desc))
{
- $desc = $this->lang->$objectType->action->$actionType;
- }
- elseif(isset($this->lang->action->desc->$actionType))
- {
- $desc = $this->lang->action->desc->$actionType;
- }
- else
- {
- $desc = $action->extra ? $this->lang->action->desc->extra : $this->lang->action->desc->common;
+ if(isset($this->lang->$objectType) && isset($this->lang->$objectType->action->$actionType))
+ {
+ $desc = $this->lang->$objectType->action->$actionType;
+ }
+ elseif(isset($this->lang->action->desc->$actionType))
+ {
+ $desc = $this->lang->action->desc->$actionType;
+ }
+ else
+ {
+ $desc = $action->extra ? $this->lang->action->desc->extra : $this->lang->action->desc->common;
+ }
}
if($this->app->getViewType() == 'mhtml') $action->date = date('m-d H:i', strtotime($action->date));
@@ -598,7 +615,9 @@ class actionModel extends model
$this->loadModel('doc');
$libs = $this->doc->getLibs('all');
$docs = $this->doc->getPrivDocs(array_keys($libs));
-
+
+ $actionCondition = $this->getActionCondition();
+ if(is_array($actionCondition)) return array();
/* Get actions. */
$actions = $this->dao->select('*')->from(TABLE_ACTION)
->where(1)
@@ -616,6 +635,7 @@ class actionModel extends model
->beginIF($this->config->global->flow == 'onlyStory')->andWhere('objectType')->notin('bug,build,project,task,taskcase,testreport,testsuite,testtask')->fi()
->beginIF($this->config->global->flow == 'onlyTask')->andWhere('objectType')->notin('product,productplan,release,story,testcase,testreport,testsuite')->fi()
->beginIF($this->config->global->flow == 'onlyTest')->andWhere('objectType')->notin('project,productplan,release,story,task')->fi()
+ ->beginIF(!empty($actionCondition))->andWhere("($actionCondition)")->fi()
->orderBy($orderBy)
->page($pager)
->fetchAll();
@@ -623,7 +643,28 @@ class actionModel extends model
if(!$actions) return array();
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'action');
- return $this->transformActions($actions);
+
+ return $this->transformActions($actions);;
+ }
+
+ /**
+ * Get dynamic show action
+ *
+ * @return String
+ */
+ public function getActionCondition()
+ {
+ $actionCondition = '';
+ if(isset($this->app->user->rights['acls']['actions']))
+ {
+ if(empty($this->app->user->rights['acls']['actions'])) return array();
+ foreach($this->app->user->rights['acls']['actions'] as $moduleName => $actions)
+ {
+ $actionCondition .= "(`objectType` = '$moduleName' and `action` " . helper::dbIN($actions) . ") or ";
+ }
+ $actionCondition = trim($actionCondition, 'or ');
+ }
+ return $actionCondition;
}
/**
@@ -700,8 +741,11 @@ class actionModel extends model
*/
public function getBySQL($sql, $orderBy, $pager = null)
{
+ $actionCondition = $this->getActionCondition();
+ if(is_array($actionCondition)) return array();
return $actions = $this->dao->select('*')->from(TABLE_ACTION)
->where($sql)
+ ->beginIF(!empty($actionCondition))->andWhere("($actionCondition)")->fi()
->beginIF($this->config->global->flow == 'onlyStory')->andWhere('objectType')->notin('bug,build,project,task,taskcase,testreport,testsuite,testtask')->fi()
->beginIF($this->config->global->flow == 'onlyTask')->andWhere('objectType')->notin('product,productplan,release,story,testcase,testreport,testsuite')->fi()
->beginIF($this->config->global->flow == 'onlyTest')->andWhere('objectType')->notin('project,productplan,release,story,task')->fi()
diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php
index a99c8e2274..a0b6f83859 100644
--- a/module/admin/lang/en.php
+++ b/module/admin/lang/en.php
@@ -38,20 +38,11 @@ $lang->admin->notice->ignore = "Ignore";
$lang->admin->notice->int = "『%s』should be a positive integer.";
$lang->admin->register = new stdclass();
-<<<<<<< HEAD
-$lang->admin->register->common = 'Bind New Account';
-=======
$lang->admin->register->common = 'Bind Account';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
-$lang->admin->register->caption = 'Register in Zentao Community';
+$lang->admin->register->caption = 'Register in ZenTao Community';
$lang->admin->register->click = 'Register here';
-<<<<<<< HEAD
-$lang->admin->register->lblAccount = 'at least 3 characters; contains letters and numbers.';
-$lang->admin->register->lblPasswd = 'at least 6 characters; contains letters and numbers.';
-=======
$lang->admin->register->lblAccount = '>= 3 characters; contains letters and numbers.';
$lang->admin->register->lblPasswd = '>= 6 characters; contains letters and numbers.';
->>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->admin->register->submit = 'Register';
$lang->admin->register->bind = "Bind Exsit Account";
$lang->admin->register->success = "You have registered with us!";
diff --git a/module/block/lang/en.php b/module/block/lang/en.php
index 36b5a78870..3cffb60a0a 100644
--- a/module/block/lang/en.php
+++ b/module/block/lang/en.php
@@ -36,7 +36,7 @@ $lang->block->lblFlowchart = 'Flowchart';
$lang->block->welcome = 'Welcome';
$lang->block->lblTesttask = 'Testing Details';
-$lang->block->leftToday = 'Work for Today';
+$lang->block->leftToday = 'Remaining Work Report';
$lang->block->myTask = 'My Task';
$lang->block->myStory = 'My Story';
$lang->block->myBug = 'My Bug';
@@ -143,7 +143,7 @@ $lang->block->default['qa']['3']['params']['num'] = 15;
$lang->block->default['qa']['3']['params']['orderBy'] = 'id_desc';
$lang->block->default['qa']['3']['params']['type'] = 'assigntome';
-$lang->block->default['qa']['4']['title'] = 'Wait Build';
+$lang->block->default['qa']['4']['title'] = 'Pending Build';
$lang->block->default['qa']['4']['block'] = 'testtask';
$lang->block->default['qa']['4']['grid'] = 4;
@@ -340,7 +340,7 @@ $lang->block->typeList->task['canceledBy'] = 'Cancelled by Me';
$lang->block->typeList->bug['assignedTo'] = 'Assigned to Me';
$lang->block->typeList->bug['openedBy'] = 'Created by Me';
-$lang->block->typeList->bug['resolvedBy'] = 'Resolved by Me';
+$lang->block->typeList->bug['resolvedBy'] = 'Solved by Me';
$lang->block->typeList->bug['closedBy'] = 'Closed by Me';
$lang->block->typeList->case['assigntome'] = 'Assigned to Me';
@@ -356,12 +356,12 @@ $lang->block->typeList->product['closed'] = 'Closed';
$lang->block->typeList->product['all'] = 'All';
$lang->block->typeList->product['involved'] = 'Involved';
-$lang->block->typeList->project['undone'] = 'Unfinished';
-$lang->block->typeList->project['doing'] = 'Doing';
+$lang->block->typeList->project['undone'] = 'Uncompleted';
+$lang->block->typeList->project['doing'] = 'Ongoing';
$lang->block->typeList->project['all'] = 'All';
$lang->block->typeList->project['involved'] = 'Involved';
-$lang->block->typeList->testtask['wait'] = 'Wait';
+$lang->block->typeList->testtask['wait'] = 'Pending';
$lang->block->typeList->testtask['doing'] = 'Doing';
$lang->block->typeList->testtask['blocked'] = 'Blocked';
$lang->block->typeList->testtask['done'] = 'Done';
@@ -396,7 +396,7 @@ $lang->block->gridOptions[8] = 'Left';
$lang->block->gridOptions[4] = 'Right';
$lang->block->flowchart = array();
-$lang->block->flowchart[] = array('Administlrator', 'Add Department', 'Add User', 'Maintain Privileges');
+$lang->block->flowchart[] = array('Administrator', 'Add Department', 'Add User', 'Maintain Privileges');
$lang->block->flowchart[] = array($lang->productCommon . ' Owner', 'Add ' . $lang->productCommon, 'Maintain Modules', 'Maintain Plans', 'Maintain Stories', 'Create Releases');
$lang->block->flowchart[] = array('Scrum Master', 'Add ' . $lang->projectCommon, 'Maintain Teams', 'Link ' . $lang->productCommon . 's', 'Link Stories', 'Decompose Tasks');
$lang->block->flowchart[] = array('Dev Team', 'Claim Tasks/Bugs', 'Update Status', 'Finish Tasks/Bugs');
diff --git a/module/branch/model.php b/module/branch/model.php
index c4528fb9b8..1b7e612e50 100644
--- a/module/branch/model.php
+++ b/module/branch/model.php
@@ -46,7 +46,8 @@ class branchModel extends model
$product = $this->loadModel('product')->getById($productID);
if(!$product or $product->type == 'normal') return array();
- $branches = array('0' => $this->lang->branch->all . $this->lang->product->branchName[$product->type]) + $branches;
+ $space = $this->app->getClientLang() == 'en' ? ' ' : '';
+ $branches = array('0' => $this->lang->branch->all . $space . $this->lang->product->branchName[$product->type]) + $branches;
}
return $branches;
}
diff --git a/module/bug/control.php b/module/bug/control.php
index 31261e6253..f1365cc19b 100644
--- a/module/bug/control.php
+++ b/module/bug/control.php
@@ -193,7 +193,7 @@ class bug extends control
$chartFunc = 'getDataOf' . $chart;
$chartData = $this->bug->$chartFunc();
$chartOption = $this->lang->bug->report->$chart;
- if(!empty($chartType)) $chartOption->type = $chartType;
+ if(!empty($chartType) and $chartType != 'default') $chartOption->type = $chartType;
$this->bug->mergeChartOption($chart);
$this->view->charts[$chart] = $chartOption;
@@ -679,7 +679,6 @@ class bug extends control
$this->view->openedBuilds = $openedBuilds;
$this->view->resolvedBuilds = array('' => '') + $openedBuilds + $oldResolvedBuild;
$this->view->actions = $this->action->getList('bug', $bugID);
- $this->view->templates = $this->bug->getUserBugTemplates($this->app->user->account);
$this->display();
}
@@ -1291,44 +1290,6 @@ class bug extends control
}
}
- /**
- * Save current template.
- *
- * @access public
- * @return string
- */
- public function saveTemplate()
- {
- $this->bug->saveUserBugTemplate();
- if(dao::isError()) echo js::error(dao::getError(), $full = false);
- die($this->fetch('bug', 'buildTemplates'));
- }
-
- /**
- * Build the user templates selection code.
- *
- * @access public
- * @return void
- */
- public function buildTemplates()
- {
- $this->view->templates = $this->bug->getUserBugTemplates($this->app->user->account);
- $this->display('bug', 'buildTemplates');
- }
-
- /**
- * Delete a user template.
- *
- * @param int $templateID
- * @access public
- * @return void
- */
- public function deleteTemplate($templateID)
- {
- $this->dao->delete()->from(TABLE_USERTPL)->where('id')->eq($templateID)->andWhere('account')->eq($this->app->user->account)->exec();
- die();
- }
-
/**
* AJAX: get bugs of a user in html select.
*
@@ -1500,8 +1461,8 @@ class bug extends control
}
/* Get related objects title or names. */
+ $relatedModules = array();
$productsType = $this->dao->select('id, type')->from(TABLE_PRODUCT)->where('id')->in($relatedProductIdList)->fetchPairs();
- $relatedModules = $this->loadModel('tree')->getOptionMenu($productID, 'bug');
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
$relatedTasks = $this->dao->select('id, name')->from(TABLE_TASK)->where('id')->in($relatedTaskIdList)->fetchPairs();
$relatedBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('id')->in($relatedBugIdList)->fetchPairs();
@@ -1509,7 +1470,8 @@ class bug extends control
$relatedBranch = array('0' => $this->lang->branch->all) + $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($relatedBranchIdList)->fetchPairs();
$relatedBuilds = array('trunk' => $this->lang->trunk) + $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('bug')->andWhere('objectID')->in(@array_keys($bugs))->andWhere('extra')->ne('editor')->fetchGroup('objectID');
-
+ foreach($relatedProductIdList as $relatedProductId) $relatedModules += $this->loadModel('tree')->getOptionMenu($relatedProductId, 'bug');
+
foreach($bugs as $bug)
{
if($this->post->fileType == 'csv')
@@ -1614,16 +1576,9 @@ class bug extends control
$this->fetch('file', 'export2' . $this->post->fileType, $_POST);
}
- $fileName = $this->lang->bug->common;
+ $fileName = $this->lang->bug->common;
$productName = $this->dao->findById($productID)->from(TABLE_PRODUCT)->fetch('name');
- if(isset($this->lang->bug->featureBar['browse'][$browseType]))
- {
- $browseType = $this->lang->bug->featureBar['browse'][$browseType];
- }
- else
- {
- $browseType = isset($this->lang->bug->moreSelects[$browseType]) ? $this->lang->bug->moreSelects[$browseType] : null;
- }
+ $browseType = isset($this->lang->bug->featureBar['browse'][$browseType]) ? $this->lang->bug->featureBar['browse'][$browseType] : zget($this->lang->bug->moreSelects, $browseType, '');
$this->view->fileName = $productName . $this->lang->dash . $browseType . $fileName;
$this->view->allExportFields = $this->config->bug->list->exportFields;
diff --git a/module/bug/css/create.css b/module/bug/css/create.css
index 881b8f6efd..68c6c10e6b 100644
--- a/module/bug/css/create.css
+++ b/module/bug/css/create.css
@@ -7,15 +7,8 @@
#buildBoxActions {padding-left: 15px;}
-#tplBoxWrapper {position: relative; z-index: 10;}
-#tplBoxWrapper > .btn-toolbar {position: absolute; right: 0px; top: 0px;}
-#tplBoxWrapper .btn {padding: 4px 8px}
-#tplBox li {position: relative;}
-#tplBox li .btn-delete {position: absolute; right: 0; top: -5px; display: block; width: 40px; text-align:center;}
-#tplBox li:hover .btn-delete {color:#fff;}
-#tplBox li .tpl-name {padding-right: 40px;}
-
#module_chosen.chosen-container .chosen-drop {min-width: 400px; border-top: 1px solid #ddd!important}
+#os_chosen.chosen-container .chosen-drop{min-width: 200px}
#openedBuild_chosen.chosen-container .chosen-drop {min-width: 450px; border-top: 1px solid #ddd!important}
#module + .chosen-container-single .chosen-single,
#task + .chosen-container-single .chosen-single,
diff --git a/module/bug/js/common.js b/module/bug/js/common.js
index 89d2ec866c..2933bb843f 100644
--- a/module/bug/js/common.js
+++ b/module/bug/js/common.js
@@ -468,17 +468,20 @@ function notice()
if($('#openedBuild').find('option').length <= 1)
{
var html = '';
- if($('#project').val() == '')
+ if($('#project').length == 0 || $('#project').val() == '')
{
- branch = $('#branch').val();
+ var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
- html += '
' + createRelease + ' ';
+ var link = createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch);
+ if(typeof(flow) != 'undefined' && flow == 'onlyTest') link = createLink('build', 'create','projectID=' + $('#product').val());
+ html += '
' + createBuild + ' ';
html += '
' + refresh + '';
}
else
{
- html += '
' + createBuild + ' ';
- html += '
' + refresh + '';
+ projectID = $('#project').val();
+ html += '
' + createBuild + ' ';
+ html += '
' + refresh + '';
}
var $bba = $('#buildBoxActions');
if($bba.length)
diff --git a/module/bug/js/create.js b/module/bug/js/create.js
index 87fe6176a9..6bf629899b 100644
--- a/module/bug/js/create.js
+++ b/module/bug/js/create.js
@@ -64,59 +64,9 @@ function setAssignedTo(moduleID, productID)
});
}
-/* Set template. */
-function setTemplate(templateID)
-{
- $('#tplBox .list-group-item.active').removeClass('active');
- $('#tplTitleBox' + templateID).closest('.list-group-item').addClass('active');
- var steps = $('#template' + templateID).html();
- editor['#'].html(steps);
-}
-
-/* Delete template. */
-function deleteTemplate(templateID)
-{
- if(!templateID) return;
- if(confirm(confirmDeleteTemplate))
- {
- hiddenwin.location.href = createLink('bug', 'deleteTemplate', 'templateID=' + templateID);
- $('#tplBox' + templateID).addClass('hidden');
- }
-}
-
-/* Display template x icon. */
-function displayXIcon(templateID)
-{
- $('#templateID' + templateID).removeClass('hidden');
-}
-
-/* Hide template x icon. */
-function hideXIcon(templateID)
-{
- $('#templateID' + templateID).addClass('hidden');
-}
-
$(function()
{
if($('#project').val()) loadProjectRelated($('#project').val());
- $('#saveTplModal').on('hide.zui.modal', function(){$(this).find('#title').val('');});
- $('#saveTplBtn').click(function(){$('#saveTplModal').modal('show');});
- $('#saveTplModal #submit').click(function()
- {
- var $inputGroup = $('#saveTplModal div.input-group');
- var $publicBox = $inputGroup.find('input[id^="public"]');
- var title = $inputGroup.find('#title').val();
- var content = $('#steps').val();
- var isPublic = ($publicBox.size() > 0 && $publicBox.prop('checked')) ? $publicBox.val() : 0;
- if(!title || !content) return;
- saveTemplateLink = createLink('bug', 'saveTemplate');
- $.post(saveTemplateLink, {title:title, content:content, public:isPublic}, function(data)
- {
- $('#tplBox').html(data);
- // If has error then not hide.
- if(data.indexOf('alert') == -1) $('#saveTplModal').modal('hide');
- });
- });
$('[data-toggle=tooltip]').tooltip();
diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php
index 0dacda49bb..169e0cddbc 100644
--- a/module/bug/lang/en.php
+++ b/module/bug/lang/en.php
@@ -32,48 +32,31 @@ $lang->bug->status = 'Status';
$lang->bug->statusAB = 'Status';
$lang->bug->activatedCount = 'Active';
$lang->bug->activatedCountAB = 'Active';
-<<<<<<< HEAD
$lang->bug->activatedDate = 'Active';
-=======
-$lang->bug->activatedDate = 'Activated';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->confirmed = 'Confirmed';
$lang->bug->toTask = 'Convert to Task';
$lang->bug->toStory = 'Convert to Story';
$lang->bug->mailto = 'Mail To';
-<<<<<<< HEAD
-<<<<<<< HEAD
$lang->bug->openedBy = 'Created by';
$lang->bug->openedDate = 'Created';
$lang->bug->openedDateAB = 'Created';
$lang->bug->openedBuild = 'Open Build';
$lang->bug->assignedTo = 'To';
$lang->bug->assignBug = 'Assignee';
-=======
-$lang->bug->openedBy = 'Creator';
-=======
-$lang->bug->openedBy = 'Created by';
->>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
-$lang->bug->openedDate = 'Created';
-$lang->bug->openedDateAB = 'Created';
-$lang->bug->openedBuild = 'Open Build';
-$lang->bug->assignedTo = 'Assign To';
-$lang->bug->assignBug = 'Assign To';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->assignedToAB = 'To';
$lang->bug->assignedDate = 'Assigned';
-$lang->bug->resolvedBy = 'Resolved';
-$lang->bug->resolvedByAB = 'Resolved';
-$lang->bug->resolution = 'Resolution';
-$lang->bug->resolutionAB = 'Resolution';
-$lang->bug->resolvedBuild = 'Resolved Build';
-$lang->bug->resolvedDate = 'Resolved';
-$lang->bug->resolvedDateAB = 'Resolved';
+$lang->bug->resolvedBy = 'Solved';
+$lang->bug->resolvedByAB = 'Solved';
+$lang->bug->resolution = 'Solution';
+$lang->bug->resolutionAB = 'Solution';
+$lang->bug->resolvedBuild = 'Solved Build';
+$lang->bug->resolvedDate = 'Solved';
+$lang->bug->resolvedDateAB = 'Solved';
$lang->bug->deadline = 'Deadline';
$lang->bug->plan = 'Plan';
$lang->bug->closedBy = 'Closed By';
$lang->bug->closedDate = 'Closed';
-$lang->bug->duplicateBug = 'Duplicate Bug ID';
+$lang->bug->duplicateBug = 'Duplicated Bug ID';
$lang->bug->lastEditedBy = 'Edited By';
$lang->bug->linkBug = 'Linked Bug';
$lang->bug->linkBugs = 'Link Bug';
@@ -81,15 +64,9 @@ $lang->bug->unlinkBug = 'Unlink';
$lang->bug->case = 'Case';
$lang->bug->files = 'File';
$lang->bug->keywords = 'Tags';
-<<<<<<< HEAD
-$lang->bug->lastEditedByAB = 'Edited by';
-$lang->bug->lastEditedDateAB = 'Edit';
-$lang->bug->lastEditedDate = 'Edit';
-=======
$lang->bug->lastEditedByAB = 'Edited By';
$lang->bug->lastEditedDateAB = 'Edited';
$lang->bug->lastEditedDate = 'Edited';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->fromCase = 'From Case';
$lang->bug->toCase = 'To Case';
$lang->bug->colorTag = 'Color Tag';
@@ -109,8 +86,8 @@ $lang->bug->assignTo = 'Assign';
$lang->bug->batchAssignTo = 'Batch Assign';
$lang->bug->browse = 'Bugs';
$lang->bug->view = 'Bug Details';
-$lang->bug->resolve = 'Resolve';
-$lang->bug->batchResolve = 'Batch Resolve';
+$lang->bug->resolve = 'Solve';
+$lang->bug->batchResolve = 'Batch Solve';
$lang->bug->close = 'Close';
$lang->bug->activate = 'Activate';
$lang->bug->batchActivate = 'Batch Activate';
@@ -118,9 +95,6 @@ $lang->bug->reportChart = 'Report';
$lang->bug->export = 'Export';
$lang->bug->delete = 'Delete';
$lang->bug->deleted = 'Deleted';
-$lang->bug->saveTemplate = 'Save as Template';
-$lang->bug->setPublic = 'Set as Public Template';
-$lang->bug->deleteTemplate = 'Delete Template';
$lang->bug->confirmStoryChange = 'Confirm Story Change';
$lang->bug->copy = 'Copy';
$lang->bug->search = 'Search';
@@ -128,10 +102,10 @@ $lang->bug->search = 'Search';
/* 查询条件列表。*/
$lang->bug->assignToMe = 'AssignToMe';
$lang->bug->openedByMe = 'CreateByMe';
-$lang->bug->resolvedByMe = 'ResolveByMe';
+$lang->bug->resolvedByMe = 'SolveByMe';
$lang->bug->closedByMe = 'ClosedByMe';
$lang->bug->assignToNull = 'Unassigned';
-$lang->bug->unResolved = 'Unresolved';
+$lang->bug->unResolved = 'Unsolved';
$lang->bug->toClosed = 'Unclosed';
$lang->bug->unclosed = 'Active';
$lang->bug->unconfirmed = 'UnConfirm';
@@ -140,27 +114,16 @@ $lang->bug->postponedBugs = 'Postponed';
$lang->bug->overdueBugs = 'Overdue';
$lang->bug->allBugs = 'All';
$lang->bug->byQuery = 'Search';
-<<<<<<< HEAD
-$lang->bug->needConfirm = 'ChangedStory';
-=======
$lang->bug->needConfirm = 'Story Changed';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->allProduct = 'All' . $lang->productCommon;
-<<<<<<< HEAD
-$lang->bug->my = 'Mine';
-$lang->bug->yesterdayResolved = 'Resolved Yesterday ';
-$lang->bug->yesterdayConfirmed = 'Confirmed Yesterday ';
-$lang->bug->yesterdayClosed = 'Closed Yesterday ';
-=======
$lang->bug->my = 'My';
-$lang->bug->yesterdayResolved = 'Bug Resolved Yesterday ';
+$lang->bug->yesterdayResolved = 'Bug Solved Yesterday ';
$lang->bug->yesterdayConfirmed = 'Bug Confirmed Yesterday ';
$lang->bug->yesterdayClosed = 'Bug Closed Yesterday ';
->>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->bug->assignToMeAB = 'AssignToMe';
$lang->bug->openedByMeAB = 'CreateByMe';
-$lang->bug->resolvedByMeAB = 'ResolveByMe';
+$lang->bug->resolvedByMeAB = 'SolveByMe';
$lang->bug->ditto = 'Ditto';
$lang->bug->dittoNotice = 'This bug is not linked to the same product as the last one!';
@@ -173,7 +136,7 @@ $lang->bug->delayWarning = "
Delay %s days bug->lblAssignedTo = 'Assignee';
$lang->bug->lblMailto = 'Mail To';
$lang->bug->lblLastEdited = 'Last Edited';
-$lang->bug->lblResolved = 'Resolved By';
+$lang->bug->lblResolved = 'Solved By';
$lang->bug->allUsers = 'All Users';
$lang->bug->allBuilds = 'All';
$lang->bug->createBuild = 'New';
@@ -186,27 +149,19 @@ $lang->bug->lblTypeAndSeverity = 'Type/Severity';
$lang->bug->lblSystemBrowserAndHardware = 'System/Browser';
$lang->bug->legendSteps = 'Repro Steps';
$lang->bug->legendComment = 'Note';
-<<<<<<< HEAD
$lang->bug->legendLife = 'About the Bug';
$lang->bug->legendMisc = 'Misc.';
-=======
-$lang->bug->legendLife = 'About';
-$lang->bug->legendMisc = 'Misc';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->legendRelated = 'Related Info';
/* 功能按钮。*/
$lang->bug->buttonConfirm = 'Confirm';
/* 交互提示。*/
-$lang->bug->summary = "Bugs on this page :
%s Total,
%s Unresolved.";
+$lang->bug->summary = "Bugs on this page :
%s Total,
%s Unsolved.";
$lang->bug->confirmChangeProduct = "Any change to {$lang->productCommon} will cause linked {$lang->projectCommon}, Story and Task change. Do you want to do this?";
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
-$lang->bug->setTemplateTitle = 'Please enter the title of template.';
$lang->bug->remindTask = 'This Bug has been converted to Task. Do you want to update Status of Task(ID %s)?';
-$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
-$lang->bug->applyTemplate = 'Template';
-$lang->bug->confirmDeleteTemplate = 'Do you want to delete this template?';
+$lang->bug->skipClose = 'Bug %s is not solved. You cannot close it.';
/* 模板。*/
$lang->bug->tplStep = "
[Steps]
";
@@ -287,7 +242,7 @@ $lang->bug->typeList['trackthings'] = 'Tracking';
$lang->bug->statusList[''] = '';
$lang->bug->statusList['active'] = 'Active';
-$lang->bug->statusList['resolved'] = 'Resolved';
+$lang->bug->statusList['resolved'] = 'Solved';
$lang->bug->statusList['closed'] = 'Closed';
$lang->bug->confirmedList[1] = 'Confirmed';
@@ -297,7 +252,7 @@ $lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = 'As Design';
$lang->bug->resolutionList['duplicate'] = 'Duplicated Bug';
$lang->bug->resolutionList['external'] = 'External Cause';
-$lang->bug->resolutionList['fixed'] = 'Resolved';
+$lang->bug->resolutionList['fixed'] = 'Solved';
$lang->bug->resolutionList['notrepro'] = 'Irreproducible';
$lang->bug->resolutionList['postponed'] = 'Postpone';
$lang->bug->resolutionList['willnotfix'] = "Ignore";
@@ -313,13 +268,13 @@ $lang->bug->report->charts['bugsPerProject'] = $lang->projectCommon . ' B
$lang->bug->report->charts['bugsPerBuild'] = 'Bugs Per Build';
$lang->bug->report->charts['bugsPerModule'] = 'Bugs Per Module';
$lang->bug->report->charts['openedBugsPerDay'] = 'Reported Bugs Per Day';
-$lang->bug->report->charts['resolvedBugsPerDay'] = 'Resolved Bugs Per Day';
+$lang->bug->report->charts['resolvedBugsPerDay'] = 'Solved Bugs Per Day';
$lang->bug->report->charts['closedBugsPerDay'] = 'Closed Bugs Per Day';
$lang->bug->report->charts['openedBugsPerUser'] = 'Reported Bugs Per User';
-$lang->bug->report->charts['resolvedBugsPerUser'] = 'Resolved Bugs Per User';
+$lang->bug->report->charts['resolvedBugsPerUser'] = 'Solved Bugs Per User';
$lang->bug->report->charts['closedBugsPerUser'] = 'Closed Bugs Per User';
$lang->bug->report->charts['bugsPerSeverity'] = 'Bug Severity Report';
-$lang->bug->report->charts['bugsPerResolution'] = 'Bug Resolution Report';
+$lang->bug->report->charts['bugsPerResolution'] = 'Bug Solution Report';
$lang->bug->report->charts['bugsPerStatus'] = 'Bug Status Report';
$lang->bug->report->charts['bugsPerActivatedCount'] = 'Bug Activation Report';
$lang->bug->report->charts['bugsPerPri'] = 'Bug Priority Report';
@@ -390,7 +345,7 @@ $lang->bug->report->resolvedBugsPerUser->graph->xAxisName = 'User';
$lang->bug->report->closedBugsPerUser->graph->xAxisName = 'User';
$lang->bug->report->bugsPerSeverity->graph->xAxisName = 'Priority';
-$lang->bug->report->bugsPerResolution->graph->xAxisName = 'Resolution';
+$lang->bug->report->bugsPerResolution->graph->xAxisName = 'Solution';
$lang->bug->report->bugsPerStatus->graph->xAxisName = 'Status';
$lang->bug->report->bugsPerActivatedCount->graph->xAxisName = 'Activated Count';
$lang->bug->report->bugsPerPri->graph->xAxisName = 'Priority';
@@ -401,7 +356,7 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Handling Steps';
/* 操作记录。*/
$lang->bug->action = new stdclass();
-$lang->bug->action->resolved = array('main' => '$date, resolved by
$actor and the solution is
$extra $appendLink.', 'extra' => 'resolutionList');
+$lang->bug->action->resolved = array('main' => '$date, solved by
$actor and the solution is
$extra $appendLink.', 'extra' => 'resolutionList');
$lang->bug->action->tostory = array('main' => '$date, converted by
$actor to
Story with ID
$extra.');
$lang->bug->action->totask = array('main' => '$date, imported by
$actor as
Task with ID
$extra.');
$lang->bug->action->linked2plan = array('main' => '$date, linked by
$actor to Plan
$extra.');
diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php
index 05d85d7f23..8094f9afaf 100644
--- a/module/bug/lang/zh-cn.php
+++ b/module/bug/lang/zh-cn.php
@@ -95,9 +95,6 @@ $lang->bug->reportChart = '报表统计';
$lang->bug->export = '导出数据';
$lang->bug->delete = '删除';
$lang->bug->deleted = '已删除';
-$lang->bug->saveTemplate = '保存模板';
-$lang->bug->setPublic = '设为公共模板';
-$lang->bug->deleteTemplate = '删除模板';
$lang->bug->confirmStoryChange = '确认需求变动';
$lang->bug->copy = '复制Bug';
$lang->bug->search = '搜索';
@@ -163,11 +160,8 @@ $lang->bug->buttonConfirm = '确认';
$lang->bug->summary = "本页共
%s 个Bug,未解决
%s。";
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->projectCommon}、需求和任务发生变化,确定吗?";
$lang->bug->confirmDelete = '您确认要删除该Bug吗?';
-$lang->bug->setTemplateTitle = '请输入bug模板标题';
$lang->bug->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?';
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
-$lang->bug->applyTemplate = '应用模板';
-$lang->bug->confirmDeleteTemplate = '您确认要删除该模板吗?';
/* 模板。*/
$lang->bug->tplStep = "
[步骤]
";
diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php
index ef6493b062..793317b8eb 100644
--- a/module/bug/lang/zh-tw.php
+++ b/module/bug/lang/zh-tw.php
@@ -95,9 +95,6 @@ $lang->bug->reportChart = '報表統計';
$lang->bug->export = '導出數據';
$lang->bug->delete = '刪除';
$lang->bug->deleted = '已刪除';
-$lang->bug->saveTemplate = '保存模板';
-$lang->bug->setPublic = '設為公共模板';
-$lang->bug->deleteTemplate = '刪除模板';
$lang->bug->confirmStoryChange = '確認需求變動';
$lang->bug->copy = '複製Bug';
$lang->bug->search = '搜索';
@@ -163,11 +160,8 @@ $lang->bug->buttonConfirm = '確認';
$lang->bug->summary = "本頁共
%s 個Bug,未解決
%s。";
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}會導致相應的{$lang->projectCommon}、需求和任務發生變化,確定嗎?";
$lang->bug->confirmDelete = '您確認要刪除該Bug嗎?';
-$lang->bug->setTemplateTitle = '請輸入bug模板標題';
$lang->bug->remindTask = '該Bug已經轉化為任務,是否更新任務(編號:%s)狀態 ?';
$lang->bug->skipClose = 'Bug %s 不是已解決狀態,不能關閉。';
-$lang->bug->applyTemplate = '應用模板';
-$lang->bug->confirmDeleteTemplate = '您確認要刪除該模板嗎?';
/* 模板。*/
$lang->bug->tplStep = "
[步驟]
";
diff --git a/module/bug/model.php b/module/bug/model.php
index 53075b9a37..cd81273fda 100644
--- a/module/bug/model.php
+++ b/module/bug/model.php
@@ -1670,7 +1670,12 @@ class bugModel extends model
{
$datas = $this->dao->select('openedBuild as name, count(openedBuild) as value')->from(TABLE_BUG)->where($this->reportCondition())->groupBy('openedBuild')->orderBy('value DESC')->fetchAll('name');
if(!$datas) return array();
- $builds = $this->loadModel('build')->getProductBuildPairs($this->session->product, $branch = 0, $params = '');
+ /* Judge if all product or not. */
+ $products = $this->session->product;
+ preg_match('/`product` IN \((?P
.+)\)/', $this->reportCondition(), $matchs);
+ if(!empty($matchs) and isset($matchs['productIdList'])) $products = str_replace('\'', '', $matchs['productIdList']);
+ $builds = $this->loadModel('build')->getProductBuildPairs($products, $branch = 0, $params = '');
+
/* Deal with the situation that a bug maybe associate more than one openedBuild. */
foreach($datas as $buildIDList => $data)
{
@@ -1939,45 +1944,6 @@ class bugModel extends model
foreach($commonOption->graph as $key => $value) if(!isset($chartOption->graph->$key)) $chartOption->graph->$key = $value;
}
- /**
- * Get bug templates of a user.
- *
- * @param string $account
- * @access public
- * @return array
- */
- public function getUserBugTemplates($account)
- {
- $templates = $this->dao->select('id,account,title,content,public')
- ->from(TABLE_USERTPL)
- ->where('type')->eq('bug')
- ->andwhere('account', true)->eq($account)
- ->orWhere('public')->eq('1')
- ->markRight(1)
- ->orderBy('id')
- ->fetchAll();
- return $templates;
- }
-
- /**
- * Save user template.
- *
- * @access public
- * @return void
- */
- public function saveUserBugTemplate()
- {
- $template = fixer::input('post')
- ->setDefault('account', $this->app->user->account)
- ->setDefault('type', 'bug')
- ->stripTags('content', $this->config->allowedTags)
- ->get();
-
- $condition = "`type`='bug' and account='{$this->app->user->account}'";
- $this->dao->insert(TABLE_USERTPL)->data($template)->batchCheck('title, content', 'notempty')->check('title', 'unique', $condition)->exec();
- if(!dao::isError()) $this->loadModel('score')->create('bug', 'saveTplModal', $this->dao->lastInsertID());
- }
-
/**
* Return the file => label pairs of some fields.
*
diff --git a/module/bug/view/buildtemplates.html.php b/module/bug/view/buildtemplates.html.php
deleted file mode 100644
index 59f831824f..0000000000
--- a/module/bug/view/buildtemplates.html.php
+++ /dev/null
@@ -1,11 +0,0 @@
- $template)
-{
- echo "";
- echo "";
- if($template->public) echo "{$lang->public} ";
- echo $template->title . "";
- if(empty($template->public) or $template->account == $app->user->account)echo "";
- echo "$template->content";
- echo '';
-}
diff --git a/module/bug/view/create.html.php b/module/bug/view/create.html.php
index 110e9e4d45..0f1c77a5f9 100644
--- a/module/bug/view/create.html.php
+++ b/module/bug/view/create.html.php
@@ -19,7 +19,7 @@ js::set('page', 'create');
js::set('createRelease', $lang->release->create);
js::set('createBuild', $lang->build->create);
js::set('refresh', $lang->refresh);
-js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
+js::set('flow', $config->global->flow);
?>
@@ -217,17 +217,7 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
| bug->steps;?> |
-
+ fetch('user', 'ajaxPrintTemplates', 'type=bug&link=steps');?>
|
@@ -305,24 +295,5 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
-
-
-
-
-
-
-
-
- $lang->public))?>
-
-
-
-
-
-
-
bug->module);?>
diff --git a/module/build/lang/en.php b/module/build/lang/en.php
index e1c69b160d..a2683a0d7c 100644
--- a/module/build/lang/en.php
+++ b/module/build/lang/en.php
@@ -43,13 +43,13 @@ $lang->build->packageType = 'Package Type';
$lang->build->unlinkStory = 'Unlink Story';
$lang->build->unlinkBug = 'Unlink Bug';
$lang->build->stories = 'Finished Story';
-$lang->build->bugs = 'Resolved Bug';
+$lang->build->bugs = 'Solved Bug';
$lang->build->generatedBugs = 'Reported Bug';
$lang->build->noProduct = " This {$lang->projectCommon} is not linked to {$lang->productCommon}, so the Build cannot be created. Please first link {$lang->productCommon}";
$lang->build->noBuild = 'No builds. ';
$lang->build->finishStories = ' %s Story is finished.';
-$lang->build->resolvedBugs = ' %s Bug is resolved.';
+$lang->build->resolvedBugs = ' %s Bug is solved.';
$lang->build->createdBugs = ' %s Bug is created.';
$lang->build->placeholder = new stdclass();
diff --git a/module/common/lang/en.php b/module/common/lang/en.php
index 096fca372f..5a83ee36fa 100644
--- a/module/common/lang/en.php
+++ b/module/common/lang/en.php
@@ -21,13 +21,13 @@ $lang->percent = '%';
$lang->dash = '-';
$lang->zentaoPMS = 'ZenTao';
-$lang->welcome = "%s PMS";
+$lang->welcome = "%s ALM";
$lang->logout = 'Logout';
$lang->login = 'Login';
$lang->help = 'Help';
$lang->aboutZenTao = 'ZenTao';
$lang->profile = 'Profile';
-$lang->changePassword = 'Password';
+$lang->changePassword = 'Change Password';
$lang->runInfo = "Time %s MS, Memory %s KB, Query %s.
";
$lang->agreement = "I have read and agreed to the terms and conditions of Z PUBLIC LICENSE 1.2 . Without authorization, I should not remove, hide or cover any logos/links of ZenTao.";
$lang->designedByAIUX = "Designed by AIUX";
@@ -59,30 +59,30 @@ $lang->required = 'Required';
$lang->noData = 'No data.';
$lang->actions = 'Action';
-$lang->restore = 'Restore';
+$lang->restore = 'Reset';
$lang->comment = 'Note';
$lang->history = 'History';
$lang->attatch = 'File';
-$lang->reverse = 'Reverse';
+$lang->reverse = 'Inverse';
$lang->switchDisplay = 'Toggle';
$lang->expand = 'Expand';
$lang->collapse = 'Collapse';
$lang->saveSuccess = 'Saved';
$lang->fail = 'Fail';
-$lang->addFiles = 'Add';
+$lang->addFiles = 'Added Files';
$lang->files = 'Files ';
$lang->pasteText = 'Paste';
-$lang->uploadImages = 'Upload';
-$lang->timeout = 'Timeout. Pease check your connection, or try it again!';
-$lang->repairTable = 'Database table might be damaged. Execute phpmyadmin or myisamchk to fix it.';
+$lang->uploadImages = 'Upload Image';
+$lang->timeout = 'Timeout. Check your newtwork connections, or try it again!';
+$lang->repairTable = 'Database table might be damaged. Run phpmyadmin or myisamchk to fix it.';
$lang->duplicate = '%s has the same title as a file title existed.';
$lang->ipLimited = "Sorry, your current IP is restricted. PLease contact your Administer to grant your permissions.";
$lang->unfold = '+';
$lang->fold = '-';
$lang->homepage = 'Set Home';
-$lang->noviceTutorial = 'Rookie Tutorial';
+$lang->noviceTutorial = 'ZenTao Tutorial';
$lang->changeLog = 'Change Log';
-$lang->manual = 'Manual';
+$lang->manual = 'User Manual';
$lang->manualUrl = 'https://www.zentao.pm/book/zentaomanual/zentao-installation-11.html';
$lang->customMenu = 'Custom Menu';
$lang->customField = 'Custom Field';
@@ -95,15 +95,16 @@ $lang->nextShortcutKey = '[Shortcut:→]';
$lang->backShortcutKey = '[Shortcut:Alt+↑]';
$lang->select = 'Select';
-$lang->selectAll = 'All';
-$lang->selectReverse = 'Reverse';
+$lang->selectAll = 'Select All';
+$lang->selectReverse = 'Select Inverse';
$lang->loading = 'Loading...';
$lang->notFound = 'Not found!';
+$lang->notPage = 'Sorry, the features you are visiting are in development!';
$lang->showAll = '[[Show All]]';
$lang->future = 'Pending';
$lang->year = 'Year';
-$lang->workingHour = 'Hour';
+$lang->workingHour = 'Man-hour';
$lang->idAB = 'ID';
$lang->priAB = 'P';
@@ -186,10 +187,10 @@ $lang->my->menu->index = 'Home|my|index';
$lang->my->menu->calendar = array('link' => 'Calendar|my|calendar|', 'subModule' => 'todo', 'alias' => 'todo');
$lang->my->menu->task = array('link' => 'Task|my|task|', 'subModule' => 'task');
$lang->my->menu->bug = array('link' => 'Bug|my|bug|', 'subModule' => 'bug');
-$lang->my->menu->testtask = array('link' => 'Test Task|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase');
+$lang->my->menu->testtask = array('link' => 'Test|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase');
$lang->my->menu->story = array('link' => 'Story|my|story|', 'subModule' => 'story');
$lang->my->menu->myProject = "{$lang->projectCommon}|my|project|";
-$lang->my->menu->dynamic = 'Dynamic|my|dynamic|';
+$lang->my->menu->dynamic = 'Dynamics|my|dynamic|';
$lang->my->menu->profile = array('link' => 'Profile|my|profile', 'alias' => 'editprofile');
$lang->my->menu->changePassword = 'Password|my|changepassword';
$lang->my->menu->manageContacts = 'Contact|my|managecontacts';
@@ -212,7 +213,7 @@ $lang->product->menu->plan = array('link' => 'Plan|productplan|browse|produc
$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release');
$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s";
-$lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s';
+$lang->product->menu->dynamic = 'Dynamics|product|dynamic|productID=%s';
$lang->product->menu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->menu->branch = '@branch@|branch|manage|productID=%s';
$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story';
@@ -241,7 +242,7 @@ $lang->project->menu->list = array('link' => 'More|project|grouptask|project
$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
$lang->project->menu->qa = array('link' => 'Test|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover');
$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
-$lang->project->menu->action = array('link' => 'Dynamic|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover');
+$lang->project->menu->action = array('link' => 'Dynamics|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover');
$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s';
$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers');
$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close');
@@ -254,7 +255,7 @@ $lang->project->subMenu->list->tree = 'Tree View|project|tree|projectID=%s'
$lang->project->subMenu->qa = new stdclass();
$lang->project->subMenu->qa->bug = 'Bug|project|bug|projectID=%s';
$lang->project->subMenu->qa->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build');
-$lang->project->subMenu->qa->testtask = array('link' => 'Test Task|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask');
+$lang->project->subMenu->qa->testtask = array('link' => 'Test|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask');
$lang->project->dividerMenu = ',story,team,product,';
@@ -307,7 +308,7 @@ $lang->testsuite = new stdclass();
$lang->testsuite->menu = new stdclass();
$lang->testsuite->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
$lang->testsuite->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
-$lang->testsuite->menu->testtask = array('link' => 'Test Task|testtask|browse|productID=%s');
+$lang->testsuite->menu->testtask = array('link' => 'Test|testtask|browse|productID=%s');
$lang->testsuite->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
$lang->testsuite->menu->report = array('link' => 'Report|testreport|browse|productID=%s');
$lang->testsuite->menu->caselib = array('link' => 'Case Library|testsuite|library');
@@ -348,7 +349,7 @@ $lang->report->menu->test = array('link' => 'Test|report|bugcreate', 'alias'
$lang->report->menu->staff = array('link' => 'Company|report|workload');
$lang->report->notice = new stdclass();
-$lang->report->notice->help = 'Note: Report is generated on search results. Please search the list before you generate a report.';
+$lang->report->notice->help = 'Note: Report is generated based on the search results of the list. Please search in the list before you generate a report.';
/* Company menu settings. */
$lang->company = new stdclass();
@@ -356,7 +357,7 @@ $lang->company->menu = new stdclass();
$lang->company->menu->browseUser = array('link' => 'User|company|browse', 'subModule' => 'user');
$lang->company->menu->dept = array('link' => 'Department|dept|browse', 'subModule' => 'dept');
$lang->company->menu->browseGroup = array('link' => 'Privilege|group|browse', 'subModule' => 'group');
-$lang->company->menu->dynamic = 'Dynamic|company|dynamic|';
+$lang->company->menu->dynamic = 'Dynamics|company|dynamic|';
$lang->company->menu->view = array('link' => 'Company|company|view');
$lang->dept = new stdclass();
@@ -373,7 +374,7 @@ $lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
$lang->admin->menu->message = array('link' => 'Message|message|index', 'subModule' => 'message,mail,webhook');
$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom');
-$lang->admin->menu->sso = array('link' => 'Integrate|admin|sso');
+$lang->admin->menu->sso = array('link' => 'Integration|admin|sso');
$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->data = array('link' => 'Data|backup|index', 'subModule' => 'backup,action');
@@ -384,7 +385,7 @@ $lang->admin->subMenu = new stdclass();
$lang->admin->subMenu->message = new stdclass();
$lang->admin->subMenu->message->mail = array('link' => 'Mail|mail|index', 'subModule' => 'mail');
$lang->admin->subMenu->message->webhook = array('link' => 'Webhook|webhook|browse', 'subModule' => 'webhook');
-$lang->admin->subMenu->message->setting = array('link' => 'Setting|message|setting', 'subModule' => 'message');
+$lang->admin->subMenu->message->setting = array('link' => 'Settings|message|setting', 'subModule' => 'message');
$lang->admin->subMenu->sso = new stdclass();
$lang->admin->subMenu->sso->ranzhi = 'Zdoo|admin|sso';
@@ -446,10 +447,13 @@ $lang->menugroup->user = 'company';
$lang->menugroup->group = 'company';
$lang->menugroup->bug = 'qa';
$lang->menugroup->testcase = 'qa';
+$lang->menugroup->case = 'qa';
+$lang->menugroup->caselib = 'qa';
$lang->menugroup->testtask = 'qa';
$lang->menugroup->testsuite = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testreport = 'qa';
+$lang->menugroup->doclib = 'doc';
$lang->menugroup->people = 'company';
$lang->menugroup->dept = 'company';
$lang->menugroup->todo = 'my';
@@ -471,23 +475,23 @@ $lang->error = new stdclass();
$lang->error->companyNotFound = "The domain %s cannot be found!";
$lang->error->length = array("『%s』length error. It should be『%s』", "『%s』length should be <=『%s』and >『%s』.");
$lang->error->reg = "『%s』format error. It should be『%s』.";
-$lang->error->unique = "『%s』『%s』exists. Go to Admin->Recycle to restore it, if you are sure it is deleted.";
+$lang->error->unique = "『%s』『%s』exists. Go to Admin->Recycle Bin to restore it, if you are sure it is deleted.";
$lang->error->gt = "『%s』should be >『%s』.";
$lang->error->ge = "『%s』should be >=『%s』.";
$lang->error->notempty = "『%s』should not be blank.";
$lang->error->empty = "『%s』should be null.";
$lang->error->equal = "『%s』has to be『%s』.";
$lang->error->int = array("『%s』should be numbers", "『%s』should be 『%s-%s』.");
-$lang->error->float = "『%s』should have numbers, decimals.";
+$lang->error->float = "『%s』should have numbers, or decimals.";
$lang->error->email = "『%s』should be valid Email.";
$lang->error->date = "『%s』should be valid date.";
$lang->error->datetime = "『%s』should be valid date.";
$lang->error->code = "『%s』should be letters or numbers.";
-$lang->error->account = "『%s』should be letters or numbers of three or more.";
+$lang->error->account = "『%s』should be >= 3 letters or numbers.";
$lang->error->passwordsame = "Passwords should be consistent.";
-$lang->error->passwordrule = "Password should abide by rules. It should be at least 6 characters.";
+$lang->error->passwordrule = "Password should conform to rules. It should be >= 6 characters.";
$lang->error->accessDenied = 'Access is denied.';
-$lang->error->pasteImg = 'Image is not allowed to paste in your browser!';
+$lang->error->pasteImg = 'Images are not allowed to be pasted in your browser!';
$lang->error->noData = 'No data.';
$lang->error->editedByOther = 'This record might have been changed. Please refresh and try to edit again!';
$lang->error->tutorialData = 'No data can be imported in tutorial mode. Please quit tutorial first!';
@@ -510,37 +514,22 @@ $lang->proVersion = "chooseUsersToMail = "Choose users to be notified.";
-$lang->browserNotice = 'Your current browser might not display the best effect. Use Chrome, Firefox, IE9+, Opera or Safari.';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
-=======
-$lang->chooseUsersToMail = "Choose users to be notified";
-$lang->browserNotice = 'Your browser might not display the best effect. Use Chrome, Firefox, IE9+, Opera or Safari.';
->>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
+$lang->browserNotice = 'The browser you currently use might not get the best browsing results. It is recommended that you use Chrome, Firefox, IE9+, Opera or Safari.';
$lang->noticePasteImg = "Paste images here";
$lang->pasteImgFail = "Pasting image failed. Try again later.";
$lang->pasteImgUploading = "Uploading...";
@@ -751,17 +740,10 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Add bug, testcase and testtask module. */
$lang->menu->bug = 'Bug|bug|index';
-<<<<<<< HEAD
$lang->menu->testcase = 'Case|testcase|index';
$lang->menu->testsuite = 'Suite|testsuite|index';
$lang->menu->testtask = 'Test|testtask|index';
$lang->menu->caselib = 'Case Library|testsuite|library';
-=======
- $lang->menu->testcase = 'Test Case|testcase|index';
- $lang->menu->testsuite = 'Test Suite|testsuite|index';
- $lang->menu->testtask = 'Test|testtask|index';
- $lang->menu->caselib = 'Case Lib|testsuite|library';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->menuOrder[6] = 'bug';
$lang->menuOrder[7] = 'testcase';
@@ -774,11 +756,11 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
$lang->bug->menu = new stdclass();
$lang->bug->menu->all = 'All|bug|browse|productID=%s&branch=%s&browseType=all¶m=%s';
$lang->bug->menu->unclosed = 'Open|bug|browse|productID=%s&branch=%s&browseType=unclosed¶m=%s';
- $lang->bug->menu->openedbyme = 'CreateByMe|bug|browse|productID=%s&branch=%s&browseType=openedbyme¶m=%s';
- $lang->bug->menu->assigntome = 'AssignToMe|bug|browse|productID=%s&branch=%s&browseType=assigntome¶m=%s';
- $lang->bug->menu->resolvedbyme = 'ResolveByMe|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme¶m=%s';
+ $lang->bug->menu->openedbyme = 'CreatedByMe|bug|browse|productID=%s&branch=%s&browseType=openedbyme¶m=%s';
+ $lang->bug->menu->assigntome = 'AssignedToMe|bug|browse|productID=%s&branch=%s&browseType=assigntome¶m=%s';
+ $lang->bug->menu->resolvedbyme = 'SolvedByMe|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme¶m=%s';
$lang->bug->menu->toclosed = 'ToBeClosed|bug|browse|productID=%s&branch=%s&browseType=toclosed¶m=%s';
- $lang->bug->menu->unresolved = 'Unresolved|bug|browse|productID=%s&branch=%s&browseType=unresolved¶m=%s';
+ $lang->bug->menu->unresolved = 'Unsolved|bug|browse|productID=%s&branch=%s&browseType=unresolved¶m=%s';
$lang->bug->menu->more = array('link' => 'More|bug|browse|productID=%s&branch=%s&browseType=unconfirmed¶m=%s', 'class' => 'dropdown dropdown-hover');
$lang->bug->subMenu = new stdclass();
@@ -788,7 +770,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
$lang->bug->subMenu->more->longlifebugs = 'Pending|bug|browse|productID=%s&branch=%s&browseType=longlifebugs¶m=%s';
$lang->bug->subMenu->more->postponedbugs = 'Postponed|bug|browse|productID=%s&branch=%s&browseType=postponedbugs¶m=%s';
$lang->bug->subMenu->more->overduebugs = 'Overdue|bug|browse|productID=%s&branch=%s&browseType=overduebugs¶m=%s';
- $lang->bug->subMenu->more->needconfirm = 'ToConfirm|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s';
+ $lang->bug->subMenu->more->needconfirm = 'ToBeConfirmed|bug|browse|productID=%s&branch=%s&browseType=needconfirm¶m=%s';
$lang->bug->menuOrder[5] = 'product';
$lang->bug->menuOrder[10] = 'all';
@@ -808,7 +790,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of testcase. */
$lang->testcase->menu = new stdclass();
$lang->testcase->menu->all = 'All|testcase|browse|productID=%s&branch=%s&browseType=all';
- $lang->testcase->menu->wait = 'Wait|testcase|browse|productID=%s&branch=%s&browseType=wait';
+ $lang->testcase->menu->wait = 'Pending|testcase|browse|productID=%s&branch=%s&browseType=wait';
$lang->testcase->menu->bysuite = array('link' => 'Suite|testsuite|create|productID=%s', 'class' => 'dropdown dropdown-hover');
$lang->testcase->subMenu = new stdclass();
@@ -828,7 +810,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of testtask. */
$lang->testtask->menu = new stdclass();
$lang->testtask->menu->totalStatus = 'All|testtask|browse|productID=%s&branch=%s&type=%s,totalStatus';
- $lang->testtask->menu->wait = 'Wait|testtask|browse|productID=%s&branch=%s&type=%s,wait';
+ $lang->testtask->menu->wait = 'Pending|testtask|browse|productID=%s&branch=%s&type=%s,wait';
$lang->testtask->menu->doing = 'Doing|testtask|browse|productID=%s&branch=%s&type=%s,doing';
$lang->testtask->menu->blocked = 'Blocked|testtask|browse|productID=%s&branch=%s&type=%s,blocked';
$lang->testtask->menu->done = 'Done|testtask|browse|productID=%s&branch=%s&type=%s,done';
@@ -849,7 +831,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of caselib module. */
$lang->caselib->menu = new stdclass();
$lang->caselib->menu->all = 'All|testsuite|library|libID=%s&browseType=all';
- $lang->caselib->menu->wait = 'Wait|testsuite|library|libID=%s&browseType=wait';
+ $lang->caselib->menu->wait = 'Pending|testsuite|library|libID=%s&browseType=wait';
$lang->caselib->menu->view = 'View|testsuite|libview|libID=%s';
$lang->caselib->menuOrder[5] = 'lib';
diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php
index 9356bc5b79..44e9dd616e 100644
--- a/module/common/lang/zh-cn.php
+++ b/module/common/lang/zh-cn.php
@@ -99,6 +99,7 @@ $lang->selectAll = '全选';
$lang->selectReverse = '反选';
$lang->loading = '稍候...';
$lang->notFound = '抱歉,您访问的对象并不存在!';
+$lang->notPage = '抱歉,您访问的功能正在开发中!';
$lang->showAll = '[[全部显示]]';
$lang->future = '未来';
@@ -446,10 +447,13 @@ $lang->menugroup->user = 'company';
$lang->menugroup->group = 'company';
$lang->menugroup->bug = 'qa';
$lang->menugroup->testcase = 'qa';
+$lang->menugroup->case = 'qa';
+$lang->menugroup->caselib = 'qa';
$lang->menugroup->testtask = 'qa';
$lang->menugroup->testsuite = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testreport = 'qa';
+$lang->menugroup->doclib = 'doc';
$lang->menugroup->people = 'company';
$lang->menugroup->dept = 'company';
$lang->menugroup->todo = 'my';
@@ -858,6 +862,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust menu group. */
$lang->menugroup->bug = 'bug';
$lang->menugroup->testcase = 'testcase';
+ $lang->menugroup->case = 'testcase';
$lang->menugroup->testtask = 'testtask';
$lang->menugroup->testsuite = 'testsuite';
$lang->menugroup->testreport = 'testtask';
diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php
index 46251542ad..3a62992548 100644
--- a/module/common/lang/zh-tw.php
+++ b/module/common/lang/zh-tw.php
@@ -99,6 +99,7 @@ $lang->selectAll = '全選';
$lang->selectReverse = '反選';
$lang->loading = '稍候...';
$lang->notFound = '抱歉,您訪問的對象並不存在!';
+$lang->notPage = '抱歉,您訪問的功能正在開發中!';
$lang->showAll = '[[全部顯示]]';
$lang->future = '未來';
@@ -446,10 +447,13 @@ $lang->menugroup->user = 'company';
$lang->menugroup->group = 'company';
$lang->menugroup->bug = 'qa';
$lang->menugroup->testcase = 'qa';
+$lang->menugroup->case = 'qa';
+$lang->menugroup->caselib = 'qa';
$lang->menugroup->testtask = 'qa';
$lang->menugroup->testsuite = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testreport = 'qa';
+$lang->menugroup->doclib = 'doc';
$lang->menugroup->people = 'company';
$lang->menugroup->dept = 'company';
$lang->menugroup->todo = 'my';
@@ -858,6 +862,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust menu group. */
$lang->menugroup->bug = 'bug';
$lang->menugroup->testcase = 'testcase';
+ $lang->menugroup->case = 'testcase';
$lang->menugroup->testtask = 'testtask';
$lang->menugroup->testsuite = 'testsuite';
$lang->menugroup->testreport = 'testtask';
diff --git a/module/common/model.php b/module/common/model.php
index 49a6cae306..a6331566c8 100644
--- a/module/common/model.php
+++ b/module/common/model.php
@@ -1645,7 +1645,6 @@ EOD;
public function checkEntry()
{
$this->loadModel('entry');
-
if($this->session->valid_entry)
{
if(!$this->session->entry_code) $this->response('SESSION_CODE_MISSING');
@@ -1661,7 +1660,7 @@ EOD;
if(!$entry->key) $this->response('EMPTY_KEY');
if(empty($entry->account)) $this->response('ACCOUNT_UNBOUND');
if(!$this->checkIP($entry->ip)) $this->response('IP_DENIED');
- if(!$this->checkEntryToken($entry->key)) $this->response('INVALID_TOKEN');
+ if(!$this->checkEntryToken($entry)) $this->response('INVALID_TOKEN');
$this->loadModel('user');
$user = $this->dao->findByAccount($entry->account)->from(TABLE_USER)->fetch();
@@ -1676,6 +1675,14 @@ EOD;
$this->session->set('VALID_ENTRY', md5(md5($this->get->code) . $this->server->remote_addr));
$this->loadModel('entry')->saveLog($entry->id, $this->server->request_uri);
+ /* Add for task #5384. */
+ if($_SERVER['REQUEST_METHOD'] == 'POST' and empty($_POST))
+ {
+ $post = file_get_contents("php://input");
+ if(!empty($post)) $post = json_decode($post, true);
+ if(!empty($post)) $_POST = $post;
+ }
+
unset($_GET['code']);
unset($_GET['token']);
}
@@ -1683,16 +1690,30 @@ EOD;
/**
* Check token of an entry.
*
- * @param string $key
+ * @param object $entry
* @access public
- * @return void
+ * @return bool
*/
- public function checkEntryToken($key)
+ public function checkEntryToken($entry)
{
parse_str($this->server->query_String, $queryString);
unset($queryString['token']);
+
+ /* Change for task #5384. */
+ if(isset($queryString['time']))
+ {
+ $result = $this->get->token == md5($entry->code . $entry->key . $queryString['time']);
+ if($result)
+ {
+ if($queryString['time'] <= $entry->calledTime) $this->response('CALLED_TIME');
+ $this->loadModel('entry')->updateTime($entry->code, $queryString['time']);
+ unset($_GET['time']);
+ return $result;
+ }
+ }
+
$queryString = http_build_query($queryString);
- return $this->get->token == md5(md5($queryString) . $key);
+ return $this->get->token == md5(md5($queryString) . $entry->key);
}
/**
diff --git a/module/company/lang/en.php b/module/company/lang/en.php
index 35bd18740d..8e62a5315f 100644
--- a/module/company/lang/en.php
+++ b/module/company/lang/en.php
@@ -14,10 +14,10 @@ $lang->company->index = "Home";
$lang->company->edit = "Edit Company";
$lang->company->view = "Company Information";
$lang->company->browse = "User List";
-$lang->company->dynamic = "Dynamic";
+$lang->company->dynamic = "Dynamics";
$lang->company->orgView = 'View';
-$lang->company->name = 'Name';
+$lang->company->name = 'Company Name';
$lang->company->phone = 'Phone';
$lang->company->fax = 'Fax';
$lang->company->address = 'Mailing Address';
@@ -25,7 +25,7 @@ $lang->company->zipcode = 'Zip Code';
$lang->company->website = 'Website';
$lang->company->backyard = 'Intranet';
$lang->company->guest = 'Guest Login';
-$lang->company->admins = 'Administrators';
+$lang->company->admins = 'Administrator';
$lang->company->product = $lang->productCommon;
$lang->company->project = $lang->projectCommon;
diff --git a/module/convert/lang/en.php b/module/convert/lang/en.php
index 35d4d1fedb..9c3033fba2 100644
--- a/module/convert/lang/en.php
+++ b/module/convert/lang/en.php
@@ -14,8 +14,8 @@ $lang->convert->index = 'Home';
$lang->convert->start = 'Start';
$lang->convert->desc = <<Welcome to the System Conversion Wizard, this program will assist you to convert data to ZenTao PMS.
-There is certain risk of conversion, so it is strongly recommended that you back up your databse and relavant files before conversion, and make sure no one is operating on either systems.
+Welcome to the System Conversion Wizard, this program will assist you to convert data to ZenTao.
+There are risks in the conversion, so it is strongly recommended that you back up your databse and relavant files before conversion, and make sure that no one is using either system.
EOT;
$lang->convert->setConfig = 'Source Config';
@@ -31,7 +31,7 @@ $lang->convert->mustSelectSource = "You must select a source system.";
$lang->convert->direction = "{$lang->projectCommon} converted to";
$lang->convert->questionTypeOfRedmine = 'Type in Redmine';
-$lang->convert->aimTypeOfZentao = 'Convert to Type in Zentao';
+$lang->convert->aimTypeOfZentao = 'Convert to Type in ZenTao';
$lang->convert->directionList['bug'] = 'Bug';
$lang->convert->directionList['task'] = 'Task';
@@ -51,17 +51,17 @@ $lang->convert->dbPort = 'Server Port';
$lang->convert->dbUser = 'Database User Name';
$lang->convert->dbPassword = 'Database Password';
$lang->convert->dbName = 'Database used in %s';
-$lang->convert->dbCharset = '%s Database Code';
+$lang->convert->dbCharset = '%s Database Coding';
$lang->convert->dbPrefix = '%s Table Prefix';
-$lang->convert->installPath = '%s Installed path';
+$lang->convert->installPath = '%s Installation Root Directory';
$lang->convert->checkDB = 'Database';
$lang->convert->checkTable = 'Table';
-$lang->convert->checkPath = 'Installed Path';
+$lang->convert->checkPath = 'Installation Path';
$lang->convert->execute = 'Convert';
$lang->convert->item = 'Item Converted';
-$lang->convert->count = 'Count';
+$lang->convert->count = 'No.';
$lang->convert->info = 'Info';
$lang->convert->bugfree = new stdclass();
diff --git a/module/cron/lang/en.php b/module/cron/lang/en.php
index 23dd843cb6..3178ee5af9 100644
--- a/module/cron/lang/en.php
+++ b/module/cron/lang/en.php
@@ -1,7 +1,7 @@
cron->common = 'Scheduled Task';
+$lang->cron->common = 'Cron';
$lang->cron->index = 'Home';
-$lang->cron->list = 'Tasks';
+$lang->cron->list = 'Task';
$lang->cron->create = 'Add';
$lang->cron->edit = 'Edit';
$lang->cron->delete = 'Delete';
@@ -17,37 +17,37 @@ $lang->cron->dow = 'Week';
$lang->cron->command = 'Command';
$lang->cron->status = 'Status';
$lang->cron->type = 'Type';
-$lang->cron->remark = 'Remark';
-$lang->cron->lastTime = 'Last Executed';
+$lang->cron->remark = 'Comment';
+$lang->cron->lastTime = 'Last Run';
$lang->cron->turnonList['1'] = 'On';
-$lang->cron->turnonList['0'] = 'Shutdown';
+$lang->cron->turnonList['0'] = 'Off';
$lang->cron->statusList['normal'] = 'Normal';
$lang->cron->statusList['running'] = 'Running';
$lang->cron->statusList['stop'] = 'Stop';
-$lang->cron->typeList['zentao'] = 'Self call';
+$lang->cron->typeList['zentao'] = 'Self Call';
$lang->cron->typeList['system'] = 'System Command';
$lang->cron->toggleList['start'] = 'Activate';
$lang->cron->toggleList['stop'] = 'Deactivate';
-$lang->cron->confirmDelete = 'Do you want to delete the Scheduled Task?';
-$lang->cron->confirmTurnon = 'Do you want to truncoff the Cron?';
+$lang->cron->confirmDelete = 'Do you want to delete the cron?';
+$lang->cron->confirmTurnon = 'Do you want to turn off the cron?';
$lang->cron->introduction = <<Scheduled Task can do scheduled execution, such as update burndown chart, backup, etc.
-This function need to be improved, so it is turned off by default.
+Cron is to perform scheduled actions, such as update burndown chart, backup, etc.
+Features of Cron need to be improved, so it is turned off by default.
EOD;
$lang->cron->confirmOpen = <<Do you want to turn it on?Turn On Scheduled Task
EOD;
$lang->cron->notice = new stdclass();
-$lang->cron->notice->m = 'Range:0-59,"*" means the numbers within the range, "/" means "per", "-" means ranger.';
+$lang->cron->notice->m = 'Range:0-59,"*" means the numbers within the range, "/" means "per", "-" means the range.';
$lang->cron->notice->h = 'Range:0-23';
$lang->cron->notice->dom = 'Range:1-31';
$lang->cron->notice->mon = 'Range:1-12';
$lang->cron->notice->dow = 'Range:0-6';
-$lang->cron->notice->help = 'Note:If server restarted, or Scheduled Task is not working, it means Scheduled Task has stopped. You can restart it by clicking 【Restart】 or reload this page. If the last execution time in changed, it means the Task is running.';
+$lang->cron->notice->help = 'Note:If the server is restarted, or the Cron is not working, it means the Cron has stopped. You can restart it by clicking 【Restart】 or refresh this page. If the last execution time is changed, it means the Cron is running.';
$lang->cron->notice->errorRule = '"%s" is not valid';
diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php
index ba42039ee5..360d747b5b 100644
--- a/module/custom/lang/en.php
+++ b/module/custom/lang/en.php
@@ -50,9 +50,9 @@ $lang->custom->bug->fields['severityList'] = 'Severity';
$lang->custom->bug->fields['osList'] = 'OS';
$lang->custom->bug->fields['browserList'] = 'Browser';
$lang->custom->bug->fields['typeList'] = 'Type';
-$lang->custom->bug->fields['resolutionList'] = 'Resolution';
+$lang->custom->bug->fields['resolutionList'] = 'Solution';
$lang->custom->bug->fields['statusList'] = 'Status';
-$lang->custom->bug->fields['longlife'] = 'Longlife days';
+$lang->custom->bug->fields['longlife'] = 'Pending Days';
$lang->custom->testcase = new stdClass();
$lang->custom->testcase->fields['priList'] = 'Priority';
@@ -77,29 +77,25 @@ $lang->custom->user->fields['statusList'] = 'Status';
$lang->custom->user->fields['contactField'] = 'Available Contact';
$lang->custom->user->fields['deleted'] = 'Deleted User';
-$lang->custom->system = array('flow', 'working', 'required', 'score');
+$lang->custom->system = array('flow', 'working', 'required', 'score', 'setDynamic');
$lang->custom->block->fields['closed'] = 'Closed Block';
$lang->custom->currentLang = 'Current Language';
-$lang->custom->allLang = 'All Language';
+$lang->custom->allLang = 'All Languages';
-$lang->custom->confirmRestore = 'Do you want to reset the settings?';
+$lang->custom->confirmRestore = 'Do you want to reset?';
$lang->custom->notice = new stdclass();
-$lang->custom->notice->userFieldNotice = 'Control whether the above fields are displayed on the user-related page, and leave it blank to display all';
+$lang->custom->notice->userFieldNotice = 'Control whether the above fields are displayed on the user-related page. Leave it blank and it will display all.';
$lang->custom->notice->canNotAdd = 'It will be calculated, so customization is not enabled.';
$lang->custom->notice->forceReview = '%s Review is required for certain committers.';
$lang->custom->notice->forceNotReview = "%s Review is NOT required for certain committers.";
$lang->custom->notice->longlife = 'Define longlife bugs.';
$lang->custom->notice->invalidNumberKey = 'The key should be =< 255.';
$lang->custom->notice->invalidStringKey = 'The key should be a combination of lowercase letters, numbers or underlines.';
-<<<<<<< HEAD
$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set does not exist or is disabled. Timezone cannot be set.';
-=======
-$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set does not exist or is disabled. Time zone cannot be set.';
$lang->custom->notice->noClosedBlock = 'Blocks without permanent closure';
->>>>>>> 49933c0fcb7f076b5948bc4dba29468ed23927ec
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Home. Do you want to go to Product Home?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Home. Do you want to go to Project Home?";
@@ -111,15 +107,15 @@ $lang->custom->notice->invalidStrlen['thirty'] = 'The key should be <= 30 ch
$lang->custom->notice->invalidStrlen['twoHundred'] = 'The key should be <= 225 characters.';
$lang->custom->storyReview = 'Review';
-$lang->custom->forceReview = 'Required Review';
-$lang->custom->forceNotReview = 'No review';
+$lang->custom->forceReview = 'Review';
+$lang->custom->forceNotReview = 'No Review';
$lang->custom->reviewList[1] = 'On';
$lang->custom->reviewList[0] = 'Off';
$lang->custom->deletedList[1] = 'Show';
$lang->custom->deletedList[0] = 'Hide';
-$lang->custom->workingHours = 'hours/day';
+$lang->custom->workingHours = 'hour/day';
$lang->custom->weekend = 'Weekend';
$lang->custom->weekendList[2] = '2-Day Off';
$lang->custom->weekendList[1] = '1-Day Off';
@@ -136,7 +132,7 @@ $lang->custom->workingList['onlyTest'] = 'Test Management';
$lang->custom->workingList['onlyStory'] = 'Story Management';
$lang->custom->workingList['onlyTask'] = 'Task Management';
-$lang->custom->menuTip = 'Click to show/hide navigation bar. Drag to swtich display order.';
+$lang->custom->menuTip = 'Click to show/hide the navigation bar. Drag to swtich display order.';
$lang->custom->saveFail = 'Failed to save!';
$lang->custom->scoreStatus[0] = 'Off';
diff --git a/module/dept/lang/en.php b/module/dept/lang/en.php
index d864835ea8..7fff61dddd 100644
--- a/module/dept/lang/en.php
+++ b/module/dept/lang/en.php
@@ -13,27 +13,18 @@ $lang->dept->common = 'Department';
$lang->dept->manageChild = "Department";
$lang->dept->edit = "Edit";
$lang->dept->delete = "Delete";
-$lang->dept->parent = "Parent";
+$lang->dept->parent = "Parent Dept";
$lang->dept->manager = "Manager";
$lang->dept->name = "Department Name";
$lang->dept->browse = "Manage";
-<<<<<<< HEAD
-$lang->dept->manage = "Maintain Department";
-=======
-$lang->dept->manage = "Manage Dept";
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
+$lang->dept->manage = "Manage Department";
$lang->dept->updateOrder = "Sort";
$lang->dept->add = "Add Department";
-$lang->dept->dragAndSort = "Drag and Sort";
+$lang->dept->dragAndSort = "Drag to order";
$lang->dept->confirmDelete = " Do you want to delete this Department?";
$lang->dept->successSave = " Saved!";
$lang->dept->error = new stdclass();
-<<<<<<< HEAD
-$lang->dept->error->hasSons = 'This Department has child Department. You cannot delete it!';
+$lang->dept->error->hasSons = 'This Department has child departments. You cannot delete it!';
$lang->dept->error->hasUsers = 'This Department has users. You cannot delete it!';
-=======
-$lang->dept->error->hasSons = 'This Dept has child departments. You cannot delete it!';
-$lang->dept->error->hasUsers = 'This Dept has users. You cannot delete it!';
->>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
diff --git a/module/dev/lang/en.php b/module/dev/lang/en.php
index 30be77b9c6..a82507b826 100644
--- a/module/dev/lang/en.php
+++ b/module/dev/lang/en.php
@@ -12,8 +12,8 @@ $lang->dev->noParams = 'No Parameters';
$lang->dev->post = 'POST Parameter';
$lang->dev->paramRange = 'Parameter Range: %s';
-$lang->dev->paramDate = 'Date format: YY-mm-dd. such as 2019-01-01';
-$lang->dev->paramColor = 'Color format: #RGB. such as #3da7f5';
+$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
+$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
$lang->dev->fields = array();
@@ -28,15 +28,15 @@ $lang->dev->tableList = array();
$lang->dev->tableList['action'] = 'Action';
$lang->dev->tableList['bug'] = 'Bug';
$lang->dev->tableList['build'] = 'Build';
-$lang->dev->tableList['burn'] = 'Burndown';
+$lang->dev->tableList['burn'] = 'Burndown Chart';
$lang->dev->tableList['case'] = 'Test Case';
$lang->dev->tableList['casestep'] = 'Case Step';
$lang->dev->tableList['company'] = 'Company';
-$lang->dev->tableList['config'] = 'Config';
+$lang->dev->tableList['config'] = 'Configuration';
$lang->dev->tableList['custom'] = 'Custom';
-$lang->dev->tableList['dept'] = 'Dept';
-$lang->dev->tableList['doc'] = 'Doc';
-$lang->dev->tableList['doclib'] = 'Doc Lib';
+$lang->dev->tableList['dept'] = 'Department';
+$lang->dev->tableList['doc'] = 'Document';
+$lang->dev->tableList['doclib'] = 'Doc Library';
$lang->dev->tableList['effort'] = 'Effort';
$lang->dev->tableList['extension'] = 'Extension';
$lang->dev->tableList['file'] = 'File';
@@ -75,7 +75,7 @@ $lang->dev->tableList['git'] = 'GIT';
$lang->dev->tableList['index'] = 'Home';
$lang->dev->tableList['install'] = 'Install';
$lang->dev->tableList['mail'] = 'Email';
-$lang->dev->tableList['misc'] = 'Misc';
+$lang->dev->tableList['misc'] = 'Misc.';
$lang->dev->tableList['my'] = 'Dashboard';
$lang->dev->tableList['qa'] = 'QA';
$lang->dev->tableList['report'] = 'Report';
@@ -101,7 +101,7 @@ $lang->dev->tableList['webhook'] = 'WebHook';
$lang->dev->tableList['log'] = 'Log';
$lang->dev->tableList['message'] = 'Message';
$lang->dev->tableList['notify'] = 'Notify';
-$lang->dev->tableList['userview'] = 'User View';
+$lang->dev->tableList['userview'] = 'User Privilege';
$lang->dev->groupList['my'] = 'Dashboard';
$lang->dev->groupList['product'] = $lang->productCommon;
diff --git a/module/doc/control.php b/module/doc/control.php
index 7cc88d3753..f4b659b2ad 100644
--- a/module/doc/control.php
+++ b/module/doc/control.php
@@ -304,12 +304,16 @@ class doc extends control
if(!$docResult or dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
$docID = $docResult['id'];
+ $files = $docResult['files'];
$lib = $this->doc->getLibByID($this->post->lib);
if($docResult['status'] == 'exists')
{
$this->send(array('result' => 'fail', 'message' => sprintf($this->lang->duplicate, $this->lang->doc->common), 'locate' => $this->createLink('doc', 'view', "docID=$docID")));
}
- $this->action->create('doc', $docID, 'Created');
+
+ $fileAction = '';
+ if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
+ $this->action->create('doc', $docID, 'Created', $fileAction);
$vars = "libID=$libID&browseType=byModule&moduleID={$this->post->module}&orderBy=id_desc&from=$this->from";
$link = $this->createLink('doc', 'browse', $vars);
diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php
index 4ff27480d0..f17dc609dd 100644
--- a/module/doc/lang/en.php
+++ b/module/doc/lang/en.php
@@ -18,7 +18,7 @@ $lang->doc->lib = 'Library';
$lang->doc->module = 'Module';
$lang->doc->title = 'Title';
$lang->doc->digest = 'Summary';
-$lang->doc->comment = 'Remark';
+$lang->doc->comment = 'Comment';
$lang->doc->type = 'Type';
$lang->doc->content = 'Text';
$lang->doc->keywords = 'Tags';
@@ -31,7 +31,7 @@ $lang->doc->editedDate = 'Edited ';
$lang->doc->version = 'Version';
$lang->doc->basicInfo = 'Basic Info';
$lang->doc->deleted = 'Deleted';
-$lang->doc->fileObject = 'The Object';
+$lang->doc->fileObject = 'Dependent Object';
$lang->doc->whiteList = 'White List';
$lang->doc->contentType = 'Format';
$lang->doc->separator = "";
@@ -41,6 +41,7 @@ $lang->doc->extension = 'Extension';
$lang->doc->size = 'Size';
$lang->doc->download = 'Download';
$lang->doc->acl = 'Right';
+$lang->doc->fileName = 'Files';
$lang->doc->groups = 'Groups';
$lang->doc->users = 'Users';
$lang->doc->item = ' Items';
@@ -152,16 +153,16 @@ $lang->doc->customObjectLibs['customFiles'] = 'Show Custom Library';
$lang->doc->orderLib = 'Library order settings';
$lang->doc->customShowLibs = 'Library display settings';
$lang->doc->customShowLibsList['zero'] = 'Display empty library';
-$lang->doc->customShowLibsList['children'] = 'Display sub-category documents';
-$lang->doc->customShowLibsList['unclosed'] = 'Only display projects that are not closed';
+$lang->doc->customShowLibsList['children'] = 'Display child-category documents';
+$lang->doc->customShowLibsList['unclosed'] = 'Display unclosed projects only';
$lang->doc->confirmDelete = "Do you want to delete this document?";
$lang->doc->confirmDeleteLib = "Do you want to delete this Doc Lib?";
-$lang->doc->errorEditSystemDoc = "Ssytem document library doesn't have to be changed.";
+$lang->doc->errorEditSystemDoc = "You don't have to change sytem document library.";
$lang->doc->errorEmptyProduct = "No {$lang->productCommon}. It cannot be created.";
$lang->doc->errorEmptyProject = "No {$lang->projectCommon}. It cannot be created.";
$lang->doc->errorMainSysLib = "This library cannot be deleted.";
-$lang->doc->accessDenied = "Access denied!";
+$lang->doc->accessDenied = "Access is denied!";
$lang->doc->versionNotFount = 'It does not exist in this build.';
$lang->doc->noDoc = 'No docs. ';
$lang->doc->cannotCreateOffice = 'Sorry, %s can only be created in ZenTao Enterprise. Contact renee@easysoft.ltd to try ZenTao Enterprise.';
@@ -170,17 +171,17 @@ $lang->doc->noEditedDoc = 'You have not edited any document.';
$lang->doc->noOpenedDoc = 'You have not created any document.';
$lang->doc->noCollectedDoc = 'You have not collected any document.';
-$lang->doc->noticeAcl['lib']['product']['default'] = 'Users with privileges to access the selected products have access to it.';
-$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users with privileges to access the selected products or users in the whiltelist have access to visit it.';
-$lang->doc->noticeAcl['lib']['project']['default'] = 'Users with privileges to access the selected projects have access to it.';
-$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users with privileges to access the selected projects or users in the whiltelist have access to it.';
-$lang->doc->noticeAcl['lib']['custom']['open'] = 'All users have access to it.';
-$lang->doc->noticeAcl['lib']['custom']['custom'] = 'Users in the whitelist have access to it.';
-$lang->doc->noticeAcl['lib']['custom']['private'] = 'Only the one who created it has access to it.';
+$lang->doc->noticeAcl['lib']['product']['default'] = 'Users with privileges to access the selected products can access it.';
+$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users with privileges to access the selected products or users in the whiltelist can access it.';
+$lang->doc->noticeAcl['lib']['project']['default'] = 'Users with privileges to access the selected projects can access it.';
+$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users with privileges to access the selected projects or users in the whiltelist can access it.';
+$lang->doc->noticeAcl['lib']['custom']['open'] = 'All users can access it.';
+$lang->doc->noticeAcl['lib']['custom']['custom'] = 'Users in the whitelist can access it.';
+$lang->doc->noticeAcl['lib']['custom']['private'] = 'Only the one who created it can access it.';
$lang->doc->noticeAcl['doc']['open'] = 'Users with privileges to access the doc lib which the doc belongs to have access to it.';
-$lang->doc->noticeAcl['doc']['custom'] = 'Users in the whiltelist have access to visit it.';
-$lang->doc->noticeAcl['doc']['private'] = 'Only the one who created it has access to it.';
+$lang->doc->noticeAcl['doc']['custom'] = 'Users in the whiltelist can access it.';
+$lang->doc->noticeAcl['doc']['private'] = 'Only the one who created it can access it.';
$lang->doc->placeholder = new stdclass();
$lang->doc->placeholder->url = 'Url';
@@ -214,4 +215,4 @@ $lang->doclib->tabList['product'] = $lang->productCommon;
$lang->doclib->tabList['project'] = $lang->projectCommon;
$lang->doclib->tabList['custom'] = 'Custom';
-$lang->doclib->nameList['custom'] = 'Doc lib name';
+$lang->doclib->nameList['custom'] = 'Custom Name';
diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php
index 66a2675372..9304bfbf11 100644
--- a/module/doc/lang/zh-cn.php
+++ b/module/doc/lang/zh-cn.php
@@ -41,6 +41,7 @@ $lang->doc->extension = '类型';
$lang->doc->size = '大小';
$lang->doc->download = '下载';
$lang->doc->acl = '权限';
+$lang->doc->fileName = '附件';
$lang->doc->groups = '分组';
$lang->doc->users = '用户';
$lang->doc->item = '项';
diff --git a/module/doc/lang/zh-tw.php b/module/doc/lang/zh-tw.php
index 46d24a63fc..ceef327930 100644
--- a/module/doc/lang/zh-tw.php
+++ b/module/doc/lang/zh-tw.php
@@ -41,6 +41,7 @@ $lang->doc->extension = '類型';
$lang->doc->size = '大小';
$lang->doc->download = '下載';
$lang->doc->acl = '權限';
+$lang->doc->fileName = '附件';
$lang->doc->groups = '分組';
$lang->doc->users = '用戶';
$lang->doc->item = '項';
diff --git a/module/doc/model.php b/module/doc/model.php
index f74d0f3411..91fb377946 100644
--- a/module/doc/model.php
+++ b/module/doc/model.php
@@ -629,7 +629,7 @@ class docModel extends model
$docContent->files = join(',', array_keys($files));
$this->dao->insert(TABLE_DOCCONTENT)->data($docContent)->exec();
$this->loadModel('score')->create('doc', 'create', $docID);
- return array('status' => 'new', 'id' => $docID);
+ return array('status' => 'new', 'id' => $docID, 'files' => $files);
}
return false;
}
@@ -1588,6 +1588,7 @@ class docModel extends model
$parantMoudles = $this->dao->select('id, name')->from(TABLE_MODULE)
->where('id')->in($path)
->andWhere('deleted')->eq(0)
+ ->orderBy('`grade`')
->fetchAll('id');
foreach($parantMoudles as $parentID => $moduleName)
diff --git a/module/doc/view/alllibs.html.php b/module/doc/view/alllibs.html.php
index 0ad688fdef..501318986a 100644
--- a/module/doc/view/alllibs.html.php
+++ b/module/doc/view/alllibs.html.php
@@ -12,7 +12,7 @@
?>
app->user->feedback) && !$this->cookie->feedbackView) ? true : false;?>
-
+
cookie->browseType == 'bylist'):?>
diff --git a/module/doc/view/side.html.php b/module/doc/view/side.html.php
index 89e9e55f7f..7baf667903 100644
--- a/module/doc/view/side.html.php
+++ b/module/doc/view/side.html.php
@@ -13,7 +13,7 @@ if($this->methodName != 'browse')
}
if(empty($type)) $type = 'product';
?>
-
+
@@ -88,14 +88,14 @@ if(empty($type)) $type = 'product';
?>
0):?>
- >
- " . $subLibName, '', "class='text-ellipsis' title='{$subLibName}'");?>
+ " . $subLibName, '', "class='text-ellipsis' title='{$subLibName}'");?>
-
- 0):?>
-
-
-
- parent != 0) continue;?>
+
+ 0):?>
+
+
+
+ parent != 0) continue;?>
- methodName == 'browse' && $browseType == 'bymodule' && $moduleID == $module->id) echo "class='active'";?>>
createLink('doc', 'browse', "libID=$subLibID&browseType=byModule¶m={$module->id}"), " " . $module->name, '', "class='text-ellipsis' title='{$module->name}'");?>
doc->printChildModule($module, $subLibID, $this->methodName, $browseType, $moduleID);?>
diff --git a/module/editor/lang/en.php b/module/editor/lang/en.php
index e54c0f77fd..300db7a785 100644
--- a/module/editor/lang/en.php
+++ b/module/editor/lang/en.php
@@ -3,23 +3,23 @@ $lang->editor->common = 'Editor';
$lang->editor->api = 'API';
$lang->editor->index = 'Home';
$lang->editor->newMethod = 'New Method';
-$lang->editor->extend = 'Extension';
+$lang->editor->extend = 'Plug-in';
$lang->editor->api = 'API';
$lang->editor->newLang = 'New Language';
$lang->editor->newConfig = 'New Config';
$lang->editor->newHook = 'New Hook';
-$lang->editor->newExtend = 'New Extension';
+$lang->editor->newExtend = 'New Plug-in';
$lang->editor->newPage = 'New Page';
-$lang->editor->override = 'Override';
-$lang->editor->edit = 'Edit Extension';
+$lang->editor->override = 'Overwrite';
+$lang->editor->edit = 'Edit Plug-in';
$lang->editor->save = 'Save Page';
$lang->editor->delete = 'Delete Page';
$lang->editor->moduleList = 'Module';
-$lang->editor->filePath = "Extension:";
+$lang->editor->filePath = "Plug-in:";
$lang->editor->sourceFile = 'Source File:';
$lang->editor->fileName = "File Name:";
-$lang->editor->isOverride = "Overridden Duplicated File";
+$lang->editor->isOverride = "Overwrote Duplicated File";
$lang->editor->exampleHook = "(e.g. ***.html.hook.php)";
$lang->editor->exampleJs = "(e.g. ***.js)";
$lang->editor->exampleCss = "(e.g. ***.css)";
@@ -28,13 +28,13 @@ $lang->editor->pageName = "Page Name:";
$lang->editor->deleteConfirm = 'Do you want to delete it?';
$lang->editor->extendConfirm = 'Do you want to use original code?';
-$lang->editor->repeatFile = 'File Name Dupliceted';
-$lang->editor->repeatPage = 'Page existed. Do you want to override it?';
+$lang->editor->repeatFile = 'File Name Duplicated';
+$lang->editor->repeatPage = 'This page exists. Do you want to overwrite it?';
$lang->editor->noticeOkFile = 'For security reasons, your Admin account has to be confirmed. \n Please login ZenTao server and create %sFile.\n Note:\n 1. File is blank.\n 2. If the file existed, delete it and then create a new one.';
-$lang->editor->editFileError = 'You can only modify Zentao files!';
+$lang->editor->editFileError = 'You can only modify ZenTao files!';
-$lang->editor->notWritable = "Not wirtable. Privilege is required. Please try chmod 777 -R ";
-$lang->editor->notDelete = 'Cannot be deleted. Please check your privilege!';
+$lang->editor->notWritable = "Not wirtable. Permission is required. Please try chmod 777 -R ";
+$lang->editor->notDelete = 'Cannot be deleted. Please check your permissions!';
$lang->editor->emptyFileName = 'Please enter a File Name!';
$lang->editor->translate['config.php'] = 'config';
@@ -51,7 +51,7 @@ $lang->editor->modules['company'] = 'Company';
$lang->editor->modules['convert'] = 'Convert';
$lang->editor->modules['dept'] = 'Department';
$lang->editor->modules['doc'] = 'Doc';
-$lang->editor->modules['extension'] = 'Extension';
+$lang->editor->modules['extension'] = 'Plug-in';
$lang->editor->modules['file'] = 'File';
$lang->editor->modules['group'] = 'Group';
$lang->editor->modules['index'] = 'Homepage';
@@ -68,8 +68,8 @@ $lang->editor->modules['search'] = 'Search';
$lang->editor->modules['story'] = 'Story';
$lang->editor->modules['task'] = 'Task';
$lang->editor->modules['testcase'] = 'Case';
-$lang->editor->modules['testtask'] = 'Test Task';
+$lang->editor->modules['testtask'] = 'Test';
$lang->editor->modules['todo'] = 'Todo';
-$lang->editor->modules['tree'] = 'Module';
+$lang->editor->modules['tree'] = 'Module Maintenance';
$lang->editor->modules['upgrade'] = 'Upgrade';
$lang->editor->modules['user'] = 'User';
diff --git a/module/entry/config.php b/module/entry/config.php
index 850e01d109..98913d48b4 100644
--- a/module/entry/config.php
+++ b/module/entry/config.php
@@ -17,3 +17,4 @@ $config->entry->errcode['SESSION_VERIFY_FAILED'] = 401;
$config->entry->errcode['IP_DENIED'] = 403;
$config->entry->errcode['ACCOUNT_UNBOUND'] = 403;
$config->entry->errcode['EMPTY_ENTRY'] = 404;
+$config->entry->errcode['CALLED_TIME'] = 405;
diff --git a/module/entry/lang/en.php b/module/entry/lang/en.php
index ae4a6a441f..33d1a0741a 100644
--- a/module/entry/lang/en.php
+++ b/module/entry/lang/en.php
@@ -4,13 +4,13 @@ $lang->entry->list = 'Entry List';
$lang->entry->api = 'API';
$lang->entry->webhook = 'Webhook';
$lang->entry->log = 'Log';
-$lang->entry->setting = 'Setting';
+$lang->entry->setting = 'Settings';
$lang->entry->browse = 'Browse';
-$lang->entry->create = 'Add Entry';
+$lang->entry->create = 'Create Entry';
$lang->entry->edit = 'Edit';
$lang->entry->delete = 'Delete';
-$lang->entry->createKey = 'Create Key';
+$lang->entry->createKey = 'Regenerate Secret Key';
$lang->entry->id = 'ID';
$lang->entry->name = 'Name';
@@ -23,8 +23,8 @@ $lang->entry->createdBy = 'Created By';
$lang->entry->createdDate = 'Created';
$lang->entry->editedby = 'Edited By';
$lang->entry->editedDate = 'Edited';
-$lang->entry->date = 'Request Time';
-$lang->entry->url = 'Request URL';
+$lang->entry->date = 'Requesting Time';
+$lang->entry->url = 'Requesting URL';
$lang->entry->confirmDelete = 'Do you want to delete this entry?';
$lang->entry->help = 'Help';
@@ -33,16 +33,17 @@ $lang->entry->notify = 'Notify';
$lang->entry->note = new stdClass();
$lang->entry->note->name = 'Name';
$lang->entry->note->code = 'Alias should be letters and numbers';
-$lang->entry->note->ip = "Use comma to seperate IP. IP segment is supported, e.g. 192.168.1.*";
-$lang->entry->note->allIP = 'All';
-$lang->entry->note->account = 'Authenticated account in the entry';
+$lang->entry->note->ip = "Use comma to seperate IPs. IP segment is supported, e.g. 192.168.1.*";
+$lang->entry->note->allIP = 'All IPs';
+$lang->entry->note->account = 'Entry Account';
-$lang->entry->errmsg['PARAM_CODE_MISSING'] = 'Code is missing.';
-$lang->entry->errmsg['PARAM_TOKEN_MISSING'] = 'Token is missing.';
+$lang->entry->errmsg['PARAM_CODE_MISSING'] = 'Parameter code is missing.';
+$lang->entry->errmsg['PARAM_TOKEN_MISSING'] = 'Parameter token is missing.';
$lang->entry->errmsg['SESSION_CODE_MISSING'] = 'Session code is missing.';
-$lang->entry->errmsg['EMPTY_KEY'] = 'Key is missing.';
+$lang->entry->errmsg['EMPTY_KEY'] = 'Secret key is missing.';
$lang->entry->errmsg['INVALID_TOKEN'] = 'Invalid token.';
$lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'Session verification failed.';
$lang->entry->errmsg['IP_DENIED'] = 'IP is denied.';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = 'Account is not bound.';
-$lang->entry->errmsg['EMPTY_ENTRY'] = 'Key is missing.';
+$lang->entry->errmsg['EMPTY_ENTRY'] = 'Entry does not exist.';
+$lang->entry->errmsg['CALLED_TIME'] = 'Token has expired';
diff --git a/module/entry/lang/zh-cn.php b/module/entry/lang/zh-cn.php
index d11bf4bd68..092587b9af 100644
--- a/module/entry/lang/zh-cn.php
+++ b/module/entry/lang/zh-cn.php
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'session验证失败';
$lang->entry->errmsg['IP_DENIED'] = '该IP被限制访问';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = '未绑定用户';
$lang->entry->errmsg['EMPTY_ENTRY'] = '应用不存在';
+$lang->entry->errmsg['CALLED_TIME'] = 'Token已失效';
diff --git a/module/entry/lang/zh-tw.php b/module/entry/lang/zh-tw.php
index 7c5a5dd1a4..4a213ef557 100644
--- a/module/entry/lang/zh-tw.php
+++ b/module/entry/lang/zh-tw.php
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'session驗證失敗';
$lang->entry->errmsg['IP_DENIED'] = '該IP被限制訪問';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = '未綁定用戶';
$lang->entry->errmsg['EMPTY_ENTRY'] = '應用不存在';
+$lang->entry->errmsg['CALLED_TIME'] = 'Token已失效';
diff --git a/module/entry/model.php b/module/entry/model.php
index 240b65981c..7aaff645a8 100644
--- a/module/entry/model.php
+++ b/module/entry/model.php
@@ -125,6 +125,20 @@ class entryModel extends model
return common::createChanges($oldEntry, $entry);
}
+ /**
+ * Update called time.
+ *
+ * @param string $code
+ * @param int $time
+ * @access public
+ * @return bool
+ */
+ public function updateTime($code, $time)
+ {
+ $this->dao->update(TABLE_ENTRY)->set('calledTime')->eq($time)->where('code')->eq($code)->exec();
+ return !dao::isError();
+ }
+
/**
* Save log of an entry.
*
diff --git a/module/extension/lang/en.php b/module/extension/lang/en.php
index a0b0bbad83..2f1581cbf6 100644
--- a/module/extension/lang/en.php
+++ b/module/extension/lang/en.php
@@ -9,33 +9,33 @@
* @version $Id$
* @link http://www.zentao.net
*/
-$lang->extension->common = 'Extension';
-$lang->extension->browse = 'Browse';
+$lang->extension->common = 'Plug-in';
+$lang->extension->browse = 'Plug-ins';
$lang->extension->install = 'Install';
-$lang->extension->installAuto = 'Auto Install';
-$lang->extension->installForce = 'Force Install';
+$lang->extension->installAuto = 'Auto Installation';
+$lang->extension->installForce = 'Force Installation';
$lang->extension->uninstall = 'Uninstall';
$lang->extension->activate = 'Activate';
$lang->extension->deactivate = 'Deactivate';
-$lang->extension->obtain = 'Get Extension';
+$lang->extension->obtain = 'Get Plug-in';
$lang->extension->view = 'Details';
$lang->extension->downloadAB = 'Download';
-$lang->extension->upload = 'Local Install';
+$lang->extension->upload = 'Local Installation';
$lang->extension->erase = 'Erase';
-$lang->extension->upgrade = 'Extension Upgrade';
-$lang->extension->agreeLicense = 'License';
+$lang->extension->upgrade = 'Upgrade Plug-in';
+$lang->extension->agreeLicense = 'I agree with the license.';
$lang->extension->structure = 'Structure';
$lang->extension->installed = 'Installed';
$lang->extension->deactivated = 'Deactivated';
$lang->extension->available = 'Downloaded';
-$lang->extension->name = 'Extension Name';
-$lang->extension->code = 'Code';
-$lang->extension->desc = 'Describe';
+$lang->extension->name = 'Plug-in Name';
+$lang->extension->code = 'Alias';
+$lang->extension->desc = 'Description';
$lang->extension->type = 'Type';
-$lang->extension->dirs = 'Directory';
-$lang->extension->files = 'Files';
+$lang->extension->dirs = 'Installation Directory';
+$lang->extension->files = 'Installation Files';
$lang->extension->status = 'Status';
$lang->extension->version = 'Version';
$lang->extension->latest = 'Latest:%s,need zentao %s';
@@ -45,18 +45,18 @@ $lang->extension->site = 'Website';
$lang->extension->downloads = 'Downloads';
$lang->extension->compatible = 'Compatibility';
$lang->extension->grade = 'Score';
-$lang->extension->depends = 'Dependent';
+$lang->extension->depends = 'Dependency';
$lang->extension->expireDate = 'Expire';
$lang->extension->zentaoCompatible = 'Compatible Version';
$lang->extension->installedTime = 'Installed Time';
-$lang->extension->publicList[0] = 'Manually';
+$lang->extension->publicList[0] = 'Manual';
$lang->extension->publicList[1] = 'Auto';
$lang->extension->compatibleList[0] = 'Unknown';
$lang->extension->compatibleList[1] = 'Compatible';
-$lang->extension->obtainOfficial[0] = 'Third party';
+$lang->extension->obtainOfficial[0] = 'Third-party';
$lang->extension->obtainOfficial[1] = 'Official';
$lang->extension->byDownloads = 'Downloads';
@@ -67,22 +67,22 @@ $lang->extension->byCategory = 'Category';
$lang->extension->installFailed = '%s failed. Error:';
$lang->extension->uninstallFailed = 'Uninstallation failed. Error:';
-$lang->extension->confirmUninstall = 'Uninstallation will delete or change related database. Do you want to uninstall?';
-$lang->extension->installFinished = 'Congrats! The extension is %sed!';
+$lang->extension->confirmUninstall = 'Uninstallation will delete or change related database. Do you want to uninstall it?';
+$lang->extension->installFinished = 'Congrats! The plug-in is %sed!';
$lang->extension->refreshPage = 'Refresh';
-$lang->extension->uninstallFinished = 'Extension is uninstalled.';
-$lang->extension->deactivateFinished = 'Extension is deactivated.';
-$lang->extension->activateFinished = 'Extension is activated.';
-$lang->extension->eraseFinished = 'Extension is removed.';
+$lang->extension->uninstallFinished = 'This plug-in is uninstalled.';
+$lang->extension->deactivateFinished = 'This plug-in is deactivated.';
+$lang->extension->activateFinished = 'This plug-in is activated.';
+$lang->extension->eraseFinished = 'This plug-in is removed.';
$lang->extension->unremovedFiles = 'File or direcroty cannot be deleted. You have to manually delete';
$lang->extension->executeCommands = '
Execute command lines below to fix the problem:
';
-$lang->extension->successDownloadedPackage = 'Extension downloaded!';
-$lang->extension->successCopiedFiles = 'File copied!';
+$lang->extension->successDownloadedPackage = 'This plug-in is downloaded!';
+$lang->extension->successCopiedFiles = 'File is copied!';
$lang->extension->successInstallDB = 'Database is installed!';
-$lang->extension->viewInstalled = 'Installed';
-$lang->extension->viewAvailable = 'Available';
-$lang->extension->viewDeactivated = 'Deactivated';
-$lang->extension->backDBFile = 'Extension data has been backed up to %s!';
+$lang->extension->viewInstalled = 'Installed Plug-ins';
+$lang->extension->viewAvailable = 'Available Plug-ins';
+$lang->extension->viewDeactivated = 'Deactivated Plug-ins';
+$lang->extension->backDBFile = 'This plug-in data has been backed up to %s!';
$lang->extension->noticeOkFile = 'For security reasons, your Admin account has to be confirmed.
Plese login your ZenTao server and create %s.
Note
@@ -98,10 +98,10 @@ $lang->extension->upgradeVersion = '(Upgrade %s to %s.)';
$lang->extension->waring = 'Warning!';
$lang->extension->errorOccurs = 'Error:';
-$lang->extension->errorGetModules = 'Get Extension Category from www.zentao.net failed. It could be network error. Plase check your network and refresh it.';
-$lang->extension->errorGetExtensions = 'Get Extension from www.zentao.net failed. It could be network error. Please go to www.zentao.net and download the extension, and then upload it to install.';
-$lang->extension->errorDownloadPathNotFound = 'Extension download path %s is not found.
Please run mkdir -p %s in Linux to fix it.';
-$lang->extension->errorDownloadPathNotWritable = 'Extension download path %sis not writable.
Please run sudo chmod 777 %s in Linux to fix it.';
+$lang->extension->errorGetModules = 'Get Plug-in Category from www.zentao.net failed. It could be network error. Plase check your network and refresh it.';
+$lang->extension->errorGetExtensions = 'Get Plug-in from www.zentao.net failed. It could be network error. Please go to www.zentao.net and download the extension, and then upload it to install.';
+$lang->extension->errorDownloadPathNotFound = 'Plug-in download path %s is not found.
Please run mkdir -p %s in Linux to fix it.';
+$lang->extension->errorDownloadPathNotWritable = 'Plug-in download path %sis not writable.
Please run sudo chmod 777 %s in Linux to fix it.';
$lang->extension->errorPackageFileExists = '%s exists in the download path.';
$lang->extension->errorDownloadFailed = 'Download failed. Please try it again. If still not OK, try to download it manually and upload it to install.';
$lang->extension->errorMd5Checking = 'Incomplete File. Please download it again. If still not OK, try to download it manually and upload it to install.';
@@ -112,6 +112,6 @@ $lang->extension->errorTargetPathNotWritable = '%s is not wr
$lang->extension->errorTargetPathNotExists = '%s is not found.';
$lang->extension->errorInstallDB = 'Database report execution failed. Error: %s';
$lang->extension->errorConflicts = 'Conflicted with “%s”!';
-$lang->extension->errorDepends = 'Dependent extension has not been installed or the version is incorrect:
%s';
+$lang->extension->errorDepends = 'Dependent Plug-in has not been installed or the version is incorrect:
%s';
$lang->extension->errorIncompatible = 'Incompatible with your ZenTao.';
-$lang->extension->errorUninstallDepends = '“%s” is dependent on this extension. Please do not install it.';
+$lang->extension->errorUninstallDepends = '“%s” is dependent on thiPlug-in. Please do not install it.';
diff --git a/module/file/control.php b/module/file/control.php
index ed426ae67d..3cd4b85890 100644
--- a/module/file/control.php
+++ b/module/file/control.php
@@ -287,29 +287,7 @@ class file extends control
*/
public function sendDownHeader($fileName, $fileType, $content)
{
- /* Clean the ob content to make sure no space or utf-8 bom output. */
- $obLevel = ob_get_level();
- for($i = 0; $i < $obLevel; $i++) ob_end_clean();
-
- /* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
- setcookie('downloading', 1);
-
- /* Append the extension name auto. */
- $extension = '.' . $fileType;
- if(strpos($fileName, $extension) === false) $fileName .= $extension;
-
- /* urlencode the filename for ie. */
- if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
-
- /* Judge the content type. */
- $mimes = $this->config->file->mimes;
- $contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
-
- header("Content-type: $contentType");
- header("Content-Disposition: attachment; filename=\"$fileName\"");
- header("Pragma: no-cache");
- header("Expires: 0");
- die($content);
+ $this->file->sendDownHeader($fileName, $fileType, $content);
}
/**
diff --git a/module/file/lang/en.php b/module/file/lang/en.php
index 83c1456b1e..ea6f546df6 100644
--- a/module/file/lang/en.php
+++ b/module/file/lang/en.php
@@ -22,8 +22,8 @@ $lang->file->maxUploadSize = "%s";
$lang->file->applyTemplate = "Apply Template";
$lang->file->tplTitle = "Template Name";
$lang->file->setPublic = "Set Public Template";
-$lang->file->exportFields = "Export Fields";
-$lang->file->exportRange = "Data Range";
+$lang->file->exportFields = "Field to be exported";
+$lang->file->exportRange = "Data to be exported";
$lang->file->defaultTPL = "Default Template";
$lang->file->setExportTPL = "Settings";
$lang->file->preview = "Preview";
@@ -41,19 +41,19 @@ $lang->file->encoding = 'Encoding';
$lang->file->addedBy = 'Added By';
$lang->file->addedDate = 'Added';
$lang->file->downloads = 'Downloads';
-$lang->file->extra = 'Extra';
+$lang->file->extra = 'Comment';
-$lang->file->dragFile = 'Please drag here.';
-$lang->file->childTaskTips = 'It\'s child task where \'>\' before the name.';
+$lang->file->dragFile = 'Drag files here';
+$lang->file->childTaskTips = 'It\'s a child task if there is a \'>\' before the name.';
$lang->file->errorNotExists = "'%s' is not found.";
$lang->file->errorCanNotWrite = "'%s' is not writable. Please change its permission. Enter sudo chmod -R 777 '%s' in Linux.";
$lang->file->confirmDelete = " Do you want to delete it?";
$lang->file->errorFileSize = " File size exceeds the limit. It cannot be uploaded!";
-$lang->file->errorFileUpload = " Uploading failed. File size might exceeds the limit.";
-$lang->file->errorFileFormate = " Uploading failed, file format is limited.";
-$lang->file->errorFileMove = " Uploading failed, there was an error when moving file.";
-$lang->file->dangerFile = " File has been rejected to upload for security issues.";
+$lang->file->errorFileUpload = " Uploading failed. The file size might exceeds the limit.";
+$lang->file->errorFileFormate = " Uploading failed. The file format is not in the prescribed scope.";
+$lang->file->errorFileMove = " Uploading failed. An error prompts when moving file.";
+$lang->file->dangerFile = " The file failed to be uploaded for security reasons.";
$lang->file->errorSuffix = 'Format is incorrect. .zip files ONLY!';
-$lang->file->errorExtract = 'Extracting file failed. File might be damaged or invalid files in the zip package.';
+$lang->file->errorExtract = 'Extracting files failed. Files might be damaged or there might be invalid files in the zip package.';
$lang->file->uploadImagesExplain = 'Note: upload .jpg, .jpeg, .gif, and .png images. The image name will be taken as the title of the story and the image as its content.';
$lang->file->fileNotFound = 'The file was not found, maybe the physical file has been deleted!';
diff --git a/module/file/model.php b/module/file/model.php
index 3baa7a8089..09efd6110d 100644
--- a/module/file/model.php
+++ b/module/file/model.php
@@ -821,4 +821,40 @@ class fileModel extends model
unset($_SESSION['album'][$uid]);
}
}
+
+ /**
+ * Send the download header to the client.
+ *
+ * @param string $fileName
+ * @param string $fileType
+ * @param string $content
+ * @access public
+ * @return void
+ */
+ public function sendDownHeader($fileName, $fileType, $content)
+ {
+ /* Clean the ob content to make sure no space or utf-8 bom output. */
+ $obLevel = ob_get_level();
+ for($i = 0; $i < $obLevel; $i++) ob_end_clean();
+
+ /* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
+ setcookie('downloading', 1);
+
+ /* Append the extension name auto. */
+ $extension = '.' . $fileType;
+ if(strpos($fileName, $extension) === false) $fileName .= $extension;
+
+ /* urlencode the filename for ie. */
+ if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
+
+ /* Judge the content type. */
+ $mimes = $this->config->file->mimes;
+ $contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
+
+ header("Content-type: $contentType");
+ header("Content-Disposition: attachment; filename=\"$fileName\"");
+ header("Pragma: no-cache");
+ header("Expires: 0");
+ die($content);
+ }
}
diff --git a/module/git/lang/en.php b/module/git/lang/en.php
index 27dfeac017..19f18b3fbb 100644
--- a/module/git/lang/en.php
+++ b/module/git/lang/en.php
@@ -11,6 +11,6 @@
*/
/* Methods. */
$lang->git->common = 'Git';
-$lang->git->cat = 'View Code';
-$lang->git->diff = 'Diff Code';
-$lang->git->apiSync = 'API: Sync Git Log';
+$lang->git->cat = 'View Source Code';
+$lang->git->diff = 'Compare Source Code';
+$lang->git->apiSync = 'API: Synchronize Git Log';
diff --git a/module/group/control.php b/module/group/control.php
index 3b52334e32..0e7ac737d3 100644
--- a/module/group/control.php
+++ b/module/group/control.php
@@ -142,10 +142,15 @@ class group extends control
$this->view->title = $this->lang->company->common . $this->lang->colon . $group->name . $this->lang->colon . $this->lang->group->manageView;
$this->view->position[] = $group->name;
$this->view->position[] = $this->lang->group->manageView;
-
+
$this->view->group = $group;
$this->view->products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('deleted')->eq('0')->orderBy('order_desc')->fetchPairs('id', 'name');
$this->view->projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('deleted')->eq('0')->orderBy('order_desc')->fetchPairs('id', 'name');
+
+ $menugroup = array();
+ foreach($this->lang->menugroup as $moduleName => $groupName) $menugroup[$groupName][$moduleName] = $moduleName;
+ $this->view->menugroup = $menugroup;
+
$this->display();
}
diff --git a/module/group/css/manageview.css b/module/group/css/manageview.css
index 589e3e6c70..7aebd9c221 100644
--- a/module/group/css/manageview.css
+++ b/module/group/css/manageview.css
@@ -1 +1,5 @@
.group-item {display:block; width:90px; float:left; margin-top:5px;}
+.action-item {display:block; width:180px; float:left; margin-top:5px;}
+
+.pl-0px {padding-left:0px !important;}
+.pt-0px {padding-top:0px !important;}
diff --git a/module/group/js/manageview.js b/module/group/js/manageview.js
index c32f767c7b..4ef177020b 100644
--- a/module/group/js/manageview.js
+++ b/module/group/js/manageview.js
@@ -10,27 +10,16 @@ function toggleProject()
function selectAll(obj)
{
- if($(obj).prop('checked'))
- {
- $(obj).closest('td').find(':checkbox').attr('checked', 'checked');
- }
- else
- {
- $(obj).closest('td').find(':checkbox').removeAttr('checked');
- }
+ $(obj).closest('tr').find(':checkbox').prop('checked', $(obj).prop('checked'));
}
$('input:checkbox[name^="allchecker"]').change(function()
{
- setTimeout(function(){toggleProduct(),toggleProject()}, 50);
+ $('.group-item :checkbox[name^="actions"]').change();
});
-$('#product').change(function(){toggleProduct();})
-$('#project').change(function(){toggleProject();})
$(function()
{
- toggleProduct();
- toggleProject();
$('.group-item :checkbox[name^="actions"]').change(function()
{
var allChecked = true;
@@ -38,6 +27,25 @@ $(function()
{
if(!$(this).prop('checked')) allChecked = false;
})
- $('input:checkbox[name^="allchecker"]').prop('checked', allChecked);
+ $('.group-item input:checkbox[name^="allchecker"]').prop('checked', allChecked);
+
+ var id = $(this).attr('id');
+ if(id == 'product') toggleProduct();
+ if(id == 'project') toggleProject();
+ if($('#' + id + 'ActionBox').length == 1) $('#' + id + 'ActionBox').toggle($(this).prop("checked"));
})
-})
+ $('.group-item :checkbox[name^="actions"]').change();
+ $("tr[id$='ActionBox']").each(function()
+ {
+ var allChecked = true;
+ $(this).find('td:last :checkbox').each(function()
+ {
+ if(!$(this).prop('checked'))
+ {
+ allChecked = false;
+ return true;
+ }
+ });
+ if(allChecked) $(this).find('th :checkbox').prop('checked', true);
+ });
+});
diff --git a/module/group/lang/en.php b/module/group/lang/en.php
index c871973d24..bedb5eb397 100644
--- a/module/group/lang/en.php
+++ b/module/group/lang/en.php
@@ -10,24 +10,25 @@
* @link http://www.zentao.net
*/
$lang->group->common = 'Privilege';
-$lang->group->browse = 'Group Privilge';
+$lang->group->browse = 'Groups';
$lang->group->create = 'Add Group';
$lang->group->edit = 'Edit';
$lang->group->copy = 'Copy';
$lang->group->delete = 'Delete';
$lang->group->manageView = 'View';
$lang->group->managePriv = 'Batch Assign';
-$lang->group->managePrivByGroup = 'Privilege';
+$lang->group->managePrivByGroup = 'Grooup Privilege';
$lang->group->managePrivByModule = 'Module Privilege';
$lang->group->byModuleTips = '(Press Shift/Ctrl to Multi-select)';
$lang->group->manageMember = 'Member';
$lang->group->confirmDelete = 'Do you want to delete this User Group?';
$lang->group->successSaved = 'Saved.';
$lang->group->errorNotSaved = 'Failed. Please select actions and groups.';
-$lang->group->viewList = 'View';
-$lang->group->productList = 'Product';
-$lang->group->projectList = 'Project';
-$lang->group->noticeVisit = 'Empty means no access.';
+$lang->group->viewList = 'Access View';
+$lang->group->productList = 'Access Product';
+$lang->group->projectList = 'Access Project';
+$lang->group->dynamic = 'Dynamics';
+$lang->group->noticeVisit = 'Leave it empty, then the user group have no access';
$lang->group->id = 'ID';
$lang->group->name = 'Name';
@@ -42,10 +43,10 @@ $lang->group->option = 'Option';
$lang->group->inside = 'Group Users';
$lang->group->outside = 'Other Users';
$lang->group->other = 'Others';
-$lang->group->all = 'All';
+$lang->group->all = 'All Privileges';
-$lang->group->copyOptions['copyPriv'] = 'Copy Privilege';
-$lang->group->copyOptions['copyUser'] = 'Copy User';
+$lang->group->copyOptions['copyPriv'] = 'Copy Privileges';
+$lang->group->copyOptions['copyUser'] = 'Copy Users';
$lang->group->versions[''] = 'History';
$lang->group->versions['10_6'] = 'ZenTao10.6';
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index fee7d3c098..1cc2e5fa22 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -498,9 +498,6 @@ $lang->resource->bug->report = 'reportChart';
$lang->resource->bug->export = 'export';
$lang->resource->bug->confirmStoryChange = 'confirmStoryChange';
$lang->resource->bug->delete = 'delete';
-$lang->resource->bug->saveTemplate = 'saveTemplate';
-$lang->resource->bug->deleteTemplate = 'deleteTemplate';
-$lang->resource->bug->setPublic = 'setPublic';
$lang->resource->bug->batchChangeModule = 'batchChangeModule';
$lang->resource->bug->batchChangeBranch = 'batchChangeBranch';
@@ -525,12 +522,9 @@ $lang->bug->methodOrder[80] = 'report';
$lang->bug->methodOrder[85] = 'export';
$lang->bug->methodOrder[90] = 'confirmStoryChange';
$lang->bug->methodOrder[95] = 'delete';
-$lang->bug->methodOrder[100] = 'saveTemplate';
-$lang->bug->methodOrder[105] = 'deleteTemplate';
-$lang->bug->methodOrder[110] = 'setPublic';
-$lang->bug->methodOrder[115] = 'linkBugs';
-$lang->bug->methodOrder[125] = 'batchChangeModule';
-$lang->bug->methodOrder[130] = 'batchChangeBranch';
+$lang->bug->methodOrder[100] = 'linkBugs';
+$lang->bug->methodOrder[105] = 'batchChangeModule';
+$lang->bug->methodOrder[110] = 'batchChangeBranch';
/* Test case. */
$lang->resource->testcase = new stdclass();
@@ -856,6 +850,7 @@ $lang->resource->user->dynamic = 'dynamic';
$lang->resource->user->profile = 'profile';
$lang->resource->user->batchEdit = 'batchEdit';
$lang->resource->user->unbind = 'unbind';
+$lang->resource->user->setPublicTemplate = 'setPublicTemplate';
$lang->user->methodOrder[5] = 'create';
$lang->user->methodOrder[7] = 'batchCreate';
@@ -871,6 +866,7 @@ $lang->user->methodOrder[50] = 'dynamic';
$lang->user->methodOrder[55] = 'profile';
$lang->user->methodOrder[60] = 'batchEdit';
$lang->user->methodOrder[75] = 'unbind';
+$lang->user->methodOrder[80] = 'setPublicTemplate';
/* Tree. */
$lang->resource->tree = new stdclass();
diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php
index c10d8e07e5..d2cd52066b 100644
--- a/module/group/lang/zh-cn.php
+++ b/module/group/lang/zh-cn.php
@@ -24,10 +24,11 @@ $lang->group->manageMember = '成员维护';
$lang->group->confirmDelete = '您确定删除该用户分组吗?';
$lang->group->successSaved = '成功保存';
$lang->group->errorNotSaved = '没有保存,请确认选择了权限数据。';
-$lang->group->viewList = '允许访问视图';
-$lang->group->productList = '允许访问' . $lang->productCommon;
-$lang->group->projectList = '允许访问' . $lang->projectCommon;
-$lang->group->noticeVisit = '空代表访问没有访问限制';
+$lang->group->viewList = '可访问视图';
+$lang->group->productList = '可访问' . $lang->productCommon;
+$lang->group->projectList = '可访问' . $lang->projectCommon;
+$lang->group->dynamic = '可查看动态';
+$lang->group->noticeVisit = '空代表没有访问限制';
$lang->group->id = '编号';
$lang->group->name = '分组名称';
diff --git a/module/group/lang/zh-tw.php b/module/group/lang/zh-tw.php
index 6582b93c40..4b5b4aae4a 100644
--- a/module/group/lang/zh-tw.php
+++ b/module/group/lang/zh-tw.php
@@ -24,10 +24,11 @@ $lang->group->manageMember = '成員維護';
$lang->group->confirmDelete = '您確定刪除該用戶分組嗎?';
$lang->group->successSaved = '成功保存';
$lang->group->errorNotSaved = '沒有保存,請確認選擇了權限數據。';
-$lang->group->viewList = '允許訪問視圖';
-$lang->group->productList = '允許訪問' . $lang->productCommon;
-$lang->group->projectList = '允許訪問' . $lang->projectCommon;
-$lang->group->noticeVisit = '空代表訪問沒有訪問限制';
+$lang->group->viewList = '可訪問視圖';
+$lang->group->productList = '可訪問' . $lang->productCommon;
+$lang->group->projectList = '可訪問' . $lang->projectCommon;
+$lang->group->dynamic = '可查看動態';
+$lang->group->noticeVisit = '空代表沒有訪問限制';
$lang->group->id = '編號';
$lang->group->name = '分組名稱';
diff --git a/module/group/model.php b/module/group/model.php
index f51cdb441e..043583b395 100644
--- a/module/group/model.php
+++ b/module/group/model.php
@@ -266,7 +266,29 @@ class groupModel extends model
public function updateView($groupID)
{
$actions = $this->post->actions;
- if(isset($_POST['allchecker']))$actions['views'] = array();
+ if(isset($_POST['allchecker']))$actions['views'] = array();
+ if(!isset($actions['actions']))$actions['actions'] = array();
+
+ $dynamic = $actions['actions'];
+ if(!isset($_POST['allchecker']))
+ {
+ $dynamic = array();
+ foreach($actions['actions'] as $moduleName => $moduleActions)
+ {
+ if(isset($this->lang->menugroup->$moduleName))
+ {
+ $groupModule = $this->lang->menugroup->$moduleName;
+ if($groupModule != 'my' and !isset($actions['views'][$groupModule])) continue;
+ }
+ else
+ {
+ if($moduleName != 'my' and !isset($actions['views'][$moduleName])) continue;
+ }
+
+ $dynamic[$moduleName] = $moduleActions;
+ }
+ }
+ $actions['actions'] = $dynamic;
$actions = empty($actions) ? '' : json_encode($actions);
$this->dao->update(TABLE_GROUP)->set('acl')->eq($actions)->where('id')->eq($groupID)->exec();
diff --git a/module/group/view/manageview.html.php b/module/group/view/manageview.html.php
index 3f60b7f648..e06de2c10f 100644
--- a/module/group/view/manageview.html.php
+++ b/module/group/view/manageview.html.php
@@ -14,14 +14,14 @@
- id;?>
+ name;?>
arrow . $lang->group->manageView;?>