Merge branch 'fixbug'

This commit is contained in:
wangyidong
2022-07-01 08:17:26 +08:00
153 changed files with 914 additions and 332 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
+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';
+17 -9
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,
@@ -705,7 +705,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 +1397,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 '',
@@ -6140,6 +6142,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 +6169,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 +6202,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 +6222,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 +6254,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 +6264,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 +8534,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 +8598,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 +8643,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 +13493,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';
?>
@@ -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';
@@ -0,0 +1,3 @@
<script>
$("#createCaseActionMenu a[href=#toBug]").remove();
</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';
@@ -37,7 +37,7 @@ $('#toStoryLink').click(function()
$('#toStoryButtonByProject').click(function()
{
var onlybody = config.onlybody == 'yes';
var projectID = $('#projectToStory').val();
var projectID = $('#projectToStory').val();
var link = createLink('story', 'create', 'productID=0&branch=0&moduleID=0&storyID=0&projectID=' + projectID + '&bugID=0&planID=0&todoID=' + todoID, config.defaultView, onlybody);
if(!onlybody) window.parent.$.apps.open(link, 'project');
@@ -75,4 +75,4 @@ function createProject()
config.onlybody = onlybody;
parent.location.href = link;
}
</script>
</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,4 +1,3 @@
<script>
$('#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 +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/workflowdatasource/ext/view/' . basename(__FILE__);?>
@@ -3,4 +3,3 @@ $('#submit').after('<input type="hidden" id="vision" name="vision" value="<?php
$("#name").parent().addClass('required');
$("#datasource").addClass('required');
</script>
<?php include $this->app->getExtensionRoot() . 'biz/workflowdatasource/ext/view/' . basename(__FILE__);?>
@@ -1 +0,0 @@
<?php include $this->app->getExtensionRoot() . 'biz/workflowdatasource/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 +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>
+8 -8
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)
{
+1
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();
@@ -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>
+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;
?>
+7
View File
@@ -2259,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)";
+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;}
+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;
+2 -2
View File
@@ -3204,11 +3204,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;
+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);
+1
View File
@@ -281,6 +281,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')
{
+1 -1
View File
@@ -353,7 +353,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';
+1 -1
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();
+20 -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.
*
@@ -1667,19 +1680,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";
}
}
}
@@ -1796,18 +1809,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);
+3 -1
View File
@@ -701,8 +701,10 @@ class customModel extends model
}
}
$vision = $this->config->vision;
$this->loadModel('setting');
$this->setting->setItems("system.{$moduleName}", $requiredFields);
$this->setting->setItems("system.{$moduleName}@$vision", $requiredFields);
}
/**
+1
View File
@@ -3,6 +3,7 @@
.searchBox .srearch-date{float: left; width: 20%}
.searchBox h4{float:left;display: inline-block}
.searchBox span{float:left;line-height:30px}
.body-modal .main-header {z-index: 5;}
#logForm .table thead th{background: #efefef}
#begin{margin-right:5px}
#end{margin-left:5px}
+4 -3
View File
@@ -21,9 +21,10 @@ $config->doc->custom->objectLibs = $config->doc->customObjectLibs;
$config->doc->custom->showLibs = 'zero,children';
$config->doc->editor = new stdclass();
$config->doc->editor->create = array('id' => 'content', 'tools' => 'fullTools');
$config->doc->editor->edit = array('id' => 'content', 'tools' => 'fullTools');
$config->doc->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simple');
$config->doc->editor->create = array('id' => 'content', 'tools' => 'fullTools');
$config->doc->editor->edit = array('id' => 'content', 'tools' => 'fullTools');
$config->doc->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simple');
$config->doc->editor->objectlibs = array('id' => 'comment,lastComment', 'tools' => 'simple');
$config->doc->markdown = new stdclass();
$config->doc->markdown->create = array('id' => 'contentMarkdown', 'tools' => 'withchange');
+1
View File
@@ -483,6 +483,7 @@ class doc extends control
$this->view->moduleOptionMenu = $this->tree->getOptionMenu($libID, 'doc', $startModuleID = 0);
$this->view->type = $type;
$this->view->libs = $this->doc->getLibs('all', $extra = 'withObject|noBook', $libID, $objectID);
$this->view->lib = $lib;
$this->view->groups = $this->loadModel('group')->getPairs();
$this->view->users = $this->user->getPairs('noletter|noclosed|nodeleted', $doc->users);
$this->display();
+1 -1
View File
@@ -50,7 +50,7 @@ function toggleAcl(acl, type)
var notice = typeof(noticeAcl[libType][acl]) != 'undefined' ? noticeAcl[libType][acl] : '';
$('#noticeAcl').html(notice);
if((libType == 'custom' || libType == 'api') && acl == 'private') $('#whiteListBox').addClass('hidden');
if((libType == 'custom' || libType == 'api' || libType == 'book') && acl == 'private') $('#whiteListBox').addClass('hidden');
if(libType == 'project' && typeof(doclibID) != 'undefined')
{
+1 -1
View File
@@ -169,7 +169,7 @@ function loadWhitelist(libID)
$('#aclcustom').parent('.radio-inline').removeClass('hidden');
$('#users').replaceWith(users);
$('#user').next('.picker').remove();
$('#users').next('.picker').remove();
$('#users').picker();
}
});
+4 -4
View File
@@ -48,7 +48,7 @@ $lang->doc->common = 'Dok';
$lang->doc->id = 'ID';
$lang->doc->product = $lang->productCommon;
$lang->doc->project = 'Project';
$lang->doc->execution = $lang->executionCommon;
$lang->doc->execution = $lang->execution->common;
$lang->doc->lib = 'Bibliothek';
$lang->doc->module = 'Modul';
$lang->doc->object = 'Object';
@@ -161,7 +161,7 @@ $lang->doc->allProjects = 'All' . $lang->projectCommon . 's';
$lang->doc->libTypeList['product'] = $lang->productCommon . ' Bibliothek';
if($config->systemMode == 'new') $lang->doc->libTypeList['project'] = 'Project Library';
$lang->doc->libTypeList['execution'] = $lang->executionCommon . ' Bibliothek';
$lang->doc->libTypeList['execution'] = $lang->execution->common . ' Bibliothek';
$lang->doc->libTypeList['api'] = 'API Library';
$lang->doc->libTypeList['custom'] = 'Eigene Bibliothek';
@@ -251,8 +251,8 @@ $lang->doc->noticeAcl['lib']['project']['default'] = 'Users who can access the
$lang->doc->noticeAcl['lib']['project']['open'] = 'Users who can access the selected project can access it.';
$lang->doc->noticeAcl['lib']['project']['private'] = 'Users who can access the selected project or users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users who can access the selected project or users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['execution']['default'] = "Users who can access the selected {$lang->executionCommon} can access it.";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "Users who can access the selected {$lang->executionCommon} or users in the whiltelist can access it.";
$lang->doc->noticeAcl['lib']['execution']['default'] = "Users who can access the selected {$lang->execution->common} can access it.";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "Users who can access the selected {$lang->execution->common} or users in the whiltelist can access it.";
$lang->doc->noticeAcl['lib']['api']['open'] = 'All users can access it.';
$lang->doc->noticeAcl['lib']['api']['custom'] = 'Users in the whitelist can access it.';
$lang->doc->noticeAcl['lib']['api']['private'] = 'Only the one who created it can access it.';
+2 -2
View File
@@ -251,8 +251,8 @@ $lang->doc->noticeAcl['lib']['project']['default'] = 'Users who can access the
$lang->doc->noticeAcl['lib']['project']['open'] = 'Users who can access the selected project can access it.';
$lang->doc->noticeAcl['lib']['project']['private'] = 'Users who can access the selected project or users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['execution']['default'] = "Users who can access the selected {$lang->executionCommon} can access it.";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "Users who can access the selected {$lang->executionCommon} or users in the whiltelist can access it.";
$lang->doc->noticeAcl['lib']['execution']['default'] = "Users who can access the selected {$lang->execution->common} can access it.";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "Users who can access the selected {$lang->execution->common} or users in the whiltelist can access it.";
$lang->doc->noticeAcl['lib']['api']['open'] = 'All users can access it.';
$lang->doc->noticeAcl['lib']['api']['custom'] = 'Users in the whitelist can access it.';
$lang->doc->noticeAcl['lib']['api']['private'] = 'Only the one who created it can access it.';
+4 -4
View File
@@ -48,7 +48,7 @@ $lang->doc->common = 'Gestion Documentaire';
$lang->doc->id = 'ID';
$lang->doc->product = $lang->productCommon;
$lang->doc->project = 'Project';
$lang->doc->execution = $lang->executionCommon;
$lang->doc->execution = $lang->execution->common;
$lang->doc->lib = 'Bibliothèque';
$lang->doc->module = 'Catégorie';
$lang->doc->object = 'Object';
@@ -161,7 +161,7 @@ $lang->doc->allProjects = 'All' . $lang->projectCommon . 's';
$lang->doc->libTypeList['product'] = $lang->productCommon . ' Library';
if($config->systemMode == 'new') $lang->doc->libTypeList['project'] = 'Project Library';
$lang->doc->libTypeList['execution'] = 'Bibliothèque ' . $lang->executionCommon;
$lang->doc->libTypeList['execution'] = 'Bibliothèque ' . $lang->execution->common;
$lang->doc->libTypeList['api'] = 'API Library';
$lang->doc->libTypeList['custom'] = 'Bib. Personnalisée';
@@ -251,8 +251,8 @@ $lang->doc->noticeAcl['lib']['project']['default'] = 'Les utilisateurs qui ont
$lang->doc->noticeAcl['lib']['project']['open'] = 'Users who can access the selected project can access it.';
$lang->doc->noticeAcl['lib']['project']['private'] = 'Users who can access the selected project or users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['project']['custom'] = 'Les utilisateurs qui ont accès au Projet ou les utilisateurs de la Liste Blanche peuvent y accéder.';
$lang->doc->noticeAcl['lib']['execution']['default'] = "Les utilisateurs qui ont accès au {$lang->executionCommon} peuvent y accéder.";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "Les utilisateurs qui ont accès au {$lang->executionCommon} ou les utilisateurs de la Liste Blanche peuvent y accéder.";
$lang->doc->noticeAcl['lib']['execution']['default'] = "Les utilisateurs qui ont accès au {$lang->execution->common} peuvent y accéder.";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "Les utilisateurs qui ont accès au {$lang->execution->common} ou les utilisateurs de la Liste Blanche peuvent y accéder.";
$lang->doc->noticeAcl['lib']['api']['open'] = 'All users can access it.';
$lang->doc->noticeAcl['lib']['api']['custom'] = 'Users in the whitelist can access it.';
$lang->doc->noticeAcl['lib']['api']['private'] = 'Only the one who created it can access it.';
+2 -2
View File
@@ -251,8 +251,8 @@ $lang->doc->noticeAcl['lib']['project']['default'] = "有所选项目访问权
$lang->doc->noticeAcl['lib']['project']['open'] = "有所选项目访问权限的用户可以访问。";
$lang->doc->noticeAcl['lib']['project']['private'] = "有所选项目访问权限或白名单里的用户可以访问。";
$lang->doc->noticeAcl['lib']['project']['custom'] = "白名单的用户可以访问。";
$lang->doc->noticeAcl['lib']['execution']['default'] = "有所选{$lang->executionCommon}访问权限的用户可以访问。";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "有所选{$lang->executionCommon}访问权限或白名单里的用户可以访问。";
$lang->doc->noticeAcl['lib']['execution']['default'] = "有所选{$lang->execution->common}访问权限的用户可以访问。";
$lang->doc->noticeAcl['lib']['execution']['custom'] = "有所选{$lang->execution->common}访问权限或白名单里的用户可以访问。";
$lang->doc->noticeAcl['lib']['api']['open'] = '所有人都可以访问。';
$lang->doc->noticeAcl['lib']['api']['custom'] = '白名单的用户可以访问。';
$lang->doc->noticeAcl['lib']['api']['private'] = '只有创建者自己可以访问。';
+3 -2
View File
@@ -83,8 +83,9 @@
<tr>
<th><?php echo $lang->doclib->control;?></th>
<td colspan='2'>
<?php echo html::radio('acl', $lang->doc->aclList, $doc->acl, "onchange='toggleAcl(this.value, \"doc\")'")?>
<span class='text-info' id='noticeAcl'><?php echo $lang->doc->noticeAcl['doc'][$doc->acl];?></span>
<?php $acl = $lib->acl == 'private' ? 'private' : $doc->acl;?>
<?php echo html::radio('acl', $lang->doc->aclList, $acl, "onchange='toggleAcl(this.value, \"doc\")'")?>
<span class='text-info' id='noticeAcl'><?php echo $lang->doc->noticeAcl['doc'][$acl];?></span>
</td>
</tr>
<tr id='whiteListBox' class='hidden'>
+1
View File
@@ -11,6 +11,7 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/kindeditor.html.php';?>
<?php if($app->tab == 'execution'):;?>
<style>.panel-body{min-height: 180px}</style>
<?php endif;?>
+3
View File
@@ -984,6 +984,9 @@ class execution extends control
$showModule = !empty($this->config->datatable->bugBrowse->showModule) ? $this->config->datatable->bugBrowse->showModule : '';
/* Process the openedBuild and resolvedBuild fields. */
$bugs = $this->bug->processBuildForBugs($bugs);
/* Assign. */
$this->view->title = $title;
$this->view->position = $position;
+2 -2
View File
@@ -380,8 +380,8 @@ $lang->execution->errorBegin = "The start time of {$lang->execu
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
$lang->execution->errorLetterProject = "The start time of stage cannot be less than the start time of the project %s.";
$lang->execution->errorGreaterProject = "The end time of stage cannot be greater than the end time %s of the project.";
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' "%s" should be ≥ the start date of project %s: %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' "%s" should be ≤ the deadline of project %s: %s.';
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
$lang->execution->accessDenied = "Zugriff zu {$lang->executionCommon} verweigert!";
$lang->execution->tips = 'Hinweis';
$lang->execution->afterInfo = "{$lang->executionCommon} wurde erstellt. Als nächstes können Sie ";
+2 -2
View File
@@ -380,8 +380,8 @@ $lang->execution->errorBegin = "The start time of {$lang->execu
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
$lang->execution->errorLetterProject = "The start time of stage cannot be less than the start time of the project %s.";
$lang->execution->errorGreaterProject = "The end time of stage cannot be greater than the end time %s of the project.";
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' "%s" should be ≥ the start date of project "%s": %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' "%s" should be ≤ the deadline of project "%s": %s.';
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
$lang->execution->accessDenied = "Your access to {$lang->executionCommon} is denied!";
$lang->execution->tips = 'Note';
$lang->execution->afterInfo = "{$lang->executionCommon} is created. Next you can ";
+8 -8
View File
@@ -284,16 +284,19 @@ $lang->execution->taskKanban = 'Task Kanban';
$lang->execution->RDKanban = 'Research & Development Kanban';
/* Group browsing. */
$lang->execution->allTasks = 'Voir Toutes';
$lang->execution->allTasks = 'Toutes';
$lang->execution->assignedToMe = 'à Moi';
$lang->execution->myInvolved = "Où j'ai participé";
$lang->execution->assignedByMe = 'AssignedByMe';
$lang->execution->myInvolved = "Ma part";
$lang->execution->assignedByMe = 'Assignée par moi';
$lang->execution->statusSelects[''] = 'Plus...';
$lang->execution->statusSelects['wait'] = 'En Attente';
$lang->execution->statusSelects['doing'] = 'En Cours';
$lang->execution->statusSelects['undone'] = 'Non terminées';
$lang->execution->statusSelects['myinvolved'] = $lang->execution->myInvolved;
$lang->execution->statusSelects['finishedbyme'] = 'Terminées par moi';
$lang->execution->statusSelects['assignedbyme'] = $lang->execution->assignedByMe;
$lang->execution->statusSelects['needconfirm'] = 'A confirmer';
$lang->execution->statusSelects['done'] = 'Faites';
$lang->execution->statusSelects['closed'] = 'Fermées';
$lang->execution->statusSelects['cancel'] = 'Annulées';
@@ -380,8 +383,8 @@ $lang->execution->errorBegin = "The start time of {$lang->execu
$lang->execution->errorEnd = "The end time of {$lang->executionCommon} cannot be greater than the end time %s of the project.";
$lang->execution->errorLetterProject = "The start time of stage cannot be less than the start time of the project %s.";
$lang->execution->errorGreaterProject = "The end time of stage cannot be greater than the end time %s of the project.";
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' "%s" should be ≥ the start date of project %s: %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' "%s" should be ≤ the deadline of project %s: %s.';
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
$lang->execution->accessDenied = "Votre accès au {$lang->executionCommon} est refusé ! Désolé.";
$lang->execution->tips = 'Note';
$lang->execution->afterInfo = "Le {$lang->executionCommon} a été créé avec succès ! Ensuite vous pouvez ";
@@ -476,9 +479,6 @@ $lang->execution->typeList['kanban'] = 'Kanban';
$lang->execution->featureBar['task']['all'] = $lang->execution->allTasks;
$lang->execution->featureBar['task']['unclosed'] = $lang->execution->unclosed;
$lang->execution->featureBar['task']['assignedtome'] = $lang->execution->assignedToMe;
$lang->execution->featureBar['task']['myinvolved'] = $lang->execution->myInvolved;
$lang->execution->featureBar['task']['assignedbyme'] = $lang->execution->assignedByMe;
$lang->execution->featureBar['task']['needconfirm'] = 'A confirmer';
$lang->execution->featureBar['task']['status'] = $lang->execution->statusSelects[''];
$lang->execution->featureBar['all']['all'] = $lang->execution->all;
+2
View File
@@ -337,6 +337,8 @@ $lang->execution->unfinishedExecution = "This {$lang->executionCommon} h
$lang->execution->unfinishedTask = "[%s] unfinished tasks. ";
$lang->execution->unresolvedBug = "[%s] unresolved bugs. ";
$lang->execution->projectNotEmpty = 'Project cannot be empty.';
$lang->execution->errorCommonBegin = 'The start date of ' . $lang->executionCommon . ' should be ≥ the start date of project : %s.';
$lang->execution->errorCommonEnd = 'The deadline of ' . $lang->executionCommon . ' should be ≤ the deadline of project : %s.';
/* Statistics. */
$lang->execution->charts = new stdclass();
+2 -2
View File
@@ -380,8 +380,8 @@ $lang->execution->errorBegin = "{$lang->executionCommon}的开
$lang->execution->errorEnd = "{$lang->executionCommon}的截止时间不能大于所属项目的结束时间%s。";
$lang->execution->errorLetterProject = "阶段的计划开始时间不能小于所属项目的计划开始时间%s。";
$lang->execution->errorGreaterProject = "阶段的计划完成时间不能大于所属项目的计划完成时间%s。";
$lang->execution->errorCommonBegin = $lang->executionCommon . '“%s”开始日期应大于等于项目“%s”的开始日期:%s。';
$lang->execution->errorCommonEnd = $lang->executionCommon . '“%s”截止日期应小于等于项目“%s”的截止日期:%s。';
$lang->execution->errorCommonBegin = $lang->executionCommon . '开始日期应大于等于项目的开始日期:%s。';
$lang->execution->errorCommonEnd = $lang->executionCommon . '截止日期应小于等于项目的截止日期:%s。';
$lang->execution->accessDenied = "您无权访问该{$lang->executionCommon}!";
$lang->execution->tips = '提示';
$lang->execution->afterInfo = "{$lang->executionCommon}添加成功,您现在可以进行以下操作:";
+6 -7
View File
@@ -305,7 +305,7 @@ class executionModel extends model
return false;
}
if($this->config->systemMode == 'new') $this->checkBeginAndEndDate($_POST['project'], $_POST['begin'], $_POST['end'], $_POST['name']);
if($this->config->systemMode == 'new') $this->checkBeginAndEndDate($_POST['project'], $_POST['begin'], $_POST['end']);
if(dao::isError()) return false;
/* Determine whether to add a sprint or a stage according to the model of the execution. */
@@ -500,7 +500,7 @@ class executionModel extends model
if(in_array($execution->status, array('closed', 'suspended'))) $this->computeBurn($executionID);
if($this->config->systemMode == 'new' and (empty($execution->project) or $execution->project == $oldExecution->project)) $this->checkBeginAndEndDate($oldExecution->project, $execution->begin, $execution->end, $execution->name);
if($this->config->systemMode == 'new' and (empty($execution->project) or $execution->project == $oldExecution->project)) $this->checkBeginAndEndDate($oldExecution->project, $execution->begin, $execution->end);
if(dao::isError()) return false;
/* Child stage inherits parent stage permissions. */
@@ -869,7 +869,7 @@ class executionModel extends model
->remove('comment')
->get();
if($this->config->systemMode == 'new') $this->checkBeginAndEndDate($oldExecution->project, $execution->begin, $execution->end, $oldExecution->name);
if($this->config->systemMode == 'new') $this->checkBeginAndEndDate($oldExecution->project, $execution->begin, $execution->end);
if(dao::isError()) return false;
$execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->putoff['id'], $this->post->uid);
@@ -1117,16 +1117,15 @@ class executionModel extends model
* @param int $projectID
* @param string $begin
* @param string $end
* @param string $executionName
* @access public
* @return void
*/
public function checkBeginAndEndDate($projectID, $begin, $end, $executionName)
public function checkBeginAndEndDate($projectID, $begin, $end)
{
$project = $this->loadModel('project')->getByID($projectID);
if($begin < $project->begin) dao::$errors['begin'] = sprintf($this->lang->execution->errorCommonBegin, $executionName, $project->name, $project->begin);
if($end > $project->end) dao::$errors['end'] = sprintf($this->lang->execution->errorCommonEnd, $executionName, $project->name, $project->end);
if($begin < $project->begin) dao::$errors['begin'] = sprintf($this->lang->execution->errorCommonBegin, $project->begin);
if($end > $project->end) dao::$errors['end'] = sprintf($this->lang->execution->errorCommonEnd, $project->end);
}
/*
+1 -1
View File
@@ -3,7 +3,7 @@
<h2 class="detail-title">
<span class="label-id taskID"><?php echo $task->id?></span>
<span class="label <?php echo "status-{$task->status}";?>"><?php echo $this->processStatus('task', $task);?></span>
<span class="title">
<span>
<?php if($task->parent > 0) echo '<span class="label no-margin label-badge label-light">' . $this->lang->task->childrenAB . '</span>';?>
<?php if(!empty($task->team)) echo '<span class="label no-margin label-badge label-light">' . $this->lang->task->multipleAB . '</span>';?>
<?php echo isset($task->parentName) ? $task->parentName . '/' : '';?><?php echo $task->name;?>
+1 -1
View File
@@ -49,7 +49,7 @@ body.menu-hide {padding-left: 0;}
.app-container {position: absolute; left: 0; bottom: 40px; right: 0; top: 0; background-color: #efefef;}
.menu-hide #apps {left: 40px;}
.app-container.loading:before {background-color: rgba(0,0,0,.1);}
.app-container.loading:before, .app-container.loading::after {transition-delay: 1s;}
.app-container.loading:before, .app-container.loading::after {transition-delay: 3s;}
#appsBar {position: fixed; left: 96px; bottom: 0; right: 0; height: 40px; z-index: 1012; background: #fff; border-top: 1px solid #eff1f7;}
.menu-hide #appsBar {left: 40px;}
+1
View File
@@ -1 +1,2 @@
#apps { left: 106px;}
#menu { width: 106px;}
+1 -1
View File
@@ -463,7 +463,7 @@
{
app.$app.removeClass('loading');
app._loadTimer = null;
}, 10000);
}, 15000);
}
/**
+1 -1
View File
@@ -40,7 +40,7 @@ $config->kanban->editor->createcard = array('id' => 'desc', 'tools' => 'simpl
$config->kanban->editor->activate = array('id' => 'comment', 'tools' => 'simpleTools');
$config->kanban->editor->close = array('id' => 'comment', 'tools' => 'simpleTools');
$config->kanban->editor->editcard = array('id' => 'desc', 'tools' => 'simpleTools');
$config->kanban->editor->viewcard = array('id' => 'comment', 'tools' => 'simpleTools');
$config->kanban->editor->viewcard = array('id' => 'comment,lastComment', 'tools' => 'simpleTools');
$config->kanban->editor->activatecard = array('id' => 'comment', 'tools' => 'simpleTools');
$config->kanban->fromType = array('execution', 'productplan', 'release', 'build');
+1 -2
View File
@@ -1433,8 +1433,7 @@ class kanban extends control
if(isonlybody()) return print(js::reload('parent.parent'));
$card = $this->kanban->getCardByID($cardID);
$kanbanGroup = $this->kanban->getKanbanData($card->kanban, $card->region);
$kanbanGroup = $this->kanban->getKanbanData($card->kanban, $card->region);
$kanbanGroupParam = json_encode($kanbanGroup);
return print("<script>parent.updateRegion({$card->region}, $kanbanGroupParam)</script>");
}
+1
View File
@@ -1,3 +1,4 @@
#mainContent {padding-left: 0px; height: 500px;}
#contactListMenu_chosen {vertical-align: unset;}
#teamBox .input-group .input-group-btn {vertical-align: top;}
.chosen-container .chosen-results {max-height: 200px;}
+27 -1
View File
@@ -1479,6 +1479,19 @@ class kanbanModel extends model
if($browseType == 'bug') $cardList = $this->loadModel('bug')->getExecutionBugs($executionID);
if($browseType == 'task') $cardList = $this->loadModel('execution')->getKanbanTasks($executionID, "id");
if($browseType == 'task' and $groupBy == 'assignedTo')
{
foreach($cardList as $id => $task)
{
if($task->mode == 'multi')
{
$task->team = $this->dao->select('t1.account,t2.realname')->from(TABLE_TEAM)->alias('t1')
->leftJoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account')
->where('t1.root')->eq($id)->andWhere('t1.type')->eq('task')->orderBy('t1.order')->fetchPairs('account');
}
}
}
/* Get objects cards menus. */
if($browseType == 'story') $storyCardMenu = $this->getKanbanCardMenu($executionID, $cardList, 'story');
if($browseType == 'bug') $bugCardMenu = $this->getKanbanCardMenu($executionID, $cardList, 'bug');
@@ -1564,7 +1577,12 @@ class kanbanModel extends model
$cardData = array();
if(in_array($groupBy, array('module', 'story', 'pri', 'severity')) and (int)$object->$groupBy !== $laneID) continue;
if(in_array($groupBy, array('assignedTo', 'type', 'category', 'source')) and $object->$groupBy !== $laneID) continue;
if(in_array($groupBy, array('type', 'category', 'source')) and $object->$groupBy !== $laneID) continue;
if($groupBy == 'assignedTo')
{
if(empty($object->team) and $object->$groupBy !== $laneID) continue;
if(!empty($object->team) and !in_array($laneID, array_keys($object->team), true)) continue;
}
$cardData['id'] = $object->id;
$cardData['order'] = $cardOrder;
@@ -1625,6 +1643,14 @@ class kanbanModel extends model
foreach($cardList as $item)
{
if(!isset($groupByList[$item->$groupBy])) $groupByList[$item->$groupBy] = $item->$groupBy;
if($groupBy == 'assignedTo' and !empty($item->team))
{
foreach($item->team as $account => $name)
{
if(!isset($groupByList[$account])) $groupByList[$account] = $account;
}
}
}
if(in_array($groupBy, array('module', 'story', 'assignedTo')))
+2 -2
View File
@@ -108,8 +108,8 @@
$disabled = $case->status == 'wait' ? 'disabled' : '';
common::printIcon('testcase', 'createBug', "product=$case->product&branch=$case->branch&extra=caseID=$caseID,version=$case->version,runID=$runID", $case, 'list', 'bug', '', 'iframe', 'true', "data-app='qa' data-toggle=''");
common::printIcon('testcase', 'create', "productID=$case->product&branch=$case->branch&moduleID=$case->module&from={$app->rawMethod}&param=$caseID", $case, 'list', 'copy', '', 'iframe', true, "data-width='95%'");
common::printIcon('testtask', 'runCase', "runID=$runID&caseID=$caseID&version=$case->version", '', 'list', 'play', '', "iframe $disabled", true, "data-width='95%'", '', $case->project);
common::printIcon('testtask', 'results', "runID=$runID&caseID=$caseID", '', 'list', 'list-alt', '', 'iframe', true, "data-width='95%'", '', $case->project);
common::printIcon('testtask', 'runCase', "runID=0&caseID=$caseID&version=$case->version", '', 'list', 'play', '', "iframe $disabled", true, "data-width='95%'", '', $case->project);
common::printIcon('testtask', 'results', "runID=0&caseID=$caseID", '', 'list', 'list-alt', '', 'iframe', true, "data-width='95%'", '', $case->project);
common::printIcon('testcase', 'edit', "caseID=$caseID", $case, 'list', 'edit', '', 'iframe', true, "data-width='95%'", '', $case->project);
}
?>
+1
View File
@@ -58,6 +58,7 @@
<td title="<?php echo $user->email;?>"><?php echo $user->email;?></td>
<td class='c-actions'>
<?php
if($this->app->tab == 'program') $module = 'program';
if(common::hasPriv($module, 'unbindWhitelist')) echo html::a($this->createLink($module, 'unbindWhitelist', "id=$user->id&confirm=no"), '<i class="icon-unlink"></i>', 'hiddenwin', "title='{$lang->personnel->delete}' class='btn' $tab");
?>
</td>
+6 -6
View File
@@ -148,18 +148,18 @@ class product extends control
}
/* Set menu. */
if($this->app->tab == 'product')
if($this->app->tab == 'project')
{
$this->session->set('storyList', $this->app->getURI(true), 'project');
$this->loadModel('project')->setMenu($projectID);
}
else
{
$this->session->set('storyList', $this->app->getURI(true), 'product');
$this->session->set('productList', $this->app->getURI(true), 'product');
$this->product->setMenu($productID, $branch, 0, '', "storyType=$storyType");
}
if($this->app->tab == 'project')
{
$this->session->set('storyList', $this->app->getURI(true), 'project');
$this->loadModel('project')->setMenu($projectID);
}
/* Lower browse type. */
$browseType = strtolower($browseType);
+40 -4
View File
@@ -60,12 +60,19 @@ $(function()
});
}
/* Add a statistics prompt statement after the Edit button */
/**
* Add a statistics prompt statement after the Edit button.
*
* @access public
* @return void
*/
function addStatistic()
{
var checkedLength = $(":checkbox[name^='productIDList']:checked").length;
var summary = checkedProducts.replace('%s', checkedLength);
if(cilentLang == "en" && checkedLength < 2) summary = summary.replace('products', 'product');
var statistic = "<div id='productsSummary' class='statistic'>" + summary + "</div>";
if(checkedLength > 0)
{
$('#productsSummary').remove();
@@ -77,6 +84,35 @@ $(function()
}
}
/**
* Anti shake operation for jquery.
*
* @param fn $fn
* @param delay $delay
* @access public
* @return void
*/
function debounce(fn, delay)
{
var timer = null;
return function()
{
if(timer) clearTimeout(timer);
timer = setTimeout(fn, delay)
}
}
/**
* Update statistics.
*
* @access public
* @return void
*/
function updateStatistic()
{
debounce(addStatistic(), 200)
}
$('#productTableList').on('click', '.row-program,.row-line', function(e)
{
if($(e.target).closest('.table-nest-toggle,a').length) return;
@@ -96,7 +132,7 @@ $(function()
{
updatePrarentCheckbox($('#productTableList>tr[data-id="' + parentID + '"]'));
}
addStatistic()
updateStatistic()
});
$('#productListForm').on('checkChange', updateCheckboxes);
@@ -104,7 +140,7 @@ $(function()
$(":checkbox[name^='productIDList']").on('click', function()
{
addStatistic()
updateStatistic()
});
$(".check-all").on('click', function()
@@ -117,6 +153,6 @@ $(function()
{
$(":checkbox[name^='productIDList']").prop('checked', true);
}
addStatistic()
updateStatistic()
});
});
+2 -2
View File
@@ -207,8 +207,6 @@ $lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon;
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe;
$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe;
$lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe;
$lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByMe;
$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory;
$lang->product->featureBar['browse']['more'] = $lang->more;
@@ -217,7 +215,9 @@ $lang->product->featureBar['all']['all'] = $lang->product->allProduct;
$lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed;
$lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed'];
$lang->product->moreSelects['openedbyme'] = $lang->product->openedByMe;
$lang->product->moreSelects['assignedbyme'] = $lang->product->assignedByMe;
$lang->product->moreSelects['reviewedbyme'] = $lang->product->reviewedByMe;
$lang->product->moreSelects['closedbyme'] = $lang->product->closedByMe;
$lang->product->moreSelects['activestory'] = $lang->product->activeStory;
$lang->product->moreSelects['changedstory'] = $lang->product->changedStory;
+1
View File
@@ -256,6 +256,7 @@
<?php js::set('orderBy', $orderBy)?>
<?php js::set('browseType', $browseType)?>
<?php js::set('checkedProducts', $lang->product->checkedProducts);?>
<?php js::set('cilentLang', $this->app->getClientLang());?>
<?php if(commonModel::isTutorialMode()): ?>
<style>
#productListForm {overflow: hidden;}
+2
View File
@@ -30,6 +30,7 @@ $(function()
}
var summary = checkedProjects.replace('%s', checkedLength);
if(cilentLang == "en" && checkedLength < 2) summary = summary.replace('items', 'item');
var statistic = "<div id='projectsSummary' class='table-statistic'>" + summary + "</div>";
if(checkedLength > 0)
{
@@ -53,6 +54,7 @@ $(function()
$('#programForm').addClass('has-row-checked');
var checkedLength = $(":checkbox[name^='projectIdList']:checked").length;
var summary = checkedProjects.replace('%s', checkedLength);
if(cilentLang == "en" && checkedLength < 2) summary = summary.replace('items', 'item');
var statistic = "<div id='projectsSummary' class='table-statistic'>" + summary + "</div>";
$('#programSummary').addClass('hidden');
$('#projectsSummary').remove();
+5 -4
View File
@@ -47,6 +47,7 @@ $lang->program->realDuration = 'RealDuration';
$lang->program->openedVersion = 'OpenedVersion';
$lang->program->lastEditedBy = 'LastEditedBy';
$lang->program->lastEditedDate = 'LastEditedDate';
$lang->program->childProgram = 'Child Program';
/* Actions. */
$lang->program->common = 'Program';
@@ -99,10 +100,10 @@ $lang->program->noProgram = 'No program.';
$lang->program->showClosed = 'Closed programs.';
$lang->program->tips = 'If a parent program is selected, the products under the parent program can be associated. If no program is selected for the project, a product with the same name as the project is created and associated with the project by default.';
$lang->program->confirmBatchUnlink = "Do you want to batch unlink these stakeholders?";
$lang->program->beginLetterParent = 'The start date of the program "%s" should be ≥ the start date of the parent program "%s": %s.';
$lang->program->endGreaterParent = 'The finish date of the program "%s" should be ≤ the finish date of the parent program "%s": %s.';
$lang->program->beginGreateChild = 'The start date of the parent program "%s" should be ≤the minimum start time of the subprogram "%s": %s.';
$lang->program->endLetterChild = 'The finish time of the parent program "%s" should be ≥ the maximum finish time of the subprogram "%s": %s.';
$lang->program->beginLetterParent = 'The start date of the program should be ≥ the start date of the parent program: %s.';
$lang->program->endGreaterParent = 'The finish date of the program should be ≤ the finish date of the parent program: %s.';
$lang->program->beginGreateChild = 'The start date of the parent program should be ≤the minimum start time of the %s: %s.';
$lang->program->endLetterChild = 'The finish time of the parent program should be ≥ the maximum finish time of the %s: %s.';
$lang->program->closeErrorMessage = 'There are subprograms or projects that are not closed';
$lang->program->hasChildren = 'It has child programs or projects. You cannot delete it.';
$lang->program->hasProduct = 'It has products. You cannot delete it.';
+5 -4
View File
@@ -47,6 +47,7 @@ $lang->program->realDuration = 'RealDuration';
$lang->program->openedVersion = 'OpenedVersion';
$lang->program->lastEditedBy = 'LastEditedBy';
$lang->program->lastEditedDate = 'LastEditedDate';
$lang->program->childProgram = 'Child Program';
/* Actions. */
$lang->program->common = 'Program';
@@ -99,10 +100,10 @@ $lang->program->noProgram = 'No program.';
$lang->program->showClosed = 'Closed';
$lang->program->tips = 'If a parent program is selected, the products under the parent program can be associated. If no program is selected for the project, a product with the same name as the project is created and associated with the project by default.';
$lang->program->confirmBatchUnlink = "Do you want to batch unlink these stakeholders?";
$lang->program->beginLetterParent = 'The start date of the program "%s" should be ≥ the start date of the parent program "%s": %s.';
$lang->program->endGreaterParent = 'The finish date of the program "%s" should be ≤ the finish date of the parent program "%s": %s.';
$lang->program->beginGreateChild = 'The start date of the parent program "%s" should be ≤the minimum start time of the subprogram "%s": %s.';
$lang->program->endLetterChild = 'The finish time of the parent program "%s" should be ≥ the maximum finish time of the subprogram "%s": %s.';
$lang->program->beginLetterParent = 'The start date of the program should be ≥ the start date of the parent program: %s.';
$lang->program->endGreaterParent = 'The finish date of the program should be ≤ the finish date of the parent program: %s.';
$lang->program->beginGreateChild = 'The start date of the parent program should be ≤the minimum start time of the %s: %s.';
$lang->program->endLetterChild = 'The finish time of the parent program should be ≥ the maximum finish time of the %s: %s.';
$lang->program->closeErrorMessage = 'There are subprograms or projects that are not closed';
$lang->program->hasChildren = 'The program has a child program or the project exists and can not be deleted.';
$lang->program->hasProduct = 'The program has products exist and can not be deleted.';
+5 -4
View File
@@ -47,6 +47,7 @@ $lang->program->realDuration = 'RealDuration';
$lang->program->openedVersion = 'OpenedVersion';
$lang->program->lastEditedBy = 'LastEditedBy';
$lang->program->lastEditedDate = 'LastEditedDate';
$lang->program->childProgram = 'sous-programme';
/* Actions. */
$lang->program->common = 'Program';
@@ -99,10 +100,10 @@ $lang->program->noProgram = 'No program.';
$lang->program->showClosed = 'Closed programs.';
$lang->program->tips = 'If a parent program is selected, the products under the parent program can be associated. If no program is selected for the project, a product with the same name as the project is created and associated with the project by default.';
$lang->program->confirmBatchUnlink = "Do you want to batch unlink these stakeholders?";
$lang->program->beginLetterParent = 'La date de début du programme "%s" doit être ≥ à la date de début du programme parent "%s" : %s.';
$lang->program->endGreaterParent = 'La date de fin du programme "%s" doit être ≤ à la date de fin du programme parent "%s" : %s.';
$lang->program->beginGreateChild = 'La date de début du programme parent "%s" doit être ≤ à la date de début minimum du sous-programme "%s" : %s.';
$lang->program->endLetterChild = 'Le temps de fin du programme parent "%s" doit être ≥ au temps de fin maximum du sous-programme "%s" : %s.';
$lang->program->beginLetterParent = 'La date de début du programme doit être ≥ à la date de début du programme parent: %s.';
$lang->program->endGreaterParent = 'La date de fin du programme doit être ≤ à la date de fin du programme parent: %s.';
$lang->program->beginGreateChild = 'La date de début du programme parent doit être ≤ à la date de début minimum du %s: %s.';
$lang->program->endLetterChild = 'Le temps de fin du programme parent doit être ≥ au temps de fin maximum du %s: %s.';
$lang->program->closeErrorMessage = 'There are subprograms or projects that are not closed';
$lang->program->hasChildren = 'It has child programs or projects. You cannot delete it.';
$lang->program->hasProduct = 'It has products. You cannot delete it.';

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