diff --git a/VERSION b/VERSION
index 257b829d27..e1b8f601a2 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-11.2.stable
+11.3.stable
diff --git a/config/config.php b/config/config.php
index 487ba25ffd..1c1166de0d 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.2'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
+$config->version = '11.3'; // 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/demo.sql b/db/demo.sql
index 228334c699..4f0862ec24 100644
--- a/db/demo.sql
+++ b/db/demo.sql
@@ -226,10 +226,10 @@ INSERT INTO `zt_productplan` (`id`, `product`, `title`, `desc`, `begin`, `end`,
INSERT INTO `zt_project` (`id`, `isCat`, `catID`, `type`, `parent`, `name`, `code`, `begin`, `end`, `days`, `status`, `statge`, `pri`, `desc`, `openedBy`, `openedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES(1, '0', 0, 'sprint', 0, '企业网站第一期', 'coWeb1', '2012-06-05', '2012-12-04', 184, 'done', '1', '1', '开发企业网站的基本雏形。
', '', 0, '', 0, '', 0, 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', '5', '0');
INSERT INTO `zt_project` (`id`, `isCat`, `catID`, `type`, `parent`, `name`, `code`, `begin`, `end`, `days`, `status`, `statge`, `pri`, `desc`, `openedBy`, `openedDate`, `closedBy`, `closedDate`, `canceledBy`, `canceledDate`, `PO`, `PM`, `QD`, `RD`, `team`, `acl`, `whitelist`, `order`, `deleted`) VALUES(2, '0', 0, 'sprint', 0, '企业网站第二期', 'coWebsite2', '2013-06-05', '2014-06-04', 365, 'wait', '1', '1', '', '', 0, '', 0, '', 0, 'productManager', 'projectManager', 'testManager', 'productManager', '公司开发团队', 'open', '', '10', '0');
-INSERT INTO `zt_doclib` (`id`, `product`, `project`, `name`, `acl`, `main`) VALUES(1, 1, 0, '产品库', 'open','1');
-INSERT INTO `zt_doclib` (`id`, `product`, `project`, `name`, `acl`, `main`) VALUES(2, 2, 0, '产品库', 'open', '1');
-INSERT INTO `zt_doclib` (`id`, `product`, `project`, `name`, `acl`, `main`) VALUES(3, 0, 1, '项目库', 'open', '1');
-INSERT INTO `zt_doclib` (`id`, `product`, `project`, `name`, `acl`, `main`) VALUES(4, 0, 2, '项目库', 'open', '1');
+INSERT INTO `zt_doclib` (`id`, `type`, `product`, `project`, `name`, `acl`, `main`) VALUES(1, 'product', 1, 0, '产品库', 'default','1');
+INSERT INTO `zt_doclib` (`id`, `type`, `product`, `project`, `name`, `acl`, `main`) VALUES(2, 'product', 2, 0, '产品库', 'default', '1');
+INSERT INTO `zt_doclib` (`id`, `type`, `product`, `project`, `name`, `acl`, `main`) VALUES(3, 'project', 0, 1, '项目库', 'default', '1');
+INSERT INTO `zt_doclib` (`id`, `type`, `product`, `project`, `name`, `acl`, `main`) VALUES(4, 'project', 0, 2, '项目库', 'default', '1');
INSERT INTO `zt_projectproduct` (`project`, `product`) VALUES(1, 1);
INSERT INTO `zt_projectproduct` (`project`, `product`) VALUES(2, 1);
diff --git a/db/endemo.sql b/db/endemo.sql
index adac0adf95..d6863101cd 100644
--- a/db/endemo.sql
+++ b/db/endemo.sql
@@ -149,11 +149,11 @@ INSERT INTO `zt_dept` (`id`, `name`, `parent`, `path`, `grade`, `order`, `positi
(5, 'Dev 1', 2, ',2,5,', 2, 10, '', '', ''),
(6, 'Dev 2', 2, ',2,6,', 2, 20, '', '', '');
-INSERT INTO `zt_doclib` (`id`, `product`, `project`, `name`, `acl`, `groups`, `users`, `main`, `order`, `deleted`) VALUES
-(1, 1, 0, 'Product Main Library', 'open', '', '', '1', 0, '0'),
-(2, 0, 1, 'Project Main Library', 'open', '', '', '1', 0, '0'),
-(3, 2, 0, 'Product Main Library', 'open', '', '', '1', 0, '0'),
-(4, 0, 2, 'Project Main Library', 'open', '', '', '1', 0, '0');
+INSERT INTO `zt_doclib` (`id`, `type`, `product`, `project`, `name`, `acl`, `groups`, `users`, `main`, `order`, `deleted`) VALUES
+(1, 'product', 1, 0, 'Product Main Library', 'default', '', '', '1', 0, '0'),
+(2, 'project', 0, 1, 'Project Main Library', 'default', '', '', '1', 0, '0'),
+(3, 'product', 2, 0, 'Product Main Library', 'default', '', '', '1', 0, '0'),
+(4, 'project', 0, 2, 'Project Main Library', 'default', '', '', '1', 0, '0');
INSERT INTO `zt_history` (`id`, `action`, `field`, `old`, `new`, `diff`) VALUES
(1, 7, 'desc', 'Finish developing system drive program.', 'Add advanced features such as remote desktop.', '001- Finish developing system drive program.\n001+ Add advanced features such as remote desktop.'),
diff --git a/db/standard/zentao11.2.sql b/db/standard/zentao11.2.sql
index d99f028edc..c7a14b36fc 100644
--- a/db/standard/zentao11.2.sql
+++ b/db/standard/zentao11.2.sql
@@ -1,4 +1,3 @@
-DROP TABLE IF EXISTS `zt_action`;
CREATE TABLE `zt_action` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(30) NOT NULL DEFAULT '',
@@ -17,7 +16,6 @@ CREATE TABLE `zt_action` (
KEY `project` (`project`),
KEY `objectID` (`objectID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_block`;
CREATE TABLE `zt_block` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
@@ -34,7 +32,6 @@ CREATE TABLE `zt_block` (
UNIQUE KEY `accountModuleOrder` (`account`,`module`,`order`),
KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_branch`;
CREATE TABLE `zt_branch` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
@@ -44,7 +41,6 @@ CREATE TABLE `zt_branch` (
PRIMARY KEY (`id`),
KEY `product` (`product`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_bug`;
CREATE TABLE `zt_bug` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -103,7 +99,6 @@ CREATE TABLE `zt_bug` (
KEY `case` (`case`),
KEY `assignedTo` (`assignedTo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_build`;
CREATE TABLE `zt_build` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -122,7 +117,6 @@ CREATE TABLE `zt_build` (
KEY `product` (`product`),
KEY `project` (`project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_burn`;
CREATE TABLE `zt_burn` (
`project` mediumint(8) unsigned NOT NULL,
`date` date NOT NULL,
@@ -131,7 +125,6 @@ CREATE TABLE `zt_burn` (
`consumed` float NOT NULL,
PRIMARY KEY (`project`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_case`;
CREATE TABLE `zt_case` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -175,7 +168,6 @@ CREATE TABLE `zt_case` (
KEY `story` (`story`),
KEY `module` (`module`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_casestep`;
CREATE TABLE `zt_casestep` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -188,7 +180,6 @@ CREATE TABLE `zt_casestep` (
KEY `case` (`case`),
KEY `version` (`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_company`;
CREATE TABLE `zt_company` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(120) DEFAULT NULL,
@@ -203,7 +194,6 @@ CREATE TABLE `zt_company` (
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_config`;
CREATE TABLE `zt_config` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`owner` char(30) NOT NULL DEFAULT '',
@@ -214,7 +204,6 @@ CREATE TABLE `zt_config` (
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`owner`,`module`,`section`,`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_cron`;
CREATE TABLE `zt_cron` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`m` varchar(20) NOT NULL,
@@ -231,7 +220,6 @@ CREATE TABLE `zt_cron` (
PRIMARY KEY (`id`),
KEY `lastTime` (`lastTime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_dept`;
CREATE TABLE `zt_dept` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(60) NOT NULL,
@@ -246,7 +234,6 @@ CREATE TABLE `zt_dept` (
KEY `parent` (`parent`),
KEY `path` (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_doc`;
CREATE TABLE `zt_doc` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
@@ -272,7 +259,6 @@ CREATE TABLE `zt_doc` (
KEY `project` (`project`),
KEY `lib` (`lib`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_doccontent`;
CREATE TABLE `zt_doccontent` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`doc` mediumint(8) unsigned NOT NULL,
@@ -285,7 +271,6 @@ CREATE TABLE `zt_doccontent` (
PRIMARY KEY (`id`),
UNIQUE KEY `doc_version` (`doc`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_doclib`;
CREATE TABLE `zt_doclib` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(30) NOT NULL,
@@ -303,7 +288,6 @@ CREATE TABLE `zt_doclib` (
KEY `product` (`product`),
KEY `project` (`project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_effort`;
CREATE TABLE `zt_effort` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`user` char(30) NOT NULL DEFAULT '',
@@ -319,7 +303,6 @@ CREATE TABLE `zt_effort` (
PRIMARY KEY (`id`),
KEY `user` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_entry`;
CREATE TABLE `zt_entry` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
@@ -335,7 +318,6 @@ CREATE TABLE `zt_entry` (
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_extension`;
CREATE TABLE `zt_extension` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
@@ -357,7 +339,6 @@ CREATE TABLE `zt_extension` (
KEY `name` (`name`),
KEY `installedTime` (`installedTime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_file`;
CREATE TABLE `zt_file` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`pathname` char(50) NOT NULL,
@@ -375,7 +356,6 @@ CREATE TABLE `zt_file` (
KEY `objectType` (`objectType`),
KEY `objectID` (`objectID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_group`;
CREATE TABLE `zt_group` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(30) NOT NULL,
@@ -384,14 +364,12 @@ CREATE TABLE `zt_group` (
`acl` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_grouppriv`;
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;
-DROP TABLE IF EXISTS `zt_history`;
CREATE TABLE `zt_history` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`action` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -402,7 +380,6 @@ CREATE TABLE `zt_history` (
PRIMARY KEY (`id`),
KEY `action` (`action`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_lang`;
CREATE TABLE `zt_lang` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`lang` varchar(30) NOT NULL,
@@ -414,7 +391,6 @@ CREATE TABLE `zt_lang` (
PRIMARY KEY (`id`),
UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_log`;
CREATE TABLE `zt_log` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(30) NOT NULL,
@@ -429,7 +405,6 @@ CREATE TABLE `zt_log` (
KEY `objectType` (`objectType`),
KEY `obejctID` (`objectID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_module`;
CREATE TABLE `zt_module` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`root` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -449,7 +424,6 @@ CREATE TABLE `zt_module` (
KEY `type` (`type`),
KEY `path` (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_notify`;
CREATE TABLE `zt_notify` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(50) NOT NULL,
@@ -466,7 +440,6 @@ CREATE TABLE `zt_notify` (
`failReason` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_product`;
CREATE TABLE `zt_product` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(90) NOT NULL,
@@ -488,7 +461,6 @@ CREATE TABLE `zt_product` (
PRIMARY KEY (`id`),
KEY `order` (`order`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_productplan`;
CREATE TABLE `zt_productplan` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
@@ -503,7 +475,6 @@ CREATE TABLE `zt_productplan` (
KEY `product` (`product`),
KEY `end` (`end`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_project`;
CREATE TABLE `zt_project` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`isCat` enum('1','0') NOT NULL DEFAULT '0',
@@ -542,7 +513,6 @@ CREATE TABLE `zt_project` (
KEY `status` (`status`),
KEY `order` (`order`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_projectproduct`;
CREATE TABLE `zt_projectproduct` (
`project` mediumint(8) unsigned NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
@@ -550,7 +520,6 @@ CREATE TABLE `zt_projectproduct` (
`plan` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`project`,`product`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_projectstory`;
CREATE TABLE `zt_projectstory` (
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`product` mediumint(8) unsigned NOT NULL,
@@ -559,7 +528,6 @@ CREATE TABLE `zt_projectstory` (
`order` smallint(6) unsigned NOT NULL,
UNIQUE KEY `project` (`project`,`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_release`;
CREATE TABLE `zt_release` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -578,7 +546,6 @@ CREATE TABLE `zt_release` (
KEY `product` (`product`),
KEY `build` (`build`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_score`;
CREATE TABLE `zt_score` (
`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT,
`account` varchar(30) NOT NULL,
@@ -594,7 +561,6 @@ CREATE TABLE `zt_score` (
KEY `model` (`module`),
KEY `method` (`method`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_story`;
CREATE TABLE `zt_story` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -635,7 +601,6 @@ CREATE TABLE `zt_story` (
KEY `status` (`status`),
KEY `assignedTo` (`assignedTo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_storyspec`;
CREATE TABLE `zt_storyspec` (
`story` mediumint(9) NOT NULL,
`version` smallint(6) NOT NULL,
@@ -644,14 +609,12 @@ CREATE TABLE `zt_storyspec` (
`verify` text NOT NULL,
UNIQUE KEY `story` (`story`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_storystage`;
CREATE TABLE `zt_storystage` (
`story` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`stage` varchar(50) NOT NULL,
KEY `story` (`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_suitecase`;
CREATE TABLE `zt_suitecase` (
`suite` mediumint(8) unsigned NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
@@ -659,7 +622,6 @@ CREATE TABLE `zt_suitecase` (
`version` smallint(5) unsigned NOT NULL,
UNIQUE KEY `suitecase` (`suite`,`case`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_task`;
CREATE TABLE `zt_task` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`parent` mediumint(8) NOT NULL DEFAULT '0',
@@ -701,7 +663,6 @@ CREATE TABLE `zt_task` (
KEY `story` (`story`),
KEY `assignedTo` (`assignedTo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_taskestimate`;
CREATE TABLE `zt_taskestimate` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -713,7 +674,6 @@ CREATE TABLE `zt_taskestimate` (
PRIMARY KEY (`id`),
KEY `task` (`task`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_team`;
CREATE TABLE `zt_team` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`root` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -731,7 +691,6 @@ CREATE TABLE `zt_team` (
PRIMARY KEY (`id`),
UNIQUE KEY `team` (`root`,`type`,`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_testreport`;
CREATE TABLE `zt_testreport` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
@@ -754,7 +713,6 @@ CREATE TABLE `zt_testreport` (
`deleted` enum('0','1') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_testresult`;
CREATE TABLE `zt_testresult` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`run` mediumint(8) unsigned NOT NULL,
@@ -769,7 +727,6 @@ CREATE TABLE `zt_testresult` (
KEY `version` (`version`),
KEY `run` (`run`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_testrun`;
CREATE TABLE `zt_testrun` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -783,7 +740,6 @@ CREATE TABLE `zt_testrun` (
PRIMARY KEY (`id`),
UNIQUE KEY `task` (`task`,`case`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_testsuite`;
CREATE TABLE `zt_testsuite` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
@@ -798,7 +754,6 @@ CREATE TABLE `zt_testsuite` (
PRIMARY KEY (`id`),
KEY `product` (`product`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_testtask`;
CREATE TABLE `zt_testtask` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(90) NOT NULL,
@@ -818,7 +773,6 @@ CREATE TABLE `zt_testtask` (
KEY `product` (`product`),
KEY `build` (`build`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_todo`;
CREATE TABLE `zt_todo` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
@@ -847,7 +801,6 @@ CREATE TABLE `zt_todo` (
KEY `finishedBy` (`finishedBy`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_user`;
CREATE TABLE `zt_user` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`dept` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -886,7 +839,6 @@ CREATE TABLE `zt_user` (
KEY `email` (`email`),
KEY `commiter` (`commiter`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_usercontact`;
CREATE TABLE `zt_usercontact` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
@@ -895,13 +847,11 @@ CREATE TABLE `zt_usercontact` (
PRIMARY KEY (`id`),
KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_usergroup`;
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;
-DROP TABLE IF EXISTS `zt_userquery`;
CREATE TABLE `zt_userquery` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
@@ -914,7 +864,6 @@ CREATE TABLE `zt_userquery` (
KEY `account` (`account`),
KEY `module` (`module`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_usertpl`;
CREATE TABLE `zt_usertpl` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
@@ -925,14 +874,12 @@ CREATE TABLE `zt_usertpl` (
PRIMARY KEY (`id`),
KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-DROP TABLE IF EXISTS `zt_userview`;
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;
-DROP TABLE IF EXISTS `zt_webhook`;
CREATE TABLE `zt_webhook` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(10) NOT NULL DEFAULT 'default',
diff --git a/db/standard/zentao11.3.sql b/db/standard/zentao11.3.sql
new file mode 100644
index 0000000000..70d7bf65d0
--- /dev/null
+++ b/db/standard/zentao11.3.sql
@@ -0,0 +1,904 @@
+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,
+ `date` date NOT NULL,
+ `estimate` float NOT NULL,
+ `left` float NOT NULL,
+ `consumed` float NOT NULL,
+ PRIMARY KEY (`project`,`date`)
+) 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,
+ `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 `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,
+ `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;
+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 `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',
+ `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(9) 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 `zt_storystage` (
+ `story` mediumint(8) unsigned NOT NULL,
+ `branch` mediumint(8) unsigned NOT NULL,
+ `stage` varchar(50) NOT NULL,
+ 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/zentao.sql b/db/zentao.sql
index adf21e81e1..3bad2d02e7 100644
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -5,7 +5,7 @@ CREATE TABLE IF NOT EXISTS `zt_action` (
`objectID` mediumint(8) unsigned NOT NULL default '0',
`product` varchar(255) NOT NULL,
`project` mediumint(9) NOT NULL,
- `actor` varchar(30) NOT NULL default '',
+ `actor` varchar(100) NOT NULL default '',
`action` varchar(30) NOT NULL default '',
`date` datetime NOT NULL,
`comment` text NOT NULL,
@@ -461,6 +461,7 @@ CREATE TABLE IF NOT EXISTS `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,
diff --git a/doc/CHANGELOG b/doc/CHANGELOG
index ab3e0d6a5e..16bde5594c 100644
--- a/doc/CHANGELOG
+++ b/doc/CHANGELOG
@@ -1,3 +1,51 @@
+2019-02-27 11.3.stable
+完成的需求
+3579 发信的时候增加环境变量避免dns解析超时
+3578 优化chosen控件下拉之后的交互
+3577 搜索表单展开多项条件搜索之后应当保持表单状态
+3576 里程碑发布增加文字提示
+3575 增加时区设置
+3574 产品、项目文档库和文档权限控制增加文字提示
+3572 增加父子计划之后增加调整路线图的呈现方式
+3571 计划增加子计划概念
+3567 自定义文档库和手册可以进行排序
+3563 优化应用集成禅道功能
+3562 任务工时管理中录入的备份信息过长可以悬浮显示
+3548 需求详情页面相关信息不以剧中方式显示
+3538 去掉雅虎通、旺旺的字段
+3536 项目没有创建版本,在项目下提交测试单可以提示创建版本
+3511 补充完整文档库设置按钮的菜单
+3504 组织-用户下查看任务,延期的任务会标记显示
+3501 需求详情等页面的删除icon调整
+3499 创建文档的时候引导用户创建文档的类型
+3490 文档库左侧的列表和产品项目视图的下拉菜单保持一致
+3489 优化文档库创建的页面
+3488 没有文档库时在左侧导航增加添加文档库的入口
+3483 产品视图左上角产品下拉框宽度增加一些
+3466 添加编辑区块时新增状态选择
+3464 浏览文档列表时时间显示完整年份
+3463 预览图片类的文档的时候会出现两个删除按钮
+3462 文档详情页面的全屏按钮增加文字并记录状态
+3458 bug列表页面将严重程度放到优先级前面
+3457 解决bug的时候将closed帐号从指派给列表中去掉
+3454 评审需求时优先级和工时信息应当将现在的值读取出来
+3453 梳理windows和linux一键安装包里面的链接地址
+3446 需求变更时光标到需求名称无需title
+3420 延期bug在详情页面截止日期后显示延期几天
+3419 bug延期后在列表页面截止日期字段标红提示
+2920 用例库的用例更改之后自动更新其关联的测试用例
+修复的Bug
+2311 开源版集成git,git用户名过长无法正常同步
+2332 取消浏览器自动填充信息
+2410 批量分解需求,同需求按钮位置需要优化
+2413 附件上传安全限制功能异常
+2421 用户有组织视图权限访问company-browse.json会显示所有用户密码md5值
+2424 每日任务提醒邮件中不显示任务的截止时间
+2425 需求关联需求后,无法取消
+2426 升级的时候提示错误信息
+2427 树状图展示数据错误
+2440 二级子模块不可以调整为一级父模块
+
2019-01-29 11.2.stable
完成的需求
3553 集成喧喧2.4版本,国际版企业版集成喧喧2.4,国内和国际的版本升级程序要区分处理
diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php
index e1e8037cd4..6bb6062547 100644
--- a/module/block/view/todoblock.html.php
+++ b/module/block/view/todoblock.html.php
@@ -52,7 +52,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php
index 593b8613c1..ef6493b062 100644
--- a/module/bug/lang/zh-tw.php
+++ b/module/bug/lang/zh-tw.php
@@ -128,11 +128,12 @@ $lang->bug->assignToMeAB = '指派給我';
$lang->bug->openedByMeAB = '由我創建';
$lang->bug->resolvedByMeAB = '由我解決';
-$lang->bug->ditto = '同上';
-$lang->bug->dittoNotice = '該bug與上一bug不屬於同一產品!';
-$lang->bug->noAssigned = '未指派';
-$lang->bug->noBug = '暫時沒有Bug。';
-$lang->bug->noModule = '您現在還沒有模組信息
請維護測試模組
';
+$lang->bug->ditto = '同上';
+$lang->bug->dittoNotice = '該bug與上一bug不屬於同一產品!';
+$lang->bug->noAssigned = '未指派';
+$lang->bug->noBug = '暫時沒有Bug。';
+$lang->bug->noModule = '您現在還沒有模組信息
請維護測試模組
';
+$lang->bug->delayWarning = " 延期%s天 ";
/* 頁面標籤。*/
$lang->bug->lblAssignedTo = '當前指派';
diff --git a/module/bug/model.php b/module/bug/model.php
index f7721b011c..5a67f4fd00 100644
--- a/module/bug/model.php
+++ b/module/bug/model.php
@@ -1325,7 +1325,7 @@ class bugModel extends model
$bugs = $this->dao->select('*')->from(TABLE_BUG)
->where('deleted')->eq(0)
->beginIF(!$this->app->user->admin)->andWhere('project')->in('0,' . $this->app->user->view->projects)->fi()
- ->beginIF($type != 'closedBy')->andWhere('status')->ne('closed')->fi()
+ ->beginIF($type != 'closedBy' and $this->app->moduleName == 'block')->andWhere('status')->ne('closed')->fi()
->beginIF($type != 'all')->andWhere("`$type`")->eq($account)->fi()
->orderBy($orderBy)
->beginIF($limit > 0)->limit($limit)->fi()
@@ -2649,7 +2649,7 @@ class bugModel extends model
$params = "bugID=$bug->id";
common::printIcon('bug', 'confirmBug', $params, $bug, 'list', 'confirm', '', 'iframe', true);
common::printIcon('bug', 'resolve', $params, $bug, 'list', 'checked', '', 'iframe', true);
- common::printIcon('bug', 'close', $params, $bug, 'list', 'close', '', 'iframe', true);
+ common::printIcon('bug', 'close', $params, $bug, 'list', '', '', 'iframe', true);
common::printIcon('bug', 'edit', $params, $bug, 'list');
common::printIcon('bug', 'create', "product=$bug->product&branch=$bug->branch&extra=$params", $bug, 'list', 'copy');
break;
diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php
index a0be507ce2..0147853aff 100644
--- a/module/bug/view/browse.html.php
+++ b/module/bug/view/browse.html.php
@@ -37,7 +37,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
if($moduleID)
{
$removeLink = $browseType == 'bymodule' ? inlink('browse', "productID=$productID&branch=$branch&browseType=$browseType¶m=0&orderBy=$orderBy&recTotal=0&recPerPage={$pager->recPerPage}") : 'javascript:removeCookieByKey("bugModule")';
- echo html::a($removeLink, "", '', "class='text-muted'");
+ echo html::a($removeLink, "", '', "class='text-muted'");
}
?>
diff --git a/module/bug/view/view.html.php b/module/bug/view/view.html.php
index fc32f2de3e..6892d99027 100644
--- a/module/bug/view/view.html.php
+++ b/module/bug/view/view.html.php
@@ -73,7 +73,7 @@
common::printIcon('bug', 'confirmBug', $params, $bug, 'button', 'search', '', 'iframe', true);
common::printIcon('bug', 'assignTo', $params, $bug, 'button', '', '', 'iframe', true);
common::printIcon('bug', 'resolve', $params, $bug, 'button', 'checked', '', 'iframe showinonlybody', true);
- common::printIcon('bug', 'close', $params, $bug, 'button', 'close', '', 'text-danger iframe showinonlybody', true);
+ common::printIcon('bug', 'close', $params, $bug, 'button', '', '', 'text-danger iframe showinonlybody', true);
common::printIcon('bug', 'activate', $params, $bug, 'button', '', '', 'text-success iframe showinonlybody', true);
if($config->global->flow != 'onlyTest') common::printIcon('bug', 'toStory', "product=$bug->product&branch=$bug->branch&module=0&story=0&project=0&bugID=$bug->id", $bug, 'button', $lang->icons['story']);
@@ -99,10 +99,11 @@
+ getClientLang() == 'en' ? 'w-80px' : 'w-70px';?>
- | bug->product;?> |
+ bug->product;?> |
product", $productName)) echo $productName;?> |
session->currentProductType != 'normal'):?>
@@ -267,10 +268,11 @@
+ getClientLang() == 'en' ? 'w-100px' : 'w-90px';?>
- | bug->openedBy;?> |
+ bug->openedBy;?> |
openedBy) . $lang->at . $bug->openedDate;?> |
diff --git a/module/common/lang/en.php b/module/common/lang/en.php
index a22552a456..efaa944a66 100644
--- a/module/common/lang/en.php
+++ b/module/common/lang/en.php
@@ -400,7 +400,8 @@ $lang->admin->subMenu->data->backup = array('link' => 'Backup|backup|index', 'su
$lang->admin->subMenu->data->trash = 'Recycle|action|trash';
$lang->admin->subMenu->system = new stdclass();
-$lang->admin->subMenu->system->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron');
+$lang->admin->subMenu->system->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron');
+$lang->admin->subMenu->system->timezone = array('link' => 'Timezone|custom|timezone', 'subModule' => 'custom');
$lang->convert = new stdclass();
$lang->upgrade = new stdclass();
diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php
index 8f1038cdb3..1340e89c6a 100644
--- a/module/common/lang/menuOrder.php
+++ b/module/common/lang/menuOrder.php
@@ -124,6 +124,7 @@ $lang->admin->subMenuOrder->dev[20] = 'entry';
$lang->admin->subMenuOrder->data[5] = 'backup';
$lang->admin->subMenuOrder->data[10] = 'trash';
$lang->admin->subMenuOrder->system[5] = 'cron';
+$lang->admin->subMenuOrder->system[10] = 'timezone';
$lang->convert->menuOrder = $lang->admin->menuOrder;
$lang->upgrade->menuOrder = $lang->admin->menuOrder;
diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php
index 46606369c2..9356bc5b79 100644
--- a/module/common/lang/zh-cn.php
+++ b/module/common/lang/zh-cn.php
@@ -400,7 +400,8 @@ $lang->admin->subMenu->data->backup = array('link' => '备份|backup|index', 'su
$lang->admin->subMenu->data->trash = '回收站|action|trash';
$lang->admin->subMenu->system = new stdclass();
-$lang->admin->subMenu->system->cron = array('link' => '定时|cron|index', 'subModule' => 'cron');
+$lang->admin->subMenu->system->cron = array('link' => '定时|cron|index', 'subModule' => 'cron');
+$lang->admin->subMenu->system->timezone = array('link' => '时区|custom|timezone', 'subModule' => 'custom');
$lang->convert = new stdclass();
$lang->upgrade = new stdclass();
diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php
index da2fcb11c3..46251542ad 100644
--- a/module/common/lang/zh-tw.php
+++ b/module/common/lang/zh-tw.php
@@ -80,7 +80,7 @@ $lang->ipLimited = "fold = '-';
$lang->homepage = '設為模組首頁';
-$lang->tutorial = '新手教程';
+$lang->noviceTutorial = '新手教程';
$lang->changeLog = '修改日誌';
$lang->manual = '手冊';
$lang->manualUrl = 'https://www.zentao.net/book/zentaopmshelp.html?fullScreen=zentao';
@@ -400,7 +400,8 @@ $lang->admin->subMenu->data->backup = array('link' => '備份|backup|index', 'su
$lang->admin->subMenu->data->trash = '資源回收筒|action|trash';
$lang->admin->subMenu->system = new stdclass();
-$lang->admin->subMenu->system->cron = array('link' => '定時|cron|index', 'subModule' => 'cron');
+$lang->admin->subMenu->system->cron = array('link' => '定時|cron|index', 'subModule' => 'cron');
+$lang->admin->subMenu->system->timezone = array('link' => '時區|custom|timezone', 'subModule' => 'custom');
$lang->convert = new stdclass();
$lang->upgrade = new stdclass();
diff --git a/module/company/control.php b/module/company/control.php
index 1eeb8fc949..e3633a5e63 100644
--- a/module/company/control.php
+++ b/module/company/control.php
@@ -72,7 +72,7 @@ class company extends control
/* Get users. */
$users = $this->company->getUsers($type, $queryID, $deptID, $sort, $pager);
/* Remove passwd. */
- foreach($users as $user) $user->password = '';
+ foreach($users as $user) unset($user->password);
/* Assign. */
$this->view->title = $this->lang->company->index . $this->lang->colon . $this->lang->dept->common;
diff --git a/module/custom/control.php b/module/custom/control.php
index 5440ea9797..87c4c623b8 100644
--- a/module/custom/control.php
+++ b/module/custom/control.php
@@ -337,6 +337,10 @@ class custom extends control
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
}
+ unset($this->lang->admin->menu->custom['subModule']);
+ $this->lang->admin->menu->system['subModule'] = 'custom';
+ $this->lang->custom->menu = $this->lang->admin->menu;
+
$this->view->title = $this->lang->custom->timezone;
$this->view->position[] = $this->lang->custom->timezone;
$this->display();
diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php
index 47d1f09956..2ea43fdf79 100644
--- a/module/custom/lang/en.php
+++ b/module/custom/lang/en.php
@@ -72,9 +72,10 @@ $lang->custom->todo->fields['typeList'] = 'Type';
$lang->custom->todo->fields['statusList'] = 'Status';
$lang->custom->user = new stdClass();
-$lang->custom->user->fields['roleList'] = 'Role';
-$lang->custom->user->fields['statusList'] = 'Status';
-$lang->custom->user->fields['deleted'] = 'Deleted User';
+$lang->custom->user->fields['roleList'] = 'Role';
+$lang->custom->user->fields['statusList'] = 'Status';
+$lang->custom->user->fields['contactField'] = 'Available Contact';
+$lang->custom->user->fields['deleted'] = 'Deleted User';
$lang->custom->block->fields['closed'] = 'Closed Block';
@@ -91,6 +92,7 @@ $lang->custom->notice->forceNotReview = "%s Review is NOT required for cer
$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.';
+$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set does not exist or is disabled. Time zone cannot be set.';
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Homepage. Do you want to go to Product Homepage?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Homepage. Do you want to go to Project Homepage?";
diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php
index cdafde4fe0..868406e8d2 100644
--- a/module/custom/lang/zh-cn.php
+++ b/module/custom/lang/zh-cn.php
@@ -92,6 +92,7 @@ $lang->custom->notice->forceNotReview = "指定人提交的%s不需
$lang->custom->notice->longlife = 'Bug列表页面的久未处理标签中,列出设置天数之前未处理的Bug。';
$lang->custom->notice->invalidNumberKey = '键值应为不大于255的数字';
$lang->custom->notice->invalidStringKey = '键值应当为小写英文字母、数字或下划线的组合';
+$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set方法不存在或禁用,不能设置时区。';
$lang->custom->notice->indexPage['product'] = "从8.2版本起增加了产品主页视图,是否默认进入产品主页?";
$lang->custom->notice->indexPage['project'] = "从8.2版本起增加了项目主页视图,是否默认进入项目主页?";
diff --git a/module/custom/lang/zh-tw.php b/module/custom/lang/zh-tw.php
index 463dde53ca..8d7f83443b 100644
--- a/module/custom/lang/zh-tw.php
+++ b/module/custom/lang/zh-tw.php
@@ -16,6 +16,7 @@ $lang->custom->lang = '所屬語言';
$lang->custom->setPublic = '設為公共';
$lang->custom->required = '必填項';
$lang->custom->score = '積分';
+$lang->custom->timezone = '時區';
$lang->custom->scoreReset = '重置積分';
$lang->custom->object['story'] = '需求';
@@ -71,9 +72,10 @@ $lang->custom->todo->fields['typeList'] = '類型';
$lang->custom->todo->fields['statusList'] = '狀態';
$lang->custom->user = new stdClass();
-$lang->custom->user->fields['roleList'] = '職位';
-$lang->custom->user->fields['statusList'] = '狀態';
-$lang->custom->user->fields['deleted'] = '列出已刪除用戶';
+$lang->custom->user->fields['roleList'] = '職位';
+$lang->custom->user->fields['statusList'] = '狀態';
+$lang->custom->user->fields['contactField'] = '可用聯繫方式';
+$lang->custom->user->fields['deleted'] = '列出已刪除用戶';
$lang->custom->block->fields['closed'] = '關閉的區塊';
@@ -83,12 +85,14 @@ $lang->custom->allLang = '適用所有語言';
$lang->custom->confirmRestore = '是否要恢復預設配置?';
$lang->custom->notice = new stdclass();
+$lang->custom->notice->userFieldNotice = '控制以上欄位在用戶相關頁面是否顯示,留空則全部顯示';
$lang->custom->notice->canNotAdd = '該項參與運算,不提供自定義添加功能';
$lang->custom->notice->forceReview = "指定人提交的%s必須評審。";
$lang->custom->notice->forceNotReview = "指定人提交的%s不需要評審。";
$lang->custom->notice->longlife = 'Bug列表頁面的久未處理標籤中,列出設置天數之前未處理的Bug。';
$lang->custom->notice->invalidNumberKey = '鍵值應為不大於255的數字';
$lang->custom->notice->invalidStringKey = '鍵值應當為小寫英文字母、數字或下劃線的組合';
+$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set方法不存在或禁用,不能設置時區。';
$lang->custom->notice->indexPage['product'] = "從8.2版本起增加了產品主頁視圖,是否預設進入產品主頁?";
$lang->custom->notice->indexPage['project'] = "從8.2版本起增加了項目主頁視圖,是否預設進入項目主頁?";
diff --git a/module/custom/view/header.html.php b/module/custom/view/header.html.php
index 67316c32a4..25442e6a55 100644
--- a/module/custom/view/header.html.php
+++ b/module/custom/view/header.html.php
@@ -6,7 +6,6 @@
{
common::printLink('custom', 'set', "module=$object", "{$name}", '', "class='btn btn-link' id='{$object}Tab'");
}
- common::printLink('custom', 'timezone', "", "{$lang->custom->timezone}", '', "class='btn btn-link' id='timezoneTab'");
common::printLink('custom', 'flow', "", "{$lang->custom->flow}", '', "class='btn btn-link' id='flowTab'");
common::printLink('custom', 'working', '', "{$lang->custom->working}", '', "class='btn btn-link' id='workingTab'");
common::printLink('custom', 'required', '', "{$lang->custom->required}", '', "class='btn btn-link' id='requiredTab'");
diff --git a/module/custom/view/timezone.html.php b/module/custom/view/timezone.html.php
index 703981133c..020622f070 100644
--- a/module/custom/view/timezone.html.php
+++ b/module/custom/view/timezone.html.php
@@ -10,32 +10,29 @@
* @link http://www.zentao.net
*/
?>
-
-app->getConfigRoot() . 'timezones.php';?>
+
+
-
+
+
+
custom->notice->cannotSetTimezone;?>
+
+ app->getConfigRoot() . 'timezones.php';?>
+
+
+
-
diff --git a/module/doc/config.php b/module/doc/config.php
index d74556c33e..b93e631848 100644
--- a/module/doc/config.php
+++ b/module/doc/config.php
@@ -14,6 +14,8 @@ $config->doc->edit->requiredFields = 'title';
$config->doc->customObjectLibs = 'files,customFiles';
$config->doc->notArticleType = '';
+$config->doc->canCreateOffice = false;
+$config->doc->officeTypes = 'word,ppt,excel';
$config->doc->custom = new stdclass();
$config->doc->custom->objectLibs = $config->doc->customObjectLibs;
diff --git a/module/doc/control.php b/module/doc/control.php
index ee5e0ecd82..7cc88d3753 100644
--- a/module/doc/control.php
+++ b/module/doc/control.php
@@ -44,7 +44,7 @@ class doc extends control
$pager = new pager(0, 5, 1);
$this->lang->modulePageActions = $this->doc->setFastMenu($this->lang->doc->fast);
- $this->lang->modulePageActions .= common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='50%'") : '';
+ $this->lang->modulePageActions .= common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='70%'") : '';
$actionURL = $this->createLink('doc', 'browse', "lib=0&browseType=bySearch&queryID=myQueryID");
$this->doc->buildSearchForm(0, array(), 0, $actionURL, 'index');
@@ -328,7 +328,7 @@ class doc extends control
$this->product->setMenu($this->product->getPairs(), $lib->product);
$this->lang->set('menugroup.doc', 'product');
- $this->lang->modulePageActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='50%'") : '';
+ $this->lang->modulePageActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='70%'") : '';
}
elseif($this->from == 'project')
{
@@ -337,7 +337,7 @@ class doc extends control
$this->project->setMenu($this->project->getPairs('nocode'), $lib->project);
$this->lang->set('menugroup.doc', 'project');
- $this->lang->modulePageActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='50%'") : '';
+ $this->lang->modulePageActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='70%'") : '';
}
else
{
@@ -803,7 +803,7 @@ class doc extends control
}
elseif($from == 'project')
{
- $this->lang->modulePageActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='50%'") : '';
+ $this->lang->modulePageActions = common::hasPriv('doc', 'createLib') ? html::a(helper::createLink('doc', 'createLib'), " " . $this->lang->doc->createLib, '', "class='btn btn-secondary iframe' data-width='70%'") : '';
$this->lang->doc->menu = $this->lang->project->menu;
$this->lang->doc->menuOrder = $this->lang->project->menuOrder;
$this->project->setMenu($this->project->getPairs('nocode'), $objectID);
diff --git a/module/doc/css/createlib.css b/module/doc/css/createlib.css
index e9a3a45c98..056a6984f3 100644
--- a/module/doc/css/createlib.css
+++ b/module/doc/css/createlib.css
@@ -3,3 +3,6 @@ form{margin-bottom:100px; padding-left:65px}
table{width:90% !important}
#whiteListBox div.input-group {margin-bottom: 2px;}
+
+#product_chosen{width: 50%!important}
+#project_chosen{width: 50%!important}
diff --git a/module/doc/css/view.css b/module/doc/css/view.css
index 82677f858d..b62e842ac4 100644
--- a/module/doc/css/view.css
+++ b/module/doc/css/view.css
@@ -18,3 +18,4 @@
.main-row > .side-col > .cell {transition: opacity .2s;}
.doc-fullscreen .main-row > .side-col {width: 0; position: relative; overflow: hidden}
.doc-fullscreen .fullscreen-btn > .icon-fullscreen:before {content: '\e972'}
+.right-icon a{color: #1183fb}
diff --git a/module/doc/js/common.js b/module/doc/js/common.js
index e81305c241..58eee4826e 100644
--- a/module/doc/js/common.js
+++ b/module/doc/js/common.js
@@ -16,7 +16,7 @@ function toggleAcl(acl, type)
}
if(type == 'lib')
{
- var libType = $('input[name="type"]').val();
+ var libType = $('input[name="type"]:checked').val();
var notice = typeof(noticeAcl[libType][acl]) != 'undefined' ? noticeAcl[libType][acl] : '';
$('#noticeAcl').html(notice);
}
diff --git a/module/doc/js/createlib.js b/module/doc/js/createlib.js
index 2d000782e0..511c265d97 100644
--- a/module/doc/js/createlib.js
+++ b/module/doc/js/createlib.js
@@ -5,8 +5,8 @@ $(function()
var libType = $(this).val();
changeByLibType(libType);
})
- changeByLibType($('input[name="type"]').val());
- toggleAcl($('[name=acl]').val(), 'lib');
+ changeByLibType($('input[name="type"]:checked').val());
+ toggleAcl($('form [name=acl]:checked').val(), 'lib');
});
function changeByLibType(libType)
@@ -15,19 +15,34 @@ function changeByLibType(libType)
{
$('table tr.product').removeClass('hidden');
$('table tr.project').addClass('hidden');
+ changeDoclibAcl(libType);
}
else if(libType == 'project')
{
$('table tr.product').addClass('hidden');
$('table tr.project').removeClass('hidden');
+ changeDoclibAcl(libType);
}
else
{
$('table tr.product').addClass('hidden');
$('table tr.project').addClass('hidden');
+ changeDoclibAcl(libType);
}
- var acl = $('[name=acl]').val();
+ var acl = $('form [name=acl]').val();
var notice = typeof(noticeAcl[libType][acl]) != 'undefined' ? noticeAcl[libType][acl] : '';
$('#noticeAcl').html(notice);
}
+
+function changeDoclibAcl(libType)
+{
+ if(libType == 'product' || libType == 'project')
+ {
+ $('form input[name="acl"]').closest('td').find('span:first').html($('#aclBoxA td').html());
+ }
+ else
+ {
+ $('form input[name="acl"]').closest('td').find('span:first').html($('#aclBoxB td').html());
+ }
+}
diff --git a/module/doc/js/edit.js b/module/doc/js/edit.js
index 1ab517c392..525da538a0 100644
--- a/module/doc/js/edit.js
+++ b/module/doc/js/edit.js
@@ -1,6 +1,6 @@
$(function()
{
- toggleAcl($('input[name="acl"]').val(), 'doc');
+ toggleAcl($('input[name="acl"]:checked').val(), 'doc');
$('input[name="type"]').change(function()
{
var type = $(this).val();
diff --git a/module/doc/js/editlib.js b/module/doc/js/editlib.js
index ee655f0aa9..94dc79004d 100644
--- a/module/doc/js/editlib.js
+++ b/module/doc/js/editlib.js
@@ -1,4 +1,4 @@
$(function()
{
- toggleAcl($('input[name="acl"]').val(), 'lib');
+ toggleAcl($('form input[name="acl"]:checked').val(), 'lib');
})
diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php
index 6933449638..23c62ae02b 100644
--- a/module/doc/lang/en.php
+++ b/module/doc/lang/en.php
@@ -78,7 +78,7 @@ $lang->doc->addType = 'Add';
$lang->doc->childType = 'Child';
$lang->doc->collect = 'Add Favorites';
$lang->doc->cancelCollection = 'Remove Favorites';
-$lang->doc->deleteFile = 'Detele File'
+$lang->doc->deleteFile = 'Detele File';
$lang->doc->libName = 'Name';
$lang->doc->libType = 'Category';
@@ -119,6 +119,13 @@ $lang->doc->aclList['open'] = 'Public';
$lang->doc->aclList['custom'] = 'Custom';
$lang->doc->aclList['private'] = 'Private';
+$lang->doc->typeList['html'] = 'Html';
+$lang->doc->typeList['markdown'] = 'Markdown';
+$lang->doc->typeList['url'] = 'Url';
+$lang->doc->typeList['word'] = 'Word';
+$lang->doc->typeList['ppt'] = 'PPT';
+$lang->doc->typeList['excel'] = 'Excel';
+
$lang->doc->types['text'] = 'Text';
$lang->doc->types['url'] = 'URL';
@@ -142,6 +149,7 @@ $lang->doc->fastMenuIconList['collectedbyme'] = 'icon-folder-star';
$lang->doc->customObjectLibs['files'] = 'Show File Library';
$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['unclosed'] = 'Only display projects that are not closed';
@@ -155,24 +163,23 @@ $lang->doc->errorMainSysLib = "This library cannot be deleted.";
$lang->doc->accessDenied = "Access 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.';
$lang->doc->noSearchedDoc = 'Nothing searched.';
$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']['open'] = 'Everyone can access it unless the user has no access to the associated product.';
-$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users of whitelists and associated product with access rights can access them.';
-$lang->doc->noticeAcl['lib']['product']['private'] = 'Creators and users of associated product with access rights can access them.';
-$lang->doc->noticeAcl['lib']['project']['open'] = 'Everyone can access it unless the user has no access to the associated project.';
-$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users of whitelists and associated project with access rights can access them.';
-$lang->doc->noticeAcl['lib']['project']['private'] = 'Creators and users of associated project with access rights can access them.';
-$lang->doc->noticeAcl['lib']['custom']['open'] = 'Everyone can visit it.';
-$lang->doc->noticeAcl['lib']['custom']['custom'] = 'Whitelist users are accessible.';
-$lang->doc->noticeAcl['lib']['custom']['private'] = 'Only the creator can access it.';
+$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['doc']['open'] = 'Everyone can access it unless the user does not have permission to belong to the document library.';
-$lang->doc->noticeAcl['doc']['custom'] = 'Whitelist users are accessible.';
-$lang->doc->noticeAcl['doc']['private'] = 'Only the creator 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->placeholder = new stdclass();
$lang->doc->placeholder->url = 'Url';
@@ -188,6 +195,13 @@ $lang->doclib->select = 'Select';
$lang->doclib->project = $lang->projectCommon . ' Library';
$lang->doclib->product = $lang->productCommon . ' Library';
+$lang->doclib->aclListA['default'] = 'Default';
+$lang->doclib->aclListA['custom'] = 'Custom';
+
+$lang->doclib->aclListB['open'] = 'Public';
+$lang->doclib->aclListB['custom'] = 'Custom';
+$lang->doclib->aclListB['private'] = 'Private';
+
$lang->doclib->create['product'] = 'Create ' . $lang->productCommon . ' Library';
$lang->doclib->create['project'] = 'Create ' . $lang->projectCommon . ' Library';
$lang->doclib->create['custom'] = 'Create Custom Library';
diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php
index cba554cbf7..c00c3d427b 100644
--- a/module/doc/lang/zh-cn.php
+++ b/module/doc/lang/zh-cn.php
@@ -122,6 +122,9 @@ $lang->doc->aclList['private'] = '私有';
$lang->doc->typeList['html'] = '富文本';
$lang->doc->typeList['markdown'] = 'Markdown';
$lang->doc->typeList['url'] = '链接';
+$lang->doc->typeList['word'] = 'Word';
+$lang->doc->typeList['ppt'] = 'PPT';
+$lang->doc->typeList['excel'] = 'Excel';
$lang->doc->types['text'] = '文档';
$lang->doc->types['url'] = '链接';
@@ -146,8 +149,8 @@ $lang->doc->fastMenuIconList['collectedbyme'] = 'icon-folder-star';
$lang->doc->customObjectLibs['files'] = '显示附件库';
$lang->doc->customObjectLibs['customFiles'] = '显示自定义文档库';
-$lang->doc->orderLib = '文档库排序';
-$lang->doc->customShowLibs = '显示设置';
+$lang->doc->orderLib = '文档库排序';
+$lang->doc->customShowLibs = '显示设置';
$lang->doc->customShowLibsList['zero'] = '显示空文档的库';
$lang->doc->customShowLibsList['unclosed'] = '只显示未关闭的项目';
@@ -160,24 +163,23 @@ $lang->doc->errorMainSysLib = "该系统文档库不能删除!";
$lang->doc->accessDenied = "您没有权限访问!";
$lang->doc->versionNotFount = '该版本文档不存在';
$lang->doc->noDoc = '暂时没有文档。';
+$lang->doc->cannotCreateOffice = '对不起,企业版才能创建%s文档。
试用企业版,请联系我们:4006-8899-23 0532-86893032。
';
$lang->doc->noSearchedDoc = '没有搜索到任何文档。';
$lang->doc->noEditedDoc = '您还没有编辑任何文档。';
$lang->doc->noOpenedDoc = '您还没有创建任何文档。';
$lang->doc->noCollectedDoc = '您还没有收藏任何文档。';
-$lang->doc->noticeAcl['lib']['product']['open'] = '除了没有关联产品权限的用户,都可以访问。';
-$lang->doc->noticeAcl['lib']['product']['custom'] = '白名单和有关联产品权限的用户可以访问。';
-$lang->doc->noticeAcl['lib']['product']['private'] = '创建人和有关联产品权限的用户可以访问。';
-$lang->doc->noticeAcl['lib']['project']['open'] = '除了没有关联项目权限的用户,都可以访问。';
-$lang->doc->noticeAcl['lib']['project']['custom'] = '白名单和有关联项目权限的用户可以访问。';
-$lang->doc->noticeAcl['lib']['project']['private'] = '创建人和有关联项目权限的用户可以访问。';
+$lang->doc->noticeAcl['lib']['product']['default'] = '有所选产品访问权限的用户可以访问。';
+$lang->doc->noticeAcl['lib']['product']['custom'] = '有所选产品访问权限或白名单里的用户可以访问。';
+$lang->doc->noticeAcl['lib']['project']['default'] = '有所选项目访问权限的用户可以访问。';
+$lang->doc->noticeAcl['lib']['project']['custom'] = '有所选项目访问权限或白名单里的用户可以访问。';
$lang->doc->noticeAcl['lib']['custom']['open'] = '所有人都可以访问。';
$lang->doc->noticeAcl['lib']['custom']['custom'] = '白名单的用户可以访问。';
-$lang->doc->noticeAcl['lib']['custom']['private'] = '只有创建人可以访问。';
+$lang->doc->noticeAcl['lib']['custom']['private'] = '只有创建者自己可以访问。';
-$lang->doc->noticeAcl['doc']['open'] = '除了没有所属文档库权限的用户,都可以访问。';
+$lang->doc->noticeAcl['doc']['open'] = '有文档所属文档库访问权限的,都可以访问。';
$lang->doc->noticeAcl['doc']['custom'] = '白名单的用户可以访问。';
-$lang->doc->noticeAcl['doc']['private'] = '只有自己可以访问。';
+$lang->doc->noticeAcl['doc']['private'] = '只有创建者自己可以访问。';
$lang->doc->placeholder = new stdclass();
$lang->doc->placeholder->url = '相应的链接地址';
@@ -193,6 +195,13 @@ $lang->doclib->select = '选择文档库';
$lang->doclib->project = $lang->projectCommon . '库';
$lang->doclib->product = $lang->productCommon . '库';
+$lang->doclib->aclListA['default'] = '默认';
+$lang->doclib->aclListA['custom'] = '自定义';
+
+$lang->doclib->aclListB['open'] = '公开';
+$lang->doclib->aclListB['custom'] = '自定义';
+$lang->doclib->aclListB['private'] = '私有';
+
$lang->doclib->create['product'] = '创建' . $lang->productCommon . '文档库';
$lang->doclib->create['project'] = '创建' . $lang->projectCommon . '文档库';
$lang->doclib->create['custom'] = '创建自定义文档库';
diff --git a/module/doc/lang/zh-tw.php b/module/doc/lang/zh-tw.php
index 0ec9fe534d..5eef536c29 100644
--- a/module/doc/lang/zh-tw.php
+++ b/module/doc/lang/zh-tw.php
@@ -78,6 +78,7 @@ $lang->doc->addType = '增加分類';
$lang->doc->childType = '子分類';
$lang->doc->collect = '收藏';
$lang->doc->cancelCollection = '取消收藏';
+$lang->doc->deleteFile = '刪除附件';
$lang->doc->libName = '文檔庫名稱';
$lang->doc->libType = '文檔庫類型';
@@ -118,6 +119,13 @@ $lang->doc->aclList['open'] = '公開';
$lang->doc->aclList['custom'] = '自定義';
$lang->doc->aclList['private'] = '私有';
+$lang->doc->typeList['html'] = '富文本';
+$lang->doc->typeList['markdown'] = 'Markdown';
+$lang->doc->typeList['url'] = '連結';
+$lang->doc->typeList['word'] = 'Word';
+$lang->doc->typeList['ppt'] = 'PPT';
+$lang->doc->typeList['excel'] = 'Excel';
+
$lang->doc->types['text'] = '文檔';
$lang->doc->types['url'] = '連結';
@@ -141,7 +149,8 @@ $lang->doc->fastMenuIconList['collectedbyme'] = 'icon-folder-star';
$lang->doc->customObjectLibs['files'] = '顯示附件庫';
$lang->doc->customObjectLibs['customFiles'] = '顯示自定義文檔庫';
-$lang->doc->customShowLibs = '文檔庫顯示設置';
+$lang->doc->orderLib = '文檔庫排序';
+$lang->doc->customShowLibs = '顯示設置';
$lang->doc->customShowLibsList['zero'] = '顯示空文檔的庫';
$lang->doc->customShowLibsList['unclosed'] = '只顯示未關閉的項目';
@@ -154,11 +163,24 @@ $lang->doc->errorMainSysLib = "該系統文檔庫不能刪除!";
$lang->doc->accessDenied = "您沒有權限訪問!";
$lang->doc->versionNotFount = '該版本文檔不存在';
$lang->doc->noDoc = '暫時沒有文檔。';
+$lang->doc->cannotCreateOffice = '對不起,企業版才能創建%s文檔。
試用企業版,請聯繫我們:4006-8899-23 0532-86893032。
';
$lang->doc->noSearchedDoc = '沒有搜索到任何文檔。';
$lang->doc->noEditedDoc = '您還沒有編輯任何文檔。';
$lang->doc->noOpenedDoc = '您還沒有創建任何文檔。';
$lang->doc->noCollectedDoc = '您還沒有收藏任何文檔。';
+$lang->doc->noticeAcl['lib']['product']['default'] = '有所選產品訪問權限的用戶可以訪問。';
+$lang->doc->noticeAcl['lib']['product']['custom'] = '有所選產品訪問權限或白名單裡的用戶可以訪問。';
+$lang->doc->noticeAcl['lib']['project']['default'] = '有所選項目訪問權限的用戶可以訪問。';
+$lang->doc->noticeAcl['lib']['project']['custom'] = '有所選項目訪問權限或白名單裡的用戶可以訪問。';
+$lang->doc->noticeAcl['lib']['custom']['open'] = '所有人都可以訪問。';
+$lang->doc->noticeAcl['lib']['custom']['custom'] = '白名單的用戶可以訪問。';
+$lang->doc->noticeAcl['lib']['custom']['private'] = '只有創建者自己可以訪問。';
+
+$lang->doc->noticeAcl['doc']['open'] = '有文檔所屬文檔庫訪問權限的,都可以訪問。';
+$lang->doc->noticeAcl['doc']['custom'] = '白名單的用戶可以訪問。';
+$lang->doc->noticeAcl['doc']['private'] = '只有創建者自己可以訪問。';
+
$lang->doc->placeholder = new stdclass();
$lang->doc->placeholder->url = '相應的連結地址';
@@ -173,6 +195,18 @@ $lang->doclib->select = '選擇文檔庫';
$lang->doclib->project = $lang->projectCommon . '庫';
$lang->doclib->product = $lang->productCommon . '庫';
+$lang->doclib->aclListA['default'] = '預設';
+$lang->doclib->aclListA['custom'] = '自定義';
+
+$lang->doclib->aclListB['open'] = '公開';
+$lang->doclib->aclListB['custom'] = '自定義';
+$lang->doclib->aclListB['private'] = '私有';
+
+
+$lang->doclib->create['product'] = '創建' . $lang->productCommon . '文檔庫';
+$lang->doclib->create['project'] = '創建' . $lang->projectCommon . '文檔庫';
+$lang->doclib->create['custom'] = '創建自定義文檔庫';
+
$lang->doclib->main['product'] = $lang->productCommon . '主庫';
$lang->doclib->main['project'] = $lang->projectCommon . '主庫';
diff --git a/module/doc/model.php b/module/doc/model.php
index 76aef30730..7e5af91b90 100644
--- a/module/doc/model.php
+++ b/module/doc/model.php
@@ -847,10 +847,6 @@ class docModel extends model
{
if($this->app->user->admin) return true;
- $acls = $this->app->user->rights['acls'];
- if(!empty($object->product) and !empty($acls['products']) and !in_array($object->product, $acls['products'])) return false;
- if(!empty($object->project) and !empty($acls['projects']) and !in_array($object->project, $acls['projects'])) return false;
-
if($object->acl == 'open') return true;
$account = ',' . $this->app->user->account . ',';
@@ -872,8 +868,15 @@ class docModel extends model
if(isset($extraDocLibs[$object->id])) return true;
}
- if(!empty($object->project)) return $this->loadModel('project')->checkPriv($object->project);
- if(!empty($object->product)) return $this->loadModel('product')->checkPriv($object->product);
+ if(!empty($object->product) or !empty($object->project))
+ {
+ $acls = $this->app->user->rights['acls'];
+ if(!empty($object->product) and !empty($acls['products']) and !in_array($object->product, $acls['products'])) return false;
+ if(!empty($object->project) and !empty($acls['projects']) and !in_array($object->project, $acls['projects'])) return false;
+ if(!empty($object->project)) return $this->loadModel('project')->checkPriv($object->project);
+ if(!empty($object->product)) return $this->loadModel('product')->checkPriv($object->product);
+ }
+
return false;
}
diff --git a/module/doc/view/alllibsbylist.html.php b/module/doc/view/alllibsbylist.html.php
index c84481608e..668d922d3c 100644
--- a/module/doc/view/alllibsbylist.html.php
+++ b/module/doc/view/alllibsbylist.html.php
@@ -42,7 +42,7 @@
createdBy) echo zget($users, $lib->createdBy);?> |
- createdDate != '00-00-00 00:00:00') echo formatTime($lib->createdDate, 'm-d h:i');?> |
+ createdDate != '00-00-00 00:00:00') echo formatTime($lib->createdDate, 'Y-m-d');?> |
collector, ',' . $this->app->user->account . ',') !== false ? 'icon-star text-yellow' : 'icon-star-empty';?>
diff --git a/module/doc/view/browse.html.php b/module/doc/view/browse.html.php
index 1818f8bf90..5d38158ff4 100644
--- a/module/doc/view/browse.html.php
+++ b/module/doc/view/browse.html.php
@@ -58,7 +58,8 @@ var browseType = '';
diff --git a/module/doc/view/browsebygrid.html.php b/module/doc/view/browsebygrid.html.php
index 087dc53bb4..fcb2ec714a 100644
--- a/module/doc/view/browsebygrid.html.php
+++ b/module/doc/view/browsebygrid.html.php
@@ -30,7 +30,8 @@
diff --git a/module/doc/view/create.html.php b/module/doc/view/create.html.php
index af8b953695..97835583f0 100644
--- a/module/doc/view/create.html.php
+++ b/module/doc/view/create.html.php
@@ -10,6 +10,19 @@
* @link http://www.zentao.net
*/
?>
+doc->officeTypes, $docType) !== false and !$config->doc->canCreateOffice):?>
+
+
+
+
+ doc->create;?>
+
+ doc->cannotCreateOffice, zget($lang->doc->typeList, $docType));?>
+
+
+
+
+
@@ -98,3 +111,4 @@
doc->noticeAcl['doc']);?>
+
diff --git a/module/doc/view/createlib.html.php b/module/doc/view/createlib.html.php
index e5fc5ba61e..e53b15beec 100644
--- a/module/doc/view/createlib.html.php
+++ b/module/doc/view/createlib.html.php
@@ -23,33 +23,31 @@
@@ -73,5 +67,21 @@
+
+
+
+ | doclib->control;?> |
+
+ doclib->aclListA, 'default', "onchange='toggleAcl(this.value, \"lib\")'")?>
+ |
+
+
+ | doclib->control;?> |
+
+ doclib->aclListB, 'open', "onchange='toggleAcl(this.value, \"lib\")'")?>
+ |
+
+
+
doc->noticeAcl['lib']);?>
diff --git a/module/doc/view/editlib.html.php b/module/doc/view/editlib.html.php
index ba55992f6e..5ddcf493cc 100644
--- a/module/doc/view/editlib.html.php
+++ b/module/doc/view/editlib.html.php
@@ -37,18 +37,23 @@
|
| doc->libName?> |
- name, "class='form-control'");
- echo html::hidden('type', $lib->type);
- ?>
+ name, "class='form-control'");?>
+ doc->libTypeList, $lib->type);?>
|
| doclib->control;?> |
+ type == 'product' or $lib->type == 'project'):?>
- doc->aclList, $lib->acl, "onchange='toggleAcl(this.value, \"lib\")'")?>
+ doclib->aclListA, $lib->acl, "onchange='toggleAcl(this.value, \"lib\")'")?>
doc->noticeAcl['lib'][$lib->type][$lib->acl];?>
|
+
+
+ doclib->aclListB, $lib->acl, "onchange='toggleAcl(this.value, \"lib\")'")?>
+ doc->noticeAcl['lib'][$lib->type][$lib->acl];?>
+ |
+
| doc->whiteList?> |
diff --git a/module/doc/view/index.html.php b/module/doc/view/index.html.php
index 0ddcee7479..ba507b4661 100644
--- a/module/doc/view/index.html.php
+++ b/module/doc/view/index.html.php
@@ -40,7 +40,7 @@
title;?> |
fileSize ? $doc->fileSize : '-';?> |
addedBy);?> |
- editedDate == '0000-00-00 00:00:00' ? formatTime($doc->addedDate, 'y-m-d') : formatTime($doc->editedDate, 'y-m-d');?> |
+ editedDate == '0000-00-00 00:00:00' ? formatTime($doc->addedDate, 'Y-m-d') : formatTime($doc->editedDate, 'Y-m-d');?> |
@@ -174,7 +174,7 @@
id}");?>">
| title;?> |
addedBy);?> |
- editedDate) ? formatTime($doc->editedDate, 'y-m-d') : formatTime($doc->addedDate, 'y-m-d');?> |
+ editedDate) ? formatTime($doc->editedDate, 'Y-m-d') : formatTime($doc->addedDate, 'y-m-d');?> |
diff --git a/module/doc/view/side.html.php b/module/doc/view/side.html.php
index d15f51a14d..8ba198a0d8 100644
--- a/module/doc/view/side.html.php
+++ b/module/doc/view/side.html.php
@@ -36,7 +36,7 @@ if(empty($type)) $type = 'product';
doclib->create, $tabValue, '');
- if($text) echo html::a($this->createLink($tabValue, 'create'), $text, '', "class='text-ellipsis'");
+ if($text and common::hasPriv($tabValue, 'create')) echo html::a($this->createLink($tabValue, 'create'), $text, '', "class='text-ellipsis'");
?>
@@ -125,7 +125,7 @@ if(empty($type)) $type = 'product';
doclib->create, $tabValue, '');
- if($text) echo html::a($this->createLink('doc', 'createLib', "type={$tabValue}"), $text, '', "class='iframe' data-width='50%'");
+ if($text and common::hasPriv('doc', 'createLib')) echo html::a($this->createLink('doc', 'createLib', "type={$tabValue}"), $text, '', "class='iframe' data-width='70%'");
?>
@@ -162,18 +162,18 @@ if(empty($type)) $type = 'product';
@@ -198,7 +198,6 @@ if(empty($type)) $type = 'product';
-goback);?>
diff --git a/module/entry/view/browse.html.php b/module/entry/view/browse.html.php
index 320f91005e..844add788a 100644
--- a/module/entry/view/browse.html.php
+++ b/module/entry/view/browse.html.php
@@ -43,7 +43,7 @@
if(common::hasPriv('entry', 'delete'))
{
$deleteURL = $this->createLink('entry', 'delete', "entryID=$id&confirm=yes");
- echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"entryList\",confirmDelete)", '', '', "title='{$lang->entry->delete}' class='btn'");
+ echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"entryList\",confirmDelete)", '', '', "title='{$lang->entry->delete}' class='btn'");
}
?>
diff --git a/module/git/model.php b/module/git/model.php
index 5f4efab6f7..3ac2d00fbf 100644
--- a/module/git/model.php
+++ b/module/git/model.php
@@ -324,7 +324,7 @@ class gitModel extends model
list($hash, $account, $date) = $log;
$account = preg_replace('/^Author:/', '', $account);
- $account = trim(preg_replace('/<[\w\-\.]+@[\w\-]+>/', '', $account));
+ $account = trim(preg_replace('/<[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+>/', '', $account));
$date = trim(preg_replace('/^Date:/', '', $date));
$count = count($log);
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index 98c93a1735..e78d2eb0aa 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -557,6 +557,7 @@ $lang->resource->testcase->review = 'review';
$lang->resource->testcase->batchReview = 'batchReview';
$lang->resource->testcase->importFromLib = 'importFromLib';
$lang->resource->testcase->batchCaseTypeChange = 'batchCaseTypeChange';
+$lang->resource->testcase->confirmLibcaseChange = 'confirmLibcaseChange';
$lang->resource->testcase->batchConfirmStoryChange = 'batchConfirmStoryChange';
$lang->testcase->methodOrder[0] = 'index';
@@ -752,6 +753,7 @@ $lang->resource->custom->restore = 'restore';
$lang->resource->custom->flow = 'flow';
$lang->resource->custom->working = 'working';
$lang->resource->custom->setPublic = 'setPublic';
+$lang->resource->custom->timezone = 'timezone';
$lang->custom->methodOrder[5] = 'index';
$lang->custom->methodOrder[10] = 'set';
@@ -759,6 +761,7 @@ $lang->custom->methodOrder[15] = 'restore';
$lang->custom->methodOrder[20] = 'flow';
$lang->custom->methodOrder[25] = 'working';
$lang->custom->methodOrder[30] = 'setPublic';
+$lang->custom->methodOrder[35] = 'timezone';
$lang->resource->datatable = new stdclass();
$lang->resource->datatable->setGlobal = 'setGlobal';
diff --git a/module/group/view/browse.html.php b/module/group/view/browse.html.php
index 75b78a0608..f59c4d9135 100644
--- a/module/group/view/browse.html.php
+++ b/module/group/view/browse.html.php
@@ -59,7 +59,7 @@
}
else
{
- echo "";
+ echo "";
}
?>
diff --git a/module/install/lang/zh-tw.php b/module/install/lang/zh-tw.php
index 9383a557b1..139f3077d5 100644
--- a/module/install/lang/zh-tw.php
+++ b/module/install/lang/zh-tw.php
@@ -88,6 +88,7 @@ $lang->install->chmodWin = '需要修改目錄 "%s" 的權限。';
$lang->install->mkdirLinux = '需要創建目錄%s。
命令為:
mkdir -p %s
';
$lang->install->chmodLinux = '需要修改目錄 "%s" 的權限。
命令為:
chmod o=rwx -R %s';
+$lang->install->timezone = '時區設置';
$lang->install->defaultLang = '預設語言';
$lang->install->dbHost = '資料庫伺服器';
$lang->install->dbHostNote = '如果127.0.0.1無法訪問,嘗試使用localhost';
diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php
index 15a735b4c2..1ba29db38d 100644
--- a/module/misc/lang/en.php
+++ b/module/misc/lang/en.php
@@ -76,6 +76,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = 'Latest Version';
$lang->misc->feature->detailed = 'Details';
+$lang->misc->releaseDate['11.3.stable'] = '2019-02-27';
$lang->misc->releaseDate['11.2.stable'] = '2019-01-30';
$lang->misc->releaseDate['11.1.stable'] = '2019-01-04';
$lang->misc->releaseDate['11.0.stable'] = '2018-12-21';
@@ -99,6 +100,8 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
+$lang->misc->feature->all['11.3.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => 'Add Child Plan to a Plan
Optimize the chosen
Add Timezone setting
Optimize Doc Lib and Doc modules
');
+
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => 'Add upgrade logs and database checkup after upgrading
Fixed ZenTao client and other bugs, and optimized details.
');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'Fix Bug.');
diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php
index c8f9cfab5a..b5f86fd692 100644
--- a/module/misc/lang/zh-cn.php
+++ b/module/misc/lang/zh-cn.php
@@ -76,6 +76,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '详情';
+$lang->misc->releaseDate['11.3.stable'] = '2019-02-27';
$lang->misc->releaseDate['11.2.stable'] = '2019-01-30';
$lang->misc->releaseDate['11.1.stable'] = '2019-01-04';
$lang->misc->releaseDate['11.0.stable'] = '2018-12-21';
@@ -99,6 +100,8 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
+$lang->misc->feature->all['11.3.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '计划添加子计划功能
优化chosen交互
添加时区设置
优化文档库和文档
');
+
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '增加升级日志和升级后数据库检查的功能
修复禅道集成客户端和其他若干bug,完善细节
');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'主要修复Bug。');
diff --git a/module/misc/lang/zh-tw.php b/module/misc/lang/zh-tw.php
index 5a0d901f66..59fbb93d40 100644
--- a/module/misc/lang/zh-tw.php
+++ b/module/misc/lang/zh-tw.php
@@ -76,6 +76,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '詳情';
+$lang->misc->releaseDate['11.3.stable'] = '2019-02-27';
$lang->misc->releaseDate['11.2.stable'] = '2019-01-30';
$lang->misc->releaseDate['11.1.stable'] = '2019-01-04';
$lang->misc->releaseDate['11.0.stable'] = '2018-12-21';
@@ -99,6 +100,8 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
+$lang->misc->feature->all['11.3.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '計劃添加子計劃功能
優化chosen交互
添加時區設置
優化文檔庫和文檔
');
+
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '增加升級日誌和升級後資料庫檢查的功能
修復禪道整合客戶端和其他若干bug,完善細節
');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'主要修復Bug。');
diff --git a/module/my/view/bug.html.php b/module/my/view/bug.html.php
index b47830f627..13e5817b86 100644
--- a/module/my/view/bug.html.php
+++ b/module/my/view/bug.html.php
@@ -95,7 +95,7 @@
$params = "bugID=$bug->id";
common::printIcon('bug', 'confirmBug', $params, $bug, 'list', 'confirm', '', 'iframe', true);
common::printIcon('bug', 'resolve', $params, $bug, 'list', 'checked', '', 'iframe', true);
- common::printIcon('bug', 'close', $params, $bug, 'list', 'close', '', 'iframe', true);
+ common::printIcon('bug', 'close', $params, $bug, 'list', '', '', 'iframe', true);
common::printIcon('bug', 'edit', $params, $bug, 'list');
common::printIcon('bug', 'create', "product=$bug->product&branch=$bug->branch&extra=$params", $bug, 'list', 'copy');
?>
diff --git a/module/my/view/story.html.php b/module/my/view/story.html.php
index 17f5ed9b3d..b010211ae6 100644
--- a/module/my/view/story.html.php
+++ b/module/my/view/story.html.php
@@ -82,7 +82,7 @@
$vars = "story={$story->id}";
common::printIcon('story', 'change', $vars, $story, 'list', 'fork');
common::printIcon('story', 'review', $vars, $story, 'list', 'glasses');
- common::printIcon('story', 'close', $vars, $story, 'list', 'close', '', 'iframe', true);
+ common::printIcon('story', 'close', $vars, $story, 'list', '', '', 'iframe', true);
common::printIcon('story', 'edit', $vars, $story, 'list');
if($config->global->flow != 'onlyStory') common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap');
?>
diff --git a/module/my/view/task.html.php b/module/my/view/task.html.php
index 2a4636e731..db1fb90172 100644
--- a/module/my/view/task.html.php
+++ b/module/my/view/task.html.php
@@ -96,7 +96,7 @@
{
if($task->status != 'pause') common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
if($task->status == 'pause') common::printIcon('task', 'restart', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', 'close', '', 'iframe', true, '');
+ common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task, 'list', 'time', '', 'iframe', true);
diff --git a/module/product/model.php b/module/product/model.php
index 528d47b3e3..ed5c84b319 100644
--- a/module/product/model.php
+++ b/module/product/model.php
@@ -370,7 +370,7 @@ class productModel extends model
$lib->name = $this->lang->doclib->main['product'];
$lib->type = 'product';
$lib->main = '1';
- $lib->acl = $product->acl == 'open' ? 'open' : 'private';
+ $lib->acl = 'default';
$this->dao->insert(TABLE_DOCLIB)->data($lib)->exec();
$this->loadModel('user')->updateUserView($productID, 'product');
@@ -404,8 +404,6 @@ class productModel extends model
->exec();
if(!dao::isError())
{
- if($product->acl != $oldProduct->acl) $this->dao->update(TABLE_DOCLIB)->set('acl')->eq($product->acl == 'open' ? 'open' : 'private')->where('product')->eq($productID)->exec();
-
$this->file->updateObjectID($this->post->uid, $productID, 'product');
if($product->acl != $oldProduct->acl or $product->whitelist != $oldProduct->whitelist) $this->loadModel('user')->updateUserView($productID, 'product');
return common::createChanges($oldProduct, $product);
diff --git a/module/product/view/view.html.php b/module/product/view/view.html.php
index 9d9151e05b..6cfa0493e1 100644
--- a/module/product/view/view.html.php
+++ b/module/product/view/view.html.php
@@ -87,7 +87,7 @@
echo "";
if($product->status != 'closed')
{
- common::printIcon('product', 'close', $params, $product, 'button', 'close', '', 'iframe', true);
+ common::printIcon('product', 'close', $params, $product, 'button', '', '', 'iframe', true);
echo "";
}
diff --git a/module/productplan/lang/zh-tw.php b/module/productplan/lang/zh-tw.php
index bb5c6c642d..4680177376 100644
--- a/module/productplan/lang/zh-tw.php
+++ b/module/productplan/lang/zh-tw.php
@@ -27,6 +27,7 @@ $lang->productplan->batchUnlinkStory = "批量移除需求";
$lang->productplan->linkedStories = '需求';
$lang->productplan->unlinkedStories = '未關聯需求';
$lang->productplan->updateOrder = '排序';
+$lang->productplan->createChildren = "創建子計劃";
$lang->productplan->linkBug = "關聯Bug";
$lang->productplan->unlinkBug = "移除Bug";
@@ -54,6 +55,8 @@ $lang->productplan->stories = '需求數';
$lang->productplan->bugs = 'Bug數';
$lang->productplan->hour = '工時';
$lang->productplan->project = $lang->projectCommon;
+$lang->productplan->parent = "父計劃";
+$lang->productplan->children= "子計劃";
$lang->productplan->endList[7] = '一星期';
$lang->productplan->endList[14] = '兩星期';
diff --git a/module/project/model.php b/module/project/model.php
index 614019023f..fba8ca1742 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -348,7 +348,7 @@ class projectModel extends model
$lib->name = $this->lang->doclib->main['project'];
$lib->type = 'project';
$lib->main = '1';
- $lib->acl = $project->acl == 'open' ? 'open' : 'private';
+ $lib->acl = 'default';
$this->dao->insert(TABLE_DOCLIB)->data($lib)->exec();
$this->loadModel('user')->updateUserView($projectID, 'project');
@@ -421,8 +421,6 @@ class projectModel extends model
}
if(!dao::isError())
{
- if($project->acl != $oldProject->acl) $this->dao->update(TABLE_DOCLIB)->set('acl')->eq($project->acl == 'open' ? 'open' : 'private')->where('project')->eq($projectID)->exec();
-
$this->file->updateObjectID($this->post->uid, $projectID, 'project');
if($project->acl != $oldProject->acl or $project->whitelist != $oldProject->whitelist) $this->loadModel('user')->updateUserView($projectID, 'project');
return common::createChanges($oldProject, $project);
@@ -2322,7 +2320,7 @@ class projectModel extends model
if($product->type != 'normal')
{
$productType = $product->type;
- if($product->branch)
+ if($product->branch and isset($branchGroups[$product->id][$product->branch]))
{
$branchPairs[$product->branch] = (count($products) > 1 ? $product->name . '/' : '') . $branchGroups[$product->id][$product->branch];
}
diff --git a/module/project/view/bug.html.php b/module/project/view/bug.html.php
index c2f5642cff..543809d370 100644
--- a/module/project/view/bug.html.php
+++ b/module/project/view/bug.html.php
@@ -101,7 +101,7 @@
$params = "bugID=$bug->id";
common::printIcon('bug', 'confirmBug', $params, $bug, 'list', 'confirm', '', 'iframe', true);
common::printIcon('bug', 'resolve', $params, $bug, 'list', 'checked', '', 'iframe', true);
- common::printIcon('bug', 'close', $params, $bug, 'list', 'close', '', 'iframe', true);
+ common::printIcon('bug', 'close', $params, $bug, 'list', '', '', 'iframe', true);
common::printIcon('bug', 'create', "product=$bug->product&branch=$bug->branch&extra=$params", $bug, 'list', 'copy');
common::printIcon('bug', 'edit', $params, $bug, 'list');
?>
diff --git a/module/project/view/treestory.html.php b/module/project/view/treestory.html.php
index 893dbd1fdc..c053804db0 100644
--- a/module/project/view/treestory.html.php
+++ b/module/project/view/treestory.html.php
@@ -12,7 +12,7 @@
common::printIcon('story', 'change', $vars, $story, 'list', 'fork', '', 'btn btn-info btn-icon');
common::printIcon('story', 'delete', $vars, $story, 'list', 'trash', 'hiddenwin', 'btn btn-info btn-icon');
common::printIcon('story', 'review', $vars, $story, 'list', 'glasses', '', 'btn btn-info btn-icon');
- common::printIcon('story', 'close', $vars, $story, 'list', 'close', '', 'btn btn-info btn-icon iframe', true);
+ common::printIcon('story', 'close', $vars, $story, 'list', 'off', '', 'btn btn-info btn-icon iframe', true);
common::printIcon('story', 'edit', $vars, $story, 'list', '', '', 'btn btn-info btn-icon');
if($config->global->flow != 'onlyStory') common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap', '', 'btn btn-info btn-icon');
?>
diff --git a/module/project/view/treetask.html.php b/module/project/view/treetask.html.php
index d86b6c68cd..f8626278e3 100644
--- a/module/project/view/treetask.html.php
+++ b/module/project/view/treetask.html.php
@@ -24,7 +24,7 @@
if($task->status == 'wait') common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'btn btn-info btn-icon iframe', true);
if($task->status == 'wait') common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', '', '', 'btn btn-info btn-icon iframe', true);
if($task->status == 'pause') common::printIcon('task', 'restart', "taskID=$task->id", $task, 'list', '', '', 'btn btn-info btn-icon iframe', true);
- if($task->status == 'done' or $task->status == 'cancel' or $task->status == 'closed') common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', 'close', '', 'btn btn-info btn-icon iframe', true);
+ if($task->status == 'done' or $task->status == 'cancel' or $task->status == 'closed') common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', 'off', '', 'btn btn-info btn-icon iframe', true);
if($task->status == 'doing') common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'btn btn-info btn-icon iframe', true);
common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task, 'list', 'time', '', 'btn btn-info btn-icon iframe', true);
diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php
index e9c66cec98..33bc0ce5a9 100644
--- a/module/project/view/view.html.php
+++ b/module/project/view/view.html.php
@@ -157,7 +157,7 @@
common::printIcon('project', 'activate', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);
common::printIcon('project', 'putoff', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);
common::printIcon('project', 'suspend', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);
- common::printIcon('project', 'close', "projectID=$project->id", $project, 'button', 'close', '', 'iframe', true);
+ common::printIcon('project', 'close', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);
echo "";
common::printIcon('project', 'edit', $params, $project);
diff --git a/module/report/model.php b/module/report/model.php
index 0e249dd78d..d6750e1fb1 100644
--- a/module/report/model.php
+++ b/module/report/model.php
@@ -432,7 +432,7 @@ class reportModel extends model
->where('t1.assignedTo')->ne('')
->andWhere('t1.deleted')->eq(0)
->andWhere('t2.deleted')->eq(0)
- ->andWhere('t1.status')->in('wait, doing')
+ ->andWhere('t1.status')->in('wait,doing')
->andWhere('t3.status')->ne('suspended')
->andWhere('t1.deadline', true)->eq('0000-00-00')
->orWhere('t1.deadline')->lt(date(DT_DATE1, strtotime('+4 day')))
diff --git a/module/story/model.php b/module/story/model.php
index 0d4a51d22c..a19f39095a 100644
--- a/module/story/model.php
+++ b/module/story/model.php
@@ -1771,7 +1771,7 @@ class storyModel extends model
$stories = $this->dao->select('t1.*, t2.name as productTitle')->from(TABLE_STORY)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product = t2.id')
->where('t1.deleted')->eq(0)
- ->beginIF($type != 'closedBy')->andWhere('t1.status')->ne('closed')->fi()
+ ->beginIF($type != 'closedBy' and $this->app->moduleName == 'block')->andWhere('t1.status')->ne('closed')->fi()
->beginIF($type != 'all')
->beginIF($type == 'assignedTo')->andWhere('assignedTo')->eq($account)->fi()
->beginIF($type == 'openedBy')->andWhere('openedBy')->eq($account)->fi()
@@ -2459,7 +2459,7 @@ class storyModel extends model
$vars = "story={$story->id}";
common::printIcon('story', 'change', $vars, $story, 'list', 'fork');
common::printIcon('story', 'review', $vars, $story, 'list', 'glasses');
- common::printIcon('story', 'close', $vars, $story, 'list', 'close', '', 'iframe', true);
+ common::printIcon('story', 'close', $vars, $story, 'list', '', '', 'iframe', true);
common::printIcon('story', 'edit', $vars, $story, 'list');
if($this->config->global->flow != 'onlyStory') common::printIcon('story', 'createCase', "productID=$story->product&branch=$story->branch&module=0&from=¶m=0&$vars", $story, 'list', 'sitemap');
break;
diff --git a/module/story/view/view.html.php b/module/story/view/view.html.php
index e79c66666c..8208aaaac6 100644
--- a/module/story/view/view.html.php
+++ b/module/story/view/view.html.php
@@ -78,7 +78,7 @@
if(common::hasPriv('story', 'batchCreate')) echo html::a($link, " " . $lang->story->subdivide, '', $misc);
}
- common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', 'close', '', 'iframe showinonlybody', true);
+ common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true);
common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true);
if($config->global->flow != 'onlyStory' and !isonlybody() and (common::hasPriv('testcase', 'create') or common::hasPriv('testcase', 'batchCreate')))
@@ -228,10 +228,11 @@
+ getClientLang() == 'en' ? 'w-90px' : 'w-70px';?>
- | story->openedBy;?> |
+ story->openedBy;?> |
openedBy] . $lang->at . $story->openedDate;?> |
@@ -293,7 +294,7 @@
{
if(!isset($projects[$task->project])) continue;
$projectName = $projects[$task->project];
- echo "" . html::a($this->createLink('task', 'view', "taskID=$task->id", '', true), "#$task->id $task->name", '', "class='iframe' data-width='80%'");
+ echo "" . html::a($this->createLink('task', 'view', "taskID=$task->id", '', true), "[T]$task->id $task->name", '', "class='iframe' data-width='80%'");
echo html::a($this->createLink('project', 'browse', "projectID=$task->project"), $projectName, '', "class='text-muted'") . '';
}
}
@@ -309,12 +310,13 @@
+ getClientLang() == 'en' ? 'w-120px' : 'w-70px';?>
global->flow != 'onlyStory'):?>
- | story->legendFromBug;?> |
+ story->legendFromBug;?> |
id $fromBug->title'>" . html::a($this->createLink('bug', 'view', "bugID=$fromBug->id", '', true), "#$fromBug->id $fromBug->title", '', "class='iframe' data-width='80%'") . '';?>
@@ -323,13 +325,13 @@
|
- | story->legendBugs;?> |
+ story->legendBugs;?> |
id $bug->title'>" . html::a($this->createLink('bug', 'view', "bugID=$bug->id", '', true), "#$bug->id $bug->title", '', "class='iframe' data-width='80%'") . '';
+ echo "- " . html::a($this->createLink('bug', 'view', "bugID=$bug->id", '', true), "[B]$bug->id $bug->title", '', "class='iframe' data-width='80%'") . '
';
}
?>
@@ -342,7 +344,7 @@
id $case->title'>" . html::a($this->createLink('testcase', 'view', "caseID=$case->id", '', true), "#$case->id $case->title", '', "class='iframe' data-width='80%'") . '';
+ echo "" . html::a($this->createLink('testcase', 'view', "caseID=$case->id", '', true), "[C]$case->id $case->title", '', "class='iframe' data-width='80%'") . '';
}
?>
@@ -350,14 +352,14 @@
|
- | story->legendLinkStories;?> |
+ story->legendLinkStories;?> |
linkStories) ;
foreach($linkStories as $linkStoryID)
{
- if(isset($story->extraStories[$linkStoryID])) echo '- ' . html::a($this->createLink('story', 'view', "storyID=$linkStoryID", '', true), "#$linkStoryID " . $story->extraStories[$linkStoryID], '', "class='iframe' data-width='80%'") . '
';
+ if(isset($story->extraStories[$linkStoryID])) echo '- ' . html::a($this->createLink('story', 'view', "storyID=$linkStoryID", '', true), "[S]$linkStoryID " . $story->extraStories[$linkStoryID], '', "class='iframe' data-width='80%'") . '
';
}
?>
diff --git a/module/task/js/batchcreate.js b/module/task/js/batchcreate.js
index f27af226eb..89f43745aa 100755
--- a/module/task/js/batchcreate.js
+++ b/module/task/js/batchcreate.js
@@ -65,7 +65,7 @@ function copyStoryTitle(num)
$('#name\\[' + num + '\\]').val(storyTitle);
$('#estimate\\[' + num + '\\]').val($('#storyEstimate' + num).val());
- $('#desc\\[' + num + '\\]').val(($('#storyDesc' + num).val()).replace(/<[^>]+>/g,'').replace(/(\n)+\n/g, "\n").replace(/^\n/g, ''));
+ $('#desc\\[' + num + '\\]').val(($('#storyDesc' + num).val()).replace(/<[^>]+>/g,'').replace(/(\n)+\n/g, "\n").replace(/^\n/g, '').replace(/\t/g, ''));
var storyPri = $('#storyPri' + num).val();
if(storyPri == 0) $('#pri' + num ).val('3');
diff --git a/module/task/lang/en.php b/module/task/lang/en.php
index eddfce12dc..66ad02f76b 100644
--- a/module/task/lang/en.php
+++ b/module/task/lang/en.php
@@ -82,7 +82,7 @@ $lang->task->openedBy = 'Created by';
$lang->task->openedDate = 'Created';
$lang->task->openedDateAB = 'Add';
$lang->task->finishedBy = 'Finished by';
-$lang->task->finishedByAB = 'Finished';
+$lang->task->finishedByAB = 'Finisher';
$lang->task->finishedDate = 'Finished';
$lang->task->finishedDateAB = 'Finished';
$lang->task->finishedList = 'FinishedBy list';
diff --git a/module/task/model.php b/module/task/model.php
index 45f9029dba..f304be7b1c 100644
--- a/module/task/model.php
+++ b/module/task/model.php
@@ -1671,7 +1671,7 @@ class taskModel extends model
->leftjoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
->leftjoin(TABLE_STORY)->alias('t3')->on('t1.story = t3.id')
->where('t1.deleted')->eq(0)
- ->beginIF($type != 'closedBy')->andWhere('t1.status')->ne('closed')->fi()
+ ->beginIF($type != 'closedBy' and $this->app->moduleName == 'block')->andWhere('t1.status')->ne('closed')->fi()
->beginIF($type == 'finishedBy')
->andWhere('t1.finishedby', 1)->eq($account)
->orWhere('t1.finishedList')->like("%,{$account},%")
@@ -2619,7 +2619,7 @@ class taskModel extends model
if($task->status != 'pause') common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
if($task->status == 'pause') common::printIcon('task', 'restart', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', 'close', '', 'iframe', true);
+ common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task, 'list', 'time', '', 'iframe', true);
diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php
index d257efcc16..dde92eebb0 100644
--- a/module/task/view/view.html.php
+++ b/module/task/view/view.html.php
@@ -131,7 +131,7 @@
common::printIcon('task', 'activate', "taskID=$child->id", $child, 'list', '', '', 'iframe', true);
common::printIcon('task', 'recordEstimate', "taskID=$child->id", $child, 'list', 'time', '', 'iframe', true);
common::printIcon('task', 'finish', "taskID=$child->id", $child, 'list', '', '', 'iframe', true);
- common::printIcon('task', 'close', "taskID=$child->id", $child, 'list', 'close', '', 'iframe', true);
+ common::printIcon('task', 'close', "taskID=$child->id", $child, 'list', '', '', 'iframe', true);
common::printIcon('task', 'edit', "taskID=$child->id", $child, 'list');
?>
|
@@ -159,7 +159,7 @@
common::printIcon('task', 'pause', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
common::printIcon('task', 'finish', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody text-success', true);
common::printIcon('task', 'activate', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody text-success', true);
- common::printIcon('task', 'close', "taskID=$task->id", $task, 'button', 'close', '', 'iframe showinonlybody', true);
+ common::printIcon('task', 'close', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
common::printIcon('task', 'cancel', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
if(!isonlybody()) echo "";
@@ -282,9 +282,10 @@
+ getClientLang() == 'en' ? 'w-100px' : 'w-70px';?>
- | task->openedBy;?> |
+ task->openedBy;?> |
openedBy ? zget($users, $task->openedBy, $task->openedBy) . $lang->at . $task->openedDate : $lang->noData;?> |
@@ -337,8 +338,9 @@
task->legendEffort;?>
+ getClientLang() == 'en' ? 'w-90px' : 'w-70px';?>
- | task->estStarted;?> |
+ task->estStarted;?> |
estStarted;?> |
diff --git a/module/testcase/config.php b/module/testcase/config.php
index a9dc8964dd..717c7a440f 100644
--- a/module/testcase/config.php
+++ b/module/testcase/config.php
@@ -158,7 +158,7 @@ $config->testcase->datatable->fieldList['lastRunResult']['required'] = 'no';
$config->testcase->datatable->fieldList['status']['title'] = 'statusAB';
$config->testcase->datatable->fieldList['status']['fixed'] = 'no';
-$config->testcase->datatable->fieldList['status']['width'] = '80';
+$config->testcase->datatable->fieldList['status']['width'] = '100';
$config->testcase->datatable->fieldList['status']['required'] = 'no';
$config->testcase->datatable->fieldList['lastEditedBy']['title'] = 'lastEditedBy';
diff --git a/module/testcase/control.php b/module/testcase/control.php
index b1017e7134..fe3b6e63fd 100644
--- a/module/testcase/control.php
+++ b/module/testcase/control.php
@@ -593,10 +593,9 @@ class testcase extends control
$title = "CASE #$case->id $case->title - " . $libraries[$case->lib];
$position[] = html::a($this->createLink('testsuite', 'library', "libID=$case->lib"), $libraries[$case->lib]);
- $this->view->libID = $case->lib;
- $this->view->libName = $libraries[$case->lib];
- $this->view->libraries = $libraries;
- $this->view->linkedCaseID = $this->testcase->getLinkedCaseID($case->lib, $caseID);
+ $this->view->libID = $case->lib;
+ $this->view->libName = $libraries[$case->lib];
+ $this->view->libraries = $libraries;
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($case->lib, $viewType = 'caselib', $startModuleID = 0);
}
else
@@ -980,6 +979,29 @@ class testcase extends control
die(js::locate(inLink('view', "caseID=$caseID"), 'parent'));
}
+ /**
+ * Confirm libcase changed.
+ *
+ * @param int $caseID
+ * @param int $libcaseID
+ * @param int $version
+ * @access public
+ * @return void
+ */
+ public function confirmLibcaseChange($caseID, $libcaseID, $version)
+ {
+ $case = $this->testcase->getById($caseID);
+ $this->dao->update(TABLE_CASE)->set('version')->eq($version)->where('id')->eq($caseID)->exec();
+ $steps = $this->dao->select('*')->from(TABLE_CASESTEP)->where('`case`')->eq($libcaseID)->andWhere('version')->eq($version)->fetchAll();
+ foreach($steps as $step)
+ {
+ unset($step->id);
+ $step->case = $caseID;
+ $this->dao->insert(TABLE_CASESTEP)->data($step)->exec();
+ }
+ die(js::reload('parent'));
+ }
+
/**
* Confirm story changes.
*
diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php
index d3d069d399..6eec3173f3 100644
--- a/module/testcase/lang/en.php
+++ b/module/testcase/lang/en.php
@@ -64,6 +64,9 @@ $lang->testcase->stepNumberAB = 'S';
$lang->testcase->createBug = 'Convert to Bug';
$lang->testcase->fromModule = 'Source Module';
$lang->testcase->fromCase = 'Source Case';
+$lang->testcase->sync = 'Sync Case';
+$lang->testcase->fromTesttask = 'From Testtask';
+$lang->testcase->fromCaselib = 'From Caselib';
$lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case.
$lang->testcase->stepID = 'ID';
@@ -82,6 +85,7 @@ $lang->testcase->batchReview = "Batch Review";
$lang->testcase->edit = "Edit";
$lang->testcase->batchEdit = "Batch Edit ";
$lang->testcase->batchChangeModule = "Batch Change Module";
+$lang->testcase->confirmLibcaseChange = "Confirm Library Case Change";
$lang->testcase->batchChangeBranch = "Batch Change Branch";
$lang->testcase->groupByStories = 'Group by Story';
$lang->testcase->delete = "Delete";
@@ -139,7 +143,6 @@ $lang->testcase->confirmDelete = 'Do you want to delete this Test Case?';
$lang->testcase->confirmBatchDelete = 'Do you want to batch delete these Test Cases?';
$lang->testcase->ditto = 'Ditto';
$lang->testcase->dittoNotice = 'This Case does not belong to the Product as the previous one!';
-$lang->testcase->haveLinkCase = 'It has linked case, update this one, the linked case will change.';
$lang->testcase->reviewList[0] = 'NO';
$lang->testcase->reviewList[1] = 'YES';
diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php
index faef133b49..d9c8f59d4b 100644
--- a/module/testcase/lang/zh-cn.php
+++ b/module/testcase/lang/zh-cn.php
@@ -54,7 +54,7 @@ $lang->testcase->expect = '预期';
$lang->testcase->allProduct = "所有{$lang->productCommon}";
$lang->testcase->fromBug = '来源Bug';
$lang->testcase->toBug = '生成Bug';
-$lang->testcase->changed = '用例变更';
+$lang->testcase->changed = '原用例更新';
$lang->testcase->bugs = '产生Bug数';
$lang->testcase->bugsAB = 'B';
$lang->testcase->results = '执行结果数';
@@ -64,6 +64,9 @@ $lang->testcase->stepNumberAB = 'S';
$lang->testcase->createBug = '转Bug';
$lang->testcase->fromModule = '来源模块';
$lang->testcase->fromCase = '来源用例';
+$lang->testcase->sync = '同步';
+$lang->testcase->fromTesttask = '测试单用例';
+$lang->testcase->fromCaselib = '用例库用例';
$lang->case = $lang->testcase; // 用于DAO检查时使用。因为case是系统关键字,所以无法定义该模块为case,只能使用testcase,但表还是使用的case。
$lang->testcase->stepID = '编号';
@@ -82,6 +85,7 @@ $lang->testcase->batchReview = "批量评审";
$lang->testcase->edit = "编辑";
$lang->testcase->batchEdit = "批量编辑 ";
$lang->testcase->batchChangeModule = "批量修改模块";
+$lang->testcase->confirmLibcaseChange = "同步用例库用例修改";
$lang->testcase->batchChangeBranch = "批量修改分支";
$lang->testcase->groupByStories = '需求分组';
$lang->testcase->delete = "删除";
@@ -139,7 +143,6 @@ $lang->testcase->confirmDelete = '您确认要删除该测试用例吗?';
$lang->testcase->confirmBatchDelete = '您确认要批量删除这些测试用例吗?';
$lang->testcase->ditto = '同上';
$lang->testcase->dittoNotice = '该用例与上一用例不属于同一产品!';
-$lang->testcase->haveLinkCase = '此用例存在相关用例,更新后,其相关用例会一并更新。';
$lang->testcase->reviewList[0] = '否';
$lang->testcase->reviewList[1] = '是';
diff --git a/module/testcase/lang/zh-tw.php b/module/testcase/lang/zh-tw.php
index c96cfc4a3d..f4a5ef0b25 100644
--- a/module/testcase/lang/zh-tw.php
+++ b/module/testcase/lang/zh-tw.php
@@ -54,7 +54,7 @@ $lang->testcase->expect = '預期';
$lang->testcase->allProduct = "所有{$lang->productCommon}";
$lang->testcase->fromBug = '來源Bug';
$lang->testcase->toBug = '生成Bug';
-$lang->testcase->changed = '用例變更';
+$lang->testcase->changed = '原用例更新';
$lang->testcase->bugs = '產生Bug數';
$lang->testcase->bugsAB = 'B';
$lang->testcase->results = '執行結果數';
@@ -64,6 +64,9 @@ $lang->testcase->stepNumberAB = 'S';
$lang->testcase->createBug = '轉Bug';
$lang->testcase->fromModule = '來源模組';
$lang->testcase->fromCase = '來源用例';
+$lang->testcase->sync = '同步';
+$lang->testcase->fromTesttask = '測試單用例';
+$lang->testcase->fromCaselib = '用例庫用例';
$lang->case = $lang->testcase; // 用於DAO檢查時使用。因為case是系統關鍵字,所以無法定義該模組為case,只能使用testcase,但表還是使用的case。
$lang->testcase->stepID = '編號';
@@ -82,6 +85,7 @@ $lang->testcase->batchReview = "批量評審";
$lang->testcase->edit = "編輯";
$lang->testcase->batchEdit = "批量編輯 ";
$lang->testcase->batchChangeModule = "批量修改模組";
+$lang->testcase->confirmLibcaseChange = "同步用例庫用例修改";
$lang->testcase->batchChangeBranch = "批量修改分支";
$lang->testcase->groupByStories = '需求分組';
$lang->testcase->delete = "刪除";
diff --git a/module/testcase/model.php b/module/testcase/model.php
index 6fb57ab2c6..561e024114 100644
--- a/module/testcase/model.php
+++ b/module/testcase/model.php
@@ -395,7 +395,8 @@ class testcaseModel extends model
$case->storyStatus = $story->status;
$case->latestStoryVersion = $story->version;
}
- if($case->fromBug) $case->fromBugTitle = $this->dao->findById($case->fromBug)->from(TABLE_BUG)->fields('title')->fetch('title');
+ if($case->fromBug) $case->fromBugTitle = $this->dao->findById($case->fromBug)->from(TABLE_BUG)->fields('title')->fetch('title');
+ if($case->fromCaseID) $case->libCaseVersion = $this->dao->findById($case->fromCaseID)->from(TABLE_CASE)->fetch('version');
$case->toBugs = array();
$toBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('`case`')->eq($caseID)->fetchAll();
@@ -604,24 +605,6 @@ class testcaseModel extends model
return $caseCounts;
}
- /**
- * Check have linked cases or not.
- *
- * @param int $libID
- * @param int $caseID$
- * @access public
- * @return int
- */
- public function getLinkedCaseID($libID, $caseID)
- {
- $linkedCaseID = $this->dao->select('id')->from(TABLE_CASE)
- ->where('lib')->eq($libID)
- ->andWhere('fromCaseID')->eq($caseID)
- ->andWhere('deleted')->eq(0)
- ->fetch('id');
- return $linkedCaseID;
- }
-
/**
* Update a case.
*
@@ -631,10 +614,7 @@ class testcaseModel extends model
*/
public function update($caseID)
{
- $oldCase = $this->getById($caseID);
- $isLibCase = ($oldCase->lib and empty($oldCase->product));
- $linkedCases = '';
- if($isLibCase) $linkedCases = $this->dao->select('id')->from(TABLE_CASE)->where('fromCaseID')->eq($caseID)->fetchPairs();
+ $oldCase = $this->getById($caseID);
if(!empty($_POST['lastEditedDate']) and $oldCase->lastEditedDate != $this->post->lastEditedDate)
{
dao::$errors[] = $this->lang->error->editedByOther;
@@ -687,10 +667,6 @@ class testcaseModel extends model
->get();
if(!$this->forceNotReview() and $stepChanged) $case->status = 'wait';
$this->dao->update(TABLE_CASE)->data($case)->autoCheck()->batchCheck($this->config->testcase->edit->requiredFields, 'notempty')->where('id')->eq((int)$caseID)->exec();
- if($isLibCase and $linkedCases)
- {
- foreach($linkedCases as $linkedCaseID) $this->dao->update(TABLE_CASE)->data($case)->autoCheck()->batchCheck($this->config->testcase->edit->requiredFields, 'notempty')->where('id')->eq((int)$linkedCaseID)->exec();
- }
if(!$this->dao->isError())
{
if($stepChanged)
@@ -710,15 +686,6 @@ class testcaseModel extends model
$this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec();
if($step->type == 'group') $parentStepID = $this->dao->lastInsertID();
if($step->type == 'step') $parentStepID = 0;
-
- if($isLibCase and $linkedCases)
- {
- foreach($linkedCases as $linkedCaseID)
- {
- $step->case = $linkedCaseID;
- $this->dao->insert(TABLE_CASESTEP)->data($step)->autoCheck()->exec();
- }
- }
}
}
@@ -1372,6 +1339,7 @@ class testcaseModel extends model
$caseLink = helper::createLink('testcase', 'view', "caseID=$case->id&version=$case->version");
$account = $this->app->user->account;
$fromCaseID = $case->fromCaseID;
+ if($fromCaseID) $libCaseVersion = $this->dao->findById($fromCaseID)->from(TABLE_CASE)->fetch('version');
$id = $col->id;
if($col->show)
{
@@ -1420,7 +1388,18 @@ class testcaseModel extends model
echo "$stages";
break;
case 'status':
- $case->needconfirm ? print("{$this->lang->story->changed}") : print("{$this->lang->testcase->statusList[$case->status]}");
+ if($case->needconfirm)
+ {
+ print("lang->testcase->fromTesttask}>{$this->lang->story->changed}");
+ }
+ elseif(isset($libCaseVersion) and $libCaseVersion > $case->version and !$case->needconfirm)
+ {
+ print("lang->testcase->fromCaselib}>{$this->lang->testcase->changed}");
+ }
+ else
+ {
+ print("{$this->lang->testcase->statusList[$case->status]}");
+ }
break;
case 'story':
static $stories = array();
diff --git a/module/testcase/view/edit.html.php b/module/testcase/view/edit.html.php
index 3ad89a1bfc..9ee9fb39fa 100644
--- a/module/testcase/view/edit.html.php
+++ b/module/testcase/view/edit.html.php
@@ -125,7 +125,6 @@
lastEditedDate);?>
createLink('testcase', 'browse', "productID=$productID");?>"' />
- ' . $lang->testcase->haveLinkCase . ''; ?>
diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php
index 14d5d70274..539ac2d16e 100644
--- a/module/testcase/view/view.html.php
+++ b/module/testcase/view/view.html.php
@@ -128,15 +128,16 @@
testcase->legendBasicInfo;?>
+ getClientLang() == 'en' ? 'w-90px' : 'w-60px';?>
- | testcase->lib;?> |
+ testcase->lib;?> |
lib", $libName)) echo $libName;?> |
- | testcase->product;?> |
+ testcase->product;?> |
product", $productName)) echo $productName;?> |
session->currentProductType != 'normal'):?>
@@ -218,8 +219,14 @@
echo $lang->testcase->statusList[$case->status];
if($case->version > $case->currentVersion and $from == 'testtask')
{
- echo "({$lang->testcase->changed} ";
- echo html::a($this->createLink('testcase', 'confirmchange', "caseID=$case->id"), $lang->confirm, 'hiddenwin', "class='btn btn-mini btn-info'");
+ echo "(testcase->fromTesttask}>{$lang->testcase->changed} ";
+ echo html::a($this->createLink('testcase', 'confirmchange', "caseID=$case->id"), $lang->testcase->sync, 'hiddenwin', "class='btn btn-mini btn-info'");
+ echo ")";
+ }
+ if(isset($case->libCaseVersion) and $case->libCaseVersion > $case->version and $from != 'testtask')
+ {
+ echo "(testcase->fromCaselib}>{$lang->testcase->changed} ";
+ echo html::a($this->createLink('testcase', 'confirmLibcaseChange', "caseID=$case->id&libcaseID=$case->fromCaseID&version=$case->libCaseVersion"), $lang->testcase->sync, 'hiddenwin', "class='btn btn-mini btn-info'");
echo ")";
}
?>
@@ -264,16 +271,17 @@
testcase->legendLinkBugs;?>
+ getClientLang() == 'en' ? 'w-90px' : 'w-60px';?>
fromBug):?>
- | testcase->fromBug;?> |
+ testcase->fromBug;?> |
createLink('bug', 'view', "bugID=$case->fromBug", '', true), $case->fromBugTitle, '', "class='iframe' data-width='80%'");?> |
toBugs):?>
- | testcase->toBug;?> |
+ testcase->toBug;?> |
toBugs as $bugID => $bugTitle)
@@ -293,9 +301,10 @@
testcase->legendOpenAndEdit;?>
+ getClientLang() == 'en' ? 'w-90px' : 'w-60px';?>
- | testcase->openedBy;?> |
+ testcase->openedBy;?> |
openedBy] . $lang->at . $case->openedDate;?> |
testcase->needReview or !empty($config->testcase->forceReview)):?>
diff --git a/module/testreport/view/view.html.php b/module/testreport/view/view.html.php
index 664d26938c..9b699334fe 100644
--- a/module/testreport/view/view.html.php
+++ b/module/testreport/view/view.html.php
@@ -16,7 +16,7 @@
session->reportList != false ? $app->session->reportList : $browseLink;?>
- " . $lang->goback, '', "class='btn btn-link'");?>
+ " . $lang->goback, '', "class='btn btn-primary'");?>
id;?>
diff --git a/module/testsuite/js/createcase.js b/module/testsuite/js/createcase.js
index c059132304..af418f5064 100644
--- a/module/testsuite/js/createcase.js
+++ b/module/testsuite/js/createcase.js
@@ -162,4 +162,12 @@ $(function()
{
$('[data-toggle=tooltip]').tooltip();
initSteps();
+
+ $('#pri').on('change', function()
+ {
+ var $select = $(this);
+ var $selector = $select.closest('.pri-selector');
+ var value = $select.val();
+ $selector.find('.pri-text').html(' ' + value + '');
+ });
})
diff --git a/module/testsuite/view/libview.html.php b/module/testsuite/view/libview.html.php
index a32084d240..0c6abe0387 100644
--- a/module/testsuite/view/libview.html.php
+++ b/module/testsuite/view/libview.html.php
@@ -43,7 +43,7 @@
{
echo " ";
common::printIcon('testsuite', 'edit', "libID=$lib->id");
- common::printIcon('testsuite', 'delete', "libID=$lib->id", '', 'button', '', 'hiddenwin');
+ common::printIcon('testsuite', 'delete', "libID=$lib->id", '', 'button', 'trash', 'hiddenwin');
}
?>
diff --git a/module/testtask/view/view.html.php b/module/testtask/view/view.html.php
index ca67a29fe1..10f075564e 100644
--- a/module/testtask/view/view.html.php
+++ b/module/testtask/view/view.html.php
@@ -49,7 +49,7 @@
id", $task, 'button', '', '', 'iframe showinonlybody', true);
- common::printIcon('testtask', 'close', "taskID=$task->id", $task, 'button', 'close', '', 'iframe showinonlybody', true);
+ common::printIcon('testtask', 'close', "taskID=$task->id", $task, 'button', '', '', 'iframe showinonlybody', true);
common::printIcon('testtask', 'block', "taskID=$task->id", $task, 'button', 'pause', '', 'iframe showinonlybody', true);
common::printIcon('testtask', 'activate', "taskID=$task->id", $task, 'button', 'magic', '', 'iframe showinonlybody', true);
common::printIcon('testtask', 'cases', "taskID=$task->id", $task, 'button', 'sitemap');
diff --git a/module/tree/view/browse.html.php b/module/tree/view/browse.html.php
index 9dbb9a4c3d..732947a31b 100644
--- a/module/tree/view/browse.html.php
+++ b/module/tree/view/browse.html.php
@@ -204,7 +204,7 @@ $(function()
{
linkTemplate: '',
title: 'tree->delete ?>',
- template: ' '
+ template: ' '
},
subModules:
{
diff --git a/module/tree/view/browsetask.html.php b/module/tree/view/browsetask.html.php
index 6e6c8955eb..255ef6cecb 100644
--- a/module/tree/view/browsetask.html.php
+++ b/module/tree/view/browsetask.html.php
@@ -162,7 +162,7 @@ $(function()
{
linkTemplate: '',
title: 'tree->delete ?>',
- template: ' '
+ template: ' '
},
subModules:
{
diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php
index 5127612226..8bda24535c 100644
--- a/module/upgrade/lang/version.php
+++ b/module/upgrade/lang/version.php
@@ -102,3 +102,4 @@ $lang->upgrade->fromVersions['10_5_1'] = '10.5.1';
$lang->upgrade->fromVersions['10_6'] = '10.6';
$lang->upgrade->fromVersions['11_0'] = '11.0';
$lang->upgrade->fromVersions['11_1'] = '11.1';
+$lang->upgrade->fromVersions['11_2'] = '11.2';
diff --git a/module/upgrade/model.php b/module/upgrade/model.php
index 4ee452cee2..8a580cba04 100644
--- a/module/upgrade/model.php
+++ b/module/upgrade/model.php
@@ -363,6 +363,10 @@ class upgradeModel extends model
$this->dao->update(TABLE_CONFIG)->set('value')->eq('off')->where('`key`')->eq('isHttps')->andWhere('`section`')->eq('xuanxuan')->andWhere('`value`')->eq('0')->exec();
$this->dao->update(TABLE_CONFIG)->set('value')->eq('on')->where('`key`')->eq('isHttps')->andWhere('`section`')->eq('xuanxuan')->andWhere('`value`')->eq('1')->exec();
}
+ case '11_2':
+ $this->saveLogs('Execute 11_2');
+ $this->execSQL($this->getUpgradeFile('11.2'));
+ $this->processDocLibAcl();
}
$this->deletePatch();
@@ -486,11 +490,13 @@ class upgradeModel extends model
$confirmContent .= file_get_contents($this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan2.2.0.sql');
case '11_0':
case '11_1':
+ $confirmContent .= file_get_contents($this->getUpgradeFile('11.1'));
if(!isset($this->config->isINT) or !($this->config->isINT))
{
$xuanxuanSql = $this->app->getAppRoot() . 'db' . DS . 'upgradexuanxuan2.3.0.sql';
$confirmContent .= file_get_contents($xuanxuanSql);
}
+ case '11_2': $confirmContent .= file_get_contents($this->getUpgradeFile('11.2'));
}
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
}
@@ -2966,6 +2972,19 @@ class upgradeModel extends model
return true;
}
+ /**
+ * Process doc lib acl.
+ *
+ * @access public
+ * @return void
+ */
+ public function processDocLibAcl()
+ {
+ $this->dao->update(TABLE_DOCLIB)->set('acl')->eq('default')->where('type')->in('product,project')->andWhere('acl')->in('open,private')->exec();
+ $this->saveLogs($this->dao->get());
+ return !dao::isError();
+ }
+
/**
* Save Logs.
*
diff --git a/module/user/lang/en.php b/module/user/lang/en.php
index c446ee8a74..688e20eaee 100644
--- a/module/user/lang/en.php
+++ b/module/user/lang/en.php
@@ -30,12 +30,12 @@ $lang->user->verify = 'Verification';
$lang->user->contactInfo = 'Contact';
$lang->user->skype = 'Skype';
$lang->user->qq = 'QQ';
-$lang->user->wechat = 'Wechat';
-$lang->user->dingding = 'Dingding';
-$lang->user->slack = 'Slack';
-$lang->user->whatsapp = 'WhatsApp';
$lang->user->mobile = 'Mobile';
$lang->user->phone = 'Phone';
+$lang->user->weixin = 'Wechat';
+$lang->user->dingding = 'Ding Ding';
+$lang->user->slack = 'Slack';
+$lang->user->whatsapp = 'WhatsApp';
$lang->user->address = 'Address';
$lang->user->zipcode = 'Zip Code';
$lang->user->join = 'Join Date';
@@ -152,6 +152,15 @@ $lang->user->error->reserved = "ID %s,account is reserved.";
$lang->user->error->verifyPassword = "Verification failed. Please enter your Login Password.";
$lang->user->error->originalPassword = "Old password is incorrect.";
+$lang->user->contactFieldList['skype'] = $lang->user->skype;
+$lang->user->contactFieldList['qq'] = $lang->user->qq;
+$lang->user->contactFieldList['dingding'] = $lang->user->dingding;
+$lang->user->contactFieldList['weixin'] = $lang->user->weixin;
+$lang->user->contactFieldList['mobile'] = $lang->user->mobile;
+$lang->user->contactFieldList['slack'] = $lang->user->slack;
+$lang->user->contactFieldList['whatsapp'] = $lang->user->whatsapp;
+$lang->user->contactFieldList['phone'] = $lang->user->phone;
+
$lang->user->contacts = new stdclass();
$lang->user->contacts->common = 'Contact';
$lang->user->contacts->listName = 'List Name';
diff --git a/module/user/lang/zh-tw.php b/module/user/lang/zh-tw.php
index de56f1cfc9..45cc704fc6 100644
--- a/module/user/lang/zh-tw.php
+++ b/module/user/lang/zh-tw.php
@@ -32,6 +32,10 @@ $lang->user->skype = 'Skype';
$lang->user->qq = 'QQ';
$lang->user->mobile = '手機';
$lang->user->phone = '電話';
+$lang->user->weixin = '微信';
+$lang->user->dingding = '釘釘';
+$lang->user->slack = 'Slack';
+$lang->user->whatsapp = 'WhatsApp';
$lang->user->address = '通訊地址';
$lang->user->zipcode = '郵編';
$lang->user->join = '入職日期';
@@ -148,6 +152,15 @@ $lang->user->error->reserved = "【ID %s】的用戶名已被系統預留";
$lang->user->error->verifyPassword = "驗證失敗,請檢查您的系統登錄密碼是否正確";
$lang->user->error->originalPassword = "原密碼不正確";
+$lang->user->contactFieldList['skype'] = $lang->user->skype;
+$lang->user->contactFieldList['qq'] = $lang->user->qq;
+$lang->user->contactFieldList['dingding'] = $lang->user->dingding;
+$lang->user->contactFieldList['weixin'] = $lang->user->weixin;
+$lang->user->contactFieldList['mobile'] = $lang->user->mobile;
+$lang->user->contactFieldList['slack'] = $lang->user->slack;
+$lang->user->contactFieldList['whatsapp'] = $lang->user->whatsapp;
+$lang->user->contactFieldList['phone'] = $lang->user->phone;
+
$lang->user->contacts = new stdclass();
$lang->user->contacts->common = '聯繫人';
$lang->user->contacts->listName = '列表名稱';
|