Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/master_lanzongjun_fixbug

This commit is contained in:
lanzongjun
2022-07-06 11:16:01 +08:00
330 changed files with 3837 additions and 1120 deletions
+1 -1
View File
@@ -145,7 +145,7 @@ zentaoxx:
sed -i "s/'..\/..\/common\/view\/footer.html.php'/\$$app->getModuleRoot() . 'common\/view\/footer.html.php'/g" zentaoxx/extension/xuan/conference/view/admin.html.php
echo "ALTER TABLE \`zt_user\` ADD \`pinyin\` varchar(255) NOT NULL DEFAULT '' AFTER \`realname\`;" >> zentaoxx/db/xuanxuan.sql
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
cp tools/en2de.php zentaoxx/tools; cd zentaoxx/tools; php en2de.php ../
cp tools/en2other.php zentaoxx/tools; cd zentaoxx/tools; php en2other.php ../
rm -rf zentaoxx/tools
#zip -rqm -9 zentaoxx.$(VERSION).zip zentaoxx/*
#rm -rf xuan.zip xuan zentaoxx
+1 -1
View File
@@ -195,7 +195,7 @@ class userEntry extends Entry
if(!common::hasPriv('my', 'work')) break;
$control = $this->loadController('my', 'task');
$control->task($this->param('type', 'assignedTo'), $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
$control->task($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
$data = $this->getData();
if($data->status == 'success')
+3
View File
@@ -270,6 +270,7 @@ define('TABLE_PROJECTCASE', '`' . $config->db->prefix . 'projectcase`');
define('TABLE_TASKESTIMATE', '`' . $config->db->prefix . 'taskestimate`');
define('TABLE_EFFORT', '`' . $config->db->prefix . 'effort`');
define('TABLE_BURN', '`' . $config->db->prefix . 'burn`');
define('TABLE_CFD', '`' . $config->db->prefix . 'cfd`');
define('TABLE_BUILD', '`' . $config->db->prefix . 'build`');
define('TABLE_ACL', '`' . $config->db->prefix . 'acl`');
@@ -377,6 +378,8 @@ $config->objectTables['apistruct'] = TABLE_APISTRUCT;
$config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme', 'visions');
$config->pipelineTypeList = array('gitlab', 'sonarqube', 'jenkins');
/* Program privs.*/
$config->programPriv = new stdclass();
$config->programPriv->scrum = array('story', 'projectstory', 'projectrelease', 'project', 'execution', 'build', 'bug', 'testcase', 'testreport', 'doc', 'repo', 'meeting', 'stakeholder', 'testtask');
+16 -3
View File
@@ -30,7 +30,7 @@ CREATE TABLE `zt_acl` (
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_action` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(30) NOT NULL DEFAULT '',
`objectID` mediumint(8) unsigned NOT NULL DEFAULT '0',
`product` text NOT NULL,
@@ -1009,7 +1009,7 @@ CREATE TABLE `zt_grouppriv` (
UNIQUE KEY `group` (`group`,`module`,`method`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_history` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`action` mediumint(8) unsigned NOT NULL DEFAULT '0',
`field` varchar(30) NOT NULL DEFAULT '',
`old` text NOT NULL,
@@ -1091,6 +1091,7 @@ CREATE TABLE `zt_im_chat` (
`editedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastActiveTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastMessage` int(11) unsigned NOT NULL DEFAULT '0',
`lastMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
`dismissDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`pinnedMessages` text NOT NULL,
PRIMARY KEY (`id`),
@@ -1107,6 +1108,8 @@ CREATE TABLE `zt_im_chat_message_index` (
`tableName` char(64) NOT NULL,
`start` int(11) unsigned NOT NULL,
`end` int(11) unsigned NOT NULL,
`startIndex` int(11) unsigned NOT NULL,
`endIndex` int(11) unsigned NOT NULL,
`startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`count` mediumint(8) unsigned NOT NULL,
@@ -1115,7 +1118,9 @@ CREATE TABLE `zt_im_chat_message_index` (
KEY `start` (`start`),
KEY `end` (`end`),
KEY `startDate` (`startDate`),
KEY `endDate` (`endDate`)
KEY `endDate` (`endDate`),
KEY `chatstartindex` (`gid`,`startIndex`),
KEY `chatendindex` (`gid`,`endIndex`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_im_chatuser` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
@@ -1130,6 +1135,7 @@ CREATE TABLE `zt_im_chatuser` (
`quit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`category` varchar(40) NOT NULL DEFAULT '',
`lastReadMessage` int(11) unsigned NOT NULL DEFAULT '0',
`lastReadMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `chatuser` (`cgid`,`user`),
KEY `cgid` (`cgid`),
@@ -1179,6 +1185,7 @@ CREATE TABLE `zt_im_message` (
`cgid` char(40) NOT NULL DEFAULT '',
`user` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`index` int(11) unsigned NOT NULL DEFAULT 0,
`type` enum('normal','broadcast','notify','bulletin') NOT NULL DEFAULT 'normal',
`content` text NOT NULL,
`contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text',
@@ -1196,6 +1203,7 @@ CREATE TABLE `zt_im_message_backup` (
`cgid` char(40) NOT NULL DEFAULT '',
`user` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`index` int(11) unsigned NOT NULL DEFAULT 0,
`type` enum('normal','broadcast','notify') NOT NULL DEFAULT 'normal',
`content` text NOT NULL,
`contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text',
@@ -2560,6 +2568,8 @@ CREATE TABLE `zt_story` (
`approvedDate` date NOT NULL,
`lastEditedBy` varchar(30) NOT NULL DEFAULT '',
`lastEditedDate` datetime NOT NULL,
`changedBy` VARCHAR(30) NOT NULL,
`changedDate` DATETIME NOT NULL,
`reviewedBy` varchar(255) NOT NULL,
`reviewedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`closedBy` varchar(30) NOT NULL DEFAULT '',
@@ -3180,6 +3190,7 @@ CREATE TABLE `zt_workflowaction` (
`show` enum('dropdownlist','direct') NOT NULL DEFAULT 'dropdownlist',
`order` smallint(5) unsigned NOT NULL,
`buildin` tinyint(1) unsigned NOT NULL,
`role` varchar(10) NOT NULL DEFAULT 'custom',
`virtual` tinyint(1) unsigned NOT NULL,
`conditions` text NOT NULL,
`verifications` text NOT NULL,
@@ -3241,6 +3252,7 @@ CREATE TABLE `zt_workflowfield` (
`isValue` enum('0','1') NOT NULL DEFAULT '0',
`readonly` enum('0','1') NOT NULL DEFAULT '0',
`buildin` tinyint(1) unsigned NOT NULL,
`role` varchar(10) NOT NULL DEFAULT 'custom',
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
@@ -3262,6 +3274,7 @@ CREATE TABLE `zt_workflowlabel` (
`orderBy` text NOT NULL,
`order` tinyint(3) NOT NULL,
`buildin` tinyint(1) unsigned NOT NULL,
`role` varchar(10) NOT NULL DEFAULT 'custom',
`createdBy` char(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` char(30) NOT NULL,
+18 -1
View File
@@ -18,4 +18,21 @@ ALTER TABLE `zt_kanban` ADD `showWIP` enum('0','1') NOT NULL DEFAULT '1' AFTER `
ALTER TABLE `zt_kanban` ADD `alignment` varchar(10) NOT NULL DEFAULT 'center' AFTER `object`;
ALTER TABLE `zt_module` ADD `from` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `type`;
ALTER TABLE `zt_workflow` ADD `approval` enum('enabled', 'disabled') NOT NULL DEFAULT 'disabled' AFTER `status`;
ALTER TABLE `zt_story` ADD `changedBy` VARCHAR(30) NOT NULL AFTER `lastEditedDate`;
ALTER TABLE `zt_story` ADD `changedDate` DATETIME NOT NULL AFTER `changedBy`;
ALTER TABLE `zt_action` CHANGE `id` `id` int(9) unsigned NOT NULL AUTO_INCREMENT FIRST;
ALTER TABLE `zt_history` CHANGE `id` `id` int(9) unsigned NOT NULL AUTO_INCREMENT FIRST;
ALTER TABLE `zt_workflow` ADD `approval` enum('enabled', 'disabled') NOT NULL DEFAULT 'disabled' AFTER `status`;
ALTER TABLE `zt_workflowaction` ADD `role` varchar(10) NOT NULL DEFAULT 'custom' AFTER `buildin`;
ALTER TABLE `zt_workflowfield` ADD `role` varchar(10) NOT NULL DEFAULT 'custom' AFTER `buildin`;
ALTER TABLE `zt_workflowlabel` ADD `role` varchar(10) NOT NULL DEFAULT 'custom' AFTER `buildin`;
UPDATE `zt_workflowaction` SET `role` = 'buildin' WHERE `role` = 'custom' AND `buildin` = '1';
UPDATE `zt_workflowaction` SET `role` = 'virtual' WHERE `role` = 'custom' AND `virtual` = '1';
UPDATE `zt_workflowaction` SET `role` = 'default' WHERE `role` = 'custom' AND `action` IN ('browse', 'create', 'batchcreate', 'edit', 'view', 'delete', 'link', 'unlink', 'export', 'exporttemplate', 'import', 'showimport', 'report', 'assign', 'batchedit', 'batchassign');
UPDATE `zt_workflowfield` SET `role` = 'buildin' WHERE `role` = 'custom' AND (`buildin` = '1' OR `field` = 'subStatus');
UPDATE `zt_workflowfield` SET `role` = 'default' WHERE `role` = 'custom' AND `field` IN ('id', 'parent', 'assignedTo', 'status', 'createdBy', 'createdDate', 'editedBy', 'editedDate', 'assignedBy', 'assignedDate' 'mailto', 'deleted');
UPDATE `zt_workflowlabel` SET `role` = 'buildin' WHERE `role` = 'custom' AND `buildin` = '1';
+11
View File
@@ -0,0 +1,11 @@
CREATE TABLE `zt_cfd` (
`id` int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`execution` int(8) NOT NULL,
`type` char(30) NOT NULL,
`name` char(30) NOT NULL,
`count` smallint NOT NULL,
`date` date NOT NULL,
UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computecfd', '更新累积流图', 'zentao', 1, 'normal', '0000-00-00 00:00:00');
+29 -10
View File
@@ -10,7 +10,7 @@ CREATE TABLE IF NOT EXISTS `zt_acl` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_action`;
CREATE TABLE IF NOT EXISTS `zt_action` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`id` int(9) unsigned NOT NULL auto_increment,
`objectType` varchar(30) NOT NULL default '',
`objectID` mediumint(8) unsigned NOT NULL default '0',
`product` text NOT NULL,
@@ -411,6 +411,16 @@ CREATE TABLE IF NOT EXISTS `zt_casestep` (
KEY `case` (`case`),
KEY `version` (`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_cfd`;
CREATE TABLE `zt_cfd` (
`id` int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`execution` int(8) NOT NULL,
`type` char(30) NOT NULL,
`name` char(30) NOT NULL,
`count` smallint NOT NULL,
`date` date NOT NULL,
UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_company`;
CREATE TABLE IF NOT EXISTS `zt_company` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
@@ -705,7 +715,7 @@ CREATE TABLE IF NOT EXISTS `zt_holiday` (
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_history`;
CREATE TABLE IF NOT EXISTS `zt_history` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`id` int(9) unsigned NOT NULL auto_increment,
`action` mediumint(8) unsigned NOT NULL default '0',
`field` varchar(30) NOT NULL default '',
`old` text NOT NULL,
@@ -1397,6 +1407,8 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
`assignedDate` datetime NOT NULL,
`lastEditedBy` varchar(30) NOT NULL default '',
`lastEditedDate` datetime NOT NULL,
`changedBy` VARCHAR(30) NOT NULL,
`changedDate` DATETIME NOT NULL,
`reviewedBy` varchar(255) NOT NULL,
`reviewedDate` datetime NOT NULL default '0000-00-00 00:00:00',
`closedBy` varchar(30) NOT NULL default '',
@@ -1830,7 +1842,8 @@ CREATE TABLE IF NOT EXISTS `zt_webhook` (
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES
('*', '*', '*', '*', '*', '', '监控定时任务', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computeburn', '更新燃尽图', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computeburn', '更新燃尽图', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
('30', '23', '*', '*', '*', 'moduleName=execution&methodName=computecfd', '更新累积流图', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
('0', '8', '*', '*', '*', 'moduleName=report&methodName=remind', '每日任务提醒', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
('*/5', '*', '*', '*', '*', 'moduleName=svn&methodName=run', '同步SVN', 'zentao', 1, 'stop', '0000-00-00 00:00:00'),
('*/5', '*', '*', '*', '*', 'moduleName=git&methodName=run', '同步GIT', 'zentao', 1, 'stop', '0000-00-00 00:00:00'),
@@ -6140,6 +6153,7 @@ CREATE TABLE IF NOT EXISTS `zt_im_chat` (
`mergedDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastActiveTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastMessage` int(11) unsigned NOT NULL DEFAULT 0,
`lastMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
`dismissDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`pinnedMessages` text NOT NULL DEFAULT '',
`mergedChats` text NOT NULL DEFAULT '',
@@ -6166,6 +6180,7 @@ CREATE TABLE IF NOT EXISTS `zt_im_chatuser` (
`quit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`category` varchar(40) NOT NULL DEFAULT '',
`lastReadMessage` int(11) unsigned NOT NULL DEFAULT 0,
`lastReadMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `cgid` (`cgid`),
KEY `user` (`user`),
@@ -6198,6 +6213,7 @@ CREATE TABLE IF NOT EXISTS `zt_im_message` (
`cgid` char(40) NOT NULL DEFAULT '',
`user` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`index` int(11) unsigned NOT NULL DEFAULT 0,
`type` enum('normal', 'broadcast', 'notify', 'bulletin') NOT NULL DEFAULT 'normal',
`content` text NOT NULL DEFAULT '',
`contentType` enum('text', 'plain', 'emotion', 'image', 'file', 'object', 'code') NOT NULL DEFAULT 'text',
@@ -6217,6 +6233,7 @@ CREATE TABLE IF NOT EXISTS `zt_im_message_backup` (
`cgid` char(40) NOT NULL DEFAULT '',
`user` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`index` int(11) unsigned NOT NULL DEFAULT 0,
`type` enum('normal', 'broadcast', 'notify') NOT NULL DEFAULT 'normal',
`content` text NOT NULL DEFAULT '',
`contentType` enum('text', 'plain', 'emotion', 'image', 'file', 'object', 'code') NOT NULL DEFAULT 'text',
@@ -6248,6 +6265,8 @@ CREATE TABLE IF NOT EXISTS `zt_im_chat_message_index` (
`tableName` char(64) NOT NULL,
`start` int(11) unsigned NOT NULL,
`end` int(11) unsigned NOT NULL,
`startIndex` int(11) unsigned NOT NULL,
`endIndex` int(11) unsigned NOT NULL,
`startDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`endDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`count` mediumint(8) unsigned NOT NULL,
@@ -6256,7 +6275,9 @@ CREATE TABLE IF NOT EXISTS `zt_im_chat_message_index` (
KEY `start` (`start`),
KEY `end` (`end`),
KEY `startDate` (`startDate`),
KEY `endDate` (`endDate`)
KEY `endDate` (`endDate`),
KEY `chatstartindex` (`gid`,`startIndex`),
KEY `chatendindex` (`gid`,`endIndex`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_im_messagestatus`;
@@ -8524,6 +8545,7 @@ CREATE TABLE IF NOT EXISTS `zt_workflowaction` (
`show` enum('dropdownlist', 'direct') NOT NULL DEFAULT 'dropdownlist',
`order` smallint(5) unsigned NOT NULL,
`buildin` tinyint(1) unsigned NOT NULL,
`role` varchar(10) NOT NULL DEFAULT 'custom',
`virtual` tinyint(1) unsigned NOT NULL,
`conditions` text NOT NULL,
`verifications` text NOT NULL,
@@ -8587,6 +8609,7 @@ CREATE TABLE IF NOT EXISTS `zt_workflowfield` (
`isValue` enum('0', '1') NOT NULL DEFAULT '0',
`readonly` enum('0', '1') NOT NULL DEFAULT '0',
`buildin` tinyint(1) unsigned NOT NULL,
`role` varchar(10) NOT NULL DEFAULT 'custom',
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
@@ -8631,6 +8654,7 @@ CREATE TABLE IF NOT EXISTS `zt_workflowlabel` (
`orderBy` text NOT NULL,
`order` tinyint(3) NOT NULL,
`buildin` tinyint(1) unsigned NOT NULL,
`role` varchar(10) NOT NULL DEFAULT 'custom',
`createdBy` char(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` char(30) NOT NULL,
@@ -13480,12 +13504,7 @@ REPLACE INTO `zt_zoutput` (`id`, `activity`, `name`, `content`, `optional`, `tai
(246, 163, '《配置审计报告》', '', 'yes', '', '', 'admin', '2020-01-09 14:55:08', '', '0000-00-00 00:00:00', 605, '0'),
(247, 166, '《度量分析计划》', '', 'yes', '', '', 'admin', '2020-01-09 14:55:08', '', '0000-00-00 00:00:00', 610, '0'),
(248, 168, '项目度量数据库', '', 'yes', '', '', 'admin', '2020-01-09 14:55:08', '', '0000-00-00 00:00:00', 615, '0'),
(249, 172, '《量化项目管理及跟踪计划》', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 620, '0'),
(250, 170, '《决策分析报告》的决策分析评估表', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 625, '0'),
(251, 169, '《量化项目计划及跟踪表》', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 630, '0'),
(252, 173, '《决策分析报告》的评分表', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 635, '0'),
(253, 174, '《决策分析报告》的评分表', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 640, '0'),
(254, 175, '《决策分析报告》', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 645, '0');
(249, 169, '《量化项目计划及跟踪表》', '', 'no', '', '', 'admin', '2020-01-09 14:59:04', '', '0000-00-00 00:00:00', 630, '0');
REPLACE INTO `zt_basicmeas` VALUES
(2,'scale','project','userRequest','项目用户需求初始规模','pgmURInitScale','故事点或功能点','CREATE FUNCTION qc_pgmurinitscale($project int) returns float (10,2)\r\nbegin\r\n declare scale float(10,2) default 0__DELIMITER__\r\n declare inited int default 0__DELIMITER__\r\n select qc_cminited($project, \'URS\') into inited__DELIMITER__\r\n IF inited = 1 THEN\r\n select qc_initscale($project, \'URS\',\'requestEst\') into scale__DELIMITER__\r\n return scale__DELIMITER__\r\n ELSE \r\n return 0__DELIMITER__\r\n END IF__DELIMITER__\r\nend','{\"$project\":{\"showName\":\"\\u6240\\u5c5e\\u9879\\u76ee\",\"varName\":\"$project\",\"varType\":\"select\",\"options\":\"project\",\"defaultValue\":\"\"}}','项目每个产品的第一个用户需求规格说明书基线版本的规模之和','从基线表中查询该项目下面每个产品的第一个用户需求规模说明书版本,然后查询对应的需求,求和。','crontab','{\"week\":\"1,2,3,4,5,6,0\",\"type\":\"week\"}','00:00','','system','0000-00-00 00:00:00','admin','2020-07-07 14:19:41',10,'0'),
+2 -9
View File
@@ -59,9 +59,9 @@ $lang->action->dynamicAction->task['linkchildtask'] = 'Link child Task';
$lang->action->label->createchildrenstory = "Create child story";
$lang->action->label->linkchildstory = "Link child story";
$lang->action->label->unlinkchildrenstory = "CanceledLink child story";
$lang->action->label->unlinkchildrenstory = "unlinked a child story";
$lang->action->label->linkparentstory = "Link parent story";
$lang->action->label->unlinkparentstory = "From parent storyCanceledLink";
$lang->action->label->unlinkparentstory = "CanceledLink from parent story ";
$lang->action->label->deletechildrenstory = "Deleted child story";
$lang->action->search->label = array();
@@ -101,13 +101,6 @@ $lang->action->search->label['verified'] = $lang->action->label->ve
$lang->action->search->label['login'] = $lang->action->label->login;
$lang->action->search->label['logout'] = $lang->action->label->logout;
$lang->action->label->createchildrenstory = "Create child story";
$lang->action->label->linkchildstory = "Link child story";
$lang->action->label->unlinkchildrenstory = "unlinked a child story";
$lang->action->label->linkparentstory = "Link parent story";
$lang->action->label->unlinkparentstory = "CanceledLink from parent story ";
$lang->action->label->deletechildrenstory = "Deleted child story";
$lang->action->desc->createchildrenstory = '$date, <strong>$actor</strong> Create child story <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildstory = '$date, <strong>$actor</strong> Link child story <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrenstory = '$date, <strong>$actor</strong> Unlink child story <strong>$extra</strong>。' . "\n";
+2 -9
View File
@@ -59,9 +59,9 @@ $lang->action->dynamicAction->task['linkchildtask'] = 'Link child Task';
$lang->action->label->createchildrenstory = "Create child story";
$lang->action->label->linkchildstory = "Link child story";
$lang->action->label->unlinkchildrenstory = "CanceledLink child story";
$lang->action->label->unlinkchildrenstory = "unlinked a child story";
$lang->action->label->linkparentstory = "Link parent story";
$lang->action->label->unlinkparentstory = "From parent storyCanceledLink";
$lang->action->label->unlinkparentstory = "CanceledLink from parent story ";
$lang->action->label->deletechildrenstory = "Deleted child story";
$lang->action->search->label = array();
@@ -101,13 +101,6 @@ $lang->action->search->label['verified'] = $lang->action->label->ve
$lang->action->search->label['login'] = $lang->action->label->login;
$lang->action->search->label['logout'] = $lang->action->label->logout;
$lang->action->label->createchildrenstory = "Create child story";
$lang->action->label->linkchildstory = "Link child story";
$lang->action->label->unlinkchildrenstory = "unlinked a child story";
$lang->action->label->linkparentstory = "Link parent story";
$lang->action->label->unlinkparentstory = "CanceledLink from parent story ";
$lang->action->label->deletechildrenstory = "Deleted child story";
$lang->action->desc->createchildrenstory = '$date, <strong>$actor</strong> Create child story <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildstory = '$date, <strong>$actor</strong> Link child story <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrenstory = '$date, <strong>$actor</strong> Unlink child story <strong>$extra</strong>。' . "\n";
+2 -9
View File
@@ -59,9 +59,9 @@ $lang->action->dynamicAction->task['linkchildtask'] = 'Link child Task';
$lang->action->label->createchildrenstory = "Create child story";
$lang->action->label->linkchildstory = "Link child story";
$lang->action->label->unlinkchildrenstory = "CanceledLink child story";
$lang->action->label->unlinkchildrenstory = "unlinked a child story";
$lang->action->label->linkparentstory = "Link parent story";
$lang->action->label->unlinkparentstory = "From parent storyCanceledLink";
$lang->action->label->unlinkparentstory = "CanceledLink from parent story ";
$lang->action->label->deletechildrenstory = "Deleted child story";
$lang->action->search->label = array();
@@ -101,13 +101,6 @@ $lang->action->search->label['verified'] = $lang->action->label->ve
$lang->action->search->label['login'] = $lang->action->label->login;
$lang->action->search->label['logout'] = $lang->action->label->logout;
$lang->action->label->createchildrenstory = "Create child story";
$lang->action->label->linkchildstory = "Link child story";
$lang->action->label->unlinkchildrenstory = "unlinked a child story";
$lang->action->label->linkparentstory = "Link parent story";
$lang->action->label->unlinkparentstory = "CanceledLink from parent story ";
$lang->action->label->deletechildrenstory = "Deleted child story";
$lang->action->desc->createchildrenstory = '$date, <strong>$actor</strong> Create child story <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildstory = '$date, <strong>$actor</strong> Link child story <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrenstory = '$date, <strong>$actor</strong> Unlink child story <strong>$extra</strong>。' . "\n";
@@ -101,13 +101,6 @@ $lang->action->search->label['verified'] = $lang->action->label->ve
$lang->action->search->label['login'] = $lang->action->label->login;
$lang->action->search->label['logout'] = $lang->action->label->logout;
$lang->action->label->createchildrenstory = "创建子目标";
$lang->action->label->linkchildstory = "关联子目标";
$lang->action->label->unlinkchildrenstory = "取消关联子目标";
$lang->action->label->linkparentstory = "关联到父目标";
$lang->action->label->unlinkparentstory = "从父目标取消关联";
$lang->action->label->deletechildrenstory = "删除子目标";
$lang->action->desc->createchildrenstory = '$date, 由 <strong>$actor</strong> 创建子目标 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildstory = '$date, 由 <strong>$actor</strong> 关联子目标 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrenstory = '$date, 由 <strong>$actor</strong> 移除子目标 <strong>$extra</strong>。' . "\n";
@@ -1,3 +0,0 @@
<?php
include $app->getExtensionRoot() . '/biz/attend/ext/view/stat.oa.html.hook.php';
?>
@@ -1,3 +1,3 @@
<script>
$('#assigntomeBlock>ul>li>a:not([href$="todo"]):not([href$="task"])').parent().remove();
$('#assigntomeBlock>ul>li>a:not([href$="todo"]):not([href$="task"]:not[href$="feedback"])').parent().remove();
</script>
@@ -13,6 +13,14 @@ $lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
@@ -13,6 +13,14 @@ $lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
@@ -13,6 +13,14 @@ $lang->custom->object['todo'] = 'Todo';
$lang->custom->object['user'] = 'User';
$lang->custom->object['block'] = 'Block';
$lang->custom->menuOrder = array();
$lang->custom->menuOrder[10] = 'execution';
$lang->custom->menuOrder[15] = 'story';
$lang->custom->menuOrder[20] = 'task';
$lang->custom->menuOrder[25] = 'todo';
$lang->custom->menuOrder[30] = 'user';
$lang->custom->menuOrder[35] = 'block';
$lang->custom->task = new stdClass();
$lang->custom->task->fields['priList'] = 'Priority';
$lang->custom->task->fields['typeList'] = 'Type';
@@ -30,6 +30,7 @@
<?php js::set('projectCommon', $lang->project->common);?>
<?php js::set('multiBranchProducts', $multiBranchProducts);?>
<?php js::set('systemMode', $config->systemMode);?>
<?php js::set('projectID', $projectID);?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
@@ -1,3 +1,8 @@
<script>
$("#createCaseActionMenu a[href=#toBug]").remove();
$("#createCaseActionMenu").parent('.btn-group').remove();
$("#actionbox .histories-list li").each(function()
{
var text = $(this).find('a').text();
$(this).find('a').parent().text(text);
});
</script>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/flow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/flow/ext/view/' . basename(__FILE__);?>
+2 -2
View File
@@ -551,8 +551,8 @@ $lang->resource->task->recordEstimate = 'recordEstimateAction';
$lang->resource->task->editEstimate = 'editEstimate';
$lang->resource->task->deleteEstimate = 'deleteEstimate';
$lang->resource->task->report = 'reportChart';
$lang->resource->task->exportTemplet = 'exportTemplet';
$lang->resource->task->import = 'import';
if($config->edition != 'open') $lang->resource->task->exportTemplet = 'exportTemplet';
if($config->edition != 'open') $lang->resource->task->import = 'import';
$lang->task->methodOrder[5] = 'create';
$lang->task->methodOrder[10] = 'batchCreate';
@@ -30,7 +30,7 @@
<div class="table-empty-tip">
<p>
<span class="text-muted"><?php echo $lang->execution->noExecution;?></span>
<?php if(common::hasPriv('execution', 'create')):?>
<?php if(common::hasPriv('execution', 'create') and $status == "all"):?>
<?php echo html::a($this->createLink('execution', 'create', "projectID=$projectID"), "<i class='icon icon-plus'></i> " . $lang->project->createKanban, '', "class='btn btn-info' data-app='project'");?>
<?php endif;?>
</p>
@@ -184,7 +184,7 @@
<div class='input-group'>
<?php echo html::select("story[%s]", $stories, $currentStory, "class='form-control chosen' onchange='setStoryRelated(\"%s\")'");?>
<span class='input-group-btn'>
<a id="preview%s" href='#' class='btn iframe btn-link btn-icon btn-copy' disabled='disabled' title='<?php echo $lang->preview; ?>'><i class='icon-search'></i></a>
<a id="preview%s" href='#' class='btn iframe btn-link btn-icon btn-copy' disabled='disabled' title='<?php echo $lang->preview; ?>'><i class='icon-eye'></i></a>
<a href='javascript:copyStoryTitle("%s")' class='btn btn-link btn-icon btn-copy' title='<?php echo $lang->task->copyStoryTitle; ?>'><i class='icon-arrow-right'></i></a>
</span>
</div>
@@ -20,6 +20,7 @@
.hide-sidebar #sidebar > .cell {display: none;}
.hide-sidebar #sidebar > .sidebar-toggle > .icon:before {content: "\e314";}
#date {float: left; margin-right: 10px; margin-left: 0px;}
.cell .nav>li>a:focus {background-color: unset;}
</style>
<?php js::set('moreLang', $this->lang->side->more);?>
<?php js::set('moduleList', $config->todo->moduleList);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1,4 +1,3 @@
<script>
$('#submit').after('<input type="hidden" name="vision" id="vision" value="<?php echo $this->config->vision;?>">');
$('#ajaxForm #submit').after('<input type="hidden" name="vision" id="vision" value="<?php echo $this->config->vision;?>">');
</script>
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1,3 +1,3 @@
<script>
$('#submit').after('<input type="hidden" name="vision" id="vision" value="<?php echo $this->config->vision;?>">');
$('#createForm #submit').after('<input type="hidden" name="vision" id="vision" value="<?php echo $this->config->vision;?>">');
</script>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflow/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowaction/ext/view/' . basename(__FILE__);?>
@@ -1,4 +1,3 @@
<script>
$('#submit').after('<input type="hidden" name="vision" id="vision" value="lite">');
</script>
<?php include $this->app->getExtensionRoot() . 'biz/workflowaction/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowaction/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowaction/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowfield/ext/view/' . basename(__FILE__);?>
@@ -1,4 +1,3 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowfield/ext/view/' . basename(__FILE__);?>
<?php if($config->visions == ',lite,'):?>
<?php $feedbackDatasources = $this->dao->select('id')->from(TABLE_WORKFLOWDATASOURCE)->where('code')->like('litefeedback%')->andWhere('vision')->eq('lite')->fetchPairs('id', 'id');?>
<?php if($feedbackDatasources):?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowhook/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowhook/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowlabel/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowlayout/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowrelation/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowrule/ext/view/' . basename(__FILE__);?>
@@ -1,4 +1,4 @@
<script>
$("#name").parent().addClass('required');
$("#rule").parent().addClass('required');
</script>
</script>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowrule/ext/view/' . basename(__FILE__);?>
+11
View File
@@ -2831,6 +2831,17 @@ class baseRouter
fwrite($fh, "\n");
fclose($fh);
}
/**
* Check app if it is run in a container.
*
* @access public
* @return bool
*/
public function isContainer()
{
return strtolower(getenv('IS_CONTAINER')) == 'true';
}
}
/**
-2
View File
@@ -501,8 +501,6 @@ class baseHTML
$gobackList = isset($_COOKIE['goback']) ? json_decode($_COOKIE['goback'], true) : array();
$gobackLink = isset($gobackList[$tab]) ? $gobackList[$tab] : '';
if(strpos($misc, 'data-app') === false) $misc .= " data-app='" . $tab . "'";
/* If the link of the referer is not the link of the current page or the link of the index, the cookie and gobackLink will be updated. */
if(!preg_match("/(m=|\/)(index|search|$currentModule)(&f=|-)(index|buildquery|$currentMethod)(&|-|\.)?/", strtolower($refererLink)))
{
+7 -1
View File
@@ -107,6 +107,12 @@ class GitRepo
$cmd = escapeCmd("$this->client tag --sort=taggerdate");
$list = execCmd($cmd . ' 2>&1', 'array', $result);
if($result) return array();
foreach($list as $key => $tag)
{
if(!$tag) unset($list[$key]);
}
return $list;
}
@@ -139,7 +145,7 @@ class GitRepo
}
asort($branches);
$branches = array($defaultBranch => $defaultBranch) + $branches;
if($defaultBranch) $branches = array($defaultBranch => $defaultBranch) + $branches;
return $branches;
}
+3 -3
View File
@@ -985,9 +985,9 @@ class actionModel extends model
}
$condition = "((product =',0,' or product=0) AND project = '0' AND execution = 0)";
if(isset($productCondition)) $condition .= ' OR ' . $productCondition;
if(isset($projectCondition)) $condition .= ' OR ' . $projectCondition;
if(isset($executionCondition)) $condition .= ' OR ' . $executionCondition;
if(!empty($productCondition)) $condition .= ' OR ' . $productCondition;
if(!empty($projectCondition)) $condition .= ' OR ' . $projectCondition;
if(!empty($executionCondition)) $condition .= ' OR ' . $executionCondition;
}
$actionCondition = $this->getActionCondition();
+3 -2
View File
@@ -251,9 +251,10 @@ class api extends control
$id = $this->api->createStruct($data);
if(dao::isError()) return $this->sendError(dao::getError());
$this->action->create('apistruct', $id, 'Created');
if(dao::isError()) return $this->sendError(dao::getError());
return $this->sendSuccess(array('locate' => helper::createLink('api', 'struct', "libID=$libID")));
}
@@ -455,7 +456,7 @@ class api extends control
$this->getTypeOptions($api->lib);
$this->view->title = $api->title . $this->lang->api->edit;
$this->view->gobackLink = $this->createLink('api', 'index', "libID={$api->lib}&moduleID={$api->module}");
$this->view->gobackLink = $this->createLink('api', 'index', "libID={$api->lib}&moduleID={$api->module}&apiID=$apiID");
$this->view->user = $this->app->user->account;
$this->view->allUsers = $this->loadModel('user')->getPairs('devfirst|noclosed');;
$this->view->moduleOptionMenu = $this->loadModel('tree')->getOptionMenu($api->lib, 'api', $startModuleID = 0);
+1 -1
View File
@@ -910,7 +910,7 @@ class apiModel extends model
$this->config->api->search['module'] = 'api';
$this->config->api->search['queryID'] = $queryID;
$this->config->api->search['actionURL'] = $actionURL;
$this->config->api->search['params']['lib']['values'] = array($lib->id => $lib->name) + array('all' => $this->lang->api->allLibs);
$this->config->api->search['params']['lib']['values'] = (!empty($lib)) ? array($lib->id => $lib->name) + array('all' => $this->lang->api->allLibs) : array('all' => $this->lang->api->allLibs);
$this->loadModel('search')->setSearchParams($this->config->api->search);
}
+2 -1
View File
@@ -33,7 +33,8 @@
<tr>
<th><?php echo $lang->api->control;?></th>
<td>
<span><?php echo html::radio('acl', $lang->api->aclList, 'open', "onchange='toggleAcl(this.value, \"lib\")'")?></span>
<?php $isDisabled = $type == 'demo' ? 'disabled' : '';?>
<span><?php echo html::radio('acl', $lang->api->aclList, 'open', "onchange='toggleAcl(this.value, \"lib\")' $isDisabled")?></span>
<span class='text-info' id='noticeAcl'><?php echo $lang->api->noticeAcl['open'];?></span>
</td>
</tr>
+28 -10
View File
@@ -1079,10 +1079,10 @@ class block extends control
/* Get tasks. Fix bug #2918.*/
$yesterday = date('Y-m-d', strtotime('-1 day'));
$taskGroups = $this->dao->select("id,parent,project,status,finishedDate,estimate,consumed,`left`")->from(TABLE_TASK)
->where('project')->in($executionIdList)
$taskGroups = $this->dao->select("id,parent,execution,status,finishedDate,estimate,consumed,`left`")->from(TABLE_TASK)
->where('execution')->in($executionIdList)
->andWhere('deleted')->eq(0)
->fetchGroup('project', 'id');
->fetchGroup('execution', 'id');
$tasks = array();
foreach($taskGroups as $executionID => $taskGroup)
@@ -1095,7 +1095,7 @@ class block extends control
foreach($taskGroup as $taskID => $task)
{
if(strpos('wait|doing|pause', $task->status) !== false) $undoneTasks ++;
if(strpos('wait|doing|pause|cancel', $task->status) !== false) $undoneTasks ++;
if(strpos($task->finishedDate, $yesterday) !== false) $yesterdayFinished ++;
if($task->parent == '-1') continue;
@@ -1131,11 +1131,11 @@ class block extends control
}
/* Get bugs. */
$bugs = $this->dao->select("project, count(status) as totalBugs, count(status = 'active' or null) as activeBugs, count(resolvedDate like '{$yesterday}%' or null) as yesterdayResolved")->from(TABLE_BUG)
->where('project')->in($executionIdList)
$bugs = $this->dao->select("execution, count(status) as totalBugs, count(status = 'active' or null) as activeBugs, count(resolvedDate like '{$yesterday}%' or null) as yesterdayResolved")->from(TABLE_BUG)
->where('execution')->in($executionIdList)
->andWhere('deleted')->eq(0)
->groupBy('project')
->fetchAll('project');
->groupBy('execution')
->fetchAll('execution');
foreach($bugs as $executionID => $bug)
{
@@ -1717,6 +1717,7 @@ class block extends control
if(common::hasPriv('risk', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['risk'] = true;
if(common::hasPriv('issue', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['issue'] = true;
if(common::hasPriv('meeting', 'view') and $this->config->edition == 'max' and $this->config->vision != 'lite') $hasViewPriv['meeting'] = true;
if(common::hasPriv('feedback', 'view') and in_array($this->config->edition, array('max', 'biz'))) $hasViewPriv['feedback'] = true;
$params = $this->get->param;
$params = json_decode(base64_decode($params));
@@ -1725,8 +1726,14 @@ class block extends control
$objectCountList = array('todo' => 'todoCount', 'task' => 'taskCount', 'bug' => 'bugCount', 'story' => 'storyCount', 'requirement' => 'requirementCount');
if($this->config->edition == 'max')
{
$objectList += array('risk' => 'risks', 'issue' => 'issues');
$objectCountList += array('risk' => 'riskCount', 'issue' => 'issueCount');
$objectList += array('risk' => 'risks', 'issue' => 'issues', 'feedback' => 'feedbacks');
$objectCountList += array('risk' => 'riskCount', 'issue' => 'issueCount', 'feedback' => 'feedbackCount');
}
if($this->config->edition == 'biz')
{
$objectList += array('feedback' => 'feedbacks');
$objectCountList += array('feedback' => 'feedbackCount');
}
$tasks = $this->loadModel('task')->getUserSuspendedTasks($this->app->user->account);
@@ -1749,6 +1756,10 @@ class block extends control
->beginIF($objectType == 'story' or $objectType == 'requirement')->andWhere('t2.deleted')->eq('0')->fi()
->beginIF($objectType == 'todo')->andWhere('t1.cycle')->eq(0)->andWhere('t1.status')->eq('wait')->andWhere('t1.vision')->eq($this->config->vision)->fi()
->beginIF($objectType != 'todo')->andWhere('t1.status')->ne('closed')->fi()
->beginIF($objectType == 'feedback')
->andWhere('t1.status')->in('wait, noreview')
->andWhere('t1.assignedTo')->eq($this->app->user->account)
->fi()
->orderBy($orderBy)
->beginIF($limitCount)->limit($limitCount)->fi()
->fetchAll();
@@ -1787,6 +1798,13 @@ class block extends control
if($objectType == 'risk') $this->app->loadLang('risk');
if($objectType == 'issue') $this->app->loadLang('issue');
if($objectType == 'feedback')
{
$this->app->loadLang('feedback');
$this->view->users = $this->loadModel('user')->getPairs('all,noletter');
$this->view->products = $this->loadModel('product')->getPairs();
}
$count[$objectType] = count($objects);
$this->view->{$objectList[$objectType]} = $objects;
}
+9 -7
View File
@@ -357,6 +357,7 @@ $lang->block->availableBlocks->testtask = 'Testaufgaben';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->availableBlocks->meeting = 'My Meetings';
$lang->block->availableBlocks->feedback = 'My Feedbacks';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
@@ -469,13 +470,14 @@ $lang->block->orderByList->story['status_desc'] = 'Status Absteigend';
$lang->block->orderByList->story['stage_asc'] = 'Phase Aufsteigend';
$lang->block->orderByList->story['stage_desc'] = 'Phase Absteigend';
$lang->block->todoCount = 'Todos';
$lang->block->taskCount = 'Aufgaben';
$lang->block->bugCount = 'Bugs';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->todoCount = 'Todos';
$lang->block->taskCount = 'Aufgaben';
$lang->block->bugCount = 'Bugs';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->feedbackCount = 'Feedbacks';
$lang->block->typeList = new stdclass();
+9 -7
View File
@@ -357,6 +357,7 @@ $lang->block->availableBlocks->testtask = 'Requests';
$lang->block->availableBlocks->risk = 'Risks';
$lang->block->availableBlocks->issue = 'Issues';
$lang->block->availableBlocks->meeting = 'Meetings';
$lang->block->availableBlocks->feedback = 'My Feedbacks';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
@@ -469,13 +470,14 @@ $lang->block->orderByList->story['status_desc'] = 'Story Status DESC';
$lang->block->orderByList->story['stage_asc'] = 'Story Phase ASC';
$lang->block->orderByList->story['stage_desc'] = 'Story Phase DESC';
$lang->block->todoCount = 'Todo';
$lang->block->taskCount = 'Task';
$lang->block->bugCount = 'Bug';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->todoCount = 'Todo';
$lang->block->taskCount = 'Task';
$lang->block->bugCount = 'Bug';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->feedbackCount = 'Feedbacks';
$lang->block->typeList = new stdclass();
+9 -7
View File
@@ -357,6 +357,7 @@ $lang->block->availableBlocks->testtask = 'Recettes';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->availableBlocks->meeting = 'My Meetings';
$lang->block->availableBlocks->feedback = 'My Feedbacks';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
@@ -469,13 +470,14 @@ $lang->block->orderByList->story['status_desc'] = 'Tri par Statut Story DESC';
$lang->block->orderByList->story['stage_asc'] = 'Tri par Phase Story ASC';
$lang->block->orderByList->story['stage_desc'] = 'Tri par Phase Story DESC';
$lang->block->todoCount = 'Todo';
$lang->block->taskCount = 'Task';
$lang->block->bugCount = 'Bug';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->todoCount = 'Todo';
$lang->block->taskCount = 'Task';
$lang->block->bugCount = 'Bug';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->feedbackCount = 'Feedbacks';
$lang->block->typeList = new stdclass();
+9 -7
View File
@@ -319,6 +319,7 @@ $lang->block->availableBlocks->testtask = 'Yêu cầu';
$lang->block->availableBlocks->risk = 'My Risks';
$lang->block->availableBlocks->issue = 'My Issues';
$lang->block->availableBlocks->meeting = 'My Meetings';
$lang->block->availableBlocks->feedback = 'My Feedbacks';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = 'Project';
$lang->block->moduleList['product'] = $lang->productCommon;
@@ -431,13 +432,14 @@ $lang->block->orderByList->story['status_desc'] = 'Tình trạng câu chuyện g
$lang->block->orderByList->story['stage_asc'] = 'Giai đoạn câu chuyện tăng dần';
$lang->block->orderByList->story['stage_desc'] = 'Giai đoạn câu chuyện giảm dần';
$lang->block->todoCount = 'Việc làm';
$lang->block->taskCount = 'Nhiệm vụ';
$lang->block->bugCount = 'Bug';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->todoCount = 'Việc làm';
$lang->block->taskCount = 'Nhiệm vụ';
$lang->block->bugCount = 'Bug';
$lang->block->riskCount = 'Risk';
$lang->block->issueCount = 'Issues';
$lang->block->storyCount = 'Stories';
$lang->block->meetingCount = 'Meetings';
$lang->block->feedbackCount = 'Feedbacks';
$lang->block->typeList = new stdclass();
+9 -7
View File
@@ -357,6 +357,7 @@ $lang->block->availableBlocks->testtask = '测试版本列表';
$lang->block->availableBlocks->risk = '风险';
$lang->block->availableBlocks->issue = '问题';
$lang->block->availableBlocks->meeting = '会议';
$lang->block->availableBlocks->feedback = '反馈';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = '项目';
$lang->block->moduleList['product'] = $lang->productCommon;
@@ -469,13 +470,14 @@ $lang->block->orderByList->story['status_desc'] = '状态倒序';
$lang->block->orderByList->story['stage_asc'] = '阶段正序';
$lang->block->orderByList->story['stage_desc'] = '阶段倒序';
$lang->block->todoCount = '待办数';
$lang->block->taskCount = '任务数';
$lang->block->bugCount = 'Bug数';
$lang->block->riskCount = '风险数';
$lang->block->issueCount = '问题数';
$lang->block->storyCount = '需求数';
$lang->block->meetingCount = '会议数';
$lang->block->todoCount = '待办数';
$lang->block->taskCount = '任务数';
$lang->block->bugCount = 'Bug数';
$lang->block->riskCount = '风险数';
$lang->block->issueCount = '问题数';
$lang->block->storyCount = '需求数';
$lang->block->meetingCount = '会议数';
$lang->block->feedbackCount = '反馈数';
$lang->block->typeList = new stdclass();
+9 -7
View File
@@ -332,6 +332,7 @@ $lang->block->availableBlocks->testtask = '測試版本列表';
$lang->block->availableBlocks->risk = '我的風險';
$lang->block->availableBlocks->issue = '我的問題';
$lang->block->availableBlocks->meeting = '我的會議';
$lang->block->availableBlocks->feedback = '我的反饋';
if($config->systemMode == 'new') $lang->block->moduleList['project'] = '項目';
$lang->block->moduleList['product'] = $lang->productCommon;
@@ -444,13 +445,14 @@ $lang->block->orderByList->story['status_desc'] = '狀態倒序';
$lang->block->orderByList->story['stage_asc'] = '階段正序';
$lang->block->orderByList->story['stage_desc'] = '階段倒序';
$lang->block->todoCount = '待辦數';
$lang->block->taskCount = '任務數';
$lang->block->bugCount = 'Bug數';
$lang->block->riskCount = '風險數';
$lang->block->issueCount = '問題數';
$lang->block->storyCount = '需求數';
$lang->block->meetingCount = '會議數';
$lang->block->todoCount = '待辦數';
$lang->block->taskCount = '任務數';
$lang->block->bugCount = 'Bug數';
$lang->block->riskCount = '風險數';
$lang->block->issueCount = '問題數';
$lang->block->storyCount = '需求數';
$lang->block->meetingCount = '會議數';
$lang->block->feedbackCount = '反饋數';
$lang->block->typeList = new stdclass();
+22 -10
View File
@@ -34,6 +34,7 @@ class blockModel extends model
->setDefault('grid', '4')
->setDefault('source', $source)
->setDefault('block', $type)
->setDefault('vision', $this->config->vision)
->setDefault('params', array())
->remove('uid,actionLink,modules,moduleBlock')
->get();
@@ -167,7 +168,7 @@ class blockModel extends model
{
$data = array();
$tasks = $this->dao->select('t1.id')->from(TABLE_TASK)->alias('t1')
$tasks = $this->dao->select("count(t1.id) as tasks, count(if(t1.status = 'done', 1, null)) as doneTasks")->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on("t1.project = t2.id")
->leftJoin(TABLE_EXECUTION)->alias('t3')->on("t1.execution = t3.id")
->where('t1.assignedTo')->eq($this->app->user->account)
@@ -179,9 +180,11 @@ class blockModel extends model
->beginIF(!$this->app->user->admin)->andWhere('t1.execution')->in($this->app->user->view->sprints)->fi()
->beginIF($this->config->vision)->andWhere('t1.vision')->eq($this->config->vision)->fi()
->beginIF($this->config->vision)->andWhere('t3.vision')->eq($this->config->vision)->fi()
->fetchAll('id');
$data['tasks'] = isset($tasks) ? count($tasks) : 0;
$data['doneTasks'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_TASK)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq(0)->andWhere('status')->eq('done')->fetch('count');
->fetch();
$data['tasks'] = isset($tasks->tasks) ? $tasks->tasks : 0;
$data['doneTasks'] = isset($tasks->doneTasks) ? $tasks->doneTasks : 0;
$data['bugs'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)
->where('assignedTo')->eq($this->app->user->account)
->andWhere('deleted')->eq(0)
@@ -205,12 +208,17 @@ class blockModel extends model
->fetch('count');
$today = date('Y-m-d');
$data['delayTask'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_TASK)
->where('assignedTo')->eq($this->app->user->account)
->andWhere('status')->in('wait,doing')
->andWhere('deadline')->ne('0000-00-00')
->andWhere('deadline')->lt($today)
->andWhere('deleted')->eq(0)
$data['delayTask'] = (int)$this->dao->select('count(t1.id) AS count')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on("t1.project = t2.id")
->leftJoin(TABLE_EXECUTION)->alias('t3')->on("t1.execution = t3.id")
->where('t1.assignedTo')->eq($this->app->user->account)
->andWhere('(t2.status')->ne('suspended')
->orWhere('t3.status')->ne('suspended')
->markRight(1)
->andWhere('t1.status')->in('wait,doing')
->andWhere('t1.deadline')->ne('0000-00-00')
->andWhere('t1.deadline')->lt($today)
->andWhere('t1.deleted')->eq(0)
->fetch('count');
$data['delayBug'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)
->where('assignedTo')->eq($this->app->user->account)
@@ -773,6 +781,10 @@ class blockModel extends model
$params->meetingCount['name'] = $this->lang->block->meetingCount;
$params->meetingCount['default'] = 20;
$params->meetingCount['control'] = 'input';
$params->feedbackCount['name'] = $this->lang->block->feedbackCount;
$params->feedbackCount['default'] = 20;
$params->feedbackCount['control'] = 'input';
}
$params->storyCount['name'] = $this->lang->block->storyCount;
@@ -185,11 +185,11 @@ $(function()
<table class='status-count'>
<tr>
<td class='text-right'><?php echo $lang->bug->allBugs;?> :</td>
<td class='text-left'><?php echo empty($execution->totalBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&orderBy=status,id_desc&build=0&type=all"), $execution->totalBugs);?></td>
<td class='text-left'><?php echo empty($execution->totalBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&productID=0&orderBy=status,id_desc&build=0&type=all"), $execution->totalBugs);?></td>
</tr>
<tr>
<td class='text-right'><?php echo $lang->bug->unResolved;?> :</td>
<td class='text-left'><?php echo empty($execution->activeBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&orderBy=status,id_desc&build=0&type=unresolved"), $execution->activeBugs);?></td>
<td class='text-left'><?php echo empty($execution->activeBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&productID=0&orderBy=status,id_desc&build=0&type=unresolved"), $execution->activeBugs);?></td>
</tr>
</table>
</div>
+36
View File
@@ -0,0 +1,36 @@
<?php if(empty($feedbacks)): ?>
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
<?php else:?>
<style>
.block-feedbacks .c-id {width: 50px;}
</style>
<div class='panel-body has-table scrollbar-hover'>
<table class='table table-borderless table-fixed table-fixed-head table-hover tablesorter block-feedbacks <?php if(!$longBlock) echo 'block-sm'?>'>
<thead>
<tr>
<th class='c-id'><?php echo $lang->idAB?></th>
<th class='c-product'><?php echo $lang->feedback->product;?></th>
<th class='c-title'><?php echo $lang->feedback->title?></th>
<th class='c-type'><?php echo $lang->feedback->type;?></th>
<th class='c-openedBy'><?php echo $lang->feedback->openedBy;?></th>
<th class='c-openedDate'><?php echo $lang->feedback->openedDate;?></th>
</tr>
</thead>
<tbody>
<?php foreach($feedbacks as $feedback):?>
<?php
$appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
?>
<tr>
<td><?php echo sprintf('%03d', $feedback->id);?></td>
<td><?php echo zget($products, $feedback->product);?></td>
<td class='c-title' title='<?php echo $feedback->title?>'><?php echo html::a($this->createLink('feedback', 'view', "feedbackID=$feedback->id"), $feedback->title, '', "data-app='my'")?></td>
<td><?php echo zget($lang->feedback->typeList, $feedback->type)?></td>
<td><?php echo zget($users, $feedback->openedBy)?></td>
<td><?php echo $feedback->openedDate;?></td>
</tr>
<?php endforeach;?>
</tbody>
</table>
</div>
<?php endif;?>
+2 -1
View File
@@ -10,6 +10,7 @@
* @link http://www.zentao.pms
*/
$viewDir = dirname(__FILE__);
$file2Include = file_exists(dirname($viewDir) . "/ext/view/{$code}block.html.php") ? dirname($viewDir) . "/ext/view/{$code}block.html.php" : "{$viewDir}/{$code}block.html.php";
$extFire = $app->getExtensionRoot() . $config->edition . "/block/ext/view/{$code}block.html.php";
$file2Include = file_exists($extFire) ? $extFire : "{$viewDir}/{$code}block.html.php";
include $file2Include;
?>
@@ -127,10 +127,10 @@ $(function()
<div class="tile-title"><?php echo $lang->SRCommon;?></div>
<?php if($product->stories):?>
<div class="tile-amount"><?php echo array_sum($product->stories);?></div>
<?php common::printLink('product', 'browse', "productID={$product->id}&branch=&type=allstory", $lang->story->viewAll . '<span class="label label-badge label-icon"><i class="icon icon-arrow-right"></i></span>', '', 'class="btn btn-primary btn-circle btn-icon-right btn-sm"');?>
<?php common::printLink('product', 'browse', "productID={$product->id}&branch=&type=allstory", $lang->story->viewAll . '<span class="label label-badge label-icon"><i class="icon icon-arrow-right"></i></span>', '', 'class="btn btn-primary btn-circle btn-icon-right btn-sm" data-app="product"');?>
<?php else:?>
<div class="tile-amount">0</div>
<?php common::printLink('story', 'create', "productID={$product->id}", '<span class="label label-badge label-icon"><i class="icon icon-plus"></i></span>' . $lang->story->create, '', 'class="btn btn-primary btn-circle btn-icon-left btn-sm"');?>
<?php common::printLink('story', 'create', "productID={$product->id}", '<span class="label label-badge label-icon"><i class="icon icon-plus"></i></span>' . $lang->story->create, '', 'class="btn btn-primary btn-circle btn-icon-left btn-sm" data-app="product"');?>
<?php endif;?>
</div>
<ul class="types-line">
@@ -157,7 +157,7 @@ $(function()
</div>
<?php else:?>
<div class="actions">
<?php common::printLink('productplan', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i> " . $lang->productplan->create, '', "class='btn btn-info'");?>
<?php common::printLink('productplan', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i> " . $lang->productplan->create, '', "class='btn btn-info' data-app='product'");?>
</div>
<?php endif;?>
<div class="type-info">
@@ -190,7 +190,7 @@ $(function()
</div>
<?php else:?>
<div class="actions">
<?php common::printLink('release', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i> " . $lang->release->create, '', "class='btn btn-info'");?>
<?php common::printLink('release', 'create', "productID={$product->id}", "<i class='icon icon-plus'></i> " . $lang->release->create, '', "class='btn btn-info' data-app='product'");?>
</div>
<?php endif;?>
<div class="type-info">
+2 -1
View File
@@ -13,7 +13,8 @@
.product-info .progress-info {position: absolute; left: 8px; top: 10px; width: 180px; font-size: 12px;}
.product-info .type-info {color: #A6AAB8; text-align: center; position: absolute; right: 0; top: 6px; width: 100px;}
.product-info .type-value,
.product-info .type-label {font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.product-info .type-label {font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #838A9D;}
.progress-pie .progress-info>small {color: #838A9D;}
.product-info .type-value {font-size: 14px;}
.product-info .type-value > strong {font-size: 20px; color: #3C4353;}
.product-info .actions {position: absolute; left: 10px; top: 14px;}
+2 -2
View File
@@ -18,11 +18,11 @@ if(!$selfCall) die(include('./todolist.html.php'));
.block-todoes .todoes-input .form-control::-moz-placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
.block-todoes .todoes-input .form-control:-ms-input-placeholder {font-size: 12px; line-height: 20px;color: #a4a8b6;}
.block-todoes .todoes-input .form-control::placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
.block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -20px; max-height: 350px; overflow: auto; overflow-x:hidden}
.block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -10px; max-height: 350px; overflow: auto; overflow-x:hidden}
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden;}
.block-todoes .todoes > li:hover {background-color: #e9f2fb;}
.block-todoes .todo-title {padding: 0px;}
.titleBox {max-width: 730px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block;}
.titleBox {max-width: 1440px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block;}
.block-todoes .todo-pri {margin: 0 5px;}
.block-todoes .todo-time {display: inline-block; padding: 0 5px; font-size: 12px; color: #8e939a; width: 95px; min-width: 95px;}
.block-todoes .todo-check {position: absolute; top: 5px; left: 10px; display: block; width: 20px; height: 20px; font-size: 20px; color: transparent; cursor: pointer; background: #fff; border: 2px solid #eee; border-radius: 50%;}
+10 -8
View File
@@ -102,15 +102,17 @@
<td class='c-name' title='<?php echo $branch->desc;?>'><?php echo $branch->desc;?></td>
<td class='c-actions'>
<?php
$disabled = $isMain ? 'disabled' : '';
common::printIcon('branch', 'edit', "branchID=$branch->id&productID=$productID", $branch, 'list', '', '', "$disabled iframe", true, '', $lang->branch->edit);
if($branch->status == 'active')
if(!$isMain)
{
common::printIcon('branch', 'close', "branchID=$branch->id", $branch, 'list', 'off', 'hiddenwin', $disabled);
}
else
{
common::printIcon('branch', 'activate', "branchID=$branch->id", $branch, 'list', 'active', 'hiddenwin', $disabled);
common::printIcon('branch', 'edit', "branchID=$branch->id&productID=$productID", $branch, 'list', '', '', 'iframe', true, '', $lang->branch->edit);
if($branch->status == 'active')
{
common::printIcon('branch', 'close', "branchID=$branch->id", $branch, 'list', 'off', 'hiddenwin');
}
else
{
common::printIcon('branch', 'activate', "branchID=$branch->id", $branch, 'list', 'active', 'hiddenwin');
}
}
?>
</td>
+25 -11
View File
@@ -916,7 +916,7 @@ class bug extends control
* @access public
* @return void
*/
public function edit($bugID, $comment = false, $kanbanGroup = '')
public function edit($bugID, $comment = false, $kanbanGroup = 'default')
{
if(!empty($_POST))
{
@@ -1351,7 +1351,7 @@ class bug extends control
* @access public
* @return void
*/
public function assignTo($bugID, $kanbanGroup = '')
public function assignTo($bugID, $kanbanGroup = 'default')
{
$bug = $this->bug->getById($bugID);
$this->bug->checkBugExecutionPriv($bug);
@@ -1397,19 +1397,26 @@ class bug extends control
}
/* Get assigned to member. */
if($bug->execution)
if($this->app->tab == 'project' or $this->app->tab == 'execution')
{
$users = $this->user->getTeamMemberPairs($bug->execution, 'execution');
}
elseif($bug->project)
{
$users = $this->loadModel('project')->getTeamMemberPairs($bug->project);
if($bug->execution)
{
$users = $this->user->getTeamMemberPairs($bug->execution, 'execution');
}
elseif($bug->project)
{
$users = $this->loadModel('project')->getTeamMemberPairs($bug->project);
}
else
{
$users = $this->bug->getProductMemberPairs($bug->product, $bug->branch);
$users = array_filter($users);
if(empty($users)) $users = $this->user->getPairs('devfirst|noclosed');
}
}
else
{
$users = $this->bug->getProductMemberPairs($bug->product, $bug->branch);
$users = array_filter($users);
if(empty($users)) $users = $this->user->getPairs('devfirst|noclosed');
$users = $this->user->getPairs('devfirst|noclosed');
}
$this->view->title = $this->products[$bug->product] . $this->lang->colon . $this->lang->bug->assignedTo;
@@ -2252,6 +2259,13 @@ class bug extends control
$bug->steps = str_replace('&nbsp;', ' ', $bug->steps);
}
$bug->openedDate = !helper::isZeroDate($bug->openedDate) ? $bug->openedDate : '';
$bug->assignedDate = !helper::isZeroDate($bug->assignedDate) ? $bug->assignedDate : '';
$bug->resolvedDate = !helper::isZeroDate($bug->resolvedDate) ? $bug->resolvedDate : '';
$bug->closedDate = !helper::isZeroDate($bug->closedDate) ? $bug->closedDate : '';
$bug->lastEditedDate = !helper::isZeroDate($bug->lastEditedDate) ? $bug->lastEditedDate : '';
$bug->deadline = !helper::isZeroDate($bug->deadline) ? $bug->deadline : '';
/* fill some field with useful value. */
$bug->product = !isset($products[$bug->product]) ? '' : $products[$bug->product] . "(#$bug->product)";
$bug->project = !isset($projects[$bug->project]) ? '' : $projects[$bug->project] . "(#$bug->project)";
+3
View File
@@ -6,3 +6,6 @@
.c-build, .c-browser, .c-keywords {width: 100px;}
.c-steps {width: 150px;}
.c-pri, .c-severity {width: 80px;}
.c-actions {width: 60px;}
[lang^=de] .c-build, [lang^=fr] .c-build {width: 115px}
@media screen and (max-width: 1366px) {[lang^=de] .c-build, [lang^=fr] .c-build {width: 110px}}
+1
View File
@@ -34,3 +34,4 @@ body {margin-bottom: 25px;}
.btn-group a.btn-primary {border-right: 1px solid rgba(255,255,255,0.3);}
.btn-group button.dropdown-toggle.btn-primary {padding:6px;}
#bugForm tbody tr td .label {max-width: 100px; text-overflow: unset;}
[lang^='de'] th.c-confirmed {width: 100px !important;}
+4
View File
@@ -1,5 +1,9 @@
html[lang='en'] #moduleIdBox .input-group-addon {padding: 5px 23px;}
html[lang='en'] #deadlineTd .input-group-addon {padding: 5px 18px;}
html[lang='zh-cn'] #keywordsAddonLabel, .task {width: 77px;}
html[lang='zh-tw'] #keywordsAddonLabel, .task {width: 77px;}
html[lang='fr'] #keywordsAddonLabel, .task {width: 61px;}
html[lang='de'] #keywordsAddonLabel, .task {width: 73px;}
.ke-toolbar .ke-outline[data-name='savetemplate'] {display: block;}
.ke-outline .ke-icon-savetemplate {background-image: url(theme/default/images/kindeditor/save.gif); background-position: center; width: 56px; height: 20px;}
+1
View File
@@ -6,3 +6,4 @@
#linkBugBox > li {margin-left: -56px;}
#branch {width: 95px;}
#storyIdBox .chosen-auto-max-width {width: 215px !important;}
.form-group {margin-left: 10px; margin-right: 10px;}
+119
View File
@@ -4,8 +4,95 @@ $(function()
var $titleCol = $('#batchCreateForm table thead tr th.c-title');
if($titleCol.width() < 150) $titleCol.width(150);
$('#customField').click(function()
{
hiddenRequireFields();
});
/* Implement a custom form without feeling refresh. */
$('#formSettingForm .btn-primary').click(function()
{
var fields = '';
$('#formSettingForm > .checkboxes > .checkbox-primary > input:checked').each(function()
{
fields += ',' + $(this).val();
});
var link = createLink('custom', 'ajaxSaveCustomFields', 'module=bug&section=custom&key=batchCreateFields');
$.post(link, {'fields' : fields}, function()
{
showCheckedFields(fields);
$('#formSetting').parent().removeClass('open');
if($('#batchCreateForm table thead tr th.c-title').width() < 150) $titleCol.width(150);
var fieldCount = $('#batchCreateForm .table thead>tr>th:visible').length;
$('.form-actions').attr('colspan', fieldCount);
if(fieldCount > 10)
{
$('#batchCreateForm > .table-responsive').removeClass('scroll-none');
$('#batchCreateForm > .table-responsive').css('overflow', 'auto');
}
else
{
$('#batchCreateForm > .table-responsive').addClass('scroll-none');
$('#batchCreateForm > .table-responsive').css('overflow', 'visible');
}
});
return false;
});
})
/**
* Show checked fields.
*
* @param string fields
* @access public
* @return void
*/
function showCheckedFields(fields)
{
showFields = fields;
var fieldList = ',' + fields + ',';
$('#formSettingForm > .checkboxes > .checkbox-primary > input').each(function()
{
var field = ',' + $(this).val() + ',';
var $field = $('[name^=' + $(this).val() + ']');
var required = ',' + requiredFields + ',';
var $fieldBox = $('.' + $(this).val() + 'Box' );
if(fieldList.indexOf(field) >= 0 || required.indexOf(field) >= 0)
{
$fieldBox.removeClass('hidden');
$field.removeAttr('disabled');
}
else if(!$fieldBox.hasClass('hidden'))
{
$fieldBox.addClass('hidden');
$field.attr('disabled', true);
}
});
}
/**
* Hidden require field.
*
* @access public
* @return void
*/
function hiddenRequireFields()
{
$('#formSettingForm > .checkboxes > .checkbox-primary > input').each(function()
{
var field = ',' + $(this).val() + ',';
var required = ',' + requiredFields + ',';
if(required.indexOf(field) >= 0) $(this).closest('div').addClass('hidden');
});
}
/**
* Set opened builds.
*
@@ -149,3 +236,35 @@ $(document).keydown(function(event)
inputFocusJump('down');
}
});
/**
* Add item.
*
* @param object $obj
* @access public
* @return void
*/
function addItem(obj)
{
var item = $('#addItem').html().replace(/%i%/g, itemIndex + 1);
$('<tr class="addedItem">' + item + '</tr>').insertAfter($(obj).closest('tr'));
$(obj).closest('tr').next().find(".form-date").datepicker();
$(obj).closest('tr').next().find('div[id$=_chosen]').remove();
$(obj).closest('tr').next().find('.chosen').next('.picker').remove();
$(obj).closest('tr').next().find('.chosen').chosen();
itemIndex ++;
}
/**
* Delete item.
*
* @param object $obj
* @access public
* @return void
*/
function deleteItem(obj)
{
$(obj).closest('tr').remove();
}
+1 -1
View File
@@ -425,7 +425,6 @@ $lang->bug->placeholder->newBuildName = 'Nom Nouv Build';
$lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs;
$lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed;
$lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe;
$lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe;
$lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe;
@@ -433,6 +432,7 @@ $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved;
$lang->bug->featureBar['browse']['more'] = $lang->more;
$lang->bug->moreSelects['assignedbyme'] = $lang->bug->assignedByMe;
$lang->bug->moreSelects['openedbyme'] = $lang->bug->openedByMe;
$lang->bug->moreSelects['unconfirmed'] = $lang->bug->unconfirmed;
$lang->bug->moreSelects['assigntonull'] = $lang->bug->assignToNull;
$lang->bug->moreSelects['longlifebugs'] = $lang->bug->longLifeBugs;
+32 -8
View File
@@ -745,6 +745,8 @@ class bugModel extends model
if($bug->execution and $bug->status != $oldBug->status) $this->loadModel('kanban')->updateLane($bug->execution, 'bug');
if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
return common::createChanges($oldBug, $bug);
}
}
@@ -845,6 +847,9 @@ class bugModel extends model
unset($bug);
}
$isBiz = $this->config->edition == 'biz';
$isMax = $this->config->edition == 'max';
/* Update bugs. */
foreach($bugs as $bugID => $bug)
{
@@ -866,6 +871,12 @@ class bugModel extends model
$this->executeHooks($bugID);
$allChanges[$bugID] = common::createChanges($oldBug, $bug);
if(($isBiz || $isMax) && $oldBug->feedback && !isset($feedbacks[$oldBug->feedback]))
{
$feedbacks[$oldBug->feedback] = $oldBug->feedback;
$this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
}
}
else
{
@@ -1138,6 +1149,8 @@ class bugModel extends model
/* Link bug to build and release. */
$this->linkBugToBuild($bugID, $bug->resolvedBuild);
if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
return common::createChanges($oldBug, $bug);
}
@@ -1252,6 +1265,9 @@ class bugModel extends model
$modules = array();
while($module = $stmt->fetch()) $modules[$module->id] = $module;
$isBiz = $this->config->edition == 'biz';
$isMax = $this->config->edition == 'max';
$changes = array();
foreach($bugIDList as $i => $bugID)
{
@@ -1297,6 +1313,12 @@ class bugModel extends model
if($oldBug->execution) $this->loadModel('kanban')->updateLane($oldBug->execution, 'bug');
$changes[$bugID] = common::createChanges($oldBug, $bug);
if(($isBiz || $isMax) && $oldBug->feedback && !isset($feedbacks[$oldBug->feedback]))
{
$feedbacks[$oldBug->feedback] = $oldBug->feedback;
$this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
}
}
/* Link bug to build and release. */
@@ -1408,6 +1430,8 @@ class bugModel extends model
if(isset($output['toColID'])) $this->kanban->moveCard($bugID, $output['fromColID'], $output['toColID'], $output['fromLaneID'], $output['toLaneID']);
}
if(($this->config->edition == 'biz' || $this->config->edition == 'max') && $oldBug->feedback) $this->loadModel('feedback')->updateStatus('bug', $oldBug->feedback, $bug->status, $oldBug->status);
return common::createChanges($oldBug, $bug);
}
@@ -3195,7 +3219,7 @@ class bugModel extends model
echo zget($users, $bug->openedBy);
break;
case 'openedDate':
echo substr($bug->openedDate, 5, 11);
echo helper::isZeroDate($bug->openedDate) ? '' : substr($bug->openedDate, 5, 11);
break;
case 'openedBuild':
$builds = array_flip($builds);
@@ -3204,11 +3228,11 @@ class bugModel extends model
$buildID = zget($builds, $build, '');
if($buildID == 'trunk')
{
echo $build;
echo $build . ' ';
}
elseif($buildID and common::hasPriv('build', 'view'))
{
echo html::a(helper::createLink('build', 'view', "buildID=$buildID"), $build, '', "title='$bug->openedBuild'");
echo html::a(helper::createLink('build', 'view', "buildID=$buildID"), $build, '', "title='$bug->openedBuild'") . ' ';
}
}
break;
@@ -3216,10 +3240,10 @@ class bugModel extends model
$this->printAssignedHtml($bug, $users);
break;
case 'assignedDate':
echo substr($bug->assignedDate, 5, 11);
echo helper::isZeroDate($bug->assignedDate) ? '' : substr($bug->assignedDate, 5, 11);
break;
case 'deadline':
echo $bug->deadline;
echo helper::isZeroDate($bug->deadline) ? '' : substr($bug->deadline, 5, 11);
break;
case 'resolvedBy':
echo zget($users, $bug->resolvedBy, $bug->resolvedBy);
@@ -3228,7 +3252,7 @@ class bugModel extends model
echo zget($this->lang->bug->resolutionList, $bug->resolution);
break;
case 'resolvedDate':
echo substr($bug->resolvedDate, 5, 11);
echo helper::isZeroDate($bug->resolvedDate) ? '' : substr($bug->resolvedDate, 5, 11);
break;
case 'resolvedBuild':
echo $bug->resolvedBuild;
@@ -3237,13 +3261,13 @@ class bugModel extends model
echo zget($users, $bug->closedBy);
break;
case 'closedDate':
echo substr($bug->closedDate, 5, 11);
echo helper::isZeroDate($bug->closedDate) ? '' : substr($bug->closedDate, 5, 11);
break;
case 'lastEditedBy':
echo zget($users, $bug->lastEditedBy);
break;
case 'lastEditedDate':
echo substr($bug->lastEditedDate, 5, 11);
echo helper::isZeroDate($bug->lastEditedDate) ? '' : substr($bug->lastEditedDate, 5, 11);
break;
case 'actions':
echo $this->buildOperateMenu($bug, 'browse');
+132 -64
View File
@@ -14,6 +14,24 @@
include '../../common/view/header.html.php';
js::set('requiredFields', $config->bug->create->requiredFields);
?>
<?php
$visibleFields = array();
$requiredFields = array();
foreach(explode(',', $showFields) as $field)
{
if($field) $visibleFields[$field] = '';
}
foreach(explode(',', $config->bug->create->requiredFields) as $field)
{
if($field)
{
$requiredFields[$field] = '';
if(strpos(",{$config->bug->list->customBatchCreateFields},", ",{$field},") !== false) $visibleFields[$field] = '';
}
}
?>
<?php js::set('showFields', $showFields);?>
<div id='mainContent' class='main-content fade'>
<div class='main-header'>
<h2>
@@ -30,49 +48,32 @@ js::set('requiredFields', $config->bug->create->requiredFields);
<?php endif;?>
</div>
</div>
<?php
$visibleFields = array();
$requiredFields = array();
foreach(explode(',', $showFields) as $field)
{
if($field) $visibleFields[$field] = '';
}
foreach(explode(',', $config->bug->create->requiredFields) as $field)
{
if($field)
{
$requiredFields[$field] = '';
if(strpos(",{$config->bug->list->customBatchCreateFields},", ",{$field},") !== false) $visibleFields[$field] = '';
}
}
?>
<form class='main-form' method='post' target='hiddenwin' id='batchCreateForm'>
<div class="table-responsive">
<table class='table table-form'>
<thead>
<tr>
<th class='c-id'><?php echo $lang->idAB;?></th>
<th class='c-branch<?php echo zget($visibleFields, $product->type, ' hidden')?>'> <?php echo $lang->product->branch;?></th>
<th class='c-branch<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox'> <?php echo $lang->product->branch;?></th>
<th class='c-module<?php echo zget($requiredFields, 'module', '', ' required');?>'> <?php echo $lang->bug->module;?></th>
<?php if($config->systemMode == 'new'):?>
<th class='c-project<?php echo zget($visibleFields, 'project', ' hidden') . zget($requiredFields, 'project', '', ' required');?>'><?php echo (isset($project->model) and $project->model == 'kanban') ? $lang->bug->kanban : $lang->bug->project;?></th>
<th class='c-project<?php echo zget($visibleFields, 'project', ' hidden') . zget($requiredFields, 'project', '', ' required');?> projectBox'><?php echo (isset($project->model) and $project->model == 'kanban') ? $lang->bug->kanban : $lang->bug->project;?></th>
<?php endif;?>
<th class='c-execution<?php echo zget($visibleFields, 'execution', ' hidden') . zget($requiredFields, 'execution', '', ' required');?>'><?php echo (isset($project->model) and $project->model == 'kanban') ? $lang->bug->kanban : $lang->bug->execution;?></th>
<th class='c-execution<?php echo zget($visibleFields, 'execution', ' hidden') . zget($requiredFields, 'execution', '', ' required');?> executionBox'><?php echo (isset($project->model) and $project->model == 'kanban') ? $lang->bug->kanban : $lang->bug->execution;?></th>
<th class='c-build required'><?php echo $lang->bug->openedBuild;?></th>
<th class='c-title required'><?php echo $lang->bug->title;?></th>
<?php if(isset($executionType) and $executionType == 'kanban'):?>
<th class='c-execution'><?php echo $lang->kanbancard->region;?></th>
<th class='c-execution'><?php echo $lang->kanbancard->lane;?></th>
<?php endif;?>
<th class='c-date<?php echo zget($visibleFields, 'deadline', ' hidden') . zget($requiredFields, 'deadline', '', ' required');?>'><?php echo $lang->bug->deadline;?></th>
<th class='c-steps<?php echo zget($visibleFields, 'steps', ' hidden') . zget($requiredFields, 'steps', '', ' required');?>'><?php echo $lang->bug->steps;?></th>
<th class='c-type<?php echo zget($visibleFields, 'type', ' hidden') . zget($requiredFields, 'type', '', ' required');?>'><?php echo $lang->typeAB;?></th>
<th class='c-pri<?php echo zget($visibleFields, 'pri', ' hidden') . zget($requiredFields, 'pri', '', ' required');?>'><?php echo $lang->bug->pri;?></th>
<th class='c-severity<?php echo zget($visibleFields, 'severity', ' hidden') . zget($requiredFields, 'severity', '', ' required');?>'><?php echo $lang->bug->severity;?></th>
<th class='c-os<?php echo zget($visibleFields, 'os', ' hidden') . zget($requiredFields, 'os', '', ' required');?>'><?php echo $lang->bug->os;?></th>
<th class='c-browser<?php echo zget($visibleFields, 'browser', ' hidden') . zget($requiredFields, 'browser', '', ' required');?>'><?php echo $lang->bug->browser;?></th>
<th class='c-keywords<?php echo zget($visibleFields, 'keywords', ' hidden') . zget($requiredFields, 'keywords', '', ' required');?>'><?php echo $lang->bug->keywords;?></th>
<th class='c-date<?php echo zget($visibleFields, 'deadline', ' hidden') . zget($requiredFields, 'deadline', '', ' required');?> deadlineBox'><?php echo $lang->bug->deadline;?></th>
<th class='c-steps<?php echo zget($visibleFields, 'steps', ' hidden') . zget($requiredFields, 'steps', '', ' required');?> stepsBox'><?php echo $lang->bug->steps;?></th>
<th class='c-type<?php echo zget($visibleFields, 'type', ' hidden') . zget($requiredFields, 'type', '', ' required');?> typeBox'><?php echo $lang->typeAB;?></th>
<th class='c-pri<?php echo zget($visibleFields, 'pri', ' hidden') . zget($requiredFields, 'pri', '', ' required');?> priBox'><?php echo $lang->bug->pri;?></th>
<th class='c-severity<?php echo zget($visibleFields, 'severity', ' hidden') . zget($requiredFields, 'severity', '', ' required');?> severityBox'><?php echo $lang->bug->severity;?></th>
<th class='c-os<?php echo zget($visibleFields, 'os', ' hidden') . zget($requiredFields, 'os', '', ' required');?> osBox'><?php echo $lang->bug->os;?></th>
<th class='c-browser<?php echo zget($visibleFields, 'browser', ' hidden') . zget($requiredFields, 'browser', '', ' required');?> browserBox'><?php echo $lang->bug->browser;?></th>
<th class='c-keywords<?php echo zget($visibleFields, 'keywords', ' hidden') . zget($requiredFields, 'keywords', '', ' required');?> keywordsBox'><?php echo $lang->bug->keywords;?></th>
<?php
$extendFields = $this->bug->getFlowExtendFields();
foreach($extendFields as $extendField)
@@ -81,6 +82,7 @@ js::set('requiredFields', $config->bug->create->requiredFields);
echo "<th class='c-extend $required'>{$extendField->name}</th>";
}
?>
<th class='c-actions'><?php echo $lang->actions;?></th>
</tr>
</thead>
<tbody>
@@ -106,13 +108,13 @@ js::set('requiredFields', $config->bug->create->requiredFields);
$browser = $i == 1 ? '' : 'ditto';
?>
<tr>
<td class='text-center'><?php echo $i;?></td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?>' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
<td class='text-left'><?php echo $i;?></td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<?php if($config->systemMode == 'new'):?>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?>' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?>' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, 'trunk', "class='form-control chosen' multiple");?></td>
<td>
<div class='input-group'>
@@ -132,18 +134,24 @@ js::set('requiredFields', $config->bug->create->requiredFields);
<td><?php echo html::select("regions[$i]", $regionPairs, $regionID, "class='form-control chosen'");?></td>
<td><?php echo html::select("lanes[$i]", $lanePairs, $laneID, "class='form-control chosen'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?>'><?php echo html::input("deadlines[$i]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?>'><?php echo html::textarea("stepses[$i]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?>' style='overflow:visible'> <?php echo html::select("types[$i]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?>' style='overflow:visible'> <?php echo html::select("pris[$i]", $lang->bug->priList, $pri, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?>' style='overflow:visible'><?php echo html::select("severities[$i]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?>' style='overflow:visible'> <?php echo html::select("oses[$i]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?>' style='overflow:visible'> <?php echo html::select("browsers[$i]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?>'><?php echo html::input("keywords[$i]", '', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox'><?php echo html::input("deadlines[$i]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?> stepsBox'><?php echo html::textarea("stepses[$i]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?> typeBox' style='overflow:visible'> <?php echo html::select("types[$i]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[$i]", $lang->bug->priList, $pri, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?> severityBox' style='overflow:visible'><?php echo html::select("severities[$i]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?> osBox' style='overflow:visible'> <?php echo html::select("oses[$i]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?> browserBox' style='overflow:visible'> <?php echo html::select("browsers[$i]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?> keywordsBox'><?php echo html::input("keywords[$i]", '', "class='form-control'");?></td>
<?php
$this->loadModel('flow');
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";
?>
<td class='c-actions text-left'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<?php if($i != 1):?>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
<?php endif;?>
</td>
</tr>
<?php $i++;?>
<?php endforeach;?>
@@ -161,12 +169,12 @@ js::set('requiredFields', $config->bug->create->requiredFields);
?>
<tr>
<td><?php echo $i;?></td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?>' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<?php if($config->systemMode == 'new'):?>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?>' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?>' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control chosen' multiple");?></td>
<td>
<div class='input-group'>
@@ -186,24 +194,30 @@ js::set('requiredFields', $config->bug->create->requiredFields);
<td><?php echo html::select("regions[$i]", $regionPairs, $regionID, "class='form-control chosen' onchange='setLane(this.value, $i)'");?></td>
<td><?php echo html::select("lanes[$i]", $lanePairs, $laneID, "class='form-control chosen'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?>'><?php echo html::input("deadlines[$i]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?>'><?php echo html::textarea("stepses[$i]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?>' style='overflow:visible'> <?php echo html::select("types[$i]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?>' style='overflow:visible'> <?php echo html::select("pris[$i]", $lang->bug->priList, $pri, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?>' style='overflow:visible'><?php echo html::select("severities[$i]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?>' style='overflow:visible'> <?php echo html::select("oses[$i]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?>' style='overflow:visible'> <?php echo html::select("browsers[$i]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?>'><?php echo html::input("keywords[$i]", '', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox'><?php echo html::input("deadlines[$i]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?> stepsBox'><?php echo html::textarea("stepses[$i]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?> typeBox' style='overflow:visible'> <?php echo html::select("types[$i]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[$i]", $lang->bug->priList, $pri, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?> severityBox' style='overflow:visible'><?php echo html::select("severities[$i]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?> osBox' style='overflow:visible'> <?php echo html::select("oses[$i]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?> browserBox' style='overflow:visible'> <?php echo html::select("browsers[$i]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?> keywordsBox'><?php echo html::input("keywords[$i]", '', "class='form-control'");?></td>
<?php
$this->loadModel('flow');
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";
?>
<td class='c-actions text-left'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<?php if($i != 1):?>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
<?php endif;?>
</td>
</tr>
<?php endfor;?>
</tbody>
<tfoot>
<tr>
<td colspan='<?php echo count($visibleFields) + 3?>' class='text-center form-actions'>
<td colspan='<?php echo count($visibleFields) + 4?>' class='text-center form-actions'>
<?php echo html::submitButton();?>
<?php echo html::backButton();?>
</td>
@@ -213,16 +227,17 @@ js::set('requiredFields', $config->bug->create->requiredFields);
</div>
</form>
</div>
<?php js::set('itemIndex', -- $i);?>
<table class='template' id='trTemp'>
<tbody>
<tr>
<td>%s</td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?>' style='overflow:visible'><?php echo html::select("branches[%s]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, \"%s\")'");?></td>
<td><?php echo html::select("modules[%s]", $moduleOptionMenu, $moduleID, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> productBox' style='overflow:visible'><?php echo html::select("branches[%s]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, \"%s\")'");?></td>
<td><?php echo html::select("modules[%s]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<?php if($config->systemMode == 'new'):?>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?>' style='overflow:visible'><?php echo html::select("projects[%s]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, \"%s\")'");?></td>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[%s]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, \"%s\")'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?>' style='overflow:visible'><?php echo html::select("executions[%s]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, \"%s\")'");?></td>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[%s]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, \"%s\")'");?></td>
<td id='buildBox%s'><?php echo html::select("openedBuilds[%s][]", $builds, '', "class='form-control chosen' multiple");?></td>
<td>
<div class='input-group'>
@@ -238,21 +253,74 @@ js::set('requiredFields', $config->bug->create->requiredFields);
</div>
</div>
</td>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?>'><?php echo html::input("deadlines[%s]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?>'><?php echo html::textarea("stepses[%s]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?>' style='overflow:visible'> <?php echo html::select("types[%s]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?>' style='overflow:visible'> <?php echo html::select("pris[%s]", $lang->bug->priList, '', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?>' style='overflow:visible'><?php echo html::select("severities[%s]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?>' style='overflow:visible'> <?php echo html::select("oses[%s]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?>' style='overflow:visible'> <?php echo html::select("browsers[%s]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?>'><?php echo html::input("keywords[%s]", '', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox'><?php echo html::input("deadlines[%s]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?> stepsBox'><?php echo html::textarea("stepses[%s]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?> typeBox' style='overflow:visible'> <?php echo html::select("types[%s]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[%s]", $lang->bug->priList, $pri, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?> severityBox' style='overflow:visible'><?php echo html::select("severities[%s]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?> osBox' style='overflow:visible'> <?php echo html::select("oses[%s]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?> browserBox' style='overflow:visible'> <?php echo html::select("browsers[%s]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?> keywordsBox'><?php echo html::input("keywords[%s]", '', "class='form-control'");?></td>
<?php
$this->loadModel('flow');
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[%s]") . "</td>";
?>
<td class='c-actions text-left'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
</td>
</tr>
</tbody>
</table>
<div>
<?php $i = '%i%';?>
<table class='hidden'>
<tr id='addItem' class='hidden'>
<td><?php echo $i;?></td>
<td class='<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox' style='overflow:visible'><?php echo html::select("branches[$i]", $branches, $branch, "class='form-control chosen' onchange='setBranchRelated(this.value, $productID, $i)'");?></td>
<td><?php echo html::select("modules[$i]", $moduleOptionMenu, $moduleID, "class='form-control chosen'");?></td>
<?php if($config->systemMode == 'new'):?>
<td class='<?php echo zget($visibleFields, 'project', ' hidden')?> projectBox' style='overflow:visible'><?php echo html::select("projects[$i]", $projects, $projectID, "class='form-control chosen' onchange = 'loadProductExecutionsByProject($productID, this.value, $i)'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'execution', ' hidden')?> executionBox' style='overflow:visible'><?php echo html::select("executions[$i]", $executions, $executionID, "class='form-control chosen' onchange='loadExecutionBuilds($productID, this.value, $i)'");?></td>
<td id='buildBox<?php echo $i;?>'><?php echo html::select("openedBuilds[$i][]", $builds, '', "class='form-control chosen' multiple");?></td>
<td>
<div class='input-group'>
<div class="input-control has-icon-right">
<?php echo html::input("title[$i]", '', "class='form-control title-import'");?>
<div class="colorpicker">
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
<ul class="dropdown-menu clearfix">
<li class="heading"><?php echo $lang->bug->colorTag;?><i class="icon icon-close"></i></li>
</ul>
<?php echo html::hidden("color[$i]", '', "data-provide='colorpicker' data-icon='color' data-wrapper='input-control-icon-right' data-update-color='#title\\[$i\\]'");?>
</div>
</div>
</div>
</td>
<?php if(isset($executionType) and $executionType == 'kanban'):?>
<td><?php echo html::select("regions[$i]", $regionPairs, $regionID, "class='form-control chosen' onchange='setLane(this.value, $i)'");?></td>
<td><?php echo html::select("lanes[$i]", $lanePairs, $laneID, "class='form-control chosen'");?></td>
<?php endif;?>
<td class='<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox'><?php echo html::input("deadlines[$i]", '', "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'steps', 'hidden')?> stepsBox'><?php echo html::textarea("stepses[$i]", '', "rows='1' class='form-control autosize'");?></td>
<td class='<?php echo zget($visibleFields, 'type', 'hidden')?> typeBox' style='overflow:visible'> <?php echo html::select("types[$i]", $lang->bug->typeList, $type, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox' style='overflow:visible'> <?php echo html::select("pris[$i]", $lang->bug->priList, $pri, "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'severity', 'hidden')?> severityBox' style='overflow:visible'><?php echo html::select("severities[$i]", $lang->bug->severityList, '3', "class='form-control'");?></td>
<td class='<?php echo zget($visibleFields, 'os', 'hidden')?> osBox' style='overflow:visible'> <?php echo html::select("oses[$i]", $lang->bug->osList, $os, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'browser', 'hidden')?> browserBox' style='overflow:visible'> <?php echo html::select("browsers[$i]", $lang->bug->browserList, $browser, "class='form-control chosen'");?></td>
<td class='<?php echo zget($visibleFields, 'keywords', 'hidden')?> keywordsBox'><?php echo html::input("keywords[$i]", '', "class='form-control'");?></td>
<?php
$this->loadModel('flow');
foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->flow->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";
?>
<td class='c-actions text-left'>
<a href='javascript:;' onclick='addItem(this)' class='btn btn-link'><i class='icon-plus'></i></a>
<a href='javascript:;' onclick='deleteItem(this)' class='btn btn-link'><i class='icon icon-close'></i></a>
</td>
</tr>
</table>
</div>
<?php js::set('branch', $branch)?>
<?php if(isonlybody()):?>
<style>
+1 -1
View File
@@ -131,7 +131,7 @@
}
?>
<td class='<?php echo zget($visibleFields, 'assignedTo', ' hidden')?>' style='overflow:visible'><?php echo html::select("assignedTos[$bugID]", $assignedToList, $bug->assignedTo, "class='form-control picker-select' data-drop-width='135px'");?></td>
<td class='<?php echo zget($visibleFields, 'deadline', ' hidden')?>' style='overflow:visible'><?php echo html::input("deadlines[$bugID]", $bug->deadline, "class='form-control form-date'");?></td>
<td class='<?php echo zget($visibleFields, 'deadline', ' hidden')?>' style='overflow:visible'><?php echo html::input("deadlines[$bugID]", helper::isZeroDate($bug->deadline) ? '' : substr($bug->deadline, 5, 11), "class='form-control form-date'");?></td>
<td <?php echo zget($visibleFields, 'os', "class='hidden'")?>><?php echo html::select("os[$bugID]", $osList, $bug->os, 'class=form-control');?></td>
<td <?php echo zget($visibleFields, 'browser', "class='hidden'")?>><?php echo html::select("browsers[$bugID]", $browserList, $bug->browser, 'class=form-control');?></td>
<td <?php echo zget($visibleFields, 'keywords', "class='hidden'")?>><?php echo html::input("keywords[$bugID]", $bug->keywords, 'class=form-control');?></td>
+3 -3
View File
@@ -18,7 +18,7 @@ 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('refresh', $lang->refreshIcon);
js::set('flow', $config->global->flow);
js::set('stepsRequired', $stepsRequired);
js::set('stepsNotEmpty', $lang->bug->stepsNotEmpty);
@@ -69,7 +69,7 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=bug&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo '&nbsp; ';
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' onclick='loadProductModules($productID)'");
echo '</span>';
}
?>
@@ -312,7 +312,7 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
<td>
<div class='input-group'>
<?php if($showStory):?>
<span class='input-group-addon'><?php echo $lang->bug->task?></span>
<span class='input-group-addon task'><?php echo $lang->bug->task?></span>
<?php endif;?>
<?php echo html::select('task', '', $taskID, "class='form-control chosen'") . html::hidden('oldTaskID', $taskID);?>
</div>
+2 -2
View File
@@ -111,7 +111,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=bug&currentModuleID=0&branch=$bug->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo '&nbsp; ';
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' onclick='loadProductModules($productID)'");
echo '</span>';
}
?>
@@ -160,7 +160,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
</tr>
<tr>
<th><?php echo $lang->bug->deadline;?></th>
<td><?php echo html::input('deadline', $bug->deadline, "class='form-control form-date'");?></td>
<td><?php echo html::input('deadline', helper::isZeroDate($bug->deadline) ? '' : $bug->deadline, "class='form-control form-date'");?></td>
</tr>
<tr>
<th><?php echo $lang->bug->feedbackBy;?></th>
+1 -1
View File
@@ -224,7 +224,7 @@
<th><?php echo $lang->bug->deadline;?></th>
<td>
<?php
if($bug->deadline) echo $bug->deadline;
if($bug->deadline) echo helper::isZeroDate($bug->deadline) ? '' : substr($bug->deadline, 5, 11);
if(isset($bug->delay)) printf($lang->bug->delayWarning, $bug->delay);
?>
</td>
+1 -1
View File
@@ -43,7 +43,7 @@ class build extends control
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $buildID));
if(isonlybody()) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'callback' => "parent.loadExecutionBuilds($executionID, $buildID)")); // Code for task #5126.
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID")));
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink('build', 'view', "buildID=$buildID") . "#app={$this->app->tab}"));
}
/* Set menu. */
+1 -1
View File
@@ -549,7 +549,7 @@ class buildModel extends model
if(common::hasPriv('build', 'linkstory') and common::canBeChanged('build', $build)) $menu .= $this->buildMenu('build', 'view', "{$params}&type=story&link=true", $build, $type, 'link', '', '', '', "data-app={$tab}", $this->lang->build->linkStory);
$menu .= $this->buildMenu('testtask', 'create', "product=$build->product&execution={$executionID}&build=$build->id", $build, $type, 'bullhorn', '', '', '', $testtaskApp);
$menu .= $this->buildMenu('testtask', 'create', "product=$build->product&execution={$executionID}&build=$build->id&projectID=$build->project", $build, $type, 'bullhorn', '', '', '', $testtaskApp);
if($tab == 'execution' and !empty($execution->type) and $execution->type != 'kanban') $menu .= $this->buildMenu('execution', 'bug', "execution={$extraParams['executionID']}&productID={$extraParams['productID']}&orderBy=status&build=$build->id", $build, $type, '', '', '', '', $this->lang->execution->viewBug);
if($tab == 'project' or empty($execution->type) or $execution->type == 'kanban') $menu .= $this->buildMenu('build', 'view', "{$params}&type=generatedBug", $build, $type, 'bug', '', '', '', "data-app='$tab'", $this->lang->project->bug);
+3
View File
@@ -25,6 +25,8 @@ class ciModel extends model
session_write_close();
}
common::setMenuVars('devops', $this->session->repoID);
$this->lang->switcherMenu = $this->loadModel('repo')->getSwitcher($this->session->repoID);
}
/**
@@ -281,6 +283,7 @@ class ciModel extends model
}
$this->dao->update(TABLE_MR)->data($newMR)->where('id')->eq($relateMR->id)->exec();
$this->mr->linkObjects($relateMR);
}
elseif($status != 'success')
{
+3
View File
@@ -80,6 +80,7 @@ $lang->misc = new stdclass();
$lang->acl = new stdclass();
$lang->curd = new stdclass();
$lang->sonarqube = new stdclass();
$lang->app = new stdclass();
$lang->projectbuild = new stdclass();
$lang->projectrelease = new stdclass();
@@ -174,6 +175,8 @@ $lang->createIcons['program'] = 'program';
$lang->createIcons['kanbanspace'] = 'cube';
$lang->createIcons['kanban'] = 'kanban';
$lang->refreshIcon = "<i class='icon icon-refresh'></i>";
$lang->noMenuModule = array('report', 'my', 'todo', 'effort', 'program', 'product', 'execution', 'task', 'build', 'productplan', 'project', 'projectrelease', 'projectstory', 'story', 'branch', 'release', 'attend', 'leave', 'makeup', 'overtime', 'lieu', 'custom', 'admin', 'mail', 'extension', 'dev', 'backup', 'action', 'cron', 'pssp', 'sms', 'message', 'webhook', 'search', 'score', 'stage', 'entry', 'jenkins', 'gitlab');
if(isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode'] and !defined('TUTORIAL')) define('TUTORIAL', true);
+4 -1
View File
@@ -196,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->personnel->common = 'Member';
$lang->personnel->invest = 'Investment';
@@ -282,6 +284,7 @@ $lang->devops->mr = 'Merge Request';
$lang->devops->repo = 'Repo';
$lang->devops->rules = 'Rule';
$lang->devops->settings = 'Setting Merge Request';
$lang->devops->set = 'Set';
$lang->admin->system = 'System';
$lang->admin->entry = 'Application';
@@ -353,7 +356,7 @@ $lang->setLang = 'Language Setting';
/* Theme style. */
$lang->theme = 'Theme';
$lang->themes['default'] = 'ZenTao Blau (Standard)';
$lang->themes['default'] = 'Standard';
$lang->themes['blue'] = 'Young Blue';
$lang->themes['green'] = 'Grün';
$lang->themes['red'] = 'Rot';
+3
View File
@@ -196,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->personnel->common = 'Member';
$lang->personnel->invest = 'Investment';
@@ -282,6 +284,7 @@ $lang->devops->mr = 'Merge Request';
$lang->devops->repo = 'Repo';
$lang->devops->rules = 'Rule';
$lang->devops->settings = 'Setting Merge Request';
$lang->devops->set = 'Set';
$lang->admin->system = 'System';
$lang->admin->entry = 'Application';
+3
View File
@@ -196,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon} List";
$lang->kanban->common = 'Kanban';
$lang->backup->common = 'Backup';
$lang->action->trash = 'Recycle';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
$lang->personnel->common = 'Member';
$lang->personnel->invest = 'Investment';
@@ -282,6 +284,7 @@ $lang->devops->mr = 'Merge Request';
$lang->devops->repo = 'Repo';
$lang->devops->rules = 'Rule';
$lang->devops->settings = 'Setting Merge Request';
$lang->devops->set = 'Set';
$lang->admin->system = 'System';
$lang->admin->entry = 'Application';
+33 -28
View File
@@ -146,7 +146,7 @@ $lang->program->menuOrder[20] = 'stakeholder';
$lang->program->menu->personnel['subMenu'] = new stdClass();
$lang->program->menu->personnel['subMenu']->invest = array('link' => "{$lang->personnel->invest}|personnel|invest|programID=%s");
$lang->program->menu->personnel['subMenu']->accessible = array('link' => "{$lang->personnel->accessible}|personnel|accessible|programID=%s");
$lang->program->menu->personnel['subMenu']->whitelist = array('link' => "{$lang->whitelist}|personnel|whitelist|objectID=%s&module=program", 'alias' => 'addwhitelist');
$lang->program->menu->personnel['subMenu']->whitelist = array('link' => "{$lang->whitelist}|personnel|whitelist|objectID=%s", 'alias' => 'addwhitelist');
/* Product menu. */
$lang->product->homeMenu = new stdclass();
@@ -323,17 +323,18 @@ if($config->systemMode == 'new') $lang->execution->menu->more = array('link' =>
/* Execution menu order. */
$lang->execution->menuOrder[5] = 'task';
$lang->execution->menuOrder[10] = 'kanban';
$lang->execution->menuOrder[15] = 'burn';
$lang->execution->menuOrder[20] = 'view';
$lang->execution->menuOrder[25] = 'story';
$lang->execution->menuOrder[30] = 'qa';
$lang->execution->menuOrder[35] = 'repo';
$lang->execution->menuOrder[40] = 'devops';
$lang->execution->menuOrder[45] = 'doc';
$lang->execution->menuOrder[50] = 'build';
$lang->execution->menuOrder[55] = 'release';
$lang->execution->menuOrder[60] = 'action';
$lang->execution->menuOrder[65] = 'settings';
$lang->execution->menuOrder[15] = 'CFD';
$lang->execution->menuOrder[20] = 'burn';
$lang->execution->menuOrder[25] = 'view';
$lang->execution->menuOrder[30] = 'story';
$lang->execution->menuOrder[35] = 'qa';
$lang->execution->menuOrder[40] = 'repo';
$lang->execution->menuOrder[45] = 'devops';
$lang->execution->menuOrder[50] = 'doc';
$lang->execution->menuOrder[55] = 'build';
$lang->execution->menuOrder[60] = 'release';
$lang->execution->menuOrder[65] = 'action';
$lang->execution->menuOrder[70] = 'settings';
$lang->execution->menu->doc['subMenu'] = new stdclass();
@@ -393,24 +394,27 @@ $lang->qa->menuOrder[45] = 'automation';
$lang->qa->dividerMenu = ',bug,testtask,caselib,';
/* DevOps menu. */
$lang->devops->menu = new stdclass();
$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit');
$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse", 'subModule' => 'compile,job');
$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse|repoID=%s");
$lang->devops->menu->gitlab = array('link' => "GitLab|gitlab|browse", 'alias' => 'create,edit');
$lang->devops->menu->sonarqube = array('link' => "SonarQube|sonarqube|browse");
$lang->devops->menu->jenkins = array('link' => "Jenkins|jenkins|browse", 'alias' => 'create,edit');
$lang->devops->menu->maintain = array('link' => "{$lang->devops->repo}|repo|maintain", 'alias' => 'create,edit');
$lang->devops->menu->rules = array('link' => "{$lang->devops->rules}|repo|setrules");
$lang->devops->menu = new stdclass();
$lang->devops->menu->code = array('link' => "{$lang->repo->common}|repo|browse|repoID=%s", 'alias' => 'diff,view,revision,log,blame,showsynccommit');
$lang->devops->menu->mr = array('link' => "{$lang->devops->mr}|mr|browse|repoID=%s");
$lang->devops->menu->compile = array('link' => "{$lang->devops->compile}|job|browse|repoID=%s", 'subModule' => 'compile,job');
$lang->devops->menu->app = array('link' => "{$lang->app->common}|app|serverlink|%s");
$lang->devops->menu->set = array('link' => "{$lang->devops->set}|repo|maintain", 'subModule' => 'gitlab,jenkins,sonarqube', 'alias' => 'setrules,create,edit');
$lang->devops->menuOrder[5] = 'code';
$lang->devops->menuOrder[10] = 'compile';
$lang->devops->menuOrder[15] = 'mr';
$lang->devops->menuOrder[20] = 'gitlab';
$lang->devops->menuOrder[25] = 'sonarqube';
$lang->devops->menuOrder[30] = 'jenkins';
$lang->devops->menuOrder[35] = 'maintain';
$lang->devops->menuOrder[40] = 'rules';
$lang->devops->menuOrder[10] = 'mr';
$lang->devops->menuOrder[15] = 'compile';
$lang->devops->menuOrder[20] = 'app';
$lang->devops->menuOrder[25] = 'set';
$lang->devops->dividerMenu = ',set,';
$lang->devops->menu->set['subMenu'] = new stdclass();
$lang->devops->menu->set['subMenu']->repo = array('link' => "{$lang->devops->repo}|repo|maintain", 'alias' => 'create,edit');
$lang->devops->menu->set['subMenu']->gitlab = array('link' => 'GitLab|gitlab|browse', 'subModule' => 'gitlab');
$lang->devops->menu->set['subMenu']->jenkins = array('link' => 'Jenkins|jenkins|browse', 'subModule' => '');
$lang->devops->menu->set['subMenu']->sonarqube = array('link' => 'SonarQube|sonarqube|browse', 'subModule' => 'sonarqube');
$lang->devops->menu->set['subMenu']->setrules = array('link' => "{$lang->devops->rules}|repo|setrules");
/* Kanban menu. */
$lang->kanban->menu = new stdclass();
@@ -647,6 +651,7 @@ $lang->navGroup->compile = 'devops';
$lang->navGroup->ci = 'devops';
$lang->navGroup->svn = 'devops';
$lang->navGroup->git = 'devops';
$lang->navGroup->app = 'devops';
$lang->navGroup->company = 'system';
+11 -1
View File
@@ -124,7 +124,10 @@ $lang->typeAB = 'Loại';
$lang->nameAB = 'Name';
$lang->common = new stdclass();
$lang->common->common = 'Module chung';
$lang->common->common = 'Module chung';
$lang->devops->common = 'DevOps';
$lang->app->common = 'APP';
$lang->app->serverLink = 'Server Link';
global $config;
list($programModule, $programMethod) = explode('-', $config->programLink);
@@ -229,6 +232,13 @@ $lang->system->menu->calendar = array('link' => 'Calendar|my|calendar|', 'subMod
$lang->measurement = new stdclass();
$lang->measurement->menu = new stdclass();
$lang->devops->compile = 'Compile';
$lang->devops->mr = 'Merge Request';
$lang->devops->repo = 'Repo';
$lang->devops->rules = 'Rule';
$lang->devops->settings = 'Setting Merge Request';
$lang->devops->set = 'Set';
$lang->searchTips = '';
$lang->searchAB = 'Tìm ki?m';
+4 -1
View File
@@ -196,6 +196,8 @@ $lang->execution->list = "{$lang->executionCommon}列表";
$lang->kanban->common = '看板';
$lang->backup->common = '备份';
$lang->action->trash = '回收站';
$lang->app->common = '应用';
$lang->app->serverLink = '服务器链接';
$lang->personnel->common = '人员';
$lang->personnel->invest = '投入人员';
@@ -279,9 +281,10 @@ $lang->testcase->caselib = '用例库';
$lang->devops->compile = '构建';
$lang->devops->mr = '合并请求';
$lang->devops->repo = '版本库';
$lang->devops->repo = '代码库';
$lang->devops->rules = '指令';
$lang->devops->settings = '合并请求设置';
$lang->devops->set = '设置';
$lang->admin->system = '系统';
$lang->admin->entry = '应用';
+2
View File
@@ -181,6 +181,8 @@ $lang->stage->common = '階段';
$lang->stage->list = '階段列表';
$lang->execution->list = "{$lang->executionCommon}列表";
$lang->kanban->common = '看板';
$lang->app->common = '應用';
$lang->app->serverLink = '服務器鏈接';
$lang->personnel->common = '人員';
$lang->personnel->invest = '投入人員';
+63 -5
View File
@@ -28,6 +28,7 @@ class commonModel extends model
$this->sendHeader();
$this->setCompany();
$this->setUser();
$this->setApproval();
$this->loadConfigFromDB();
$this->app->setTimezone();
$this->loadCustomFromDB();
@@ -284,6 +285,18 @@ class commonModel extends model
}
}
/**
* Set approval config.
*
* @access public
* @return void
*/
public function setApproval()
{
$this->config->openedApproval = false;
if($this->config->edition == 'max' && $this->config->vision == 'rnd') $this->config->openedApproval = true;
}
/**
* Load configs from database and save it to config->system and config->personal.
*
@@ -1091,6 +1104,10 @@ class commonModel extends model
$executionID = $menuItem->link['vars'];
commonModel::buildMoreButton($executionID);
}
elseif($menuItem->link['module'] == 'app' and $menuItem->link['method'] == 'serverlink')
{
commonModel::buildAppButton();
}
else
{
if($menuItem->link)
@@ -1667,19 +1684,19 @@ EOD;
}
else
{
return html::a($link, "<i class='$class'></i>", $target, "class='btn btn-link $extraClass' title='$title' $misc", false);
return html::a($link, "<i class='$class'></i>", $target, "class='btn btn-link $extraClass' title=\"$title\" $misc", false);
}
}
else
{
return html::a($link, "<i class='$class'></i>", $target, "class='btn $extraClass' title='$title' $misc", false) . "\n";
return html::a($link, "<i class='$class'></i>", $target, "class='btn $extraClass' title=\"$title\" $misc", false) . "\n";
}
}
else
{
if($type == 'list')
{
return "<button type='button' class='disabled btn $extraClass'><i class='$class' title='$title' $misc></i></button>\n";
return "<button type='button' class='disabled btn $extraClass'><i class='$class' title=\"$title\" $misc></i></button>\n";
}
}
}
@@ -1733,6 +1750,45 @@ EOD;
echo $html;
}
/**
* Build devops app button.
*
* @static
* @access public
* @return void
*/
public static function buildAppButton()
{
if(defined('TUTORIAL')) return;
global $app, $config, $lang;
$pipelinePairs = array();
$condition = '';
if(!$app->user->admin)
{
$types = '';
foreach($config->pipelineTypeList as $pipelineType)
{
if(commonModel::hasPriv($pipelineType, 'browse')) $types .= "'$pipelineType',";
}
if(empty($types)) return;
$condition .= ' AND `type` in (' . trim($types, ',') . ')';
}
$pipelineList = $app->dbh->query("SELECT type,name,url FROM " . TABLE_PIPELINE . " WHERE `deleted` = '0' $condition order by type")->fetchAll();
if(empty($pipelineList)) return;
$html = "<li class='dropdown dropdown-hover'><a href='javascript:;' data-toggle='dropdown'>{$lang->app->common}<span class='caret'></span></a>";
$html .= "<ul class='dropdown-menu'>";
foreach($pipelineList as $pipeline)
{
$html .= "<li style='max-width: 300px;'>" . html::a($pipeline->url, "[{$pipeline->type}] {$pipeline->name}", '', "title='{$pipeline->name}' class='text-ellipsis' style='padding: 2px 10px' target='_blank'") . '</li>';
}
$html .= "</ul></li>\n";
echo $html;
}
/**
* Print link icon.
*
@@ -1796,18 +1852,20 @@ EOD;
* Print back link
*
* @param string $backLink
* @param string $class
* @param string $misc
* @static
* @access public
* @return void
*/
static public function printBack($backLink, $class = '')
static public function printBack($backLink, $class = '', $misc = '')
{
global $lang, $app;
if(isonlybody()) return false;
if(empty($class)) $class = 'btn';
$title = $lang->goback . $lang->backShortcutKey;
echo html::a($backLink, '<i class="icon-goback icon-back"></i> ' . $lang->goback, '', "id='back' class='{$class}' title={$title} data-app='{$app->tab}'");
echo html::a($backLink, '<i class="icon-goback icon-back"></i> ' . $lang->goback, '', "id='back' class='{$class}' title={$title} $misc");
}
/**
+1 -1
View File
@@ -50,7 +50,7 @@
<ol class='histories-list'>
<?php $i = 1; ?>
<?php foreach($actions as $action):?>
<?php $canEditComment = ((!isset($canBeChanged) or !empty($canBeChanged)) and end($actions) == $action and trim($action->comment) != '' and $this->methodName == 'view' and $action->actor == $this->app->user->account and common::hasPriv('action', 'editComment'));?>
<?php $canEditComment = ((!isset($canBeChanged) or !empty($canBeChanged)) and end($actions) == $action and trim($action->comment) != '' and strpos(',view,objectlibs,viewcard,', ",$this->methodName,") !== false and $action->actor == $this->app->user->account and common::hasPriv('action', 'editComment'));?>
<li value='<?php echo $i ++;?>'>
<?php
$action->actor = zget($users, $action->actor);
+13 -1
View File
@@ -16,10 +16,12 @@
#formSettingForm .checkboxes {padding: 10px 3px;}
#formSettingForm .checkbox-primary {width: 50%; float: left; margin: 3px 0;}
#formSetting .btn {margin-right: 8px;}
[lang^='de'] #formSetting {min-width: 360px;}
[lang^='fr'] #formSetting {min-width: 320px;}
</style>
<button type="button" title="<?php echo $lang->customField;?>" class="btn btn-link" id="customField" data-toggle="dropdown"><i class="icon icon-cog"></i></button>
<div class="dropdown-menu pull-right" id="formSetting">
<form class='with-padding load-indicator' id='formSettingForm' method='post' target='hiddenwin' action='<?php echo $customLink?>'>
<form class='with-padding load-indicator not-watch' id='formSettingForm' method='post' target='hiddenwin' action='<?php echo $customLink?>'>
<div><?php echo $lang->customField;?></div>
<div class="clearfix checkboxes">
<?php echo html::checkbox('fields', $customFields, $showFields);?>
@@ -35,6 +37,16 @@
var $formSetting = $('#formSetting');
$formSetting.on('click', '.close-dropdown', function()
{
if(showFields != undefined)
{
var fieldList = ',' + showFields + ',';
$('#formSettingForm > .checkboxes > .checkbox-primary > input:visible').each(function()
{
var field = ',' + $(this).val() + ',';
$(this).prop('checked', fieldList.indexOf(field) >= 0);
});
}
$formSetting.parent().removeClass('open');
}).on('click', function(e){e.stopPropagation()});
</script>
+8
View File
@@ -25,7 +25,15 @@ $(function()
{
if(!rowTpl) rowTpl = $('#trTemp tbody').html();
if(!$formTbody) $formTbody = $form.find('table > tbody');
var lastIndex = parseInt($formTbody.find('tr:last > td:first').text());
var moduleArr = ['task', 'story', 'bug', 'testcase'];
if($.inArray(config.currentModule, moduleArr) >= 0 && config.currentMethod == 'batchcreate')
{
lastIndex = itemIndex;
itemIndex ++;
}
var $newRow = $(rowTpl.replace(/%s/g, lastIndex + 1));
$newRow.find('.chosen').chosen();
$newRow.find('.iframe').modalTrigger({iframe:true});
+14 -5
View File
@@ -22,12 +22,13 @@ class compile extends control
public function __construct($moduleName = '', $methodName = '')
{
parent::__construct($moduleName, $methodName);
$this->loadModel('ci')->setMenu();
if($methodName != 'browse') $this->loadModel('ci')->setMenu();
}
/**
* Browse jenkins build.
*
* @param int $repoID
* @param int $jobID
* @param string $orderBy
* @param int $recTotal
@@ -36,8 +37,17 @@ class compile extends control
* @access public
* @return void
*/
public function browse($jobID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
public function browse($repoID = 0, $jobID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
if($jobID)
{
$job = $this->loadModel('job')->getById($jobID);
$repoID = $job->repo;
$this->view->job = $job;
}
$this->loadModel('ci')->setMenu($repoID);
$this->app->loadClass('pager', $static = true);
$pager = new pager($recTotal, $recPerPage, $pageID);
@@ -45,10 +55,9 @@ class compile extends control
$this->view->position[] = html::a($this->createLink('job', 'browse'), $this->lang->ci->job);
$this->view->position[] = $this->lang->compile->browse;
$this->loadModel('job');
if($jobID) $this->view->job = $this->job->getById($jobID);
$this->view->repoID = $repoID;
$this->view->jobID = $jobID;
$this->view->buildList = $this->compile->getList($jobID, $orderBy, $pager);
$this->view->buildList = $this->compile->getList($repoID, $jobID, $orderBy, $pager);
$this->view->orderBy = $orderBy;
$this->view->pager = $pager;
$this->display();

Some files were not shown because too many files have changed in this diff Show More