This commit is contained in:
Catouse
2019-03-29 10:40:26 +08:00
69 changed files with 1665 additions and 534 deletions
-1
View File
@@ -63,7 +63,6 @@ zentaoxx:
cp -r xuanxuan/config/* zentaoxx/config/
cp -r xuanxuan/module/* zentaoxx/module/
cp -r xuanxuan/www/* zentaoxx/www/
mv zentaoxx/www/xuanxuan.php zentaoxx/www/x.php
sed -i 's/site,//' zentaoxx/module/chat/model.php
sed -i 's/admin, g/g/' zentaoxx/module/chat/model.php
sed -i '/password = md5/d' zentaoxx/module/chat/control.php
+1 -1
View File
@@ -1 +1 @@
11.3.stable
11.4.stable
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '11.3'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '11.4'; // 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.
+905
View File
@@ -0,0 +1,905 @@
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,
`fromCaseVersion` mediumint(8) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`lastRunner` varchar(30) NOT NULL,
`lastRunDate` datetime NOT NULL,
`lastRunResult` char(30) NOT NULL,
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `story` (`story`),
KEY `module` (`module`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_casestep` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
`case` mediumint(8) unsigned NOT NULL DEFAULT '0',
`version` smallint(3) unsigned NOT NULL DEFAULT '0',
`type` varchar(10) NOT NULL DEFAULT 'step',
`desc` text NOT NULL,
`expect` text NOT NULL,
PRIMARY KEY (`id`),
KEY `case` (`case`),
KEY `version` (`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_company` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(120) DEFAULT NULL,
`phone` char(20) DEFAULT NULL,
`fax` char(20) DEFAULT NULL,
`address` char(120) DEFAULT NULL,
`zipcode` char(10) DEFAULT NULL,
`website` char(120) DEFAULT NULL,
`backyard` char(120) DEFAULT NULL,
`guest` enum('1','0') NOT NULL DEFAULT '0',
`admins` char(255) DEFAULT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_config` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`owner` char(30) NOT NULL DEFAULT '',
`module` varchar(30) NOT NULL,
`section` char(30) NOT NULL DEFAULT '',
`key` char(30) NOT NULL DEFAULT '',
`value` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`owner`,`module`,`section`,`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_cron` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`m` varchar(20) NOT NULL,
`h` varchar(20) NOT NULL,
`dom` varchar(20) NOT NULL,
`mon` varchar(20) NOT NULL,
`dow` varchar(20) NOT NULL,
`command` text NOT NULL,
`remark` varchar(255) NOT NULL,
`type` varchar(20) NOT NULL,
`buildin` tinyint(1) NOT NULL DEFAULT '0',
`status` varchar(20) NOT NULL,
`lastTime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `lastTime` (`lastTime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_dept` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(60) NOT NULL,
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
`path` char(255) NOT NULL DEFAULT '',
`grade` tinyint(3) unsigned NOT NULL DEFAULT '0',
`order` tinyint(3) unsigned NOT NULL DEFAULT '0',
`position` char(30) NOT NULL DEFAULT '',
`function` char(255) NOT NULL DEFAULT '',
`manager` char(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
KEY `path` (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_doc` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
`project` mediumint(8) unsigned NOT NULL,
`lib` varchar(30) NOT NULL,
`module` varchar(30) NOT NULL,
`title` varchar(255) NOT NULL,
`keywords` varchar(255) NOT NULL,
`type` varchar(30) NOT NULL,
`views` smallint(5) unsigned NOT NULL,
`collector` text NOT NULL,
`addedBy` varchar(30) NOT NULL,
`addedDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`acl` varchar(10) NOT NULL DEFAULT 'open',
`groups` varchar(255) NOT NULL,
`users` text NOT NULL,
`version` smallint(5) unsigned NOT NULL DEFAULT '1',
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `project` (`project`),
KEY `lib` (`lib`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_doccontent` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`doc` mediumint(8) unsigned NOT NULL,
`title` varchar(255) NOT NULL,
`digest` varchar(255) NOT NULL,
`content` text NOT NULL,
`files` text NOT NULL,
`type` varchar(10) NOT NULL,
`version` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `doc_version` (`doc`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_doclib` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(30) NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
`project` mediumint(8) unsigned NOT NULL,
`name` varchar(60) NOT NULL,
`acl` varchar(10) NOT NULL DEFAULT 'open',
`groups` varchar(255) NOT NULL,
`users` text NOT NULL,
`main` enum('0','1') NOT NULL DEFAULT '0',
`collector` text NOT NULL,
`order` tinyint(5) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `project` (`project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_effort` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`user` char(30) NOT NULL DEFAULT '',
`todo` enum('1','0') NOT NULL DEFAULT '1',
`date` date NOT NULL,
`begin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`type` enum('1','2','3') NOT NULL DEFAULT '1',
`idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0',
`name` char(30) NOT NULL DEFAULT '',
`desc` char(255) NOT NULL DEFAULT '',
`status` enum('1','2','3') NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `user` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `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;
+1
View File
@@ -0,0 +1 @@
ALTER TABLE `zt_case` ADD `fromCaseVersion` mediumint(8) unsigned NOT NULL AFTER `fromCaseID`;
+2
View File
@@ -0,0 +1,2 @@
ALTER TABLE `zt_burn` ADD `task` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `project`;
ALTER TABLE `zt_burn` ADD PRIMARY KEY `project_date_task` (`project`, `date`, `task`), DROP INDEX `PRIMARY`;
+2 -1
View File
@@ -125,11 +125,12 @@ CREATE TABLE IF NOT EXISTS `zt_build` (
-- DROP TABLE IF EXISTS `zt_burn`;
CREATE TABLE IF NOT EXISTS `zt_burn` (
`project` mediumint(8) unsigned NOT NULL,
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
`date` date NOT NULL,
`estimate` float NOT NULL,
`left` float NOT NULL,
`consumed` float NOT NULL,
PRIMARY KEY (`project`,`date`)
PRIMARY KEY (`project`,`date`,`task`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_case`;
CREATE TABLE IF NOT EXISTS `zt_case` (
+218 -160
View File
@@ -1,3 +1,61 @@
2019-03-25 11.4.stable
完成的需求:
2584 国际版本去掉用户列表的首字母功能
2600 在新手教程中,像真实系统一样,明确提示哪些项目是必填项。
2601 将由我关闭的需求,合并的我的需求中去。
2602 增加控件的宽度,以完整显示内容(几乎所有搜索区域都需要调整)
2603 删除自定义查询后,上方菜单中的也要删除这项。
2606 修改国际版中链接的指向,希望指向英文站的论坛
2608 QA/CASE中的数据表格的自定义列 的页面,国际版有多处内容被遮挡(自定义列页面有相似的问题)。
2609 调整文档首页的显示宽度
2610 将国际版中的专业版链接,重定向到专业版介绍页面
2612 用户注册页面,对于国际版,删除手册验证码
2613 永久关闭的区块页面,如果没有要显示的,希望显示"无永久关闭的区块",现在是空白
2614 在国际版中,调整指各中文网站的链接
2615 在国际版中,希望将英文协议显示在上方
2616 安装时,希望在成功删除install.php后,不要再提示删除
2617 产品概况中,如果是英文,程序拼接时需要加空格。
2618 看板切换为英文后,表头与主体错位
2619 燃尽图的帮助 ,目前 跳转到404了。
2862 项目关联产品有变化的时候记录日志到项目-概况的历史记录中
2902 测试报告英文需要修改
2903 禅道英文官网,用户登录会员中心界面字段未完全显示
2905 英文与禅道官网,用户中心翻译改动
2937 英文DEMO使用教程创建项目时关联产品排版问题
2938 国际版本后台自定义流程默认设置为Product/Sprint
2958 zentao,runner官网链接文中文站
3063 调整index页面的"版本试用"的构成方式,做到兼容中英文
3078 国际安装包的登录页的默认标题调整为"Zentao ALM"
3079 列宽的设置兼顾英文
3080 调整燃尽图的帮助文档的指向
3440 文档分类下只显示当前分类下的子分类和文档
3503 增加取消子任务父子关系的功能
3535 bug列表严重程度颜色区分不明显
3547 使用子任务管理测试类型的任务
3561 优化版本关联需求页面的关联需求按钮
3568 需求增加指派操作
3570 富文本编辑器里面的url地址加链接
3581 云禅道英文版中项目视图中的权限名称翻译的不准确
3582 看板增加需求分解的功能
3584 更改禅道软件中的中文和英文的用词
3587 从用例库导入的用例提示同步时,加个忽略按钮。
3588 任务详情中显示进度信息
3593 编辑文档页面右上角增加一个保存按钮
3595 调整文档按照卡片浏览时的布局
3596 调整文档按照列表浏览时表头的对齐方式
3599 将创建产品和项目的按钮提升到二级菜单中
3603 修改框架里fetch方法,可以fetch同模块扩展的方法
解决的bug:
1529 改变列表排序方式后,详情页里面的翻页顺序错乱
1838 项目任务、需求模块不一致
2435 自动计算的可用天数不正确
2443 打开首次登录修改密码后,使用客户端可以正常登录禅道
2457 测试单执行用例跳转问题
2458 zbox一键安装包ubuntu18安装异常
2459 最新zbox无法解析钉钉主机
2466 多人任务指派问题
2467 导出任务时子任务重复
2019-02-27 11.3.stable
完成的需求
3579 发信的时候增加环境变量避免dns解析超时
@@ -611,21 +669,21 @@
处理各个首页区块自定义区块的历史数据
后台工作方式切换后,检查各个模块导航是否正确,页面样式是否正确
检查新手教程
3989 我的地盘样式调整
4133 调整表格列表界面
4142 项目任务分组视图若干问题调整
4143 项目任务树状图若干问题调整
4146 批量创建用例页面调整
4147 批量创建任务页面调整
4148 任务列表页面调整
4162 弹窗有问题需要调整的页面
4164 搜索,保存搜索条件,显示在菜单栏会导致菜单换行的问题
4165 用例列表和用例详情界面,用例相关需求变更后,用例确认变更样式需要调整
4179 多人任务,团队成员显示不全
4182 列表页面,优先级、严重级别等自定义后加title
4192 重构侧边栏展开折叠插件
4193 所有创建页面,去掉大尺寸样式(图一),统一成小尺寸样式(图二)
4194 模块栏目展开收起的交互方式
3989 我的地盘样式调整
4133 调整表格列表界面
4142 项目任务分组视图若干问题调整
4143 项目任务树状图若干问题调整
4146 批量创建用例页面调整
4147 批量创建任务页面调整
4148 任务列表页面调整
4162 弹窗有问题需要调整的页面
4164 搜索,保存搜索条件,显示在菜单栏会导致菜单换行的问题
4165 用例列表和用例详情界面,用例相关需求变更后,用例确认变更样式需要调整
4179 多人任务,团队成员显示不全
4182 列表页面,优先级、严重级别等自定义后加title
4192 重构侧边栏展开折叠插件
4193 所有创建页面,去掉大尺寸样式(图一),统一成小尺寸样式(图二)
4194 模块栏目展开收起的交互方式
修复的bug:
组织-用户,所有的用户都显示 解除然之绑定 和解锁用户,按钮
自定义值较长时,字体颜色和背景色块没法区分
@@ -651,7 +709,7 @@
需求复制页面变形
1775 批量操作页面,多项录入不生效。
1773 列表页的自定义表单项,都不生效。
1768 导入csv的弹窗页面,需要优化一下,上下间距有点宽。 导入后,提示覆盖还是全新导入页面上方有一条白线
1768 导入csv的弹窗页面,需要优化一下,上下间距有点宽。 导入后,提示覆盖还是全新导入页面上方有一条白线
1762 无产品无项目时,提示 添加的 文案。 + 和后面添加产品、添加项目的间隔宽度统一一下。
1761 批量页面,可以自定义表单项的,需要考虑勾选所有字段时,页面的显示问题。现在把所有的字段都勾选后,表头字段有超出页面宽度
1759 搜索,保存已搜索结果。名称长的,没加title
@@ -678,7 +736,7 @@
1729 权限--视图维护,产品和项目不显示填写框。(无产品项目)
1727 部门折叠展开按钮的显示位置要调整。
1724 统计,测试,Bug创建表,选择产品和项目时,刷新选择框,显示的样式不对。
1722 项目起止时间选择框,宽度不一致。前面窄后面的宽。
1722 项目起止时间选择框,宽度不一致。前面窄后面的宽。
1721 产品附件库,显示切换条目数,没记录。下次再访问时,还原为默认的条目数。
1720 检查一下,最近更新列表,文档的大小不显示。
1719 文档详情页,添加备注弹窗页面,编辑器显示变形。
@@ -697,30 +755,30 @@
1699 创建和编辑Bug,类型和操作系统,有分隔开。
1698 创建Bug,重现步骤,编辑器里下方空白太多,步骤结果期望可以空一行。鼠标点击时,显示一个蓝色边框,需要优化一下
1693 Bug列表页没有Bug时,提示文案:暂时没有BUG,您现在可以提Bug。BUG都同统一显示为Bug
1692 套件切换,没有高亮
1692 套件切换,没有高亮
1691 列表页,分组查看,折叠时,没有统计数据
1690 列表页,分组查看,不高亮
1690 列表页,分组查看,不高亮
1689 导入csv,点击覆盖和全新插入,都没有导入成功
1688 列表ID显示为1、2,其他的显示为001、002。建议统一为001、002显示
1685 测试单,没关联用例时,模块下有个空白的区块,优化一下
1681 项目-bug,列表页,确认弹窗页面,指派给框宽度不够
1681 项目-bug,列表页,确认弹窗页面,指派给框宽度不够
1680 项目-Bug,导出数据,弹窗有2个页面,关闭时页面还有个关闭按钮图标。多次点击都关闭不了
1679 管理团队,最后一个填写框,下拉选择会被遮住一部分,选择不了用户。是否下拉向上显示
1675 项目需求看板,点击需求标题,需求详情弹窗页面。操作栏没有操作按钮图标,但是有个色块。如果这个页面不让操作,把操作栏隐藏
1674 导出数据,弹窗页面,自定义的模板多的话,不点击设置,选择模板下拉框会显示不完整,有的模板无法选择
1673 项目下需求,导出数据,选中数据,点击导出,页面不跳转不提示,无法导出
1675 项目需求看板,点击需求标题,需求详情弹窗页面。操作栏没有操作按钮图标,但是有个色块。如果这个页面不让操作,把操作栏隐藏
1674 导出数据,弹窗页面,自定义的模板多的话,不点击设置,选择模板下拉框会显示不完整,有的模板无法选择
1673 项目下需求,导出数据,选中数据,点击导出,页面不跳转不提示,无法导出
1672 导出数据,自定义设置多字段,由谁评审和抄送给显示的是逗号
1670 没关联需求时,所有模块下,显示空白的方框,是否优化一下显示
1668 编辑任务,标题必填项标识显示位置需要调整
1667 编辑任务,高亮的是任务列表和概况
1666 多人任务和子任务详情页,任务标题前的子/多的样式不突出,背景色比较相近
1664 版本,版本详情,描述显示时有换行,错行显示看着不大好
1666 多人任务和子任务详情页,任务标题前的子/多的样式不突出,背景色比较相近
1664 版本,版本详情,描述显示时有换行,错行显示看着不大好
1663 看板,导出数据,是否隐藏掉选择数据,因为没法选中
1661 看板,任务详情弹窗页,操作按钮的显示逻辑。一些没操作的,是否可以不显示。目前没操作的显示一个操作条
1661 看板,任务详情弹窗页,操作按钮的显示逻辑。一些没操作的,是否可以不显示。目前没操作的显示一个操作条
1658 树状图,只看需求、只看任务,高亮方式是否和一级二级菜单高亮一致。现在是加上蓝色边框
1657 树状图,点需求,右侧需求详情页,历史记录点添加备注,备注弹窗没有编辑器
1656 树状图,先删除需求,然后点取消,再点编辑,保存。会提示是否删除该需求
1655 分组视图,完成者和关闭者分组查看时,未完成和未关闭的不显示标签名称
1655 分组视图,完成者和关闭者分组查看时,未完成和未关闭的不显示标签名称
1654 任务列表页,关联需求已变更,需要确认变更。右侧操作只显示确认变更按钮,其他的不显示。需要确认一下
1653 批量创建任务,多项录入,保存后,一直在转圈,不成功
1650 编辑项目,关联计划字段没有,不能编辑和置空关联的计划。确认一下是否设计如此
@@ -732,7 +790,7 @@
1641 复制项目,提示没有可用的项目,颜色为黄色背景为粉色。 与系统其他的提示样式,保持一致
1640 列表页是否显示模块名,设置页面,保存按钮样式还是旧的
1639 维护多层级的模块时,模块名和箭头图标有换行,希望在一行显示
1638 动态折叠时,显示1条半信息,希望显示完整,显示1条或者2条
1638 动态折叠时,显示1条半信息,希望显示完整,显示1条或者2条
1637 用户没有任何动态信息时,显示的是一个空白的区块,希望优化显示当用户无产品动态的显示
1636 产品,动态,在某个标签下,切换用户,标签高亮丢失
1635 产品-路线图,计划描述显示占很多位置,路线图不在一条线上
@@ -759,8 +817,8 @@
1602 新增待办,默认的日期显示不完整
1601 版本列表区块,版本ID显示为1、2,统一为001、002
1600 Bug详情页,解决操作没有图标,严重程度图标数字太靠上
1599 右上角,用户名--切换语言。显示的是英文 language ,简体和繁体下应显示为中文
1597 永久关闭区块的提示文案,第二句开头少一个‘关’字,最后少个句号 [BUG#1597]
1599 右上角,用户名--切换语言。显示的是英文 language ,简体和繁体下应显示为中文
1597 永久关闭区块的提示文案,第二句开头少一个‘关’字,最后少个句号 [BUG#1597]
1595 我的地盘里,编辑页面的 保存和取消 按钮的间距宽度比较宽,是否整个系统里统一一下保存和取消(返回)的间距宽度
1592 我的待办区块,添加待办成功后,跳转到区块底部
1591 我的待办区块,点击待办名称,然后编辑,待办名称必填项与边框有重叠
@@ -768,7 +826,7 @@
1589 新安装,导入demo数据,有1个空的长区块。(项目统计)
1588 新安装,未导入demo数据,有2个空的长区块。(项目统计、产品统计)
1587 9.0升级到10.0,升级成功,登录禅道,admin登录,提示没有首页的权限,重新登录就正常了
1586 低版本升级到10.0,提示数据库错误zt_lang
1586 低版本升级到10.0,提示数据库错误zt_lang
1585 升级成功的页面,然之协同的logo显示不完整
1584 安装成功,登录,强制修改弱密码和修改成功后我的档案页面,需要优化。现在是全屏显示,视觉效果不好。
1583 登录页面,禅道的logo需要再调整一下
@@ -788,7 +846,7 @@
2870 开源版创建bug的时候预留对反馈字段和对反馈转bug的处理
2869 开源版创建需求的时候预留反馈字段和对反馈转需求的处理
修复的Bug
3805 批量编辑项目,关联过计划的项目,项目描述会带出标签
3805 批量编辑项目,关联过计划的项目,项目描述会带出标签
3804 项目列表与项目概况的状态不一致。
3803 项目区块类型选择未完成或进行中,会列出已关闭的项目
3802 项目视图,左上角列出的项目只显示已关闭项目
@@ -800,7 +858,7 @@
3788 productModel::getPrivProducts查询速度比较慢
3786 加长项目中团队名称字段的长度
3785 项目-需求页面 关联计划列出项目关联的所有产品的全部计划
3784 解决任务重复导出的问题
3784 解决任务重复导出的问题
3783 需求用导出数据的模板导入时,所属计划无法导入
3782 创建项目关联计划的时候会列出已经删除的计划
3781 取消的任务关闭后,项目概况中会记录任务的剩余工时
@@ -1031,7 +1089,7 @@
1240 提交需求会列出没有权限查看的产品名称
1244 组织-日志中,选择本月或上月时,结束日期显示准确。
1251 测试用例导出csv文件,报文格式数据不显示
1255 zbox一键安装包,建议安装 aria_chk
1255 zbox一键安装包,建议安装 aria_chk
1256 搜索条件为日期介于时间段时,搜索后点击重置,搜索条件还在,需要重新点击搜索,条件才会重置。
1261 批量分解任务无法分配相同名称的任务
1264 没有产品的时候打开debug,进入以下页面会产生大量警告性的错误
@@ -1070,40 +1128,40 @@
2017-11-06 9.6.stable
完成的需求
1988 需求,任务,bug,用例,待办都可以选择看板模式。
2004 运维性的项目支持多人任务和子任务功能
2012 所有项目 /所有产品页面增加导出功能
2033 项目挂起再激活的时候给用户选择是否顺延任务起止时间
2035 项目需求可以拖动排序
2048 看板增加任务的暂停状态栏显示
2108 看板增加显示/隐藏已关闭已取消任务的功能
2109 看板增加默认展开/折叠任务选项卡的功能
2110 看板增加自定义设置显示颜色的功能
2146 迭代,产品区块增加我参与的选项。
2160 检查自定义表格的字段
2161 管理员可以自定义所有人用的列表的默认布局。
2166 产品增加目录管理,方便用户维护产品
2167 实现基础的积分机制
2169 实现初始积分的计算功能
2170 实现积分的实时计算功能
2171 将积分功能作为开关
2172 积分区分等级积分和消耗积分
2173 实现积分的历史记录功能
2174 获得积分的时候系统给予一定的提示
2175 优化产品和项目的下拉菜单
2263 管理员可以将自己的菜单配置作为公共的配置
2309 优化看板卡片弹出菜单的位置
2311 自定义数据表格增加恢复默认功能
2328 禅道中所有列表页面都增加自定义显示字段的功能
2332 看板可以按照其他的字段进行分组
2414 实现接口的入口
2415 实现接口的应用管理
2416 实现独立的应用入口
2417 实现应用或者webhook的日志管理和查看
2418 实现webhook的管理
2419 可以自定义哪些事件下面可以触发webhook
2423 各个表单的必填项字段可以自定义
2425 实现和钉钉的消息通知接口
1988 需求,任务,bug,用例,待办都可以选择看板模式。
2004 运维性的项目支持多人任务和子任务功能
2012 所有项目 /所有产品页面增加导出功能
2033 项目挂起再激活的时候给用户选择是否顺延任务起止时间
2035 项目需求可以拖动排序
2048 看板增加任务的暂停状态栏显示
2108 看板增加显示/隐藏已关闭已取消任务的功能
2109 看板增加默认展开/折叠任务选项卡的功能
2110 看板增加自定义设置显示颜色的功能
2146 迭代,产品区块增加我参与的选项。
2160 检查自定义表格的字段
2161 管理员可以自定义所有人用的列表的默认布局。
2166 产品增加目录管理,方便用户维护产品
2167 实现基础的积分机制
2169 实现初始积分的计算功能
2170 实现积分的实时计算功能
2171 将积分功能作为开关
2172 积分区分等级积分和消耗积分
2173 实现积分的历史记录功能
2174 获得积分的时候系统给予一定的提示
2175 优化产品和项目的下拉菜单
2263 管理员可以将自己的菜单配置作为公共的配置
2309 优化看板卡片弹出菜单的位置
2311 自定义数据表格增加恢复默认功能
2328 禅道中所有列表页面都增加自定义显示字段的功能
2332 看板可以按照其他的字段进行分组
2414 实现接口的入口
2415 实现接口的应用管理
2416 实现独立的应用入口
2417 实现应用或者webhook的日志管理和查看
2418 实现webhook的管理
2419 可以自定义哪些事件下面可以触发webhook
2423 各个表单的必填项字段可以自定义
2425 实现和钉钉的消息通知接口
2017-09-27 9.5.1
2128 编辑需求页面增加对来源备注的编辑功能
@@ -1175,44 +1233,44 @@
2017-05-16 9.2.stable
完成的需求
1883 windows一键安装包提示安装vC环境改为可选
1982 支持多种工作模式
2143 需求、bug、用例增加批量修改所属分支的功能
2164 文档库增加排序功能
2207 创建产品的时候多平台多分支增加说明
2239 项目关联需求的时候将需求的研发阶段也列出来
2240 备份的时候将禅道的代码目录也备份下来
2241 文档视图中的产品和项目文档库中的权限控制增加团队成员允许访问的功能
2246 批量添加需求时在需求标题后面增加复制按钮
2247 文档库中的附件库增加搜索功能
2253 批量执行用例界面把前置条件显示出来
2254 将每日邮件通知里面的s去掉
2260 每日提醒的邮件发送时间调整下
2261 调整各个列表页面的表头的对齐方式。
2262 发信设置里面的发信域名改为禅道域名。
2265 分支或者平台下面的模块应该列出有需求的公共模块
2266 公共用例库增加导入和批量添加的功能
2267 公共用例库增加重名判断,用例库名称增加必填项标识,用例库图标和产品图标做区别。
2271 优化下数据库检查修复页面的排版
2272 调整测试套件列表页面
2273 调整测试用例的评审功能
2274 从公共用例库导入用例时完善模块对照逻辑
2275 测试总结报告保存按钮上调。
2276 用例步骤分组重新调整。
2277 Bug导为任务时需要处理截止日期
2278 任务列表的批量操作增加取消。
2279 燃尽图修改首天工时时将那一天的剩余工时也修改了
2280 cron表崩溃之后能够自动修复
2282 禅道如果和然之集成后,样式做调整
2283 表单里面一行多个控件必填项的展示需要调整
2284 维护模块的时候可以从中间插入一个记录
2285 测试报告中相应列表页面增加链接
2286 项目导入bug的时候,将解决方案等于延期的也列出来
2287 在详情页面切换产品列表跳转到该产品的需求列表页面
2288 禅道多图上传可以直接用多图上传的插件。
2290 禅道迁移目录之后,model临时文件能够自动重新生成。
2291 计划关联需求时,需求可以弹窗查看。
2292 升级windows一键安装包
1883 windows一键安装包提示安装vC环境改为可选
1982 支持多种工作模式
2143 需求、bug、用例增加批量修改所属分支的功能
2164 文档库增加排序功能
2207 创建产品的时候多平台多分支增加说明
2239 项目关联需求的时候将需求的研发阶段也列出来
2240 备份的时候将禅道的代码目录也备份下来
2241 文档视图中的产品和项目文档库中的权限控制增加团队成员允许访问的功能
2246 批量添加需求时在需求标题后面增加复制按钮
2247 文档库中的附件库增加搜索功能
2253 批量执行用例界面把前置条件显示出来
2254 将每日邮件通知里面的s去掉
2260 每日提醒的邮件发送时间调整下
2261 调整各个列表页面的表头的对齐方式。
2262 发信设置里面的发信域名改为禅道域名。
2265 分支或者平台下面的模块应该列出有需求的公共模块
2266 公共用例库增加导入和批量添加的功能
2267 公共用例库增加重名判断,用例库名称增加必填项标识,用例库图标和产品图标做区别。
2271 优化下数据库检查修复页面的排版
2272 调整测试套件列表页面
2273 调整测试用例的评审功能
2274 从公共用例库导入用例时完善模块对照逻辑
2275 测试总结报告保存按钮上调。
2276 用例步骤分组重新调整。
2277 Bug导为任务时需要处理截止日期
2278 任务列表的批量操作增加取消。
2279 燃尽图修改首天工时时将那一天的剩余工时也修改了
2280 cron表崩溃之后能够自动修复
2282 禅道如果和然之集成后,样式做调整
2283 表单里面一行多个控件必填项的展示需要调整
2284 维护模块的时候可以从中间插入一个记录
2285 测试报告中相应列表页面增加链接
2286 项目导入bug的时候,将解决方案等于延期的也列出来
2287 在详情页面切换产品列表跳转到该产品的需求列表页面
2288 禅道多图上传可以直接用多图上传的插件。
2290 禅道迁移目录之后,model临时文件能够自动重新生成。
2291 计划关联需求时,需求可以弹窗查看。
2292 升级windows一键安装包
2293 升级linux一键安装包
修复的Bug
1086 测试-版本生成报告页面切换分支报错
@@ -1237,61 +1295,61 @@
2017-03-23 9.1.stable
完成的需求
104 test suite管理
336 测试用例增加评审功能
845 实现公用测试用例功能
1729 实现导入公共测试用例的导入功能
1730 实现测试总结报告功能
1755 用例管理增加批量操作
1853 测试-用例 按照需求分组查看增加导出数据功能的支持
1876 增加测试用例步骤的失败率
1877 测试用例步骤增加分组管理
1882 版本用例关联增加可以直接关联上一个版本未执行的用例的功能
1903 项目需求列表增加TBC显示
1907 编辑用例的时候,添加追加的按钮换行了。
1908 调整测试版本列表里面的项目和版本信息
1909 调整测试版本操作菜单的交互
1910 按照需求关联用例检索会吧没有关联需求的也列出。
1911 用例批量执行的时候失败后无法输入内容。
1954 测试报告可以上传附件功能
1956 测试-用例页面增加批量确认需求变更功能
2005 Bug增加截止日期字段
2037 测试用例关联需求时候关闭需求也列出
2077 测试-版本 把待测和进行中的版本分类显示
2124 用例的详情页面可以增加全屏显示按钮
2125 用例执行的时候可以将页面再宽一些,尽量增加用例执行的面积
2126 用例详情页面步骤,可以开展将fieldset外层的边框去掉。
2180 禅道客户端登录失败的时候,把返回的数据暴露出来。
2186 桌面工具增加对https协议的支持
2189 测试用例结果失败的都增加转bug的按钮。
2190 没有步骤的用例在执行的时候应该可以写实际结果。
2191 在代码里面直接设置max_post_vars,避免批量添加,导入失效的问题。
2192 测试版本关联用例复制功能。
2193 bug统计报表增加优先级选择。
2196 用例执行的时候,增加提bug的按钮
2197 用例结果展示增加测试版本的信息
2202 bug自定义模板的删除增加确认按钮
2226 禅道里面的trunk 中文下面改为主干
2227 待办如果没有指派给自己的任务的话,给用户提示。
2228 事务类型的任务如果没有设置指派给字段也可以创建任务
2229 打开计划任务的确认链接设置更加清楚。
2230 可以设置首页的区块是否全部关闭。
2231 产品和项目的下拉菜单增加汉语拼音检索功能。
2237 区块可以设置高度、排序
2238 导出需求 任务 bug 用例的时候增加分支/平台字段
104 test suite管理
336 测试用例增加评审功能
845 实现公用测试用例功能
1729 实现导入公共测试用例的导入功能
1730 实现测试总结报告功能
1755 用例管理增加批量操作
1853 测试-用例 按照需求分组查看增加导出数据功能的支持
1876 增加测试用例步骤的失败率
1877 测试用例步骤增加分组管理
1882 版本用例关联增加可以直接关联上一个版本未执行的用例的功能
1903 项目需求列表增加TBC显示
1907 编辑用例的时候,添加追加的按钮换行了。
1908 调整测试版本列表里面的项目和版本信息
1909 调整测试版本操作菜单的交互
1910 按照需求关联用例检索会吧没有关联需求的也列出。
1911 用例批量执行的时候失败后无法输入内容。
1954 测试报告可以上传附件功能
1956 测试-用例页面增加批量确认需求变更功能
2005 Bug增加截止日期字段
2037 测试用例关联需求时候关闭需求也列出
2077 测试-版本 把待测和进行中的版本分类显示
2124 用例的详情页面可以增加全屏显示按钮
2125 用例执行的时候可以将页面再宽一些,尽量增加用例执行的面积
2126 用例详情页面步骤,可以开展将fieldset外层的边框去掉。
2180 禅道客户端登录失败的时候,把返回的数据暴露出来。
2186 桌面工具增加对https协议的支持
2189 测试用例结果失败的都增加转bug的按钮。
2190 没有步骤的用例在执行的时候应该可以写实际结果。
2191 在代码里面直接设置max_post_vars,避免批量添加,导入失效的问题。
2192 测试版本关联用例复制功能。
2193 bug统计报表增加优先级选择。
2196 用例执行的时候,增加提bug的按钮
2197 用例结果展示增加测试版本的信息
2202 bug自定义模板的删除增加确认按钮
2226 禅道里面的trunk 中文下面改为主干
2227 待办如果没有指派给自己的任务的话,给用户提示。
2228 事务类型的任务如果没有设置指派给字段也可以创建任务
2229 打开计划任务的确认链接设置更加清楚。
2230 可以设置首页的区块是否全部关闭。
2231 产品和项目的下拉菜单增加汉语拼音检索功能。
2237 区块可以设置高度、排序
2238 导出需求 任务 bug 用例的时候增加分支/平台字段
修复的Bug
1016 bug按照创建人搜索不显示数据
1019 提交bug页面显示框不全
1022 php5.2版本上无法执行后台-计划任务
1023 我的地盘需求排序后点击需求名称报错
1025 项目-bug搜索不能正常显示日期选择框
1029 项目-bug页面搜索可以搜索出已经删除的bug
1030 用例搜索后用例相关的BRS都为0
1031 统计中会列出没有权限的报表名称
1034 项目搜索包含减号跳转链接错误
1035 用例文件导入会默认关联需求的第一个版本
1036 guest帐号登录禅道无法编辑删除区块
1037 后台-发信 测试发信会把删除的帐号都列出
1016 bug按照创建人搜索不显示数据
1019 提交bug页面显示框不全
1022 php5.2版本上无法执行后台-计划任务
1023 我的地盘需求排序后点击需求名称报错
1025 项目-bug搜索不能正常显示日期选择框
1029 项目-bug页面搜索可以搜索出已经删除的bug
1030 用例搜索后用例相关的BRS都为0
1031 统计中会列出没有权限的报表名称
1034 项目搜索包含减号跳转链接错误
1035 用例文件导入会默认关联需求的第一个版本
1036 guest帐号登录禅道无法编辑删除区块
1037 后台-发信 测试发信会把删除的帐号都列出
2017-02-15 9.0.1
完成的需求
+2 -2
View File
@@ -1528,7 +1528,7 @@ class baseRouter
{
$code = trim(file_get_contents($fileName));
if(strpos($code, '<?php') === 0) $code = ltrim($code, '<?php');
if(strrpos($code, '?>') !== false) $code = rtrim($code, '?>');
if(strrpos($code, '?' . '>') !== false) $code = rtrim($code, '?' . '>');
return trim($code);
}
@@ -1650,7 +1650,7 @@ class baseRouter
/* include default value for module*/
$defaultValueFiles = glob($this->getTmpRoot() . "defaultvalue/*.php");
if($defaultValueFiles) foreach($defaultValueFiles as $file) helper::import($file);
if($defaultValueFiles) foreach($defaultValueFiles as $file) include $file;
/*
* 使用反射机制获取函数参数的默认值。
+1 -1
View File
@@ -18,7 +18,7 @@ function deleteBlock(index)
}
else
{
$('#block' + index).remove();
window.location.reload(true);
}
});
}
+1
View File
@@ -590,6 +590,7 @@ class blockModel extends model
if($blockKey == 'html') $blockPairs[$block] = 'HTML';
if($blockKey == 'flowchart') $blockPairs[$block] = $this->lang->block->lblFlowchart;
if($blockKey == 'dynamic') $blockPairs[$block] = $this->lang->block->dynamic;
if($blockKey == 'welcome') $blockPairs[$block] = $this->lang->block->welcome;
}
else
{
+8 -8
View File
@@ -44,13 +44,13 @@ $useGuest = $this->app->user->account == 'guest';
<li class='dropdown'>
<a href='javascript:;' data-toggle='dropdown' class='panel-action'><i class='icon icon-ellipsis-v'></i></a>
<ul class='dropdown-menu pull-right'>
<li><a href='javascript:;' class='refresh-panel'><i class='icon-repeat'></i> <?php echo $lang->block->refresh ?></a></li>
<li><a href='javascript:;' class='refresh-panel'><i class='icon-repeat'></i> <?php echo $lang->block->refresh . $lang->block->common;?></a></li>
<?php if(!$useGuest):?>
<li><a data-toggle='modal' href="<?php echo $this->createLink("block", "admin", "id=$block->id&module=$module");?>" class='edit-block' data-title='<?php echo $block->title;?>' ><?php echo $lang->edit;?></a></li>
<li><a data-toggle='modal' href="<?php echo $this->createLink("block", "admin", "id=$block->id&module=$module");?>" class='edit-block' data-title='<?php echo $block->title;?>' ><?php echo $lang->edit . $lang->block->common;?></a></li>
<?php if(!$block->source and $block->block == 'html'):?>
<li><a href="javascript:hiddenBlock(<?php echo $index;?>)" class="hidden-panel"><?php echo $lang->block->hidden;?></a></li>
<li><a href="javascript:hiddenBlock(<?php echo $index;?>)" class="hidden-panel"><?php echo $lang->block->hidden . $lang->block->common ;?></a></li>
<?php endif;?>
<li><a href='javascript:deleteBlock(<?php echo $index;?>);' class='remove-panel'><?php echo $lang->block->remove;?></a></li>
<li><a href='javascript:deleteBlock(<?php echo $index;?>);' class='remove-panel'><?php echo $lang->block->remove . $lang->block->common;?></a></li>
<?php endif;?>
<li><?php echo html::a($this->createLink("block", "admin", "id=0&module=$module"), "{$lang->block->createBlock}", '', "data-toggle='modal' data-type='ajax' data-width='700' data-title='{$lang->block->createBlock}'")?></li>
<li><?php echo html::a($this->createLink("block", "ajaxReset", "module=$module"), "{$lang->block->reset}", 'hiddenwin')?></li>
@@ -82,13 +82,13 @@ $useGuest = $this->app->user->account == 'guest';
<li class='dropdown'>
<a href='javascript:;' data-toggle='dropdown' class='panel-action'><i class='icon icon-ellipsis-v'></i></a>
<ul class='dropdown-menu pull-right'>
<li><a href='javascript:;' class='refresh-panel'><i class='icon-repeat'></i> <?php echo $lang->block->refresh ?></a></li>
<li><a href='javascript:;' class='refresh-panel'><i class='icon-repeat'></i> <?php echo $lang->block->refresh . $lang->block->common ?></a></li>
<?php if(!$useGuest):?>
<li><a data-toggle='modal' href="<?php echo $this->createLink("block", "admin", "id=$block->id&module=$module"); ?>" class='edit-block' data-title='<?php echo $block->title; ?>' ><?php echo $lang->edit; ?></a></li>
<li><a data-toggle='modal' href="<?php echo $this->createLink("block", "admin", "id=$block->id&module=$module"); ?>" class='edit-block' data-title='<?php echo $block->title; ?>' ><?php echo $lang->edit . $lang->block->common; ?></a></li>
<?php if(!$block->source and $block->block == 'html'):?>
<li><a href="javascript:hiddenBlock(<?php echo $index;?>)" class="hidden-panel"><?php echo $lang->block->hidden; ?></a></li>
<li><a href="javascript:hiddenBlock(<?php echo $index;?>)" class="hidden-panel"><?php echo $lang->block->hidden . $lang->blcok->common; ?></a></li>
<?php endif;?>
<li><a href='javascript:deleteBlock(<?php echo $index?>);' class='remove-panel'><?php echo $lang->block->remove; ?></a></li>
<li><a href='javascript:deleteBlock(<?php echo $index?>);' class='remove-panel'><?php echo $lang->block->remove . $lang->block->common; ?></a></li>
<?php endif;?>
<li><?php echo html::a($this->createLink("block", "admin", "id=0&module=$module"), "{$lang->block->createBlock}", '', "data-toggle='modal' data-type='ajax' data-width='700' data-title='{$lang->block->createBlock}'")?></li>
<li><?php echo html::a($this->createLink("block", "ajaxReset", "module=$module"), "{$lang->block->reset}", 'hiddenwin')?></li>
+1 -1
View File
@@ -20,7 +20,7 @@
<th class='c-name text-left'><?php echo $lang->project->name;?></th>
<th class="c-date"><?php echo $lang->project->end;?></th>
<?php if($longBlock):?>
<?php $thClass = (isset($config->isINT) and $config->isINT) ? 'w-85px' : 'c-hours';?>
<?php $thClass = ($app->getClientLang() == 'en') ? 'w-85px' : 'c-hours';?>
<th class="c-status"><?php echo $lang->statusAB;?></th>
<th class='<?php echo $thClass?>'><?php echo $lang->project->totalEstimate;?></th>
<th class="c-hours"><?php echo $lang->project->totalConsumed;?></th>
+2 -2
View File
@@ -39,8 +39,8 @@ tbody tr td:first-child input{display:none;}
<?php
if(!$build->deleted)
{
common::printIcon('build', 'edit', "buildID=$build->id", $build);
common::printIcon('build', 'delete', "buildID=$build->id", $build, 'button', 'trash', 'hiddenwin');
if(common::hasPriv('build', 'edit')) echo html::a($this->createLink('build', 'edit', "buildID=$build->id"), "<i class='icon-common-edit icon-edit'></i> " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}'");
if(common::hasPriv('build', 'delete')) echo html::a($this->createLink('build', 'delete', "buildID=$build->id"), "<i class='icon-common-delete icon-trash'></i> " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin'");
}
?>
</div>
+2 -2
View File
@@ -73,7 +73,7 @@ js::set('confirmDelete', $lang->user->confirmDelete);
<th class="c-url"><?php common::printOrderLink('email', $orderBy, $vars, $lang->user->email);?></th>
<th class="c-type"><?php common::printOrderLink('gender', $orderBy, $vars, $lang->user->gender);?></th>
<th><?php common::printOrderLink('phone', $orderBy, $vars, $lang->user->phone);?></th>
<th><?php $this->app->getClientLang() == 'en' ? common::printOrderLink('skype', $orderBy, $vars, $lang->user->skype) : common::printOrderLink('qq', $orderBy, $vars, $lang->user->qq);?></th>
<th><?php (isset($this->config->isINT) and $this->config->isINT) ? common::printOrderLink('skype', $orderBy, $vars, $lang->user->skype) : common::printOrderLink('qq', $orderBy, $vars, $lang->user->qq);?></th>
<th class="c-date"><?php common::printOrderLink('last', $orderBy, $vars, $lang->user->last);?></th>
<th class="w-90px"><?php common::printOrderLink('visits', $orderBy, $vars, $lang->user->visits);?></th>
<th class='c-actions'><?php echo $lang->actions;?></th>
@@ -95,7 +95,7 @@ js::set('confirmDelete', $lang->user->confirmDelete);
<td class="c-url" title="<?php echo $user->email;?>"><?php echo html::mailto($user->email);?></td>
<td class="c-type"><?php echo zget($lang->user->genderList, $user->gender, $user->gender);?></td>
<td><?php echo $user->phone;?></td>
<td><?php echo $this->app->getClientLang() == 'en' ? $user->skype : ($user->qq ? html::a("tencent://message/?uin=$user->qq", $user->qq) : '');?></td>
<td><?php echo (isset($this->config->isINT) and $this->config->isINT) ? $user->skype : ($user->qq ? html::a("tencent://message/?uin=$user->qq", $user->qq) : '');?></td>
<td class='c-date'><?php if($user->last) echo date('Y-m-d', $user->last);?></td>
<td class='c-num text-center'><?php echo $user->visits;?></td>
<td class='c-actions'>
+1
View File
@@ -93,6 +93,7 @@ $lang->custom->notice->longlife = 'Bug列表頁面的久未
$lang->custom->notice->invalidNumberKey = '鍵值應為不大於255的數字';
$lang->custom->notice->invalidStringKey = '鍵值應當為小寫英文字母、數字或下劃線的組合';
$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set方法不存在或禁用,不能設置時區。';
$lang->custom->notice->noClosedBlock = '沒有永久關閉的區塊';
$lang->custom->notice->indexPage['product'] = "從8.2版本起增加了產品主頁視圖,是否預設進入產品主頁?";
$lang->custom->notice->indexPage['project'] = "從8.2版本起增加了項目主頁視圖,是否預設進入項目主頁?";
+1 -1
View File
@@ -152,6 +152,7 @@ $lang->doc->customObjectLibs['customFiles'] = '顯示自定義文檔庫';
$lang->doc->orderLib = '文檔庫排序';
$lang->doc->customShowLibs = '顯示設置';
$lang->doc->customShowLibsList['zero'] = '顯示空文檔的庫';
$lang->doc->customShowLibsList['children'] = '顯示子分類的文檔';
$lang->doc->customShowLibsList['unclosed'] = '只顯示未關閉的項目';
$lang->doc->confirmDelete = "您確定刪除該文檔嗎?";
@@ -202,7 +203,6 @@ $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'] = '創建自定義文檔庫';
+2 -2
View File
@@ -167,13 +167,13 @@ js::set('sysurl', common::getSysUrl());
<tbody>
<?php if($doc->productName):?>
<tr>
<th><?php echo $lang->doc->product;?></th>
<th class='w-80px'><?php echo $lang->doc->product;?></th>
<td><?php echo $doc->productName;?></td>
</tr>
<?php endif;?>
<?php if($doc->projectName):?>
<tr>
<th><?php echo $lang->doc->project;?></th>
<th class='w-80px'><?php echo $lang->doc->project;?></th>
<td><?php echo $doc->projectName;?></td>
</tr>
<?php endif;?>
+1 -1
View File
@@ -196,7 +196,7 @@ class file extends control
}
else
{
$this->app->triggerError("The file you visit $fileID not found.", __FILE__, __LINE__, true);
die($this->lang->file->fileNotFound);
}
}
+1
View File
@@ -56,3 +56,4 @@ $lang->file->dangerFile = " File has been rejected to upload for securi
$lang->file->errorSuffix = 'Format is incorrect. .zip files ONLY!';
$lang->file->errorExtract = 'Extracting file failed. File might be damaged or invalid files in the zip package.';
$lang->file->uploadImagesExplain = 'Note: upload .jpg, .jpeg, .gif, and .png images. The image name will be taken as the title of the story and the image as its content.';
$lang->file->fileNotFound = 'The file was not found, maybe the physical file has been deleted!';
+1
View File
@@ -56,3 +56,4 @@ $lang->file->dangerFile = " 您选择的文件存在安全风险,系
$lang->file->errorSuffix = '压缩包格式错误,只能上传zip压缩包!';
$lang->file->errorExtract = '解压缩失败!可能文件已经损坏,或压缩包里含有非法上传文件。';
$lang->file->uploadImagesExplain = '注:请上传"jpg, jpeg, gif, png"格式的图片,程序会以文件名作为标题,以图片作为内容。';
$lang->file->fileNotFound = '未找到该文件,可能物理文件已被删除!';
+1
View File
@@ -56,3 +56,4 @@ $lang->file->dangerFile = " 您選擇的檔案存在安全風險,系
$lang->file->errorSuffix = '壓縮包格式錯誤,只能上傳zip壓縮包!';
$lang->file->errorExtract = '解壓縮失敗!可能檔案已經損壞,或壓縮包裡含有非法上傳檔案。';
$lang->file->uploadImagesExplain = '註:請上傳"jpg, jpeg, gif, png"格式的圖片,程序會以檔案名作為標題,以圖片作為內容。';
$lang->file->fileNotFound = '未找到該檔案,可能物理檔案已被刪除!';
+1
View File
@@ -560,6 +560,7 @@ $lang->resource->testcase->batchReview = 'batchReview';
$lang->resource->testcase->importFromLib = 'importFromLib';
$lang->resource->testcase->batchCaseTypeChange = 'batchCaseTypeChange';
$lang->resource->testcase->confirmLibcaseChange = 'confirmLibcaseChange';
$lang->resource->testcase->ignoreLibcaseChange = 'ignoreLibcaseChange';
$lang->resource->testcase->batchConfirmStoryChange = 'batchConfirmStoryChange';
$lang->testcase->methodOrder[0] = 'index';
+5 -2
View File
@@ -76,6 +76,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = 'Latest Version';
$lang->misc->feature->detailed = 'Details';
$lang->misc->releaseDate['11.4.stable'] = '2019-03-25';
$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';
@@ -100,13 +101,15 @@ $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.4.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Enhanced test management.</p><p>Optimized the UI of Plan, Release, and Build linked stories and bugs.</p><p>Customize the feature whether to display files in child category.</p><p>Optimize details and fix bug.</p>');
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Add Child Plan to a Plan</p><p>Optimize the chosen</p><p>Add Timezone setting</p><p>Optimize Doc Lib and Doc modules</p>');
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Add upgrade logs and database checkup after upgrading</p><p>Fixed ZenTao client and other bugs, and optimized details.</p>');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'Fix Bug.');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'Fix Bug.', 'desc' => '');
$lang->misc->feature->all['11.0.stable'][] = array('title'=>'ZenTao integrate Xuanxuan');
$lang->misc->feature->all['11.0.stable'][] = array('title'=>'ZenTao integrate Xuanxuan', 'desc' => '');
$lang->misc->feature->all['10.6.stable'][] = array('title'=>'Adjust backup mechanism', 'desc' => '<p>Increase backup settings and make backup more flexible</p><p>Show backup progress</p><p>Change the backup directory</p>');
$lang->misc->feature->all['10.6.stable'][] = array('title'=>'Optimize and adjust menu', 'desc' => '<p>Adjust admin menu</p><p>Adjust the secondary menu of My and Project</p>');
+5 -2
View File
@@ -76,6 +76,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '详情';
$lang->misc->releaseDate['11.4.stable'] = '2019-03-25';
$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';
@@ -100,13 +101,15 @@ $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.4.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '<p>增强测试任务管理</p><p>优化计划、发布、版本关联需求和bug的交互</p><p>文档库可以自定义是否显示子分类里的文档</p><p>修复bug,完善细节</p>');
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '<p>计划添加子计划功能</p><p>优化chosen交互</p><p>添加时区设置</p><p>优化文档库和文档</p>');
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '<p>增加升级日志和升级后数据库检查的功能</p><p>修复禅道集成客户端和其他若干bug,完善细节</p>');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'主要修复Bug。');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'主要修复Bug。', 'desc' => '');
$lang->misc->feature->all['11.0.stable'][] = array('title'=>'禅道集成喧喧');
$lang->misc->feature->all['11.0.stable'][] = array('title'=>'禅道集成喧喧', 'desc' => '');
$lang->misc->feature->all['10.6.stable'][] = array('title'=>'调整备份机制', 'desc' => '<p>增加备份设置,备份更加灵活</p><p>显示备份进度</p><p>可以更改备份目录</p>');
$lang->misc->feature->all['10.6.stable'][] = array('title'=>'优化和调整菜单', 'desc' => '<p>调整后台菜单</p><p>调整我的地盘和项目的二级菜单</p>');
+5 -2
View File
@@ -76,6 +76,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '詳情';
$lang->misc->releaseDate['11.4.stable'] = '2019-03-25';
$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';
@@ -100,13 +101,15 @@ $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.4.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '<p>增強測試任務管理</p><p>優化計劃、發佈、版本關聯需求和bug的交互</p><p>文檔庫可以自定義是否顯示子分類裡的文檔</p><p>修復bug,完善細節</p>');
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '<p>計劃添加子計劃功能</p><p>優化chosen交互</p><p>添加時區設置</p><p>優化文檔庫和文檔</p>');
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '<p>增加升級日誌和升級後資料庫檢查的功能</p><p>修復禪道整合客戶端和其他若干bug,完善細節</p>');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'主要修復Bug。');
$lang->misc->feature->all['11.1.stable'][] = array('title'=>'主要修復Bug。', 'desc' => '');
$lang->misc->feature->all['11.0.stable'][] = array('title'=>'禪道整合喧喧');
$lang->misc->feature->all['11.0.stable'][] = array('title'=>'禪道整合喧喧', 'desc' => '');
$lang->misc->feature->all['10.6.stable'][] = array('title'=>'調整備份機制', 'desc' => '<p>增加備份設置,備份更加靈活</p><p>顯示備份進度</p><p>可以更改備份目錄</p>');
$lang->misc->feature->all['10.6.stable'][] = array('title'=>'優化和調整菜單', 'desc' => '<p>調整後台菜單</p><p>調整我的地盤和項目的二級菜單</p>');
+1 -1
View File
@@ -22,7 +22,7 @@
</div>
<form method='post' target='hiddenwin'>
<table align='center' class='table table-form w-320px'>
<?php $thWidth = (isset($config->isINT) and $config->isINT) ? 'w-130px' : 'w-90px';?>
<?php $thWidth = ($app->getClientLang() == 'en') ? 'w-130px' : 'w-90px';?>
<tr>
<th class='rowhead <?php echo $thWidth?>'><?php echo $lang->user->account;?></th>
<td><?php echo $user->account . html::hidden('account',$user->account);?></td>
+1
View File
@@ -4,3 +4,4 @@
.block-release .panel-body, .block-dynamic .panel-body {height: 240px; overflow-x: hidden; overflow-y: auto; position: relative;}
.block-release .panel-body {padding-bottom: 50px;}
.block-release .panel-body > .btn.pull-right {position: absolute; right: 20px; bottom: 20px;}
.col-4 .cell table td{word-wrap: break-word; word-break: normal;}
+3 -3
View File
@@ -58,7 +58,7 @@ $lang->product->accessDenied = "您無權訪問該{$lang->productCommon}";
$lang->product->id = '編號';
$lang->product->name = "{$lang->productCommon}名稱";
$lang->product->code = "{$lang->productCommon}代號";
$lang->product->line = '產品綫';
$lang->product->line = "{$lang->productCommon}綫";
$lang->product->order = '排序';
$lang->product->type = "{$lang->productCommon}類型";
$lang->product->status = '狀態';
@@ -120,8 +120,8 @@ $lang->product->aclList['custom'] = '自定義白名單(團隊成員和白名
$lang->product->storySummary = "本頁共 <strong>%s</strong> 個需求,預計 <strong>%s</strong> 個工時,用例覆蓋率 <strong>%s</strong>。";
$lang->product->checkedSummary = "選中 <strong>%total%</strong> 個需求,預計 <strong>%estimate%</strong> 個工時,用例覆蓋率 <strong>%rate%</strong>。";
$lang->product->noModule = '<div>您現在還沒有模組信息</div><div>請維護產品模組</div>';
$lang->product->noProduct = '暫時沒有產品。';
$lang->product->noModule = "<div>您現在還沒有模組信息</div><div>請維護{$lang->productCommon}模組</div>";
$lang->product->noProduct = "暫時沒有{$lang->productCommon}。";
$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon;
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
+203 -207
View File
@@ -11,226 +11,222 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php if($this->app->getClientLang() == 'en'):?>
<style>.side-col .cell table th{width: 100px !important}</style>
<?php endif;?>
<div id='mainContent' class="main-row">
<div class="col-8 main-col">
<div class="row">
<div class="col-sm-6">
<div class="panel block-release">
<div class="panel-heading">
<div class="panel-title"><?php echo $lang->product->roadmap;?></div>
</div>
<div class="panel-body">
<div class="release-path">
<ul class="release-line">
<?php foreach($roadmaps as $year => $roadmap):?>
<?php foreach($roadmap as $plans):?>
<?php foreach($plans as $plan):?>
<?php if(isset($plan->begin)):?>
<li <?php if(date('Y-m-d') < $plan->begin) echo "class='active'";?>>
<a href="<?php echo $this->createLink('productplan', 'view', "planID={$plan->id}");?>">
<span class="title"><?php echo $plan->title;?></span>
<span class="date"><?php echo $plan->begin;?></span>
</a>
</li>
<?php else:?>
<li>
<a href="<?php echo $this->createLink('release', 'view', "releaseID={$plan->id}");?>">
<span class="title"><?php echo $plan->name;?></span>
<span class="date"><?php echo $plan->date;?></span>
</a>
</li>
<?php endif;?>
<?php endforeach;?>
<?php endforeach;?>
<?php endforeach;?>
</ul>
</div>
<?php echo html::a($this->createLink('product', 'roadmap', "productID={$product->id}"), $lang->product->iterationView . "<span class='label label-badge label-icon'><i class='icon icon-arrow-right'></i></span>", '', "class='btn btn-primary btn-circle btn-icon-right btn-sm pull-right'");?>
</div>
<div id='mainContent' class="main-row">
<div class="col-8 main-col">
<div class="row">
<div class="col-sm-6">
<div class="panel block-release">
<div class="panel-heading">
<div class="panel-title"><?php echo $lang->product->roadmap;?></div>
</div>
</div>
<div class="col-sm-6">
<div class="panel block-dynamic">
<div class="panel-heading">
<div class="panel-title"><?php echo $lang->product->latestDynamic;?></div>
<nav class="panel-actions nav nav-default">
<li><a href="<?php echo $this->createLink('product', 'dynamic', "productID={$product->id}&type=all");?>" title="<?php echo $lang->more;?>"><i class="icon icon-more icon-sm"></i></i></a></li>
</nav>
</div>
<div class="panel-body scrollbar-hover">
<ul class="timeline timeline-tag-left no-margin">
<?php foreach($dynamics as $action):?>
<li <?php if($action->major) echo "class='active'";?>>
<div class='text-ellipsis'>
<span class="timeline-tag"><?php echo $action->date;?></span>
<span class="timeline-text"><?php echo zget($users, $action->actor) . ' ' . $action->actionLabel . $action->objectLabel . ' ' . html::a($action->objectLink, $action->objectName);?></span>
</div>
<div class="panel-body">
<div class="release-path">
<ul class="release-line">
<?php foreach($roadmaps as $year => $roadmap):?>
<?php foreach($roadmap as $plans):?>
<?php foreach($plans as $plan):?>
<?php if(isset($plan->begin)):?>
<li <?php if(date('Y-m-d') < $plan->begin) echo "class='active'";?>>
<a href="<?php echo $this->createLink('productplan', 'view', "planID={$plan->id}");?>">
<span class="title"><?php echo $plan->title;?></span>
<span class="date"><?php echo $plan->begin;?></span>
</a>
</li>
<?php else:?>
<li>
<a href="<?php echo $this->createLink('release', 'view', "releaseID={$plan->id}");?>">
<span class="title"><?php echo $plan->name;?></span>
<span class="date"><?php echo $plan->date;?></span>
</a>
</li>
<?php endif;?>
<?php endforeach;?>
<?php endforeach;?>
<?php endforeach;?>
</ul>
</div>
<?php echo html::a($this->createLink('product', 'roadmap', "productID={$product->id}"), $lang->product->iterationView . "<span class='label label-badge label-icon'><i class='icon icon-arrow-right'></i></span>", '', "class='btn btn-primary btn-circle btn-icon-right btn-sm pull-right'");?>
</div>
</div>
<div class="col-sm-12">
<?php $blockHistory = true;?>
<?php include '../../common/view/action.html.php';?>
</div>
<div class="col-sm-6">
<div class="panel block-dynamic">
<div class="panel-heading">
<div class="panel-title"><?php echo $lang->product->latestDynamic;?></div>
<nav class="panel-actions nav nav-default">
<li><a href="<?php echo $this->createLink('product', 'dynamic', "productID={$product->id}&type=all");?>" title="<?php echo $lang->more;?>"><i class="icon icon-more icon-sm"></i></i></a></li>
</nav>
</div>
<div class="panel-body scrollbar-hover">
<ul class="timeline timeline-tag-left no-margin">
<?php foreach($dynamics as $action):?>
<li <?php if($action->major) echo "class='active'";?>>
<div class='text-ellipsis'>
<span class="timeline-tag"><?php echo $action->date;?></span>
<span class="timeline-text"><?php echo zget($users, $action->actor) . ' ' . $action->actionLabel . $action->objectLabel . ' ' . html::a($action->objectLink, $action->objectName);?></span>
</div>
</li>
<?php endforeach;?>
</ul>
</div>
</div>
</div>
<div class='main-actions'>
<div class="btn-toolbar">
<?php
$params = "product=$product->id";
$browseLink = $this->session->productList ? $this->session->productList : inlink('browse', "productID=$product->id");
common::printBack($browseLink);
if(!$product->deleted)
{
echo "<div class='divider'></div>";
if($product->status != 'closed')
{
common::printIcon('product', 'close', $params, $product, 'button', '', '', 'iframe', true);
echo "<div class='divider'></div>";
}
common::printIcon('product', 'edit', $params, $product);
common::printIcon('product', 'delete', $params, $product, 'button', 'trash', 'hiddenwin');
}
?>
</div>
<div class="col-sm-12">
<?php $blockHistory = true;?>
<?php include '../../common/view/action.html.php';?>
</div>
</div>
<div class="col-4 side-col">
<div class="row">
<div class="col-sm-12">
<div class="cell">
<div class="detail">
<h2 class="detail-title"><span class="label-id"><?php echo $product->id;?></span> <span class="label label-light label-outline"><?php echo $product->code;?></span> <?php echo $product->name;?></h2>
<div class="detail-content article-content">
<p><span class="text-limit" data-limit-size="40"><?php echo $product->desc;?></span><a class="text-primary text-limit-toggle small" data-text-expand="<?php echo $lang->expand;?>" data-text-collapse="<?php echo $lang->collapse;?>"></a></p>
<p>
<span class="label label-primary label-outline" title='<?php echo $lang->product->type;?>'><?php echo zget($lang->product->typeList, $product->type);?></span>
<span class="label label-success label-outline" title='<?php echo $lang->product->status;?>'><?php echo zget($lang->product->statusList, $product->status);?></span>
<?php if($product->deleted):?>
<span class='label label-danger label-outline'><?php echo $lang->product->deleted;?></span>
<?php endif; ?>
</p>
</div>
<div class='main-actions'>
<div class="btn-toolbar">
<?php
$params = "product=$product->id";
$browseLink = $this->session->productList ? $this->session->productList : inlink('browse', "productID=$product->id");
common::printBack($browseLink);
if(!$product->deleted)
{
echo "<div class='divider'></div>";
if($product->status != 'closed')
{
common::printIcon('product', 'close', $params, $product, 'button', '', '', 'iframe', true);
echo "<div class='divider'></div>";
}
common::printIcon('product', 'edit', $params, $product);
common::printIcon('product', 'delete', $params, $product, 'button', 'trash', 'hiddenwin');
}
?>
</div>
</div>
</div>
<div class="col-4 side-col">
<div class="row">
<div class="col-sm-12">
<div class="cell">
<div class="detail">
<h2 class="detail-title"><span class="label-id"><?php echo $product->id;?></span> <span class="label label-light label-outline"><?php echo $product->code;?></span> <?php echo $product->name;?></h2>
<div class="detail-content article-content">
<p><span class="text-limit" data-limit-size="40"><?php echo $product->desc;?></span><a class="text-primary text-limit-toggle small" data-text-expand="<?php echo $lang->expand;?>" data-text-collapse="<?php echo $lang->collapse;?>"></a></p>
<p>
<span class="label label-primary label-outline" title='<?php echo $lang->product->type;?>'><?php echo zget($lang->product->typeList, $product->type);?></span>
<span class="label label-success label-outline" title='<?php echo $lang->product->status;?>'><?php echo zget($lang->product->statusList, $product->status);?></span>
<?php if($product->deleted):?>
<span class='label label-danger label-outline'><?php echo $lang->product->deleted;?></span>
<?php endif; ?>
</p>
</div>
<?php if($product->type == 'platform'):?>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->branchName['platform'];?></strong><a class="btn btn-link pull-right muted"><i class="icon icon-more icon-sm"></i></a></div>
<div class="detail-content">
<ul class="clearfix branch-list">
<?php foreach($branches as $branchName):?>
<li><?php echo $branchName;?></li>
<?php endforeach;?>
<li><a class="text-muted" href="<?php echo $this->createLink('branch', 'manage', "productID={$product->id}")?>"><i class="icon icon-plus hl-primary text-primary"></i> &nbsp;<?php echo $lang->branch->add;?></a></li>
</ul>
</div>
</div>
<?php endif;?>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->manager;?></strong></div>
<div class="detail-content">
<table class="table table-data">
<tbody>
<tr>
<th class='w-100px'><i class="icon icon-person icon-sm"></i> <?php echo $lang->productCommon;?></th>
<td><em><?php echo zget($users, $product->PO);?></em></td>
<th><i class="icon icon-person icon-sm"></i> <?php echo $lang->product->qa;?></th>
<td><em><?php echo zget($users, $product->QD);?></em></td>
</tr>
<tr>
<th><i class="icon icon-person icon-sm"></i> <?php echo $lang->product->release;?></th>
<td><em><?php echo zget($users, $product->RD);?></em></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->basicInfo;?></strong></div>
<div class="detail-content">
<table class="table table-data data-basic">
<tbody>
<tr>
<th><?php echo $lang->product->line;?></th>
<td><em><?php echo zget($lines, $product->line);?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->openedBy?></th>
<td><em><?php echo zget($users, $product->createdBy);?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->openedDate?></th>
<td><em><?php echo formatTime($product->createdDate, DT_DATE1);?></em></td>
</tr>
<tr>
<th><?php echo $lang->product->acl;?></th>
<td><em><?php echo $lang->product->aclList[$product->acl];?></em></td>
</tr>
<?php if($product->acl == 'custom'):?>
<tr>
<th><?php echo $lang->product->whitelist;?></th>
<td>
<em>
<?php
$whitelist = explode(',', $product->whitelist);
foreach($whitelist as $groupID) if(isset($groups[$groupID])) echo $groups[$groupID] . '&nbsp;';
?>
</em>
</td>
</tr>
<?php endif;?>
</tbody>
</table>
</div>
</div>
<?php if($config->global->flow != 'onlyTest'):?>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->otherInfo;?></strong></div>
<div class="detail-content">
<table class="table table-data data-basic">
<tbody>
<?php $space = $this->app->getClientLang() == 'en' ? ' ' : '';?>
<tr>
<th><?php echo $lang->story->statusList['active'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['active']?></em></td>
<th><?php echo $lang->product->plans?></th>
<td><em><?php echo $product->plans?></em></td>
<th><?php echo $lang->product->bugs?></th>
<td><em><?php echo $product->bugs?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->statusList['changed'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['changed']?></em></td>
<th><?php echo $lang->product->projects?></th>
<td><em><?php echo $product->projects?></em></td>
<th><?php echo $lang->product->cases?></th>
<td><em><?php echo $product->cases?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->statusList['draft'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['draft']?></em></td>
<th><?php echo $lang->product->builds?></th>
<td><em><?php echo $product->builds?></em></td>
<th><?php echo $lang->product->docs?></th>
<td><em><?php echo $product->docs?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->statusList['closed'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['closed']?></em></td>
<th><?php echo $lang->product->releases?></th>
<td><em><?php echo $product->releases?></em></td>
</tr>
</tbody>
</table>
</div>
</div>
<?php endif;?>
</div>
<?php if($product->type == 'platform'):?>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->branchName['platform'];?></strong><a class="btn btn-link pull-right muted"><i class="icon icon-more icon-sm"></i></a></div>
<div class="detail-content">
<ul class="clearfix branch-list">
<?php foreach($branches as $branchName):?>
<li><?php echo $branchName;?></li>
<?php endforeach;?>
<li><a class="text-muted" href="<?php echo $this->createLink('branch', 'manage', "productID={$product->id}")?>"><i class="icon icon-plus hl-primary text-primary"></i> &nbsp;<?php echo $lang->branch->add;?></a></li>
</ul>
</div>
</div>
<?php endif;?>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->manager;?></strong></div>
<div class="detail-content">
<table class="table table-data">
<tbody>
<tr>
<th class='w-100px'><i class="icon icon-person icon-sm"></i> <?php echo $lang->productCommon;?></th>
<td><em><?php echo zget($users, $product->PO);?></em></td>
<th><i class="icon icon-person icon-sm"></i> <?php echo $lang->product->qa;?></th>
<td><em><?php echo zget($users, $product->QD);?></em></td>
</tr>
<tr>
<th><i class="icon icon-person icon-sm"></i> <?php echo $lang->product->release;?></th>
<td><em><?php echo zget($users, $product->RD);?></em></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->basicInfo;?></strong></div>
<div class="detail-content">
<table class="table table-data data-basic">
<tbody>
<tr>
<th><?php echo $lang->product->line;?></th>
<td><em><?php echo zget($lines, $product->line);?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->openedBy?></th>
<td><em><?php echo zget($users, $product->createdBy);?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->openedDate?></th>
<td><em><?php echo formatTime($product->createdDate, DT_DATE1);?></em></td>
</tr>
<tr>
<th><?php echo $lang->product->acl;?></th>
<td><em><?php echo $lang->product->aclList[$product->acl];?></em></td>
</tr>
<?php if($product->acl == 'custom'):?>
<tr>
<th><?php echo $lang->product->whitelist;?></th>
<td>
<em>
<?php
$whitelist = explode(',', $product->whitelist);
foreach($whitelist as $groupID) if(isset($groups[$groupID])) echo $groups[$groupID] . '&nbsp;';
?>
</em>
</td>
</tr>
<?php endif;?>
</tbody>
</table>
</div>
</div>
<?php if($config->global->flow != 'onlyTest'):?>
<div class="detail">
<div class="detail-title"><strong><?php echo $lang->product->otherInfo;?></strong></div>
<div class="detail-content">
<table class="table table-data data-basic">
<tbody>
<?php $space = $this->app->getClientLang() == 'en' ? ' ' : '';?>
<tr>
<th><?php echo $lang->story->statusList['active'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['active']?></em></td>
<th><?php echo $lang->product->plans?></th>
<td><em><?php echo $product->plans?></em></td>
<th><?php echo $lang->product->bugs?></th>
<td><em><?php echo $product->bugs?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->statusList['changed'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['changed']?></em></td>
<th><?php echo $lang->product->projects?></th>
<td><em><?php echo $product->projects?></em></td>
<th><?php echo $lang->product->cases?></th>
<td><em><?php echo $product->cases?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->statusList['draft'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['draft']?></em></td>
<th><?php echo $lang->product->builds?></th>
<td><em><?php echo $product->builds?></em></td>
<th><?php echo $lang->product->docs?></th>
<td><em><?php echo $product->docs?></em></td>
</tr>
<tr>
<th><?php echo $lang->story->statusList['closed'] . $space . $lang->story->common;?></th>
<td><em><?php echo $product->stories['closed']?></em></td>
<th><?php echo $lang->product->releases?></th>
<td><em><?php echo $product->releases?></em></td>
</tr>
</tbody>
</table>
</div>
</div>
<?php endif;?>
</div>
</div>
</div>
+24 -13
View File
@@ -37,9 +37,9 @@
<?php
if(!$plan->deleted)
{
if(common::hasPriv('productplan', 'create') and $plan->parent <= '0') echo html::a($this->createLink('productplan', 'create', "product={$plan->product}&branch={$plan->branch}&parent={$plan->id}"), "<i class='icon-treemap-alt'></i>" . $this->lang->productplan->children , '', "class='btn btn-link' title='{$this->lang->productplan->children}'");
common::printIcon('productplan', 'edit', "planID=$plan->id", $plan);
common::printIcon('productplan', 'delete', "planID=$plan->id", $plan, 'button', 'trash', 'hiddenwin');
if(common::hasPriv('productplan', 'create') and $plan->parent <= '0') echo html::a($this->createLink('productplan', 'create', "product={$plan->product}&branch={$plan->branch}&parent={$plan->id}"), "<i class='icon-treemap-alt'></i> " . $this->lang->productplan->children , '', "class='btn btn-link' title='{$this->lang->productplan->children}'");
if(common::hasPriv('productplan', 'edit')) echo html::a($this->createLink('productplan', 'edit', "planID=$plan->id"), "<i class='icon-common-edit icon-edit'></i> " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}'");
if(common::hasPriv('productplan', 'delete')) echo html::a($this->createLink('productplan', 'delete', "planID=$plan->id"), "<i class='icon-common-delete icon-trash'></i> " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin'");
}
?>
</div>
@@ -57,16 +57,27 @@
<div id='stories' class='tab-pane <?php if($type == 'story') echo 'active'?>'>
<?php $canOrder = common::hasPriv('project', 'storySort');?>
<div class='actions'>
<?php
if(!$plan->deleted)
{
$batchMisc = common::hasPriv('story', 'batchCreate') ? 'btn btn-link' : "disabled";
$batchLink = common::hasPriv('story', 'batchCreate') ? $this->createLink('story', 'batchCreate', "productID=$plan->product&branch=$plan->branch&moduleID=0&story=0&project=0&plan={$plan->id}") : '#';
echo html::a($batchLink, "<i class='icon icon-sitemap'></i><span class='text'>" . $lang->story->batchCreate . '</span>', '', "class='$batchMisc'");
common::printIcon('story', 'create', "productID=$plan->product&branch=$plan->branch&moduleID=0&storyID=0&projectID=0&bugID=0&planID=$plan->id", $plan, 'button', 'plus');
}
if(common::hasPriv('productplan', 'linkStory')) echo html::a("javascript:showLink($plan->id, \"story\")", '<i class="icon-link"></i> ' . $lang->productplan->linkStory, '', "class='btn btn-primary'");
?>
<?php if(!$plan->deleted):?>
<div class="btn-group">
<div class='drop-down dropdown-hover'>
<?php
$createLink = common::hasPriv('story', 'create') ? $this->createLink('story', 'create', "productID=$plan->product&branch=$plan->branch&moduleID=0&storyID=0&projectID=0&bugID=0&planID=$plan->id") : '#';
$createMisc = common::hasPriv('story', 'create') ? 'btn btn-secondary' : " btn btn-secondary disabled";
echo html::a($createLink, "<i class='icon icon-plus'></i><span class='text'>" . $lang->story->create . "</span><span class='caret'>", '', "class='$createMisc'");
?>
<ul class='dropdown-menu'>
<?php $disabled = common::hasPriv('story', 'batchCreate') ? '' : "class='disabled'";?>
<li <?php echo $disabled?>>
<?php
$batchLink = common::hasPriv('story', 'batchCreate') ? $this->createLink('story', 'batchCreate', "productID=$plan->product&branch=$plan->branch&moduleID=0&story=0&project=0&plan={$plan->id}") : '#';
echo html::a($batchLink, "<span class='text'>" . $lang->story->batchCreate . '</span>', '', "class='btn btn-link'");
?>
</li>
</ul>
</div>
</div>
<?php endif;?>
<?php if(common::hasPriv('productplan', 'linkStory')) echo html::a("javascript:showLink($plan->id, \"story\")", '<i class="icon-link"></i> ' . $lang->productplan->linkStory, '', "class='btn btn-primary'");?>
</div>
<?php if(common::hasPriv('productplan', 'linkStory')):?>
<div class='linkBox cell hidden'></div>
+1
View File
@@ -1 +1,2 @@
td.delayed{background: #e84e0f!important; color: white;}
#int-dropdown{margin-left: -8px; border-radius: 4px; border: 1px solid #0c64eb}
+9 -4
View File
@@ -55,7 +55,7 @@ $lang->project->other = '其他:';
$lang->project->deleted = '已刪除';
$lang->project->delayed = '已延期';
$lang->project->product = $lang->project->products;
$lang->project->readjustTime = '調整項目起止時間';
$lang->project->readjustTime = "調整{$lang->projectCommon}起止時間";
$lang->project->readjustTask = '順延任務的起止時間';
$lang->project->effort = '日誌';
$lang->project->relatedMember = '相關成員';
@@ -192,7 +192,7 @@ $lang->project->aboveAllProduct = "以上所有{$lang->productCommon}";
$lang->project->aboveAllProject = "以上所有{$lang->projectCommon}";
/* 頁面提示。*/
$lang->project->linkStoryByPlanTips = '此操作會將所選計划下面的需求全部關聯到此項目中';
$lang->project->linkStoryByPlanTips = "此操作會將所選計划下面的需求全部關聯到此{$lang->projectCommon}中";
$lang->project->selectProject = "請選擇{$lang->projectCommon}";
$lang->project->beginAndEnd = '起止時間';
$lang->project->begin = '開始日期';
@@ -225,7 +225,7 @@ $lang->project->copyFromProject = "複製自{$lang->projectCommon} <strong>%s</s
$lang->project->cancelCopy = '取消複製';
$lang->project->byPeriod = '按時間段';
$lang->project->byUser = '按用戶';
$lang->project->noProject = '暫時沒有項目。';
$lang->project->noProject = "暫時沒有{$lang->projectCommon}。";
$lang->project->noMembers = '暫時沒有團隊成員。';
/* 交互提示。*/
@@ -246,6 +246,11 @@ $lang->project->withweekend = '顯示周末';
$lang->project->interval = '間隔';
$lang->project->fixFirstWithLeft = '修改剩餘工時';
$lang->project->action = new stdclass();
$lang->project->action->opened = '$date, 由 <strong>$actor</strong> 創建。$extra' . "\n";
$lang->project->action->managed = '$date, 由 <strong>$actor</strong> 維護。$extra' . "\n";
$lang->project->action->extra = '相關產品為 %s。';
/* 統計。*/
$lang->project->charts = new stdclass();
$lang->project->charts->burn = new stdclass();
@@ -263,7 +268,7 @@ $lang->project->charts->burn->graph->actuality = '實際';
$lang->project->placeholder = new stdclass();
$lang->project->placeholder->code = '團隊內部的簡稱';
$lang->project->placeholder->totalLeft = '項目開始時的總預計工時';
$lang->project->placeholder->totalLeft = "{$lang->projectCommon}開始時的總預計工時";
$lang->project->selectGroup = new stdclass();
$lang->project->selectGroup->done = '(已結束)';
+11 -4
View File
@@ -119,13 +119,19 @@ class projectModel extends model
/* Replace for dropdown submenu. */
if(isset($this->lang->project->subMenu->$key))
{
$projectSubMenu = $this->lang->project->subMenu->$key;
$subMenu = common::createSubMenu($this->lang->project->subMenu->$key, $projectID);
if(!empty($subMenu))
{
foreach($subMenu as $menu)
foreach($subMenu as $menuKey => $menu)
{
if($moduleName == strtolower($menu->link['module']) and $methodName == strtolower($menu->link['method']))
if($moduleName == strtolower($menu->link['module']) and
(
$methodName == strtolower($menu->link['method']) or
(isset($projectSubMenu->$menuKey['alias']) and strpos($projectSubMenu->$menuKey['alias'], $methodName) !== false)
)
)
{
$this->lang->project->menu->{$key}['link'] = $menu->text . "|" . join('|', $menu->link);
break;
@@ -897,6 +903,7 @@ class projectModel extends model
$burns = $this->dao->select('project, date AS name, `left` AS value')
->from(TABLE_BURN)
->where('project')->in($projectKeys)
->andWhere('task')->eq(0)
->orderBy('date desc')
->fetchGroup('project', 'name');
@@ -1876,7 +1883,7 @@ class projectModel extends model
public function fixFirst($projectID)
{
$project = $this->getById($projectID);
$burn = $this->dao->select('*')->from(TABLE_BURN)->where('project')->eq($projectID)->andWhere('date')->eq($project->begin)->fetch();
$burn = $this->dao->select('*')->from(TABLE_BURN)->where('project')->eq($projectID)->andWhere('task')->eq(0)->andWhere('date')->eq($project->begin)->fetch();
$withLeft = $this->post->withLeft ? $this->post->withLeft : 0;
$data = fixer::input('post')
@@ -1904,7 +1911,7 @@ class projectModel extends model
$project = $this->getById($projectID);
/* If the burnCounts > $itemCounts, get the latest $itemCounts records. */
$sets = $this->dao->select('date AS name, `left` AS value, estimate')->from(TABLE_BURN)->where('project')->eq((int)$projectID)->orderBy('date DESC')->fetchAll('name');
$sets = $this->dao->select('date AS name, `left` AS value, estimate')->from(TABLE_BURN)->where('project')->eq((int)$projectID)->andWhere('task')->eq(0)->orderBy('date DESC')->fetchAll('name');
$count = 0;
$burnData = array();
+1 -1
View File
@@ -25,7 +25,7 @@
echo $lang->project->howToUpdateBurn;
?>
<?php if($interval):?>
<div class='input-control w-120px'>
<div class='input-control <?php echo $this->app->getClientLang() == 'en' ? "w-150px" : "w-120px" ?>'>
<?php echo html::select('interval', $dayList, $interval, "class='form-control chosen'");?>
</div>
<?php endif;?>
+20
View File
@@ -149,12 +149,32 @@ js::set('browseType', $browseType);
<?php
$checkObject = new stdclass();
$checkObject->project = $projectID;
?>
<?php if($app->getClientLang() != 'en'):?>
<?php
$link = $this->createLink('task', 'batchCreate', "project=$projectID" . (isset($moduleID) ? "&storyID=&moduleID=$moduleID" : ''));
if(common::hasPriv('task', 'batchCreate', $checkObject)) echo html::a($link, "<i class='icon icon-plus'></i> {$lang->task->batchCreate}", '', "class='btn btn btn-secondary'");
$link = $this->createLink('task', 'create', "project=$projectID" . (isset($moduleID) ? "&storyID=&moduleID=$moduleID" : ''));
if(common::hasPriv('task', 'create', $checkObject)) echo html::a($link, "<i class='icon icon-plus'></i> {$lang->task->create}", '', "class='btn btn-primary'");
?>
<?php else:?>
<?php
echo "<div class='btn-group dropdown-hover'>";
$link = $this->createLink('task', 'create', "project=$projectID" . (isset($moduleID) ? "&storyID=&moduleID=$moduleID" : ''));
if(common::hasPriv('task', 'create', $checkObject)) echo html::a($link, "<i class='icon icon-plus'></i> {$lang->task->create} </span><span class='caret'>", '', "class='btn btn-primary'");
?>
<ul class='dropdown-menu'>
<?php $disabled = common::hasPriv('task', 'batchCreate') ? '' : "class='disabled'";?>
<li <?php echo $disabled?>>
<?php
$batchLink = $this->createLink('task', 'batchCreate', "project=$projectID" . (isset($moduleID) ? "&storyID=&moduleID=$moduleID" : ''));
echo "<li>" . html::a($batchLink, "<i class='icon icon-plus'></i>" . $lang->task->batchCreate) . "</li>";
?>
</li>
</ul>
<?php echo "</div>";?>
<?php endif;?>
</div>
</div>
<div id="mainContent" class="main-row fade">
+3 -3
View File
@@ -36,10 +36,10 @@
if(common::hasPriv('release', 'changeStatus', $release))
{
$changedStatus = $release->status == 'normal' ? 'terminate' : 'normal';
echo html::a(inlink('changeStatus', "releaseID=$release->id&status=$changedStatus"), '<i class="icon-' . ($release->status == 'normal' ? 'pause' : 'play') . '"></i> ', 'hiddenwin', "class='btn btn-link' title='{$lang->release->changeStatusList[$changedStatus]}'");
echo html::a(inlink('changeStatus', "releaseID=$release->id&status=$changedStatus"), '<i class="icon-' . ($release->status == 'normal' ? 'pause' : 'play') . '"></i> ' . $lang->release->changeStatusList[$changedStatus], 'hiddenwin', "class='btn btn-link' title='{$lang->release->changeStatusList[$changedStatus]}'");
}
common::printIcon('release', 'edit', "releaseID=$release->id", $release);
common::printIcon('release', 'delete', "releaseID=$release->id", $release, 'button', 'trash', 'hiddenwin');
if(common::hasPriv('release', 'edit')) echo html::a($this->createLink('release', 'edit', "releaseID=$release->id"), "<i class='icon-common-edit icon-edit'></i> " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}'");
if(common::hasPriv('release', 'delete')) echo html::a($this->createLink('release', 'delete', "releaseID=$release->id"), "<i class='icon-common-delete icon-trash'></i> " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin'");
}
?>
</div>
+8 -1
View File
@@ -24,7 +24,14 @@ class reportModel extends model
{
$sum = 0;
foreach($datas as $data) $sum += $data->value;
foreach($datas as $data) $data->percent = round($data->value / $sum, 4);
$totalPercent = 0;
foreach($datas as $i => $data)
{
$data->percent = round($data->value / $sum, 4);
$totalPercent += $data->percent;
}
if(isset($i)) $datas[$i]->percent = round(1 - $totalPercent + $datas[$i]->percent, 4);
return $datas;
}
+10 -2
View File
@@ -16,7 +16,7 @@ include '../../common/view/datepicker.html.php';
include '../../common/view/chosen.html.php';
$formId = 'searchForm-' . uniqid('');
$fieldWidth = $app->getClientLang() == 'en' ? 'w-130px' : 'w-110px';
$operatorWidth = $app->getClientLang() == 'en' ? 'w-110px' : 'w-100px';
$operatorWidth = $app->getClientLang() == 'en' ? 'w-100px' : 'w-90px';
?>
<style>
#selectPeriod {padding: 4px 0; height: 197px; min-width: 120px}
@@ -26,7 +26,11 @@ $operatorWidth = $app->getClientLang() == 'en' ? 'w-110px' : 'w-100px';
#<?php echo $formId;?> > table > tbody > tr > td {padding: 8px;}
#<?php echo $formId;?> .form-actions {padding-bottom: 20px; padding-top: 0;}
#<?php echo $formId;?> .chosen-container[id^="field"] .chosen-drop {min-width: 180px;}
<?php if($app->getClientLang() == 'en'):?>
#<?php echo $formId;?> [id^="valueBox"] .chosen-container .chosen-single {min-width: 70px;}
<?php else:?>
#<?php echo $formId;?> [id^="valueBox"] .chosen-container .chosen-single {min-width: 100px;}
<?php endif;?>
#<?php echo $formId;?> [id^="valueBox"] .chosen-container .chosen-drop {min-width: 300px;}
#<?php echo $formId;?> .chosen-container .chosen-drop ul.chosen-results li {white-space:normal}
#<?php echo $formId;?> input.date::-webkit-input-placeholder {color: #838A9D; opacity: 1;}
@@ -36,6 +40,10 @@ $operatorWidth = $app->getClientLang() == 'en' ? 'w-110px' : 'w-100px';
#<?php echo $formId;?> .btn-expand-form:hover {background: #e9f2fb;}
.showmore .btn-expand-form .icon-chevron-double-down:before {content: '\e959';}
#queryBox select[id^="operator"] {padding-right:2px; padding-left:5px;}
#queryBox select#groupAndOr {padding-right:2px; padding-left:5px;}
#queryBox .chosen-container-single .chosen-single>span {margin-right:5px;}
#userQueries {border-left: 1px solid #eee; vertical-align: top;}
#userQueries > h4 {margin: 0 0 6px;}
#userQueries ul {list-style: none; padding-left: 0; margin: 0; max-height:75px; overflow:auto;}
@@ -131,7 +139,7 @@ foreach($fieldParams as $fieldName => $param)
</tbody>
</table>
</td>
<td class='text-center nobr w-80px'><?php echo html::select('groupAndOr', $lang->search->andor, $formSession['groupAndOr'], "class='form-control'")?></td>
<td class='text-center nobr w-70px'><?php echo html::select('groupAndOr', $lang->search->andor, $formSession['groupAndOr'], "class='form-control'")?></td>
<td class='w-400px'>
<table class='table table-form'>
<tbody>
+1 -1
View File
@@ -102,7 +102,7 @@ $config->story->datatable->fieldList['estimate']['required'] = 'no';
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
$config->story->datatable->fieldList['stage']['width'] = '70';
$config->story->datatable->fieldList['stage']['width'] = '80';
$config->story->datatable->fieldList['stage']['required'] = 'no';
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
+2
View File
@@ -13,6 +13,7 @@ $lang->story->create = "提需求";
$lang->story->batchCreate = "批量創建";
$lang->story->change = "變更";
$lang->story->changed = '需求變更';
$lang->story->assignTo = '指派';
$lang->story->review = '評審';
$lang->story->batchReview = '批量評審';
$lang->story->edit = "編輯";
@@ -58,6 +59,7 @@ $lang->story->sourceNote = '來源備註';
$lang->story->fromBug = '來源Bug';
$lang->story->title = '需求名稱';
$lang->story->spec = '需求描述';
$lang->story->assign = '指派給';
$lang->story->verify = '驗收標準';
$lang->story->pri = '優先順序';
$lang->story->estimate = '預計工時';
+13
View File
@@ -82,6 +82,19 @@ class storyModel extends model
->fetchAll('id');
}
/**
* Get test stories.
*
* @param array $storyIdList
* @param int $projectID
* @access public
* @return array
*/
public function getTestStories($storyIdList, $projectID)
{
return $this->dao->select('story')->from(TABLE_TASK)->where('project')->eq($projectID)->andWhere('type')->eq('test')->andWhere('story')->in($storyIdList)->fetchPairs('story', 'story');
}
/**
* Get story specs.
*
+1 -9
View File
@@ -172,14 +172,6 @@ class task extends control
$members = $this->project->getTeamMemberPairs($projectID, 'nodeleted');
$moduleOptionMenu = $this->tree->getTaskOptionMenu($projectID);
/* Get no test stories. */
$testStoryIdList = $this->dao->select('story')->from(TABLE_TASK)->where('project')->eq($projectID)->andWhere('story')->in(array_keys($stories))->fetchPairs('story', 'story');
$noTestStories = array();
foreach($stories as $id => $title)
{
if(!isset($testStoryIdList[$id])) $noTestStories[$id] = $title;
}
$title = $project->name . $this->lang->colon . $this->lang->task->create;
$position[] = html::a($taskLink, $project->name);
$position[] = $this->lang->task->common;
@@ -199,7 +191,7 @@ class task extends control
$this->view->task = $task;
$this->view->users = $users;
$this->view->stories = $stories;
$this->view->noTestStories = $noTestStories;
$this->view->testStoryIdList = $this->loadModel('story')->getTestStories(array_keys($stories), $project->id);
$this->view->members = $members;
$this->view->moduleOptionMenu = $moduleOptionMenu;
$this->display();
+7
View File
@@ -10,5 +10,12 @@
#testStoryBox table tr td{padding:0px;}
#testStoryBox table tr td .chosen-container .chosen-single{border:0px;}
#testStoryBox table tr td .chosen-compact.chosen-container-single .chosen-single>.chosen-search{top:0;right:0;left:0}
#testStoryBox table tr td input{border:0px;}
#testStoryBox table tr td .input-group .input-group-addon{border-left:1px solid #dcdcdc;border-right:1px solid #dcdcdc;}
#testStoryBox table button.btn{border:0px;}
.chosen-results > li.has-test,
.chosen-results > li.has-new-test {position: relative; color: #388E3C;}
.chosen-results > li.has-test.highlighted,
.chosen-results > li.has-new-test.highlighted {color: #fff;}
+56 -2
View File
@@ -259,12 +259,12 @@ function addItem(obj)
var $nextTr = $tr.next();
$nextTr.find('#testAssignedTo').val($('#assignedTo').val());
$nextTr.find('#testStory').closest('td').find('.chosen-container').remove();
$nextTr.find('#testStory').closest('td').find('select').chosen();
$nextTr.find('#testStory').closest('td').find('select').val('').chosen();
$nextTr.find('#testPri').closest('td').find('.chosen-container').remove();
$nextTr.find('#testPri').closest('td').find('select').chosen();
$nextTr.find('#testAssignedTo').closest('td').find('.chosen-container').remove();
$nextTr.find('#testAssignedTo').closest('td').find('select').chosen();
$nextTr.find('.form-date').datepicker();
$nextTr.find('.form-date').val('').datepicker();
}
function removeItem(obj)
@@ -272,6 +272,48 @@ function removeItem(obj)
if($(obj).closest('table').find('tbody tr').size() > 1) $(obj).closest('tr').remove();
}
function markTestStory()
{
$('#testStoryBox select[name^="testStory"]').each(function()
{
var $select = $(this);
$select.find('option').each(function()
{
var $option = $(this);
var value = $option.attr('value');
var tests = testStoryIdList[value];
$option.attr('data-data', value).toggleClass('has-test', !!(tests && tests !== '0'));
});
$select.trigger("chosen:updated");
});
var getStoriesHasTest = function()
{
var storiesHasTest = {};
$('#testStoryBox table tbody>tr').each(function()
{
var $tr = $(this);
storiesHasTest[$tr.find('select[name^="testStory"]').val()] = true;
});
console.log(storiesHasTest);
return storiesHasTest;
};
$('#testStoryBox').on('chosen:showing_dropdown', 'select[name^="testStory"],.chosen-with-drop', function()
{
var storiesHasTest = getStoriesHasTest();
var $container = $(this).closest('td').find('.chosen-container');
setTimeout(function()
{
$container.find('.chosen-results>li').each(function()
{
var $li = $(this);
$li.toggleClass('has-new-test', !!storiesHasTest[$li.data('data')]);
});
}, 100);
});
}
$(document).ready(function()
{
$('#pri').on('change', function()
@@ -288,6 +330,7 @@ $(document).ready(function()
});
setStoryRelated();
markTestStory();
$('#selectAllUser').on('click', function()
{
@@ -299,6 +342,17 @@ $(document).ready(function()
}
});
var preAssign = '';
$('#assignedTo').change(function()
{
var assign = $(this).val();
$('#testStoryBox').find('select[name^="testAssignedTo"]').each(function()
{
if($(this).val() == '' || $(this).val() == preAssign) $(this).val(assign).trigger('chosen:updated');
});
preAssign = assign;
});
$('[data-toggle=tooltip]').tooltip();
$(window).resize();
-1
View File
@@ -106,7 +106,6 @@ $lang->task->team = 'Team';
$lang->task->transfer = 'Transfer';
$lang->task->transferTo = 'Transfer To';
$lang->task->children = 'Child Task';
$lang->task->unlinkParent = 'Unlink Parent';
$lang->task->childrenAB = 'Child';
$lang->task->parent = 'Parent Task';
$lang->task->parentAB = 'Parent Task';
+1 -2
View File
@@ -68,7 +68,7 @@ $lang->task->datePlan = '日程规划';
$lang->task->estStarted = '预计开始';
$lang->task->realStarted = '实际开始';
$lang->task->date = '日期';
$lang->task->deadline = '计划完成';
$lang->task->deadline = '截止日期';
$lang->task->deadlineAB = '截止';
$lang->task->status = '任务状态';
$lang->task->desc = '任务描述';
@@ -106,7 +106,6 @@ $lang->task->team = '团队';
$lang->task->transfer = '转交';
$lang->task->transferTo = '转交给';
$lang->task->children = '子任务';
$lang->task->unlinkParent = '取消子任务';
$lang->task->childrenAB = '子';
$lang->task->parent = '父任务';
$lang->task->parentAB = '父';
+5 -3
View File
@@ -68,7 +68,7 @@ $lang->task->datePlan = '日程規劃';
$lang->task->estStarted = '預計開始';
$lang->task->realStarted = '實際開始';
$lang->task->date = '日期';
$lang->task->deadline = '截止日期';
$lang->task->deadline = '計劃完成';
$lang->task->deadlineAB = '截止';
$lang->task->status = '任務狀態';
$lang->task->desc = '任務描述';
@@ -83,8 +83,8 @@ $lang->task->openedDate = '創建日期';
$lang->task->openedDateAB = '創建';
$lang->task->finishedBy = '由誰完成';
$lang->task->finishedByAB = '完成者';
$lang->task->finishedDate = '完成時間';
$lang->task->finishedDateAB = '完成時間';
$lang->task->finishedDate = '實際完成';
$lang->task->finishedDateAB = '實際完成';
$lang->task->finishedList = '完成者列表';
$lang->task->canceledBy = '由誰取消';
$lang->task->canceledDate = '取消時間';
@@ -111,9 +111,11 @@ $lang->task->parent = '父任務';
$lang->task->parentAB = '父';
$lang->task->lblPri = 'P';
$lang->task->lblHour = '(h)';
$lang->task->lblTestStory = '測試需求';
$lang->task->ditto = '同上';
$lang->task->dittoNotice = "該任務與上一任務不屬於同一項目!";
$lang->task->selectTestStory = '選擇測試需求';
$lang->task->selectAllUser = '全部';
$lang->task->noStory = '無需求';
$lang->task->noAssigned = '未指派';
+6 -5
View File
@@ -44,6 +44,7 @@ class taskModel extends model
->join('mailto', ',')
->remove('after,files,labels,assignedTo,uid,storyEstimate,storyDesc,storyPri,team,teamEstimate,teamMember,multiple,teams,contactListMenu,selectTestStory,testStory,testPri,testEstStarted,testDeadline,testAssignedTo,testEstimate')
->get();
if($task->type != 'test') $this->post->set('selectTestStory', 0);
foreach($this->post->assignedTo as $assignedTo)
{
@@ -655,13 +656,13 @@ class taskModel extends model
->setIF($this->post->assignedTo != $oldTask->assignedTo, 'assignedDate', $now)
->setIF($this->post->status == 'wait' and $this->post->left == $oldTask->left and $this->post->consumed == 0 and $this->post->estimate, 'left', $this->post->estimate)
->setIF(isset($_POST['unlinkParent']), 'parent', 0)
->setIF($oldTask->parent > 0 and !$this->post->parent, 'parent', 0)
->setDefault('lastEditedBy', $this->app->user->account)
->add('lastEditedDate', $now)
->stripTags($this->config->task->editor->edit['id'], $this->config->allowedTags)
->join('mailto', ',')
->remove('comment,files,labels,uid,multiple,team,teamEstimate,teamConsumed,teamLeft,contactListMenu,unlinkParent')
->remove('comment,files,labels,uid,multiple,team,teamEstimate,teamConsumed,teamLeft,contactListMenu')
->get();
if($task->consumed < $oldTask->consumed) die(js::error($this->lang->task->error->consumedSmall));
@@ -1043,7 +1044,7 @@ class taskModel extends model
->removeIF(!empty($oldTask->team), 'consumed,left')
->remove('comment')->get();
if(empty($task->team) && $this->post->left == 0)
if($this->post->left == 0)
{
$task->status = 'done';
$task->finishedBy = $this->app->user->account;
@@ -1664,7 +1665,7 @@ class taskModel extends model
public function getProjectTaskPairs($projectID, $status = 'all', $orderBy = 'finishedBy, id_desc')
{
$tasks = array('' => '');
$stmt = $this->dao->select('t1.id, t1.name, t2.realname AS finishedByRealName')
$stmt = $this->dao->select('t1.id,t1.name,t1.parent,t2.realname AS finishedByRealName')
->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_USER)->alias('t2')->on('t1.finishedBy = t2.account')
->where('t1.project')->eq((int)$projectID)
@@ -1672,7 +1673,7 @@ class taskModel extends model
->beginIF($status != 'all')->andWhere('t1.status')->in($status)->fi()
->orderBy($orderBy)
->query();
while($task = $stmt->fetch()) $tasks[$task->id] = "$task->id:$task->finishedByRealName:$task->name";
while($task = $stmt->fetch()) $tasks[$task->id] = ($task->parent > 0 ? "[{$this->lang->task->childrenAB}] " : '') . "$task->id:$task->finishedByRealName:$task->name";
return $tasks;
}
+31 -3
View File
@@ -74,10 +74,10 @@
</td>
</tr>
<?php endif;?>
<?php if($stories and $config->global->flow != 'onlyTask' and $project->type != 'ops'):?>
<tr id='testStoryBox' class='hidden'>
<th><?php echo $lang->task->selectTestStory;?></th>
<td colspan='3'>
<?php if($noTestStories):?>
<table class='table table-form mg-0 table-bordered'>
<thead>
<tr>
@@ -90,8 +90,11 @@
</tr>
</thead>
<tbody>
<?php $i = 0;?>
<?php foreach($stories as $storyID => $storyTitle):?>
<?php if(empty($storyID) or isset($testStoryIdList[$storyID])) continue;?>
<tr>
<td><?php echo html::select("testStory[]", $noTestStories, '', "class='form-control chosen'");?></td>
<td><?php echo html::select("testStory[]", $stories, $storyID, "class='form-control chosen'");?></td>
<td><?php echo html::select("testPri[]", $lang->task->priList, $task->pri, "class='form-control chosen'");?></td>
<td>
<div class='input-group'>
@@ -109,11 +112,35 @@
</div>
</td>
</tr>
<?php $i++;?>
<?php if($i >= 5) break;?>
<?php endforeach;?>
<?php if($i == 0):?>
<tr>
<td><?php echo html::select("testStory[]", $stories, '', "class='form-control chosen'");?></td>
<td><?php echo html::select("testPri[]", $lang->task->priList, $task->pri, "class='form-control chosen'");?></td>
<td>
<div class='input-group'>
<?php echo html::input("testEstStarted[]", $task->estStarted, "class='form-control form-date' placeholder='{$lang->task->estStarted}'");?>
<span class='input-group-addon fix-border'>~</span>
<?php echo html::input("testDeadline[]", $task->deadline, "class='form-control form-date' placeholder='{$lang->task->deadline}'");?>
</div>
</td>
<td><?php echo html::select("testAssignedTo[]", $members, $task->assignedTo, "class='form-control chosen'");?></td>
<td><?php echo html::input("testEstimate[]", '', "class='form-control'");?></td>
<td class='text-center'>
<div class="btn-group">
<button type="button" class="btn btn-sm" tabindex="-1" onclick='addItem(this)'><i class="icon icon-plus"></i></button>
<button type="button" class="btn btn-sm" tabindex="-1" onclick='removeItem(this)'><i class="icon icon-close"></i></button>
</div>
</td>
</tr>
<?php endif;?>
</tbody>
</table>
<?php endif;?>
</td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->task->name;?></th>
<td colspan='3'>
@@ -262,4 +289,5 @@
</form>
</div>
</div>
<?php js::set('testStoryIdList', $testStoryIdList);?>
<?php include '../../common/view/footer.html.php';?>
+1 -7
View File
@@ -103,18 +103,12 @@
<td><span id="storyIdBox"><?php echo html::select('story', $stories, $task->story, "class='form-control chosen'");?></span></td>
</tr>
<?php endif;?>
<?php if($task->parent == 0 and empty($task->team)):?>
<?php if($task->parent >= 0 and empty($task->team)):?>
<tr>
<th><?php echo $lang->task->parent;?></th>
<td><?php echo html::select('parent', $tasks, $task->parent, "class='form-control chosen'");?></td>
</tr>
<?php endif;?>
<?php if($task->parent > 0):?>
<tr>
<th><?php echo $lang->task->unlinkParent;?></th>
<td><?php echo html::checkbox('unlinkParent', '');?></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->task->assignedTo;?></th>
<td><span id="assignedToIdBox"><?php echo html::select('assignedTo', $members, $task->assignedTo, "class='form-control chosen'");?></span></td>
+14 -14
View File
@@ -247,7 +247,7 @@
</tr>
<?php endif;?>
<tr>
<th><?php echo empty($task->team) ? $lang->task->assignTo : $lang->task->transferTo;?></th>
<th><?php echo $lang->task->assignedTo;?></th>
<td><?php echo $task->assignedTo ? $task->assignedToRealName . $lang->at . $task->assignedDate : $lang->noData;?></td>
</tr>
<tr>
@@ -343,8 +343,20 @@
<div class="detail-content">
<table class='table table-data'>
<?php $widthClass = $app->getClientLang() == 'en' ? 'w-90px' : 'w-70px';?>
<tr class='<?php echo $widthClass;?>'>
<th><?php echo $lang->task->estimate;?></th>
<td><?php echo $task->estimate . $lang->workingHour;?></td>
</tr>
<tr>
<th class='<?php echo $widthClass;?>'><?php echo $lang->task->estStarted;?></th>
<th><?php echo $lang->task->consumed;?></th>
<td><?php echo round($task->consumed, 2) . $lang->workingHour;?></td>
</tr>
<tr>
<th><?php echo $lang->task->left;?></th>
<td><?php echo $task->left . $lang->workingHour;?></td>
</tr>
<tr>
<th><?php echo $lang->task->estStarted;?></th>
<td><?php echo $task->estStarted;?></td>
</tr>
<tr>
@@ -360,18 +372,6 @@
?>
</td>
</tr>
<tr>
<th><?php echo $lang->task->estimate;?></th>
<td><?php echo $task->estimate . $lang->workingHour;?></td>
</tr>
<tr>
<th><?php echo $lang->task->consumed;?></th>
<td><?php echo round($task->consumed, 2) . $lang->workingHour;?></td>
</tr>
<tr>
<th><?php echo $lang->task->left;?></th>
<td><?php echo $task->left . $lang->workingHour;?></td>
</tr>
</table>
</div>
</details>
+7 -6
View File
@@ -986,16 +986,17 @@ class testcase extends control
public function confirmLibcaseChange($caseID, $libcaseID)
{
$case = $this->testcase->getById($caseID);
$version = $case->fromCaseVersion;
$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)
$libCase = $this->testcase->getById($libcaseID);
$version = $case->version + 1;
$this->dao->update(TABLE_CASE)->set('version')->eq($version)->set('fromCaseVersion')->eq($version)->where('id')->eq($caseID)->exec();
foreach($libCase->steps as $step)
{
unset($step->id);
$step->case = $caseID;
$step->case = $caseID;
$step->version = $version;
$this->dao->insert(TABLE_CASESTEP)->data($step)->exec();
}
die(js::reload('parent'));
die(js::locate($this->createLink('testcase', 'view', "caseID=$caseID&version=$version"), 'parent'));
}
/**
+1
View File
@@ -87,6 +87,7 @@ $lang->testcase->edit = "Edit";
$lang->testcase->batchEdit = "Batch Edit ";
$lang->testcase->batchChangeModule = "Batch Change Module";
$lang->testcase->confirmLibcaseChange = "Confirm Library Case Change";
$lang->testcase->ignoreLibcaseChange = "Ignore Library Case Change";
$lang->testcase->batchChangeBranch = "Batch Change Branch";
$lang->testcase->groupByStories = 'Group by Story';
$lang->testcase->delete = "Delete";
+1
View File
@@ -87,6 +87,7 @@ $lang->testcase->edit = "编辑";
$lang->testcase->batchEdit = "批量编辑 ";
$lang->testcase->batchChangeModule = "批量修改模块";
$lang->testcase->confirmLibcaseChange = "同步用例库用例修改";
$lang->testcase->ignoreLibcaseChange = "忽略用例库用例修改";
$lang->testcase->batchChangeBranch = "批量修改分支";
$lang->testcase->groupByStories = '需求分组';
$lang->testcase->delete = "删除";
+2
View File
@@ -65,6 +65,7 @@ $lang->testcase->createBug = '轉Bug';
$lang->testcase->fromModule = '來源模組';
$lang->testcase->fromCase = '來源用例';
$lang->testcase->sync = '同步';
$lang->testcase->ignore = '忽略';
$lang->testcase->fromTesttask = '測試單用例';
$lang->testcase->fromCaselib = '用例庫用例';
$lang->case = $lang->testcase; // 用於DAO檢查時使用。因為case是系統關鍵字,所以無法定義該模組為case,只能使用testcase,但表還是使用的case。
@@ -86,6 +87,7 @@ $lang->testcase->edit = "編輯";
$lang->testcase->batchEdit = "批量編輯 ";
$lang->testcase->batchChangeModule = "批量修改模組";
$lang->testcase->confirmLibcaseChange = "同步用例庫用例修改";
$lang->testcase->ignoreLibcaseChange = "忽略用例庫用例修改";
$lang->testcase->batchChangeBranch = "批量修改分支";
$lang->testcase->groupByStories = '需求分組';
$lang->testcase->delete = "刪除";
+7 -1
View File
@@ -672,7 +672,13 @@ class testcaseModel extends model
{
$parentStepID = 0;
$isLibCase = ($oldCase->lib and empty($oldCase->product));
if($isLibCase) $this->dao->update(TABLE_CASE)->set('`fromCaseVersion`')->eq($version)->where('`fromCaseID`')->eq($caseID)->exec();
if($isLibCase)
{
$fromcaseVersion = $this->dao->select('fromCaseVersion')->from(TABLE_CASE)->where('fromCaseID')->eq($caseID)->fetch('fromCaseVersion');
$fromcaseVersion += 1;
$this->dao->update(TABLE_CASE)->set('`fromCaseVersion`')->eq($fromcaseVersion)->where('`fromCaseID`')->eq($caseID)->exec();
}
foreach($this->post->steps as $stepID => $stepDesc)
{
if(empty($stepDesc)) continue;
+1 -1
View File
@@ -60,7 +60,7 @@ $lang->testreport->buildSummary = '共測試了<strong>%s</strong>個版本。
$lang->testreport->confirmDelete = '是否刪除該報告?';
$lang->testreport->moreNotice = '更多功能可以參考禪道擴展機制進行擴展,也可以聯繫我們進行定製。';
$lang->testreport->exportNotice = "由<a href='https://www.zentao.net' target='_blank' style='color:grey'>禪道項目管理軟件</a>導出";
$lang->testreport->noReport = "報表還沒有生成,請稍候查看。";
$lang->testreport->noReport = "報表還沒有生成。";
$lang->testreport->foundBugTip = "影響版本在測試輪次內,並且創建時間在測試時間範圍內產生的Bug數。";
$lang->testreport->legacyBugTip = "Bug狀態是激活,或Bug的解決時間在測試結束時間之後。";
$lang->testreport->fromCaseBugTip = "測試時間範圍內,用例執行失敗後創建的Bug。";
+1
View File
@@ -438,6 +438,7 @@ class testtaskModel extends model
*/
public function getLinkableCasesBySuite($productID, $task, $query, $suite, $linkedCases, $pager)
{
if(strpos($query, '`product`') !== false) $query = str_replace('`product`', 't1.`product`', $query);
return $this->dao->select('t1.*,t2.version as version')->from(TABLE_CASE)->alias('t1')
->leftJoin(TABLE_SUITECASE)->alias('t2')->on('t1.id=t2.case')
->where($query)
+10 -10
View File
@@ -38,29 +38,29 @@ $lang->tutorial->tasks['createAccount'] = array('title' => '創建帳號
$lang->tutorial->tasks['createAccount']['nav'] = array('module' => 'user', 'method' => 'create', 'menuModule' => 'company', 'menu' => 'browseUser', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-user-btn', 'targetPageName' => '添加用戶');
$lang->tutorial->tasks['createAccount']['desc'] = "<p>在系統創建一個新的用戶帳號:</p><ul><li data-target='nav'>打開 <span class='task-nav'>組織 <i class='icon icon-angle-right'></i> 用戶 <i class='icon icon-angle-right'></i> 添加用戶</span> 頁面;</li><li data-target='form'>在添加用戶表單中填寫新用戶信息;</li><li data-target='submit'>保存用戶信息。</li></ul>";
$lang->tutorial->tasks['createProduct'] = array('title' => '創建產品');
$lang->tutorial->tasks['createProduct']['nav'] = array('module' => 'product', 'method' => 'create', 'menu' => '#pageNav', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-product-btn', 'targetPageName' => '添加產品');
$lang->tutorial->tasks['createProduct']['desc'] = "<p>在系統創建一個新的產品:</p><ul><li data-target='nav'>打開 <span class='task-nav'>產品 <i class='icon icon-angle-right'></i> 添加產品</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的產品信息;</li><li data-target='submit'>保存產品信息。</li></ul>";
$lang->tutorial->tasks['createProduct'] = array('title' => '創建' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['nav'] = array('module' => 'product', 'method' => 'create', 'menu' => '#pageNav', 'form' => '#createForm', 'submit' => '#submit', 'target' => '.create-product-btn', 'targetPageName' => '添加' . $lang->productCommon);
$lang->tutorial->tasks['createProduct']['desc'] = "<p>在系統創建一個新的{$lang->productCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> 添加{$lang->productCommon}</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的{$lang->productCommon}信息;</li><li data-target='submit'>保存{$lang->productCommon}信息。</li></ul>";
$lang->tutorial->tasks['createStory'] = array('title' => '創建需求');
$lang->tutorial->tasks['createStory']['nav'] = array('module' => 'story', 'method' => 'create', 'menuModule' => 'product', 'menu' => 'story', 'target' => '.create-story-btn', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '提需求');
$lang->tutorial->tasks['createStory']['desc'] = "<p>在系統創建一個新的需求:</p><ul><li data-target='nav'>打開 <span class='task-nav'>產品 <i class='icon icon-angle-right'></i> 需求 <i class='icon icon-angle-right'></i> 添加需求</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的需求信息;</li><li data-target='submit'>保存需求信息。</li></ul>";
$lang->tutorial->tasks['createStory']['desc'] = "<p>在系統創建一個新的需求:</p><ul><li data-target='nav'>打開 <span class='task-nav'>{$lang->productCommon} <i class='icon icon-angle-right'></i> 需求 <i class='icon icon-angle-right'></i> 添加需求</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的需求信息;</li><li data-target='submit'>保存需求信息。</li></ul>";
$lang->tutorial->tasks['createProject'] = array('title' => '創建項目');
$lang->tutorial->tasks['createProject']['nav'] = array('module' => 'project', 'method' => 'create', 'menu' => '#pageNav', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加項目');
$lang->tutorial->tasks['createProject']['desc'] = "<p>在系統創建一個新的項目:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> 添加項目</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的項目信息;</li><li data-target='submit'>保存項目信息。</li></ul>";
$lang->tutorial->tasks['createProject'] = array('title' => '創建' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['nav'] = array('module' => 'project', 'method' => 'create', 'menu' => '#pageNav', 'form' => '#dataform', 'submit' => '#submit', 'target' => '.create-project-btn', 'targetPageName' => '添加' . $lang->projectCommon);
$lang->tutorial->tasks['createProject']['desc'] = "<p>在系統創建一個新的{$lang->projectCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 添加{$lang->projectCommon}</span> 頁面;</li><li data-target='form'>在表單中填寫要創建的{$lang->projectCommon}信息;</li><li data-target='submit'>保存{$lang->projectCommon}信息。</li></ul>";
$lang->tutorial->tasks['manageTeam'] = array('title' => '管理團隊');
$lang->tutorial->tasks['manageTeam']['nav'] = array('module' => 'project', 'method' => 'managemembers', 'menu' => 'team', 'target' => '.manage-team-btn', 'form' => '#teamForm', 'requiredFields' => 'account1', 'submit' => '#submit', 'targetPageName' => '團隊管理');
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>管理項目團隊成員:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> 團隊 <i class='icon icon-angle-right'></i> 團隊管理</span> 頁面;</li><li data-target='form'>選擇要加入團隊的成員;</li><li data-target='submit'>保存團隊成員信息。</li></ul>";
$lang->tutorial->tasks['manageTeam']['desc'] = "<p>管理{$lang->projectCommon}團隊成員:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 團隊 <i class='icon icon-angle-right'></i> 團隊管理</span> 頁面;</li><li data-target='form'>選擇要加入團隊的成員;</li><li data-target='submit'>保存團隊成員信息。</li></ul>";
$lang->tutorial->tasks['linkStory'] = array('title' => '關聯需求');
$lang->tutorial->tasks['linkStory']['nav'] = array('module' => 'project', 'method' => 'linkStory', 'menu' => 'story', 'target' => '.link-story-btn', 'form' => '#linkStoryForm', 'formType' => 'table', 'submit' => '#submit', 'targetPageName' => '關聯需求');
$lang->tutorial->tasks['linkStory']['desc'] = "<p>將需求關聯到項目:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> 需求 <i class='icon icon-angle-right'></i> 關聯需求</span> 頁面;</li><li data-target='form'>在需求列表中勾選要關聯的需求;</li><li data-target='submit'>保存關聯的需求信息。</li></ul>";
$lang->tutorial->tasks['linkStory']['desc'] = "<p>將需求關聯到{$lang->projectCommon}:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 需求 <i class='icon icon-angle-right'></i> 關聯需求</span> 頁面;</li><li data-target='form'>在需求列表中勾選要關聯的需求;</li><li data-target='submit'>保存關聯的需求信息。</li></ul>";
$lang->tutorial->tasks['createTask'] = array('title' => '分解任務');
$lang->tutorial->tasks['createTask']['nav'] = array('module' => 'task', 'method' => 'create', 'menuModule' => 'project', 'menu' => 'story', 'target' => '.btn-task-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '建任務');
$lang->tutorial->tasks['createTask']['desc'] = "<p>將項目需求分解為任務:</p><ul><li data-target='nav'>打開 <span class='task-nav'> 項目 <i class='icon icon-angle-right'></i> 需求 <i class='icon icon-angle-right'></i> 分解任務</span> 頁面;</li><li data-target='form'>在表單中填寫任務信息;</li><li data-target='submit'>保存任務信息。</li></ul>";
$lang->tutorial->tasks['createTask']['desc'] = "<p>將{$lang->projectCommon}需求分解為任務:</p><ul><li data-target='nav'>打開 <span class='task-nav'> {$lang->projectCommon} <i class='icon icon-angle-right'></i> 需求 <i class='icon icon-angle-right'></i> 分解任務</span> 頁面;</li><li data-target='form'>在表單中填寫任務信息;</li><li data-target='submit'>保存任務信息。</li></ul>";
$lang->tutorial->tasks['createBug'] = array('title' => '提Bug');
$lang->tutorial->tasks['createBug']['nav'] = array('module' => 'bug', 'method' => 'create', 'menuModule' => 'qa', 'menu' => 'bug', 'target' => '.btn-bug-create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '提Bug');
+1
View File
@@ -103,3 +103,4 @@ $lang->upgrade->fromVersions['10_6'] = '10.6';
$lang->upgrade->fromVersions['11_0'] = '11.0';
$lang->upgrade->fromVersions['11_1'] = '11.1';
$lang->upgrade->fromVersions['11_2'] = '11.2';
$lang->upgrade->fromVersions['11_3'] = '11.3';
+2
View File
@@ -369,6 +369,7 @@ class upgradeModel extends model
$this->processDocLibAcl();
case '11_3':
$this->saveLogs('Execute 11_3');
$this->execSQL($this->getUpgradeFile('11.3'));
$this->addPriv11_4();
}
@@ -500,6 +501,7 @@ class upgradeModel extends model
$confirmContent .= file_get_contents($xuanxuanSql);
}
case '11_2': $confirmContent .= file_get_contents($this->getUpgradeFile('11.2'));
case '11_3': $confirmContent .= file_get_contents($this->getUpgradeFile('11.3'));
}
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
}
+1 -1
View File
@@ -23,7 +23,7 @@
</div>
<form class="load-indicator main-form form-ajax" id="createForm" method="post" target='hiddenwin'>
<table align='center' class="table table-form">
<?php $thClass = (isset($config->isINT) and $config->isINT) ? 'w-enVerifyPassword' : 'w-verifyPassword';?>
<?php $thClass = ($app->getClientLang() == 'en') ? 'w-enVerifyPassword' : 'w-verifyPassword';?>
<tr>
<th class='<?php echo $thClass?>'><?php echo $lang->user->dept;?></th>
<td class='w-p40'><?php echo html::select('dept', $depts, $deptID, "class='form-control chosen'");?></td>
+2 -2
View File
@@ -48,7 +48,7 @@
</table>
<table align='center' class='table table-form'>
<caption class='text-left text-muted'><?php echo $lang->user->accountInfo;?></caption>
<?php $thClass = (isset($config->isINT) and $config->isINT) ? 'w-130px' : 'w-90px';?>
<?php $thClass = ($app->getClientLang() == 'en') ? 'w-130px' : 'w-90px';?>
<tr>
<th class='w-100px'><?php echo $lang->user->account;?></th>
<td class='w-p40'><?php echo html::input('account', $user->account, "class='form-control'");?></td>
@@ -94,7 +94,7 @@
</table>
<table align='center' class='table table-form'>
<caption class='text-left text-muted'><?php echo $lang->user->verify;?></caption>
<?php $thClass = (isset($config->isINT) and $config->isINT) ? 'w-enVerifyPassword' : 'w-verifyPassword';?>
<?php $thClass = ($app->getClientLang() == 'en') ? 'w-enVerifyPassword' : 'w-verifyPassword';?>
<tr>
<th class='<?php echo $thClass?>'><?php echo $lang->user->verifyPassword;?></th>
<td>
+13 -10
View File
@@ -731,18 +731,21 @@ function convertURL()
{
if($('.article-content, .article>.content').size() == 0) return;
var aTags = new Array();
var content = $('.article-content, .article>.content').html();
$('.article-content, .article>.content').find('a').each(function(i)
$('.article-content, .article>.content').each(function()
{
aTags[i] = $(this).prop('outerHTML');
content = content.replace(aTags[i], '<REPLACE_' + i + '>');
});
var aTags = new Array();
var content = $(this).html();
$(this).find('a').each(function(i)
{
aTags[i] = $(this).prop('outerHTML');
content = content.replace(aTags[i], '<REPLACE_' + i + '>');
});
var regexp = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|\&|-|%|;)+)/g;
content = content.replace(regexp, function($url){ return "<a href='" + $url + "' target='_blank'>" + $url + "</a>";});
for(i in aTags) content = content.replace('<REPLACE_' + i + '>', aTags[i]);
$('.article-content, .article>.content').html(content);
var regexp = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|\&|-|%|;)+)/g;
content = content.replace(regexp, function($url){ return "<a href='" + $url + "' target='_blank'>" + $url + "</a>";});
for(i in aTags) content = content.replace('<REPLACE_' + i + '>', aTags[i]);
$(this).html(content);
});
}
/* Ping the server every some minutes to keep the session. */
@@ -11,6 +11,12 @@ $lang->chat->getChatUsers = 'Get Chat Users';
$lang->chat->getChatGroups = 'Get Chat Groups';
$lang->chat->notifyMSG = 'Notify';
$lang->chat->createBug = 'Create Bug';
$lang->chat->createDoc = 'Create Doc';
$lang->chat->createStory = 'Create Story';
$lang->chat->createTask = 'Create Task';
$lang->chat->createTodo = 'Create Todo';
$lang->chat->turnonList = array();
$lang->chat->turnonList[1] = 'Enable';
$lang->chat->turnonList[0] = 'Disable';
@@ -11,6 +11,12 @@ $lang->chat->getChatUsers = '获取用户';
$lang->chat->getChatGroups = '获取讨论组';
$lang->chat->notifyMSG = '消息通知';
$lang->chat->createBug = '创建 Bug';
$lang->chat->createDoc = '创建文档';
$lang->chat->createStory = '创建需求';
$lang->chat->createTask = '创建任务';
$lang->chat->createTodo = '创建待办';
$lang->chat->turnonList = array();
$lang->chat->turnonList[1] = '是';
$lang->chat->turnonList[0] = '否';
-27
View File
@@ -1,27 +0,0 @@
<?php
/* Set the error reporting. */
error_reporting(E_ALL);
/* Start output buffer. */
ob_start();
/* Define the run mode as front. */
define('RUN_MODE', 'upgrade');
/* Load the framework. */
include '../framework/xuanxuan.class.php';
include '../framework/control.class.php';
include '../framework/model.class.php';
include '../framework/helper.class.php';
/* Log the time and define the run mode. */
$startTime = getTime();
/* Run the app. */
$appName = 'sys';
$app = xuanxuan::createApp($appName, dirname(dirname(__FILE__)), 'xuanxuan');
$common = $app->loadCommon();
$common->loadModel('chat')->upgrade();
/* Flush the buffer. */
echo helper::removeUTF8Bom(ob_get_clean());