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';?> - + session->currentProductType != 'normal'):?> @@ -267,10 +268,11 @@
+ getClientLang() == 'en' ? 'w-100px' : 'w-90px';?>
bug->product;?>bug->product;?> product", $productName)) echo $productName;?>
- + 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->timezone?> -
-
-
bug->openedBy;?>bug->openedBy;?> openedBy) . $lang->at . $bug->openedDate;?>
- - - - - - - - -
custom->timezone;?>timezone, "class='form-control chosen'");?>
- +
+ +
custom->notice->cannotSetTimezone;?>
+ + app->getConfigRoot() . 'timezones.php';?> +
+ + + + + + + + +
custom->timezone;?>timezone, "class='form-control chosen'");?>
+
+ +
- 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 @@ - + - - - - + - - - - - - +
doc->libType?>
doc->product?>
doclib->name?>
doclib->control;?> - doc->aclList, 'open', "onchange='toggleAcl(this.value, \"lib\")'")?> - + doc->aclList, 'open', "onchange='toggleAcl(this.value, \"lib\")'")?> + doc->noticeAcl['lib']['product']['default'];?> +
doc->noticeAcl['lib']['product']['open'];?>
@@ -73,5 +67,21 @@ + 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'");?> + 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'; -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';?> - + @@ -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';?>
    story->openedBy;?>story->openedBy;?> openedBy] . $lang->at . $story->openedDate;?>
    global->flow != 'onlyStory'):?> - + - + - + @@ -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 @@
    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'); ?>
    + getClientLang() == 'en' ? 'w-100px' : 'w-70px';?> - + @@ -337,8 +338,9 @@ task->legendEffort;?>
    task->openedBy;?>task->openedBy;?> openedBy ? zget($users, $task->openedBy, $task->openedBy) . $lang->at . $task->openedDate : $lang->noData;?>
    + getClientLang() == 'en' ? 'w-90px' : 'w-70px';?> - + 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';?>
    task->estStarted;?>task->estStarted;?> estStarted;?>
    - + - + 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';?>
    testcase->lib;?>testcase->lib;?> lib", $libName)) echo $libName;?>
    testcase->product;?>testcase->product;?> product", $productName)) echo $productName;?>
    fromBug):?> - + toBugs):?> - +
    testcase->fromBug;?>testcase->fromBug;?> createLink('bug', 'view', "bugID=$case->fromBug", '', true), $case->fromBugTitle, '', "class='iframe' data-width='80%'");?>
    testcase->toBug;?>testcase->toBug;?> toBugs as $bugID => $bugTitle) @@ -293,9 +301,10 @@
    testcase->legendOpenAndEdit;?>
    + getClientLang() == 'en' ? 'w-90px' : 'w-60px';?> - + 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 @@
    testcase->openedBy;?>testcase->openedBy;?> openedBy] . $lang->at . $case->openedDate;?>