Merge branch 'master' of https://github.com/easysoft/zentaopms
This commit is contained in:
+4
-2
@@ -17,7 +17,7 @@ if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* Basic settings. */
|
||||
$config = new config();
|
||||
$config->version = '9.0.1'; // The version of zentaopms. Don't change it.
|
||||
$config->version = '9.1'; // The version of zentaopms. Don't change it.
|
||||
$config->charset = 'UTF-8'; // The charset of zentaopms.
|
||||
$config->cookieLife = time() + 2592000; // The cookie life time.
|
||||
$config->timezone = 'Asia/Shanghai'; // The time zone setting, for more see http://www.php.net/manual/en/timezones.php
|
||||
@@ -172,6 +172,7 @@ define('TABLE_BLOCK', '`' . $config->db->prefix . 'block`');
|
||||
define('TABLE_DOCCONTENT', '`' . $config->db->prefix . 'doccontent`');
|
||||
define('TABLE_TESTSUITE', '`' . $config->db->prefix . 'testsuite`');
|
||||
define('TABLE_SUITECASE', '`' . $config->db->prefix . 'suitecase`');
|
||||
define('TABLE_TESTREPORT', '`' . $config->db->prefix . 'testreport`');
|
||||
if(!defined('TABLE_LANG')) define('TABLE_LANG', '`' . $config->db->prefix . 'lang`');
|
||||
|
||||
$config->objectTables['product'] = TABLE_PRODUCT;
|
||||
@@ -186,6 +187,7 @@ $config->objectTables['case'] = TABLE_CASE;
|
||||
$config->objectTables['testcase'] = TABLE_CASE;
|
||||
$config->objectTables['testtask'] = TABLE_TESTTASK;
|
||||
$config->objectTables['testsuite'] = TABLE_TESTSUITE;
|
||||
$config->objectTables['testreport'] = TABLE_TESTREPORT;
|
||||
$config->objectTables['user'] = TABLE_USER;
|
||||
$config->objectTables['doc'] = TABLE_DOC;
|
||||
$config->objectTables['doclib'] = TABLE_DOCLIB;
|
||||
@@ -193,7 +195,7 @@ $config->objectTables['todo'] = TABLE_TODO;
|
||||
$config->objectTables['custom'] = TABLE_LANG;
|
||||
$config->objectTables['branch'] = TABLE_BRANCH;
|
||||
$config->objectTables['module'] = TABLE_MODULE;
|
||||
$config->objectTables['testlib'] = TABLE_TESTSUITE;
|
||||
$config->objectTables['caselib'] = TABLE_TESTSUITE;
|
||||
|
||||
/* Include extension config files. */
|
||||
$extConfigFiles = glob($configRoot . 'ext/*.php');
|
||||
|
||||
+28
-3
@@ -1,4 +1,4 @@
|
||||
CREATE TABLE `zt_testsuite` (
|
||||
CREATE TABLE IF NOT EXISTS `zt_testsuite` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`product` mediumint(8) unsigned NOT NULL,
|
||||
`name` varchar(255) NOT NULL,
|
||||
@@ -11,7 +11,7 @@ CREATE TABLE `zt_testsuite` (
|
||||
`deleted` enum('0','1') NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_suitecase` (
|
||||
CREATE TABLE IF NOT EXISTS `zt_suitecase` (
|
||||
`suite` mediumint(8) unsigned NOT NULL,
|
||||
`product` mediumint(8) unsigned NOT NULL,
|
||||
`case` mediumint(8) unsigned NOT NULL,
|
||||
@@ -19,6 +19,31 @@ CREATE TABLE `zt_suitecase` (
|
||||
UNIQUE KEY `suitecase` (`suite`,`case`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
ALTER TABLE `zt_case` ADD `lib` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `branch`;
|
||||
ALTER TABLE `zt_case` ADD `fromLib` mediumint(8) unsigned NOT NULL AFTER `fromBug`;
|
||||
ALTER TABLE `zt_case` ADD `fromCaseID` mediumint(8) unsigned NOT NULL AFTER `fromBug`;
|
||||
ALTER TABLE `zt_case` ADD `reviewedBy` varchar(255) NOT NULL AFTER `openedDate`;
|
||||
ALTER TABLE `zt_case` ADD `reviewedDate` date NOT NULL AFTER `reviewedBy`;
|
||||
ALTER TABLE `zt_casestep` ADD `parent` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `id`;
|
||||
ALTER TABLE `zt_casestep` ADD `type` varchar(10) NOT NULL DEFAULT 'step' AFTER `version`;
|
||||
CREATE TABLE IF NOT EXISTS `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;
|
||||
ALTER TABLE `zt_bug` ADD `deadline` date NOT NULL AFTER `assignedDate`;
|
||||
|
||||
+154
@@ -73,6 +73,7 @@ CREATE TABLE IF NOT EXISTS `zt_bug` (
|
||||
`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 '',
|
||||
@@ -123,6 +124,7 @@ CREATE TABLE IF NOT EXISTS `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',
|
||||
@@ -144,11 +146,14 @@ CREATE TABLE IF NOT EXISTS `zt_case` (
|
||||
`order` tinyint(30) unsigned NOT NULL default '0',
|
||||
`openedBy` char(30) NOT NULL default '',
|
||||
`openedDate` datetime NOT NULL,
|
||||
`reviewedBy` varchar(255) NOT NULL,
|
||||
`reviewedDate` date NOT NULL,
|
||||
`lastEditedBy` char(30) NOT NULL default '',
|
||||
`lastEditedDate` datetime NOT NULL,
|
||||
`version` tinyint(3) unsigned NOT NULL default '0',
|
||||
`linkCase` varchar(255) NOT NULL,
|
||||
`fromBug` mediumint(8) unsigned NOT NULL,
|
||||
`fromCaseID` mediumint(8) unsigned NOT NULL,
|
||||
`deleted` enum('0','1') NOT NULL default '0',
|
||||
`lastRunner` varchar(30) NOT NULL,
|
||||
`lastRunDate` datetime NOT NULL,
|
||||
@@ -159,8 +164,10 @@ CREATE TABLE IF NOT EXISTS `zt_case` (
|
||||
-- DROP TABLE IF EXISTS `zt_casestep`;
|
||||
CREATE TABLE IF NOT EXISTS `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`),
|
||||
@@ -553,6 +560,14 @@ CREATE TABLE IF NOT EXISTS `zt_storystage` (
|
||||
`stage` varchar(50) NOT NULL,
|
||||
KEY `story` (`story`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_suitecase`;
|
||||
CREATE TABLE IF NOT EXISTS `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;
|
||||
-- DROP TABLE IF EXISTS `zt_task`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_task` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
@@ -613,6 +628,29 @@ CREATE TABLE IF NOT EXISTS `zt_team` (
|
||||
`hours` float(2,1) unsigned NOT NULL default '0',
|
||||
PRIMARY KEY (`project`,`account`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_testreport`;
|
||||
CREATE TABLE IF NOT EXISTS `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;
|
||||
-- DROP TABLE IF EXISTS `zt_testresult`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_testresult` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
@@ -640,6 +678,20 @@ CREATE TABLE IF NOT EXISTS `zt_testrun` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `task` (`task`,`case`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_testsuite`;
|
||||
CREATE TABLE IF NOT EXISTS `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`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
-- DROP TABLE IF EXISTS `zt_testtask`;
|
||||
CREATE TABLE IF NOT EXISTS `zt_testtask` (
|
||||
`id` mediumint(8) unsigned NOT NULL auto_increment,
|
||||
@@ -1080,6 +1132,10 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(1, 'testcase', 'createBug'),
|
||||
(1, 'testcase', 'delete'),
|
||||
(1, 'testcase', 'edit'),
|
||||
(1, 'testcase', 'review'),
|
||||
(1, 'testcase', 'batchReview'),
|
||||
(1, 'testcase', 'batchCaseTypeChange'),
|
||||
(1, 'testcase', 'batchConfirmStoryChange'),
|
||||
(1, 'testcase', 'batchChangeModule'),
|
||||
(1, 'testcase', 'linkCases'),
|
||||
(1, 'testcase', 'unlinkCase'),
|
||||
@@ -1090,6 +1146,25 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(1, 'testcase', 'index'),
|
||||
(1, 'testcase', 'showImport'),
|
||||
(1, 'testcase', 'view'),
|
||||
(1, 'testcase', 'importFromLib'),
|
||||
(1, 'testreport', 'browse'),
|
||||
(1, 'testreport', 'create'),
|
||||
(1, 'testreport', 'view'),
|
||||
(1, 'testreport', 'delete'),
|
||||
(1, 'testreport', 'edit'),
|
||||
(1, 'testsuite', 'index'),
|
||||
(1, 'testsuite', 'browse'),
|
||||
(1, 'testsuite', 'create'),
|
||||
(1, 'testsuite', 'view'),
|
||||
(1, 'testsuite', 'edit'),
|
||||
(1, 'testsuite', 'delete'),
|
||||
(1, 'testsuite', 'linkCase'),
|
||||
(1, 'testsuite', 'unlinkCase'),
|
||||
(1, 'testsuite', 'batchUnlinkCases'),
|
||||
(1, 'testsuite', 'library'),
|
||||
(1, 'testsuite', 'createLib'),
|
||||
(1, 'testsuite', 'createCase'),
|
||||
(1, 'testsuite', 'libView'),
|
||||
(1, 'testtask', 'batchAssign'),
|
||||
(1, 'testtask', 'batchRun'),
|
||||
(1, 'testtask', 'browse'),
|
||||
@@ -1104,6 +1179,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(1, 'testtask', 'results'),
|
||||
(1, 'testtask', 'runcase'),
|
||||
(1, 'testtask', 'start'),
|
||||
(1, 'testtask', 'activate'),
|
||||
(1, 'testtask', 'block'),
|
||||
(1, 'testtask', 'report'),
|
||||
(1, 'testtask', 'unlinkcase'),
|
||||
(1, 'testtask', 'view'),
|
||||
(1, 'todo', 'batchCreate'),
|
||||
@@ -1287,6 +1365,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(2, 'testcase', 'groupCase'),
|
||||
(2, 'testcase', 'index'),
|
||||
(2, 'testcase', 'view'),
|
||||
(2, 'testsuite', 'index'),
|
||||
(2, 'testsuite', 'browse'),
|
||||
(2, 'testsuite', 'view'),
|
||||
(2, 'testtask', 'browse'),
|
||||
(2, 'testtask', 'cases'),
|
||||
(2, 'testtask', 'create'),
|
||||
@@ -1466,6 +1547,10 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(3, 'testcase', 'create'),
|
||||
(3, 'testcase', 'createBug'),
|
||||
(3, 'testcase', 'edit'),
|
||||
(3, 'testcase', 'review'),
|
||||
(3, 'testcase', 'batchReview'),
|
||||
(3, 'testcase', 'batchCaseTypeChange'),
|
||||
(3, 'testcase', 'batchConfirmStoryChange'),
|
||||
(3, 'testcase', 'batchChangeModule'),
|
||||
(3, 'testcase', 'linkCases'),
|
||||
(3, 'testcase', 'unlinkCase'),
|
||||
@@ -1476,6 +1561,16 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(3, 'testcase', 'index'),
|
||||
(3, 'testcase', 'showImport'),
|
||||
(3, 'testcase', 'view'),
|
||||
(3, 'testreport', 'browse'),
|
||||
(3, 'testreport', 'view'),
|
||||
(3, 'testsuite', 'index'),
|
||||
(3, 'testsuite', 'browse'),
|
||||
(3, 'testsuite', 'create'),
|
||||
(3, 'testsuite', 'view'),
|
||||
(3, 'testsuite', 'edit'),
|
||||
(3, 'testsuite', 'delete'),
|
||||
(3, 'testsuite', 'linkCase'),
|
||||
(3, 'testsuite', 'unlinkCase'),
|
||||
(3, 'testtask', 'batchAssign'),
|
||||
(3, 'testtask', 'batchRun'),
|
||||
(3, 'testtask', 'browse'),
|
||||
@@ -1489,6 +1584,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(3, 'testtask', 'results'),
|
||||
(3, 'testtask', 'runcase'),
|
||||
(3, 'testtask', 'start'),
|
||||
(3, 'testtask', 'activate'),
|
||||
(3, 'testtask', 'block'),
|
||||
(3, 'testtask', 'report'),
|
||||
(3, 'testtask', 'unlinkcase'),
|
||||
(3, 'testtask', 'view'),
|
||||
(3, 'todo', 'batchCreate'),
|
||||
@@ -1701,6 +1799,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(4, 'testcase', 'groupCase'),
|
||||
(4, 'testcase', 'index'),
|
||||
(4, 'testcase', 'view'),
|
||||
(4, 'testsuite', 'index'),
|
||||
(4, 'testsuite', 'browse'),
|
||||
(4, 'testsuite', 'view'),
|
||||
(4, 'testtask', 'batchAssign'),
|
||||
(4, 'testtask', 'browse'),
|
||||
(4, 'testtask', 'cases'),
|
||||
@@ -1947,6 +2048,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(5, 'testcase', 'groupCase'),
|
||||
(5, 'testcase', 'index'),
|
||||
(5, 'testcase', 'view'),
|
||||
(5, 'testcase', 'importFromLib'),
|
||||
(5, 'testsuite', 'index'),
|
||||
(5, 'testsuite', 'browse'),
|
||||
(5, 'testsuite', 'view'),
|
||||
(5, 'testsuite', 'library'),
|
||||
(5, 'testsuite', 'createLib'),
|
||||
(5, 'testsuite', 'createCase'),
|
||||
(5, 'testsuite', 'libView'),
|
||||
(5, 'testtask', 'browse'),
|
||||
(5, 'testtask', 'cases'),
|
||||
(5, 'testtask', 'groupCase'),
|
||||
@@ -2169,6 +2278,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(6, 'testcase', 'groupCase'),
|
||||
(6, 'testcase', 'index'),
|
||||
(6, 'testcase', 'view'),
|
||||
(6, 'testsuite', 'index'),
|
||||
(6, 'testsuite', 'browse'),
|
||||
(6, 'testsuite', 'view'),
|
||||
(6, 'testtask', 'browse'),
|
||||
(6, 'testtask', 'cases'),
|
||||
(6, 'testtask', 'create'),
|
||||
@@ -2398,6 +2510,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(7, 'testcase', 'groupCase'),
|
||||
(7, 'testcase', 'index'),
|
||||
(7, 'testcase', 'view'),
|
||||
(7, 'testcase', 'importFromLib'),
|
||||
(7, 'testsuite', 'index'),
|
||||
(7, 'testsuite', 'browse'),
|
||||
(7, 'testsuite', 'view'),
|
||||
(7, 'testsuite', 'library'),
|
||||
(7, 'testsuite', 'createLib'),
|
||||
(7, 'testsuite', 'createCase'),
|
||||
(7, 'testsuite', 'libView'),
|
||||
(7, 'testtask', 'browse'),
|
||||
(7, 'testtask', 'cases'),
|
||||
(7, 'testtask', 'groupCase'),
|
||||
@@ -2600,6 +2720,10 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(8, 'testcase', 'createBug'),
|
||||
(8, 'testcase', 'delete'),
|
||||
(8, 'testcase', 'edit'),
|
||||
(8, 'testcase', 'review'),
|
||||
(8, 'testcase', 'batchReview'),
|
||||
(8, 'testcase', 'batchCaseTypeChange'),
|
||||
(8, 'testcase', 'batchConfirmStoryChange'),
|
||||
(8, 'testcase', 'batchChangeModule'),
|
||||
(8, 'testcase', 'linkCases'),
|
||||
(8, 'testcase', 'unlinkCase'),
|
||||
@@ -2610,6 +2734,24 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(8, 'testcase', 'index'),
|
||||
(8, 'testcase', 'showImport'),
|
||||
(8, 'testcase', 'view'),
|
||||
(8, 'testcase', 'importFromLib'),
|
||||
(8, 'testreport', 'browse'),
|
||||
(8, 'testreport', 'create'),
|
||||
(8, 'testreport', 'view'),
|
||||
(8, 'testreport', 'delete'),
|
||||
(8, 'testreport', 'edit'),
|
||||
(8, 'testsuite', 'index'),
|
||||
(8, 'testsuite', 'browse'),
|
||||
(8, 'testsuite', 'create'),
|
||||
(8, 'testsuite', 'view'),
|
||||
(8, 'testsuite', 'edit'),
|
||||
(8, 'testsuite', 'delete'),
|
||||
(8, 'testsuite', 'linkCase'),
|
||||
(8, 'testsuite', 'unlinkCase'),
|
||||
(8, 'testsuite', 'library'),
|
||||
(8, 'testsuite', 'createLib'),
|
||||
(8, 'testsuite', 'createCase'),
|
||||
(8, 'testsuite', 'libView'),
|
||||
(8, 'testtask', 'batchAssign'),
|
||||
(8, 'testtask', 'batchRun'),
|
||||
(8, 'testtask', 'browse'),
|
||||
@@ -2624,6 +2766,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(8, 'testtask', 'results'),
|
||||
(8, 'testtask', 'runcase'),
|
||||
(8, 'testtask', 'start'),
|
||||
(8, 'testtask', 'activate'),
|
||||
(8, 'testtask', 'block'),
|
||||
(8, 'testtask', 'report'),
|
||||
(8, 'testtask', 'unlinkcase'),
|
||||
(8, 'testtask', 'view'),
|
||||
(8, 'todo', 'batchCreate'),
|
||||
@@ -2782,6 +2927,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(9, 'testcase', 'groupCase'),
|
||||
(9, 'testcase', 'index'),
|
||||
(9, 'testcase', 'view'),
|
||||
(9, 'testsuite', 'index'),
|
||||
(9, 'testsuite', 'browse'),
|
||||
(9, 'testsuite', 'view'),
|
||||
(9, 'testtask', 'browse'),
|
||||
(9, 'testtask', 'cases'),
|
||||
(9, 'testtask', 'groupCase'),
|
||||
@@ -2898,6 +3046,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(10, 'task', 'editEstimate'),
|
||||
(10, 'task', 'recordEstimate'),
|
||||
(10, 'task', 'view'),
|
||||
(10, 'testsuite', 'index'),
|
||||
(10, 'testsuite', 'browse'),
|
||||
(10, 'testsuite', 'view'),
|
||||
(10, 'todo', 'batchCreate'),
|
||||
(10, 'todo', 'batchEdit'),
|
||||
(10, 'todo', 'batchFinish'),
|
||||
@@ -2989,6 +3140,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(11, 'testcase', 'groupCase'),
|
||||
(11, 'testcase', 'index'),
|
||||
(11, 'testcase', 'view'),
|
||||
(11, 'testsuite', 'index'),
|
||||
(11, 'testsuite', 'browse'),
|
||||
(11, 'testsuite', 'view'),
|
||||
(11, 'testtask', 'browse'),
|
||||
(11, 'testtask', 'cases'),
|
||||
(11, 'testtask', 'groupCase'),
|
||||
|
||||
+204
-146
@@ -1,3 +1,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 用例的时候增加分支/平台字段
|
||||
修复的Bug
|
||||
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
|
||||
完成的需求
|
||||
2214 需求来源的备注可编辑
|
||||
@@ -717,39 +775,39 @@ Bug影响版本为多个时,统计报表无法统计。
|
||||
|
||||
2015-05-22 7.2.stable
|
||||
完成的功能:
|
||||
727 实现模块更换产品功能
|
||||
1260 项目和产品增加拖动排序功能
|
||||
1446 一件安装包控制面板在2012和8.1下面进行测试
|
||||
1518 创建事务类型任务的时候加一个全选按钮
|
||||
1520 提需求页面计划下拉表只显示未过期的计划
|
||||
1530 禅道参照然之里面的做法,直接对视图做权限的控制。
|
||||
1532 项目-需求页面左侧添加模块列表
|
||||
1533 产品、项目的搜索框添加上下按键选择的功能
|
||||
1535 调整测试任务创建页面的名称的文案:版本名称改为 任务名称
|
||||
1536 权限反过来控制。只能限制他访问那些产品或者项目。
|
||||
1537 加强对管理员弱口令的检查。
|
||||
1538 写插件,上传插件的时候需要创建ok文件。
|
||||
1539 搜索自定义标题做striptags, specialchars处理。
|
||||
1540 用例的expect, result也做处理。
|
||||
1541 测试结果也需要做处理。
|
||||
1542 需求的spec也需要做处理。
|
||||
1543 敏感操作增加管理员口令的检查
|
||||
1544 所有项目页面增强按照产品检索功能
|
||||
1545 一键安装包启动之前判断已经安装的服务和当前的路径是否正确。
|
||||
1546 调整版本和发布的关联bug,关联需求的操作。
|
||||
1547 调整计划的关联需求和关联bug页面
|
||||
1557 批量操作页面涉及到数字的文本框取消自动填充功能
|
||||
1564 批量操作页面的chosen控件选择了某一个比较长的值之后,鼠标悬浮,显示title提示。
|
||||
1565 需求的详情页面根据关联的项目的信息增加分解任务的链接。
|
||||
1566 列表页面点击箭头也可以排序。
|
||||
1567 安装和升级页面推荐其他的产品。
|
||||
1568 计划任务增加删除备份的任务项
|
||||
1576 使用zui最新的统计报表程序替换fushincharts
|
||||
1584 升级集成环境里面的ioncube loader
|
||||
1610 为将来的日期添加待办的时候,时间从早晨开始计算
|
||||
1612 让用户选择产品和项目的组合关系
|
||||
1613 产品和项目在判断代号唯一的时候排除已经删除的
|
||||
1617 组织动态搜索的时候日期字段增加日期选择框
|
||||
727 实现模块更换产品功能
|
||||
1260 项目和产品增加拖动排序功能
|
||||
1446 一件安装包控制面板在2012和8.1下面进行测试
|
||||
1518 创建事务类型任务的时候加一个全选按钮
|
||||
1520 提需求页面计划下拉表只显示未过期的计划
|
||||
1530 禅道参照然之里面的做法,直接对视图做权限的控制。
|
||||
1532 项目-需求页面左侧添加模块列表
|
||||
1533 产品、项目的搜索框添加上下按键选择的功能
|
||||
1535 调整测试任务创建页面的名称的文案:版本名称改为 任务名称
|
||||
1536 权限反过来控制。只能限制他访问那些产品或者项目。
|
||||
1537 加强对管理员弱口令的检查。
|
||||
1538 写插件,上传插件的时候需要创建ok文件。
|
||||
1539 搜索自定义标题做striptags, specialchars处理。
|
||||
1540 用例的expect, result也做处理。
|
||||
1541 测试结果也需要做处理。
|
||||
1542 需求的spec也需要做处理。
|
||||
1543 敏感操作增加管理员口令的检查
|
||||
1544 所有项目页面增强按照产品检索功能
|
||||
1545 一键安装包启动之前判断已经安装的服务和当前的路径是否正确。
|
||||
1546 调整版本和发布的关联bug,关联需求的操作。
|
||||
1547 调整计划的关联需求和关联bug页面
|
||||
1557 批量操作页面涉及到数字的文本框取消自动填充功能
|
||||
1564 批量操作页面的chosen控件选择了某一个比较长的值之后,鼠标悬浮,显示title提示。
|
||||
1565 需求的详情页面根据关联的项目的信息增加分解任务的链接。
|
||||
1566 列表页面点击箭头也可以排序。
|
||||
1567 安装和升级页面推荐其他的产品。
|
||||
1568 计划任务增加删除备份的任务项
|
||||
1576 使用zui最新的统计报表程序替换fushincharts
|
||||
1584 升级集成环境里面的ioncube loader
|
||||
1610 为将来的日期添加待办的时候,时间从早晨开始计算
|
||||
1612 让用户选择产品和项目的组合关系
|
||||
1613 产品和项目在判断代号唯一的时候排除已经删除的
|
||||
1617 组织动态搜索的时候日期字段增加日期选择框
|
||||
|
||||
修复的BUG:
|
||||
710 禅道和svn集成功能,注释的字符没有进行安全过滤
|
||||
@@ -921,80 +979,80 @@ Bug影响版本为多个时,统计报表无法统计。
|
||||
644 导入bug时候的指派给时间没有设置
|
||||
631 火狐下面任务的弹出页面上面的边框少了。
|
||||
645 用例csv导入执行次数问题
|
||||
651 我的地盘待办浏览某一天的待办无法批量编辑
|
||||
650 提交bug保存模版下次使用时候显示格式不正确
|
||||
651 我的地盘待办浏览某一天的待办无法批量编辑
|
||||
650 提交bug保存模版下次使用时候显示格式不正确
|
||||
|
||||
2014-08-26 6.2.stable
|
||||
完成的功能:
|
||||
1429 把ajaxform超时的时间拿出来作为参数。
|
||||
481 增加是否需要打开审核流程的配置
|
||||
1254 修改打包脚本,去掉内网服务器
|
||||
984 命令行中的IN_SHELL常量改用PHP_SAPI
|
||||
1322 dao类增加一个方法,可以允许用户直接执行一个sql
|
||||
1173 维护权限的时候应该显示当前维护的分组
|
||||
1422 删除用不到的js控件
|
||||
357 dao增加count(*)的功能
|
||||
1235 项目中新增需求时默认无需评审
|
||||
1165 整理每个页面的标题和position:专业版
|
||||
1207 发布关联bug的时候,不关联解决方案等于延期的bug
|
||||
1371 项目的日志里面记录版本的创建时间和测试任务的提交,完成时间。
|
||||
1436 快速跳转部分去掉圆角
|
||||
808 任务增加暂停状态
|
||||
1114 用例执行失败的时候,可以考虑分步骤提交bug。
|
||||
1349 批量新增bug增加“同上”功能
|
||||
1432 去掉发布和版本里面的“已关联bugs”中的复数s。
|
||||
1055 查看组织日志/TODO时,横向滚动时,锁定前两列的部门及员工姓名。
|
||||
1337 bug创建的时候增加优先级字段
|
||||
1182 计划关联需求时增加按照模块搜索功能
|
||||
1428 任务详情页面显示需求的描述。
|
||||
981 调整各个对象编辑页面的标题文本框的排版
|
||||
1395 添加动态中动作的中文支持
|
||||
315 设定编辑器tabindex
|
||||
1439 调整转入任务时项目列表的算法
|
||||
1217 关于录入工时更新任务的状态
|
||||
1125 当需求,任务,bug的管理或者解决方案为重复的时候,增加搜索功能。
|
||||
1369 重新梳理下邮件错误的提示。
|
||||
1348 查看版本关联bug弹出的页面增加操作按钮
|
||||
1193 项目转入bug作为任务的时候将延期的也放在列表中
|
||||
1431 调整各个新增页面的间距,将其缩小。
|
||||
1262 在项目的下拉菜单中增加所有项目的链接
|
||||
1324 使用lazarus重构windows一键安装包的控制面板
|
||||
1175 搜索,计划应该按照日期倒序排
|
||||
1424 产品页面提需求时如果不需要评审给用户提示评审人会变成指派人
|
||||
1238 提需求时所属计划列表倒序排序
|
||||
1320 重置数据之后,应当提示用户结果
|
||||
1169 需求的详情页显示项目
|
||||
1210 集成环境首页的自动跳转去掉
|
||||
1394 6.0版本更换主题后,指派列表调整对比度,使用户更容易识别内容
|
||||
1438 检查确认编辑器贴图功能是否正常
|
||||
855 各个列表页面增加不同状态颜色的显示
|
||||
1124 重新实现dao里面的检查字符串长度的计算方式
|
||||
1359 项目导入bug的时候,自动计算模块
|
||||
1199 linux一键安装包的控制脚本初始化对xampp变量的设置
|
||||
1434 调整产品各个操作的界面。
|
||||
1347 一键安装包首页居中对齐。
|
||||
1430 模块的编辑,无法编辑名称。
|
||||
483 各个列表页面默认不显示已经关闭的对象
|
||||
1256 对表单提交过来的字段进行specialchars处理。
|
||||
1022 添加需求,任务,bug,文档的时候判断是否重复。
|
||||
1237 任务记录工时的时候在表zt_taskestimate中记录account属性的值
|
||||
905 文档可以修改其所属的文档库
|
||||
1167 邮件配置参数中过滤空格字符
|
||||
1208 项目中bug列表的优先级还是用图标来显示
|
||||
1437 调整桌面提醒工具权限错误的提示
|
||||
1358 计划列表页面描述里面P标签的margin去掉。
|
||||
1433 调整项目各个操作的界面。
|
||||
1343 从用例创建bug的时候,可以选择步骤。
|
||||
1057 重新梳理默认的权限列表
|
||||
1183 调整两个日期选择框同时存在情况下第二个的默认值
|
||||
1429 把ajaxform超时的时间拿出来作为参数。
|
||||
481 增加是否需要打开审核流程的配置
|
||||
1254 修改打包脚本,去掉内网服务器
|
||||
984 命令行中的IN_SHELL常量改用PHP_SAPI
|
||||
1322 dao类增加一个方法,可以允许用户直接执行一个sql
|
||||
1173 维护权限的时候应该显示当前维护的分组
|
||||
1422 删除用不到的js控件
|
||||
357 dao增加count(*)的功能
|
||||
1235 项目中新增需求时默认无需评审
|
||||
1165 整理每个页面的标题和position:专业版
|
||||
1207 发布关联bug的时候,不关联解决方案等于延期的bug
|
||||
1371 项目的日志里面记录版本的创建时间和测试任务的提交,完成时间。
|
||||
1436 快速跳转部分去掉圆角
|
||||
808 任务增加暂停状态
|
||||
1114 用例执行失败的时候,可以考虑分步骤提交bug。
|
||||
1349 批量新增bug增加“同上”功能
|
||||
1432 去掉发布和版本里面的“已关联bugs”中的复数s。
|
||||
1055 查看组织日志/TODO时,横向滚动时,锁定前两列的部门及员工姓名。
|
||||
1337 bug创建的时候增加优先级字段
|
||||
1182 计划关联需求时增加按照模块搜索功能
|
||||
1428 任务详情页面显示需求的描述。
|
||||
981 调整各个对象编辑页面的标题文本框的排版
|
||||
1395 添加动态中动作的中文支持
|
||||
315 设定编辑器tabindex
|
||||
1439 调整转入任务时项目列表的算法
|
||||
1217 关于录入工时更新任务的状态
|
||||
1125 当需求,任务,bug的管理或者解决方案为重复的时候,增加搜索功能。
|
||||
1369 重新梳理下邮件错误的提示。
|
||||
1348 查看版本关联bug弹出的页面增加操作按钮
|
||||
1193 项目转入bug作为任务的时候将延期的也放在列表中
|
||||
1431 调整各个新增页面的间距,将其缩小。
|
||||
1262 在项目的下拉菜单中增加所有项目的链接
|
||||
1324 使用lazarus重构windows一键安装包的控制面板
|
||||
1175 搜索,计划应该按照日期倒序排
|
||||
1424 产品页面提需求时如果不需要评审给用户提示评审人会变成指派人
|
||||
1238 提需求时所属计划列表倒序排序
|
||||
1320 重置数据之后,应当提示用户结果
|
||||
1169 需求的详情页显示项目
|
||||
1210 集成环境首页的自动跳转去掉
|
||||
1394 6.0版本更换主题后,指派列表调整对比度,使用户更容易识别内容
|
||||
1438 检查确认编辑器贴图功能是否正常
|
||||
855 各个列表页面增加不同状态颜色的显示
|
||||
1124 重新实现dao里面的检查字符串长度的计算方式
|
||||
1359 项目导入bug的时候,自动计算模块
|
||||
1199 linux一键安装包的控制脚本初始化对xampp变量的设置
|
||||
1434 调整产品各个操作的界面。
|
||||
1347 一键安装包首页居中对齐。
|
||||
1430 模块的编辑,无法编辑名称。
|
||||
483 各个列表页面默认不显示已经关闭的对象
|
||||
1256 对表单提交过来的字段进行specialchars处理。
|
||||
1022 添加需求,任务,bug,文档的时候判断是否重复。
|
||||
1237 任务记录工时的时候在表zt_taskestimate中记录account属性的值
|
||||
905 文档可以修改其所属的文档库
|
||||
1167 邮件配置参数中过滤空格字符
|
||||
1208 项目中bug列表的优先级还是用图标来显示
|
||||
1437 调整桌面提醒工具权限错误的提示
|
||||
1358 计划列表页面描述里面P标签的margin去掉。
|
||||
1433 调整项目各个操作的界面。
|
||||
1343 从用例创建bug的时候,可以选择步骤。
|
||||
1057 重新梳理默认的权限列表
|
||||
1183 调整两个日期选择框同时存在情况下第二个的默认值
|
||||
|
||||
修复的BUG:
|
||||
598 6.0测试任务中查看用例结果版本信息为空
|
||||
608 bug导入任务后更新任务(或bug)的状态时页面没有跳转
|
||||
610 维护项目文档库的模块时把产品的模块也复制过来了
|
||||
611 燃尽图的delta功能失效
|
||||
622 用例批量创建需求下拉菜单无内容
|
||||
618 权限管理页面去掉Bug自定义
|
||||
598 6.0测试任务中查看用例结果版本信息为空
|
||||
608 bug导入任务后更新任务(或bug)的状态时页面没有跳转
|
||||
610 维护项目文档库的模块时把产品的模块也复制过来了
|
||||
611 燃尽图的delta功能失效
|
||||
622 用例批量创建需求下拉菜单无内容
|
||||
618 权限管理页面去掉Bug自定义
|
||||
|
||||
2014-08-05 6.1.stable
|
||||
完成的功能:
|
||||
@@ -1390,50 +1448,50 @@ pms网站使用手机访问的时候,匿名登录时,查看任务详情的
|
||||
2013-7-8 4.2.beta
|
||||
|
||||
完成的功能:
|
||||
1149 调整产品和项目的下拉菜单样式
|
||||
1148 调整指派给下拉菜单的样式
|
||||
1147 登录界面的宽度控制下
|
||||
1146 调整历史记录的显示样式
|
||||
1144 调整详情里面的操作按钮
|
||||
1143 调整分页导航条的样式
|
||||
1142 页面都通过pjax方式载入
|
||||
1140 在web网站上面提供二维码登录入口
|
||||
1138 在移动web上面实现待办的处理流程
|
||||
1137 在移动web上面实现bug的处理流程
|
||||
1136 在移动web上面实现任务的处理流程
|
||||
1136 在移动web上面实现任务的处理流程
|
||||
1135 移动web能够兼容现在的扩展机制
|
||||
1134 实现产品的bug列表页面
|
||||
1133 实现项目页面
|
||||
1133 实现项目页面
|
||||
1132 实现产品页面
|
||||
1131 实现移动web端我的地盘页面
|
||||
1130 确定移动web端的导航机制
|
||||
1129 确定移动web端的ui框架
|
||||
1128 index.php判断当前访问的终端类型,以决定视图显示类型
|
||||
1126 调整bin目录下面的脚本运行
|
||||
1123 完善工时填写的逻辑
|
||||
1121 创建和编辑项目的时候取消项目团队必填字段的选项
|
||||
1120 bug备注功能无法使用 view.js要做一个空白的文件。
|
||||
1119 版本的唯一检查增加产品条件。
|
||||
1118 调整模块的删除页面
|
||||
1112 调整zt_story表里面的reviewBy字段的大小
|
||||
1110 添加工时时候的备注信息可以作为任务操作历史里面的备注信息
|
||||
1109 处理历次版本删除的文件
|
||||
1107 访问方式在安装的时候隐藏掉,不需要用户来设置。
|
||||
1106 权限里面还有关于todo的权限,名字改成待办
|
||||
1104 集中处理用户列表的查询和显示
|
||||
1095 更改表单提交和页面跳转的方式
|
||||
1093 链接数据库的时候,自动将localhost改成127.0.0.1
|
||||
1091 各个列表页面的操作列表实现无刷新操作
|
||||
1090 将company逻辑去掉。
|
||||
1089 把pms里面的原来持久cookie的逻辑去掉。
|
||||
1081 实现基于linux虚拟化的集成运行环境
|
||||
1079 重构产品视图的下拉列表
|
||||
1079 重构产品视图的下拉列表
|
||||
985 重构产品,用例,bug和任务的模块功能
|
||||
985 重构产品,用例,bug和任务的模块功能
|
||||
974 重构产品和项目的下拉菜单
|
||||
1149 调整产品和项目的下拉菜单样式
|
||||
1148 调整指派给下拉菜单的样式
|
||||
1147 登录界面的宽度控制下
|
||||
1146 调整历史记录的显示样式
|
||||
1144 调整详情里面的操作按钮
|
||||
1143 调整分页导航条的样式
|
||||
1142 页面都通过pjax方式载入
|
||||
1140 在web网站上面提供二维码登录入口
|
||||
1138 在移动web上面实现待办的处理流程
|
||||
1137 在移动web上面实现bug的处理流程
|
||||
1136 在移动web上面实现任务的处理流程
|
||||
1136 在移动web上面实现任务的处理流程
|
||||
1135 移动web能够兼容现在的扩展机制
|
||||
1134 实现产品的bug列表页面
|
||||
1133 实现项目页面
|
||||
1133 实现项目页面
|
||||
1132 实现产品页面
|
||||
1131 实现移动web端我的地盘页面
|
||||
1130 确定移动web端的导航机制
|
||||
1129 确定移动web端的ui框架
|
||||
1128 index.php判断当前访问的终端类型,以决定视图显示类型
|
||||
1126 调整bin目录下面的脚本运行
|
||||
1123 完善工时填写的逻辑
|
||||
1121 创建和编辑项目的时候取消项目团队必填字段的选项
|
||||
1120 bug备注功能无法使用 view.js要做一个空白的文件。
|
||||
1119 版本的唯一检查增加产品条件。
|
||||
1118 调整模块的删除页面
|
||||
1112 调整zt_story表里面的reviewBy字段的大小
|
||||
1110 添加工时时候的备注信息可以作为任务操作历史里面的备注信息
|
||||
1109 处理历次版本删除的文件
|
||||
1107 访问方式在安装的时候隐藏掉,不需要用户来设置。
|
||||
1106 权限里面还有关于todo的权限,名字改成待办
|
||||
1104 集中处理用户列表的查询和显示
|
||||
1095 更改表单提交和页面跳转的方式
|
||||
1093 链接数据库的时候,自动将localhost改成127.0.0.1
|
||||
1091 各个列表页面的操作列表实现无刷新操作
|
||||
1090 将company逻辑去掉。
|
||||
1089 把pms里面的原来持久cookie的逻辑去掉。
|
||||
1081 实现基于linux虚拟化的集成运行环境
|
||||
1079 重构产品视图的下拉列表
|
||||
1079 重构产品视图的下拉列表
|
||||
985 重构产品,用例,bug和任务的模块功能
|
||||
985 重构产品,用例,bug和任务的模块功能
|
||||
974 重构产品和项目的下拉菜单
|
||||
|
||||
解决的bug:
|
||||
455 用户名为数字时,我的地盘的档案会出错。
|
||||
|
||||
@@ -97,9 +97,6 @@ class html extends baseHTML
|
||||
*/
|
||||
static public function select($name = '', $options = array(), $selectedItems = "", $attrib = "", $append = false)
|
||||
{
|
||||
global $app;
|
||||
static $dataKeys;
|
||||
|
||||
$options = (array)($options);
|
||||
if($append and !isset($options[$selectedItems])) $options[$selectedItems] = $selectedItems;
|
||||
if(!is_array($options) or empty($options)) return false;
|
||||
@@ -113,54 +110,15 @@ class html extends baseHTML
|
||||
$string = "<select name='$name' {$id} $attrib>\n";
|
||||
|
||||
/* The options. */
|
||||
static $pinyin;
|
||||
if(empty($pinyin)) $pinyin = $app->loadClass('pinyin');
|
||||
|
||||
$joinOptions = '';
|
||||
$sign = ' aNd ';
|
||||
foreach($options as $value)
|
||||
{
|
||||
if(!isset($dataKeys[$value])) $joinOptions .= str_replace($sign, ' and ', $value) . $sign;
|
||||
}
|
||||
|
||||
if($joinOptions)
|
||||
{
|
||||
$valuesPinyin = $pinyin->romanize($joinOptions);
|
||||
$signLenth = strlen($sign);
|
||||
$pinyinSign = trim($sign);
|
||||
$pySignLenth = strlen($pinyinSign);
|
||||
while($joinOptions)
|
||||
{
|
||||
$valuePinyin = '';
|
||||
$value = '';
|
||||
|
||||
$pinyinPos = strpos($valuesPinyin, $pinyinSign);
|
||||
if($pinyinPos !== false)
|
||||
{
|
||||
$valuePinyin = substr($valuesPinyin, 0, $pinyinPos);
|
||||
$valuesPinyin = substr($valuesPinyin, $pinyinPos + $pySignLenth);
|
||||
}
|
||||
|
||||
$valuePos = strpos($joinOptions, $sign);
|
||||
if($valuePos === false) break;
|
||||
$value = substr($joinOptions, 0, $valuePos);
|
||||
$joinOptions = substr($joinOptions, $valuePos + $signLenth);
|
||||
|
||||
$valuePinyin = preg_split('/[^a-z]+/iu', trim($valuePinyin));
|
||||
$valueAbbr = '';
|
||||
foreach($valuePinyin as $wordPinyin) if($wordPinyin) $valueAbbr .= $wordPinyin[0];
|
||||
|
||||
$dataKeys[$value] = empty($valuePinyin) ? '' : join($valuePinyin) . ' ' . $valueAbbr;
|
||||
}
|
||||
}
|
||||
|
||||
if(is_array($selectedItems)) $selectedItems = implode(',', $selectedItems);
|
||||
$selectedItems = ",$selectedItems,";
|
||||
$selectedItems = ",$selectedItems,";
|
||||
$convertedPinYin = class_exists('common') ? common::convert2Pinyin($options) : array();
|
||||
foreach($options as $key => $value)
|
||||
{
|
||||
$optionPinyin = zget($convertedPinYin, $value, '');
|
||||
$key = str_replace('item', '', $key);
|
||||
$selected = strpos($selectedItems, ",$key,") !== false ? " selected='selected'" : '';
|
||||
$string .= "<option value='$key'$selected data-keys='{$dataKeys[$value]}'>$value</option>\n";
|
||||
$string .= "<option value='$key'$selected data-keys='{$optionPinyin}'>$value</option>\n";
|
||||
}
|
||||
|
||||
/* End. */
|
||||
|
||||
@@ -75,11 +75,19 @@ class ztcloud
|
||||
$param['body'] = $this->body;
|
||||
|
||||
$result = $this->queryZtcloud($this->url, $param);
|
||||
if(!isset($result->result))
|
||||
{
|
||||
throw new Exception($result);
|
||||
return false;
|
||||
}
|
||||
|
||||
if($result->result == 'fail')
|
||||
{
|
||||
throw new Exception($result->message . "(code:{$result->code})");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -102,7 +110,9 @@ class ztcloud
|
||||
);
|
||||
$context = stream_context_create($options);
|
||||
$result = file_get_contents($url, FILE_TEXT, $context);
|
||||
return json_decode($result);
|
||||
|
||||
$parsedResult = json_decode($result);
|
||||
return empty($parsedResult) ? $result : $parsedResult;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,6 +17,7 @@ $config->action->objectNameFields['todo'] = 'name';
|
||||
$config->action->objectNameFields['branch'] = 'name';
|
||||
$config->action->objectNameFields['module'] = 'name';
|
||||
$config->action->objectNameFields['testsuite'] = 'name';
|
||||
$config->action->objectNameFields['testlib'] = 'name';
|
||||
$config->action->objectNameFields['caselib'] = 'name';
|
||||
$config->action->objectNameFields['testreport'] = 'title';
|
||||
|
||||
$config->action->commonImgSize = 870;
|
||||
|
||||
@@ -61,6 +61,9 @@ $lang->action->objectTypes['doclib'] = 'Doc Lib';
|
||||
$lang->action->objectTypes['todo'] = 'To-Dos';
|
||||
$lang->action->objectTypes['branch'] = 'Branch';
|
||||
$lang->action->objectTypes['module'] = 'Module';
|
||||
$lang->action->objectTypes['testsuite'] = 'Suite';
|
||||
$lang->action->objectTypes['caselib'] = 'Library';
|
||||
$lang->action->objectTypes['testreport'] = 'Report';
|
||||
|
||||
/* 用来描述操作历史记录。*/
|
||||
$lang->action->desc = new stdclass();
|
||||
@@ -80,6 +83,7 @@ $lang->action->desc->undeleted = '$date, restored by <strong>$actor</strong
|
||||
$lang->action->desc->hidden = '$date, hidden by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->commented = '$date, added by <strong>$actor</strong>.' . "\n";
|
||||
$lang->action->desc->activated = '$date, activated by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->blocked = '$date, blocked by <strong>$actor</strong> .' . "\n";
|
||||
$lang->action->desc->moved = '$date, moved by <strong>$actor</strong> , which was "$extra".' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, <strong>$actor</strong> confirmed the change of Story. The latest version is <strong>#$extra</strong>.' . "\n";
|
||||
$lang->action->desc->caseconfirmed = '$date, <strong>$actor</strong> confirmed the change of Case. The latest version is <strong>#$extra</strong>' . "\n";
|
||||
@@ -121,6 +125,7 @@ $lang->action->label->undeleted = 'Restored';
|
||||
$lang->action->label->hidden = 'Hidden';
|
||||
$lang->action->label->commented = 'Commented';
|
||||
$lang->action->label->activated = 'Activated';
|
||||
$lang->action->label->blocked = 'Blocked';
|
||||
$lang->action->label->resolved = 'Resolved';
|
||||
$lang->action->label->reviewed = 'Reviewed';
|
||||
$lang->action->label->moved = 'Moved';
|
||||
@@ -128,6 +133,7 @@ $lang->action->label->confirmed = 'Confirm a Story, ';
|
||||
$lang->action->label->bugconfirmed = 'Confirmed';
|
||||
$lang->action->label->tostory = 'Convert to Story';
|
||||
$lang->action->label->frombug = 'Converted from Bug';
|
||||
$lang->action->label->fromlib = 'Import from library';
|
||||
$lang->action->label->totask = 'Convert to Task';
|
||||
$lang->action->label->svncommited = 'SVN Commit';
|
||||
$lang->action->label->gitcommited = 'Git Commit';
|
||||
@@ -171,10 +177,13 @@ $lang->action->label->build = 'Build|build|view|buildID=%s';
|
||||
$lang->action->label->bug = 'Bug|bug|view|bugID=%s';
|
||||
$lang->action->label->case = 'Case|testcase|view|caseID=%s';
|
||||
$lang->action->label->testtask = 'Test Task|testtask|view|caseID=%s';
|
||||
$lang->action->label->testsuite = 'Test Suite|testsuite|view|suiteID=%s';
|
||||
$lang->action->label->caselib = 'Case Library|testsuite|libview|libID=%s';
|
||||
$lang->action->label->todo = 'To-Dos|todo|view|todoID=%s';
|
||||
$lang->action->label->doclib = 'Doc Lib|doc|browse|libID=%s';
|
||||
$lang->action->label->doc = 'Document|doc|view|docID=%s';
|
||||
$lang->action->label->user = 'User|user|view|account=%s';
|
||||
$lang->action->label->testreport = 'Report|testreport|view|report=%s';
|
||||
$lang->action->label->space = ' ';
|
||||
|
||||
/* Object type. */
|
||||
@@ -196,6 +205,9 @@ $lang->action->search->objectTypeList['build'] = 'Build';
|
||||
$lang->action->search->objectTypeList['release'] = 'Release';
|
||||
$lang->action->search->objectTypeList['productplan'] = 'Plan';
|
||||
$lang->action->search->objectTypeList['branch'] = 'Branch';
|
||||
$lang->action->search->objectTypeList['testsuite'] = 'Suite';
|
||||
$lang->action->search->objectTypeList['caselib'] = 'Library';
|
||||
$lang->action->search->objectTypeList['testreport'] = 'Report';
|
||||
|
||||
/* 用来在动态显示中显示动作 */
|
||||
$lang->action->search->label[''] = '';
|
||||
@@ -213,6 +225,7 @@ $lang->action->search->label['undeleted'] = $lang->action->label->unde
|
||||
$lang->action->search->label['hidden'] = $lang->action->label->hidden;
|
||||
$lang->action->search->label['commented'] = $lang->action->label->commented;
|
||||
$lang->action->search->label['activated'] = $lang->action->label->activated;
|
||||
$lang->action->search->label['blocked'] = $lang->action->label->blocked;
|
||||
$lang->action->search->label['resolved'] = $lang->action->label->resolved;
|
||||
$lang->action->search->label['reviewed'] = $lang->action->label->reviewed;
|
||||
$lang->action->search->label['moved'] = $lang->action->label->moved;
|
||||
|
||||
@@ -62,7 +62,8 @@ $lang->action->objectTypes['todo'] = '待办';
|
||||
$lang->action->objectTypes['branch'] = '分支';
|
||||
$lang->action->objectTypes['module'] = '模块';
|
||||
$lang->action->objectTypes['testsuite'] = '套件';
|
||||
$lang->action->objectTypes['testlib'] = '公共库';
|
||||
$lang->action->objectTypes['caselib'] = '用例库';
|
||||
$lang->action->objectTypes['testreport'] = '报告';
|
||||
|
||||
/* 用来描述操作历史记录。*/
|
||||
$lang->action->desc = new stdclass();
|
||||
@@ -82,6 +83,7 @@ $lang->action->desc->undeleted = '$date, 由 <strong>$actor</strong> 还原
|
||||
$lang->action->desc->hidden = '$date, 由 <strong>$actor</strong> 隐藏。' . "\n";
|
||||
$lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加备注。' . "\n";
|
||||
$lang->action->desc->activated = '$date, 由 <strong>$actor</strong> 激活。' . "\n";
|
||||
$lang->action->desc->blocked = '$date, 由 <strong>$actor</strong> 阻塞。' . "\n";
|
||||
$lang->action->desc->moved = '$date, 由 <strong>$actor</strong> 移动,之前为 "$extra"。' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, 由 <strong>$actor</strong> 确认需求变动,最新版本为<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->caseconfirmed = '$date, 由 <strong>$actor</strong> 确认用例变动,最新版本为<strong>#$extra</strong>。' . "\n";
|
||||
@@ -123,6 +125,7 @@ $lang->action->label->undeleted = '还原了';
|
||||
$lang->action->label->hidden = '隐藏了';
|
||||
$lang->action->label->commented = '评论了';
|
||||
$lang->action->label->activated = '激活了';
|
||||
$lang->action->label->blocked = '阻塞了';
|
||||
$lang->action->label->resolved = '解决了';
|
||||
$lang->action->label->reviewed = '评审了';
|
||||
$lang->action->label->moved = '移动了';
|
||||
@@ -130,6 +133,7 @@ $lang->action->label->confirmed = '确认了需求,';
|
||||
$lang->action->label->bugconfirmed = '确认了';
|
||||
$lang->action->label->tostory = '转需求';
|
||||
$lang->action->label->frombug = '转需求';
|
||||
$lang->action->label->fromlib = '从用例库导入';
|
||||
$lang->action->label->totask = '转任务';
|
||||
$lang->action->label->svncommited = '提交代码';
|
||||
$lang->action->label->gitcommited = '提交代码';
|
||||
@@ -173,10 +177,13 @@ $lang->action->label->build = 'Build|build|view|buildID=%s';
|
||||
$lang->action->label->bug = 'Bug|bug|view|bugID=%s';
|
||||
$lang->action->label->case = '用例|testcase|view|caseID=%s';
|
||||
$lang->action->label->testtask = '测试任务|testtask|view|caseID=%s';
|
||||
$lang->action->label->testsuite = '测试套件|testsuite|view|suiteID=%s';
|
||||
$lang->action->label->caselib = '测试库|testsuite|libview|libID=%s';
|
||||
$lang->action->label->todo = 'todo|todo|view|todoID=%s';
|
||||
$lang->action->label->doclib = '文档库|doc|browse|libID=%s';
|
||||
$lang->action->label->doc = '文档|doc|view|docID=%s';
|
||||
$lang->action->label->user = '用户|user|view|account=%s';
|
||||
$lang->action->label->testreport = '报告|testreport|view|report=%s';
|
||||
$lang->action->label->space = ' ';
|
||||
|
||||
/* Object type. */
|
||||
@@ -199,7 +206,8 @@ $lang->action->search->objectTypeList['release'] = '发布';
|
||||
$lang->action->search->objectTypeList['productplan'] = '计划';
|
||||
$lang->action->search->objectTypeList['branch'] = '分支';
|
||||
$lang->action->search->objectTypeList['testsuite'] = '套件';
|
||||
$lang->action->search->objectTypeList['testlib'] = '公共库';
|
||||
$lang->action->search->objectTypeList['caselib'] = '公共库';
|
||||
$lang->action->search->objectTypeList['testreport'] = '报告';
|
||||
|
||||
/* 用来在动态显示中显示动作 */
|
||||
$lang->action->search->label[''] = '';
|
||||
@@ -217,6 +225,7 @@ $lang->action->search->label['undeleted'] = $lang->action->label->unde
|
||||
$lang->action->search->label['hidden'] = $lang->action->label->hidden;
|
||||
$lang->action->search->label['commented'] = $lang->action->label->commented;
|
||||
$lang->action->search->label['activated'] = $lang->action->label->activated;
|
||||
$lang->action->search->label['blocked'] = $lang->action->label->blocked;
|
||||
$lang->action->search->label['resolved'] = $lang->action->label->resolved;
|
||||
$lang->action->search->label['reviewed'] = $lang->action->label->reviewed;
|
||||
$lang->action->search->label['moved'] = $lang->action->label->moved;
|
||||
|
||||
@@ -61,6 +61,9 @@ $lang->action->objectTypes['doclib'] = '文檔庫';
|
||||
$lang->action->objectTypes['todo'] = '待辦';
|
||||
$lang->action->objectTypes['branch'] = '分支';
|
||||
$lang->action->objectTypes['module'] = '模組';
|
||||
$lang->action->objectTypes['testsuite'] = '套件';
|
||||
$lang->action->objectTypes['caselib'] = '用例庫';
|
||||
$lang->action->objectTypes['testreport'] = '報告';
|
||||
|
||||
/* 用來描述操作歷史記錄。*/
|
||||
$lang->action->desc = new stdclass();
|
||||
@@ -80,6 +83,7 @@ $lang->action->desc->undeleted = '$date, 由 <strong>$actor</strong> 還原
|
||||
$lang->action->desc->hidden = '$date, 由 <strong>$actor</strong> 隱藏。' . "\n";
|
||||
$lang->action->desc->commented = '$date, 由 <strong>$actor</strong> 添加備註。' . "\n";
|
||||
$lang->action->desc->activated = '$date, 由 <strong>$actor</strong> 激活。' . "\n";
|
||||
$lang->action->desc->blocked = '$date, 由 <strong>$actor</strong> 阻塞。' . "\n";
|
||||
$lang->action->desc->moved = '$date, 由 <strong>$actor</strong> 移動,之前為 "$extra"。' . "\n";
|
||||
$lang->action->desc->confirmed = '$date, 由 <strong>$actor</strong> 確認需求變動,最新版本為<strong>#$extra</strong>。' . "\n";
|
||||
$lang->action->desc->caseconfirmed = '$date, 由 <strong>$actor</strong> 確認用例變動,最新版本為<strong>#$extra</strong>。' . "\n";
|
||||
@@ -121,6 +125,7 @@ $lang->action->label->undeleted = '還原了';
|
||||
$lang->action->label->hidden = '隱藏了';
|
||||
$lang->action->label->commented = '評論了';
|
||||
$lang->action->label->activated = '激活了';
|
||||
$lang->action->label->blocked = '阻塞了';
|
||||
$lang->action->label->resolved = '解決了';
|
||||
$lang->action->label->reviewed = '評審了';
|
||||
$lang->action->label->moved = '移動了';
|
||||
@@ -128,6 +133,7 @@ $lang->action->label->confirmed = '確認了需求,';
|
||||
$lang->action->label->bugconfirmed = '確認了';
|
||||
$lang->action->label->tostory = '轉需求';
|
||||
$lang->action->label->frombug = '轉需求';
|
||||
$lang->action->label->fromlib = '從用例庫導入';
|
||||
$lang->action->label->totask = '轉任務';
|
||||
$lang->action->label->svncommited = '提交代碼';
|
||||
$lang->action->label->gitcommited = '提交代碼';
|
||||
@@ -171,10 +177,13 @@ $lang->action->label->build = 'Build|build|view|buildID=%s';
|
||||
$lang->action->label->bug = 'Bug|bug|view|bugID=%s';
|
||||
$lang->action->label->case = '用例|testcase|view|caseID=%s';
|
||||
$lang->action->label->testtask = '測試任務|testtask|view|caseID=%s';
|
||||
$lang->action->label->testsuite = '測試套件|testsuite|view|suiteID=%s';
|
||||
$lang->action->label->caselib = '測試庫|testsuite|libview|libID=%s';
|
||||
$lang->action->label->todo = 'todo|todo|view|todoID=%s';
|
||||
$lang->action->label->doclib = '文檔庫|doc|browse|libID=%s';
|
||||
$lang->action->label->doc = '文檔|doc|view|docID=%s';
|
||||
$lang->action->label->user = '用戶|user|view|account=%s';
|
||||
$lang->action->label->testreport = '報告|testreport|view|report=%s';
|
||||
$lang->action->label->space = ' ';
|
||||
|
||||
/* Object type. */
|
||||
@@ -196,6 +205,9 @@ $lang->action->search->objectTypeList['build'] = 'Build';
|
||||
$lang->action->search->objectTypeList['release'] = '發佈';
|
||||
$lang->action->search->objectTypeList['productplan'] = '計劃';
|
||||
$lang->action->search->objectTypeList['branch'] = '分支';
|
||||
$lang->action->search->objectTypeList['testsuite'] = '套件';
|
||||
$lang->action->search->objectTypeList['caselib'] = '公共庫';
|
||||
$lang->action->search->objectTypeList['testreport'] = '報告';
|
||||
|
||||
/* 用來在動態顯示中顯示動作 */
|
||||
$lang->action->search->label[''] = '';
|
||||
@@ -213,6 +225,7 @@ $lang->action->search->label['undeleted'] = $lang->action->label->unde
|
||||
$lang->action->search->label['hidden'] = $lang->action->label->hidden;
|
||||
$lang->action->search->label['commented'] = $lang->action->label->commented;
|
||||
$lang->action->search->label['activated'] = $lang->action->label->activated;
|
||||
$lang->action->search->label['blocked'] = $lang->action->label->blocked;
|
||||
$lang->action->search->label['resolved'] = $lang->action->label->resolved;
|
||||
$lang->action->search->label['reviewed'] = $lang->action->label->reviewed;
|
||||
$lang->action->search->label['moved'] = $lang->action->label->moved;
|
||||
|
||||
+12
-6
@@ -52,8 +52,11 @@ class actionModel extends model
|
||||
$action->project = $productAndProject['project'];
|
||||
|
||||
$this->dao->insert(TABLE_ACTION)->data($action)->autoCheck()->exec();
|
||||
$actionID = $this->dbh->lastInsertID();
|
||||
|
||||
$this->file->updateObjectID($this->post->uid, $objectID, $objectType);
|
||||
return $this->dbh->lastInsertID();
|
||||
|
||||
return $actionID;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -373,7 +376,7 @@ class actionModel extends model
|
||||
->andWhere('extra')->eq($extra)
|
||||
->orderBy($orderBy)->page($pager)->fetchAll();
|
||||
if(!$trashes) return array();
|
||||
|
||||
|
||||
/* Group trashes by objectType, and get there name field. */
|
||||
foreach($trashes as $object)
|
||||
{
|
||||
@@ -418,6 +421,7 @@ class actionModel extends model
|
||||
*/
|
||||
public function logHistory($actionID, $changes)
|
||||
{
|
||||
if(empty($actionID)) return false;
|
||||
foreach($changes as $change)
|
||||
{
|
||||
$change['action'] = $actionID;
|
||||
@@ -434,6 +438,8 @@ class actionModel extends model
|
||||
*/
|
||||
public function printAction($action)
|
||||
{
|
||||
if(!isset($action->objectType) or !isset($action->action)) return false;
|
||||
|
||||
$objectType = $action->objectType;
|
||||
$actionType = strtolower($action->action);
|
||||
|
||||
@@ -529,7 +535,7 @@ class actionModel extends model
|
||||
$condition = "(product =',0,' AND project = '0')";
|
||||
if($projectCondition) $condition .= ' OR ' . $projectCondition;
|
||||
if($productCondition) $condition .= ' OR ' . $productCondition;
|
||||
if(strpos($this->app->company->admins, ',' . $this->app->user->account . ',') !== false) $condition = 1;
|
||||
if($this->app->user->admin) $condition = 1;
|
||||
}
|
||||
|
||||
$this->loadModel('doc');
|
||||
@@ -627,7 +633,7 @@ class actionModel extends model
|
||||
*/
|
||||
public function getBySQL($sql, $orderBy, $pager = null)
|
||||
{
|
||||
return $actions = $this->dao->select('*')->from(TABLE_ACTION)
|
||||
return $actions = $this->dao->select('*')->from(TABLE_ACTION)
|
||||
->where($sql)
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
@@ -669,11 +675,11 @@ class actionModel extends model
|
||||
if($todo->type == 'bug') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_BUG)->fetch('title');
|
||||
if($todo->private == 1 and $todo->account != $this->app->user->account)
|
||||
{
|
||||
$objectNames[$objectType][$id] = $this->lang->todo->thisIsPrivate;
|
||||
$objectNames[$objectType][$id] = $this->lang->todo->thisIsPrivate;
|
||||
}
|
||||
else
|
||||
{
|
||||
$objectNames[$objectType][$id] = $todo->name;
|
||||
$objectNames[$objectType][$id] = $todo->name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,20 @@
|
||||
<tr class='text-center'>
|
||||
<td><?php echo zget($lang->action->objectTypes, $action->objectType, '');?></td>
|
||||
<td><?php echo $action->objectID;?></td>
|
||||
<td class='text-left'><?php echo html::a($this->createLink($module, $module == 'testlib' ? 'libview' : 'view', $action->objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}"), $action->objectName);?></td>
|
||||
<td class='text-left'>
|
||||
<?php
|
||||
$methodName = $module == 'caselib' ? 'libview' : 'view';
|
||||
$params = $action->objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}";
|
||||
if($module == 'doclib')
|
||||
{
|
||||
echo $action->objectName;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::a($this->createLink($module, $methodName, $params), $action->objectName);
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
<td><?php echo $users[$action->actor];?></td>
|
||||
<td><?php echo $action->date;?></td>
|
||||
<td>
|
||||
|
||||
@@ -22,7 +22,7 @@ $lang->admin->captcha = 'Verification Code';
|
||||
$lang->admin->getCaptcha = 'Get Verification Code';
|
||||
|
||||
$lang->admin->info = new stdclass();
|
||||
$lang->admin->info->version = 'Current Version is %s,';
|
||||
$lang->admin->info->version = 'Current Version is %s. ';
|
||||
$lang->admin->info->links = 'You can visit ';
|
||||
$lang->admin->info->account = "Your ZenTao account is %s.";
|
||||
|
||||
|
||||
@@ -49,9 +49,10 @@ class block extends control
|
||||
if(!common::hasPriv($moduleKey, 'index')) unset($modules[$moduleKey]);
|
||||
}
|
||||
|
||||
$modules['dynamic'] = $this->lang->block->dynamic;
|
||||
$modules['flowchart'] = $this->lang->block->lblFlowchart;
|
||||
$modules['html'] = 'HTML';
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
if(strpos(",$closedBlock,", ",|dynamic,") === false) $modules['dynamic'] = $this->lang->block->dynamic;
|
||||
if(strpos(",$closedBlock,", ",|flowchart,") === false) $modules['flowchart'] = $this->lang->block->lblFlowchart;
|
||||
if(strpos(",$closedBlock,", ",|html,") === false) $modules['html'] = 'HTML';
|
||||
$modules = array('' => '') + $modules;
|
||||
|
||||
$hiddenBlocks = $this->block->getHiddenBlocks();
|
||||
@@ -261,6 +262,7 @@ class block extends control
|
||||
elseif($block->source != '')
|
||||
{
|
||||
$this->get->set('mode', 'getblockdata');
|
||||
$this->get->set('blockTitle', $block->title);
|
||||
$this->get->set('module', $block->module);
|
||||
$this->get->set('source', $block->source);
|
||||
$this->get->set('blockid', $block->block);
|
||||
@@ -289,7 +291,7 @@ class block extends control
|
||||
{
|
||||
if(!$this->selfCall)
|
||||
{
|
||||
$lang = $this->get->lang;
|
||||
$lang = str_replace('_', '-', $this->get->lang);
|
||||
$this->app->setClientLang($lang);
|
||||
$this->app->loadLang('common');
|
||||
$this->app->loadLang('block');
|
||||
@@ -341,9 +343,10 @@ class block extends control
|
||||
$this->view->sign = strpos($sso, '?') === false ? '?' : '&';
|
||||
}
|
||||
|
||||
$this->viewType = (isset($params->viewType) and $params->viewType == 'json') ? 'json' : 'html';
|
||||
$this->params = $params;
|
||||
$this->view->code = $this->get->blockid;
|
||||
$this->viewType = (isset($params->viewType) and $params->viewType == 'json') ? 'json' : 'html';
|
||||
$this->params = $params;
|
||||
$this->view->code = $this->get->blockid;
|
||||
$this->view->title = $this->get->blockTitle;
|
||||
|
||||
$func = 'print' . ucfirst($code) . 'Block';
|
||||
if(method_exists('block', $func))
|
||||
@@ -586,8 +589,9 @@ class block extends control
|
||||
{
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
$num = isset($this->params->num) ? $this->params->num : 0;
|
||||
$type = isset($this->params->type) ? $this->params->type : '';
|
||||
$pager = pager::init(0, $num , 1);
|
||||
$this->view->productStats = $this->loadModel('product')->getStats('order_desc', $this->viewType != 'json' ? $pager : '', $this->params->type);
|
||||
$this->view->productStats = $this->loadModel('product')->getStats('order_desc', $this->viewType != 'json' ? $pager : '', $type);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -614,4 +618,20 @@ class block extends control
|
||||
{
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Close block forever.
|
||||
*
|
||||
* @param int $blockID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function close($blockID)
|
||||
{
|
||||
$block = $this->block->getByID($blockID);
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
$this->dao->delete()->from(TABLE_BLOCK)->where('source')->eq($block->source)->andWhere('block')->eq($block->block)->exec();
|
||||
$this->loadModel('setting')->setItem('system.block.closed', $closedBlock . ",{$block->source}|{$block->block}");
|
||||
die(js::reload('parent'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,9 @@ $lang->block->createBlock = 'Create Widget';
|
||||
$lang->block->editBlock = 'Edit';
|
||||
$lang->block->ordersSaved = 'Ranking is saved.';
|
||||
$lang->block->confirmRemoveBlock = 'Do you want to remove Widget【{0}】?';
|
||||
$lang->block->closeForever = 'Permanent Close';
|
||||
$lang->block->confirmClose = 'Do you want to permanently close this block? Once done, it is not available to anyone. It can be switched on at Admin->Custom.';
|
||||
$lang->block->remove = 'Remove';
|
||||
$lang->block->refresh = 'Refresh';
|
||||
$lang->block->hidden = 'Hide';
|
||||
$lang->block->dynamicInfo = "%s, %s <em>%s</em> %s <a href='%s'>%s</a>.";
|
||||
@@ -82,7 +85,7 @@ $lang->block->default['qa']['2']['params']['num'] = 15;
|
||||
$lang->block->default['qa']['2']['params']['orderBy'] = 'id_desc';
|
||||
$lang->block->default['qa']['2']['params']['type'] = 'assigntome';
|
||||
|
||||
$lang->block->default['qa']['3']['title'] = 'Pending Versions';
|
||||
$lang->block->default['qa']['3']['title'] = 'Pending Builds';
|
||||
$lang->block->default['qa']['3']['block'] = 'testtask';
|
||||
$lang->block->default['qa']['3']['grid'] = 4;
|
||||
|
||||
@@ -226,9 +229,11 @@ $lang->block->typeList->project['undone'] = 'Undone';
|
||||
$lang->block->typeList->project['isdoing'] = 'Doing';
|
||||
$lang->block->typeList->project['all'] = 'All';
|
||||
|
||||
$lang->block->typeList->testtask['wait'] = 'Testing Pending';
|
||||
$lang->block->typeList->testtask['done'] = 'Tested';
|
||||
$lang->block->typeList->testtask['all'] = 'All';
|
||||
$lang->block->typeList->testtask['wait'] = 'Testing Pending';
|
||||
$lang->block->typeList->testtask['doing'] = 'Testing';
|
||||
$lang->block->typeList->testtask['blocked'] = 'Blocked';
|
||||
$lang->block->typeList->testtask['done'] = 'Tested';
|
||||
$lang->block->typeList->testtask['all'] = 'All';
|
||||
|
||||
$lang->block->modules['product']->moreLinkList = new stdclass();
|
||||
$lang->block->modules['product']->moreLinkList->list = 'product|all|product=&status=%s';
|
||||
@@ -250,5 +255,5 @@ $lang->block->flowchart = array();
|
||||
$lang->block->flowchart[] = array('Administration', 'Manage a Company', 'Add Users', 'Maintain Privileges');
|
||||
$lang->block->flowchart[] = array($lang->productCommon . ' Manager', 'Add ' . $lang->productCommon, 'Maintain Modules', 'Maintain Plans', 'Maintain Stories', 'Create Release');
|
||||
$lang->block->flowchart[] = array($lang->projectCommon . ' Manager', 'Add ' . $lang->projectCommon, 'Maintain Teams', 'Link ' . $lang->productCommon . 's', 'Link Stories', 'Decompose Tasks');
|
||||
$lang->block->flowchart[] = array('DEV Team', 'Claim TaskS/Bugs', 'Update Status', 'Finish Tasks/Bugs');
|
||||
$lang->block->flowchart[] = array('DEV Team', 'Claim Tasks/Bugs', 'Update Status', 'Finish Tasks/Bugs');
|
||||
$lang->block->flowchart[] = array('Testing Team', 'Write Cases', 'Implement Cases', 'Report Bugs', 'Fix Bugs', 'Close Bugs');
|
||||
|
||||
@@ -31,6 +31,9 @@ $lang->block->createBlock = '添加区块';
|
||||
$lang->block->editBlock = '编辑区块';
|
||||
$lang->block->ordersSaved = '排序已保存';
|
||||
$lang->block->confirmRemoveBlock = '确定移除区块【{0}】吗?';
|
||||
$lang->block->closeForever = '永久关闭';
|
||||
$lang->block->confirmClose = '确定永久关闭该区块吗?闭后所有人都将无法使用该区块,可以在后台自定义中打开';
|
||||
$lang->block->remove = '移除';
|
||||
$lang->block->refresh = '刷新';
|
||||
$lang->block->hidden = '隐藏';
|
||||
$lang->block->dynamicInfo = "%s, %s <em>%s</em> %s <a href='%s'>%s</a>。";
|
||||
@@ -226,9 +229,11 @@ $lang->block->typeList->project['undone'] = '未完成';
|
||||
$lang->block->typeList->project['isdoing'] = '进行中';
|
||||
$lang->block->typeList->project['all'] = '全部';
|
||||
|
||||
$lang->block->typeList->testtask['wait'] = '待测版本';
|
||||
$lang->block->typeList->testtask['done'] = '已测版本';
|
||||
$lang->block->typeList->testtask['all'] = '全部';
|
||||
$lang->block->typeList->testtask['wait'] = '待测版本';
|
||||
$lang->block->typeList->testtask['doing'] = '测试中版本';
|
||||
$lang->block->typeList->testtask['blocked'] = '阻塞版本';
|
||||
$lang->block->typeList->testtask['done'] = '已测版本';
|
||||
$lang->block->typeList->testtask['all'] = '全部';
|
||||
|
||||
$lang->block->modules['product']->moreLinkList = new stdclass();
|
||||
$lang->block->modules['product']->moreLinkList->list = 'product|all|product=&status=%s';
|
||||
|
||||
@@ -31,6 +31,9 @@ $lang->block->createBlock = '添加區塊';
|
||||
$lang->block->editBlock = '編輯區塊';
|
||||
$lang->block->ordersSaved = '排序已保存';
|
||||
$lang->block->confirmRemoveBlock = '確定移除區塊【{0}】嗎?';
|
||||
$lang->block->closeForever = '永久關閉';
|
||||
$lang->block->confirmClose = '確定永久關閉該區塊嗎?閉後所有人都將無法使用該區塊,可以在後台自定義中打開';
|
||||
$lang->block->remove = '移除';
|
||||
$lang->block->refresh = '刷新';
|
||||
$lang->block->hidden = '隱藏';
|
||||
$lang->block->dynamicInfo = "%s, %s <em>%s</em> %s <a href='%s'>%s</a>。";
|
||||
@@ -226,9 +229,11 @@ $lang->block->typeList->project['undone'] = '未完成';
|
||||
$lang->block->typeList->project['isdoing'] = '進行中';
|
||||
$lang->block->typeList->project['all'] = '全部';
|
||||
|
||||
$lang->block->typeList->testtask['wait'] = '待測版本';
|
||||
$lang->block->typeList->testtask['done'] = '已測版本';
|
||||
$lang->block->typeList->testtask['all'] = '全部';
|
||||
$lang->block->typeList->testtask['wait'] = '待測版本';
|
||||
$lang->block->typeList->testtask['doing'] = '測試中版本';
|
||||
$lang->block->typeList->testtask['blocked'] = '阻塞版本';
|
||||
$lang->block->typeList->testtask['done'] = '已測版本';
|
||||
$lang->block->typeList->testtask['all'] = '全部';
|
||||
|
||||
$lang->block->modules['product']->moreLinkList = new stdclass();
|
||||
$lang->block->modules['product']->moreLinkList->list = 'product|all|product=&status=%s';
|
||||
|
||||
+53
-12
@@ -173,8 +173,16 @@ class blockModel extends model
|
||||
*/
|
||||
public function getAvailableBlocks($module = '')
|
||||
{
|
||||
if($module and isset($this->lang->block->modules[$module]))return json_encode($this->lang->block->modules[$module]->availableBlocks);
|
||||
return json_encode($this->lang->block->availableBlocks);
|
||||
$blocks = $this->lang->block->availableBlocks;
|
||||
if($module and isset($this->lang->block->modules[$module])) $blocks = $this->lang->block->modules[$module]->availableBlocks;
|
||||
if(isset($this->config->block->closed))
|
||||
{
|
||||
foreach($blocks as $blockKey => $blockName)
|
||||
{
|
||||
if(strpos(",{$this->config->block->closed},", ",{$module}|{$blockKey},") !== false) unset($blocks->$blockKey);
|
||||
}
|
||||
}
|
||||
return json_encode($blocks);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -187,14 +195,6 @@ class blockModel extends model
|
||||
public function getListParams($module = '')
|
||||
{
|
||||
$params = new stdclass();
|
||||
|
||||
if($module == 'project' or $module == 'product')
|
||||
{
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->block->typeList->$module;
|
||||
$params->type['control'] = 'select';
|
||||
}
|
||||
|
||||
$params = $this->onlyNumParams($module, $params);
|
||||
return json_encode($params);
|
||||
}
|
||||
@@ -375,7 +375,11 @@ class blockModel extends model
|
||||
*/
|
||||
public function getProductParams($module = '')
|
||||
{
|
||||
return $this->getListParams($module);
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->block->typeList->product;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
return json_encode($this->onlyNumParams($module, $params));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -386,7 +390,44 @@ class blockModel extends model
|
||||
*/
|
||||
public function getProjectParams($module = '')
|
||||
{
|
||||
return $this->getListParams($module);
|
||||
$params->type['name'] = $this->lang->block->type;
|
||||
$params->type['options'] = $this->lang->block->typeList->project;
|
||||
$params->type['control'] = 'select';
|
||||
|
||||
return json_encode($this->onlyNumParams($module, $params));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get closed block pairs.
|
||||
*
|
||||
* @param string $closedBlock
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getClosedBlockPairs($closedBlock)
|
||||
{
|
||||
$blockPairs = array();
|
||||
if(empty($closedBlock)) return $blockPairs;
|
||||
|
||||
foreach(explode(',', $closedBlock) as $block)
|
||||
{
|
||||
$block = trim($block);
|
||||
if(empty($block)) continue;
|
||||
|
||||
list($moduleName, $blockKey) = explode('|', $block);
|
||||
if(empty($moduleName))
|
||||
{
|
||||
if($blockKey == 'html') $blockPairs[$block] = 'HTML';
|
||||
if($blockKey == 'flowchart') $blockPairs[$block] = $this->lang->block->lblFlowchart;
|
||||
if($blockKey == 'dynamic') $blockPairs[$block] = $this->lang->block->dynamic;
|
||||
}
|
||||
else
|
||||
{
|
||||
$blockPairs[$block] = "{$this->lang->block->moduleList[$moduleName]}|{$this->lang->block->modules[$moduleName]->availableBlocks->$blockKey}";
|
||||
}
|
||||
}
|
||||
|
||||
return $blockPairs;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,12 +18,15 @@ $useGuest = $this->app->user->account == 'guest';
|
||||
?>
|
||||
<?php include '../../common/view/tablesorter.html.php';?>
|
||||
<div class='dashboard' id='dashboard' data-confirm-remove-block='<?php echo $lang->block->confirmRemoveBlock;?>'>
|
||||
<?php if(!$useGuest):?>
|
||||
<div class='dashboard-actions'><a href='<?php echo $this->createLink("block", "admin", "id=0&module=$module"); ?>' data-toggle='modal' data-type='ajax' data-width='700' data-title='<?php echo $lang->block->createBlock?>'><i class='icon icon-plus' title='<?php echo $lang->block->createBlock?>' data-toggle='tooltip' data-placement='left'></i></a></div>
|
||||
<div class='dashboard-empty-message hide'>
|
||||
<a href='<?php echo $this->createLink("block", "admin", "id=0&module=$module"); ?>' data-toggle='modal' data-type='ajax' data-width='700' class='btn btn-primary'><i class='icon icon-plus'></i> <?php echo $lang->block->createBlock?></a>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class='row'>
|
||||
<?php foreach($blocks as $index => $block):?>
|
||||
<?php if(isset($config->block->closed) and strpos(",{$config->block->closed},", ",{$block->source}|{$block->block},") !== false) continue;?>
|
||||
<div class='col-sm-6 col-md-<?php echo $block->grid;?>'>
|
||||
<div class='panel panel-block <?php if(isset($block->params->color)) echo 'panel-' . $block->params->color;?>' id='block<?php echo $block->id?>' data-id='<?php echo $block->id?>' data-name='<?php echo $block->title?>' data-url='<?php echo $block->blockLink?>'>
|
||||
<div class='panel-heading'>
|
||||
@@ -40,7 +43,10 @@ $useGuest = $this->app->user->account == 'guest';
|
||||
<?php if(!$block->source and $block->block == 'html'):?>
|
||||
<li><a href="javascript:hiddenBlock(<?php echo $index;?>)" class="hidden-panel"><i class='icon-eye-close'></i><?php echo $lang->block->hidden; ?></a></li>
|
||||
<?php endif;?>
|
||||
<li><a href='javascript:;' class='remove-panel'><i class='icon-remove'></i> <?php echo $lang->delete; ?></a></li>
|
||||
<li><a href='javascript:;' class='remove-panel'><i class='icon-remove'></i> <?php echo $lang->block->remove; ?></a></li>
|
||||
<?php endif;?>
|
||||
<?php if($this->app->user->admin):?>
|
||||
<li><?php echo html::a($this->createLink('block', 'close', "blockID={$block->id}"), "<i class='icon-eye-close'></i> {$lang->block->closeForever}", 'hiddenwin', "class='close-block' onclick=\"return confirm('{$lang->block->confirmClose}')\"")?>
|
||||
<?php endif;?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -64,7 +64,7 @@ $(function()
|
||||
$sparks = $sparks.not('.sparked');
|
||||
var rowHeight = $sparks.first().closest('tr').outerHeight() - ($.zui.browser.ie === 8 ? 0.3 : 0);
|
||||
|
||||
var scrollFn = false, scrollStart, i, id, $spark;
|
||||
var scrollFn = false, scrollStart = 6, i, id, $spark;
|
||||
$projectbox.parent().on('scroll.spark', function(e)
|
||||
{
|
||||
if(!$sparks.length)
|
||||
@@ -76,8 +76,7 @@ $(function()
|
||||
|
||||
scrollFn = setTimeout(function()
|
||||
{
|
||||
scrollStart = Math.floor(($projectbox.scrollTop() - 30) / (rowHeight)) + 1;
|
||||
for(i = scrollStart; i <= scrollStart + 7; i++)
|
||||
for(i = scrollStart; i <= scrollStart + 10; i++)
|
||||
{
|
||||
id = '#spark-' + i;
|
||||
$spark = $(id);
|
||||
@@ -85,6 +84,7 @@ $(function()
|
||||
$spark.addClass('sparked').projectLine();
|
||||
$sparks = $sparks.not(id);
|
||||
}
|
||||
scrollStart += 10;
|
||||
},100);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -66,27 +66,10 @@ class branch extends control
|
||||
$this->view->module = $module;
|
||||
$this->view->method = $method;
|
||||
$this->view->extra = $extra;
|
||||
$this->view->branches = $this->branch->getPairs($productID);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax get matched items
|
||||
*
|
||||
* @param string $keywords
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param string $extra
|
||||
* @param int $objectID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetMatchedItems($keywords, $module, $method, $extra, $objectID)
|
||||
{
|
||||
$this->view->link = $this->loadModel('product')->getProductLink($module, $method, $extra, true);
|
||||
$this->view->branches = $this->dao->select('*')->from(TABLE_BRANCH)->where('deleted')->eq(0)->andWhere('product')->eq($objectID)->andWhere('name')->like("%$keywords%")->orderBy('id desc')->fetchPairs('id', 'name');
|
||||
$this->view->productID = $objectID;
|
||||
$this->view->keywords = $keywords;
|
||||
$branches = $this->branch->getPairs($productID);
|
||||
$this->view->branches = $branches;
|
||||
$this->view->branchesPinyin = common::convert2Pinyin($branches);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<?php
|
||||
foreach($branches as $branchID => $branch)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $productID, $branchID), "<i class='icon-cube'></i> " . $branch, '', "class='text-important'"). "</li>";
|
||||
echo "<li data-id='{$branchID}' data-key='{$branchesPinyin[$branch]}'>" . html::a(sprintf($link, $productID, $branchID), "<i class='icon-cube'></i> " . $branch, '', "class='text-important'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<div class='search-list'>
|
||||
<ul>
|
||||
<?php if(!$branches) echo "<li class='no-result-tip'>" . sprintf($lang->product->noMatched, $keywords) . '</li>';?>
|
||||
<?php
|
||||
foreach($branches as $branchID => $branch)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $productID, $branchID), "<i class='icon-cube'></i> " . $branch). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
+10
-3
@@ -36,14 +36,14 @@ $config->bug->list->exportFields = 'id, product, branch, module, project, story,
|
||||
lastEditedBy,
|
||||
lastEditedDate, files';
|
||||
|
||||
$config->bug->list->customCreateFields = 'project,story,task,pri,severity,os,browser,mailto,keywords';
|
||||
$config->bug->list->customCreateFields = 'project,story,task,pri,severity,os,browser,deadline,mailto,keywords';
|
||||
$config->bug->list->customBatchCreateFields = 'module,project,steps,type,pri,severity,os,browser,keywords';
|
||||
$config->bug->list->customBatchEditFields = 'type,severity,pri,productplan,assignedTo,status,resolvedBy,resolution,os,browser,keywords';
|
||||
$config->bug->list->customBatchEditFields = 'type,severity,pri,productplan,assignedTo,deadline,status,resolvedBy,resolution,os,browser,keywords';
|
||||
|
||||
$config->bug->custom = new stdclass();
|
||||
$config->bug->custom->createFields = $config->bug->list->customCreateFields;
|
||||
$config->bug->custom->batchCreateFields = 'module,project,steps,type,severity,os,browser';
|
||||
$config->bug->custom->batchEditFields = 'type,severity,pri,assignedTo,status,resolvedBy,resolution';
|
||||
$config->bug->custom->batchEditFields = 'type,severity,pri,assignedTo,deadline,status,resolvedBy,resolution';
|
||||
|
||||
$config->bug->editor = new stdclass();
|
||||
$config->bug->editor->create = array('id' => 'steps', 'tools' => 'bugTools');
|
||||
@@ -99,6 +99,7 @@ $config->bug->search['fields']['assignedDate'] = $lang->bug->assignedDate;
|
||||
$config->bug->search['fields']['resolvedDate'] = $lang->bug->resolvedDate;
|
||||
$config->bug->search['fields']['closedDate'] = $lang->bug->closedDate;
|
||||
$config->bug->search['fields']['lastEditedDate'] = $lang->bug->lastEditedDateAB;
|
||||
$config->bug->search['fields']['deadline'] = $lang->bug->deadline;
|
||||
|
||||
$config->bug->search['params']['title'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
$config->bug->search['params']['keywords'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
|
||||
@@ -141,6 +142,7 @@ $config->bug->search['params']['assignedDate'] = array('operator' => '=',
|
||||
$config->bug->search['params']['resolvedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->bug->search['params']['closedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->bug->search['params']['lastEditedDate']= array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
$config->bug->search['params']['deadline'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
|
||||
|
||||
$config->bug->datatable = new stdclass();
|
||||
$config->bug->datatable->defaultField = array('id', 'severity', 'pri', 'title', 'status', 'openedBy', 'openedDate', 'assignedTo', 'resolvedBy', 'resolution', 'resolvedDate', 'actions');
|
||||
@@ -205,6 +207,11 @@ $config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
|
||||
$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['deadline']['width'] = '90';
|
||||
$config->bug->datatable->fieldList['deadline']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedByAB';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['resolvedBy']['width'] = '80';
|
||||
|
||||
+22
-22
@@ -250,6 +250,7 @@ class bug extends control
|
||||
$os = '';
|
||||
$browser = '';
|
||||
$assignedTo = '';
|
||||
$deadline = '';
|
||||
$mailto = '';
|
||||
$keywords = '';
|
||||
$severity = 3;
|
||||
@@ -259,16 +260,8 @@ class bug extends control
|
||||
$extras = str_replace(array(',', ' '), array('&', ''), $extras);
|
||||
parse_str($extras);
|
||||
|
||||
/* If set runID, get the last result info as the template. */
|
||||
if(!empty($runID)) $resultID = $this->dao->select('id')->from(TABLE_TESTRESULT)->where('run')->eq($runID)->orderBy('id desc')->limit(1)->fetch('id');
|
||||
if(isset($resultID) and $resultID > 0) extract($this->bug->getBugInfoFromResult($resultID));
|
||||
|
||||
/* If set caseID and runID='', get the last result info as the template. */
|
||||
if($caseID && empty($runID))
|
||||
{
|
||||
$resultID = $this->dao->select('id')->from(TABLE_TESTRESULT)->where('`case`')->eq($caseID)->orderBy('date desc')->limit(1)->fetch('id');
|
||||
if(isset($resultID) and $resultID > 0) extract($this->bug->getBugInfoFromResult($resultID, $caseID, $version));
|
||||
}
|
||||
if($runID and $resultID) extract($this->bug->getBugInfoFromResult($resultID));// If set runID and resultID, get the result info by resultID as template.
|
||||
if(!$runID and $caseID) extract($this->bug->getBugInfoFromResult($resultID, $caseID, $version));// If not set runID but set caseID, get the result info by resultID and case info.
|
||||
|
||||
/* If bugID setted, use this bug as template. */
|
||||
if(isset($bugID))
|
||||
@@ -283,6 +276,7 @@ class bug extends control
|
||||
$severity = $bug->severity;
|
||||
$type = $bug->type;
|
||||
$assignedTo = $bug->assignedTo;
|
||||
$deadline = $bug->deadline;
|
||||
}
|
||||
|
||||
/* If projectID is setted, get builds and stories of this project. */
|
||||
@@ -338,6 +332,7 @@ class bug extends control
|
||||
$this->view->browser = $browser;
|
||||
$this->view->projectMembers = $projectMembers;
|
||||
$this->view->assignedTo = $assignedTo;
|
||||
$this->view->deadline = $deadline;
|
||||
$this->view->mailto = $mailto;
|
||||
$this->view->keywords = $keywords;
|
||||
$this->view->severity = $severity;
|
||||
@@ -650,10 +645,9 @@ class bug extends control
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)->where('id')->in($bugIDList)->fetchAll('id');
|
||||
|
||||
/* Judge whether the editedTasks is too large and set session. */
|
||||
$showSuhosinInfo = false;
|
||||
$showSuhosinInfo = $this->loadModel('common')->judgeSuhosinSetting(count($bugs), count(explode(',', $this->config->bug->custom->batchEditFields)) + 2);
|
||||
$this->app->session->set('showSuhosinInfo', $showSuhosinInfo);
|
||||
if($showSuhosinInfo) $this->view->suhosinInfo = $this->lang->suhosinInfo;
|
||||
$countInputVars = count($bugs) * (count(explode(',', $this->config->bug->custom->batchEditFields)) + 2);
|
||||
$showSuhosinInfo = common::judgeSuhosinSetting($countInputVars);
|
||||
if($showSuhosinInfo) $this->view->suhosinInfo = extension_loaded('suhosin') ? sprintf($this->lang->suhosinInfo, $countInputVars) : sprintf($this->lang->maxVarsInfo, $countInputVars);
|
||||
|
||||
/* Set Custom*/
|
||||
foreach(explode(',', $this->config->bug->list->customBatchEditFields) as $field) $customFields[$field] = $this->lang->bug->$field;
|
||||
@@ -1281,6 +1275,7 @@ class bug extends control
|
||||
if($_POST)
|
||||
{
|
||||
$this->loadModel('file');
|
||||
$this->loadModel('branch');
|
||||
$bugLang = $this->lang->bug;
|
||||
$bugConfig = $this->config->bug;
|
||||
|
||||
@@ -1304,16 +1299,18 @@ class bug extends control
|
||||
$projects = $this->loadModel('project')->getPairs('all|nocode');
|
||||
|
||||
/* Get related objects id lists. */
|
||||
$relatedModuleIdList = array();
|
||||
$relatedStoryIdList = array();
|
||||
$relatedTaskIdList = array();
|
||||
$relatedBugIdList = array();
|
||||
$relatedCaseIdList = array();
|
||||
$relatedBuildIdList = array();
|
||||
$relatedBranchIdList = array();
|
||||
$relatedProductIdList = array();
|
||||
$relatedModuleIdList = array();
|
||||
$relatedStoryIdList = array();
|
||||
$relatedTaskIdList = array();
|
||||
$relatedBugIdList = array();
|
||||
$relatedCaseIdList = array();
|
||||
$relatedBuildIdList = array();
|
||||
$relatedBranchIdList = array();
|
||||
|
||||
foreach($bugs as $bug)
|
||||
{
|
||||
$relatedProductIdList[$bug->product] = $bug->product;
|
||||
$relatedModuleIdList[$bug->module] = $bug->module;
|
||||
$relatedStoryIdList[$bug->story] = $bug->story;
|
||||
$relatedTaskIdList[$bug->task] = $bug->task;
|
||||
@@ -1338,12 +1335,13 @@ class bug extends control
|
||||
}
|
||||
|
||||
/* Get related objects title or names. */
|
||||
$productsType = $this->dao->select('id, type')->from(TABLE_PRODUCT)->where('id')->in($relatedProductIdList)->fetchPairs();
|
||||
$relatedModules = $this->dao->select('id, name')->from(TABLE_MODULE)->where('id')->in($relatedModuleIdList)->fetchPairs();
|
||||
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
|
||||
$relatedTasks = $this->dao->select('id, name')->from(TABLE_TASK)->where('id')->in($relatedTaskIdList)->fetchPairs();
|
||||
$relatedBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('id')->in($relatedBugIdList)->fetchPairs();
|
||||
$relatedCases = $this->dao->select('id, title')->from(TABLE_CASE)->where('id')->in($relatedCaseIdList)->fetchPairs();
|
||||
$relatedBranch = $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($relatedBranchIdList)->fetchPairs();
|
||||
$relatedBranch = array('0' => $this->lang->branch->all) + $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($relatedBranchIdList)->fetchPairs();
|
||||
$relatedBuilds = array('trunk' => $this->lang->trunk) + $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
|
||||
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('bug')->andWhere('objectID')->in(@array_keys($bugs))->fetchGroup('objectID');
|
||||
|
||||
@@ -1440,6 +1438,8 @@ class bug extends control
|
||||
unset($bug->deleted);
|
||||
}
|
||||
|
||||
if(!(in_array('platform', $productsType) or in_array('branch', $productsType))) unset($fields['branch']);// If products's type are normal, unset branch field.
|
||||
|
||||
$this->post->set('fields', $fields);
|
||||
$this->post->set('rows', $bugs);
|
||||
$this->post->set('kind', 'bug');
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
#contactListGroup .input-group-btn > .btn {margin-left: -1px!important;}
|
||||
#contactListGroup .chosen-container-single a {border-left-width: 0px;}
|
||||
|
||||
.chosen-container {max-width: 533px;}
|
||||
.chosen-container {max-width: 580px;}
|
||||
|
||||
.minw-80px {min-width: 80px;}
|
||||
|
||||
|
||||
@@ -75,22 +75,23 @@ function setTemplate(templateID)
|
||||
function deleteTemplate(templateID)
|
||||
{
|
||||
if(!templateID) return;
|
||||
if (confirm(TemplateDelete)){
|
||||
if(confirm(confirmDeleteTemplate))
|
||||
{
|
||||
hiddenwin.location.href = createLink('bug', 'deleteTemplate', 'templateID=' + templateID);
|
||||
$('#tplBox' + templateID).addClass('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
/*visbile template x icon*/
|
||||
function mouseOver(delTempID)
|
||||
/* Display template x icon. */
|
||||
function displayXIcon(templateID)
|
||||
{
|
||||
$('#delTemp'+delTempID).removeClass('hidden');
|
||||
$('#templateID' + templateID).removeClass('hidden');
|
||||
}
|
||||
|
||||
/*hidden template x icon*/
|
||||
function mouseOut(delTempID)
|
||||
/* Hide template x icon. */
|
||||
function hideXIcon(templateID)
|
||||
{
|
||||
$('#delTemp'+delTempID).addClass('hidden');
|
||||
$('#templateID' + templateID).addClass('hidden');
|
||||
}
|
||||
|
||||
$(function()
|
||||
|
||||
+16
-7
@@ -13,6 +13,7 @@
|
||||
$lang->bug->common = 'Bug';
|
||||
$lang->bug->id = 'ID';
|
||||
$lang->bug->product = $lang->productCommon;
|
||||
$lang->bug->branch = 'Branch/Platform';
|
||||
$lang->bug->productplan = 'Plan';
|
||||
$lang->bug->module = 'Module';
|
||||
$lang->bug->moduleAB = 'Module';
|
||||
@@ -48,6 +49,7 @@ $lang->bug->resolutionAB = 'Solution';
|
||||
$lang->bug->resolvedBuild = 'Resolved Build';
|
||||
$lang->bug->resolvedDate = 'Resolved On';
|
||||
$lang->bug->resolvedDateAB = 'Resolved On';
|
||||
$lang->bug->deadline = 'Deadline';
|
||||
$lang->bug->closedBy = 'Closed By';
|
||||
$lang->bug->closedDate = 'Closed On';
|
||||
$lang->bug->duplicateBug = 'Duplicate';
|
||||
@@ -99,11 +101,12 @@ $lang->bug->openedByMe = 'Created by Me';
|
||||
$lang->bug->resolvedByMe = 'Resolved by Me';
|
||||
$lang->bug->closedByMe = 'Closed by Me';
|
||||
$lang->bug->assignToNull = 'Unassigned';
|
||||
$lang->bug->unResolved = 'Unresolve';
|
||||
$lang->bug->unResolved = 'Unresolved';
|
||||
$lang->bug->toClosed = 'To Be Closed';
|
||||
$lang->bug->unclosed = 'Open';
|
||||
$lang->bug->longLifeBugs = 'Pending';
|
||||
$lang->bug->postponedBugs = 'Postponed';
|
||||
$lang->bug->overdueBugs = 'Overdue';
|
||||
$lang->bug->allBugs = 'All';
|
||||
$lang->bug->byQuery = 'Search';
|
||||
$lang->bug->needConfirm = 'Story Change';
|
||||
@@ -130,18 +133,19 @@ $lang->bug->lblSystemBrowserAndHardware = 'System/Browser';
|
||||
$lang->bug->legendSteps = 'Repro Steps';
|
||||
$lang->bug->legendComment = 'Note';
|
||||
$lang->bug->legendLife = 'Lifecycle';
|
||||
$lang->bug->legendMisc = 'Miscellaneous';
|
||||
$lang->bug->legendMisc = 'Misc';
|
||||
|
||||
/* 功能按钮。*/
|
||||
$lang->bug->buttonConfirm = 'Confirm';
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->bug->confirmChangeProduct = "Modification on {$lang->productCommon} will cause linked {$lang->projectCommon},Story and Task change. Do you want to do this?";
|
||||
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
|
||||
$lang->bug->setTemplateTitle = 'Please enter the title of template.';
|
||||
$lang->bug->remindTask = 'This Bug has been converted to Task. Do you want to update Status of Task(ID %s)?';
|
||||
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
|
||||
$lang->bug->applyTemplate = 'Apply Template';
|
||||
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
|
||||
$lang->bug->setTemplateTitle = 'Please enter the title of template.';
|
||||
$lang->bug->remindTask = 'This Bug has been converted to Task. Do you want to update Status of Task(ID %s)?';
|
||||
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
|
||||
$lang->bug->applyTemplate = 'Apply Template';
|
||||
$lang->bug->confirmDeleteTemplate = 'Do you want to delete this template?';
|
||||
|
||||
/* 模板。*/
|
||||
$lang->bug->tplStep = "<p>[Steps]</p>\n";
|
||||
@@ -257,6 +261,7 @@ $lang->bug->report->charts['bugsPerSeverity'] = 'Bug Priority Report';
|
||||
$lang->bug->report->charts['bugsPerResolution'] = 'Bug Solution Report';
|
||||
$lang->bug->report->charts['bugsPerStatus'] = 'Bug Status Report';
|
||||
$lang->bug->report->charts['bugsPerActivatedCount'] = 'Bug Activation Report';
|
||||
$lang->bug->report->charts['bugsPerPri'] = 'Bug Priority Report';
|
||||
$lang->bug->report->charts['bugsPerType'] = 'Bug Type Report';
|
||||
$lang->bug->report->charts['bugsPerAssignedTo'] = 'Bug Assignment Report';
|
||||
//$lang->bug->report->charts['bugLiveDays'] = 'Bug Handling Time Report';
|
||||
@@ -282,6 +287,7 @@ $lang->bug->report->bugsPerResolution = new stdclass();
|
||||
$lang->bug->report->bugsPerStatus = new stdclass();
|
||||
$lang->bug->report->bugsPerActivatedCount = new stdclass();
|
||||
$lang->bug->report->bugsPerType = new stdclass();
|
||||
$lang->bug->report->bugsPerPri = new stdclass();
|
||||
$lang->bug->report->bugsPerAssignedTo = new stdclass();
|
||||
$lang->bug->report->bugLiveDays = new stdclass();
|
||||
$lang->bug->report->bugHistories = new stdclass();
|
||||
@@ -300,6 +306,7 @@ $lang->bug->report->bugsPerResolution->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerStatus->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerActivatedCount->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerType->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerPri->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerAssignedTo->graph = new stdclass();
|
||||
$lang->bug->report->bugLiveDays->graph = new stdclass();
|
||||
$lang->bug->report->bugHistories->graph = new stdclass();
|
||||
@@ -325,6 +332,7 @@ $lang->bug->report->bugsPerSeverity->graph->xAxisName = 'Priority';
|
||||
$lang->bug->report->bugsPerResolution->graph->xAxisName = 'Solution';
|
||||
$lang->bug->report->bugsPerStatus->graph->xAxisName = 'Status';
|
||||
$lang->bug->report->bugsPerActivatedCount->graph->xAxisName = 'Activation Count';
|
||||
$lang->bug->report->bugsPerPri->graph->xAxisName = 'Priority';
|
||||
$lang->bug->report->bugsPerType->graph->xAxisName = 'Type';
|
||||
$lang->bug->report->bugsPerAssignedTo->graph->xAxisName = 'Assigned To';
|
||||
$lang->bug->report->bugLiveDays->graph->xAxisName = 'Handling Time';
|
||||
@@ -359,4 +367,5 @@ $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
|
||||
$lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed;
|
||||
$lang->bug->featureBar['browse']['longlifebugs'] = $lang->bug->longLifeBugs;
|
||||
$lang->bug->featureBar['browse']['postponedbugs'] = $lang->bug->postponedBugs;
|
||||
$lang->bug->featureBar['browse']['overduebugs'] = $lang->bug->overdueBugs;
|
||||
$lang->bug->featureBar['browse']['needconfirm'] = $lang->bug->needConfirm;
|
||||
|
||||
@@ -49,6 +49,7 @@ $lang->bug->resolutionAB = '方案';
|
||||
$lang->bug->resolvedBuild = '解决版本';
|
||||
$lang->bug->resolvedDate = '解决日期';
|
||||
$lang->bug->resolvedDateAB = '解决日期';
|
||||
$lang->bug->deadline = '截止日期';
|
||||
$lang->bug->closedBy = '由谁关闭';
|
||||
$lang->bug->closedDate = '关闭日期';
|
||||
$lang->bug->duplicateBug = '重复ID';
|
||||
@@ -105,6 +106,7 @@ $lang->bug->toClosed = '待关闭';
|
||||
$lang->bug->unclosed = '未关闭';
|
||||
$lang->bug->longLifeBugs = '久未处理';
|
||||
$lang->bug->postponedBugs = '被延期';
|
||||
$lang->bug->overdueBugs = '过期Bug';
|
||||
$lang->bug->allBugs = '所有';
|
||||
$lang->bug->byQuery = '搜索';
|
||||
$lang->bug->needConfirm = '需求变动';
|
||||
@@ -137,13 +139,13 @@ $lang->bug->legendMisc = '其他相关';
|
||||
$lang->bug->buttonConfirm = '确认';
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->projectCommon}、需求和任务发生变化,确定吗?";
|
||||
$lang->bug->confirmDelete = '您确认要删除该Bug吗?';
|
||||
$lang->bug->setTemplateTitle = '请输入bug模板标题';
|
||||
$lang->bug->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
|
||||
$lang->bug->applyTemplate = '应用模板';
|
||||
$lang->bug->TemplateDelete = '您确认要删除该模板吗?';
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->projectCommon}、需求和任务发生变化,确定吗?";
|
||||
$lang->bug->confirmDelete = '您确认要删除该Bug吗?';
|
||||
$lang->bug->setTemplateTitle = '请输入bug模板标题';
|
||||
$lang->bug->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
|
||||
$lang->bug->applyTemplate = '应用模板';
|
||||
$lang->bug->confirmDeleteTemplate = '您确认要删除该模板吗?';
|
||||
|
||||
/* 模板。*/
|
||||
$lang->bug->tplStep = "<p>[步骤]</p>\n";
|
||||
@@ -365,4 +367,5 @@ $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
|
||||
$lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed;
|
||||
$lang->bug->featureBar['browse']['longlifebugs'] = $lang->bug->longLifeBugs;
|
||||
$lang->bug->featureBar['browse']['postponedbugs'] = $lang->bug->postponedBugs;
|
||||
$lang->bug->featureBar['browse']['overduebugs'] = $lang->bug->overdueBugs;
|
||||
$lang->bug->featureBar['browse']['needconfirm'] = $lang->bug->needConfirm;
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
$lang->bug->common = 'Bug';
|
||||
$lang->bug->id = 'Bug編號';
|
||||
$lang->bug->product = '所屬' . $lang->productCommon;
|
||||
$lang->bug->branch = '分支/平台';
|
||||
$lang->bug->productplan = '所屬計劃';
|
||||
$lang->bug->module = '所屬模組';
|
||||
$lang->bug->moduleAB = '模組';
|
||||
@@ -48,6 +49,7 @@ $lang->bug->resolutionAB = '方案';
|
||||
$lang->bug->resolvedBuild = '解決版本';
|
||||
$lang->bug->resolvedDate = '解決日期';
|
||||
$lang->bug->resolvedDateAB = '解決日期';
|
||||
$lang->bug->deadline = '截止日期';
|
||||
$lang->bug->closedBy = '由誰關閉';
|
||||
$lang->bug->closedDate = '關閉日期';
|
||||
$lang->bug->duplicateBug = '重複ID';
|
||||
@@ -104,6 +106,7 @@ $lang->bug->toClosed = '待關閉';
|
||||
$lang->bug->unclosed = '未關閉';
|
||||
$lang->bug->longLifeBugs = '久未處理';
|
||||
$lang->bug->postponedBugs = '被延期';
|
||||
$lang->bug->overdueBugs = '過期Bug';
|
||||
$lang->bug->allBugs = '所有';
|
||||
$lang->bug->byQuery = '搜索';
|
||||
$lang->bug->needConfirm = '需求變動';
|
||||
@@ -136,12 +139,13 @@ $lang->bug->legendMisc = '其他相關';
|
||||
$lang->bug->buttonConfirm = '確認';
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}會導致相應的{$lang->projectCommon}、需求和任務發生變化,確定嗎?";
|
||||
$lang->bug->confirmDelete = '您確認要刪除該Bug嗎?';
|
||||
$lang->bug->setTemplateTitle = '請輸入bug模板標題';
|
||||
$lang->bug->remindTask = '該Bug已經轉化為任務,是否更新任務(編號:%s)狀態 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解決狀態,不能關閉。';
|
||||
$lang->bug->applyTemplate = '應用模板';
|
||||
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}會導致相應的{$lang->projectCommon}、需求和任務發生變化,確定嗎?";
|
||||
$lang->bug->confirmDelete = '您確認要刪除該Bug嗎?';
|
||||
$lang->bug->setTemplateTitle = '請輸入bug模板標題';
|
||||
$lang->bug->remindTask = '該Bug已經轉化為任務,是否更新任務(編號:%s)狀態 ?';
|
||||
$lang->bug->skipClose = 'Bug %s 不是已解決狀態,不能關閉。';
|
||||
$lang->bug->applyTemplate = '應用模板';
|
||||
$lang->bug->confirmDeleteTemplate = '您確認要刪除該模板嗎?';
|
||||
|
||||
/* 模板。*/
|
||||
$lang->bug->tplStep = "<p>[步驟]</p>\n";
|
||||
@@ -257,6 +261,7 @@ $lang->bug->report->charts['bugsPerSeverity'] = 'Bug嚴重程度統計';
|
||||
$lang->bug->report->charts['bugsPerResolution'] = 'Bug解決方案統計';
|
||||
$lang->bug->report->charts['bugsPerStatus'] = 'Bug狀態統計';
|
||||
$lang->bug->report->charts['bugsPerActivatedCount'] = 'Bug激活次數統計';
|
||||
$lang->bug->report->charts['bugsPerPri'] = 'Bug優先順序統計';
|
||||
$lang->bug->report->charts['bugsPerType'] = 'Bug類型統計';
|
||||
$lang->bug->report->charts['bugsPerAssignedTo'] = '指派給統計';
|
||||
//$lang->bug->report->charts['bugLiveDays'] = 'Bug處理時間統計';
|
||||
@@ -282,6 +287,7 @@ $lang->bug->report->bugsPerResolution = new stdclass();
|
||||
$lang->bug->report->bugsPerStatus = new stdclass();
|
||||
$lang->bug->report->bugsPerActivatedCount = new stdclass();
|
||||
$lang->bug->report->bugsPerType = new stdclass();
|
||||
$lang->bug->report->bugsPerPri = new stdclass();
|
||||
$lang->bug->report->bugsPerAssignedTo = new stdclass();
|
||||
$lang->bug->report->bugLiveDays = new stdclass();
|
||||
$lang->bug->report->bugHistories = new stdclass();
|
||||
@@ -300,6 +306,7 @@ $lang->bug->report->bugsPerResolution->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerStatus->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerActivatedCount->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerType->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerPri->graph = new stdclass();
|
||||
$lang->bug->report->bugsPerAssignedTo->graph = new stdclass();
|
||||
$lang->bug->report->bugLiveDays->graph = new stdclass();
|
||||
$lang->bug->report->bugHistories->graph = new stdclass();
|
||||
@@ -325,6 +332,7 @@ $lang->bug->report->bugsPerSeverity->graph->xAxisName = '嚴重程度';
|
||||
$lang->bug->report->bugsPerResolution->graph->xAxisName = '解決方案';
|
||||
$lang->bug->report->bugsPerStatus->graph->xAxisName = '狀態';
|
||||
$lang->bug->report->bugsPerActivatedCount->graph->xAxisName = '激活次數';
|
||||
$lang->bug->report->bugsPerPri->graph->xAxisName = '優先順序';
|
||||
$lang->bug->report->bugsPerType->graph->xAxisName = '類型';
|
||||
$lang->bug->report->bugsPerAssignedTo->graph->xAxisName = '指派給';
|
||||
$lang->bug->report->bugLiveDays->graph->xAxisName = '處理時間';
|
||||
@@ -359,4 +367,5 @@ $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
|
||||
$lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed;
|
||||
$lang->bug->featureBar['browse']['longlifebugs'] = $lang->bug->longLifeBugs;
|
||||
$lang->bug->featureBar['browse']['postponedbugs'] = $lang->bug->postponedBugs;
|
||||
$lang->bug->featureBar['browse']['overduebugs'] = $lang->bug->overdueBugs;
|
||||
$lang->bug->featureBar['browse']['needconfirm'] = $lang->bug->needConfirm;
|
||||
|
||||
+86
-20
@@ -46,6 +46,7 @@ class bugModel extends model
|
||||
->add('openedDate', $now)
|
||||
->setDefault('project,story,task', 0)
|
||||
->setDefault('openedBuild', '')
|
||||
->setDefault('deadline', '0000-00-00')
|
||||
->setIF($this->post->assignedTo != '', 'assignedDate', $now)
|
||||
->setIF($this->post->story != false, 'storyVersion', $this->loadModel('story')->getVersion($this->post->story))
|
||||
->stripTags($this->config->bug->editor->create['id'], $this->config->allowedTags)
|
||||
@@ -244,6 +245,37 @@ class bugModel extends model
|
||||
elseif($browseType == 'postponedbugs') $bugs = $this->getByPostponedbugs($productID, $branch, $modules, $projects, $sort, $pager);
|
||||
elseif($browseType == 'needconfirm') $bugs = $this->getByNeedconfirm($productID, $branch, $modules, $projects, $sort, $pager);
|
||||
elseif($browseType == 'bysearch') $bugs = $this->getBySearch($productID, $queryID, $sort, $pager, $branch);
|
||||
elseif($browseType == 'overduebugs') $bugs = $this->getOverdueBugs($productID, $branch, $modules, $projects, $sort, $pager);
|
||||
|
||||
return $this->checkDelayBugs($bugs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check delay bug.
|
||||
*
|
||||
* @param array $bugs
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function checkDelayBugs($bugs)
|
||||
{
|
||||
foreach ($bugs as $bug)
|
||||
{
|
||||
// Delayed or not?.
|
||||
if($bug->deadline != '0000-00-00')
|
||||
{
|
||||
if(substr($bug->resolvedDate, 0, 10) != '0000-00-00')
|
||||
{
|
||||
$delay = helper::diffDate(substr($bug->resolvedDate, 0, 10), $bug->deadline);
|
||||
}
|
||||
elseif($bug->status == 'active')
|
||||
{
|
||||
$delay = helper::diffDate(helper::today(), $bug->deadline);
|
||||
}
|
||||
|
||||
if(isset($delay) and $delay > 0) $bug->delay = $delay;
|
||||
}
|
||||
}
|
||||
|
||||
return $bugs;
|
||||
}
|
||||
@@ -454,6 +486,7 @@ class bugModel extends model
|
||||
->setDefault('project,module,project,story,task,duplicateBug,branch', 0)
|
||||
->setDefault('openedBuild', '')
|
||||
->setDefault('plan', 0)
|
||||
->setDefault('deadline', '0000-00-00')
|
||||
->add('lastEditedBy', $this->app->user->account)
|
||||
->add('lastEditedDate', $now)
|
||||
->join('openedBuild', ',')
|
||||
@@ -507,9 +540,6 @@ class bugModel extends model
|
||||
$data = fixer::input('post')->get();
|
||||
$bugIDList = $this->post->bugIDList ? $this->post->bugIDList : array();
|
||||
|
||||
/* Adjust whether the post data is complete, if not, remove the last element of $bugIDList. */
|
||||
if($this->session->showSuhosinInfo) array_pop($bugIDList);
|
||||
|
||||
if(!empty($bugIDList))
|
||||
{
|
||||
/* Process the data if the value is 'ditto'. */
|
||||
@@ -552,6 +582,7 @@ class bugModel extends model
|
||||
$bug->title = $data->titles[$bugID];
|
||||
$bug->plan = empty($data->plans[$bugID]) ? 0 : $data->plans[$bugID];
|
||||
$bug->assignedTo = $data->assignedTos[$bugID];
|
||||
$bug->deadline = $data->deadlines[$bugID];
|
||||
$bug->resolvedBy = $data->resolvedBys[$bugID];
|
||||
$bug->keywords = $data->keywords[$bugID];
|
||||
$bug->os = $data->os[$bugID];
|
||||
@@ -1177,6 +1208,7 @@ class bugModel extends model
|
||||
$bugs = $this->dao->select('*')->from(TABLE_BUG)
|
||||
->where($bugQuery)
|
||||
->andWhere('project')->eq((int)$projectID)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
@@ -1319,15 +1351,17 @@ class bugModel extends model
|
||||
* Get counts of some stories' bugs.
|
||||
*
|
||||
* @param array $stories
|
||||
* @param int $projectID
|
||||
* @access public
|
||||
* @return int
|
||||
*/
|
||||
public function getStoryBugCounts($stories)
|
||||
public function getStoryBugCounts($stories, $projectID = 0)
|
||||
{
|
||||
$bugCounts = $this->dao->select('story, COUNT(*) AS bugs')
|
||||
->from(TABLE_BUG)
|
||||
->where('story')->in($stories)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->beginIF($projectID)->andWhere('project')->eq($projectID)->fi()
|
||||
->groupBy('story')
|
||||
->fetchPairs();
|
||||
foreach($stories as $storyID) if(!isset($bugCounts[$storyID])) $bugCounts[$storyID] = 0;
|
||||
@@ -1371,34 +1405,35 @@ class bugModel extends model
|
||||
$bugSteps .= $this->lang->bug->tplStep;
|
||||
if(!empty($stepResults))
|
||||
{
|
||||
$i = 0;
|
||||
foreach($caseSteps as $key => $step)
|
||||
$i = 1;
|
||||
foreach($steps as $stepId)
|
||||
{
|
||||
if(!in_array($step->id, $steps)) continue;
|
||||
$i++;
|
||||
if(!isset($caseSteps[$stepId])) continue;
|
||||
|
||||
$step = $caseSteps[$stepId];
|
||||
$bugSteps .= $i . '. ' . $step->desc . "<br />";
|
||||
$i++;
|
||||
}
|
||||
|
||||
$bugSteps .= $this->lang->bug->tplResult;
|
||||
$i = 0;
|
||||
foreach($caseSteps as $key => $step)
|
||||
$i = 1;
|
||||
foreach($steps as $stepId)
|
||||
{
|
||||
if(!in_array($step->id, $steps)) continue;
|
||||
if(!isset($stepResults[$stepId]) or empty($stepResults[$stepId]['real'])) continue;
|
||||
$bugSteps .= $i . '. ' . $stepResults[$stepId]['real'] . "<br />";
|
||||
$i++;
|
||||
if(empty($stepResults[$step->id]['real'])) continue;
|
||||
$bugSteps .= $i . '. ' . $stepResults[$step->id]['real'] . "<br />";
|
||||
}
|
||||
|
||||
$bugSteps .= $this->lang->bug->tplExpect;
|
||||
$i = 0;
|
||||
foreach($caseSteps as $key => $step)
|
||||
$i = 1;
|
||||
foreach($steps as $stepId)
|
||||
{
|
||||
if(!in_array($step->id, $steps)) continue;
|
||||
$i++;
|
||||
if(!$step->expect) continue;
|
||||
$bugSteps .= $i . '. ' . $step->expect . "<br />";
|
||||
}
|
||||
if(!isset($caseSteps[$stepId])) continue;
|
||||
|
||||
$step = $caseSteps[$stepId];
|
||||
if($step->expect) $bugSteps .= $i . '. ' . $step->expect . "<br />";
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
return array('title' => $title, 'steps' => $bugSteps, 'storyID' => $run->case->story, 'moduleID' => $run->case->module, 'version' => $run->case->version);
|
||||
@@ -1896,6 +1931,33 @@ class bugModel extends model
|
||||
->orderBy($orderBy)->page($pager)->fetchAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bugs the overdueBugs is active or unclosed.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param int $branch
|
||||
* @param array $modules
|
||||
* @param array $projects
|
||||
* @param string $status
|
||||
* @param string $orderBy
|
||||
* @param object $pager
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getOverdueBugs($productID, $branch, $modules, $projects, $orderBy, $pager)
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_BUG)
|
||||
->where('project')->in(array_keys($projects))
|
||||
->andWhere('product')->eq($productID)
|
||||
->beginIF($branch)->andWhere('branch')->in($branch)->fi()
|
||||
->beginIF($modules)->andWhere('module')->in($modules)->fi()
|
||||
->andWhere('status')->eq('active')
|
||||
->andWhere('deleted')->eq(0)
|
||||
->andWhere('deadline')->ne('0000-00-00')
|
||||
->andWhere('deadline')->lt(helper::today())
|
||||
->orderBy($orderBy)->page($pager)->fetchAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bugs the status is active or unclosed.
|
||||
*
|
||||
@@ -2175,6 +2237,7 @@ class bugModel extends model
|
||||
if($id == 'status') $class .= ' bug-' . $bug->status;
|
||||
if($id == 'title') $class .= ' text-left';
|
||||
if($id == 'assignedTo' && $bug->assignedTo == $account) $class .= ' red';
|
||||
if($id == 'deadline' && isset($bug->delay)) $class .= ' delayed';
|
||||
|
||||
echo "<td class='" . $class . "'" . ($id=='title' ? " title='{$bug->title}'" : '') . ">";
|
||||
switch ($id)
|
||||
@@ -2226,6 +2289,9 @@ class bugModel extends model
|
||||
case 'assignedDate':
|
||||
echo substr($bug->assignedDate, 5, 11);
|
||||
break;
|
||||
case 'deadline':
|
||||
echo $bug->deadline;
|
||||
break;
|
||||
case 'resolvedBy':
|
||||
echo zget($users, $bug->resolvedBy, $bug->resolvedBy);
|
||||
break;
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/datepicker.html.php';?>
|
||||
<?php js::set('dittoNotice', $this->lang->bug->dittoNotice);?>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
@@ -21,6 +22,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(isset($suhosinInfo)):?>
|
||||
<div class='alert alert-info'><?php echo $suhosinInfo;?></div>
|
||||
<?php else:?>
|
||||
<?php
|
||||
$visibleFields = array();
|
||||
foreach(explode(',', $showFields) as $field)
|
||||
@@ -40,6 +44,7 @@ $columns = count($visibleFields) + 2;
|
||||
<th <?php if(count($visibleFields) >= 10) echo "class='w-150px'"?>><?php echo $lang->bug->title;?> <span class='required'></span></th>
|
||||
<th class='w-150px<?php echo zget($visibleFields, 'productplan', ' hidden')?>'><?php echo $lang->bug->productplan;?></th>
|
||||
<th class='w-150px<?php echo zget($visibleFields, 'assignedTo', ' hidden')?>'><?php echo $lang->bug->assignedTo;?></th>
|
||||
<th class='w-100px<?php echo zget($visibleFields, 'deadline', ' hidden')?>'><?php echo $lang->bug->deadline;?></th>
|
||||
<th class='w-90px<?php echo zget($visibleFields, 'status', ' hidden')?>'><?php echo $lang->bug->status;?></th>
|
||||
<th class='w-100px<?php echo zget($visibleFields, 'os', ' hidden')?>'><?php echo $lang->bug->os;?></th>
|
||||
<th class='w-100px<?php echo zget($visibleFields, 'browser', ' hidden')?>'><?php echo $lang->bug->browser;?></th>
|
||||
@@ -77,6 +82,7 @@ $columns = count($visibleFields) + 2;
|
||||
</td>
|
||||
<td class='text-left<?php echo zget($visibleFields, 'productplan', ' hidden')?>' style='overflow:visible'><?php echo html::select("plans[$bugID]", $plans, $bugs[$bugID]->plan, "class='form-control chosen'");?></td>
|
||||
<td class='text-left<?php echo zget($visibleFields, 'assignedTo', ' hidden')?>' style='overflow:visible'><?php echo html::select("assignedTos[$bugID]", $users, $bugs[$bugID]->assignedTo, "class='form-control chosen'");?></td>
|
||||
<td class='<?php echo zget($visibleFields, 'deadline', ' hidden')?>' style='overflow:visible'><?php echo html::input("deadlines[$bugID]", $bugs[$bugID]->deadline, "class='form-control form-date'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'status', "class='hidden'")?>><?php echo html::select("statuses[$bugID]", $statusList, $bugs[$bugID]->status, 'class=form-control');?></td>
|
||||
<td <?php echo zget($visibleFields, 'os', "class='hidden'")?>><?php echo html::select("os[$bugID]", $osList, $bugs[$bugID]->os, 'class=form-control');?></td>
|
||||
<td <?php echo zget($visibleFields, 'browser', "class='hidden'")?>><?php echo html::select("browsers[$bugID]", $browserList, $bugs[$bugID]->browser, 'class=form-control');?></td>
|
||||
@@ -96,15 +102,13 @@ $columns = count($visibleFields) + 2;
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<?php if(isset($suhosinInfo)):?>
|
||||
<tr><td colspan='<?php echo $columns;?>'><div class='alert alert-info'><?php echo $suhosinInfo;?></div></td></tr>
|
||||
<?php endif;?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan='<?php echo $columns;?>' class='text-center'><?php echo html::submitButton();?></td></tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
<?php endif;?>
|
||||
<?php $customLink = $this->createLink('custom', 'ajaxSaveCustomFields', 'module=bug§ion=custom&key=batchEditFields')?>
|
||||
<?php include '../../common/view/customfield.html.php';?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -120,8 +120,8 @@ js::set('bugBrowseType', ($browseType == 'bymodule' and $this->session->bugBrows
|
||||
<tfoot>
|
||||
<tr>
|
||||
<?php
|
||||
$columns = $this->cookie->windowWidth >= $this->config->wideSize ? 12 : 10;
|
||||
if($browseType == 'needconfirm') $columns = 7;
|
||||
$columns = $this->cookie->windowWidth >= $this->config->wideSize ? 13 : 11;
|
||||
if($browseType == 'needconfirm') $columns = 8;
|
||||
?>
|
||||
<td colspan='<?php echo $columns;?>'>
|
||||
<?php if(!empty($bugs)):?>
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
<th class='w-pri'> <?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
|
||||
<th> <?php common::printOrderLink('title', $orderBy, $vars, $lang->bug->title);?></th>
|
||||
<th class='w-100px'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->bug->statusAB);?></th>
|
||||
<th class='w-80px'> <?php common::printOrderLink('deadline', $orderBy, $vars, $lang->bug->deadline);?></th>
|
||||
|
||||
<?php if($browseType == 'needconfirm'):?>
|
||||
<th class='w-200px'><?php common::printOrderLink('story', $orderBy, $vars, $lang->bug->story);?></th>
|
||||
@@ -76,7 +77,7 @@
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
|
||||
<td class="<?php if(isset($bug->delay)) echo 'delayed';?>"><?php if(substr($bug->deadline, 0, 4) > 0) echo substr($bug->deadline, 5, 6)?></td>
|
||||
<?php if($browseType == 'needconfirm'):?>
|
||||
<td class='text-left' title="<?php echo $bug->storyTitle?>"><?php echo html::a($this->createLink('story', 'view', "stoyID=$bug->story"), $bug->storyTitle, '_blank');?></td>
|
||||
<td><?php $lang->bug->confirmStoryChange = $lang->confirm; common::printIcon('bug', 'confirmStoryChange', "bugID=$bug->id", '', 'list', '', 'hiddenwin')?></td>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?php
|
||||
foreach($templates as $key => $template)
|
||||
{
|
||||
echo "<li id='tplBox$template->id' onmouseover='mouseOver($template->id)' onmouseout='mouseOut($template->id)'>";
|
||||
echo "<li id='tplBox$template->id' onmouseover='displayXIcon($template->id)' onmouseout='hideXIcon($template->id)'>";
|
||||
echo "<a title='{$lang->bug->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
|
||||
if($template->public) echo "<span class='label label-info label-badge'>{$lang->public}</span> ";
|
||||
echo $template->title . "</a>";
|
||||
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='delTemp$template->id' class='btn-delete hidden'><i class='icon-remove'></i></a>";
|
||||
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='templateID$template->id' class='btn-delete hidden'><i class='icon-remove'></i></a>";
|
||||
echo "<span id='template$template->id' class='hidden'>$template->content</span>";
|
||||
echo '</li>';
|
||||
}
|
||||
|
||||
@@ -14,12 +14,13 @@
|
||||
include '../../common/view/header.html.php';
|
||||
include '../../common/view/form.html.php';
|
||||
include '../../common/view/kindeditor.html.php';
|
||||
include '../../common/view/datepicker.html.php';
|
||||
js::set('holders', $lang->bug->placeholder);
|
||||
js::set('page', 'create');
|
||||
js::set('createRelease', $lang->release->create);
|
||||
js::set('createBuild', $lang->build->create);
|
||||
js::set('refresh', $lang->refresh);
|
||||
js::set('TemplateDelete',$lang->bug->TemplateDelete);
|
||||
js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
|
||||
?>
|
||||
<div class='container mw-1400px'>
|
||||
<div id='titlebar'>
|
||||
@@ -84,6 +85,15 @@ js::set('TemplateDelete',$lang->bug->TemplateDelete);
|
||||
<span class='input-group-btn'><?php echo html::commonButton($lang->bug->allUsers, "class='btn btn-default' onclick='loadAllUsers()' data-toggle='tooltip'");?></span>
|
||||
</div>
|
||||
</td>
|
||||
<?php $showDeadline = strpos(",$showFields,", ',deadline,') !== false;?>
|
||||
<?php if($showDeadline):?>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<span class='input-group-addon'><?php echo $lang->bug->deadline?></span>
|
||||
<span><?php echo html::input('deadline', $deadline, "class='form-control form-date'");?></span>
|
||||
</div>
|
||||
</td>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php $showOS = strpos(",$showFields,", ',os,') !== false;?>
|
||||
<?php $showBrowser = strpos(",$showFields,", ',browser,') !== false;?>
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
?>
|
||||
<?php
|
||||
include '../../common/view/header.html.php';
|
||||
include '../../common/view/datepicker.html.php';
|
||||
include '../../common/view/kindeditor.html.php';
|
||||
js::set('page' , 'edit');
|
||||
js::set('changeProductConfirmed' , false);
|
||||
@@ -142,6 +143,10 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild);
|
||||
<th><?php echo $lang->bug->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='form-control chosen'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->deadline;?></th>
|
||||
<td><?php echo html::input('deadline', $bug->deadline, "class='form-control form-date'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->os;?></th>
|
||||
<td><?php echo html::select('os', $lang->bug->osList, $bug->os, "class='form-control'");?></td>
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<form method='post' enctype='multipart/form-data' target='hiddenwin'>
|
||||
<h3><?php echo "BUG#$bug->id $bug->title";?></h3>
|
||||
<table class='table-1'>
|
||||
<tr>
|
||||
<td class='w-80px'><?php echo $lang->bug->assignedTo?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->resolvedBy, "class='form-control'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo $lang->bug->openedBuild;?></td>
|
||||
<td><?php echo html::select('openedBuild[]', $builds, $bug->openedBuild, 'size=4 multiple=multiple class=select-3');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo $lang->comment;?></td>
|
||||
<td><?php echo html::textarea('comment', '');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='text-center' colspan='2'>
|
||||
<?php echo html::submitButton($lang->bug->buttonConfirm, 'data-inline="true" data-theme="b"');?>
|
||||
<?php echo html::linkButton($lang->goback, $this->createLink('bug', 'view', "bugID=$bug->id"), 'self', "data-inline='true'");?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php include '../../common/view/m.action.html.php';?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1 +0,0 @@
|
||||
<?php include '../../common/view/m.action.html.php';?>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<form class='form-condensed' method='post' target='hiddenwin'>
|
||||
<h3><?php echo "BUG#$bug->id " . $bug->title;?></h3>
|
||||
<table class='table-1'>
|
||||
<tr>
|
||||
<td class='w-60px'><?php echo $lang->bug->assignedTo;?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo, "class='form-control'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='w-60px'><?php echo $lang->comment;?></td>
|
||||
<td><?php echo html::textarea('comment', '', "data-mini='true'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='text-center' colspan='2'>
|
||||
<?php echo html::submitButton('', 'data-inline="true" data-theme="b"'); ?>
|
||||
<?php echo html::linkButton($lang->goback, $this->createLink('bug', 'view', "bugID=$bug->id"), 'self', "data-inline='true'");?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php include '../../common/view/m.action.html.php';?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The browse view file of bug module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
||||
* @package bug
|
||||
* @version $Id: browse.html.php 4660 2013-04-17 08:22:02Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<?php $this->session->set('bugType', '');?>
|
||||
<?php foreach($bugs as $bug):?>
|
||||
<?php if($bug->status == 'closed') continue;?>
|
||||
<div data-role="collapsible-set">
|
||||
<div data-role="collapsible" data-collapsed="<?php echo $this->session->bugID == $bug->id ? 'false' : 'true'?>" class='collapsible'>
|
||||
<?php if($this->session->bugID == $bug->id) echo "<script>showDetail('bug', $bug->id);</script>";?>
|
||||
<h1 onClick="showDetail('bug', <?php echo $bug->id;?>)"><?php echo $bug->title;?></h1>
|
||||
<div><?php echo $bug->steps;?></div>
|
||||
<div id='item<?php echo $bug->id;?>'><?php echo $bug->steps;?></div>
|
||||
<div data-role='navbar'>
|
||||
<ul>
|
||||
<?php
|
||||
common::printIcon('bug', 'confirmBug', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'assignTo', "bugID=$bug->id", '', 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'resolve', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'close', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'activate', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php $pager->show('left', 'mobile')?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,19 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<form class='form-condensed' method='post' target='hiddenwin'>
|
||||
<h3><?php echo "BUG#$bug->id $bug->title";?></h3>
|
||||
<table class='table-1'>
|
||||
<tr>
|
||||
<td class='w-60px'><?php echo $lang->comment;?></td>
|
||||
<td><?php echo html::textarea('comment', '');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='text-center' colspan='2'>
|
||||
<?php echo html::submitButton('', 'data-inline="true" data-theme="b"');?>
|
||||
<?php echo html::linkButton($lang->goback, $this->createLink('bug', 'view', "bugID=$bug->id"), 'self', "data-inline='true'");?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php include '../../common/view/m.action.html.php';?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<form class='form-condensed' method='post' target='hiddenwin'>
|
||||
<h3><?php echo "BUG#$bug->id $bug->title";?></h3>
|
||||
<table class='table-1'>
|
||||
<tr>
|
||||
<td class='w-60px'><?php echo $lang->bug->assignedTo;?></td>
|
||||
<td><?php echo html::select('assignedTo', $users, $bug->assignedTo);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='w-60px'><?php echo $lang->comment;?></td>
|
||||
<td><?php echo html::textarea('comment', '');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='text-center' colspan='2'>
|
||||
<?php echo html::submitButton($lang->bug->buttonConfirm, 'data-inline="true" data-theme="b"');?>
|
||||
<?php echo html::linkButton($lang->goback, $this->createLink('bug', 'view', "bugID=$bug->id"), 'self', "data-inline='true'");?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php include '../../common/view/m.action.html.php';?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,39 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<form class='form-condensed' method='post' target='hiddenwin'>
|
||||
<h3><?php echo "BUG#$bug->id $bug->title";?></h3>
|
||||
<table class='table-1'>
|
||||
<tr>
|
||||
<td class='w-80px'><?php unset($lang->bug->resolutionList['tostory']); echo $lang->bug->resolution ;?></td>
|
||||
<td><?php echo html::select('resolution', $lang->bug->resolutionList, '', 'class=form-control onchange=setDuplicate(this.value)');?></div>
|
||||
</tr>
|
||||
<tr id='duplicateBugBox' style='display:none'>
|
||||
<td class='w-80px'><?php echo $lang->bug->duplicateBug;?></td>
|
||||
<td><?php echo $lang->bug->duplicateBug . html::input('duplicateBug');?></div>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='w-80px'><?php echo $lang->bug->resolvedBuild?></td>
|
||||
<td><?php echo html::select('resolvedBuild', $builds);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo $lang->bug->resolvedDate?></div>
|
||||
<td><?php echo html::input('resolvedDate', helper::now());?></div>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo $lang->bug->assignedTo?></div>
|
||||
<td><?php echo html::select('assignedTo', $users, $assignedTo);?></div>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo $lang->comment;?></td>
|
||||
<td><?php echo html::textarea('comment');?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='text-center' colspan='2'>
|
||||
<?php echo html::submitButton('', 'data-inline="true" data-theme="b"');?>
|
||||
<?php echo html::linkButton($lang->goback, $this->createLink('bug', 'view', "bugID=$bug->id"), 'self', "data-inline='true'");?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<?php include '../../common/view/m.action.html.php';?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,2 +0,0 @@
|
||||
<?php
|
||||
include "./sendmail.html.php";
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php
|
||||
$this->session->set('bugID', $bug->id);
|
||||
if($this->session->bugType) die($this->locate($this->createLink('my', 'bug', "type={$this->session->bugType}")));
|
||||
die($this->locate($this->createLink('bug', 'browse', "productID=$productID")));
|
||||
?>
|
||||
@@ -176,6 +176,10 @@
|
||||
<th><?php echo $lang->bug->lblAssignedTo;?></th>
|
||||
<td><?php if($bug->assignedTo) echo $users[$bug->assignedTo] . $lang->at . $bug->assignedDate;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->deadline;?></th>
|
||||
<td><?php if($bug->deadline) echo $bug->deadline;?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->bug->os;?></th>
|
||||
<td><?php echo $lang->bug->osList[$bug->os];?></td>
|
||||
|
||||
@@ -36,6 +36,18 @@ class buildModel extends model
|
||||
return $build;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get by ID list.
|
||||
*
|
||||
* @param array $idList
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getByList($idList)
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_BUILD)->where('id')->in($idList)->fetchAll('id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get builds of a project.
|
||||
*
|
||||
|
||||
@@ -13,6 +13,17 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php js::set('confirmUnlinkStory', $lang->build->confirmUnlinkStory)?>
|
||||
<?php js::set('confirmUnlinkBug', $lang->build->confirmUnlinkBug)?>
|
||||
<?php if(isonlybody()):?>
|
||||
<style>
|
||||
#stories .action{display:none;}
|
||||
#bugs .action{display:none;}
|
||||
tbody tr td:last-child a{display:none;}
|
||||
tbody tr td:first-child input{display:none;}
|
||||
tfoot tr td .table-actions .btn{display:none;}
|
||||
#titlebar .actions{display:none}
|
||||
.row-table .col-side{display:none;}
|
||||
</style>
|
||||
<?php endif;?>
|
||||
<div id='titlebar'>
|
||||
<div class='heading'>
|
||||
<span class='prefix'><?php echo html::icon($lang->icons['build']);?> <strong><?php echo $build->id;?></strong></span>
|
||||
|
||||
+62
-26
@@ -49,6 +49,8 @@ $lang->day = 'Day';
|
||||
$lang->customConfig = 'Custom';
|
||||
$lang->public = 'Public';
|
||||
$lang->trunk = 'Trunk';
|
||||
$lang->sort = 'Ranking';
|
||||
$lang->required = 'Required';
|
||||
|
||||
$lang->actions = 'Actions';
|
||||
$lang->comment = 'Note';
|
||||
@@ -122,6 +124,8 @@ $lang->searchObjects['release'] = 'Release';
|
||||
$lang->searchObjects['productplan'] = $lang->productCommon . 'Plan';
|
||||
$lang->searchObjects['testtask'] = 'Test Task';
|
||||
$lang->searchObjects['doc'] = 'Document';
|
||||
$lang->searchObjects['caselib'] = 'Case Library';
|
||||
$lang->searchObjects['testreport'] = 'Test Report';
|
||||
$lang->searchTips = 'ID (ctrl+g)';
|
||||
|
||||
/* 导入支持的编码格式。*/
|
||||
@@ -214,7 +218,7 @@ $lang->project->menu->story = array('link' => 'Story|project|story|projectID
|
||||
$lang->project->menu->bug = 'Bug|project|bug|projectID=%s';
|
||||
$lang->project->menu->dynamic = 'Dynamic|project|dynamic|projectID=%s';
|
||||
$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build');
|
||||
$lang->project->menu->testtask = 'Test Task|project|testtask|projectID=%s';
|
||||
$lang->project->menu->testtask = array('link' => 'Test Task|project|testtask|projectID=%s');
|
||||
$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers');
|
||||
$lang->project->menu->doc = array('link' => 'Document|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
|
||||
$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s';
|
||||
@@ -232,32 +236,57 @@ $lang->build->menu = $lang->project->menu;
|
||||
$lang->qa = new stdclass();
|
||||
$lang->qa->menu = new stdclass();
|
||||
|
||||
$lang->qa->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->qa->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->qa->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
|
||||
$lang->qa->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s');
|
||||
$lang->qa->menu->index = array('link' => "<i class='icon-home'></i>TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->qa->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->qa->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->qa->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
|
||||
$lang->qa->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s');
|
||||
$lang->qa->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s');
|
||||
$lang->qa->menu->report = array('link' => 'Report|testreport|browse|productID=%s');
|
||||
$lang->qa->menu->caselib = array('link' => 'Library|testsuite|library');
|
||||
$lang->qa->menu->index = array('link' => "<i class='icon-home'></i>TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->bug = new stdclass();
|
||||
$lang->bug->menu = new stdclass();
|
||||
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->index = array('link' => "<i class='icon-home'></i>TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s');
|
||||
$lang->bug->menu->report = array('link' => 'Report|testreport|browse|productID=%s');
|
||||
$lang->bug->menu->caselib = array('link' => 'Library|testsuite|library');
|
||||
$lang->bug->menu->index = array('link' => "<i class='icon-home'></i>TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->testcase = new stdclass();
|
||||
$lang->testcase->menu = new stdclass();
|
||||
|
||||
$lang->testcase->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testcase->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase');
|
||||
$lang->testcase->menu->index = array('link' => "<i class='icon-home'></i>TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->testcase->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testcase->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importfromlib', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => 'Build|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase,report');
|
||||
$lang->testcase->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
|
||||
$lang->testcase->menu->report = array('link' => 'Report|testreport|browse|productID=%s', 'alias' => 'view,create,edit');
|
||||
$lang->testcase->menu->caselib = array('link' => 'Library|testsuite|library');
|
||||
$lang->testcase->menu->index = array('link' => "<i class='icon-home'></i>TestingHomepage|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->testtask = new stdclass();
|
||||
$lang->testtask->menu = $lang->testcase->menu;
|
||||
$lang->testsuite = new stdclass();
|
||||
$lang->testsuite->menu = $lang->testcase->menu;
|
||||
$lang->testreport = new stdclass();
|
||||
$lang->testreport->menu = $lang->testcase->menu;
|
||||
|
||||
$lang->caselib = new stdclass();
|
||||
$lang->caselib->menu = new stdclass();
|
||||
$lang->caselib->menu->lib = array('link' => '%s', 'fixed' => true);
|
||||
$lang->caselib->menu->bug = array('link' => 'Bug|bug|browse|');
|
||||
$lang->caselib->menu->testcase = array('link' => 'Case|testcase|browse|');
|
||||
$lang->caselib->menu->testtask = array('link' => 'Build|testtask|browse|');
|
||||
$lang->caselib->menu->testsuite = array('link' => 'Suite|testsuite|browse|');
|
||||
$lang->caselib->menu->report = array('link' => 'Report|testreport|browse|');
|
||||
$lang->caselib->menu->caselib = array('link' => 'Library|testsuite|library', 'alias' => 'createlib,createcase,libview,edit', 'subModule' => 'tree,testcase');
|
||||
$lang->caselib->menu->create = array('link' => "<i class='icon-plus'></i>Create a Library|testsuite|createLib|", 'float' => 'right');
|
||||
$lang->caselib->menu->index = array('link' => "<i class='icon-home'></i>Test Home|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
/* 文档视图菜单设置。*/
|
||||
$lang->doc = new stdclass();
|
||||
@@ -303,7 +332,7 @@ $lang->user->menu = $lang->company->menu;
|
||||
/* 后台管理菜单设置。*/
|
||||
$lang->admin = new stdclass();
|
||||
$lang->admin->menu = new stdclass();
|
||||
$lang->admin->menu->index = array('link' => 'Homepage|admin|index');
|
||||
$lang->admin->menu->index = array('link' => 'Homepage|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
|
||||
$lang->admin->menu->extension = array('link' => 'Extension|extension|browse', 'subModule' => 'extension');
|
||||
$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom');
|
||||
$lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail');
|
||||
@@ -352,6 +381,9 @@ $lang->menugroup->group = 'company';
|
||||
$lang->menugroup->bug = 'qa';
|
||||
$lang->menugroup->testcase = 'qa';
|
||||
$lang->menugroup->testtask = 'qa';
|
||||
$lang->menugroup->testsuite = 'qa';
|
||||
$lang->menugroup->caselib = 'qa';
|
||||
$lang->menugroup->testreport = 'qa';
|
||||
$lang->menugroup->people = 'company';
|
||||
$lang->menugroup->dept = 'company';
|
||||
$lang->menugroup->todo = 'my';
|
||||
@@ -390,19 +422,23 @@ $lang->error->tutorialData = 'No data can be imported in tutorial mode. Pleas
|
||||
|
||||
/* 分页信息。*/
|
||||
$lang->pager = new stdclass();
|
||||
$lang->pager->noRecord = "No History";
|
||||
$lang->pager->digest = " <strong>%s</strong> in total. %s <strong>%s/%s</strong> ";
|
||||
$lang->pager->recPerPage= " <strong>%s</strong> per page";
|
||||
$lang->pager->first = "<i class='icon-step-backward' title='Homepage'></i>";
|
||||
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='Previous Page'></i>";
|
||||
$lang->pager->next = "<i class='icon-play' title='Next Page'></i>";
|
||||
$lang->pager->last = "<i class='icon-step-forward' title='Last Page'></i>";
|
||||
$lang->pager->locate = "GO!";
|
||||
$lang->pager->noRecord = "No History";
|
||||
$lang->pager->digest = " <strong>%s</strong> in total. %s <strong>%s/%s</strong> ";
|
||||
$lang->pager->recPerPage = " <strong>%s</strong> per page";
|
||||
$lang->pager->first = "<i class='icon-step-backward' title='Homepage'></i>";
|
||||
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='Previous Page'></i>";
|
||||
$lang->pager->next = "<i class='icon-play' title='Next Page'></i>";
|
||||
$lang->pager->last = "<i class='icon-step-forward' title='Last Page'></i>";
|
||||
$lang->pager->locate = "GO!";
|
||||
$lang->pager->previousPage = "Previous";
|
||||
$lang->pager->nextPage = "Next";
|
||||
$lang->pager->summery = "<strong>%s-%s</strong> of <strong>%s</strong>.";
|
||||
|
||||
$lang->proVersion = "<a href='http://api.zentao.net/goto.php?item=proversion&from=footer' target='_blank' id='proLink' class='text-important'>ZenTao Pro <i class='text-danger icon-pro-version'></i></a> ";
|
||||
$lang->downNotify = "Download Desktop Notification";
|
||||
|
||||
$lang->suhosinInfo = "Warning! Data is reaching the limit. Please change <font color=red>sohusin.post.max_vars</font> and <font color=red>sohusin.request.max_vars</font> (set larger value) in php.ini, then save and restart Apache, or some data will not be saved.";
|
||||
$lang->suhosinInfo = "Warning! Data is reaching the limit. Please change <font color=red>sohusin.post.max_vars</font> and <font color=red>sohusin.request.max_vars</font> (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved.";
|
||||
$lang->maxVarsInfo = "Warning! Data is reaching the limit. Please change <font color=red>max_input_vars</font> (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved.";
|
||||
$lang->pasteTextInfo = "Paste text into text field. Each line will be a header of each data record. ";
|
||||
$lang->noticeImport = "<p style='font-size:14px'>Imported data contains data that has already existed in system. Please confirm you actions on the date </p><p><a href='javascript:submitForm(\"cover\")' class='btn btn-mini'>Override</a> <a href='javascript:submitForm(\"insert\")' class='btn btn-mini'>New Insertion</a></p>";
|
||||
|
||||
|
||||
@@ -66,16 +66,18 @@ $lang->task->menuOrder = $lang->project->menuOrder;
|
||||
$lang->build->menuOrder = $lang->project->menuOrder;
|
||||
|
||||
/* qa menu order. */
|
||||
$lang->qa->menuOrder[5] = 'product';
|
||||
$lang->qa->menuOrder[10] = 'index';
|
||||
$lang->qa->menuOrder[15] = 'bug';
|
||||
$lang->qa->menuOrder[20] = 'testcase';
|
||||
$lang->qa->menuOrder[25] = 'testtask';
|
||||
$lang->qa->menuOrder[30] = 'testsuite';
|
||||
$lang->bug->menuOrder = $lang->qa->menuOrder;
|
||||
$lang->testcase->menuOrder = $lang->bug->menuOrder;
|
||||
$lang->testtask->menuOrder = $lang->testcase->menuOrder;
|
||||
$lang->testsuite->menuOrder = $lang->testcase->menuOrder;
|
||||
$lang->qa->menuOrder[5] = 'product';
|
||||
$lang->qa->menuOrder[10] = 'index';
|
||||
$lang->qa->menuOrder[15] = 'bug';
|
||||
$lang->qa->menuOrder[20] = 'testcase';
|
||||
$lang->qa->menuOrder[25] = 'testtask';
|
||||
$lang->qa->menuOrder[30] = 'testsuite';
|
||||
$lang->qa->menuOrder[35] = 'testreport';
|
||||
$lang->bug->menuOrder = $lang->qa->menuOrder;
|
||||
$lang->testcase->menuOrder = $lang->bug->menuOrder;
|
||||
$lang->testtask->menuOrder = $lang->testcase->menuOrder;
|
||||
$lang->testsuite->menuOrder = $lang->testcase->menuOrder;
|
||||
$lang->testreport->menuOrder = $lang->testcase->menuOrder;
|
||||
|
||||
/* doc menu order. */
|
||||
$lang->doc->menuOrder[5] = 'list';
|
||||
|
||||
@@ -49,6 +49,8 @@ $lang->day = '天';
|
||||
$lang->customConfig = '自定义';
|
||||
$lang->public = '公共';
|
||||
$lang->trunk = '主干';
|
||||
$lang->sort = '排序';
|
||||
$lang->required = '必填';
|
||||
|
||||
$lang->actions = '操作';
|
||||
$lang->comment = '备注';
|
||||
@@ -122,6 +124,8 @@ $lang->searchObjects['release'] = '发布';
|
||||
$lang->searchObjects['productplan'] = $lang->productCommon . '计划';
|
||||
$lang->searchObjects['testtask'] = '测试版本';
|
||||
$lang->searchObjects['doc'] = '文档';
|
||||
$lang->searchObjects['caselib'] = '用例库';
|
||||
$lang->searchObjects['testreport'] = '测试报告';
|
||||
$lang->searchTips = '编号(ctrl+g)';
|
||||
|
||||
/* 导入支持的编码格式。*/
|
||||
@@ -214,7 +218,7 @@ $lang->project->menu->story = array('link' => '需求|project|story|projectI
|
||||
$lang->project->menu->bug = 'Bug|project|bug|projectID=%s';
|
||||
$lang->project->menu->dynamic = '动态|project|dynamic|projectID=%s';
|
||||
$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build');
|
||||
$lang->project->menu->testtask = '测试|project|testtask|projectID=%s';
|
||||
$lang->project->menu->testtask = array('link' => '测试|project|testtask|projectID=%s');
|
||||
$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers');
|
||||
$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
|
||||
$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s';
|
||||
@@ -237,7 +241,8 @@ $lang->qa->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->qa->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->qa->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->qa->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->qa->menu->testlib = array('link' => '公共库|testsuite|library');
|
||||
$lang->qa->menu->report = array('link' => '报告|testreport|browse|productID=%s');
|
||||
$lang->qa->menu->caselib = array('link' => '用例库|testsuite|library');
|
||||
$lang->qa->menu->index = array('link' => "<i class='icon-home'></i>测试主页|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->bug = new stdclass();
|
||||
@@ -248,7 +253,8 @@ $lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'al
|
||||
$lang->bug->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->bug->menu->testlib = array('link' => '公共库|testsuite|library');
|
||||
$lang->bug->menu->report = array('link' => '报告|testreport|browse|productID=%s');
|
||||
$lang->bug->menu->caselib = array('link' => '用例库|testsuite|library');
|
||||
$lang->bug->menu->index = array('link' => "<i class='icon-home'></i>测试主页|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->testcase = new stdclass();
|
||||
@@ -256,27 +262,31 @@ $lang->testcase->menu = new stdclass();
|
||||
|
||||
$lang->testcase->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testcase->menu->testcase = array('link' => '用例|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importlib,report', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => '版本|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase');
|
||||
$lang->testcase->menu->testcase = array('link' => '用例|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importfromlib', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => '版本|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase,report');
|
||||
$lang->testcase->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
|
||||
$lang->testcase->menu->testlib = array('link' => '公共库|testsuite|library');
|
||||
$lang->testcase->menu->report = array('link' => '报告|testreport|browse|productID=%s', 'alias' => 'view,create,edit');
|
||||
$lang->testcase->menu->caselib = array('link' => '用例库|testsuite|library');
|
||||
$lang->testcase->menu->index = array('link' => "<i class='icon-home'></i>测试主页|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->testtask = new stdclass();
|
||||
$lang->testtask->menu = $lang->testcase->menu;
|
||||
$lang->testsuite = new stdclass();
|
||||
$lang->testsuite->menu = $lang->testcase->menu;
|
||||
$lang->testreport = new stdclass();
|
||||
$lang->testreport->menu = $lang->testcase->menu;
|
||||
|
||||
$lang->testlib = new stdclass();
|
||||
$lang->testlib->menu = new stdclass();
|
||||
$lang->testlib->menu->lib = array('link' => '%s', 'fixed' => true);
|
||||
$lang->testlib->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testlib->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->testlib->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->testlib->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->testlib->menu->testlib = array('link' => '公共库|testsuite|library', 'alias' => 'createlib,createcase,libview,edit', 'subModule' => 'tree,testcase');
|
||||
$lang->testlib->menu->create = array('link' => "<i class='icon-plus'></i>创建库|testsuite|createLib|", 'float' => 'right');
|
||||
$lang->testlib->menu->index = array('link' => "<i class='icon-home'></i>测试主页|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->caselib = new stdclass();
|
||||
$lang->caselib->menu = new stdclass();
|
||||
$lang->caselib->menu->lib = array('link' => '%s', 'fixed' => true);
|
||||
$lang->caselib->menu->bug = array('link' => 'Bug|bug|browse|');
|
||||
$lang->caselib->menu->testcase = array('link' => '用例|testcase|browse|');
|
||||
$lang->caselib->menu->testtask = array('link' => '版本|testtask|browse|');
|
||||
$lang->caselib->menu->testsuite = array('link' => '套件|testsuite|browse|');
|
||||
$lang->caselib->menu->report = array('link' => '报告|testreport|browse|');
|
||||
$lang->caselib->menu->caselib = array('link' => '用例库|testsuite|library', 'alias' => 'createlib,createcase,libview,edit', 'subModule' => 'tree,testcase');
|
||||
$lang->caselib->menu->create = array('link' => "<i class='icon-plus'></i>创建库|testsuite|createLib|", 'float' => 'right');
|
||||
$lang->caselib->menu->index = array('link' => "<i class='icon-home'></i>测试主页|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
/* 文档视图菜单设置。*/
|
||||
$lang->doc = new stdclass();
|
||||
@@ -322,7 +332,7 @@ $lang->user->menu = $lang->company->menu;
|
||||
/* 后台管理菜单设置。*/
|
||||
$lang->admin = new stdclass();
|
||||
$lang->admin->menu = new stdclass();
|
||||
$lang->admin->menu->index = array('link' => '首页|admin|index');
|
||||
$lang->admin->menu->index = array('link' => '首页|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
|
||||
$lang->admin->menu->extension = array('link' => '插件|extension|browse', 'subModule' => 'extension');
|
||||
$lang->admin->menu->custom = array('link' => '自定义|custom|set', 'subModule' => 'custom');
|
||||
$lang->admin->menu->mail = array('link' => '发信|mail|index', 'subModule' => 'mail');
|
||||
@@ -372,6 +382,8 @@ $lang->menugroup->bug = 'qa';
|
||||
$lang->menugroup->testcase = 'qa';
|
||||
$lang->menugroup->testtask = 'qa';
|
||||
$lang->menugroup->testsuite = 'qa';
|
||||
$lang->menugroup->caselib = 'qa';
|
||||
$lang->menugroup->testreport = 'qa';
|
||||
$lang->menugroup->people = 'company';
|
||||
$lang->menugroup->dept = 'company';
|
||||
$lang->menugroup->todo = 'my';
|
||||
@@ -410,19 +422,23 @@ $lang->error->tutorialData = '新手模式下不会插入数据,请退出
|
||||
|
||||
/* 分页信息。*/
|
||||
$lang->pager = new stdclass();
|
||||
$lang->pager->noRecord = "暂时没有记录";
|
||||
$lang->pager->digest = "共 <strong>%s</strong> 条记录,%s <strong>%s/%s</strong> ";
|
||||
$lang->pager->recPerPage= "每页 <strong>%s</strong> 条";
|
||||
$lang->pager->first = "<i class='icon-step-backward' title='首页'></i>";
|
||||
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='上一页'></i>";
|
||||
$lang->pager->next = "<i class='icon-play' title='下一页'></i>";
|
||||
$lang->pager->last = "<i class='icon-step-forward' title='末页'></i>";
|
||||
$lang->pager->locate = "GO!";
|
||||
$lang->pager->noRecord = "暂时没有记录";
|
||||
$lang->pager->digest = "共 <strong>%s</strong> 条记录,%s <strong>%s/%s</strong> ";
|
||||
$lang->pager->recPerPage = "每页 <strong>%s</strong> 条";
|
||||
$lang->pager->first = "<i class='icon-step-backward' title='首页'></i>";
|
||||
$lang->pager->pre = "<i class='icon-play icon-rotate-180' title='上一页'></i>";
|
||||
$lang->pager->next = "<i class='icon-play' title='下一页'></i>";
|
||||
$lang->pager->last = "<i class='icon-step-forward' title='末页'></i>";
|
||||
$lang->pager->locate = "GO!";
|
||||
$lang->pager->previousPage = "上一页";
|
||||
$lang->pager->nextPage = "下一页";
|
||||
$lang->pager->summery = "第 <strong>%s-%s</strong> 项,共 <strong>%s</strong> 项";
|
||||
|
||||
$lang->proVersion = "<a href='http://api.zentao.net/goto.php?item=proversion&from=footer' target='_blank' id='proLink' class='text-important'>专业版 <i class='text-danger icon-pro-version'></i></a> ";
|
||||
$lang->downNotify = "下载桌面提醒";
|
||||
|
||||
$lang->suhosinInfo = "警告:数据太多,请在php.ini中修改<font color=red>sohusin.post.max_vars</font>和<font color=red>sohusin.request.max_vars</font>(设置更大的数)。 保存并重新启动apache,否则会造成部分数据无法保存。";
|
||||
$lang->suhosinInfo = "警告:数据太多,请在php.ini中修改<font color=red>sohusin.post.max_vars</font>和<font color=red>sohusin.request.max_vars</font>(大于%s的数)。 保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。";
|
||||
$lang->maxVarsInfo = "警告:数据太多,请在php.ini中修改<font color=red>max_input_vars</font>(大于%s的数)。 保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。";
|
||||
$lang->pasteTextInfo = "粘贴文本到文本域中,每行文字作为一条数据的标题。";
|
||||
$lang->noticeImport = "<p style='font-size:14px'>导入数据中,含有已经存在系统的数据,请确认这些数据要覆盖或者全新插入</p><p><a href='javascript:submitForm(\"cover\")' class='btn btn-mini'>覆盖</a> <a href='javascript:submitForm(\"insert\")' class='btn btn-mini'>全新插入</a></p>";
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ $lang->more = '更多';
|
||||
$lang->day = '天';
|
||||
$lang->customConfig = '自定義';
|
||||
$lang->public = '公共';
|
||||
$lang->trunk = '主幹';
|
||||
|
||||
$lang->actions = '操作';
|
||||
$lang->comment = '備註';
|
||||
@@ -121,6 +122,8 @@ $lang->searchObjects['release'] = '發佈';
|
||||
$lang->searchObjects['productplan'] = $lang->productCommon . '計劃';
|
||||
$lang->searchObjects['testtask'] = '測試版本';
|
||||
$lang->searchObjects['doc'] = '文檔';
|
||||
$lang->searchObjects['caselib'] = '用例庫';
|
||||
$lang->searchObjects['testreport'] = '測試報告';
|
||||
$lang->searchTips = '編號(ctrl+g)';
|
||||
|
||||
/* 導入支持的編碼格式。*/
|
||||
@@ -213,7 +216,7 @@ $lang->project->menu->story = array('link' => '需求|project|story|projectI
|
||||
$lang->project->menu->bug = 'Bug|project|bug|projectID=%s';
|
||||
$lang->project->menu->dynamic = '動態|project|dynamic|projectID=%s';
|
||||
$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build');
|
||||
$lang->project->menu->testtask = '測試|project|testtask|projectID=%s';
|
||||
$lang->project->menu->testtask = array('link' => '測試|project|testtask|projectID=%s');
|
||||
$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers');
|
||||
$lang->project->menu->doc = array('link' => '文檔|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
|
||||
$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s';
|
||||
@@ -231,32 +234,57 @@ $lang->build->menu = $lang->project->menu;
|
||||
$lang->qa = new stdclass();
|
||||
$lang->qa->menu = new stdclass();
|
||||
|
||||
$lang->qa->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->qa->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->qa->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->qa->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->qa->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->qa->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->qa->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->qa->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->qa->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->qa->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->qa->menu->report = array('link' => '報告|testreport|browse|productID=%s');
|
||||
$lang->qa->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
$lang->qa->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->bug = new stdclass();
|
||||
$lang->bug->menu = new stdclass();
|
||||
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->bug->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->bug->menu->bug = array('link' => 'Bug|bug|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,resolve,close,activate,report,batchedit,confirmbug,assignto', 'subModule' => 'tree');
|
||||
$lang->bug->menu->testcase = array('link' => '用例|testcase|browse|productID=%s');
|
||||
$lang->bug->menu->testtask = array('link' => '版本|testtask|browse|productID=%s');
|
||||
$lang->bug->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s');
|
||||
$lang->bug->menu->report = array('link' => '報告|testreport|browse|productID=%s');
|
||||
$lang->bug->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
$lang->bug->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->testcase = new stdclass();
|
||||
$lang->testcase->menu = new stdclass();
|
||||
|
||||
$lang->testcase->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testcase->menu->testcase = array('link' => '用例|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => '版本|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase');
|
||||
$lang->testcase->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
$lang->testcase->menu->product = array('link' => '%s', 'fixed' => true);
|
||||
$lang->testcase->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
|
||||
$lang->testcase->menu->testcase = array('link' => '用例|testcase|browse|productID=%s', 'alias' => 'view,create,batchcreate,edit,batchedit,showimport,groupcase,importfromlib', 'subModule' => 'tree');
|
||||
$lang->testcase->menu->testtask = array('link' => '版本|testtask|browse|productID=%s', 'alias' => 'view,create,edit,linkcase,cases,start,close,batchrun,groupcase,report');
|
||||
$lang->testcase->menu->testsuite = array('link' => '套件|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
|
||||
$lang->testcase->menu->report = array('link' => '報告|testreport|browse|productID=%s', 'alias' => 'view,create,edit');
|
||||
$lang->testcase->menu->caselib = array('link' => '用例庫|testsuite|library');
|
||||
$lang->testcase->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
$lang->testtask = new stdclass();
|
||||
$lang->testtask->menu = $lang->testcase->menu;
|
||||
$lang->testsuite = new stdclass();
|
||||
$lang->testsuite->menu = $lang->testcase->menu;
|
||||
$lang->testreport = new stdclass();
|
||||
$lang->testreport->menu = $lang->testcase->menu;
|
||||
|
||||
$lang->caselib = new stdclass();
|
||||
$lang->caselib->menu = new stdclass();
|
||||
$lang->caselib->menu->lib = array('link' => '%s', 'fixed' => true);
|
||||
$lang->caselib->menu->bug = array('link' => 'Bug|bug|browse|');
|
||||
$lang->caselib->menu->testcase = array('link' => '用例|testcase|browse|');
|
||||
$lang->caselib->menu->testtask = array('link' => '版本|testtask|browse|');
|
||||
$lang->caselib->menu->testsuite = array('link' => '套件|testsuite|browse|');
|
||||
$lang->caselib->menu->report = array('link' => '報告|testreport|browse|');
|
||||
$lang->caselib->menu->caselib = array('link' => '用例庫|testsuite|library', 'alias' => 'createlib,createcase,libview,edit', 'subModule' => 'tree,testcase');
|
||||
$lang->caselib->menu->create = array('link' => "<i class='icon-plus'></i>創建庫|testsuite|createLib|", 'float' => 'right');
|
||||
$lang->caselib->menu->index = array('link' => "<i class='icon-home'></i>測試主頁|qa|index|locate=no&productID=%s", 'float' => 'right');
|
||||
|
||||
/* 文檔視圖菜單設置。*/
|
||||
$lang->doc = new stdclass();
|
||||
@@ -302,7 +330,7 @@ $lang->user->menu = $lang->company->menu;
|
||||
/* 後台管理菜單設置。*/
|
||||
$lang->admin = new stdclass();
|
||||
$lang->admin->menu = new stdclass();
|
||||
$lang->admin->menu->index = array('link' => '首頁|admin|index');
|
||||
$lang->admin->menu->index = array('link' => '首頁|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
|
||||
$lang->admin->menu->extension = array('link' => '插件|extension|browse', 'subModule' => 'extension');
|
||||
$lang->admin->menu->custom = array('link' => '自定義|custom|set', 'subModule' => 'custom');
|
||||
$lang->admin->menu->mail = array('link' => '發信|mail|index', 'subModule' => 'mail');
|
||||
@@ -351,6 +379,9 @@ $lang->menugroup->group = 'company';
|
||||
$lang->menugroup->bug = 'qa';
|
||||
$lang->menugroup->testcase = 'qa';
|
||||
$lang->menugroup->testtask = 'qa';
|
||||
$lang->menugroup->testsuite = 'qa';
|
||||
$lang->menugroup->caselib = 'qa';
|
||||
$lang->menugroup->testreport = 'qa';
|
||||
$lang->menugroup->people = 'company';
|
||||
$lang->menugroup->dept = 'company';
|
||||
$lang->menugroup->todo = 'my';
|
||||
@@ -401,7 +432,8 @@ $lang->pager->locate = "GO!";
|
||||
$lang->proVersion = "<a href='http://api.zentao.net/goto.php?item=proversion&from=footer' target='_blank' id='proLink' class='text-important'>專業版 <i class='text-danger icon-pro-version'></i></a> ";
|
||||
$lang->downNotify = "下載桌面提醒";
|
||||
|
||||
$lang->suhosinInfo = "警告:數據太多,請在php.ini中修改<font color=red>sohusin.post.max_vars</font>和<font color=red>sohusin.request.max_vars</font>(設置更大的數)。 保存並重新啟動apache,否則會造成部分數據無法保存。";
|
||||
$lang->suhosinInfo = "警告:數據太多,請在php.ini中修改<font color=red>sohusin.post.max_vars</font>和<font color=red>sohusin.request.max_vars</font>(大於%s的數)。 保存並重新啟動apache或php-fpm,否則會造成部分數據無法保存。";
|
||||
$lang->maxVarsInfo = "警告:數據太多,請在php.ini中修改<font color=red>max_input_vars</font>(大於%s的數)。 保存並重新啟動apache或php-fpm,否則會造成部分數據無法保存。";
|
||||
$lang->pasteTextInfo = "粘貼文本到文本域中,每行文字作為一條數據的標題。";
|
||||
$lang->noticeImport = "<p style='font-size:14px'>導入數據中,含有已經存在系統的數據,請確認這些數據要覆蓋或者全新插入</p><p><a href='javascript:submitForm(\"cover\")' class='btn btn-mini'>覆蓋</a> <a href='javascript:submitForm(\"insert\")' class='btn btn-mini'>全新插入</a></p>";
|
||||
|
||||
|
||||
+73
-71
@@ -30,7 +30,6 @@ class commonModel extends model
|
||||
$this->loadConfigFromDB();
|
||||
$this->loadCustomFromDB();
|
||||
if(!$this->checkIP()) die($this->lang->ipLimited);
|
||||
if($this->app->getViewType() == 'mhtml') $this->setMobileMenu();
|
||||
$this->app->loadLang('company');
|
||||
}
|
||||
}
|
||||
@@ -104,6 +103,7 @@ class commonModel extends model
|
||||
$user->account = 'guest';
|
||||
$user->realname = 'guest';
|
||||
$user->role = 'guest';
|
||||
$user->admin = false;
|
||||
$user->rights = $this->loadModel('user')->authorize('guest');
|
||||
$user->groups = array('group');
|
||||
$this->session->set('user', $user);
|
||||
@@ -305,49 +305,6 @@ class commonModel extends model
|
||||
echo html::a(helper::createLink('misc', 'about'), $lang->aboutZenTao, '', "class='about iframe' data-width='900' data-headerless='true' data-backdrop='true' data-keyboard='true' data-class='modal-about'");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set mobile menu.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setMobileMenu()
|
||||
{
|
||||
$menu = new stdclass();
|
||||
|
||||
$role = isset($this->app->user->role) ? $this->app->user->role : '';
|
||||
|
||||
$this->config->locate = new stdclass();
|
||||
$this->config->locate->module = 'my';
|
||||
$this->config->locate->method = 'todo';
|
||||
$this->config->locate->params = '';
|
||||
|
||||
$todo = $this->lang->my->menu->todo['link'];
|
||||
$task = $this->lang->my->menu->task['link'];
|
||||
$story = $this->lang->my->menu->story['link'];
|
||||
$bug = $this->lang->my->menu->bug['link'];
|
||||
$project = $this->lang->projectCommon . '|project|all|status=isdoing';
|
||||
$product = $this->lang->productCommon . '|product|all';
|
||||
$menu = array('todo' => $todo, 'task' => $task, 'bug' => $bug, 'project' => $project, 'product' => $product);
|
||||
|
||||
if($role and strpos('dev,td,pm', $role) !== false) $menu = array('todo' => $todo, 'task' => $task, 'bug' => $bug, 'product' => $product, 'project' => $project);
|
||||
if($role and strpos('pd,po', $role) !== false) $menu = array('todo' => $todo, 'story' => $story, 'bug' => $bug, 'product' => $product, 'project' => $project);
|
||||
if($role and strpos('qa,qd', $role) !== false) $menu = array('todo' => $todo, 'bug' => $bug, 'project' => $project, 'product' => $product);
|
||||
if($role and strpos('top', $role) !== false) $menu = array('project' => $project, 'product' => $product, 'todo' => $todo);
|
||||
|
||||
if($role == 'top')
|
||||
{
|
||||
$this->config->locate->module = 'project';
|
||||
$this->config->locate->method = 'all';
|
||||
$this->config->locate->params = 'status=isdoing';
|
||||
}
|
||||
|
||||
unset($this->lang->menuOrder);
|
||||
unset($this->lang->menugroup);
|
||||
$this->lang->menu = new stdclass();
|
||||
$this->lang->menu = $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create menu item link
|
||||
*
|
||||
@@ -390,18 +347,10 @@ class commonModel extends model
|
||||
/* Set the main main menu. */
|
||||
$mainMenu = $moduleName;
|
||||
if(isset($lang->menugroup->$moduleName)) $mainMenu = $lang->menugroup->$moduleName;
|
||||
if($app->getViewType() == 'mhtml')
|
||||
{
|
||||
if($moduleName == 'my') $mainMenu = $methodName;
|
||||
if($moduleName == 'todo') $mainMenu = $moduleName;
|
||||
if($moduleName == 'story' and !isset($lang->menu->story)) $mainMenu = 'product';
|
||||
if($moduleName == 'bug' and !isset($lang->menu->bug)) $mainMenu = 'product';
|
||||
if($moduleName == 'task' and !isset($lang->menu->task)) $mainMenu = 'project';
|
||||
}
|
||||
|
||||
/* Print all main menus. */
|
||||
$menu = customModel::getMainMenu();
|
||||
$activeName = $app->getViewType() == 'mhtml' ? 'ui-btn-active' : 'active';
|
||||
$menu = customModel::getMainMenu();
|
||||
$activeName = 'active';
|
||||
|
||||
echo "<ul class='nav'>\n";
|
||||
foreach($menu as $menuItem)
|
||||
@@ -412,7 +361,7 @@ class commonModel extends model
|
||||
echo "<li $active data-id='$menuItem->name'><a href='$link' $active>$menuItem->text</a></li>\n";
|
||||
}
|
||||
$customLink = helper::createLink('custom', 'ajaxMenu', "module={$app->getModuleName()}&method={$app->getMethodName()}", '', true);
|
||||
if(!commonModel::isTutorialMode() and $app->viewType != 'mhtml') echo "<li class='custom-item'><a href='$customLink' data-toggle='modal' data-type='iframe' title='$lang->customMenu' data-icon='cog' data-width='80%'><i class='icon icon-cog'></i></a></li>";
|
||||
if(!commonModel::isTutorialMode() and $app->viewType != 'mhtml' and $app->user->account != 'guest') echo "<li class='custom-item'><a href='$customLink' data-toggle='modal' data-type='iframe' title='$lang->customMenu' data-icon='cog' data-width='80%'><i class='icon icon-cog'></i></a></li>";
|
||||
echo "</ul>\n";
|
||||
}
|
||||
|
||||
@@ -482,14 +431,16 @@ class commonModel extends model
|
||||
$currentModule = ($isTutorialMode and defined('WIZARD_MODULE')) ? WIZARD_MODULE : $app->getModuleName();
|
||||
$currentMethod = ($isTutorialMode and defined('WIZARD_METHOD')) ? WIZARD_METHOD : $app->getMethodName();
|
||||
$menu = customModel::getModuleMenu($moduleName);
|
||||
$isMobile = $app->viewType === 'mhtml';
|
||||
|
||||
/* The beginning of the menu. */
|
||||
echo "<ul class='nav'>\n";
|
||||
echo $isMobile ? '' : "<ul class='nav'>\n";
|
||||
|
||||
/* Cycling to print every sub menus. */
|
||||
foreach($menu as $menuItem)
|
||||
{
|
||||
if(isset($menuItem->hidden) && $menuItem->hidden) continue;
|
||||
if($isMobile and empty($menuItem->link)) continue;
|
||||
|
||||
/* Init the these vars. */
|
||||
if($menuItem->link)
|
||||
@@ -514,14 +465,17 @@ class commonModel extends model
|
||||
if(isset($menuItem->link['method'])) $method = $menuItem->link['method'];
|
||||
}
|
||||
if($float != 'right' and $module == $currentModule and ($method == $currentMethod or strpos(",$alias,", ",$currentMethod,") !== false)) $active = 'active';
|
||||
echo "<li class='$float $active' data-id='$menuItem->name'>" . html::a($link, $menuItem->text, $target) . "</li>\n";
|
||||
|
||||
$menuItemHtml = "<li class='$float $active' data-id='$menuItem->name'>" . html::a($link, $menuItem->text, $target) . "</li>\n";
|
||||
if($isMobile) $menuItemHtml = html::a($link, $menuItem->text, $target, "class='$active'") . "\n";
|
||||
echo $menuItemHtml;
|
||||
}
|
||||
else
|
||||
{
|
||||
echo "<li data-id='$menuItem->name'>$menuItem->text</li>\n";
|
||||
echo $isMobile ? $menuItem->text : "<li data-id='$menuItem->name'>$menuItem->text</li>\n";
|
||||
}
|
||||
}
|
||||
echo "</ul>\n";
|
||||
echo $isMobile ? '' : "</ul>\n";
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -612,6 +566,7 @@ class commonModel extends model
|
||||
if(empty($module)) $module = $app->getModuleName();
|
||||
if(empty($method)) $method = $app->getMethodName();
|
||||
$className = 'header';
|
||||
$isMobile = $app->viewType === 'mhtml';
|
||||
|
||||
$order = explode('_', $orderBy);
|
||||
$order[0] = trim($order[0], '`');
|
||||
@@ -620,12 +575,12 @@ class commonModel extends model
|
||||
if(isset($order[1]) and $order[1] == 'asc')
|
||||
{
|
||||
$orderBy = "{$order[0]}_desc";
|
||||
$className = 'headerSortDown';
|
||||
$className = $isMobile ? 'SortDown' : 'headerSortDown';
|
||||
}
|
||||
else
|
||||
{
|
||||
$orderBy = "{$order[0]}_asc";
|
||||
$className = 'headerSortUp';
|
||||
$className = $isMobile ? 'SortUp' : 'headerSortUp';
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -634,7 +589,7 @@ class commonModel extends model
|
||||
$className = 'header';
|
||||
}
|
||||
$link = helper::createLink($module, $method, sprintf($vars, $orderBy));
|
||||
echo "<div class='$className'>" . html::a($link, $label) . '</div>';
|
||||
echo $isMobile ? html::a($link, $label, '', "class='$className'") : "<div class='$className'>" . html::a($link, $label) . '</div>';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -749,7 +704,7 @@ class commonModel extends model
|
||||
/* set the class. */
|
||||
if(!$icon)
|
||||
{
|
||||
$icon = $lang->icons[$method] ? $lang->icons[$method] : $method;
|
||||
$icon = isset($lang->icons[$method]) ? $lang->icons[$method] : $method;
|
||||
}
|
||||
if(strpos(',edit,copy,report,export,delete,', ",$method,") !== false) $module = 'common';
|
||||
$class = "icon-$module-$method";
|
||||
@@ -762,7 +717,7 @@ class commonModel extends model
|
||||
{
|
||||
if($app->getViewType() == 'mhtml')
|
||||
{
|
||||
return html::a($link, $title, $target, "class='$extraClass' data-role='button' data-mini='true' data-inline='true' data-theme='b'", true);
|
||||
return "<a data-remote='$link' class='$extraClass' $misc>$title</a>";
|
||||
}
|
||||
if($type == 'button')
|
||||
{
|
||||
@@ -913,18 +868,23 @@ class commonModel extends model
|
||||
/**
|
||||
* Judge Suhosin Setting whether the actual size of post data is large than the setting size.
|
||||
*
|
||||
* @param int $numberOfItems
|
||||
* @param int $columns
|
||||
* @param int $countInputVars
|
||||
* @static
|
||||
* @access public
|
||||
* @return void
|
||||
* @return bool
|
||||
*/
|
||||
public function judgeSuhosinSetting($numberOfItems, $columns)
|
||||
public static function judgeSuhosinSetting($countInputVars)
|
||||
{
|
||||
if(extension_loaded('suhosin'))
|
||||
{
|
||||
$maxPostVars = ini_get('suhosin.post.max_vars');
|
||||
$maxRequestVars = ini_get('suhosin.request.max_vars');
|
||||
if($numberOfItems * $columns > $maxPostVars or $numberOfItems * $columns > $maxRequestVars) return true;
|
||||
if($countInputVars > $maxPostVars or $countInputVars > $maxRequestVars) return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
$maxInputVars = ini_get('max_input_vars');
|
||||
if($maxInputVars and $countInputVars > (int)$maxInputVars) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -1177,8 +1137,7 @@ class commonModel extends model
|
||||
global $app, $lang;
|
||||
|
||||
/* Check is the super admin or not. */
|
||||
$account = ',' . $app->user->account . ',';
|
||||
if(strpos($app->company->admins, $account) !== false) return true;
|
||||
if($app->user->admin) return true;
|
||||
|
||||
/* If not super admin, check the rights. */
|
||||
$rights = $app->user->rights['rights'];
|
||||
@@ -1307,6 +1266,49 @@ class commonModel extends model
|
||||
{
|
||||
return (isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert items to Pinyin.
|
||||
*
|
||||
* @param array $items
|
||||
* @static
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public static function convert2Pinyin($items)
|
||||
{
|
||||
global $app;
|
||||
static $allConverted = array();
|
||||
static $pinyin;
|
||||
if(empty($pinyin)) $pinyin = $app->loadClass('pinyin');
|
||||
|
||||
$sign = ' aNdAnD ';
|
||||
$notConvertedItems = array_diff($items, array_keys($allConverted));
|
||||
|
||||
if($notConvertedItems)
|
||||
{
|
||||
$convertedPinYin = $pinyin->romanize(join($sign, $notConvertedItems));
|
||||
$itemsPinYin = explode(trim($sign), $convertedPinYin);
|
||||
foreach($notConvertedItems as $item)
|
||||
{
|
||||
$itemPinYin = array_shift($itemsPinYin);
|
||||
$wordsPinYin = explode("\t", trim($itemPinYin));
|
||||
|
||||
$abbr = '';
|
||||
foreach($wordsPinYin as $i => $wordPinyin)
|
||||
{
|
||||
if($wordPinyin) $abbr .= $wordPinyin[0];
|
||||
}
|
||||
|
||||
$allConverted[$item] = strtolower(join($wordsPinYin) . ' ' . $abbr);
|
||||
}
|
||||
}
|
||||
|
||||
$convertedItems = array();
|
||||
foreach($items as $item) $convertedItems[$item] = zget($allConverted, $item, null);
|
||||
|
||||
return $convertedItems;
|
||||
}
|
||||
}
|
||||
|
||||
class common extends commonModel
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
<div id='actionbox'>
|
||||
<fieldset>
|
||||
<hr color='#dddddd'/>
|
||||
|
||||
<ol id='historyItem' style='padding-left:20px; font-size:11px'>
|
||||
<?php $i = 1; ?>
|
||||
<?php foreach($actions as $action):?>
|
||||
<li value='<?php echo $i ++;?>'>
|
||||
<?php
|
||||
if(isset($users[$action->actor])) $action->actor = $users[$action->actor];
|
||||
if($action->action == 'assigned' and isset($users[$action->extra]) ) $action->extra = $users[$action->extra];
|
||||
if(strpos($action->actor, ':') !== false) $action->actor = substr($action->actor, strpos($action->actor, ':') + 1);
|
||||
?>
|
||||
<span><?php $this->action->printAction($action);?></span>
|
||||
<?php if(!empty($action->comment) or !empty($action->history)):?>
|
||||
<?php if(!empty($action->comment)) echo "<div class='history'>";?>
|
||||
<?php if($action->comment) echo strip_tags($action->comment) == $action->comment ? nl2br($action->comment) : $action->comment; ?>
|
||||
<?php if(!empty($action->comment)) echo "</div>";?>
|
||||
<?php endif;?>
|
||||
</li>
|
||||
<?php endforeach;?>
|
||||
</ol>
|
||||
|
||||
</fieldset>
|
||||
</div>
|
||||
@@ -1,20 +0,0 @@
|
||||
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
|
||||
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no' class='hidden'></iframe>
|
||||
<?php
|
||||
if(isset($pageJS)) js::execute($pageJS); // load the js for current page.
|
||||
|
||||
/* Load hook files for current page. */
|
||||
$extPath = dirname(dirname(dirname(realpath($viewFile)))) . '/common/ext/view/';
|
||||
$extHookRule = $extPath . 'm.footer.*.hook.php';
|
||||
$extHookFiles = glob($extHookRule);
|
||||
if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
|
||||
?>
|
||||
<?php if($this->server->HTTP_X_PJAX == false):?>
|
||||
<script>
|
||||
/* May be fix bug #576. */
|
||||
$(function(){$("#main").css('padding-top', $("div[data-role='header']").height() + 'px')})
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
<?php endif;?>
|
||||
@@ -1,8 +0,0 @@
|
||||
</div>
|
||||
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
|
||||
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no' class='hidden'></iframe>
|
||||
<script laguage='Javascript'>
|
||||
<?php if(isset($pageJS)) echo $pageJS;?>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,12 +0,0 @@
|
||||
<?php
|
||||
if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}
|
||||
include 'm.header.lite.html.php';
|
||||
?>
|
||||
<div data-role="header" data-position='fixed' style='border-bottom:1px solid #ddd'>
|
||||
<?php echo html::a($this->createLink('my', 'index', '', 'html'), $lang->goPC, '', "id='goPC' data-icon='forward' class='ui-btn-left'")?>
|
||||
<h1 style='margin-left:0px'><?php echo $app->company->name?></h1>
|
||||
<?php echo html::a($this->createLink('user', 'logout'), $lang->logout, '', "id='logout' data-icon='delete' class='ui-btn-right'")?>
|
||||
<div data-role="navbar" id='mainMenu'>
|
||||
<?php commonModel::printMainmenu($this->moduleName, $this->methodName)?>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -1,44 +0,0 @@
|
||||
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
|
||||
<?php
|
||||
$webRoot = $this->app->getWebRoot();
|
||||
$jsRoot = $webRoot . "js/";
|
||||
$themeRoot = $webRoot . "theme/";
|
||||
$defaultTheme = $webRoot . 'theme/default/';
|
||||
$langTheme = $themeRoot . 'lang/' . $app->getClientLang() . '.css';
|
||||
$clientTheme = $this->app->getClientTheme();
|
||||
?>
|
||||
<?php if($this->server->HTTP_X_PJAX == false):?>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset='utf-8' />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<?php
|
||||
echo html::title($title . ' - ' . $lang->zentaoPMS);
|
||||
|
||||
js::exportConfigVars();
|
||||
if($config->debug)
|
||||
{
|
||||
js::import($jsRoot . 'jquery/mobile/jquery-1.10.1.min.js');
|
||||
js::import($jsRoot . 'm.my.full.js');
|
||||
js::import($jsRoot . 'jquery/mobile/jquery.mobile.min.js');
|
||||
js::import($jsRoot . 'jquery/jquery.pjax.js');
|
||||
|
||||
css::import($defaultTheme . 'jquery.mobile.css');
|
||||
css::import($defaultTheme . 'm.style.css');
|
||||
css::import($langTheme);
|
||||
}
|
||||
else
|
||||
{
|
||||
js::import($jsRoot . 'm.all.js');
|
||||
css::import($defaultTheme . 'm.' . $this->cookie->lang . '.default.css');
|
||||
}
|
||||
|
||||
if(isset($pageCSS)) css::internal($pageCSS);
|
||||
|
||||
echo html::favicon($webRoot . 'favicon.ico');
|
||||
?>
|
||||
</head>
|
||||
<body>
|
||||
<div data-role="page" id='main'>
|
||||
<?php endif;?>
|
||||
@@ -6,7 +6,7 @@ if(file_exists($extViewFile))
|
||||
return;
|
||||
}
|
||||
?>
|
||||
<?php if(!empty($action)): ?>
|
||||
<?php if(isset($action->objectType) and isset($action->action)):?>
|
||||
<?php if(!empty($action->comment)):?>
|
||||
<tr>
|
||||
<td style="padding:0px 10px 10px 10px; border: none;">
|
||||
|
||||
@@ -13,8 +13,8 @@ $editorLang = isset($editorLangs[$app->getClientLang()]) ? $editorLangs[$app->
|
||||
$uid = uniqid('');
|
||||
js::set('kuid', $uid);
|
||||
?>
|
||||
<script type="text/javascript" charset="utf-8" src="<?php echo $jsRoot?>ueditor/ueditor.config.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="<?php echo $jsRoot?>ueditor/ueditor.all.min.js"> </script>
|
||||
<script type="text/javascript" charset="utf-8" src="<?php echo $this->app->getWebRoot() . "js/"?>ueditor/ueditor.config.js"></script>
|
||||
<script type="text/javascript" charset="utf-8" src="<?php echo $this->app->getWebRoot() . "js/"?>ueditor/ueditor.all.min.js"> </script>
|
||||
<script language='javascript'>
|
||||
var editor = <?php echo json_encode($editor);?>;
|
||||
|
||||
@@ -22,7 +22,7 @@ var toolbars = [[
|
||||
'paragraph', 'fontfamily', 'fontsize', '|',
|
||||
'forecolor', 'backcolor', 'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'blockquote', 'pasteplain', '|',
|
||||
'insertorderedlist', 'insertunorderedlist', 'justifyleft', 'justifycenter', 'justifyright', '|',
|
||||
'simpleupload', 'insertvideo', 'insertcode', '|',
|
||||
'simpleupload', 'insertcode', '|',
|
||||
'link', 'unlink', '|',
|
||||
'inserttable', '|',
|
||||
'fullscreen', 'source', '|',
|
||||
|
||||
@@ -40,7 +40,7 @@ $lang->cron->introduction = <<<EOD
|
||||
<p>This function need to be improved, so it is turned off by default.</p>
|
||||
EOD;
|
||||
$lang->cron->confirmOpen = <<<EOD
|
||||
<p>Do you want to turn it on?<a href="%s" target='hiddenwin'><i class="icon icon-toggle-on"></i><strong>Turn On Planned Task<strong></a></p>
|
||||
<p>Do you want to turn it on?<a href="%s" target='hiddenwin'><strong>Turn On Planned Task<strong></a></p>
|
||||
EOD;
|
||||
|
||||
$lang->cron->notice = new stdclass();
|
||||
|
||||
@@ -40,7 +40,7 @@ $lang->cron->introduction = <<<EOD
|
||||
<p>该功能还有待完善,所以默认关闭该功能</p>
|
||||
EOD;
|
||||
$lang->cron->confirmOpen = <<<EOD
|
||||
<p>是否开启该功能?<a href="%s" target='hiddenwin'><i class="icon icon-toggle-on"></i><strong>打开计划任务</strong></a></p>
|
||||
<p>是否开启该功能?<a href="%s" target='hiddenwin'><strong>打开计划任务</strong></a></p>
|
||||
EOD;
|
||||
|
||||
$lang->cron->notice = new stdclass();
|
||||
|
||||
@@ -40,7 +40,7 @@ $lang->cron->introduction = <<<EOD
|
||||
<p>該功能還有待完善,所以預設關閉該功能</p>
|
||||
EOD;
|
||||
$lang->cron->confirmOpen = <<<EOD
|
||||
<p>是否開啟該功能?<a href="%s" target='hiddenwin'><i class="icon icon-toggle-on"></i><strong>打開計劃任務</strong></a></p>
|
||||
<p>是否開啟該功能?<a href="%s" target='hiddenwin'><strong>打開計劃任務</strong></a></p>
|
||||
EOD;
|
||||
|
||||
$lang->cron->notice = new stdclass();
|
||||
|
||||
@@ -7,3 +7,7 @@ $config->custom->canAdd['testcase'] = 'priList,typeList,stageList,resultList,sta
|
||||
$config->custom->canAdd['testtask'] = 'priList';
|
||||
$config->custom->canAdd['todo'] = 'priList,typeList';
|
||||
$config->custom->canAdd['user'] = 'roleList';
|
||||
$config->custom->canAdd['block'] = '';
|
||||
|
||||
$config->custom->moblieHidden['main'] = array('repo');
|
||||
$config->custom->moblieHidden['product'] = array('branch', 'module', 'create');
|
||||
|
||||
@@ -34,6 +34,7 @@ class custom extends control
|
||||
public function set($module = 'story', $field = 'priList', $lang = 'zh_cn')
|
||||
{
|
||||
if($module == 'user' and $field == 'priList') $field = 'roleList';
|
||||
if($module == 'block' and $field == 'priList')$field = 'closed';
|
||||
$currentLang = $this->app->getClientLang();
|
||||
|
||||
$this->app->loadLang($module);
|
||||
@@ -45,40 +46,53 @@ class custom extends control
|
||||
unset($fieldList['newfeature']);
|
||||
unset($fieldList['trackthings']);
|
||||
}
|
||||
if(($module == 'story' || $module == 'testcase') && $field == 'review')
|
||||
if(($module == 'story' or $module == 'testcase') and $field == 'review')
|
||||
{
|
||||
$this->app->loadConfig($module);
|
||||
$this->view->users = $this->loadModel('user')->getPairs('nodeleted|noclosed');
|
||||
$this->view->needReview = zget($this->config->$module, 'needReview', 1);
|
||||
$this->view->forceReview = zget($this->config->$module, 'forceReview', '');
|
||||
}
|
||||
if($module == 'task' && $field == 'hours')
|
||||
if($module == 'task' and $field == 'hours')
|
||||
{
|
||||
$this->app->loadConfig('project');
|
||||
$this->view->weekend = $this->config->project->weekend;
|
||||
$this->view->workhours = $this->config->project->defaultWorkhours;
|
||||
}
|
||||
if($module == 'bug' && $field == 'longlife')
|
||||
if($module == 'bug' and $field == 'longlife')
|
||||
{
|
||||
$this->app->loadConfig('bug');
|
||||
$this->view->longlife = $this->config->bug->longlife;
|
||||
}
|
||||
|
||||
if(!empty($_POST))
|
||||
if($module == 'block' and $field == 'closed')
|
||||
{
|
||||
if(($module == 'story' || $module == 'testcase') && $field == 'review')
|
||||
$this->loadModel('block');
|
||||
$closedBlock = isset($this->config->block->closed) ? $this->config->block->closed : '';
|
||||
|
||||
$this->view->blockPairs = $this->block->getClosedBlockPairs($closedBlock);
|
||||
$this->view->closedBlock = $closedBlock;
|
||||
}
|
||||
|
||||
if(strtolower($_SERVER['REQUEST_METHOD']) == "post")
|
||||
{
|
||||
if(($module == 'story' or $module == 'testcase') and $field == 'review')
|
||||
{
|
||||
$data = fixer::input('post')->join('forceReview', ',')->get();
|
||||
$this->loadModel('setting')->setItems("system.$module", $data);
|
||||
}
|
||||
elseif($module == 'task' && $field == 'hours')
|
||||
elseif($module == 'task' and $field == 'hours')
|
||||
{
|
||||
$this->loadModel('setting')->setItems('system.project', fixer::input('post')->get());
|
||||
}
|
||||
elseif($module == 'bug' && $field == 'longlife')
|
||||
elseif($module == 'bug' and $field == 'longlife')
|
||||
{
|
||||
$this->loadModel('setting')->setItems('system.bug', fixer::input('post')->get());
|
||||
}
|
||||
elseif($module == 'block' and $field == 'closed')
|
||||
{
|
||||
$data = fixer::input('post')->join('closed', ',')->get();
|
||||
$this->loadModel('setting')->setItem('system.block.closed', zget($data, 'closed', ''));
|
||||
}
|
||||
else
|
||||
{
|
||||
$lang = $_POST['lang'];
|
||||
|
||||
@@ -16,6 +16,7 @@ $lang->custom->object['testcase'] = 'Case';
|
||||
$lang->custom->object['testtask'] = 'Build';
|
||||
$lang->custom->object['todo'] = 'To-Dos';
|
||||
$lang->custom->object['user'] = 'User';
|
||||
$lang->custom->object['block'] = 'Block';
|
||||
|
||||
$lang->custom->story = new stdClass();
|
||||
$lang->custom->story->fields['priList'] = 'Priority';
|
||||
@@ -49,6 +50,7 @@ $lang->custom->testcase->fields['typeList'] = 'Type';
|
||||
$lang->custom->testcase->fields['stageList'] = 'Stage';
|
||||
$lang->custom->testcase->fields['resultList'] = 'Result';
|
||||
$lang->custom->testcase->fields['statusList'] = 'Status';
|
||||
$lang->custom->testcase->fields['review'] = 'Review';
|
||||
|
||||
$lang->custom->testtask = new stdClass();
|
||||
$lang->custom->testtask->fields['priList'] = 'Priority';
|
||||
@@ -60,8 +62,10 @@ $lang->custom->todo->fields['typeList'] = 'Type';
|
||||
$lang->custom->todo->fields['statusList'] = 'Status';
|
||||
|
||||
$lang->custom->user = new stdClass();
|
||||
$lang->custom->user->fields['roleList'] = 'Role';
|
||||
$lang->custom->user->fields['statusList'] = 'Status';
|
||||
$lang->custom->user->fields['roleList'] = 'Role';
|
||||
$lang->custom->user->fields['statusList'] = 'Status';
|
||||
|
||||
$lang->custom->block->fields['closed'] = 'Closed Block';
|
||||
|
||||
$lang->custom->currentLang = 'Current Language';
|
||||
$lang->custom->allLang = 'All Language';
|
||||
@@ -71,7 +75,7 @@ $lang->custom->confirmRestore = 'Do you want to reset to Default?';
|
||||
$lang->custom->notice = new stdclass();
|
||||
$lang->custom->notice->userRole = 'Key must be no more than 20 characters!';
|
||||
$lang->custom->notice->canNotAdd = 'This item will be processed, so customized feature is not enabled.';
|
||||
$lang->custom->notice->forceReview = 'Review is required for stories submitted by certain assignee.';
|
||||
$lang->custom->notice->forceReview = 'Review is required for %s submitted by certain assignee.';
|
||||
$lang->custom->notice->longlife = 'List "Undone" bugs that are older than hold days from "Longlife" bugs.';
|
||||
$lang->custom->notice->priListKey = 'Priority list key should be numbers!';
|
||||
$lang->custom->notice->severityListKey = 'Bug severity list key should be numbers.';
|
||||
|
||||
@@ -16,6 +16,7 @@ $lang->custom->object['testcase'] = '用例';
|
||||
$lang->custom->object['testtask'] = '版本';
|
||||
$lang->custom->object['todo'] = '待办';
|
||||
$lang->custom->object['user'] = '用户';
|
||||
$lang->custom->object['block'] = '区块';
|
||||
|
||||
$lang->custom->story = new stdClass();
|
||||
$lang->custom->story->fields['priList'] = '优先级';
|
||||
@@ -64,6 +65,8 @@ $lang->custom->user = new stdClass();
|
||||
$lang->custom->user->fields['roleList'] = '职位';
|
||||
$lang->custom->user->fields['statusList'] = '状态';
|
||||
|
||||
$lang->custom->block->fields['closed'] = '关闭的区块';
|
||||
|
||||
$lang->custom->currentLang = '适用当前语言';
|
||||
$lang->custom->allLang = '适用所有语言';
|
||||
|
||||
@@ -72,7 +75,7 @@ $lang->custom->confirmRestore = '是否要恢复默认配置?';
|
||||
$lang->custom->notice = new stdclass();
|
||||
$lang->custom->notice->userRole = '键的长度必须小于20个字符!';
|
||||
$lang->custom->notice->canNotAdd = '该项参与运算,不提供自定义添加功能';
|
||||
$lang->custom->notice->forceReview = '指定人提交的需求必须评审。';
|
||||
$lang->custom->notice->forceReview = "指定人提交的%s必须评审。";
|
||||
$lang->custom->notice->longlife = 'Bug列表页面的久未处理标签中,列出设置天数之前未处理的Bug。';
|
||||
$lang->custom->notice->priListKey = '优先级的键应当为数字!';
|
||||
$lang->custom->notice->severityListKey = 'Bug严重程度的键应当为数字!';
|
||||
|
||||
@@ -16,6 +16,7 @@ $lang->custom->object['testcase'] = '用例';
|
||||
$lang->custom->object['testtask'] = '版本';
|
||||
$lang->custom->object['todo'] = '待辦';
|
||||
$lang->custom->object['user'] = '用戶';
|
||||
$lang->custom->object['block'] = '區塊';
|
||||
|
||||
$lang->custom->story = new stdClass();
|
||||
$lang->custom->story->fields['priList'] = '優先順序';
|
||||
@@ -49,6 +50,7 @@ $lang->custom->testcase->fields['typeList'] = '類型';
|
||||
$lang->custom->testcase->fields['stageList'] = '階段';
|
||||
$lang->custom->testcase->fields['resultList'] = '執行結果';
|
||||
$lang->custom->testcase->fields['statusList'] = '狀態';
|
||||
$lang->custom->testcase->fields['review'] = '評審流程';
|
||||
|
||||
$lang->custom->testtask = new stdClass();
|
||||
$lang->custom->testtask->fields['priList'] = '優先順序';
|
||||
@@ -63,6 +65,8 @@ $lang->custom->user = new stdClass();
|
||||
$lang->custom->user->fields['roleList'] = '職位';
|
||||
$lang->custom->user->fields['statusList'] = '狀態';
|
||||
|
||||
$lang->custom->block->fields['closed'] = '關閉的區塊';
|
||||
|
||||
$lang->custom->currentLang = '適用當前語言';
|
||||
$lang->custom->allLang = '適用所有語言';
|
||||
|
||||
@@ -71,7 +75,7 @@ $lang->custom->confirmRestore = '是否要恢復預設配置?';
|
||||
$lang->custom->notice = new stdclass();
|
||||
$lang->custom->notice->userRole = '鍵的長度必須小於20個字元!';
|
||||
$lang->custom->notice->canNotAdd = '該項參與運算,不提供自定義添加功能';
|
||||
$lang->custom->notice->forceReview = '指定人提交的需求必須評審。';
|
||||
$lang->custom->notice->forceReview = "指定人提交的%s必須評審。";
|
||||
$lang->custom->notice->longlife = 'Bug列表頁面的久未處理標籤中,列出設置天數之前未處理的Bug。';
|
||||
$lang->custom->notice->priListKey = '優先順序的鍵應當為數字!';
|
||||
$lang->custom->notice->severityListKey = 'Bug嚴重程度的鍵應當為數字!';
|
||||
|
||||
@@ -134,6 +134,7 @@ class customModel extends model
|
||||
{
|
||||
global $app, $lang, $config;
|
||||
$menu = array();
|
||||
$menuModuleName = $module;
|
||||
$order = 1;
|
||||
$customMenuMap = array();
|
||||
$isTutorialMode = commonModel::isTutorialMode();
|
||||
@@ -254,6 +255,9 @@ class customModel extends model
|
||||
if($hidden) $menuItem->hidden = $hidden;
|
||||
if($isTutorialMode) $menuItem->tutorial = true;
|
||||
|
||||
/* Hidden menu by config in mobile. */
|
||||
if($app->viewType == 'mhtml' and isset($config->custom->moblieHidden[$menuModuleName]) and in_array($name, $config->custom->moblieHidden[$menuModuleName])) $menuItem->hidden = 1;
|
||||
|
||||
while(isset($menu[$menuItem->order])) $menuItem->order++;
|
||||
$menu[$menuItem->order] = $menuItem;
|
||||
}
|
||||
@@ -283,7 +287,6 @@ class customModel extends model
|
||||
$customMenu = isset($config->customMenu->$module) ? $config->customMenu->$module : array();
|
||||
if(commonModel::isTutorialMode() && $module === 'main')$customMenu = 'my,product,project,qa,company';
|
||||
if(!empty($customMenu) && is_string($customMenu) && substr($customMenu, 0, 1) === '[') $customMenu = json_decode($customMenu);
|
||||
if($app->viewType == 'mhtml') $customMenu = array();
|
||||
|
||||
$menu = self::setMenuByConfig($allMenu, $customMenu, $module);
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ EOT;
|
||||
<div class='panel-heading'>
|
||||
<strong><?php echo $lang->custom->object[$module] . $lang->arrow . $lang->custom->$module->fields[$field]?></strong>
|
||||
</div>
|
||||
<?php if(($module == 'story' ||$module == 'testcase') and $field == 'review'):?>
|
||||
<?php if(($module == 'story' or $module == 'testcase') and $field == 'review'):?>
|
||||
<table class='table table-form mw-800px'>
|
||||
<tr>
|
||||
<th class='w-80px'><?php echo $lang->custom->storyReview;?></th>
|
||||
@@ -72,7 +72,7 @@ EOT;
|
||||
<tr>
|
||||
<th><?php echo $lang->custom->forceReview;?></th>
|
||||
<td><?php echo html::select('forceReview[]', $users, $forceReview, "class='form-control chosen' multiple");?></td>
|
||||
<td class='w-180px'><?php echo $lang->custom->notice->forceReview;?></td>
|
||||
<td class='w-180px'><?php printf($lang->custom->notice->forceReview, $lang->$module->common);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
@@ -109,6 +109,17 @@ EOT;
|
||||
</tr>
|
||||
</table>
|
||||
<div class='alert alert-info alert-block'><?php echo $lang->custom->notice->longlife;?></div>
|
||||
<?php elseif($module == 'block' and $field == 'closed'):?>
|
||||
<table class='table table-form mw-600px'>
|
||||
<tr>
|
||||
<th class='w-100px'><?php echo $lang->custom->block->fields['closed'];?></th>
|
||||
<td><?php echo html::select('closed[]', $blockPairs, $closedBlock, "class='form-control chosen' multiple");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><?php echo html::submitButton();?></td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php else:?>
|
||||
<table class='table table-form active-disabled table-condensed mw-600px'>
|
||||
<tr class='text-center'>
|
||||
|
||||
@@ -604,7 +604,7 @@ class docModel extends model
|
||||
|
||||
$account = ',' . $this->app->user->account . ',';
|
||||
if(isset($object->addedBy) and $object->addedBy == $this->app->user->account) return true;
|
||||
if(strpos($this->app->company->admins, $account) !== false) return true;
|
||||
if($this->app->user->admin) return true;
|
||||
if($object->acl == 'private' and strpos(",$object->users,", $account) !== false) return true;
|
||||
if($object->acl == 'custom')
|
||||
{
|
||||
@@ -915,7 +915,7 @@ class docModel extends model
|
||||
if($table) $table .= '.';
|
||||
$condition = '';
|
||||
$account = ',' . $this->app->user->account . ',';
|
||||
if(strpos($this->app->company->admins, $account) === false)
|
||||
if(!$this->app->user->admin)
|
||||
{
|
||||
$condition .= "{$table}acl='open'";
|
||||
if($type == 'doc') $condition .= " OR {$table}addedBy = '{$this->app->user->account}'";
|
||||
|
||||
@@ -20,7 +20,15 @@
|
||||
<?php if(empty($file->pathname)) continue;?>
|
||||
<div class='col-md-3'>
|
||||
<div class='card lib-file'>
|
||||
<a class='media-wrapper' title='<?php echo $file->title . '.' . $file->extension?>' target='_blank' href='<?php echo $this->createLink('file', 'download', "fileID=$file->id&mouse=left") ?>'>
|
||||
<?php
|
||||
$imageWidth = 0;
|
||||
if(stripos('jpg|jpeg|gif|png|bmp', $file->extension) !== false and file_exists($file->realPath))
|
||||
{
|
||||
$imageSize = getimagesize($file->realPath);
|
||||
$imageWidth = $imageSize ? $imageSize[0] : 0;
|
||||
}
|
||||
?>
|
||||
<a class='media-wrapper' href='###' title='<?php echo $file->title . '.' . $file->extension?>' target='_blank' onclick="return downloadFile(<?php echo $file->id?>, '<?php echo $file->extension?>', <?php echo $imageWidth?>)">
|
||||
<?php
|
||||
$downloadLink = $this->createLink('file', 'download', "fileID=$file->id&mouse=left");
|
||||
if(in_array($file->extension, $config->file->imageExtensions))
|
||||
@@ -54,4 +62,28 @@
|
||||
</div>
|
||||
<div class='clearfix pager-wrapper'><?php $pager->show();?></div>
|
||||
<?php js::set('type', 'doc');?>
|
||||
<script>
|
||||
<?php
|
||||
$sessionString = $config->requestType == 'PATH_INFO' ? '?' : '&';
|
||||
$sessionString .= session_name() . '=' . session_id();
|
||||
?>
|
||||
function downloadFile(fileID, extension, imageWidth)
|
||||
{
|
||||
if(!fileID) return;
|
||||
var fileTypes = 'txt,jpg,jpeg,gif,png,bmp';
|
||||
var sessionString = '<?php echo $sessionString;?>';
|
||||
var windowWidth = $(window).width();
|
||||
var url = createLink('file', 'download', 'fileID=' + fileID + '&mouse=left') + sessionString;
|
||||
width = (windowWidth > imageWidth) ? ((imageWidth < windowWidth*0.5) ? windowWidth*0.5 : imageWidth) : windowWidth;
|
||||
if(fileTypes.indexOf(extension) >= 0)
|
||||
{
|
||||
$('<a>').modalTrigger({url: url, type: 'iframe', width: width}).trigger('click');
|
||||
}
|
||||
else
|
||||
{
|
||||
window.open(url, '_blank');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -205,6 +205,7 @@ class group extends control
|
||||
foreach($this->lang->resource as $module => $moduleActions)
|
||||
{
|
||||
$modules[$module] = $this->lang->$module->common;
|
||||
if($module == 'caselib') $module = 'testsuite';
|
||||
foreach($moduleActions as $action)
|
||||
{
|
||||
$actions[$module][$action] = $this->lang->$module->$action;
|
||||
|
||||
@@ -46,6 +46,9 @@ $lang->group->copyOptions['copyPriv'] = 'Copy Privilege';
|
||||
$lang->group->copyOptions['copyUser'] = 'Copy User';
|
||||
|
||||
$lang->group->versions[''] = 'History';
|
||||
$lang->group->versions['9_1'] = 'ZenTao9.1';
|
||||
$lang->group->versions['9_0'] = 'ZenTao9.0';
|
||||
$lang->group->versions['8_4'] = 'ZenTao8.4';
|
||||
$lang->group->versions['8_3'] = 'ZenTao8.3';
|
||||
$lang->group->versions['8_2_beta'] = 'ZenTao8.2.beta';
|
||||
$lang->group->versions['8_0_1'] = 'ZenTao8.0.1';
|
||||
|
||||
+149
-51
@@ -28,33 +28,36 @@ $lang->moduleOrder[50] = 'qa';
|
||||
$lang->moduleOrder[55] = 'bug';
|
||||
$lang->moduleOrder[60] = 'testcase';
|
||||
$lang->moduleOrder[65] = 'testtask';
|
||||
$lang->moduleOrder[70] = 'testsuite';
|
||||
$lang->moduleOrder[75] = 'testreport';
|
||||
$lang->moduleOrder[80] = 'caselib';
|
||||
|
||||
$lang->moduleOrder[70] = 'doc';
|
||||
$lang->moduleOrder[75] = 'report';
|
||||
$lang->moduleOrder[85] = 'doc';
|
||||
$lang->moduleOrder[90] = 'report';
|
||||
|
||||
$lang->moduleOrder[80] = 'company';
|
||||
$lang->moduleOrder[85] = 'dept';
|
||||
$lang->moduleOrder[90] = 'group';
|
||||
$lang->moduleOrder[95] = 'user';
|
||||
$lang->moduleOrder[95] = 'company';
|
||||
$lang->moduleOrder[100] = 'dept';
|
||||
$lang->moduleOrder[105] = 'group';
|
||||
$lang->moduleOrder[110] = 'user';
|
||||
|
||||
$lang->moduleOrder[100] = 'admin';
|
||||
$lang->moduleOrder[105] = 'extension';
|
||||
$lang->moduleOrder[110] = 'custom';
|
||||
$lang->moduleOrder[115] = 'editor';
|
||||
$lang->moduleOrder[120] = 'convert';
|
||||
$lang->moduleOrder[125] = 'action';
|
||||
$lang->moduleOrder[115] = 'admin';
|
||||
$lang->moduleOrder[120] = 'extension';
|
||||
$lang->moduleOrder[125] = 'custom';
|
||||
$lang->moduleOrder[130] = 'editor';
|
||||
$lang->moduleOrder[135] = 'convert';
|
||||
$lang->moduleOrder[140] = 'action';
|
||||
|
||||
$lang->moduleOrder[130] = 'mail';
|
||||
$lang->moduleOrder[135] = 'svn';
|
||||
$lang->moduleOrder[140] = 'git';
|
||||
$lang->moduleOrder[145] = 'search';
|
||||
$lang->moduleOrder[150] = 'tree';
|
||||
$lang->moduleOrder[155] = 'api';
|
||||
$lang->moduleOrder[160] = 'file';
|
||||
$lang->moduleOrder[165] = 'misc';
|
||||
$lang->moduleOrder[170] = 'backup';
|
||||
$lang->moduleOrder[175] = 'cron';
|
||||
$lang->moduleOrder[180] = 'dev';
|
||||
$lang->moduleOrder[145] = 'mail';
|
||||
$lang->moduleOrder[150] = 'svn';
|
||||
$lang->moduleOrder[155] = 'git';
|
||||
$lang->moduleOrder[160] = 'search';
|
||||
$lang->moduleOrder[165] = 'tree';
|
||||
$lang->moduleOrder[170] = 'api';
|
||||
$lang->moduleOrder[175] = 'file';
|
||||
$lang->moduleOrder[180] = 'misc';
|
||||
$lang->moduleOrder[185] = 'backup';
|
||||
$lang->moduleOrder[190] = 'cron';
|
||||
$lang->moduleOrder[195] = 'dev';
|
||||
|
||||
$lang->resource = new stdclass();
|
||||
|
||||
@@ -130,7 +133,7 @@ $lang->resource->product->edit = 'edit';
|
||||
$lang->resource->product->batchEdit = 'batchEdit';
|
||||
$lang->resource->product->delete = 'delete';
|
||||
$lang->resource->product->roadmap = 'roadmap';
|
||||
//$lang->resource->product->doc = 'doc';
|
||||
$lang->resource->product->doc = 'doc';
|
||||
$lang->resource->product->dynamic = 'dynamic';
|
||||
$lang->resource->product->project = 'project';
|
||||
$lang->resource->product->close = 'close';
|
||||
@@ -300,7 +303,7 @@ $lang->resource->project->computeBurn = 'computeBurn';
|
||||
$lang->resource->project->fixFirst = 'fixFirst';
|
||||
$lang->resource->project->burnData = 'burnData';
|
||||
$lang->resource->project->team = 'team';
|
||||
//$lang->resource->project->doc = 'doc';
|
||||
$lang->resource->project->doc = 'doc';
|
||||
$lang->resource->project->dynamic = 'dynamic';
|
||||
$lang->resource->project->manageProducts = 'manageProducts';
|
||||
//$lang->resource->project->manageChilds = 'manageChilds';
|
||||
@@ -513,25 +516,35 @@ $lang->resource->testcase->confirmChange = 'confirmChange';
|
||||
$lang->resource->testcase->confirmStoryChange = 'confirmStoryChange';
|
||||
$lang->resource->testcase->batchChangeModule = 'batchChangeModule';
|
||||
$lang->resource->testcase->bugs = 'bugs';
|
||||
$lang->resource->testcase->review = 'review';
|
||||
$lang->resource->testcase->batchReview = 'batchReview';
|
||||
$lang->resource->testcase->importFromLib = 'importFromLib';
|
||||
$lang->resource->testcase->batchCaseTypeChange = 'batchCaseTypeChange';
|
||||
$lang->resource->testcase->batchConfirmStoryChange = 'batchConfirmStoryChange';
|
||||
|
||||
$lang->testcase->methodOrder[0] = 'index';
|
||||
$lang->testcase->methodOrder[5] = 'browse';
|
||||
$lang->testcase->methodOrder[10] = 'groupCase';
|
||||
$lang->testcase->methodOrder[15] = 'create';
|
||||
$lang->testcase->methodOrder[20] = 'batchCreate';
|
||||
$lang->testcase->methodOrder[25] = 'createBug';
|
||||
$lang->testcase->methodOrder[30] = 'view';
|
||||
$lang->testcase->methodOrder[35] = 'edit';
|
||||
$lang->testcase->methodOrder[40] = 'delete';
|
||||
$lang->testcase->methodOrder[45] = 'export';
|
||||
$lang->testcase->methodOrder[50] = 'confirmChange';
|
||||
$lang->testcase->methodOrder[55] = 'confirmStoryChange';
|
||||
$lang->testcase->methodOrder[60] = 'batchEdit';
|
||||
$lang->testcase->methodOrder[65] = 'batchDelete';
|
||||
$lang->testcase->methodOrder[70] = 'batchChangeModule';
|
||||
$lang->testcase->methodOrder[75] = 'linkCases';
|
||||
$lang->testcase->methodOrder[80] = 'unlinkCase';
|
||||
$lang->testcase->methodOrder[85] = 'bugs';
|
||||
$lang->testcase->methodOrder[0] = 'index';
|
||||
$lang->testcase->methodOrder[5] = 'browse';
|
||||
$lang->testcase->methodOrder[10] = 'groupCase';
|
||||
$lang->testcase->methodOrder[15] = 'create';
|
||||
$lang->testcase->methodOrder[20] = 'batchCreate';
|
||||
$lang->testcase->methodOrder[25] = 'createBug';
|
||||
$lang->testcase->methodOrder[30] = 'view';
|
||||
$lang->testcase->methodOrder[35] = 'edit';
|
||||
$lang->testcase->methodOrder[40] = 'delete';
|
||||
$lang->testcase->methodOrder[45] = 'export';
|
||||
$lang->testcase->methodOrder[50] = 'confirmChange';
|
||||
$lang->testcase->methodOrder[55] = 'confirmStoryChange';
|
||||
$lang->testcase->methodOrder[60] = 'batchEdit';
|
||||
$lang->testcase->methodOrder[65] = 'batchDelete';
|
||||
$lang->testcase->methodOrder[70] = 'batchChangeModule';
|
||||
$lang->testcase->methodOrder[75] = 'linkCases';
|
||||
$lang->testcase->methodOrder[80] = 'unlinkCase';
|
||||
$lang->testcase->methodOrder[85] = 'bugs';
|
||||
$lang->testcase->methodOrder[95] = 'review';
|
||||
$lang->testcase->methodOrder[100] = 'batchReview';
|
||||
$lang->testcase->methodOrder[105] = 'batchConfirmStoryChange';
|
||||
$lang->testcase->methodOrder[110] = 'importFromLib';
|
||||
$lang->testcase->methodOrder[115] = 'batchCaseTypeChange';
|
||||
|
||||
/* Test task. */
|
||||
$lang->resource->testtask = new stdclass();
|
||||
@@ -553,6 +566,9 @@ $lang->resource->testtask->runcase = 'lblRunCase';
|
||||
$lang->resource->testtask->results = 'lblResults';
|
||||
$lang->resource->testtask->results = 'lblResults';
|
||||
$lang->resource->testtask->batchRun = 'batchRun';
|
||||
$lang->resource->testtask->activate = 'activate';
|
||||
$lang->resource->testtask->block = 'block';
|
||||
$lang->resource->testtask->report = 'reportChart';
|
||||
|
||||
$lang->testtask->methodOrder[0] = 'index';
|
||||
$lang->testtask->methodOrder[5] = 'create';
|
||||
@@ -562,14 +578,64 @@ $lang->testtask->methodOrder[20] = 'cases';
|
||||
$lang->testtask->methodOrder[25] = 'groupCase';
|
||||
$lang->testtask->methodOrder[30] = 'edit';
|
||||
$lang->testtask->methodOrder[35] = 'start';
|
||||
$lang->testtask->methodOrder[40] = 'close';
|
||||
$lang->testtask->methodOrder[45] = 'delete';
|
||||
$lang->testtask->methodOrder[50] = 'batchAssign';
|
||||
$lang->testtask->methodOrder[55] = 'linkcase';
|
||||
$lang->testtask->methodOrder[60] = 'unlinkcase';
|
||||
$lang->testtask->methodOrder[65] = 'runcase';
|
||||
$lang->testtask->methodOrder[70] = 'results';
|
||||
$lang->testtask->methodOrder[75] = 'batchUnlinkCases';
|
||||
$lang->testtask->methodOrder[40] = 'activate';
|
||||
$lang->testtask->methodOrder[45] = 'block';
|
||||
$lang->testtask->methodOrder[50] = 'close';
|
||||
$lang->testtask->methodOrder[55] = 'delete';
|
||||
$lang->testtask->methodOrder[60] = 'batchAssign';
|
||||
$lang->testtask->methodOrder[65] = 'linkcase';
|
||||
$lang->testtask->methodOrder[70] = 'unlinkcase';
|
||||
$lang->testtask->methodOrder[75] = 'runcase';
|
||||
$lang->testtask->methodOrder[80] = 'results';
|
||||
$lang->testtask->methodOrder[85] = 'batchUnlinkCases';
|
||||
$lang->testtask->methodOrder[90] = 'report';
|
||||
|
||||
$lang->resource->testreport = new stdclass();
|
||||
$lang->resource->testreport->browse = 'browse';
|
||||
$lang->resource->testreport->create = 'create';
|
||||
$lang->resource->testreport->view = 'view';
|
||||
$lang->resource->testreport->delete = 'delete';
|
||||
$lang->resource->testreport->edit = 'edit';
|
||||
|
||||
$lang->testreport->methodOrder[0] = 'browse';
|
||||
$lang->testreport->methodOrder[5] = 'create';
|
||||
$lang->testreport->methodOrder[10] = 'view';
|
||||
$lang->testreport->methodOrder[15] = 'delete';
|
||||
$lang->testreport->methodOrder[20] = 'edit';
|
||||
|
||||
$lang->resource->testsuite = new stdclass();
|
||||
$lang->resource->testsuite->index = 'index';
|
||||
$lang->resource->testsuite->browse = 'browse';
|
||||
$lang->resource->testsuite->create = 'create';
|
||||
$lang->resource->testsuite->view = 'view';
|
||||
$lang->resource->testsuite->edit = 'edit';
|
||||
$lang->resource->testsuite->delete = 'delete';
|
||||
$lang->resource->testsuite->linkCase = 'linkCase';
|
||||
$lang->resource->testsuite->unlinkCase = 'unlinkCase';
|
||||
$lang->resource->testsuite->batchUnlinkCases = 'batchUnlinkCases';
|
||||
|
||||
$lang->testsuite->methodOrder[0] = 'index';
|
||||
$lang->testsuite->methodOrder[5] = 'browse';
|
||||
$lang->testsuite->methodOrder[10] = 'create';
|
||||
$lang->testsuite->methodOrder[15] = 'view';
|
||||
$lang->testsuite->methodOrder[20] = 'edit';
|
||||
$lang->testsuite->methodOrder[25] = 'delete';
|
||||
$lang->testsuite->methodOrder[30] = 'linkCase';
|
||||
$lang->testsuite->methodOrder[35] = 'unlinkCase';
|
||||
$lang->testsuite->methodOrder[40] = 'batchUnlinkCases';
|
||||
|
||||
$lang->resource->caselib = new stdclass();
|
||||
$lang->resource->caselib->library = 'library';
|
||||
$lang->resource->caselib->createLib = 'createLib';
|
||||
$lang->resource->caselib->edit = 'editLib';
|
||||
$lang->resource->caselib->createCase = 'createCase';
|
||||
$lang->resource->caselib->libView = 'libView';
|
||||
|
||||
$lang->caselib->methodOrder[0] = 'library';
|
||||
$lang->caselib->methodOrder[5] = 'createLib';
|
||||
$lang->caselib->methodOrder[10] = 'edit';
|
||||
$lang->caselib->methodOrder[15] = 'createCase';
|
||||
$lang->caselib->methodOrder[20] = 'libView';
|
||||
|
||||
/* Doc. */
|
||||
$lang->resource->doc = new stdclass();
|
||||
@@ -1199,3 +1265,35 @@ $lang->changelog['8.4'][] = 'story-cases';
|
||||
|
||||
$lang->changelog['9.0'][] = 'testcase-bugs';
|
||||
$lang->changelog['9.0'][] = 'mail-resend';
|
||||
|
||||
$lang->changelog['9.1'][] = 'testcase-review';
|
||||
$lang->changelog['9.1'][] = 'testcase-batchReview';
|
||||
$lang->changelog['9.1'][] = 'testcase-importFromLib';
|
||||
$lang->changelog['9.1'][] = 'testcase-batchCaseTypeChange';
|
||||
$lang->changelog['9.1'][] = 'testcase-batchConfirmStoryChange';
|
||||
$lang->changelog['9.1'][] = 'testreport-browse';
|
||||
$lang->changelog['9.1'][] = 'testreport-create';
|
||||
$lang->changelog['9.1'][] = 'testreport-view';
|
||||
$lang->changelog['9.1'][] = 'testreport-delete';
|
||||
$lang->changelog['9.1'][] = 'testreport-edit';
|
||||
$lang->changelog['9.1'][] = 'testsuite-index';
|
||||
$lang->changelog['9.1'][] = 'testsuite-browse';
|
||||
$lang->changelog['9.1'][] = 'testsuite-create';
|
||||
$lang->changelog['9.1'][] = 'testsuite-view';
|
||||
$lang->changelog['9.1'][] = 'testsuite-edit';
|
||||
$lang->changelog['9.1'][] = 'testsuite-delete';
|
||||
$lang->changelog['9.1'][] = 'testsuite-linkCase';
|
||||
$lang->changelog['9.1'][] = 'testsuite-unlinkCase';
|
||||
$lang->changelog['9.1'][] = 'testsuite-batchUnlinkCases';
|
||||
$lang->changelog['9.1'][] = 'testsuite-library';
|
||||
$lang->changelog['9.1'][] = 'testsuite-createLib';
|
||||
$lang->changelog['9.1'][] = 'testsuite-createCase';
|
||||
$lang->changelog['9.1'][] = 'testsuite-libView';
|
||||
$lang->changelog['9.1'][] = 'caselib-library';
|
||||
$lang->changelog['9.1'][] = 'caselib-createLib';
|
||||
$lang->changelog['9.1'][] = 'caselib-edit';
|
||||
$lang->changelog['9.1'][] = 'caselib-createCase';
|
||||
$lang->changelog['9.1'][] = 'caselib-libView';
|
||||
$lang->changelog['9.1'][] = 'testtask-activate';
|
||||
$lang->changelog['9.1'][] = 'testtask-block';
|
||||
$lang->changelog['9.1'][] = 'testtask-report';
|
||||
|
||||
@@ -46,6 +46,9 @@ $lang->group->copyOptions['copyPriv'] = '复制权限';
|
||||
$lang->group->copyOptions['copyUser'] = '复制用户';
|
||||
|
||||
$lang->group->versions[''] = '修改历史';
|
||||
$lang->group->versions['9_1'] = '禅道9.1';
|
||||
$lang->group->versions['9_0'] = '禅道9.0';
|
||||
$lang->group->versions['8_4'] = '禅道8.4';
|
||||
$lang->group->versions['8_3'] = '禅道8.3';
|
||||
$lang->group->versions['8_2_beta'] = '禅道8.2.beta';
|
||||
$lang->group->versions['8_0_1'] = '禅道8.0.1';
|
||||
|
||||
@@ -46,6 +46,9 @@ $lang->group->copyOptions['copyPriv'] = '複製權限';
|
||||
$lang->group->copyOptions['copyUser'] = '複製用戶';
|
||||
|
||||
$lang->group->versions[''] = '修改歷史';
|
||||
$lang->group->versions['9_1'] = '禪道9.1';
|
||||
$lang->group->versions['9_0'] = '禪道9.0';
|
||||
$lang->group->versions['8_4'] = '禪道8.4';
|
||||
$lang->group->versions['8_3'] = '禪道8.3';
|
||||
$lang->group->versions['8_2_beta'] = '禪道8.2.beta';
|
||||
$lang->group->versions['8_0_1'] = '禪道8.0.1';
|
||||
|
||||
@@ -73,7 +73,7 @@ class groupModel extends model
|
||||
foreach($privs as $priv)
|
||||
{
|
||||
$priv->group = $toGroup;
|
||||
$this->dao->insert(TABLE_GROUPPRIV)->data($priv)->exec();
|
||||
$this->dao->replace(TABLE_GROUPPRIV)->data($priv)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,7 +249,7 @@ class groupModel extends model
|
||||
$data->group = $groupID;
|
||||
$data->module = $moduleName;
|
||||
$data->method = $actionName;
|
||||
$this->dao->insert(TABLE_GROUPPRIV)->data($data)->exec();
|
||||
$this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
<th class='text-right w-150px'><?php echo $this->lang->$moduleName->common;?><?php echo html::selectAll($moduleName, 'checkbox')?></th>
|
||||
<td id='<?php echo $moduleName;?>' class='pv-10px'>
|
||||
<?php $i = 1;?>
|
||||
<?php if($moduleName == 'caselib') $moduleName = 'testsuite';?>
|
||||
<?php foreach($moduleActions as $action => $actionLabel):?>
|
||||
<?php if(!empty($version) and strpos($changelogs, ",$moduleName-$actionLabel,") === false) continue;?>
|
||||
<div class='group-item'>
|
||||
|
||||
+16
-8
@@ -277,7 +277,7 @@ class mail extends control
|
||||
$this->view->title = $this->lang->mail->common . $this->lang->colon . $this->lang->mail->test;
|
||||
$this->view->position[] = html::a(inlink('index'), $this->lang->mail->common);
|
||||
$this->view->position[] = $this->lang->mail->test;
|
||||
$this->view->users = $this->dao->select('account, CONCAT(realname, " ", email) AS email' )->from(TABLE_USER)->where('email')->ne('')->orderBy('account')->fetchPairs();
|
||||
$this->view->users = $this->dao->select('account, CONCAT(realname, " ", email) AS email' )->from(TABLE_USER)->where('email')->ne('')->andWhere('deleted')->eq(0)->orderBy('account')->fetchPairs();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -314,7 +314,7 @@ class mail extends control
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_MAILQUEUE)->set('status')->eq('sending')->where('id')->in($queue->id)->exec();
|
||||
$this->mail->send($queue->toList, $queue->subject, $queue->body, $queue->ccList);
|
||||
$this->mail->send($queue->toList, $queue->subject, $queue->body, $queue->ccList, true);
|
||||
|
||||
$data = new stdclass();
|
||||
$data->sendTime = $now;
|
||||
@@ -491,6 +491,12 @@ class mail extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* zentao cloud.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ztCloud()
|
||||
{
|
||||
if($_POST)
|
||||
@@ -514,7 +520,7 @@ class mail extends control
|
||||
$this->view->title = $this->lang->mail->ztCloud;
|
||||
$this->view->position[] = html::a(inlink('index'), $this->lang->mail->common);
|
||||
$this->view->position[] = $this->lang->mail->ztCloud;
|
||||
if(!empty($this->config->mail->ztcloud->secretKey))
|
||||
if(!empty($this->config->mail->ztcloud->secretKey) and !empty($this->config->global->community))
|
||||
{
|
||||
$mailConfig = new stdclass();
|
||||
$mailConfig->fromAddress = $this->config->mail->fromAddress;
|
||||
@@ -529,16 +535,18 @@ class mail extends control
|
||||
die($this->display());
|
||||
}
|
||||
|
||||
if($this->cookie->ztCloudLicense != 'yes')
|
||||
{
|
||||
$this->view->step = 'license';
|
||||
die($this->display());
|
||||
}
|
||||
if(empty($this->config->global->ztPrivateKey) or $this->config->global->community == 'na' or empty($this->config->global->community))
|
||||
{
|
||||
if(!empty($this->config->global->community) and $this->config->global->community != 'na') die(js::locate($this->createLink('admin', 'bind', 'from=mail')));
|
||||
die(js::locate($this->createLink('admin', 'register', 'from=mail')));
|
||||
}
|
||||
|
||||
if($this->cookie->ztCloudLicense != 'yes')
|
||||
{
|
||||
$this->view->step = 'license';
|
||||
die($this->display());
|
||||
}
|
||||
|
||||
$result = $this->loadModel('admin')->getSecretKey();
|
||||
if(empty($result))die(js::alert($this->lang->mail->connectFail) . js::locate($this->createLink('admin', 'register', "from=mail")));
|
||||
if($result->result == 'fail' and empty($result->data)) die(js::alert($this->lang->mail->centifyFail) . js::locate($this->createLink('admin', 'register', "from=mail")));
|
||||
|
||||
@@ -21,12 +21,12 @@ include '../../common/view/header.html.php';
|
||||
<table class='table table-form' id='selectmta'>
|
||||
<tr>
|
||||
<td class='text-center'>
|
||||
<?php if(common::hasPriv('mail', 'detect')):?>
|
||||
<?php echo html::a(inlink('detect'), $lang->mail->smtp, '', "class='btn btn-sm w-120px'")?>
|
||||
<?php endif;?>
|
||||
<?php if($this->app->getClientLang() != 'en' and common::hasPriv('mail', 'ztCloud')):?>
|
||||
<?php echo html::a(inlink('ztCloud'), $lang->mail->ztCloud, '', "class='btn btn-sm w-120px'")?>
|
||||
<?php endif;?>
|
||||
<?php if(common::hasPriv('mail', 'detect')):?>
|
||||
<?php echo html::a(inlink('detect'), $lang->mail->smtp, '', "class='btn btn-sm w-120px'")?>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -275,6 +275,8 @@ class my extends control
|
||||
}
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'testcase', $type == 'assigntome' ? false : true);
|
||||
|
||||
$cases = $this->testcase->appendData($cases, $type == 'assigntome' ? 'run' : 'case');
|
||||
|
||||
/* Assign. */
|
||||
$this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->testCase;
|
||||
$this->view->position[] = $this->lang->my->testCase;
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
<div data-role='navbar' id='subMenu'>
|
||||
<ul>
|
||||
<?php foreach($config->mobile->bugBar as $menu):?>
|
||||
<?php $active = $type == $menu ? 'ui-btn-active' : ''?>
|
||||
<li>
|
||||
<?php
|
||||
$subMenuName = $menu == 'assignedTo' ? $lang->bug->assignToMe : $lang->bug->{$menu . 'Me'};
|
||||
echo html::a($this->createLink('my', 'bug', "type=$menu"), $subMenuName, '', "class='$active' data-theme='d'");
|
||||
?>
|
||||
</li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php $this->session->set('bugType', $type);?>
|
||||
<?php foreach($bugs as $bug):?>
|
||||
<div data-role="collapsible-set">
|
||||
<div data-role="collapsible" data-collapsed="<?php echo $this->session->bugID == $bug->id ? 'false' : 'true'?>" class='collapsible'>
|
||||
<?php if($this->session->bugID == $bug->id) echo "<script>showDetail('bug', $bug->id);</script>";?>
|
||||
<h1 onClick="showDetail('bug', <?php echo $bug->id;?>)"><?php echo $bug->title;?></h1>
|
||||
<div><?php echo $bug->steps;?></div>
|
||||
<div id='item<?php echo $bug->id;?>'></div>
|
||||
<div data-role='content' class='text-center'>
|
||||
<?php
|
||||
common::printIcon('bug', 'confirmBug', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'assignTo', "bugID=$bug->id", '', 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'resolve', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'close', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
common::printIcon('bug', 'activate', "bugID=$bug->id", $bug, 'button', '', '', 'iframe');
|
||||
?>
|
||||
</div>
|
||||
<?php if(end($bugs) == $bug) echo "<hr />";?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php $pager->show('left', 'mobile')?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,44 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The story view file of dashboard module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package my
|
||||
* @version $Id: story.html.php 4735 2013-05-03 08:30:02Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
<div data-role='navbar' id='subMenu'>
|
||||
<ul>
|
||||
<?php foreach($config->mobile->storyBar as $menu):?>
|
||||
<?php $active = $type == $menu ? 'ui-btn-active' : ''?>
|
||||
<li><?php echo html::a($this->createLink('my', 'story', "type=$menu"), $lang->my->storyMenu->{$menu . 'Me'}, '', "class='$active' data-theme='d'")?></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php foreach($stories as $story):?>
|
||||
<div data-role="collapsible-set">
|
||||
<div data-role="collapsible" data-collapsed="true">
|
||||
<?php if($this->session->storyID == $story->id) echo "<script>showDetail('story', $story->id);</script>";?>
|
||||
<h1 onClick="showDetail('story', <?php echo $story->id;?>)"><?php echo $story->title;?></h1>
|
||||
<div id='item<?php echo $story->id;?>'></div>
|
||||
<div data-role='content' class='text-center'>
|
||||
<?php
|
||||
if(!$story->deleted)
|
||||
{
|
||||
common::printIcon('story', 'review', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'close', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'activate', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'delete', "storyID=$story->id", '', '', '', 'hiddenwin');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php $pager->show('left', 'mobile')?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,46 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The task view file of dashboard module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package my
|
||||
* @version $Id: task.html.php 4735 2013-05-03 08:30:02Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
<div data-role='navbar' id='subMenu'>
|
||||
<ul>
|
||||
<?php foreach($config->mobile->taskBar as $menu):?>
|
||||
<?php $active = $type == $menu ? 'ui-btn-active' : ''?>
|
||||
<li><?php echo html::a($this->createLink('my', 'task', "type=$menu"), $lang->my->taskMenu->{$menu . 'Me'}, '', "class='$active' data-theme='d'")?></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php $this->session->set('taskType', $type);?>
|
||||
<?php foreach($tasks as $task):?>
|
||||
<div data-role="collapsible-set">
|
||||
<div data-role="collapsible" data-collapsed="<?php echo $this->session->taskID == $task->id ? 'false' : 'true'?>" class='collapsible'>
|
||||
<?php if($this->session->taskID == $task->id) echo "<script>showDetail('task', $task->id);</script>";?>
|
||||
<h1 onClick="showDetail('task', <?php echo $task->id;?>)"><?php echo $task->name;?></h1>
|
||||
<div><?php echo $task->desc;?></div>
|
||||
<div id='item<?php echo $task->id;?>'><?php echo $task->desc;?></div>
|
||||
<div data-role='content' class='text-center'>
|
||||
<?php
|
||||
common::printIcon('task', 'assignTo', "projectID=$task->project&taskID=$task->id", $task);
|
||||
common::printIcon('task', 'start', "taskID=$task->id", $task);
|
||||
common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task);
|
||||
common::printIcon('task', 'finish', "taskID=$task->id", $task);
|
||||
common::printIcon('task', 'close', "taskID=$task->id", $task);
|
||||
common::printIcon('task', 'activate', "taskID=$task->id", $task);
|
||||
?>
|
||||
</div>
|
||||
<?php if(end($tasks) == $task) echo "<hr />";?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php $pager->show('left', 'mobile')?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,54 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The todo view file of dashboard module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yidong Wang <yidong@cnezsoft.com>
|
||||
* @package my
|
||||
* @version $Id: todo.html.php 4735 2013-05-03 08:30:02Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
<div data-role='navbar' id='subMenu'>
|
||||
<ul>
|
||||
<?php foreach($config->mobile->todoBar as $period):?>
|
||||
<?php $active = $type == $period ? 'ui-btn-active' : ''?>
|
||||
<li><?php echo html::a($this->createLink('my', 'todo', "type=$period"), $lang->todo->periods[$period], '', "class='$active' data-theme='d'")?></li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php $this->session->set('todoType', $type);?>
|
||||
<?php foreach($todos as $todo):?>
|
||||
<?php if(!$todo->private or ($todo->private and $todo->account == $app->user->account)):?>
|
||||
<div data-role="collapsible-set">
|
||||
<div data-role="collapsible" data-collapsed="true" class='collapsible'>
|
||||
<h1 onClick="showDetail('todo', <?php echo $todo->id;?>)"><?php echo $todo->name;?></h1>
|
||||
<div><?php echo $todo->desc;?></div>
|
||||
<div id='item<?php echo $todo->id;?>'><?php echo $todo->desc;?></div>
|
||||
<div data-role='content' class='text-center'>
|
||||
<?php
|
||||
common::printIcon('todo', 'finish', "id=$todo->id", $todo, 'button', '', 'hiddenwin');
|
||||
if($todo->account == $app->user->account)
|
||||
{
|
||||
if($type != 'today') common::printIcon('todo', 'import2Today', "todoID=$todo->id");
|
||||
common::printIcon('todo', 'delete', "todoID=$todo->id", '', 'button', '', 'hiddenwin');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
<?php if(end($todos) == $todo) echo "<hr />";?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php endforeach;?>
|
||||
<?php echo $pager->show('left', 'mobile')?>
|
||||
<div data-role='footer' data-position='fixed'>
|
||||
<div data-role='navbar' data-iconpos="left">
|
||||
<ul>
|
||||
<li><?php echo html::a($this->createLink('todo', 'batchCreate'), $lang->todo->create, '', "data-icon='plus' data-theme='e'")?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -48,13 +48,17 @@
|
||||
$canBatchRun = common::hasPriv('testtask', 'batchRun');
|
||||
?>
|
||||
<?php foreach($cases as $case):?>
|
||||
<?php
|
||||
$caseID = $type == 'assigntome' ? $case->case : $case->id;
|
||||
$runID = $type == 'assigntome' ? $case->id : 0;
|
||||
?>
|
||||
<tr class='text-center'>
|
||||
<td class='cell-id'>
|
||||
<?php if($canBatchEdit or $canBatchRun):?><input type='checkbox' name='caseIDList[]' value='<?php echo $case->id;?>'/><?php endif;?>
|
||||
<?php echo html::a($this->createLink('testcase', 'view', "testcaseID=$case->id"), sprintf('%03d', $case->id));?>
|
||||
<?php if($canBatchEdit or $canBatchRun):?><input type='checkbox' name='caseIDList[]' value='<?php echo $caseID;?>'/><?php endif;?>
|
||||
<?php echo html::a($this->createLink('testcase', 'view', "testcaseID=$caseID&version=$case->version"), sprintf('%03d', $caseID));?>
|
||||
</td>
|
||||
<td><span class='<?php echo 'pri' . zget($lang->testcase->priList, $case->pri, $case->pri)?>'><?php echo zget($lang->testcase->priList, $case->pri, $case->pri)?></span</td>
|
||||
<td class='text-left'><?php echo html::a($this->createLink('testcase', 'view', "testcaseID=$case->id"), $case->title, null, "style='color: $case->color'");?></td>
|
||||
<td class='text-left'><?php echo html::a($this->createLink('testcase', 'view', "testcaseID=$caseID&version=$case->version"), $case->title, null, "style='color: $case->color'");?></td>
|
||||
<td><?php echo $lang->testcase->typeList[$case->type];?></td>
|
||||
<td><?php echo $users[$case->openedBy];?></td>
|
||||
<td><?php echo $users[$case->lastRunner];?></td>
|
||||
@@ -63,18 +67,18 @@
|
||||
<td class='<?php if(isset($run)) echo $run->status;?>'><?php echo $lang->testcase->statusList[$case->status];?></td>
|
||||
<td class='text-right'>
|
||||
<?php
|
||||
common::printIcon('testtask', 'runCase', "runID=0&caseID=$case->id&version=$case->version", '', 'list', 'play', '', 'iframe');
|
||||
common::printIcon('testtask', 'results', "runID=0&caseID=$case->id", '', 'list', 'list-alt', '', 'iframe');
|
||||
common::printIcon('testcase', 'edit', "caseID=$case->id", $case, 'list', 'pencil');
|
||||
common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$case->id", $case, 'list', 'copy');
|
||||
common::printIcon('testtask', 'runCase', "runID=$runID&caseID=$caseID&version=$case->version", '', 'list', 'play', '', 'iframe', '', "data-width='95%'");
|
||||
common::printIcon('testtask', 'results', "runID=$runID&caseID=$caseID", '', 'list', 'list-alt', '', 'iframe', '', "data-width='95%'");
|
||||
common::printIcon('testcase', 'edit', "caseID=$caseID", $case, 'list', 'pencil');
|
||||
common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from=testcase¶m=$caseID", $case, 'list', 'copy');
|
||||
|
||||
if(common::hasPriv('testcase', 'delete'))
|
||||
{
|
||||
$deleteURL = $this->createLink('testcase', 'delete', "caseID=$case->id&confirm=yes");
|
||||
$deleteURL = $this->createLink('testcase', 'delete', "caseID=$caseID&confirm=yes");
|
||||
echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"caseList\",confirmDelete)", '<i class="icon-remove"></i>', '', "class='btn-icon' title='{$lang->testcase->delete}'");
|
||||
}
|
||||
|
||||
common::printIcon('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$case->id,version=$case->version,runID=", $case, 'list', 'bug');
|
||||
common::printIcon('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$caseID,version=$case->version,runID=$runID", $case, 'list', 'bug');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -92,7 +96,7 @@
|
||||
$actionLink = $this->createLink('testcase', 'batchEdit');
|
||||
echo html::submitButton("<i class='icon-pencil'></i> " . $lang->edit, "onclick=setFormAction('$actionLink')");
|
||||
}
|
||||
if($canBatchRun)
|
||||
if($canBatchRun and $type != 'assigntome')
|
||||
{
|
||||
$actionLink = $this->createLink('testtask', 'batchRun', "productID=0&orderBy=$orderBy&from=testcase");
|
||||
echo html::submitButton("<i class='icon-play'></i> " . $lang->testtask->runCase, "onclick=setFormAction('$actionLink')");
|
||||
|
||||
+12
-37
@@ -229,6 +229,8 @@ class product extends control
|
||||
$this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst|noclosed');
|
||||
$this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst|noclosed');
|
||||
$this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst|noclosed');
|
||||
|
||||
unset($this->lang->product->typeList['']);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -272,6 +274,7 @@ class product extends control
|
||||
$this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst', $product->QD);
|
||||
$this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst', $product->RD);
|
||||
|
||||
unset($this->lang->product->typeList['']);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -316,6 +319,8 @@ class product extends control
|
||||
$this->view->poUsers = $this->loadModel('user')->getPairs('nodeleted|pofirst');
|
||||
$this->view->qdUsers = $this->loadModel('user')->getPairs('nodeleted|qdfirst');
|
||||
$this->view->rdUsers = $this->loadModel('user')->getPairs('nodeleted|devfirst');
|
||||
|
||||
unset($this->lang->product->typeList['']);
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -558,44 +563,14 @@ class product extends control
|
||||
$this->view->module = $module;
|
||||
$this->view->method = $method;
|
||||
$this->view->extra = $extra;
|
||||
$this->view->products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('id')->in(array_keys($this->products))->orderBy('`order` desc')->fetchAll();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* The results page of search.
|
||||
*
|
||||
* @param string $keywords
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param mix $extra
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetMatchedItems($keywords, $module, $method, $extra)
|
||||
{
|
||||
$products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('deleted')->eq(0)->orderBy('`order` desc')->fetchAll();
|
||||
$toPinyin = $this->product->toPinyin($products);
|
||||
$products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('id')->in(array_keys($this->products))->orderBy('`order` desc')->fetchAll('id');
|
||||
$productPairs = array();
|
||||
foreach($products as $product) $productPairs[$product->id] = $product->name;
|
||||
$productsPinyin = common::convert2Pinyin($productPairs);
|
||||
|
||||
foreach($toPinyin as $key => $value) {
|
||||
if(!strstr($value ,$keywords) && !strstr($key,$keywords)) {
|
||||
unset($toPinyin[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach($products as $key => $product)
|
||||
{
|
||||
if(!isset($toPinyin[$product->name])) {
|
||||
unset($products[$key]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!$this->product->checkPriv($product)) unset($products[$key]);
|
||||
}
|
||||
|
||||
$this->view->link = $this->product->getProductLink($module, $method, $extra);
|
||||
$this->view->products = $products;
|
||||
$this->view->keywords = $keywords;
|
||||
foreach($products as $key => $product) $product->key = $productsPinyin[$product->name];
|
||||
$this->view->products = $products;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -654,7 +629,7 @@ class product extends control
|
||||
{
|
||||
$this->session->set('productList', $this->app->getURI(true));
|
||||
$productID = $this->product->saveState($productID, $this->products);
|
||||
if($this->app->getViewType() != 'mhtml') $this->product->setMenu($this->products, $productID);
|
||||
$this->product->setMenu($this->products, $productID);
|
||||
|
||||
/* Load pager and get tasks. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
|
||||
+16
-55
@@ -66,11 +66,13 @@ class productModel extends model
|
||||
unset($this->lang->product->menu->branch);
|
||||
return;
|
||||
}
|
||||
$isMobile = $this->app->viewType == 'mhtml';
|
||||
|
||||
setCookie("lastProduct", $productID, $this->config->cookieLife, $this->config->webRoot);
|
||||
$currentProduct = $this->getById($productID);
|
||||
$this->session->set('currentProductType', $currentProduct->type);
|
||||
$output = "<a id='currentItem' href=\"javascript:showDropMenu('product', '$productID', '$currentModule', '$currentMethod', '$extra')\">{$currentProduct->name} <span class='icon-caret-down'></span></a><div id='dropMenu'><i class='icon icon-spin icon-spinner'></i></div>";
|
||||
$output = "<a id='currentItem' href=\"javascript:showSearchMenu('product', '$productID', '$currentModule', '$currentMethod', '$extra')\">{$currentProduct->name} <span class='icon-caret-down'></span></a><div id='dropMenu'><i class='icon icon-spin icon-spinner'></i></div>";
|
||||
if($isMobile) $output = "<a id='currentItem' href=\"javascript:showSearchMenu('product', '$productID', '$currentModule', '$currentMethod', '$extra')\">{$currentProduct->name} <span class='icon-caret-down'></span></a><div id='currentItemDropMenu' class='hidden affix enter-from-bottom layer'></div>";
|
||||
if($currentProduct->type == 'normal') unset($this->lang->product->menu->branch);
|
||||
if($currentProduct->type != 'normal')
|
||||
{
|
||||
@@ -78,8 +80,15 @@ class productModel extends model
|
||||
$this->lang->product->menu->branch = str_replace('@branch@', $this->lang->product->branchName[$currentProduct->type], $this->lang->product->menu->branch);
|
||||
$branches = $this->loadModel('branch')->getPairs($productID);
|
||||
$branchName = isset($branches[$branch]) ? $branches[$branch] : $branches[0];
|
||||
$output .= '</li><li>';
|
||||
$output .= "<a id='currentBranch' href=\"javascript:showDropMenu('branch', '$productID', '$currentModule', '$currentMethod', '$extra')\">{$branchName} <span class='icon-caret-down'></span></a><div id='dropMenu'><i class='icon icon-spin icon-spinner'></i></div>";
|
||||
if(!$isMobile)
|
||||
{
|
||||
$output .= '</li><li>';
|
||||
$output .= "<a id='currentBranch' href=\"javascript:showSearchMenu('branch', '$productID', '$currentModule', '$currentMethod', '$extra')\">{$branchName} <span class='icon-caret-down'></span></a><div id='dropMenu'><i class='icon icon-spin icon-spinner'></i></div>";
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "<a id='currentBranch' href=\"javascript:showSearchMenu('branch', '$productID', '$currentModule', '$currentMethod', '$extra')\">{$branchName} <span class='icon-caret-down'></span></a><div id='currentBranchDropMenu' class='hidden affix enter-from-bottom layer'></div>";
|
||||
}
|
||||
}
|
||||
return $output;
|
||||
}
|
||||
@@ -128,7 +137,7 @@ class productModel extends model
|
||||
{
|
||||
/* Is admin? */
|
||||
$account = ',' . $this->app->user->account . ',';
|
||||
if(strpos($this->app->company->admins, $account) !== false) return true;
|
||||
if($this->app->user->admin) return true;
|
||||
|
||||
$acls = $this->app->user->rights['acls'];
|
||||
if(!empty($acls['products']) and !in_array($product->id, $acls['products'])) return false;
|
||||
@@ -343,7 +352,7 @@ class productModel extends model
|
||||
$products[$productID]->RD = $data->RDs[$productID];
|
||||
$products[$productID]->type = $data->types[$productID];
|
||||
$products[$productID]->status = $data->statuses[$productID];
|
||||
$products[$productID]->desc = $data->descs[$productID];
|
||||
$products[$productID]->desc = strip_tags($this->post->descs[$productID], $this->config->allowedTags);
|
||||
$products[$productID]->order = $data->orders[$productID];
|
||||
}
|
||||
|
||||
@@ -746,8 +755,8 @@ class productModel extends model
|
||||
->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product')
|
||||
->leftJoin(TABLE_TEAM)->alias('t3')->on('t2.project = t3.project')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t4')->on('t2.project = t4.id')
|
||||
->beginIF(strpos($this->app->company->admins, $account) !== false)->where('t1.deleted')->eq(0)->fi()
|
||||
->beginIF(strpos($this->app->company->admins, $account) === false)
|
||||
->beginIF($this->app->user->admin)->where('t1.deleted')->eq(0)->fi()
|
||||
->beginIF(!$this->app->user->admin)
|
||||
->where('t1.acl')->eq('open')
|
||||
->orWhere("(t1.acl = 'custom' AND $groupSql)")
|
||||
->orWhere('t1.PO')->eq($this->app->user->account)
|
||||
@@ -900,52 +909,4 @@ class productModel extends model
|
||||
->limit(1)
|
||||
->fetch();
|
||||
}
|
||||
|
||||
public function toPinyin($products)
|
||||
{
|
||||
global $app;
|
||||
static $pinyin;
|
||||
static $dataKeys;
|
||||
if(empty($pinyin)) $pinyin = $app->loadClass('pinyin');
|
||||
|
||||
$joinOptions = '';
|
||||
$sign = ' aNd ';
|
||||
foreach($products as $value)
|
||||
{
|
||||
if(!isset($dataKeys[$value->name])) $joinOptions .= str_replace($sign, ' and ', $value->name) . $sign;
|
||||
}
|
||||
|
||||
if($joinOptions)
|
||||
{
|
||||
$valuesPinyin = $pinyin->romanize($joinOptions);
|
||||
$signLenth = strlen($sign);
|
||||
$pinyinSign = trim($sign);
|
||||
$pySignLenth = strlen($pinyinSign);
|
||||
while($joinOptions)
|
||||
{
|
||||
$valuePinyin = '';
|
||||
$value = '';
|
||||
|
||||
$pinyinPos = strpos($valuesPinyin, $pinyinSign);
|
||||
if($pinyinPos !== false)
|
||||
{
|
||||
$valuePinyin = substr($valuesPinyin, 0, $pinyinPos);
|
||||
$valuesPinyin = substr($valuesPinyin, $pinyinPos + $pySignLenth);
|
||||
}
|
||||
|
||||
$valuePos = strpos($joinOptions, $sign);
|
||||
if($valuePos === false) break;
|
||||
$value = substr($joinOptions, 0, $valuePos);
|
||||
$joinOptions = substr($joinOptions, $valuePos + $signLenth);
|
||||
|
||||
$valuePinyin = preg_split('/[^a-z]+/iu', trim($valuePinyin));
|
||||
$valueAbbr = '';
|
||||
foreach($valuePinyin as $wordPinyin) if($wordPinyin) $valueAbbr .= $wordPinyin[0];
|
||||
|
||||
$dataKeys[$value] = empty($valuePinyin) ? '' : join($valuePinyin) . ' ' . $valueAbbr;
|
||||
}
|
||||
}
|
||||
|
||||
return $dataKeys;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
{
|
||||
if($product->status == 'normal' and $product->PO == $this->app->user->account)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "class='mine text-important'"). "</li>";
|
||||
echo "<li data-id='{$product->id}' data-tag=':{$product->status} @{$product->PO} @mine' data-key='{$product->key}'>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "class='mine text-important'"). "</li>";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
{
|
||||
if($product->status == 'normal' and !($product->PO == $this->app->user->account))
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "$class"). "</li>";
|
||||
echo "<li data-id='{$product->id}' data-tag=':{$product->status} @{$product->PO}' data-key='{$product->key}'>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "$class"). "</li>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -45,13 +45,12 @@
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id='moreMenu'>
|
||||
<ul>
|
||||
<?php
|
||||
foreach($products as $product)
|
||||
{
|
||||
if($product->status == 'closed') echo "<li>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "class='closed'"). "</li>";
|
||||
if($product->status == 'closed') echo "<li data-id='{$product->id}' data-tag=':{$product->status} @{$product->PO}' data-key='{$product->key}'>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "class='closed'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<div class='search-list'>
|
||||
<ul>
|
||||
<?php if(!$products) echo "<li class='no-result-tip'>" . sprintf($lang->product->noMatched, $keywords) . '</li>';?>
|
||||
<?php
|
||||
foreach($products as $product)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $product->id), "<i class='icon-cube'></i> " . $product->name, '', "class='$product->status'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -41,7 +41,6 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach($actions as $action):?>
|
||||
<?php $module = $action->objectType == 'case' ? 'testcase' : $action->objectType;?>
|
||||
<tr class='text-center'>
|
||||
<td><?php echo $action->date;?></td>
|
||||
<td><?php isset($users[$action->actor]) ? print($users[$action->actor]) : print($action->actor);?></td>
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* The html template file of index method of index module of ZenTaoPMS.
|
||||
*
|
||||
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
|
||||
* @license ZPL (http://zpl.pub/page/zplv12.html)
|
||||
* @author Yangyang Shi <shiyangyang@cnezsoft.com>
|
||||
* @package ZenTaoPMS
|
||||
* @version $Id$
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<ul data-role='listview'>
|
||||
<?php foreach($productStats as $product):?>
|
||||
<li>
|
||||
<table class='table table-fixed'>
|
||||
<tr>
|
||||
<td><h3><?php echo $product->name?></h3></td>
|
||||
<td width='120'>
|
||||
<?php echo html::a($this->createLink('product', 'browse', "productID=$product->id"), $lang->story->common, '', "data-role='button' data-mini='true' data-inline='true'")?>
|
||||
<?php echo html::a($this->createLink('bug', 'browse', "productID=$product->id"), $lang->bug->common, '', "data-role='button' data-mini='true' data-inline='true'")?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
<?php endforeach;?>
|
||||
</ul>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -1,26 +0,0 @@
|
||||
<?php include '../../common/view/m.header.html.php';?>
|
||||
</div>
|
||||
<?php foreach($stories as $story):?>
|
||||
<?php if($story->status == 'closed') continue;?>
|
||||
<div data-role="collapsible-set">
|
||||
<div data-role="collapsible" data-collapsed="<?php echo $this->session->storyID == $story->id ? 'false' : 'true'?>" class='collapsible'>
|
||||
<?php if($this->session->storyID == $story->id) echo "<script>showDetail('story', $story->id);</script>";?>
|
||||
<h1 onClick="showDetail('story', <?php echo $story->id;?>)"><?php echo $story->title;?></h1>
|
||||
|
||||
<div id='item<?php echo $story->id;?>'></div>
|
||||
<div data-role='content' class='text-center'>
|
||||
<?php
|
||||
if(!$story->deleted)
|
||||
{
|
||||
common::printIcon('story', 'review', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'close', "storyID=$story->id", $story);
|
||||
common::printIcon('story', 'delete', "storyID=$story->id", '', '', '', 'hiddenwin');
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach;?>
|
||||
<?php $pager->show('left', 'mobile')?>
|
||||
<?php include '../../common/view/m.footer.html.php';?>
|
||||
@@ -583,10 +583,9 @@ class project extends control
|
||||
$position[] = $this->lang->project->story;
|
||||
|
||||
/* Count T B C */
|
||||
$storyIdList = array();
|
||||
foreach($stories as $story) $storyIdList[$story->id] = $story->id;
|
||||
$storyTasks = $this->loadModel('task')->getStoryTaskCounts($storyIdList);
|
||||
$storyBugs = $this->loadModel('bug')->getStoryBugCounts($storyIdList);
|
||||
$storyIdList = array_keys($stories);;
|
||||
$storyTasks = $this->loadModel('task')->getStoryTaskCounts($storyIdList,$projectID);
|
||||
$storyBugs = $this->loadModel('bug')->getStoryBugCounts($storyIdList,$projectID);
|
||||
$storyCases = $this->loadModel('testcase')->getStoryCaseCounts($storyIdList);
|
||||
|
||||
/* Assign. */
|
||||
@@ -1880,44 +1879,14 @@ class project extends control
|
||||
$this->view->module = $module;
|
||||
$this->view->method = $method;
|
||||
$this->view->extra = $extra;
|
||||
$this->view->projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->in(array_keys($this->projects))->orderBy('order desc')->fetchAll();
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* The results page of search.
|
||||
*
|
||||
* @param string $keywords
|
||||
* @param string $module
|
||||
* @param string $method
|
||||
* @param mix $extra
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function ajaxGetMatchedItems($keywords, $module, $method, $extra)
|
||||
{
|
||||
$projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('deleted')->eq(0)->orderBy('order desc')->fetchAll();
|
||||
$toPinyin = $this->project->toPinyin($projects);
|
||||
$projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->in(array_keys($this->projects))->orderBy('order desc')->fetchAll();
|
||||
$projectPairs = array();
|
||||
foreach($projects as $project) $projectPairs[$project->id] = $project->name;
|
||||
$projectsPinyin = common::convert2Pinyin($projectPairs);
|
||||
foreach($projects as $key => $project) $project->key = $projectsPinyin[$project->name];
|
||||
|
||||
foreach($toPinyin as $key => $value) {
|
||||
if(!strstr($value ,$keywords) && !strstr($key,$keywords)) {
|
||||
unset($toPinyin[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach($projects as $key => $project)
|
||||
{
|
||||
if(!isset($toPinyin[$project->name])) {
|
||||
unset($projects[$key]);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!$this->project->checkPriv($project)) unset($projects[$key]);
|
||||
}
|
||||
|
||||
$this->view->link = $this->project->getProjectLink($module, $method, $extra);
|
||||
$this->view->projects = $projects;
|
||||
$this->view->keywords = $keywords;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,8 +26,7 @@ class projectModel extends model
|
||||
public function checkPriv($project)
|
||||
{
|
||||
/* If is admin, return true. */
|
||||
$account = ',' . $this->app->user->account . ',';
|
||||
if(strpos($this->app->company->admins, $account) !== false) return true;
|
||||
if($this->app->user->admin) return true;
|
||||
|
||||
$acls = $this->app->user->rights['acls'];
|
||||
if(!empty($acls['projects']) and !in_array($project->id, $acls['projects'])) return false;
|
||||
@@ -125,7 +124,7 @@ class projectModel extends model
|
||||
|
||||
setCookie("lastProject", $projectID, $this->config->cookieLife, $this->config->webRoot);
|
||||
$currentProject = $this->getById($projectID);
|
||||
$output = "<a id='currentItem' href=\"javascript:showDropMenu('project', '$projectID', '$currentModule', '$currentMethod', '$extra')\">{$currentProject->name} <span class='icon-caret-down'></span></a><div id='dropMenu'><i class='icon icon-spin icon-spinner'></i></div>";
|
||||
$output = "<a id='currentItem' href=\"javascript:showSearchMenu('project', '$projectID', '$currentModule', '$currentMethod', '$extra')\">{$currentProject->name} <span class='icon-caret-down'></span></a><div id='dropMenu'><i class='icon icon-spin icon-spinner'></i></div>";
|
||||
return $output;
|
||||
}
|
||||
|
||||
@@ -1697,11 +1696,12 @@ class projectModel extends model
|
||||
$currentTime = strtotime($current);
|
||||
if($currentTime > $endTime) break;
|
||||
if(isset($sets[$current])) $preValue = $sets[$current]->value;
|
||||
if($currentTime > time())
|
||||
if($currentTime > time() and !$todayTag)
|
||||
{
|
||||
$preValue = 0;
|
||||
$todayTag = $i + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!isset($sets[$current]) and $mode == 'noempty')
|
||||
{
|
||||
$sets[$current] = new stdclass();
|
||||
@@ -2389,52 +2389,4 @@ class projectModel extends model
|
||||
if(isset($fullTrees[0]) and empty($fullTrees[0]->children)) array_shift($fullTrees);
|
||||
return array_values($fullTrees);
|
||||
}
|
||||
|
||||
public function toPinyin($products)
|
||||
{
|
||||
global $app;
|
||||
static $pinyin;
|
||||
static $dataKeys;
|
||||
if(empty($pinyin)) $pinyin = $app->loadClass('pinyin');
|
||||
|
||||
$joinOptions = '';
|
||||
$sign = ' aNd ';
|
||||
foreach($products as $value)
|
||||
{
|
||||
if(!isset($dataKeys[$value->name])) $joinOptions .= str_replace($sign, ' and ', $value->name) . $sign;
|
||||
}
|
||||
|
||||
if($joinOptions)
|
||||
{
|
||||
$valuesPinyin = $pinyin->romanize($joinOptions);
|
||||
$signLenth = strlen($sign);
|
||||
$pinyinSign = trim($sign);
|
||||
$pySignLenth = strlen($pinyinSign);
|
||||
while($joinOptions)
|
||||
{
|
||||
$valuePinyin = '';
|
||||
$value = '';
|
||||
|
||||
$pinyinPos = strpos($valuesPinyin, $pinyinSign);
|
||||
if($pinyinPos !== false)
|
||||
{
|
||||
$valuePinyin = substr($valuesPinyin, 0, $pinyinPos);
|
||||
$valuesPinyin = substr($valuesPinyin, $pinyinPos + $pySignLenth);
|
||||
}
|
||||
|
||||
$valuePos = strpos($joinOptions, $sign);
|
||||
if($valuePos === false) break;
|
||||
$value = substr($joinOptions, 0, $valuePos);
|
||||
$joinOptions = substr($joinOptions, $valuePos + $signLenth);
|
||||
|
||||
$valuePinyin = preg_split('/[^a-z]+/iu', trim($valuePinyin));
|
||||
$valueAbbr = '';
|
||||
foreach($valuePinyin as $wordPinyin) if($wordPinyin) $valueAbbr .= $wordPinyin[0];
|
||||
|
||||
$dataKeys[$value] = empty($valuePinyin) ? '' : join($valuePinyin) . ' ' . $valueAbbr;
|
||||
}
|
||||
}
|
||||
|
||||
return $dataKeys;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
{
|
||||
if($project->status != 'done' and $project->PM == $this->app->user->account)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), "<i class='icon-folder-close-alt'></i> " . $project->name). "</li>";
|
||||
echo "<li data-id='{$project->id}' data-tag=':{$project->status} @{$project->PM} @mine' data-key='{$project->key}'>" . html::a(sprintf($link, $project->id), "<i class='icon-folder-close-alt'></i> " . $project->name). "</li>";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
{
|
||||
if($project->status != 'done' and !($project->PM == $this->app->user->account))
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), "<i class='icon-folder-close-alt'></i> " . $project->name, '', "$class"). "</li>";
|
||||
echo "<li data-id='{$project->id}' data-tag=':{$project->status} @{$project->PM}' data-key='{$project->key}'>" . html::a(sprintf($link, $project->id), "<i class='icon-folder-close-alt'></i> " . $project->name, '', "$class"). "</li>";
|
||||
}
|
||||
}
|
||||
?>
|
||||
@@ -51,7 +51,7 @@
|
||||
<?php
|
||||
foreach($projects as $project)
|
||||
{
|
||||
if($project->status == 'done') echo "<li>" . html::a(sprintf($link, $project->id), "<i class='icon-folder-close-alt'></i> " . $project->name, '', "class='done'"). "</li>";
|
||||
if($project->status == 'done') echo "<li data-id='{$project->id}' data-tag=':{$project->status} @{$project->PM}' data-key='{$project->key}'>" . html::a(sprintf($link, $project->id), "<i class='icon-folder-close-alt'></i> " . $project->name, '', "class='done'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<div class='search-list'>
|
||||
<ul>
|
||||
<?php if(!$projects) echo "<li class='no-result-tip'>" . sprintf($lang->project->noMatched, $keywords) . '</li>';?>
|
||||
<?php
|
||||
foreach($projects as $project)
|
||||
{
|
||||
echo "<li>" . html::a(sprintf($link, $project->id), "<i class='icon-cube'></i> " . $project->name, '', "class='$project->status'"). "</li>";
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
</div>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user