This commit is contained in:
Catouse
2019-05-15 11:50:33 +08:00
180 changed files with 4135 additions and 1887 deletions
+79 -30
View File
@@ -1,6 +1,7 @@
VERSION = $(shell head -n 1 VERSION)
XUANPATH = $(shell head -n 1 XUANPATH)
XUANVERSION = $(shell head -n 1 XUANVERSION)
XVERSION = $(strip $(subst v,, $(XUANVERSION)))
all: pms
clean:
@@ -53,33 +54,52 @@ zentaoxx:
cd $(XUANPATH); git archive --format=zip --prefix=xuan/ $(XUANVERSION) > xuan.zip
mv $(XUANPATH)/xuan.zip .
unzip xuan.zip
cp xuan/ranzhi/config/ext/xuanxuan.php zentaoxx/config/ext/
cp -r xuan/ranzhi/lib/phpaes zentaoxx/lib/
cp -r xuan/ranzhi/framework/xuanxuan.class.php zentaoxx/framework/
cp -r xuan/ranzhi/db/*.sql zentaoxx/db/
cp -r xuan/ranzhi/app/sys/chat zentaoxx/module/
cp -r xuan/ranzhi/app/sys/common/ext/model/hook zentaoxx/module/common/ext/model/
cp -r xuan/ranzhi/app/sys/action zentaoxx/module/
cp xuan/xxb/config/ext/xuanxuan.php zentaoxx/config/ext/
cp -r xuan/xxb/lib/phpaes zentaoxx/lib/
cp -r xuan/xxb/framework/xuanxuan.class.php zentaoxx/framework/
cp -r xuan/xxb/db/*.sql zentaoxx/db/
cp -r xuan/xxb/module/chat zentaoxx/module/
cp -r xuan/xxb/module/client zentaoxx/module/
cp -r xuan/xxb/module/common/ext/model/hook zentaoxx/module/common/ext/model/
mkdir -p zentaoxx/module/common/view
cp -r xuan/xxb/module/common/view/header.modal.html.php zentaoxx/module/common/view
cp -r xuan/xxb/module/common/view/marked.html.php zentaoxx/module/common/view
cp -r xuan/xxb/module/common/view/footer.modal.html.php zentaoxx/module/common/view
mkdir -p zentaoxx/www/js/
cp -r xuan/xxb/www/js/markedjs zentaoxx/www/js/
mkdir zentaoxx/module/action
cp -r xuan/xxb/module/action/ext zentaoxx/module/action
cp -r xuanxuan/config/* zentaoxx/config/
cp -r xuanxuan/module/* zentaoxx/module/
cp -r xuanxuan/www/* zentaoxx/www/
mv zentaoxx/db/ zentaoxx/db_bak
mkdir zentaoxx/db/
cp zentaoxx/db_bak/upgradexuanxuan*.sql zentaoxx/db_bak/xuanxuan.sql zentaoxx/db/
rm -rf zentaoxx/db_bak/
sed -i 's/xxbVersion/$(XVERSION)/g' zentaoxx/config/ext/xuanxuan.php
sed -i "/\$$config->xuanxuan->backend /c\\\$$config->xuanxuan->backend = 'zentao';" zentaoxx/config/ext/xuanxuan.php
sed -i 's/site,//' zentaoxx/module/chat/model.php
sed -i 's/admin, g/g/' zentaoxx/module/chat/model.php
sed -i '/password = md5/d' zentaoxx/module/chat/control.php
sed -i '/getSignedTime/d' zentaoxx/module/chat/control.php
sed -i 's/tree/dept/' zentaoxx/module/chat/control.php
sed -i "s/'yahoo', //g" zentaoxx/module/chat/config.php
sed -i "s/'gtalk', //g" zentaoxx/module/chat/config.php
sed -i "s/'wangwang', //g" zentaoxx/module/chat/config.php
sed -i "s/'site', //g" zentaoxx/module/chat/config.php
sed -i "s/'reload'/inlink('browse')/g" zentaoxx/module/client/control.php
sed -i 's/tree/dept/' zentaoxx/module/chat/model.php
sed -i "s/, 'sys'//" zentaoxx/module/chat/control.php
sed -i 's/system.sys/system/' zentaoxx/module/chat/control.php
sed -i 's/&app=sys//' zentaoxx/module/chat/control.php
sed -i 's/file->createdBy/file->addedBy/' zentaoxx/module/chat/control.php
sed -i 's/file->createdDate/file->addedDate/' zentaoxx/module/chat/control.php
sed -i 's/im_/zt_im_/' zentaoxx/db/*.sql
sed -i 's/sys_user/zt_user/' zentaoxx/db/*.sql
sed -i 's/sys_file/zt_file/' zentaoxx/db/*.sql
sed -i '/sys_entry/d' zentaoxx/db/*.sql
sed -i 's/im_/zt_im_/g' zentaoxx/db/*.sql
sed -i 's/xxb_user/zt_user/g' zentaoxx/db/*.sql
sed -i 's/xxb_file/zt_file/g' zentaoxx/db/*.sql
sed -i '/xxb_entry/d' zentaoxx/db/*.sql
sed -i "s/marked\.html\.php';?>/marked\.html\.php';?>\n<div id='mainMenu' class='clearfix'><div class='btn-toolbar pull-left'><?php common::printAdminSubMenu('xuanxuan');?><\/div><\/div>/g" zentaoxx/module/client/view/checkupgrade.html.php
sed -i '/var serverVersions/d' zentaoxx/module/client/js/checkupgrade.js
sed -i '/var currentVersion/d' zentaoxx/module/client/js/checkupgrade.js
sed -i '/setRequiredFields(/d' zentaoxx/module/common/view/header.modal.html.php
sed -i 's/v\.//g' zentaoxx/module/client/js/checkupgrade.js
sed -i 's/xxb_/zt_/g' zentaoxx/db/*.sql
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
rm -rf zentaopms/tools
rm -rf zentaoxx/tools
zip -rqm -9 zentaoxx.$(VERSION).zip zentaoxx/*
rm -rf xuan.zip xuan zentaoxx
package:
@@ -104,18 +124,6 @@ pms:
make package
zip -rq -9 ZenTaoPMS.$(VERSION).zip zentaopms
rm -fr zentaopms zentaoxx zentaoxx.*.zip
en:
make common
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
make package
zip -r -9 ZenTaoPMS.$(VERSION).int.zip zentaopms
rm -fr zentaopms
echo $(VERSION).int > VERSION
make deb
make rpm
echo $(VERSION) > VERSION
deb:
mkdir buildroot
cp -r build/debian/DEBIAN buildroot
@@ -143,6 +151,47 @@ rpm:
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
cp ~/rpmbuild/RPMS/noarch/zentaopms-${VERSION}-1.noarch.rpm ./
rm -rf ~/rpmbuild
en:
make common
cd zentaopms/; grep -rl 'zentao.net'|xargs sed -i 's/zentao.net/zentao.pm/g';
cd zentaopms/; grep -rl 'http://www.zentao.pm'|xargs sed -i 's/http:\/\/www.zentao.pm/https:\/\/www.zentao.pm/g';
cd zentaopms/config/; echo >> config.php; echo '$$config->isINT = true;' >> config.php
make package
mv zentaopms zentaoalm
zip -r -9 ZenTaoALM.$(VERSION).int.zip zentaoalm
rm -fr zentaoalm
echo $(VERSION).int > VERSION
make endeb
make enrpm
echo $(VERSION) > VERSION
endeb:
mkdir buildroot
cp -r build/debian/DEBIAN buildroot
sed -i '/^Version/cVersion: ${VERSION}' buildroot/DEBIAN/control
mkdir buildroot/opt
mkdir buildroot/etc/apache2/sites-enabled/ -p
cp build/debian/zentaopms.conf buildroot/etc/apache2/sites-enabled/
cp ZenTaoALM.${VERSION}.zip buildroot/opt
cd buildroot/opt; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm zentao; rm ZenTaoALM.${VERSION}.zip
sed -i 's/index.php/\/zentao\/index.php/' buildroot/opt/zentao/www/.htaccess
sudo dpkg -b buildroot/ ZenTaoALM_${VERSION}_1_all.deb
rm -rf buildroot
enrpm:
mkdir ~/rpmbuild/SPECS -p
cp build/rpm/zentaopms.spec ~/rpmbuild/SPECS
sed -i '/^Version/cVersion:${VERSION}' ~/rpmbuild/SPECS/zentaopms.spec
sed -i '/^Name:/cName:zentaoalm' ~/rpmbuild/SPECS/zentaopms.spec
mkdir ~/rpmbuild/SOURCES
cp ZenTaoALM.${VERSION}.zip ~/rpmbuild/SOURCES
mkdir ~/rpmbuild/SOURCES/etc/httpd/conf.d/ -p
cp build/debian/zentaopms.conf ~/rpmbuild/SOURCES/etc/httpd/conf.d/zentaoalm.conf
mkdir ~/rpmbuild/SOURCES/opt/ -p
cd ~/rpmbuild/SOURCES; unzip ZenTaoALM.${VERSION}.zip; mv zentaoalm opt/zentao;
sed -i 's/index.php/\/zentao\/index.php/' ~/rpmbuild/SOURCES/opt/zentao/www/.htaccess
cd ~/rpmbuild/SOURCES; tar -czvf zentaoalm-${VERSION}.tar.gz etc opt; rm -rf ZenTaoALM.${VERSION}.zip etc opt;
rpmbuild -ba ~/rpmbuild/SPECS/zentaopms.spec
cp ~/rpmbuild/RPMS/noarch/zentaoalm-${VERSION}-1.noarch.rpm ./
rm -rf ~/rpmbuild
patchphpdoc:
sudo cp misc/doc/phpdoc/*.tpl /usr/share/php/data/PhpDocumentor/phpDocumentor/Converters/HTML/frames/templates/phphtmllib/templates/
phpdoc:
+1 -1
View File
@@ -1 +1 @@
11.4.1
11.5.stable
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '11.4.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '11.5'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
$config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php.
+910
View File
@@ -0,0 +1,910 @@
CREATE TABLE `zt_action` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(30) NOT NULL DEFAULT '',
`objectID` mediumint(8) unsigned NOT NULL DEFAULT '0',
`product` varchar(255) NOT NULL,
`project` mediumint(9) NOT NULL,
`actor` varchar(30) NOT NULL DEFAULT '',
`action` varchar(30) NOT NULL DEFAULT '',
`date` datetime NOT NULL,
`comment` text NOT NULL,
`extra` text NOT NULL,
`read` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `date` (`date`),
KEY `actor` (`actor`),
KEY `project` (`project`),
KEY `objectID` (`objectID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_block` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`module` varchar(20) NOT NULL,
`title` varchar(100) NOT NULL,
`source` varchar(20) NOT NULL,
`block` varchar(20) NOT NULL,
`params` text NOT NULL,
`order` tinyint(3) unsigned NOT NULL DEFAULT '0',
`grid` tinyint(3) unsigned NOT NULL DEFAULT '0',
`height` smallint(5) unsigned NOT NULL DEFAULT '0',
`hidden` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `accountModuleOrder` (`account`,`module`,`order`),
KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_branch` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`order` smallint(5) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_bug` (
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
`branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
`module` mediumint(8) unsigned NOT NULL DEFAULT '0',
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`plan` mediumint(8) unsigned NOT NULL DEFAULT '0',
`story` mediumint(8) unsigned NOT NULL DEFAULT '0',
`storyVersion` smallint(6) NOT NULL DEFAULT '1',
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
`toTask` mediumint(8) unsigned NOT NULL DEFAULT '0',
`toStory` mediumint(8) NOT NULL DEFAULT '0',
`title` varchar(255) NOT NULL,
`keywords` varchar(255) NOT NULL,
`severity` tinyint(4) NOT NULL DEFAULT '0',
`pri` tinyint(3) unsigned NOT NULL,
`type` varchar(30) NOT NULL DEFAULT '',
`os` varchar(30) NOT NULL DEFAULT '',
`browser` varchar(30) NOT NULL DEFAULT '',
`hardware` varchar(30) NOT NULL,
`found` varchar(30) NOT NULL DEFAULT '',
`steps` text NOT NULL,
`status` enum('active','resolved','closed') NOT NULL DEFAULT 'active',
`color` char(7) NOT NULL,
`confirmed` tinyint(1) NOT NULL DEFAULT '0',
`activatedCount` smallint(6) NOT NULL,
`activatedDate` datetime NOT NULL,
`mailto` text,
`openedBy` varchar(30) NOT NULL DEFAULT '',
`openedDate` datetime NOT NULL,
`openedBuild` varchar(255) NOT NULL,
`assignedTo` varchar(30) NOT NULL DEFAULT '',
`assignedDate` datetime NOT NULL,
`deadline` date NOT NULL,
`resolvedBy` varchar(30) NOT NULL DEFAULT '',
`resolution` varchar(30) NOT NULL DEFAULT '',
`resolvedBuild` varchar(30) NOT NULL DEFAULT '',
`resolvedDate` datetime NOT NULL,
`closedBy` varchar(30) NOT NULL DEFAULT '',
`closedDate` datetime NOT NULL,
`duplicateBug` mediumint(8) unsigned NOT NULL,
`linkBug` varchar(255) NOT NULL,
`case` mediumint(8) unsigned NOT NULL,
`caseVersion` smallint(6) NOT NULL DEFAULT '1',
`result` mediumint(8) unsigned NOT NULL,
`testtask` mediumint(8) unsigned NOT NULL,
`lastEditedBy` varchar(30) NOT NULL DEFAULT '',
`lastEditedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `project` (`project`),
KEY `status` (`status`),
KEY `plan` (`plan`),
KEY `story` (`story`),
KEY `case` (`case`),
KEY `assignedTo` (`assignedTo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_build` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
`branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`name` char(150) NOT NULL,
`scmPath` char(255) NOT NULL,
`filePath` char(255) NOT NULL,
`date` date NOT NULL,
`stories` text NOT NULL,
`bugs` text NOT NULL,
`builder` char(30) NOT NULL DEFAULT '',
`desc` text NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `project` (`project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_burn` (
`project` mediumint(8) unsigned NOT NULL,
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
`date` date NOT NULL,
`estimate` float NOT NULL,
`left` float NOT NULL,
`consumed` float NOT NULL,
PRIMARY KEY (`project`,`date`,`task`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_case` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
`branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
`lib` mediumint(8) unsigned NOT NULL DEFAULT '0',
`module` mediumint(8) unsigned NOT NULL DEFAULT '0',
`path` mediumint(8) unsigned NOT NULL DEFAULT '0',
`story` mediumint(30) unsigned NOT NULL DEFAULT '0',
`storyVersion` smallint(6) NOT NULL DEFAULT '1',
`title` varchar(255) NOT NULL,
`precondition` text NOT NULL,
`keywords` varchar(255) NOT NULL,
`pri` tinyint(3) unsigned NOT NULL DEFAULT '3',
`type` char(30) NOT NULL DEFAULT '1',
`stage` varchar(255) NOT NULL,
`howRun` varchar(30) NOT NULL,
`scriptedBy` varchar(30) NOT NULL,
`scriptedDate` date NOT NULL,
`scriptStatus` varchar(30) NOT NULL,
`scriptLocation` varchar(255) NOT NULL,
`status` char(30) NOT NULL DEFAULT '1',
`color` char(7) NOT NULL,
`frequency` enum('1','2','3') NOT NULL DEFAULT '1',
`order` tinyint(30) unsigned NOT NULL DEFAULT '0',
`openedBy` char(30) NOT NULL DEFAULT '',
`openedDate` datetime NOT NULL,
`reviewedBy` varchar(255) NOT NULL,
`reviewedDate` date NOT NULL,
`lastEditedBy` char(30) NOT NULL DEFAULT '',
`lastEditedDate` datetime NOT NULL,
`version` tinyint(3) unsigned NOT NULL DEFAULT '0',
`linkCase` varchar(255) NOT NULL,
`fromBug` mediumint(8) unsigned NOT NULL,
`fromCaseID` mediumint(8) unsigned NOT NULL,
`fromCaseVersion` mediumint(8) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`lastRunner` varchar(30) NOT NULL,
`lastRunDate` datetime NOT NULL,
`lastRunResult` char(30) NOT NULL,
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `story` (`story`),
KEY `module` (`module`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_casestep` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
`case` mediumint(8) unsigned NOT NULL DEFAULT '0',
`version` smallint(3) unsigned NOT NULL DEFAULT '0',
`type` varchar(10) NOT NULL DEFAULT 'step',
`desc` text NOT NULL,
`expect` text NOT NULL,
PRIMARY KEY (`id`),
KEY `case` (`case`),
KEY `version` (`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_company` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(120) DEFAULT NULL,
`phone` char(20) DEFAULT NULL,
`fax` char(20) DEFAULT NULL,
`address` char(120) DEFAULT NULL,
`zipcode` char(10) DEFAULT NULL,
`website` char(120) DEFAULT NULL,
`backyard` char(120) DEFAULT NULL,
`guest` enum('1','0') NOT NULL DEFAULT '0',
`admins` char(255) DEFAULT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_config` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`owner` char(30) NOT NULL DEFAULT '',
`module` varchar(30) NOT NULL,
`section` char(30) NOT NULL DEFAULT '',
`key` char(30) NOT NULL DEFAULT '',
`value` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`owner`,`module`,`section`,`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_cron` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`m` varchar(20) NOT NULL,
`h` varchar(20) NOT NULL,
`dom` varchar(20) NOT NULL,
`mon` varchar(20) NOT NULL,
`dow` varchar(20) NOT NULL,
`command` text NOT NULL,
`remark` varchar(255) NOT NULL,
`type` varchar(20) NOT NULL,
`buildin` tinyint(1) NOT NULL DEFAULT '0',
`status` varchar(20) NOT NULL,
`lastTime` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `lastTime` (`lastTime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_dept` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(60) NOT NULL,
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
`path` char(255) NOT NULL DEFAULT '',
`grade` tinyint(3) unsigned NOT NULL DEFAULT '0',
`order` tinyint(3) unsigned NOT NULL DEFAULT '0',
`position` char(30) NOT NULL DEFAULT '',
`function` char(255) NOT NULL DEFAULT '',
`manager` char(30) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
KEY `path` (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_doc` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
`project` mediumint(8) unsigned NOT NULL,
`lib` varchar(30) NOT NULL,
`module` varchar(30) NOT NULL,
`title` varchar(255) NOT NULL,
`keywords` varchar(255) NOT NULL,
`type` varchar(30) NOT NULL,
`views` smallint(5) unsigned NOT NULL,
`collector` text NOT NULL,
`addedBy` varchar(30) NOT NULL,
`addedDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`acl` varchar(10) NOT NULL DEFAULT 'open',
`groups` varchar(255) NOT NULL,
`users` text NOT NULL,
`version` smallint(5) unsigned NOT NULL DEFAULT '1',
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `project` (`project`),
KEY `lib` (`lib`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_doccontent` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`doc` mediumint(8) unsigned NOT NULL,
`title` varchar(255) NOT NULL,
`digest` varchar(255) NOT NULL,
`content` text NOT NULL,
`files` text NOT NULL,
`type` varchar(10) NOT NULL,
`version` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `doc_version` (`doc`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_doclib` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(30) NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
`project` mediumint(8) unsigned NOT NULL,
`name` varchar(60) NOT NULL,
`acl` varchar(10) NOT NULL DEFAULT 'open',
`groups` varchar(255) NOT NULL,
`users` text NOT NULL,
`main` enum('0','1') NOT NULL DEFAULT '0',
`collector` text NOT NULL,
`order` tinyint(5) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `project` (`project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_effort` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`user` char(30) NOT NULL DEFAULT '',
`todo` enum('1','0') NOT NULL DEFAULT '1',
`date` date NOT NULL,
`begin` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`type` enum('1','2','3') NOT NULL DEFAULT '1',
`idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0',
`name` char(30) NOT NULL DEFAULT '',
`desc` char(255) NOT NULL DEFAULT '',
`status` enum('1','2','3') NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
KEY `user` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_entry` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`account` varchar(30) NOT NULL DEFAULT '',
`code` varchar(20) NOT NULL,
`key` varchar(32) NOT NULL,
`ip` varchar(100) NOT NULL,
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`calledTime` int(10) unsigned NOT NULL DEFAULT '0',
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0', '1') NOT NULL DEFAULT '0',
PRIMARY KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_extension` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
`code` varchar(30) NOT NULL,
`version` varchar(50) NOT NULL,
`author` varchar(100) NOT NULL,
`desc` text NOT NULL,
`license` text NOT NULL,
`type` varchar(20) NOT NULL DEFAULT 'extension',
`site` varchar(150) NOT NULL,
`zentaoCompatible` varchar(100) NOT NULL,
`installedTime` datetime NOT NULL,
`depends` varchar(100) NOT NULL,
`dirs` mediumtext NOT NULL,
`files` mediumtext NOT NULL,
`status` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`),
KEY `name` (`name`),
KEY `installedTime` (`installedTime`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_file` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`pathname` char(100) NOT NULL,
`title` char(255) NOT NULL,
`extension` char(30) NOT NULL,
`size` int(10) unsigned NOT NULL DEFAULT '0',
`objectType` char(30) NOT NULL,
`objectID` mediumint(9) NOT NULL,
`addedBy` char(30) NOT NULL DEFAULT '',
`addedDate` datetime NOT NULL,
`downloads` mediumint(8) unsigned NOT NULL DEFAULT '0',
`extra` varchar(255) NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `objectType` (`objectType`),
KEY `objectID` (`objectID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_group` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(30) NOT NULL,
`role` char(30) NOT NULL DEFAULT '',
`desc` char(255) NOT NULL DEFAULT '',
`acl` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_grouppriv` (
`group` mediumint(8) unsigned NOT NULL DEFAULT '0',
`module` char(30) NOT NULL DEFAULT '',
`method` char(30) NOT NULL DEFAULT '',
UNIQUE KEY `group` (`group`,`module`,`method`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_history` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`action` mediumint(8) unsigned NOT NULL DEFAULT '0',
`field` varchar(30) NOT NULL DEFAULT '',
`old` text NOT NULL,
`new` text NOT NULL,
`diff` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `action` (`action`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_lang` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`lang` varchar(30) NOT NULL,
`module` varchar(30) NOT NULL,
`section` varchar(30) NOT NULL,
`key` varchar(60) NOT NULL,
`value` text NOT NULL,
`system` enum('0','1') NOT NULL DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_log` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(30) NOT NULL,
`objectID` mediumint(8) unsigned NOT NULL,
`action` mediumint(8) unsigned NOT NULL,
`date` datetime NOT NULL,
`url` varchar(255) NOT NULL,
`contentType` varchar(30) NOT NULL,
`data` text NOT NULL,
`result` text NOT NULL,
PRIMARY KEY (`id`),
KEY `objectType` (`objectType`),
KEY `obejctID` (`objectID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_module` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`root` mediumint(8) unsigned NOT NULL DEFAULT '0',
`branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
`name` char(60) NOT NULL DEFAULT '',
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
`path` char(255) NOT NULL DEFAULT '',
`grade` tinyint(3) unsigned NOT NULL DEFAULT '0',
`order` smallint(5) unsigned NOT NULL DEFAULT '0',
`type` char(30) NOT NULL,
`owner` varchar(30) NOT NULL,
`collector` text NOT NULL,
`short` varchar(30) NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `root` (`root`),
KEY `type` (`type`),
KEY `path` (`path`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_notify` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`objectType` varchar(50) NOT NULL,
`objectID` mediumint(8) unsigned NOT NULL,
`action` mediumint(9) NOT NULL,
`toList` varchar(255) NOT NULL,
`ccList` text NOT NULL,
`subject` varchar(255) NOT NULL,
`data` text NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` datetime NOT NULL,
`sendTime` datetime NOT NULL,
`status` varchar(10) NOT NULL DEFAULT 'wait',
`failReason` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_product` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(90) NOT NULL,
`code` varchar(45) NOT NULL,
`line` mediumint(8) NOT NULL,
`type` varchar(30) NOT NULL DEFAULT 'normal',
`status` varchar(30) NOT NULL DEFAULT '',
`desc` text NOT NULL,
`PO` varchar(30) NOT NULL,
`QD` varchar(30) NOT NULL,
`RD` varchar(30) NOT NULL,
`acl` enum('open','private','custom') NOT NULL DEFAULT 'open',
`whitelist` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`createdVersion` varchar(20) NOT NULL,
`order` mediumint(8) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `order` (`order`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_productplan` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`parent` mediumint(9) NOT NULL DEFAULT '0',
`title` varchar(90) NOT NULL,
`desc` text NOT NULL,
`begin` date NOT NULL,
`end` date NOT NULL,
`order` text NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `end` (`end`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_project` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`isCat` enum('1','0') NOT NULL DEFAULT '0',
`catID` mediumint(8) unsigned NOT NULL,
`type` varchar(20) NOT NULL DEFAULT 'sprint',
`parent` mediumint(8) unsigned NOT NULL DEFAULT '0',
`name` varchar(90) NOT NULL,
`code` varchar(45) NOT NULL,
`begin` date NOT NULL,
`end` date NOT NULL,
`days` smallint(5) unsigned NOT NULL,
`status` varchar(10) NOT NULL,
`statge` enum('1','2','3','4','5') NOT NULL DEFAULT '1',
`pri` enum('1','2','3','4') NOT NULL DEFAULT '1',
`desc` text NOT NULL,
`openedBy` varchar(30) NOT NULL DEFAULT '',
`openedDate` datetime NOT NULL,
`openedVersion` varchar(20) NOT NULL,
`closedBy` varchar(30) NOT NULL DEFAULT '',
`closedDate` datetime NOT NULL,
`canceledBy` varchar(30) NOT NULL DEFAULT '',
`canceledDate` datetime NOT NULL,
`PO` varchar(30) NOT NULL DEFAULT '',
`PM` varchar(30) NOT NULL DEFAULT '',
`QD` varchar(30) NOT NULL DEFAULT '',
`RD` varchar(30) NOT NULL DEFAULT '',
`team` varchar(90) NOT NULL,
`acl` enum('open','private','custom') NOT NULL DEFAULT 'open',
`whitelist` text NOT NULL,
`order` mediumint(8) unsigned NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `parent` (`parent`),
KEY `begin` (`begin`),
KEY `end` (`end`),
KEY `status` (`status`),
KEY `order` (`order`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_projectproduct` (
`project` mediumint(8) unsigned NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`plan` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`project`,`product`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_projectstory` (
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`product` mediumint(8) unsigned NOT NULL,
`story` mediumint(8) unsigned NOT NULL DEFAULT '0',
`version` smallint(6) NOT NULL DEFAULT '1',
`order` smallint(6) unsigned NOT NULL,
UNIQUE KEY `project` (`project`,`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_release` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT '0',
`branch` mediumint(8) unsigned NOT NULL DEFAULT '0',
`build` mediumint(8) unsigned NOT NULL,
`name` varchar(255) NOT NULL DEFAULT '',
`marker` enum('0','1') NOT NULL DEFAULT '0',
`date` date NOT NULL,
`stories` text NOT NULL,
`bugs` text NOT NULL,
`leftBugs` text NOT NULL,
`desc` text NOT NULL,
`status` varchar(20) NOT NULL DEFAULT 'normal',
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `build` (`build`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_score` (
`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT,
`account` varchar(30) NOT NULL,
`module` varchar(30) NOT NULL DEFAULT '',
`method` varchar(30) NOT NULL,
`desc` varchar(250) NOT NULL DEFAULT '',
`before` int(11) NOT NULL DEFAULT '0',
`score` int(11) NOT NULL DEFAULT '0',
`after` int(11) NOT NULL DEFAULT '0',
`time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `account` (`account`),
KEY `model` (`module`),
KEY `method` (`method`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_story` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`product` mediumint(8) unsigned NOT NULL default '0',
`branch` mediumint(8) unsigned NOT NULL default '0',
`module` mediumint(8) unsigned NOT NULL default '0',
`plan` text,
`source` varchar(20) NOT NULL,
`sourceNote` varchar(255) NOT NULL,
`fromBug` mediumint(8) unsigned NOT NULL default '0',
`title` varchar(255) NOT NULL,
`keywords` varchar(255) NOT NULL,
`type` varchar(30) NOT NULL default '',
`pri` tinyint(3) unsigned NOT NULL default '3',
`estimate` float unsigned NOT NULL,
`status` enum('','changed','active','draft','closed') NOT NULL default '',
`color` char(7) NOT NULL,
`stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released', 'closed') NOT NULL DEFAULT 'wait',
`stagedBy` char(30) NOT NULL,
`mailto` text,
`openedBy` varchar(30) NOT NULL default '',
`openedDate` datetime NOT NULL,
`assignedTo` varchar(30) NOT NULL default '',
`assignedDate` datetime NOT NULL,
`lastEditedBy` varchar(30) NOT NULL default '',
`lastEditedDate` datetime NOT NULL,
`reviewedBy` varchar(255) NOT NULL,
`reviewedDate` date NOT NULL,
`closedBy` varchar(30) NOT NULL default '',
`closedDate` datetime NOT NULL,
`closedReason` varchar(30) NOT NULL,
`toBug` mediumint(8) unsigned NOT NULL,
`childStories` varchar(255) NOT NULL,
`linkStories` varchar(255) NOT NULL,
`duplicateStory` mediumint(8) unsigned NOT NULL,
`version` smallint(6) NOT NULL default '1',
`deleted` enum('0','1') NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `status` (`status`),
KEY `assignedTo` (`assignedTo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_storyspec` (
`story` mediumint(9) NOT NULL,
`version` smallint(6) NOT NULL,
`title` varchar(255) NOT NULL,
`spec` text NOT NULL,
`verify` text NOT NULL,
UNIQUE KEY `story` (`story`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `zt_storystage` (
`story` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`stage` varchar(50) NOT NULL,
`stagedBy` char(30) NOT NULL,
UNIQUE KEY `story_branch` (`story`,`branch`),
KEY `story` (`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_suitecase` (
`suite` mediumint(8) unsigned NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
`case` mediumint(8) unsigned NOT NULL,
`version` smallint(5) unsigned NOT NULL,
UNIQUE KEY `suitecase` (`suite`,`case`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_task` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`parent` mediumint(8) NOT NULL DEFAULT '0',
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`module` mediumint(8) unsigned NOT NULL DEFAULT '0',
`story` mediumint(8) unsigned NOT NULL DEFAULT '0',
`storyVersion` smallint(6) NOT NULL DEFAULT '1',
`fromBug` mediumint(8) unsigned NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL,
`type` varchar(20) NOT NULL,
`pri` tinyint(3) unsigned NOT NULL DEFAULT '0',
`estimate` float unsigned NOT NULL,
`consumed` float unsigned NOT NULL,
`left` float unsigned NOT NULL,
`deadline` date NOT NULL,
`status` enum('wait','doing','done','pause','cancel','closed') NOT NULL DEFAULT 'wait',
`color` char(7) NOT NULL,
`mailto` text,
`desc` text NOT NULL,
`openedBy` varchar(30) NOT NULL,
`openedDate` datetime NOT NULL,
`assignedTo` varchar(30) NOT NULL,
`assignedDate` datetime NOT NULL,
`estStarted` date NOT NULL,
`realStarted` date NOT NULL,
`finishedBy` varchar(30) NOT NULL,
`finishedDate` datetime NOT NULL,
`finishedList` text NOT NULL,
`canceledBy` varchar(30) NOT NULL,
`canceledDate` datetime NOT NULL,
`closedBy` varchar(30) NOT NULL,
`closedDate` datetime NOT NULL,
`closedReason` varchar(30) NOT NULL,
`lastEditedBy` varchar(30) NOT NULL,
`lastEditedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `project` (`project`),
KEY `story` (`story`),
KEY `assignedTo` (`assignedTo`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_taskestimate` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
`date` date NOT NULL,
`left` float unsigned NOT NULL DEFAULT '0',
`consumed` float unsigned NOT NULL,
`account` char(30) NOT NULL DEFAULT '',
`work` text,
PRIMARY KEY (`id`),
KEY `task` (`task`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_team` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`root` mediumint(8) unsigned NOT NULL DEFAULT '0',
`type` enum('project','task') NOT NULL DEFAULT 'project',
`account` char(30) NOT NULL DEFAULT '',
`role` char(30) NOT NULL DEFAULT '',
`limited` char(8) NOT NULL DEFAULT 'no',
`join` date NOT NULL DEFAULT '0000-00-00',
`days` smallint(5) unsigned NOT NULL,
`hours` float(2,1) unsigned NOT NULL DEFAULT '0.0',
`estimate` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
`consumed` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
`left` decimal(12,2) unsigned NOT NULL DEFAULT '0.00',
`order` tinyint(3) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `team` (`root`,`type`,`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_testreport` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
`project` mediumint(8) unsigned NOT NULL,
`tasks` varchar(255) NOT NULL,
`builds` varchar(255) NOT NULL,
`title` varchar(255) NOT NULL,
`begin` date NOT NULL,
`end` date NOT NULL,
`owner` char(30) NOT NULL,
`members` text NOT NULL,
`stories` text NOT NULL,
`bugs` text NOT NULL,
`cases` text NOT NULL,
`report` text NOT NULL,
`objectType` varchar(20) NOT NULL,
`objectID` mediumint(8) unsigned NOT NULL,
`createdBy` char(30) NOT NULL,
`createdDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_testresult` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`run` mediumint(8) unsigned NOT NULL,
`case` mediumint(8) unsigned NOT NULL,
`version` smallint(5) unsigned NOT NULL,
`caseResult` char(30) NOT NULL,
`stepResults` text NOT NULL,
`lastRunner` varchar(30) NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `case` (`case`),
KEY `version` (`version`),
KEY `run` (`run`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_testrun` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`task` mediumint(8) unsigned NOT NULL DEFAULT '0',
`case` mediumint(8) unsigned NOT NULL DEFAULT '0',
`version` tinyint(3) unsigned NOT NULL DEFAULT '0',
`assignedTo` char(30) NOT NULL DEFAULT '',
`lastRunner` varchar(30) NOT NULL,
`lastRunDate` datetime NOT NULL,
`lastRunResult` char(30) NOT NULL,
`status` char(30) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `task` (`task`,`case`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_testsuite` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`desc` text NOT NULL,
`type` varchar(20) NOT NULL,
`addedBy` char(30) NOT NULL,
`addedDate` datetime NOT NULL,
`lastEditedBy` char(30) NOT NULL,
`lastEditedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL,
PRIMARY KEY (`id`),
KEY `product` (`product`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_testtask` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` char(90) NOT NULL,
`product` mediumint(8) unsigned NOT NULL,
`project` mediumint(8) unsigned NOT NULL DEFAULT '0',
`build` char(30) NOT NULL,
`owner` varchar(30) NOT NULL,
`pri` tinyint(3) unsigned NOT NULL DEFAULT '0',
`begin` date NOT NULL,
`end` date NOT NULL,
`mailto` text,
`desc` text NOT NULL,
`report` text NOT NULL,
`status` enum('blocked','doing','wait','done') NOT NULL DEFAULT 'wait',
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `product` (`product`),
KEY `build` (`build`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_todo` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`date` date NOT NULL,
`begin` smallint(4) unsigned zerofill NOT NULL,
`end` smallint(4) unsigned zerofill NOT NULL,
`type` char(10) NOT NULL,
`cycle` tinyint(3) unsigned NOT NULL DEFAULT '0',
`idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0',
`pri` tinyint(3) unsigned NOT NULL,
`name` char(150) NOT NULL,
`desc` text NOT NULL,
`status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait',
`private` tinyint(1) NOT NULL,
`config` varchar(255) NOT NULL,
`assignedTo` varchar(30) NOT NULL DEFAULT '',
`assignedBy` varchar(30) NOT NULL DEFAULT '',
`assignedDate` datetime NOT NULL,
`finishedBy` varchar(30) NOT NULL DEFAULT '',
`finishedDate` datetime NOT NULL,
`closedBy` varchar(30) NOT NULL DEFAULT '',
`closedDate` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `account` (`account`),
KEY `assignedTo` (`assignedTo`),
KEY `finishedBy` (`finishedBy`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_user` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`dept` mediumint(8) unsigned NOT NULL DEFAULT '0',
`account` char(30) NOT NULL DEFAULT '',
`password` char(32) NOT NULL DEFAULT '',
`role` char(10) NOT NULL DEFAULT '',
`realname` varchar(100) NOT NULL DEFAULT '',
`nickname` char(60) NOT NULL DEFAULT '',
`commiter` varchar(100) NOT NULL,
`avatar` char(30) NOT NULL DEFAULT '',
`birthday` date NOT NULL DEFAULT '0000-00-00',
`gender` enum('f','m') NOT NULL DEFAULT 'f',
`email` char(90) NOT NULL DEFAULT '',
`skype` char(90) NOT NULL DEFAULT '',
`qq` char(20) NOT NULL DEFAULT '',
`mobile` char(11) NOT NULL DEFAULT '',
`phone` char(20) NOT NULL DEFAULT '',
`weixin` varchar(90) NOT NULL DEFAULT '',
`dingding` varchar(90) NOT NULL DEFAULT '',
`slack` varchar(90) NOT NULL DEFAULT '',
`whatsapp` varchar(90) NOT NULL DEFAULT '',
`address` char(120) NOT NULL DEFAULT '',
`zipcode` char(10) NOT NULL DEFAULT '',
`join` date NOT NULL DEFAULT '0000-00-00',
`visits` mediumint(8) unsigned NOT NULL DEFAULT '0',
`ip` char(15) NOT NULL DEFAULT '',
`last` int(10) unsigned NOT NULL DEFAULT '0',
`fails` tinyint(5) NOT NULL DEFAULT '0',
`locked` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`ranzhi` char(30) NOT NULL DEFAULT '',
`score` int(11) NOT NULL DEFAULT '0',
`scoreLevel` int(11) NOT NULL DEFAULT '0',
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `account` (`account`),
KEY `dept` (`dept`),
KEY `email` (`email`),
KEY `commiter` (`commiter`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_usercontact` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`listName` varchar(60) NOT NULL,
`userList` text NOT NULL,
PRIMARY KEY (`id`),
KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_usergroup` (
`account` char(30) NOT NULL DEFAULT '',
`group` mediumint(8) unsigned NOT NULL DEFAULT '0',
UNIQUE KEY `account` (`account`,`group`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_userquery` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`module` varchar(30) NOT NULL,
`title` varchar(90) NOT NULL,
`form` text NOT NULL,
`sql` text NOT NULL,
`shortcut` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `account` (`account`),
KEY `module` (`module`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_usertpl` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`account` char(30) NOT NULL,
`type` char(30) NOT NULL,
`title` varchar(150) NOT NULL,
`content` text NOT NULL,
`public` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_userview` (
`account` char(30) NOT NULL,
`products` mediumtext NOT NULL,
`projects` mediumtext NOT NULL,
UNIQUE KEY `account` (`account`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `zt_webhook` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(10) NOT NULL DEFAULT 'default',
`name` varchar(50) NOT NULL,
`url` varchar(255) NOT NULL,
`domain` varchar(255) NOT NULL,
`contentType` varchar(30) NOT NULL DEFAULT 'application/json',
`sendType` enum('sync','async') NOT NULL DEFAULT 'sync',
`products` text NOT NULL,
`projects` text NOT NULL,
`params` varchar(100) NOT NULL,
`actions` text NOT NULL,
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+5
View File
@@ -0,0 +1,5 @@
ALTER TABLE `zt_entry` ADD `calledTime` int(10) unsigned NOT NULL DEFAULT '0' AFTER `createdDate`;
ALTER TABLE `zt_story` CHANGE `toBug` `toBug` mediumint(8) unsigned NOT NULL AFTER `closedReason`;
UPDATE `zt_story` SET `stage` = 'closed' WHERE `status` = 'closed';
ALTER TABLE `zt_story` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL AFTER `stage`;
ALTER TABLE `zt_storystage` ADD `stagedBy` char(30) COLLATE 'utf8_general_ci' NOT NULL;
+5 -1
View File
@@ -567,6 +567,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
`status` enum('','changed','active','draft','closed') NOT NULL default '',
`color` char(7) NOT NULL,
`stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released', 'closed') NOT NULL DEFAULT 'wait',
`stagedBy` char(30) NOT NULL,
`mailto` text,
`openedBy` varchar(30) NOT NULL default '',
`openedDate` datetime NOT NULL,
@@ -579,7 +580,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` (
`closedBy` varchar(30) NOT NULL default '',
`closedDate` datetime NOT NULL,
`closedReason` varchar(30) NOT NULL,
`toBug` mediumint(9) NOT NULL,
`toBug` mediumint(8) unsigned NOT NULL,
`childStories` varchar(255) NOT NULL,
`linkStories` varchar(255) NOT NULL,
`duplicateStory` mediumint(8) unsigned NOT NULL,
@@ -604,6 +605,8 @@ CREATE TABLE IF NOT EXISTS `zt_storystage` (
`story` mediumint(8) unsigned NOT NULL,
`branch` mediumint(8) unsigned NOT NULL,
`stage` varchar(50) NOT NULL,
`stagedBy` char(30) NOT NULL,
UNIQUE KEY `story_branch` (`story`,`branch`),
KEY `story` (`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_suitecase`;
@@ -899,6 +902,7 @@ CREATE TABLE IF NOT EXISTS `zt_entry` (
`desc` text NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`calledTime` int(10) unsigned NOT NULL DEFAULT '0',
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0', '1') NOT NULL DEFAULT '0',
+38
View File
@@ -1,3 +1,41 @@
2019-05-08 11.5.stable
完成的需求:
3505 产品和项目增加填写备注功能
3557 增加动态的显示内容的过滤功能
3602 xxb代码独立,调整禅道集成喧喧的代码
3608 优化多平台下面的排版
3612 打开首次登录修改密码后,使用客户端可以正常登录禅道
3627 调整接口的调用逻辑
3637 计划关联需求时弹窗里面的按钮保持居中对齐
3638 创建需求时的优先级按照1234的顺序排列
3639 创建操作增加类似提bug页面的模板功能
3640 创建文档的时候增加动作记录,记录上传附件的动作,记录上传者和文件名
3650 需求复制页面不要弹窗
3652 调整Bug添加页面操作系统控件的宽度
3656 更改禅道登录页的PMS 英文
3664 多人任务的工时计算逻辑需要调整
3668 任务详情页面增加创建子任务的链接
3669 父子任务间关联、取消动作记录到父任务历史记录中
3672 子任务维护的内容可以在父任务显示
修复的bug:
2432 官方docker镜像启动问题
2470 测试管理方式创建项目版本功能异常
2479 项目激活顺延任务的起止日期不生效
2489 对客户端中消息直接创建需求,需求来源选择不上
2490 产品项目编辑修改新负责人无法访问产品项目
2491 后台下载喧喧服务端和下载配置文件没有反应
2492 测试单报表统计问题
2493 禅道无法记录客户端日志信息
2494 去掉后台"捐助我们"的入口
2495 源码安装mysql8报错
2496 取消路线图权限后,还是在可以在产品概况页面看到
2497 zbox中的数据库adminer访问存在问题
2501 报表默认显示功能异常
2505 bug统计报表问题
2506 版本关联需求页面搜索会显示已经关联的需求页面
2510 待办添加备注后,窗口关闭按钮消失
2512 需求批量编辑状态不生效
2019-03-25 11.4.1
完善细节,修复bug。
完成相关调整支持专业版里相关功能。
+2 -10
View File
@@ -41,7 +41,7 @@ class control extends baseControl
$mainViewFile = $modulePath . 'view' . DS . $this->devicePrefix . $methodName . '.' . $viewType . '.php';
/* If the main view file doesn't exist, set the device prefix to empty and reset the main view file. */
if(!file_exists($mainViewFile))
if(!file_exists($mainViewFile) and $this->app->clientDevice != 'mobile')
{
$originalPrefix = $this->devicePrefix;
$this->devicePrefix = '';
@@ -60,15 +60,7 @@ class control extends baseControl
$viewFile = (!empty($siteExtViewFile) and file_exists($siteExtViewFile)) ? $siteExtViewFile : $viewFile;
if(!is_file($viewFile))
{
if($this->config->debug === false)
{
die(js::locate($this->createLink('misc','ajaxerror', ".mhtml"), 'parent'));
}
else
{
$this->app->triggerError("the view file $viewFile not found", __FILE__, __LINE__, $exit = true);
}
die(js::error($this->lang->notPage) . js::locate('back'));
}
$commonExtHookFiles = glob($viewExtPath['common'] . $this->devicePrefix . $methodName . ".*.{$viewType}.hook.php");
+197 -34
View File
@@ -32,7 +32,7 @@ $lang->action->trashTips = 'Note: Delete in ZenTao is logic.';
$lang->action->textDiff = 'Text Format';
$lang->action->original = 'Original Format';
$lang->action->confirmHideAll = 'Do you want to hide all the records?';
$lang->action->needEdit = '%s that you want to restore exists. Please edit it.';
$lang->action->needEdit = '%s that you want to restore. Please edit it.';
$lang->action->historyEdit = 'The history EditBy cannot be empty.';
$lang->action->noDynamic = 'No dynamics. ';
@@ -41,7 +41,7 @@ $lang->action->history->action = 'Link';
$lang->action->history->field = 'Field';
$lang->action->history->old = 'Old value';
$lang->action->history->new = 'New value';
$lang->action->history->diff = 'Diff';
$lang->action->history->diff = 'Compare';
$lang->action->dynamic = new stdclass();
$lang->action->dynamic->today = 'Today';
@@ -77,7 +77,7 @@ $lang->action->objectTypes['stepresult'] = 'Case Steps';
$lang->action->objectTypes['testtask'] = 'Test Build';
$lang->action->objectTypes['user'] = 'User';
$lang->action->objectTypes['doc'] = 'Doc';
$lang->action->objectTypes['doclib'] = 'Doc Lib';
$lang->action->objectTypes['doclib'] = 'Doc Library';
$lang->action->objectTypes['todo'] = 'Todo';
$lang->action->objectTypes['branch'] = 'Branch';
$lang->action->objectTypes['module'] = 'Module';
@@ -129,9 +129,17 @@ $lang->action->desc->diff2 = '<strong><i>%s</i></strong> is changed. Th
$lang->action->desc->diff3 = 'File Name %s was changed to %s .' . "\n";
$lang->action->desc->linked2bug = '$date Linked to <strong>$extra</strong> by <strong>$actor</strong>';
/* 子任务修改父任务的历史操作记录 */
$lang->action->desc->createchildren = '$date, <strong>$actor</strong> created a Child Task <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildtask = '$date, <strong>$actor</strong> linked a Child Task <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildtask = '$date, <strong>$actor</strong> linked a Child Task <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrentask = '$date, <strong>$actor</strong> unlinked a Child Task <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkparenttask = '$date, <strong>$actor</strong> linked to a Parent Task <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkparenttask = '$date, <strong>$actor</strong> unlinked a Parent Task <strong>$extra</strong>。' . "\n";
/* 关联用例和移除用例时的历史操作记录。*/
$lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> linked to use case <strong>$extra</strong>.' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> unlinked use case <strong>$extra</strong>.' . "\n";
$lang->action->desc->linkrelatedcase = '$date, <strong>$actor</strong> linked a Use Case <strong>$extra</strong>.' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, <strong>$actor</strong> unlinked a Use Case <strong>$extra</strong>.' . "\n";
/* 用来显示动态信息。*/
$lang->action->label = new stdclass();
@@ -150,34 +158,34 @@ $lang->action->label->hidden = 'hid ';
$lang->action->label->commented = 'commented ';
$lang->action->label->activated = 'activated ';
$lang->action->label->blocked = 'blocked ';
$lang->action->label->resolved = 'resolved ';
$lang->action->label->resolved = 'solved ';
$lang->action->label->reviewed = 'reviewed ';
$lang->action->label->moved = 'moved ';
$lang->action->label->confirmed = 'Confirmed Story';
$lang->action->label->bugconfirmed = 'Confirmed';
$lang->action->label->tostory = 'Convert to Story';
$lang->action->label->confirmed = 'confirmed Story';
$lang->action->label->bugconfirmed = 'confirmed';
$lang->action->label->tostory = 'converted to Story';
$lang->action->label->frombug = 'Converted from Bug';
$lang->action->label->fromlib = 'Import from library';
$lang->action->label->totask = 'Convert to Task';
$lang->action->label->svncommited = 'SVN Commit';
$lang->action->label->gitcommited = 'Git Commit';
$lang->action->label->linked2plan = 'Link to Plan';
$lang->action->label->unlinkedfromplan = 'Unlink';
$lang->action->label->changestatus = 'Change Status';
$lang->action->label->fromlib = 'imported from Library';
$lang->action->label->totask = 'converted to Task';
$lang->action->label->svncommited = 'SVN committed';
$lang->action->label->gitcommited = 'Git committed';
$lang->action->label->linked2plan = 'linked to Plan';
$lang->action->label->unlinkedfromplan = 'unlinked from';
$lang->action->label->changestatus = 'changed Status';
$lang->action->label->marked = 'marked';
$lang->action->label->linked2project = "Link {$lang->projectCommon}";
$lang->action->label->unlinkedfromproject = "Unlink {$lang->projectCommon}";
$lang->action->label->unlinkedfrombuild = "Unlink Build";
$lang->action->label->linked2release = "Link Release";
$lang->action->label->unlinkedfromrelease = "Unlink Release";
$lang->action->label->linkrelatedbug = "Linked Bug";
$lang->action->label->unlinkrelatedbug = "Unlinked Bug";
$lang->action->label->linkrelatedcase = "Linked Case";
$lang->action->label->unlinkrelatedcase = "Unlinked Case";
$lang->action->label->linkrelatedstory = "Linked Story";
$lang->action->label->unlinkrelatedstory = "Unlinked Story";
$lang->action->label->subdividestory = "Decomposed Story";
$lang->action->label->unlinkchildstory = "Unlinked Story";
$lang->action->label->linked2project = "link {$lang->projectCommon}";
$lang->action->label->unlinkedfromproject = "unlink {$lang->projectCommon}";
$lang->action->label->unlinkedfrombuild = "unlink Build";
$lang->action->label->linked2release = "link Release";
$lang->action->label->unlinkedfromrelease = "unlink Release";
$lang->action->label->linkrelatedbug = "linked Bug";
$lang->action->label->unlinkrelatedbug = "unlinked Bug";
$lang->action->label->linkrelatedcase = "linked Case";
$lang->action->label->unlinkrelatedcase = "unlinked Case";
$lang->action->label->linkrelatedstory = "linked Story";
$lang->action->label->unlinkrelatedstory = "unlinked Story";
$lang->action->label->subdividestory = "decomposed Story";
$lang->action->label->unlinkchildstory = "unlinked Story";
$lang->action->label->started = 'started ';
$lang->action->label->restarted = 'continued ';
$lang->action->label->recordestimate = 'recorded ';
@@ -188,11 +196,166 @@ $lang->action->label->paused = 'paused ';
$lang->action->label->verified = 'verified ';
$lang->action->label->delayed = 'delayed ';
$lang->action->label->suspended = 'suspended ';
$lang->action->label->login = 'Login';
$lang->action->label->logout = "Logout";
$lang->action->label->login = 'log in';
$lang->action->label->logout = "log out";
$lang->action->label->deleteestimate = "deleted ";
$lang->action->label->linked2build = "linked ";
$lang->action->label->linked2bug = "linked ";
$lang->action->label->linkchildtask = "linked a child task";
$lang->action->label->unlinkchildrentask = "unlinked a child task";
$lang->action->label->linkparenttask = "linked a parent task";
$lang->action->label->unlinkparenttask = "unlink from parent task";
$lang->action->label->batchcreate = "batch created tasks";
$lang->action->label->createchildren = "create children task";
$lang->action->label->managed = "managed";
/* 动态信息按照对象分组 */
$lang->action->dynamicAction = new stdclass;
$lang->action->dynamicAction->todo['opened'] = 'Create Todo';
$lang->action->dynamicAction->todo['edited'] = 'Edit Todo';
$lang->action->dynamicAction->todo['erased'] = 'Delete Todo';
$lang->action->dynamicAction->todo['finished'] = 'Finish Todo';
$lang->action->dynamicAction->todo['activated'] = 'Activate Todo';
$lang->action->dynamicAction->todo['closed'] = 'Close Todo';
$lang->action->dynamicAction->todo['deleted'] = 'Delete Todo';
$lang->action->dynamicAction->todo['assigned'] = 'Assign Todo';
$lang->action->dynamicAction->todo['undeleted'] = 'Restore Todo';
$lang->action->dynamicAction->todo['hidden'] = 'Hide Todo';
$lang->action->dynamicAction->product['opened'] = 'Create ' . $lang->productCommon;
$lang->action->dynamicAction->product['edited'] = 'Edit ' . $lang->productCommon;
$lang->action->dynamicAction->product['deleted'] = 'Delete ' . $lang->productCommon;
$lang->action->dynamicAction->product['closed'] = 'Close ' . $lang->productCommon;
$lang->action->dynamicAction->product['undeleted'] = 'Restore ' . $lang->productCommon;
$lang->action->dynamicAction->product['hidden'] = 'Hide ' . $lang->productCommon;
$lang->action->dynamicAction->productplan['opened'] = 'Create Plan';
$lang->action->dynamicAction->productplan['edited'] = 'Edit Plan';
$lang->action->dynamicAction->release['opened'] = 'Create Release';
$lang->action->dynamicAction->release['edited'] = 'Edit Release';
$lang->action->dynamicAction->release['changestatus'] = 'Change Status';
$lang->action->dynamicAction->release['undeleted'] = 'Restore Release';
$lang->action->dynamicAction->release['hidden'] = 'Hide Release';
$lang->action->dynamicAction->story['opened'] = 'Create Story';
$lang->action->dynamicAction->story['edited'] = 'Edit Story';
$lang->action->dynamicAction->story['activated'] = 'Activate Story';
$lang->action->dynamicAction->story['reviewed'] = 'Review Story';
$lang->action->dynamicAction->story['closed'] = 'Close Story';
$lang->action->dynamicAction->story['assigned'] = 'Assign';
$lang->action->dynamicAction->story['changed'] = 'Change Story';
$lang->action->dynamicAction->story['linked2plan'] = 'Link Story to Plan';
$lang->action->dynamicAction->story['unlinkedfromplan'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2release'] = 'Link Story to Release';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = 'Unlink Story from Plan';
$lang->action->dynamicAction->story['linked2build'] = 'Link Story to Build';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = 'Unlink Story from Build';
$lang->action->dynamicAction->story['unlinkedfromproject'] = 'Unlink Project';
$lang->action->dynamicAction->story['undeleted'] = 'Restore Story';
$lang->action->dynamicAction->story['hidden'] = 'Hide Story';
$lang->action->dynamicAction->project['opened'] = 'Create ' . $lang->projectCommon;
$lang->action->dynamicAction->project['edited'] = 'Edit ' . $lang->projectCommon;
$lang->action->dynamicAction->project['deleted'] = 'Delete ' . $lang->projectCommon;
$lang->action->dynamicAction->project['started'] = 'Start ' . $lang->projectCommon;
$lang->action->dynamicAction->project['delayed'] = 'Delay ' . $lang->projectCommon;
$lang->action->dynamicAction->project['suspended'] = 'Suspend ' . $lang->projectCommon;
$lang->action->dynamicAction->project['activated'] = 'Activate ' . $lang->projectCommon;
$lang->action->dynamicAction->project['closed'] = 'Close ' . $lang->projectCommon;
$lang->action->dynamicAction->project['managed'] = 'Manage ' . $lang->projectCommon;
$lang->action->dynamicAction->project['undeleted'] = 'Restore ' . $lang->projectCommon;
$lang->action->dynamicAction->project['hidden'] = 'Hide ' . $lang->projectCommon;
$lang->action->dynamicAction->project['moved'] = 'Improt Task';
$lang->action->dynamicAction->task['opened'] = 'Create Task';
$lang->action->dynamicAction->task['edited'] = 'Edit Task';
$lang->action->dynamicAction->task['commented'] = 'Task Comment';
$lang->action->dynamicAction->task['assigned'] = 'Assign Task';
$lang->action->dynamicAction->task['confirmed'] = 'Confirm Task';
$lang->action->dynamicAction->task['started'] = 'Start Task';
$lang->action->dynamicAction->task['finished'] = 'Finish Task';
$lang->action->dynamicAction->task['recordestimate'] = 'Add Estimates';
$lang->action->dynamicAction->task['editestimate'] = 'Edit Estimates';
$lang->action->dynamicAction->task['deleteestimate'] = 'Delete Estimates';
$lang->action->dynamicAction->task['paused'] = 'Pause Task';
$lang->action->dynamicAction->task['closed'] = 'Close Task';
$lang->action->dynamicAction->task['canceled'] = 'Cancel Task';
$lang->action->dynamicAction->task['activated'] = 'Activate Task';
$lang->action->dynamicAction->task['createchildren'] = 'Create Child Task';
$lang->action->dynamicAction->task['unlinkparenttask'] = 'Unlink Parent Task';
$lang->action->dynamicAction->task['linkparenttask'] = 'Link Parent Task';
$lang->action->dynamicAction->task['linkchildtask'] = 'Link Child Task';
$lang->action->dynamicAction->task['undeleted'] = 'Restore Task';
$lang->action->dynamicAction->task['hidden'] = 'Hide Task';
$lang->action->dynamicAction->task['svncommited'] = 'SVN Commit';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT Commit';
$lang->action->dynamicAction->build['opened'] = 'Create Build';
$lang->action->dynamicAction->build['edited'] = 'Edit Build';
$lang->action->dynamicAction->bug['opened'] = 'Report Bug';
$lang->action->dynamicAction->bug['edited'] = 'Edit Bug';
$lang->action->dynamicAction->bug['activated'] = 'Activate Bug';
$lang->action->dynamicAction->bug['assigned'] = 'Assign Bug';
$lang->action->dynamicAction->bug['closed'] = 'Close Bug';
$lang->action->dynamicAction->bug['bugconfirmed'] = 'Confirm Bug';
$lang->action->dynamicAction->bug['resolved'] = 'Solve Bug';
$lang->action->dynamicAction->bug['undeleted'] = 'Restore Bug';
$lang->action->dynamicAction->bug['hidden'] = 'Hide Bug';
$lang->action->dynamicAction->bug['confirmed'] = 'Confirm Story Change';
$lang->action->dynamicAction->bug['tostory'] = 'Convert to Story';
$lang->action->dynamicAction->bug['totask'] = 'Convert to Task';
$lang->action->dynamicAction->bug['linked2plan'] = 'Link Plan';
$lang->action->dynamicAction->bug['unlinkedfromplan'] = 'Unlink Plan';
$lang->action->dynamicAction->bug['linked2release'] = 'Link Release';
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = 'Unlink Plan';
$lang->action->dynamicAction->bug['linked2bug'] = 'Link Build';
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = 'Unlink Build';
$lang->action->dynamicAction->testtask['opened'] = 'Create Case';
$lang->action->dynamicAction->testtask['edited'] = 'Edit Case';
$lang->action->dynamicAction->testtask['started'] = 'Start Case';
$lang->action->dynamicAction->testtask['activated'] = 'Activate Case';
$lang->action->dynamicAction->testtask['closed'] = 'Close Case';
$lang->action->dynamicAction->testtask['blocked'] = 'Blocked Case';
$lang->action->dynamicAction->case['opened'] = 'Create Case';
$lang->action->dynamicAction->case['edited'] = 'Edit Case';
$lang->action->dynamicAction->case['deleted'] = 'Delete Case';
$lang->action->dynamicAction->case['undeleted'] = 'Restore Case';
$lang->action->dynamicAction->case['hidden'] = 'Hide Case';
$lang->action->dynamicAction->case['reviewed'] = 'Add Review Result';
$lang->action->dynamicAction->case['confirmed'] = 'Confirm Case';
$lang->action->dynamicAction->case['fromlib'] = 'Import from Case Lib';
$lang->action->dynamicAction->testreport['opened'] = 'Create Test Report';
$lang->action->dynamicAction->testreport['edited'] = 'Edit Test Report';
$lang->action->dynamicAction->testreport['deleted'] = 'Delete Test Report';
$lang->action->dynamicAction->testreport['undeleted'] = 'Restore Test Report';
$lang->action->dynamicAction->testreport['hidden'] = 'Hide Test Report';
$lang->action->dynamicAction->testsuite['opened'] = 'Create Test Suite';
$lang->action->dynamicAction->testsuite['edited'] = 'Edit Test Suite';
$lang->action->dynamicAction->testsuite['deleted'] = 'Deleted Test Suite';
$lang->action->dynamicAction->testsuite['undeleted'] = 'Restore Test Suite';
$lang->action->dynamicAction->testsuite['hidden'] = 'Hidden Test Suite';
$lang->action->dynamicAction->caselib['opened'] = 'Create Case Lib';
$lang->action->dynamicAction->caselib['edited'] = 'Edit Case Lib';
$lang->action->dynamicAction->caselib['deleted'] = 'Deleted Case Lib';
$lang->action->dynamicAction->caselib['undeleted'] = 'Restore Case Lib';
$lang->action->dynamicAction->caselib['hidden'] = 'Hidden Case Lib';
$lang->action->dynamicAction->doclib['created'] = 'Create Doc Lib';
$lang->action->dynamicAction->doclib['edited'] = 'Edit Doc Lib';
$lang->action->dynamicAction->doc['created'] = 'Create Doc';
$lang->action->dynamicAction->doc['edited'] = 'Edit Doc';
$lang->action->dynamicAction->doc['commented'] = 'Comment Doc';
$lang->action->dynamicAction->doc['deleted'] = 'Delete Doc';
$lang->action->dynamicAction->doc['undeleted'] = 'Restore Doc';
$lang->action->dynamicAction->doc['hidden'] = 'Hide Doc';
$lang->action->dynamicAction->user['created'] = 'Create User';
$lang->action->dynamicAction->user['edited'] = 'Edit User';
$lang->action->dynamicAction->user['login'] = 'User Login';
$lang->action->dynamicAction->user['logout'] = 'User Logout';
$lang->action->dynamicAction->user['undeleted'] = 'Restore User';
$lang->action->dynamicAction->user['hidden'] = 'Hide User';
$lang->action->dynamicAction->user['loginxuanxuan'] = 'Login Xuan';
$lang->action->dynamicAction->entry['created'] = 'Add Entry';
$lang->action->dynamicAction->entry['edited'] = 'Edit Entry';
/* 用来生成相应对象的链接。*/
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
@@ -204,11 +367,11 @@ $lang->action->label->task = 'Task|task|view|taskID=%s';
$lang->action->label->build = 'Build|build|view|buildID=%s';
$lang->action->label->bug = 'Bug|bug|view|bugID=%s';
$lang->action->label->case = 'Case|testcase|view|caseID=%s';
$lang->action->label->testtask = 'Test Task|testtask|view|caseID=%s';
$lang->action->label->testtask = 'Test|testtask|view|caseID=%s';
$lang->action->label->testsuite = 'Test Suite|testsuite|view|suiteID=%s';
$lang->action->label->caselib = 'Case Library|testsuite|libview|libID=%s';
$lang->action->label->todo = 'Todo|todo|view|todoID=%s';
$lang->action->label->doclib = 'Doc Lib|doc|browse|libID=%s';
$lang->action->label->doclib = 'Doc Library|doc|browse|libID=%s';
$lang->action->label->doc = 'Doc|doc|view|docID=%s';
$lang->action->label->user = 'User|user|view|account=%s';
$lang->action->label->testreport = 'Report|testreport|view|report=%s';
@@ -226,7 +389,7 @@ $lang->action->search->objectTypeList['caseresult'] = 'Case Results';
$lang->action->search->objectTypeList['stepresult'] = 'Case Steps';
$lang->action->search->objectTypeList['story'] = 'Story';
$lang->action->search->objectTypeList['task'] = 'Task';
$lang->action->search->objectTypeList['testtask'] = 'Test Task';
$lang->action->search->objectTypeList['testtask'] = 'Test';
$lang->action->search->objectTypeList['user'] = 'User';
$lang->action->search->objectTypeList['doc'] = 'Doc';
$lang->action->search->objectTypeList['doclib'] = 'Doc Lib';
+163
View File
@@ -129,6 +129,14 @@ $lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,
$lang->action->desc->diff3 = '将文件名 %s 改为 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 关联到版本 <strong>$extra</strong>';
/* 子任务修改父任务的历史操作记录 */
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 创建子任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 关联子任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 关联子任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrentask = '$date, 由 <strong>$actor</strong> 移除子任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkparenttask = '$date, 由 <strong>$actor</strong> 关联到父任务 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkparenttask = '$date, 由 <strong>$actor</strong> 从父任务<strong>$extra</strong>取消关联。' . "\n";
/* 关联用例和移除用例时的历史操作记录。*/
$lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 关联相关用例 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, 由 <strong>$actor</strong> 移除相关用例 <strong>$extra</strong>。' . "\n";
@@ -193,6 +201,161 @@ $lang->action->label->logout = "退出登录";
$lang->action->label->deleteestimate = "删除了工时";
$lang->action->label->linked2build = "关联了";
$lang->action->label->linked2bug = "关联了";
$lang->action->label->linkchildtask = "关联子任务";
$lang->action->label->unlinkchildrentask = "取消关联子任务";
$lang->action->label->linkparenttask = "关联到父任务";
$lang->action->label->unlinkparenttask = "从父任务取消关联";
$lang->action->label->batchcreate = "批量创建任务";
$lang->action->label->createchildren = "创建子任务";
$lang->action->label->managed = "维护";
/* 动态信息按照对象分组 */
$lang->action->dynamicAction = new stdclass;
$lang->action->dynamicAction->todo['opened'] = '创建待办';
$lang->action->dynamicAction->todo['edited'] = '编辑待办';
$lang->action->dynamicAction->todo['erased'] = '删除待办';
$lang->action->dynamicAction->todo['finished'] = '完成待办';
$lang->action->dynamicAction->todo['activated'] = '激活待办';
$lang->action->dynamicAction->todo['closed'] = '关闭待办';
$lang->action->dynamicAction->todo['deleted'] = '删除待办';
$lang->action->dynamicAction->todo['assigned'] = '指派待办';
$lang->action->dynamicAction->todo['undeleted'] = '还原待办';
$lang->action->dynamicAction->todo['hidden'] = '隐藏待办';
$lang->action->dynamicAction->product['opened'] = '创建' . $lang->productCommon;
$lang->action->dynamicAction->product['edited'] = '编辑' . $lang->productCommon;
$lang->action->dynamicAction->product['deleted'] = '删除' . $lang->productCommon;
$lang->action->dynamicAction->product['closed'] = '关闭' . $lang->productCommon;
$lang->action->dynamicAction->product['undeleted'] = '还原' . $lang->productCommon;
$lang->action->dynamicAction->product['hidden'] = '隐藏' . $lang->productCommon;
$lang->action->dynamicAction->productplan['opened'] = '创建计划';
$lang->action->dynamicAction->productplan['edited'] = '编辑计划';
$lang->action->dynamicAction->release['opened'] = '创建发布';
$lang->action->dynamicAction->release['edited'] = '编辑发布';
$lang->action->dynamicAction->release['changestatus'] = '修改发布状态';
$lang->action->dynamicAction->release['undeleted'] = '还原发布';
$lang->action->dynamicAction->release['hidden'] = '隐藏发布';
$lang->action->dynamicAction->story['opened'] = '创建需求';
$lang->action->dynamicAction->story['edited'] = '编辑需求';
$lang->action->dynamicAction->story['activated'] = '激活需求';
$lang->action->dynamicAction->story['reviewed'] = '评审需求';
$lang->action->dynamicAction->story['closed'] = '关闭需求';
$lang->action->dynamicAction->story['assigned'] = '指派需求';
$lang->action->dynamicAction->story['changed'] = '变更需求';
$lang->action->dynamicAction->story['linked2plan'] = '需求关联计划';
$lang->action->dynamicAction->story['unlinkedfromplan'] = '计划移除需求';
$lang->action->dynamicAction->story['linked2release'] = '需求关联发布';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = '发布移除需求';
$lang->action->dynamicAction->story['linked2build'] = '需求关联版本';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = '版本移除需求';
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除项目';
$lang->action->dynamicAction->story['undeleted'] = '还原需求';
$lang->action->dynamicAction->story['hidden'] = '隐藏需求';
$lang->action->dynamicAction->project['opened'] = '创建' . $lang->projectCommon;
$lang->action->dynamicAction->project['edited'] = '编辑' . $lang->projectCommon;
$lang->action->dynamicAction->project['deleted'] = '删除' . $lang->projectCommon;
$lang->action->dynamicAction->project['started'] = '开始' . $lang->projectCommon;
$lang->action->dynamicAction->project['delayed'] = '延期' . $lang->projectCommon;
$lang->action->dynamicAction->project['suspended'] = '挂起' . $lang->projectCommon;
$lang->action->dynamicAction->project['activated'] = '激活' . $lang->projectCommon;
$lang->action->dynamicAction->project['closed'] = '关闭' . $lang->projectCommon;
$lang->action->dynamicAction->project['managed'] = '维护' . $lang->projectCommon;
$lang->action->dynamicAction->project['undeleted'] = '还原' . $lang->projectCommon;
$lang->action->dynamicAction->project['hidden'] = '隐藏' . $lang->projectCommon;
$lang->action->dynamicAction->project['moved'] = '导入任务';
$lang->action->dynamicAction->task['opened'] = '创建任务';
$lang->action->dynamicAction->task['edited'] = '编辑任务';
$lang->action->dynamicAction->task['commented'] = '备注任务';
$lang->action->dynamicAction->task['assigned'] = '指派任务';
$lang->action->dynamicAction->task['confirmed'] = '确认需求变更';
$lang->action->dynamicAction->task['started'] = '开始任务';
$lang->action->dynamicAction->task['finished'] = '完成任务';
$lang->action->dynamicAction->task['recordestimate'] = '记录工时';
$lang->action->dynamicAction->task['editestimate'] = '编辑工时';
$lang->action->dynamicAction->task['deleteestimate'] = '删除工时';
$lang->action->dynamicAction->task['paused'] = '暂停任务';
$lang->action->dynamicAction->task['closed'] = '关闭任务';
$lang->action->dynamicAction->task['canceled'] = '取消任务';
$lang->action->dynamicAction->task['activated'] = '激活任务';
$lang->action->dynamicAction->task['createchildren'] = '创建子任务';
$lang->action->dynamicAction->task['unlinkparenttask'] = '从父任务取消关联';
$lang->action->dynamicAction->task['linkparenttask'] = '关联到父任务';
$lang->action->dynamicAction->task['linkchildtask'] = '关联子任务';
$lang->action->dynamicAction->task['undeleted'] = '还原任务';
$lang->action->dynamicAction->task['hidden'] = '隐藏任务';
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
$lang->action->dynamicAction->build['opened'] = '创建版本';
$lang->action->dynamicAction->build['edited'] = '编辑版本';
$lang->action->dynamicAction->bug['opened'] = '创建Bug';
$lang->action->dynamicAction->bug['edited'] = '编辑Bug';
$lang->action->dynamicAction->bug['activated'] = '激活Bug';
$lang->action->dynamicAction->bug['assigned'] = '指派Bug';
$lang->action->dynamicAction->bug['closed'] = '关闭Bug';
$lang->action->dynamicAction->bug['bugconfirmed'] = '确认Bug';
$lang->action->dynamicAction->bug['resolved'] = '解决Bug';
$lang->action->dynamicAction->bug['undeleted'] = '还原Bug';
$lang->action->dynamicAction->bug['hidden'] = '隐藏Bug';
$lang->action->dynamicAction->bug['confirmed'] = '确认需求变更';
$lang->action->dynamicAction->bug['tostory'] = '转需求';
$lang->action->dynamicAction->bug['totask'] = '转任务';
$lang->action->dynamicAction->bug['linked2plan'] = 'Bug关联计划';
$lang->action->dynamicAction->bug['unlinkedfromplan'] = '计划移除Bug';
$lang->action->dynamicAction->bug['linked2release'] = 'Bug关联发布';
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = '发布移除Bug';
$lang->action->dynamicAction->bug['linked2bug'] = 'Bug关联版本';
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug';
$lang->action->dynamicAction->testtask['opened'] = '创建测试单';
$lang->action->dynamicAction->testtask['edited'] = '编辑测试单';
$lang->action->dynamicAction->testtask['started'] = '启动测试单';
$lang->action->dynamicAction->testtask['activated'] = '激活测试单';
$lang->action->dynamicAction->testtask['closed'] = '完成测试单';
$lang->action->dynamicAction->testtask['blocked'] = '阻塞测试单';
$lang->action->dynamicAction->case['opened'] = '创建用例';
$lang->action->dynamicAction->case['edited'] = '编辑用例';
$lang->action->dynamicAction->case['deleted'] = '删除用例';
$lang->action->dynamicAction->case['undeleted'] = '还原用例';
$lang->action->dynamicAction->case['hidden'] = '隐藏用例';
$lang->action->dynamicAction->case['reviewed'] = '评审用例';
$lang->action->dynamicAction->case['confirmed'] = '确认需求变更';
$lang->action->dynamicAction->case['fromlib'] = '从用例库导入';
$lang->action->dynamicAction->testreport['opened'] = '创建测试报告';
$lang->action->dynamicAction->testreport['edited'] = '编辑测试报告';
$lang->action->dynamicAction->testreport['deleted'] = '删除测试报告';
$lang->action->dynamicAction->testreport['undeleted'] = '还原测试报告';
$lang->action->dynamicAction->testreport['hidden'] = '隐藏测试报告';
$lang->action->dynamicAction->testsuite['opened'] = '创建测试套件';
$lang->action->dynamicAction->testsuite['edited'] = '编辑测试套件';
$lang->action->dynamicAction->testsuite['deleted'] = '删除测试套件';
$lang->action->dynamicAction->testsuite['undeleted'] = '还原测试套件';
$lang->action->dynamicAction->testsuite['hidden'] = '隐藏测试套件';
$lang->action->dynamicAction->caselib['opened'] = '创建用例库';
$lang->action->dynamicAction->caselib['edited'] = '编辑用例库';
$lang->action->dynamicAction->caselib['deleted'] = '删除用例库';
$lang->action->dynamicAction->caselib['undeleted'] = '还原用例库';
$lang->action->dynamicAction->caselib['hidden'] = '隐藏用例库';
$lang->action->dynamicAction->doclib['created'] = '创建文档库';
$lang->action->dynamicAction->doclib['edited'] = '编辑文档库';
$lang->action->dynamicAction->doc['created'] = '创建文档';
$lang->action->dynamicAction->doc['edited'] = '编辑文档';
$lang->action->dynamicAction->doc['commented'] = '备注文档';
$lang->action->dynamicAction->doc['deleted'] = '删除文档';
$lang->action->dynamicAction->doc['undeleted'] = '还原文档';
$lang->action->dynamicAction->doc['hidden'] = '隐藏文档';
$lang->action->dynamicAction->user['created'] = '创建用户';
$lang->action->dynamicAction->user['edited'] = '编辑用户';
$lang->action->dynamicAction->user['login'] = '用户登录';
$lang->action->dynamicAction->user['logout'] = '用户退出';
$lang->action->dynamicAction->user['undeleted'] = '还原用户';
$lang->action->dynamicAction->user['hidden'] = '隐藏用户';
$lang->action->dynamicAction->user['loginxuanxuan'] = '登录客户端';
$lang->action->dynamicAction->entry['created'] = '添加应用';
$lang->action->dynamicAction->entry['edited'] = '编辑应用';
/* 用来生成相应对象的链接。*/
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
+163
View File
@@ -129,6 +129,14 @@ $lang->action->desc->diff2 = '修改了 <strong><i>%s</i></strong>,
$lang->action->desc->diff3 = '將檔案名 %s 改為 %s 。' . "\n";
$lang->action->desc->linked2bug = '$date 由 <strong>$actor</strong> 關聯到版本 <strong>$extra</strong>';
/* 子任務修改父任務的歷史操作記錄 */
$lang->action->desc->createchildren = '$date, 由 <strong>$actor</strong> 創建子任務 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 關聯子任務 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkchildtask = '$date, 由 <strong>$actor</strong> 關聯子任務 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkchildrentask = '$date, 由 <strong>$actor</strong> 移除子任務 <strong>$extra</strong>。' . "\n";
$lang->action->desc->linkparenttask = '$date, 由 <strong>$actor</strong> 關聯到父任務 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkparenttask = '$date, 由 <strong>$actor</strong> 從父任務<strong>$extra</strong>取消關聯。' . "\n";
/* 關聯用例和移除用例時的歷史操作記錄。*/
$lang->action->desc->linkrelatedcase = '$date, 由 <strong>$actor</strong> 關聯相關用例 <strong>$extra</strong>。' . "\n";
$lang->action->desc->unlinkrelatedcase = '$date, 由 <strong>$actor</strong> 移除相關用例 <strong>$extra</strong>。' . "\n";
@@ -193,6 +201,161 @@ $lang->action->label->logout = "退出登錄";
$lang->action->label->deleteestimate = "刪除了工時";
$lang->action->label->linked2build = "關聯了";
$lang->action->label->linked2bug = "關聯了";
$lang->action->label->linkchildtask = "關聯子任務";
$lang->action->label->unlinkchildrentask = "取消關聯子任務";
$lang->action->label->linkparenttask = "關聯到父任務";
$lang->action->label->unlinkparenttask = "從父任務取消關聯";
$lang->action->label->batchcreate = "批量創建任務";
$lang->action->label->createchildren = "創建子任務";
$lang->action->label->managed = "維護";
/* 動態信息按照對象分組 */
$lang->action->dynamicAction = new stdclass;
$lang->action->dynamicAction->todo['opened'] = '創建待辦';
$lang->action->dynamicAction->todo['edited'] = '編輯待辦';
$lang->action->dynamicAction->todo['erased'] = '刪除待辦';
$lang->action->dynamicAction->todo['finished'] = '完成待辦';
$lang->action->dynamicAction->todo['activated'] = '激活待辦';
$lang->action->dynamicAction->todo['closed'] = '關閉待辦';
$lang->action->dynamicAction->todo['deleted'] = '刪除待辦';
$lang->action->dynamicAction->todo['assigned'] = '指派待辦';
$lang->action->dynamicAction->todo['undeleted'] = '還原待辦';
$lang->action->dynamicAction->todo['hidden'] = '隱藏待辦';
$lang->action->dynamicAction->product['opened'] = '創建' . $lang->productCommon;
$lang->action->dynamicAction->product['edited'] = '編輯' . $lang->productCommon;
$lang->action->dynamicAction->product['deleted'] = '刪除' . $lang->productCommon;
$lang->action->dynamicAction->product['closed'] = '關閉' . $lang->productCommon;
$lang->action->dynamicAction->product['undeleted'] = '還原' . $lang->productCommon;
$lang->action->dynamicAction->product['hidden'] = '隱藏' . $lang->productCommon;
$lang->action->dynamicAction->productplan['opened'] = '創建計劃';
$lang->action->dynamicAction->productplan['edited'] = '編輯計劃';
$lang->action->dynamicAction->release['opened'] = '創建發佈';
$lang->action->dynamicAction->release['edited'] = '編輯發佈';
$lang->action->dynamicAction->release['changestatus'] = '修改發佈狀態';
$lang->action->dynamicAction->release['undeleted'] = '還原發佈';
$lang->action->dynamicAction->release['hidden'] = '隱藏發佈';
$lang->action->dynamicAction->story['opened'] = '創建需求';
$lang->action->dynamicAction->story['edited'] = '編輯需求';
$lang->action->dynamicAction->story['activated'] = '激活需求';
$lang->action->dynamicAction->story['reviewed'] = '評審需求';
$lang->action->dynamicAction->story['closed'] = '關閉需求';
$lang->action->dynamicAction->story['assigned'] = '指派需求';
$lang->action->dynamicAction->story['changed'] = '變更需求';
$lang->action->dynamicAction->story['linked2plan'] = '需求關聯計劃';
$lang->action->dynamicAction->story['unlinkedfromplan'] = '計劃移除需求';
$lang->action->dynamicAction->story['linked2release'] = '需求關聯發佈';
$lang->action->dynamicAction->story['unlinkedfromrelease'] = '發佈移除需求';
$lang->action->dynamicAction->story['linked2build'] = '需求關聯版本';
$lang->action->dynamicAction->story['unlinkedfrombuild'] = '版本移除需求';
$lang->action->dynamicAction->story['unlinkedfromproject'] = '移除項目';
$lang->action->dynamicAction->story['undeleted'] = '還原需求';
$lang->action->dynamicAction->story['hidden'] = '隱藏需求';
$lang->action->dynamicAction->project['opened'] = '創建' . $lang->projectCommon;
$lang->action->dynamicAction->project['edited'] = '編輯' . $lang->projectCommon;
$lang->action->dynamicAction->project['deleted'] = '刪除' . $lang->projectCommon;
$lang->action->dynamicAction->project['started'] = '開始' . $lang->projectCommon;
$lang->action->dynamicAction->project['delayed'] = '延期' . $lang->projectCommon;
$lang->action->dynamicAction->project['suspended'] = '掛起' . $lang->projectCommon;
$lang->action->dynamicAction->project['activated'] = '激活' . $lang->projectCommon;
$lang->action->dynamicAction->project['closed'] = '關閉' . $lang->projectCommon;
$lang->action->dynamicAction->project['managed'] = '維護' . $lang->projectCommon;
$lang->action->dynamicAction->project['undeleted'] = '還原' . $lang->projectCommon;
$lang->action->dynamicAction->project['hidden'] = '隱藏' . $lang->projectCommon;
$lang->action->dynamicAction->project['moved'] = '導入任務';
$lang->action->dynamicAction->task['opened'] = '創建任務';
$lang->action->dynamicAction->task['edited'] = '編輯任務';
$lang->action->dynamicAction->task['commented'] = '備註任務';
$lang->action->dynamicAction->task['assigned'] = '指派任務';
$lang->action->dynamicAction->task['confirmed'] = '確認需求變更';
$lang->action->dynamicAction->task['started'] = '開始任務';
$lang->action->dynamicAction->task['finished'] = '完成任務';
$lang->action->dynamicAction->task['recordestimate'] = '記錄工時';
$lang->action->dynamicAction->task['editestimate'] = '編輯工時';
$lang->action->dynamicAction->task['deleteestimate'] = '刪除工時';
$lang->action->dynamicAction->task['paused'] = '暫停任務';
$lang->action->dynamicAction->task['closed'] = '關閉任務';
$lang->action->dynamicAction->task['canceled'] = '取消任務';
$lang->action->dynamicAction->task['activated'] = '激活任務';
$lang->action->dynamicAction->task['createchildren'] = '創建子任務';
$lang->action->dynamicAction->task['unlinkparenttask'] = '從父任務取消關聯';
$lang->action->dynamicAction->task['linkparenttask'] = '關聯到父任務';
$lang->action->dynamicAction->task['linkchildtask'] = '關聯子任務';
$lang->action->dynamicAction->task['undeleted'] = '還原任務';
$lang->action->dynamicAction->task['hidden'] = '隱藏任務';
$lang->action->dynamicAction->task['svncommited'] = 'SVN提交';
$lang->action->dynamicAction->task['gitcommited'] = 'GIT提交';
$lang->action->dynamicAction->build['opened'] = '創建版本';
$lang->action->dynamicAction->build['edited'] = '編輯版本';
$lang->action->dynamicAction->bug['opened'] = '創建Bug';
$lang->action->dynamicAction->bug['edited'] = '編輯Bug';
$lang->action->dynamicAction->bug['activated'] = '激活Bug';
$lang->action->dynamicAction->bug['assigned'] = '指派Bug';
$lang->action->dynamicAction->bug['closed'] = '關閉Bug';
$lang->action->dynamicAction->bug['bugconfirmed'] = '確認Bug';
$lang->action->dynamicAction->bug['resolved'] = '解決Bug';
$lang->action->dynamicAction->bug['undeleted'] = '還原Bug';
$lang->action->dynamicAction->bug['hidden'] = '隱藏Bug';
$lang->action->dynamicAction->bug['confirmed'] = '確認需求變更';
$lang->action->dynamicAction->bug['tostory'] = '轉需求';
$lang->action->dynamicAction->bug['totask'] = '轉任務';
$lang->action->dynamicAction->bug['linked2plan'] = 'Bug關聯計劃';
$lang->action->dynamicAction->bug['unlinkedfromplan'] = '計劃移除Bug';
$lang->action->dynamicAction->bug['linked2release'] = 'Bug關聯發佈';
$lang->action->dynamicAction->bug['unlinkedfromrelease'] = '發佈移除Bug';
$lang->action->dynamicAction->bug['linked2bug'] = 'Bug關聯版本';
$lang->action->dynamicAction->bug['unlinkedfrombuild'] = '版本移除Bug';
$lang->action->dynamicAction->testtask['opened'] = '創建測試單';
$lang->action->dynamicAction->testtask['edited'] = '編輯測試單';
$lang->action->dynamicAction->testtask['started'] = '啟動測試單';
$lang->action->dynamicAction->testtask['activated'] = '激活測試單';
$lang->action->dynamicAction->testtask['closed'] = '完成測試單';
$lang->action->dynamicAction->testtask['blocked'] = '阻塞測試單';
$lang->action->dynamicAction->case['opened'] = '創建用例';
$lang->action->dynamicAction->case['edited'] = '編輯用例';
$lang->action->dynamicAction->case['deleted'] = '刪除用例';
$lang->action->dynamicAction->case['undeleted'] = '還原用例';
$lang->action->dynamicAction->case['hidden'] = '隱藏用例';
$lang->action->dynamicAction->case['reviewed'] = '評審用例';
$lang->action->dynamicAction->case['confirmed'] = '確認需求變更';
$lang->action->dynamicAction->case['fromlib'] = '從用例庫導入';
$lang->action->dynamicAction->testreport['opened'] = '創建測試報告';
$lang->action->dynamicAction->testreport['edited'] = '編輯測試報告';
$lang->action->dynamicAction->testreport['deleted'] = '刪除測試報告';
$lang->action->dynamicAction->testreport['undeleted'] = '還原測試報告';
$lang->action->dynamicAction->testreport['hidden'] = '隱藏測試報告';
$lang->action->dynamicAction->testsuite['opened'] = '創建測試套件';
$lang->action->dynamicAction->testsuite['edited'] = '編輯測試套件';
$lang->action->dynamicAction->testsuite['deleted'] = '刪除測試套件';
$lang->action->dynamicAction->testsuite['undeleted'] = '還原測試套件';
$lang->action->dynamicAction->testsuite['hidden'] = '隱藏測試套件';
$lang->action->dynamicAction->caselib['opened'] = '創建用例庫';
$lang->action->dynamicAction->caselib['edited'] = '編輯用例庫';
$lang->action->dynamicAction->caselib['deleted'] = '刪除用例庫';
$lang->action->dynamicAction->caselib['undeleted'] = '還原用例庫';
$lang->action->dynamicAction->caselib['hidden'] = '隱藏用例庫';
$lang->action->dynamicAction->doclib['created'] = '創建文檔庫';
$lang->action->dynamicAction->doclib['edited'] = '編輯文檔庫';
$lang->action->dynamicAction->doc['created'] = '創建文檔';
$lang->action->dynamicAction->doc['edited'] = '編輯文檔';
$lang->action->dynamicAction->doc['commented'] = '備註文檔';
$lang->action->dynamicAction->doc['deleted'] = '刪除文檔';
$lang->action->dynamicAction->doc['undeleted'] = '還原文檔';
$lang->action->dynamicAction->doc['hidden'] = '隱藏文檔';
$lang->action->dynamicAction->user['created'] = '創建用戶';
$lang->action->dynamicAction->user['edited'] = '編輯用戶';
$lang->action->dynamicAction->user['login'] = '用戶登錄';
$lang->action->dynamicAction->user['logout'] = '用戶退出';
$lang->action->dynamicAction->user['undeleted'] = '還原用戶';
$lang->action->dynamicAction->user['hidden'] = '隱藏用戶';
$lang->action->dynamicAction->user['loginxuanxuan'] = '登錄客戶端';
$lang->action->dynamicAction->entry['created'] = '添加應用';
$lang->action->dynamicAction->entry['edited'] = '編輯應用';
/* 用來生成相應對象的連結。*/
$lang->action->label->product = $lang->productCommon . '|product|view|productID=%s';
+61 -17
View File
@@ -36,7 +36,7 @@ class actionModel extends model
$actor = $actor ? $actor : $this->app->user->account;
$actionType = strtolower($actionType);
if($actor == 'guest' and $actionType == 'logout') return false;
$action = new stdclass();
$objectType = str_replace('`', '', $objectType);
@@ -291,7 +291,17 @@ class actionModel extends model
$title = $this->dao->select('title')->from(TABLE_STORY)->where('id')->eq($action->extra)->fetch('title');
if($title) $action->extra = common::hasPriv('story', 'view') ? html::a(helper::createLink('story', 'view', "storyID=$action->extra"), "#$action->extra " . $title) : "#$action->extra " . $title;
}
elseif($actionName == 'totask')
elseif($actionName == 'createchildren')
{
$names = $this->dao->select('id,name')->from(TABLE_TASK)->where('id')->in($action->extra)->fetchPairs('id', 'name');
$action->extra = '';
if($names)
{
foreach($names as $id => $name) $action->extra .= common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$id"), "#$id " . $name) . ', ' : "#$id " . $name . ', ';
}
$action->extra = trim(trim($action->extra), ',');
}
elseif($actionName == 'totask' or $actionName == 'linkchildtask' or $actionName == 'unlinkchildrentask' or $actionName == 'linkparenttask' or $actionName == 'unlinkparenttask')
{
$name = $this->dao->select('name')->from(TABLE_TASK)->where('id')->eq($action->extra)->fetch('name');
if($name) $action->extra = common::hasPriv('task', 'view') ? html::a(helper::createLink('task', 'view', "taskID=$action->extra"), "#$action->extra " . $name) : "#$action->extra " . $name;
@@ -346,7 +356,11 @@ class actionModel extends model
{
$linkedProducts = $this->dao->select('id,name')->from(TABLE_PRODUCT)->where('id')->in($action->extra)->fetchPairs('id', 'name');
$action->extra = '';
if($linkedProducts) $action->extra = sprintf($this->lang->project->action->extra, '<strong>' . join(', ', $linkedProducts) . '</strong>');
if($linkedProducts)
{
foreach($linkedProducts as $productID => $productName) $linkedProducts[$productID] = html::a(helper::createLink('product', 'browse', "productID=$productID"), "#{$productID} {$productName}");
$action->extra = sprintf($this->lang->project->action->extra, '<strong>' . join(', ', $linkedProducts) . '</strong>');
}
}
$action->history = isset($histories[$actionID]) ? $histories[$actionID] : array();
@@ -365,7 +379,7 @@ class actionModel extends model
if($history->field == 'git') $history->diff = str_replace('+', '%2B', $history->diff);
}
}
$action->comment = $this->file->setImgSize($action->comment, $this->config->action->commonImgSize);
$actions[$actionID] = $action;
}
@@ -488,7 +502,7 @@ class actionModel extends model
* @access public
* @return void
*/
public function printAction($action)
public function printAction($action, $desc = '')
{
if(!isset($action->objectType) or !isset($action->action)) return false;
@@ -502,17 +516,20 @@ class actionModel extends model
* 2. If no defined in the module language, search the common action define.
* 3. If not found in the lang->action->desc, use the $lang->action->desc->common or $lang->action->desc->extra as the default.
*/
if(isset($this->lang->$objectType) && isset($this->lang->$objectType->action->$actionType))
if(empty($desc))
{
$desc = $this->lang->$objectType->action->$actionType;
}
elseif(isset($this->lang->action->desc->$actionType))
{
$desc = $this->lang->action->desc->$actionType;
}
else
{
$desc = $action->extra ? $this->lang->action->desc->extra : $this->lang->action->desc->common;
if(isset($this->lang->$objectType) && isset($this->lang->$objectType->action->$actionType))
{
$desc = $this->lang->$objectType->action->$actionType;
}
elseif(isset($this->lang->action->desc->$actionType))
{
$desc = $this->lang->action->desc->$actionType;
}
else
{
$desc = $action->extra ? $this->lang->action->desc->extra : $this->lang->action->desc->common;
}
}
if($this->app->getViewType() == 'mhtml') $action->date = date('m-d H:i', strtotime($action->date));
@@ -598,7 +615,9 @@ class actionModel extends model
$this->loadModel('doc');
$libs = $this->doc->getLibs('all');
$docs = $this->doc->getPrivDocs(array_keys($libs));
$actionCondition = $this->getActionCondition();
if(is_array($actionCondition)) return array();
/* Get actions. */
$actions = $this->dao->select('*')->from(TABLE_ACTION)
->where(1)
@@ -616,6 +635,7 @@ class actionModel extends model
->beginIF($this->config->global->flow == 'onlyStory')->andWhere('objectType')->notin('bug,build,project,task,taskcase,testreport,testsuite,testtask')->fi()
->beginIF($this->config->global->flow == 'onlyTask')->andWhere('objectType')->notin('product,productplan,release,story,testcase,testreport,testsuite')->fi()
->beginIF($this->config->global->flow == 'onlyTest')->andWhere('objectType')->notin('project,productplan,release,story,task')->fi()
->beginIF(!empty($actionCondition))->andWhere("($actionCondition)")->fi()
->orderBy($orderBy)
->page($pager)
->fetchAll();
@@ -623,7 +643,28 @@ class actionModel extends model
if(!$actions) return array();
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'action');
return $this->transformActions($actions);
return $this->transformActions($actions);;
}
/**
* Get dynamic show action
*
* @return String
*/
public function getActionCondition()
{
$actionCondition = '';
if(isset($this->app->user->rights['acls']['actions']))
{
if(empty($this->app->user->rights['acls']['actions'])) return array();
foreach($this->app->user->rights['acls']['actions'] as $moduleName => $actions)
{
$actionCondition .= "(`objectType` = '$moduleName' and `action` " . helper::dbIN($actions) . ") or ";
}
$actionCondition = trim($actionCondition, 'or ');
}
return $actionCondition;
}
/**
@@ -700,8 +741,11 @@ class actionModel extends model
*/
public function getBySQL($sql, $orderBy, $pager = null)
{
$actionCondition = $this->getActionCondition();
if(is_array($actionCondition)) return array();
return $actions = $this->dao->select('*')->from(TABLE_ACTION)
->where($sql)
->beginIF(!empty($actionCondition))->andWhere("($actionCondition)")->fi()
->beginIF($this->config->global->flow == 'onlyStory')->andWhere('objectType')->notin('bug,build,project,task,taskcase,testreport,testsuite,testtask')->fi()
->beginIF($this->config->global->flow == 'onlyTask')->andWhere('objectType')->notin('product,productplan,release,story,testcase,testreport,testsuite')->fi()
->beginIF($this->config->global->flow == 'onlyTest')->andWhere('objectType')->notin('project,productplan,release,story,task')->fi()
+1 -10
View File
@@ -38,20 +38,11 @@ $lang->admin->notice->ignore = "Ignore";
$lang->admin->notice->int = "『%s』should be a positive integer.";
$lang->admin->register = new stdclass();
<<<<<<< HEAD
$lang->admin->register->common = 'Bind New Account';
=======
$lang->admin->register->common = 'Bind Account';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->admin->register->caption = 'Register in Zentao Community';
$lang->admin->register->caption = 'Register in ZenTao Community';
$lang->admin->register->click = 'Register here';
<<<<<<< HEAD
$lang->admin->register->lblAccount = 'at least 3 characters; contains letters and numbers.';
$lang->admin->register->lblPasswd = 'at least 6 characters; contains letters and numbers.';
=======
$lang->admin->register->lblAccount = '>= 3 characters; contains letters and numbers.';
$lang->admin->register->lblPasswd = '>= 6 characters; contains letters and numbers.';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->admin->register->submit = 'Register';
$lang->admin->register->bind = "Bind Exsit Account";
$lang->admin->register->success = "You have registered with us!";
+7 -7
View File
@@ -36,7 +36,7 @@ $lang->block->lblFlowchart = 'Flowchart';
$lang->block->welcome = 'Welcome';
$lang->block->lblTesttask = 'Testing Details';
$lang->block->leftToday = 'Work for Today';
$lang->block->leftToday = 'Remaining Work Report';
$lang->block->myTask = 'My Task';
$lang->block->myStory = 'My Story';
$lang->block->myBug = 'My Bug';
@@ -143,7 +143,7 @@ $lang->block->default['qa']['3']['params']['num'] = 15;
$lang->block->default['qa']['3']['params']['orderBy'] = 'id_desc';
$lang->block->default['qa']['3']['params']['type'] = 'assigntome';
$lang->block->default['qa']['4']['title'] = 'Wait Build';
$lang->block->default['qa']['4']['title'] = 'Pending Build';
$lang->block->default['qa']['4']['block'] = 'testtask';
$lang->block->default['qa']['4']['grid'] = 4;
@@ -340,7 +340,7 @@ $lang->block->typeList->task['canceledBy'] = 'Cancelled by Me';
$lang->block->typeList->bug['assignedTo'] = 'Assigned to Me';
$lang->block->typeList->bug['openedBy'] = 'Created by Me';
$lang->block->typeList->bug['resolvedBy'] = 'Resolved by Me';
$lang->block->typeList->bug['resolvedBy'] = 'Solved by Me';
$lang->block->typeList->bug['closedBy'] = 'Closed by Me';
$lang->block->typeList->case['assigntome'] = 'Assigned to Me';
@@ -356,12 +356,12 @@ $lang->block->typeList->product['closed'] = 'Closed';
$lang->block->typeList->product['all'] = 'All';
$lang->block->typeList->product['involved'] = 'Involved';
$lang->block->typeList->project['undone'] = 'Unfinished';
$lang->block->typeList->project['doing'] = 'Doing';
$lang->block->typeList->project['undone'] = 'Uncompleted';
$lang->block->typeList->project['doing'] = 'Ongoing';
$lang->block->typeList->project['all'] = 'All';
$lang->block->typeList->project['involved'] = 'Involved';
$lang->block->typeList->testtask['wait'] = 'Wait';
$lang->block->typeList->testtask['wait'] = 'Pending';
$lang->block->typeList->testtask['doing'] = 'Doing';
$lang->block->typeList->testtask['blocked'] = 'Blocked';
$lang->block->typeList->testtask['done'] = 'Done';
@@ -396,7 +396,7 @@ $lang->block->gridOptions[8] = 'Left';
$lang->block->gridOptions[4] = 'Right';
$lang->block->flowchart = array();
$lang->block->flowchart[] = array('Administlrator', 'Add Department', 'Add User', 'Maintain Privileges');
$lang->block->flowchart[] = array('Administrator', 'Add Department', 'Add User', 'Maintain Privileges');
$lang->block->flowchart[] = array($lang->productCommon . ' Owner', 'Add ' . $lang->productCommon, 'Maintain Modules', 'Maintain Plans', 'Maintain Stories', 'Create Releases');
$lang->block->flowchart[] = array('Scrum Master', 'Add ' . $lang->projectCommon, 'Maintain Teams', 'Link ' . $lang->productCommon . 's', 'Link Stories', 'Decompose Tasks');
$lang->block->flowchart[] = array('Dev Team', 'Claim Tasks/Bugs', 'Update Status', 'Finish Tasks/Bugs');
+2 -1
View File
@@ -46,7 +46,8 @@ class branchModel extends model
$product = $this->loadModel('product')->getById($productID);
if(!$product or $product->type == 'normal') return array();
$branches = array('0' => $this->lang->branch->all . $this->lang->product->branchName[$product->type]) + $branches;
$space = $this->app->getClientLang() == 'en' ? ' ' : '';
$branches = array('0' => $this->lang->branch->all . $space . $this->lang->product->branchName[$product->type]) + $branches;
}
return $branches;
}
+6 -51
View File
@@ -193,7 +193,7 @@ class bug extends control
$chartFunc = 'getDataOf' . $chart;
$chartData = $this->bug->$chartFunc();
$chartOption = $this->lang->bug->report->$chart;
if(!empty($chartType)) $chartOption->type = $chartType;
if(!empty($chartType) and $chartType != 'default') $chartOption->type = $chartType;
$this->bug->mergeChartOption($chart);
$this->view->charts[$chart] = $chartOption;
@@ -679,7 +679,6 @@ class bug extends control
$this->view->openedBuilds = $openedBuilds;
$this->view->resolvedBuilds = array('' => '') + $openedBuilds + $oldResolvedBuild;
$this->view->actions = $this->action->getList('bug', $bugID);
$this->view->templates = $this->bug->getUserBugTemplates($this->app->user->account);
$this->display();
}
@@ -1291,44 +1290,6 @@ class bug extends control
}
}
/**
* Save current template.
*
* @access public
* @return string
*/
public function saveTemplate()
{
$this->bug->saveUserBugTemplate();
if(dao::isError()) echo js::error(dao::getError(), $full = false);
die($this->fetch('bug', 'buildTemplates'));
}
/**
* Build the user templates selection code.
*
* @access public
* @return void
*/
public function buildTemplates()
{
$this->view->templates = $this->bug->getUserBugTemplates($this->app->user->account);
$this->display('bug', 'buildTemplates');
}
/**
* Delete a user template.
*
* @param int $templateID
* @access public
* @return void
*/
public function deleteTemplate($templateID)
{
$this->dao->delete()->from(TABLE_USERTPL)->where('id')->eq($templateID)->andWhere('account')->eq($this->app->user->account)->exec();
die();
}
/**
* AJAX: get bugs of a user in html select.
*
@@ -1500,8 +1461,8 @@ class bug extends control
}
/* Get related objects title or names. */
$relatedModules = array();
$productsType = $this->dao->select('id, type')->from(TABLE_PRODUCT)->where('id')->in($relatedProductIdList)->fetchPairs();
$relatedModules = $this->loadModel('tree')->getOptionMenu($productID, 'bug');
$relatedStories = $this->dao->select('id,title')->from(TABLE_STORY) ->where('id')->in($relatedStoryIdList)->fetchPairs();
$relatedTasks = $this->dao->select('id, name')->from(TABLE_TASK)->where('id')->in($relatedTaskIdList)->fetchPairs();
$relatedBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('id')->in($relatedBugIdList)->fetchPairs();
@@ -1509,7 +1470,8 @@ class bug extends control
$relatedBranch = array('0' => $this->lang->branch->all) + $this->dao->select('id, name')->from(TABLE_BRANCH)->where('id')->in($relatedBranchIdList)->fetchPairs();
$relatedBuilds = array('trunk' => $this->lang->trunk) + $this->dao->select('id, name')->from(TABLE_BUILD)->where('id')->in($relatedBuildIdList)->fetchPairs();
$relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('bug')->andWhere('objectID')->in(@array_keys($bugs))->andWhere('extra')->ne('editor')->fetchGroup('objectID');
foreach($relatedProductIdList as $relatedProductId) $relatedModules += $this->loadModel('tree')->getOptionMenu($relatedProductId, 'bug');
foreach($bugs as $bug)
{
if($this->post->fileType == 'csv')
@@ -1614,16 +1576,9 @@ class bug extends control
$this->fetch('file', 'export2' . $this->post->fileType, $_POST);
}
$fileName = $this->lang->bug->common;
$fileName = $this->lang->bug->common;
$productName = $this->dao->findById($productID)->from(TABLE_PRODUCT)->fetch('name');
if(isset($this->lang->bug->featureBar['browse'][$browseType]))
{
$browseType = $this->lang->bug->featureBar['browse'][$browseType];
}
else
{
$browseType = isset($this->lang->bug->moreSelects[$browseType]) ? $this->lang->bug->moreSelects[$browseType] : null;
}
$browseType = isset($this->lang->bug->featureBar['browse'][$browseType]) ? $this->lang->bug->featureBar['browse'][$browseType] : zget($this->lang->bug->moreSelects, $browseType, '');
$this->view->fileName = $productName . $this->lang->dash . $browseType . $fileName;
$this->view->allExportFields = $this->config->bug->list->exportFields;
+1 -8
View File
@@ -7,15 +7,8 @@
#buildBoxActions {padding-left: 15px;}
#tplBoxWrapper {position: relative; z-index: 10;}
#tplBoxWrapper > .btn-toolbar {position: absolute; right: 0px; top: 0px;}
#tplBoxWrapper .btn {padding: 4px 8px}
#tplBox li {position: relative;}
#tplBox li .btn-delete {position: absolute; right: 0; top: -5px; display: block; width: 40px; text-align:center;}
#tplBox li:hover .btn-delete {color:#fff;}
#tplBox li .tpl-name {padding-right: 40px;}
#module_chosen.chosen-container .chosen-drop {min-width: 400px; border-top: 1px solid #ddd!important}
#os_chosen.chosen-container .chosen-drop{min-width: 200px}
#openedBuild_chosen.chosen-container .chosen-drop {min-width: 450px; border-top: 1px solid #ddd!important}
#module + .chosen-container-single .chosen-single,
#task + .chosen-container-single .chosen-single,
+8 -5
View File
@@ -468,17 +468,20 @@ function notice()
if($('#openedBuild').find('option').length <= 1)
{
var html = '';
if($('#project').val() == '')
if($('#project').length == 0 || $('#project').val() == '')
{
branch = $('#branch').val();
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
html += '<a href="' + createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch) + '" target="_blank" style="padding-right:5px">' + createRelease + '</a> ';
var link = createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch);
if(typeof(flow) != 'undefined' && flow == 'onlyTest') link = createLink('build', 'create','projectID=' + $('#product').val());
html += '<a href="' + link + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProductBuilds(' + $('#product').val() + ')">' + refresh + '</a>';
}
else
{
html += '<a href="' + createLink('build', 'create','projectID=' + $('#project').val()) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProjectBuilds(' + $('#project').val() + ')">' + refresh + '</a>';
projectID = $('#project').val();
html += '<a href="' + createLink('build', 'create','projectID=' + projectID) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProjectBuilds(' + projectID + ')">' + refresh + '</a>';
}
var $bba = $('#buildBoxActions');
if($bba.length)
-50
View File
@@ -64,59 +64,9 @@ function setAssignedTo(moduleID, productID)
});
}
/* Set template. */
function setTemplate(templateID)
{
$('#tplBox .list-group-item.active').removeClass('active');
$('#tplTitleBox' + templateID).closest('.list-group-item').addClass('active');
var steps = $('#template' + templateID).html();
editor['#'].html(steps);
}
/* Delete template. */
function deleteTemplate(templateID)
{
if(!templateID) return;
if(confirm(confirmDeleteTemplate))
{
hiddenwin.location.href = createLink('bug', 'deleteTemplate', 'templateID=' + templateID);
$('#tplBox' + templateID).addClass('hidden');
}
}
/* Display template x icon. */
function displayXIcon(templateID)
{
$('#templateID' + templateID).removeClass('hidden');
}
/* Hide template x icon. */
function hideXIcon(templateID)
{
$('#templateID' + templateID).addClass('hidden');
}
$(function()
{
if($('#project').val()) loadProjectRelated($('#project').val());
$('#saveTplModal').on('hide.zui.modal', function(){$(this).find('#title').val('');});
$('#saveTplBtn').click(function(){$('#saveTplModal').modal('show');});
$('#saveTplModal #submit').click(function()
{
var $inputGroup = $('#saveTplModal div.input-group');
var $publicBox = $inputGroup.find('input[id^="public"]');
var title = $inputGroup.find('#title').val();
var content = $('#steps').val();
var isPublic = ($publicBox.size() > 0 && $publicBox.prop('checked')) ? $publicBox.val() : 0;
if(!title || !content) return;
saveTemplateLink = createLink('bug', 'saveTemplate');
$.post(saveTemplateLink, {title:title, content:content, public:isPublic}, function(data)
{
$('#tplBox').html(data);
// If has error then not hide.
if(data.indexOf('alert') == -1) $('#saveTplModal').modal('hide');
});
});
$('[data-toggle=tooltip]').tooltip();
+24 -69
View File
@@ -32,48 +32,31 @@ $lang->bug->status = 'Status';
$lang->bug->statusAB = 'Status';
$lang->bug->activatedCount = 'Active';
$lang->bug->activatedCountAB = 'Active';
<<<<<<< HEAD
$lang->bug->activatedDate = 'Active';
=======
$lang->bug->activatedDate = 'Activated';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->confirmed = 'Confirmed';
$lang->bug->toTask = 'Convert to Task';
$lang->bug->toStory = 'Convert to Story';
$lang->bug->mailto = 'Mail To';
<<<<<<< HEAD
<<<<<<< HEAD
$lang->bug->openedBy = 'Created by';
$lang->bug->openedDate = 'Created';
$lang->bug->openedDateAB = 'Created';
$lang->bug->openedBuild = 'Open Build';
$lang->bug->assignedTo = 'To';
$lang->bug->assignBug = 'Assignee';
=======
$lang->bug->openedBy = 'Creator';
=======
$lang->bug->openedBy = 'Created by';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->bug->openedDate = 'Created';
$lang->bug->openedDateAB = 'Created';
$lang->bug->openedBuild = 'Open Build';
$lang->bug->assignedTo = 'Assign To';
$lang->bug->assignBug = 'Assign To';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->assignedToAB = 'To';
$lang->bug->assignedDate = 'Assigned';
$lang->bug->resolvedBy = 'Resolved';
$lang->bug->resolvedByAB = 'Resolved';
$lang->bug->resolution = 'Resolution';
$lang->bug->resolutionAB = 'Resolution';
$lang->bug->resolvedBuild = 'Resolved Build';
$lang->bug->resolvedDate = 'Resolved';
$lang->bug->resolvedDateAB = 'Resolved';
$lang->bug->resolvedBy = 'Solved';
$lang->bug->resolvedByAB = 'Solved';
$lang->bug->resolution = 'Solution';
$lang->bug->resolutionAB = 'Solution';
$lang->bug->resolvedBuild = 'Solved Build';
$lang->bug->resolvedDate = 'Solved';
$lang->bug->resolvedDateAB = 'Solved';
$lang->bug->deadline = 'Deadline';
$lang->bug->plan = 'Plan';
$lang->bug->closedBy = 'Closed By';
$lang->bug->closedDate = 'Closed';
$lang->bug->duplicateBug = 'Duplicate Bug ID';
$lang->bug->duplicateBug = 'Duplicated Bug ID';
$lang->bug->lastEditedBy = 'Edited By';
$lang->bug->linkBug = 'Linked Bug';
$lang->bug->linkBugs = 'Link Bug';
@@ -81,15 +64,9 @@ $lang->bug->unlinkBug = 'Unlink';
$lang->bug->case = 'Case';
$lang->bug->files = 'File';
$lang->bug->keywords = 'Tags';
<<<<<<< HEAD
$lang->bug->lastEditedByAB = 'Edited by';
$lang->bug->lastEditedDateAB = 'Edit';
$lang->bug->lastEditedDate = 'Edit';
=======
$lang->bug->lastEditedByAB = 'Edited By';
$lang->bug->lastEditedDateAB = 'Edited';
$lang->bug->lastEditedDate = 'Edited';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->fromCase = 'From Case';
$lang->bug->toCase = 'To Case';
$lang->bug->colorTag = 'Color Tag';
@@ -109,8 +86,8 @@ $lang->bug->assignTo = 'Assign';
$lang->bug->batchAssignTo = 'Batch Assign';
$lang->bug->browse = 'Bugs';
$lang->bug->view = 'Bug Details';
$lang->bug->resolve = 'Resolve';
$lang->bug->batchResolve = 'Batch Resolve';
$lang->bug->resolve = 'Solve';
$lang->bug->batchResolve = 'Batch Solve';
$lang->bug->close = 'Close';
$lang->bug->activate = 'Activate';
$lang->bug->batchActivate = 'Batch Activate';
@@ -118,9 +95,6 @@ $lang->bug->reportChart = 'Report';
$lang->bug->export = 'Export';
$lang->bug->delete = 'Delete';
$lang->bug->deleted = 'Deleted';
$lang->bug->saveTemplate = 'Save as Template';
$lang->bug->setPublic = 'Set as Public Template';
$lang->bug->deleteTemplate = 'Delete Template';
$lang->bug->confirmStoryChange = 'Confirm Story Change';
$lang->bug->copy = 'Copy';
$lang->bug->search = 'Search';
@@ -128,10 +102,10 @@ $lang->bug->search = 'Search';
/* 查询条件列表。*/
$lang->bug->assignToMe = 'AssignToMe';
$lang->bug->openedByMe = 'CreateByMe';
$lang->bug->resolvedByMe = 'ResolveByMe';
$lang->bug->resolvedByMe = 'SolveByMe';
$lang->bug->closedByMe = 'ClosedByMe';
$lang->bug->assignToNull = 'Unassigned';
$lang->bug->unResolved = 'Unresolved';
$lang->bug->unResolved = 'Unsolved';
$lang->bug->toClosed = 'Unclosed';
$lang->bug->unclosed = 'Active';
$lang->bug->unconfirmed = 'UnConfirm';
@@ -140,27 +114,16 @@ $lang->bug->postponedBugs = 'Postponed';
$lang->bug->overdueBugs = 'Overdue';
$lang->bug->allBugs = 'All';
$lang->bug->byQuery = 'Search';
<<<<<<< HEAD
$lang->bug->needConfirm = 'ChangedStory';
=======
$lang->bug->needConfirm = 'Story Changed';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->allProduct = 'All' . $lang->productCommon;
<<<<<<< HEAD
$lang->bug->my = 'Mine';
$lang->bug->yesterdayResolved = 'Resolved Yesterday ';
$lang->bug->yesterdayConfirmed = 'Confirmed Yesterday ';
$lang->bug->yesterdayClosed = 'Closed Yesterday ';
=======
$lang->bug->my = 'My';
$lang->bug->yesterdayResolved = 'Bug Resolved Yesterday ';
$lang->bug->yesterdayResolved = 'Bug Solved Yesterday ';
$lang->bug->yesterdayConfirmed = 'Bug Confirmed Yesterday ';
$lang->bug->yesterdayClosed = 'Bug Closed Yesterday ';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->bug->assignToMeAB = 'AssignToMe';
$lang->bug->openedByMeAB = 'CreateByMe';
$lang->bug->resolvedByMeAB = 'ResolveByMe';
$lang->bug->resolvedByMeAB = 'SolveByMe';
$lang->bug->ditto = 'Ditto';
$lang->bug->dittoNotice = 'This bug is not linked to the same product as the last one!';
@@ -173,7 +136,7 @@ $lang->bug->delayWarning = " <strong class='text-danger'> Delay %s days </strong
$lang->bug->lblAssignedTo = 'Assignee';
$lang->bug->lblMailto = 'Mail To';
$lang->bug->lblLastEdited = 'Last Edited';
$lang->bug->lblResolved = 'Resolved By';
$lang->bug->lblResolved = 'Solved By';
$lang->bug->allUsers = 'All Users';
$lang->bug->allBuilds = 'All';
$lang->bug->createBuild = 'New';
@@ -186,27 +149,19 @@ $lang->bug->lblTypeAndSeverity = 'Type/Severity';
$lang->bug->lblSystemBrowserAndHardware = 'System/Browser';
$lang->bug->legendSteps = 'Repro Steps';
$lang->bug->legendComment = 'Note';
<<<<<<< HEAD
$lang->bug->legendLife = 'About the Bug';
$lang->bug->legendMisc = 'Misc.';
=======
$lang->bug->legendLife = 'About';
$lang->bug->legendMisc = 'Misc';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->bug->legendRelated = 'Related Info';
/* 功能按钮。*/
$lang->bug->buttonConfirm = 'Confirm';
/* 交互提示。*/
$lang->bug->summary = "Bugs on this page : <strong>%s</strong> Total, <strong>%s</strong> Unresolved.";
$lang->bug->summary = "Bugs on this page : <strong>%s</strong> Total, <strong>%s</strong> Unsolved.";
$lang->bug->confirmChangeProduct = "Any change to {$lang->productCommon} will cause linked {$lang->projectCommon}, Story and Task change. Do you want to do this?";
$lang->bug->confirmDelete = 'Do you want to delete this bug?';
$lang->bug->setTemplateTitle = 'Please enter the title of template.';
$lang->bug->remindTask = 'This Bug has been converted to Task. Do you want to update Status of Task(ID %s)?';
$lang->bug->skipClose = 'Bug %s is not resolved. You cannot close it.';
$lang->bug->applyTemplate = 'Template';
$lang->bug->confirmDeleteTemplate = 'Do you want to delete this template?';
$lang->bug->skipClose = 'Bug %s is not solved. You cannot close it.';
/* 模板。*/
$lang->bug->tplStep = "<p>[Steps]</p><br/>";
@@ -287,7 +242,7 @@ $lang->bug->typeList['trackthings'] = 'Tracking';
$lang->bug->statusList[''] = '';
$lang->bug->statusList['active'] = 'Active';
$lang->bug->statusList['resolved'] = 'Resolved';
$lang->bug->statusList['resolved'] = 'Solved';
$lang->bug->statusList['closed'] = 'Closed';
$lang->bug->confirmedList[1] = 'Confirmed';
@@ -297,7 +252,7 @@ $lang->bug->resolutionList[''] = '';
$lang->bug->resolutionList['bydesign'] = 'As Design';
$lang->bug->resolutionList['duplicate'] = 'Duplicated Bug';
$lang->bug->resolutionList['external'] = 'External Cause';
$lang->bug->resolutionList['fixed'] = 'Resolved';
$lang->bug->resolutionList['fixed'] = 'Solved';
$lang->bug->resolutionList['notrepro'] = 'Irreproducible';
$lang->bug->resolutionList['postponed'] = 'Postpone';
$lang->bug->resolutionList['willnotfix'] = "Ignore";
@@ -313,13 +268,13 @@ $lang->bug->report->charts['bugsPerProject'] = $lang->projectCommon . ' B
$lang->bug->report->charts['bugsPerBuild'] = 'Bugs Per Build';
$lang->bug->report->charts['bugsPerModule'] = 'Bugs Per Module';
$lang->bug->report->charts['openedBugsPerDay'] = 'Reported Bugs Per Day';
$lang->bug->report->charts['resolvedBugsPerDay'] = 'Resolved Bugs Per Day';
$lang->bug->report->charts['resolvedBugsPerDay'] = 'Solved Bugs Per Day';
$lang->bug->report->charts['closedBugsPerDay'] = 'Closed Bugs Per Day';
$lang->bug->report->charts['openedBugsPerUser'] = 'Reported Bugs Per User';
$lang->bug->report->charts['resolvedBugsPerUser'] = 'Resolved Bugs Per User';
$lang->bug->report->charts['resolvedBugsPerUser'] = 'Solved Bugs Per User';
$lang->bug->report->charts['closedBugsPerUser'] = 'Closed Bugs Per User';
$lang->bug->report->charts['bugsPerSeverity'] = 'Bug Severity Report';
$lang->bug->report->charts['bugsPerResolution'] = 'Bug Resolution Report';
$lang->bug->report->charts['bugsPerResolution'] = 'Bug Solution Report';
$lang->bug->report->charts['bugsPerStatus'] = 'Bug Status Report';
$lang->bug->report->charts['bugsPerActivatedCount'] = 'Bug Activation Report';
$lang->bug->report->charts['bugsPerPri'] = 'Bug Priority Report';
@@ -390,7 +345,7 @@ $lang->bug->report->resolvedBugsPerUser->graph->xAxisName = 'User';
$lang->bug->report->closedBugsPerUser->graph->xAxisName = 'User';
$lang->bug->report->bugsPerSeverity->graph->xAxisName = 'Priority';
$lang->bug->report->bugsPerResolution->graph->xAxisName = 'Resolution';
$lang->bug->report->bugsPerResolution->graph->xAxisName = 'Solution';
$lang->bug->report->bugsPerStatus->graph->xAxisName = 'Status';
$lang->bug->report->bugsPerActivatedCount->graph->xAxisName = 'Activated Count';
$lang->bug->report->bugsPerPri->graph->xAxisName = 'Priority';
@@ -401,7 +356,7 @@ $lang->bug->report->bugHistories->graph->xAxisName = 'Handling Steps';
/* 操作记录。*/
$lang->bug->action = new stdclass();
$lang->bug->action->resolved = array('main' => '$date, resolved by <strong>$actor</strong> and the solution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
$lang->bug->action->resolved = array('main' => '$date, solved by <strong>$actor</strong> and the solution is <strong>$extra</strong> $appendLink.', 'extra' => 'resolutionList');
$lang->bug->action->tostory = array('main' => '$date, converted by <strong>$actor</strong> to <strong>Story</strong> with ID <strong>$extra</strong>.');
$lang->bug->action->totask = array('main' => '$date, imported by <strong>$actor</strong> as <strong>Task</strong> with ID <strong>$extra</strong>.');
$lang->bug->action->linked2plan = array('main' => '$date, linked by <strong>$actor</strong> to Plan <strong>$extra</strong>.');
-6
View File
@@ -95,9 +95,6 @@ $lang->bug->reportChart = '报表统计';
$lang->bug->export = '导出数据';
$lang->bug->delete = '删除';
$lang->bug->deleted = '已删除';
$lang->bug->saveTemplate = '保存模板';
$lang->bug->setPublic = '设为公共模板';
$lang->bug->deleteTemplate = '删除模板';
$lang->bug->confirmStoryChange = '确认需求变动';
$lang->bug->copy = '复制Bug';
$lang->bug->search = '搜索';
@@ -163,11 +160,8 @@ $lang->bug->buttonConfirm = '确认';
$lang->bug->summary = "本页共 <strong>%s</strong> 个Bug,未解决 <strong>%s</strong>。";
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}会导致相应的{$lang->projectCommon}、需求和任务发生变化,确定吗?";
$lang->bug->confirmDelete = '您确认要删除该Bug吗?';
$lang->bug->setTemplateTitle = '请输入bug模板标题';
$lang->bug->remindTask = '该Bug已经转化为任务,是否更新任务(编号:%s)状态 ?';
$lang->bug->skipClose = 'Bug %s 不是已解决状态,不能关闭。';
$lang->bug->applyTemplate = '应用模板';
$lang->bug->confirmDeleteTemplate = '您确认要删除该模板吗?';
/* 模板。*/
$lang->bug->tplStep = "<p>[步骤]</p><br/>";
-6
View File
@@ -95,9 +95,6 @@ $lang->bug->reportChart = '報表統計';
$lang->bug->export = '導出數據';
$lang->bug->delete = '刪除';
$lang->bug->deleted = '已刪除';
$lang->bug->saveTemplate = '保存模板';
$lang->bug->setPublic = '設為公共模板';
$lang->bug->deleteTemplate = '刪除模板';
$lang->bug->confirmStoryChange = '確認需求變動';
$lang->bug->copy = '複製Bug';
$lang->bug->search = '搜索';
@@ -163,11 +160,8 @@ $lang->bug->buttonConfirm = '確認';
$lang->bug->summary = "本頁共 <strong>%s</strong> 個Bug,未解決 <strong>%s</strong>。";
$lang->bug->confirmChangeProduct = "修改{$lang->productCommon}會導致相應的{$lang->projectCommon}、需求和任務發生變化,確定嗎?";
$lang->bug->confirmDelete = '您確認要刪除該Bug嗎?';
$lang->bug->setTemplateTitle = '請輸入bug模板標題';
$lang->bug->remindTask = '該Bug已經轉化為任務,是否更新任務(編號:%s)狀態 ?';
$lang->bug->skipClose = 'Bug %s 不是已解決狀態,不能關閉。';
$lang->bug->applyTemplate = '應用模板';
$lang->bug->confirmDeleteTemplate = '您確認要刪除該模板嗎?';
/* 模板。*/
$lang->bug->tplStep = "<p>[步驟]</p><br/>";
+6 -40
View File
@@ -1670,7 +1670,12 @@ class bugModel extends model
{
$datas = $this->dao->select('openedBuild as name, count(openedBuild) as value')->from(TABLE_BUG)->where($this->reportCondition())->groupBy('openedBuild')->orderBy('value DESC')->fetchAll('name');
if(!$datas) return array();
$builds = $this->loadModel('build')->getProductBuildPairs($this->session->product, $branch = 0, $params = '');
/* Judge if all product or not. */
$products = $this->session->product;
preg_match('/`product` IN \((?P<productIdList>.+)\)/', $this->reportCondition(), $matchs);
if(!empty($matchs) and isset($matchs['productIdList'])) $products = str_replace('\'', '', $matchs['productIdList']);
$builds = $this->loadModel('build')->getProductBuildPairs($products, $branch = 0, $params = '');
/* Deal with the situation that a bug maybe associate more than one openedBuild. */
foreach($datas as $buildIDList => $data)
{
@@ -1939,45 +1944,6 @@ class bugModel extends model
foreach($commonOption->graph as $key => $value) if(!isset($chartOption->graph->$key)) $chartOption->graph->$key = $value;
}
/**
* Get bug templates of a user.
*
* @param string $account
* @access public
* @return array
*/
public function getUserBugTemplates($account)
{
$templates = $this->dao->select('id,account,title,content,public')
->from(TABLE_USERTPL)
->where('type')->eq('bug')
->andwhere('account', true)->eq($account)
->orWhere('public')->eq('1')
->markRight(1)
->orderBy('id')
->fetchAll();
return $templates;
}
/**
* Save user template.
*
* @access public
* @return void
*/
public function saveUserBugTemplate()
{
$template = fixer::input('post')
->setDefault('account', $this->app->user->account)
->setDefault('type', 'bug')
->stripTags('content', $this->config->allowedTags)
->get();
$condition = "`type`='bug' and account='{$this->app->user->account}'";
$this->dao->insert(TABLE_USERTPL)->data($template)->batchCheck('title, content', 'notempty')->check('title', 'unique', $condition)->exec();
if(!dao::isError()) $this->loadModel('score')->create('bug', 'saveTplModal', $this->dao->lastInsertID());
}
/**
* Return the file => label pairs of some fields.
*
-11
View File
@@ -1,11 +0,0 @@
<?php
foreach($templates as $key => $template)
{
echo "<li id='tplBox$template->id' onmouseover='displayXIcon($template->id)' onmouseout='hideXIcon($template->id)'>";
echo "<a title='{$lang->bug->applyTemplate}' class='tpl-name' id='tplTitleBox$template->id' href='javascript:setTemplate($template->id)'>";
if($template->public) echo "<span class='label label-info label-badge'>{$lang->public}</span> ";
echo $template->title . "</a>";
if(empty($template->public) or $template->account == $app->user->account)echo "<a href='###' onclick='deleteTemplate($template->id)' id='templateID$template->id' class='btn-delete hidden'><i class='icon-close'></i></a>";
echo "<span id='template$template->id' class='hidden'>$template->content</span>";
echo '</li>';
}
+2 -31
View File
@@ -19,7 +19,7 @@ js::set('page', 'create');
js::set('createRelease', $lang->release->create);
js::set('createBuild', $lang->build->create);
js::set('refresh', $lang->refresh);
js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
js::set('flow', $config->global->flow);
?>
<div id="mainContent" class="main-content fade">
<div class="center-block">
@@ -217,17 +217,7 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
<tr>
<th><?php echo $lang->bug->steps;?></th>
<td colspan='2'>
<div id='tplBoxWrapper'>
<div class='btn-toolbar'>
<div class='btn-group'>
<button id='saveTplBtn' type='button' class='btn btn-mini' data-toggle='saveTplModal'><?php echo $lang->bug->saveTemplate?></button>
<button type='button' class='btn btn-mini dropdown-toggle' data-toggle='dropdown'><?php echo $lang->bug->applyTemplate?> <span class='caret'></span></button>
<ul id='tplBox' class='dropdown-menu pull-right'>
<?php echo $this->fetch('bug', 'buildTemplates');?>
</ul>
</div>
</div>
</div>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=bug&link=steps');?>
<?php echo html::textarea('steps', $steps, "rows='10' class='form-control'");?>
</td>
</tr>
@@ -305,24 +295,5 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate);
</form>
</div>
</div>
<div class="modal fade" id="saveTplModal" tabindex="-1" role="dialog">
<div class="modal-dialog w-600px">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><i class="icon icon-close"></i></button>
<h4 class="modal-title"><?php echo $lang->bug->setTemplateTitle;?></h4>
</div>
<div class="modal-body">
<div class='input-group'>
<?php echo html::input('title', '' , "class='form-control'")?>
<?php if(common::hasPriv('bug', 'setPublic')):?>
<span class='input-group-addon'><?php echo html::checkbox('public', array('1' => $lang->public))?></span>
<?php endif;?>
<span class='input-group-btn'><?php echo html::submitButton('', '', 'btn btn-primary')?></span>
</div>
</div>
</div>
</div>
</div>
<?php js::set('bugModule', $lang->bug->module);?>
<?php include '../../common/view/footer.html.php';?>
+2 -2
View File
@@ -43,13 +43,13 @@ $lang->build->packageType = 'Package Type';
$lang->build->unlinkStory = 'Unlink Story';
$lang->build->unlinkBug = 'Unlink Bug';
$lang->build->stories = 'Finished Story';
$lang->build->bugs = 'Resolved Bug';
$lang->build->bugs = 'Solved Bug';
$lang->build->generatedBugs = 'Reported Bug';
$lang->build->noProduct = " <span style='color:red'>This {$lang->projectCommon} is not linked to {$lang->productCommon}, so the Build cannot be created. Please first <a href='%s'> link {$lang->productCommon}</a></span>";
$lang->build->noBuild = 'No builds. ';
$lang->build->finishStories = ' %s Story is finished.';
$lang->build->resolvedBugs = ' %s Bug is resolved.';
$lang->build->resolvedBugs = ' %s Bug is solved.';
$lang->build->createdBugs = ' %s Bug is created.';
$lang->build->placeholder = new stdclass();
+42 -60
View File
@@ -21,13 +21,13 @@ $lang->percent = '%';
$lang->dash = '-';
$lang->zentaoPMS = 'ZenTao';
$lang->welcome = "%s PMS";
$lang->welcome = "%s ALM";
$lang->logout = 'Logout';
$lang->login = 'Login';
$lang->help = 'Help';
$lang->aboutZenTao = 'ZenTao';
$lang->profile = 'Profile';
$lang->changePassword = 'Password';
$lang->changePassword = 'Change Password';
$lang->runInfo = "<div class='row'><div class='u-1 a-center' id='debugbar'>Time %s MS, Memory %s KB, Query %s. </div></div>";
$lang->agreement = "I have read and agreed to the terms and conditions of <a href='http://zpl.pub/page/zplv12.html' target='_blank'> Z PUBLIC LICENSE 1.2 </a>. <span class='text-danger'>Without authorization, I should not remove, hide or cover any logos/links of ZenTao.</span>";
$lang->designedByAIUX = "<a href='http://aiuxstudio.com/' class='link-aiux' target='_blank'>Designed by <strong>AIUX</strong></a>";
@@ -59,30 +59,30 @@ $lang->required = 'Required';
$lang->noData = 'No data.';
$lang->actions = 'Action';
$lang->restore = 'Restore';
$lang->restore = 'Reset';
$lang->comment = 'Note';
$lang->history = 'History';
$lang->attatch = 'File';
$lang->reverse = 'Reverse';
$lang->reverse = 'Inverse';
$lang->switchDisplay = 'Toggle';
$lang->expand = 'Expand';
$lang->collapse = 'Collapse';
$lang->saveSuccess = 'Saved';
$lang->fail = 'Fail';
$lang->addFiles = 'Add';
$lang->addFiles = 'Added Files';
$lang->files = 'Files ';
$lang->pasteText = 'Paste';
$lang->uploadImages = 'Upload';
$lang->timeout = 'Timeout. Pease check your connection, or try it again!';
$lang->repairTable = 'Database table might be damaged. Execute phpmyadmin or myisamchk to fix it.';
$lang->uploadImages = 'Upload Image';
$lang->timeout = 'Timeout. Check your newtwork connections, or try it again!';
$lang->repairTable = 'Database table might be damaged. Run phpmyadmin or myisamchk to fix it.';
$lang->duplicate = '%s has the same title as a file title existed.';
$lang->ipLimited = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head><body>Sorry, your current IP is restricted. PLease contact your Administer to grant your permissions.</body></html>";
$lang->unfold = '+';
$lang->fold = '-';
$lang->homepage = 'Set Home';
$lang->noviceTutorial = 'Rookie Tutorial';
$lang->noviceTutorial = 'ZenTao Tutorial';
$lang->changeLog = 'Change Log';
$lang->manual = 'Manual';
$lang->manual = 'User Manual';
$lang->manualUrl = 'https://www.zentao.pm/book/zentaomanual/zentao-installation-11.html';
$lang->customMenu = 'Custom Menu';
$lang->customField = 'Custom Field';
@@ -95,15 +95,16 @@ $lang->nextShortcutKey = '[Shortcut:→]';
$lang->backShortcutKey = '[Shortcut:Alt+↑]';
$lang->select = 'Select';
$lang->selectAll = 'All';
$lang->selectReverse = 'Reverse';
$lang->selectAll = 'Select All';
$lang->selectReverse = 'Select Inverse';
$lang->loading = 'Loading...';
$lang->notFound = 'Not found!';
$lang->notPage = 'Sorry, the features you are visiting are in development!';
$lang->showAll = '[[Show All]]';
$lang->future = 'Pending';
$lang->year = 'Year';
$lang->workingHour = 'Hour';
$lang->workingHour = 'Man-hour';
$lang->idAB = 'ID';
$lang->priAB = 'P';
@@ -186,10 +187,10 @@ $lang->my->menu->index = 'Home|my|index';
$lang->my->menu->calendar = array('link' => 'Calendar|my|calendar|', 'subModule' => 'todo', 'alias' => 'todo');
$lang->my->menu->task = array('link' => 'Task|my|task|', 'subModule' => 'task');
$lang->my->menu->bug = array('link' => 'Bug|my|bug|', 'subModule' => 'bug');
$lang->my->menu->testtask = array('link' => 'Test Task|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase');
$lang->my->menu->testtask = array('link' => 'Test|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase');
$lang->my->menu->story = array('link' => 'Story|my|story|', 'subModule' => 'story');
$lang->my->menu->myProject = "{$lang->projectCommon}|my|project|";
$lang->my->menu->dynamic = 'Dynamic|my|dynamic|';
$lang->my->menu->dynamic = 'Dynamics|my|dynamic|';
$lang->my->menu->profile = array('link' => 'Profile|my|profile', 'alias' => 'editprofile');
$lang->my->menu->changePassword = 'Password|my|changepassword';
$lang->my->menu->manageContacts = 'Contact|my|managecontacts';
@@ -212,7 +213,7 @@ $lang->product->menu->plan = array('link' => 'Plan|productplan|browse|produc
$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release');
$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s';
$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s";
$lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s';
$lang->product->menu->dynamic = 'Dynamics|product|dynamic|productID=%s';
$lang->product->menu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
$lang->product->menu->branch = '@branch@|branch|manage|productID=%s';
$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story';
@@ -241,7 +242,7 @@ $lang->project->menu->list = array('link' => 'More|project|grouptask|project
$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban');
$lang->project->menu->qa = array('link' => 'Test|project|bug|projectID=%s', 'subModule' => 'bug,build,testtask', 'alias' => 'build,testtask', 'class' => 'dropdown dropdown-hover');
$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc');
$lang->project->menu->action = array('link' => 'Dynamic|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover');
$lang->project->menu->action = array('link' => 'Dynamics|project|dynamic|projectID=%s', 'subModule' => 'dynamic', 'class' => 'dropdown dropdown-hover');
$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s';
$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers');
$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close');
@@ -254,7 +255,7 @@ $lang->project->subMenu->list->tree = 'Tree View|project|tree|projectID=%s'
$lang->project->subMenu->qa = new stdclass();
$lang->project->subMenu->qa->bug = 'Bug|project|bug|projectID=%s';
$lang->project->subMenu->qa->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build');
$lang->project->subMenu->qa->testtask = array('link' => 'Test Task|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask');
$lang->project->subMenu->qa->testtask = array('link' => 'Test|project|testtask|projectID=%s', 'subModule' => 'testreport,testtask');
$lang->project->dividerMenu = ',story,team,product,';
@@ -307,7 +308,7 @@ $lang->testsuite = new stdclass();
$lang->testsuite->menu = new stdclass();
$lang->testsuite->menu->bug = array('link' => 'Bug|bug|browse|productID=%s');
$lang->testsuite->menu->testcase = array('link' => 'Case|testcase|browse|productID=%s');
$lang->testsuite->menu->testtask = array('link' => 'Test Task|testtask|browse|productID=%s');
$lang->testsuite->menu->testtask = array('link' => 'Test|testtask|browse|productID=%s');
$lang->testsuite->menu->testsuite = array('link' => 'Suite|testsuite|browse|productID=%s', 'alias' => 'view,create,edit,linkcase');
$lang->testsuite->menu->report = array('link' => 'Report|testreport|browse|productID=%s');
$lang->testsuite->menu->caselib = array('link' => 'Case Library|testsuite|library');
@@ -348,7 +349,7 @@ $lang->report->menu->test = array('link' => 'Test|report|bugcreate', 'alias'
$lang->report->menu->staff = array('link' => 'Company|report|workload');
$lang->report->notice = new stdclass();
$lang->report->notice->help = 'Note: Report is generated on search results. Please search the list before you generate a report.';
$lang->report->notice->help = 'Note: Report is generated based on the search results of the list. Please search in the list before you generate a report.';
/* Company menu settings. */
$lang->company = new stdclass();
@@ -356,7 +357,7 @@ $lang->company->menu = new stdclass();
$lang->company->menu->browseUser = array('link' => 'User|company|browse', 'subModule' => 'user');
$lang->company->menu->dept = array('link' => 'Department|dept|browse', 'subModule' => 'dept');
$lang->company->menu->browseGroup = array('link' => 'Privilege|group|browse', 'subModule' => 'group');
$lang->company->menu->dynamic = 'Dynamic|company|dynamic|';
$lang->company->menu->dynamic = 'Dynamics|company|dynamic|';
$lang->company->menu->view = array('link' => 'Company|company|view');
$lang->dept = new stdclass();
@@ -373,7 +374,7 @@ $lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
$lang->admin->menu->message = array('link' => 'Message|message|index', 'subModule' => 'message,mail,webhook');
$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom');
$lang->admin->menu->sso = array('link' => 'Integrate|admin|sso');
$lang->admin->menu->sso = array('link' => 'Integration|admin|sso');
$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor,entry');
$lang->admin->menu->data = array('link' => 'Data|backup|index', 'subModule' => 'backup,action');
@@ -384,7 +385,7 @@ $lang->admin->subMenu = new stdclass();
$lang->admin->subMenu->message = new stdclass();
$lang->admin->subMenu->message->mail = array('link' => 'Mail|mail|index', 'subModule' => 'mail');
$lang->admin->subMenu->message->webhook = array('link' => 'Webhook|webhook|browse', 'subModule' => 'webhook');
$lang->admin->subMenu->message->setting = array('link' => 'Setting|message|setting', 'subModule' => 'message');
$lang->admin->subMenu->message->setting = array('link' => 'Settings|message|setting', 'subModule' => 'message');
$lang->admin->subMenu->sso = new stdclass();
$lang->admin->subMenu->sso->ranzhi = 'Zdoo|admin|sso';
@@ -446,10 +447,13 @@ $lang->menugroup->user = 'company';
$lang->menugroup->group = 'company';
$lang->menugroup->bug = 'qa';
$lang->menugroup->testcase = 'qa';
$lang->menugroup->case = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testtask = 'qa';
$lang->menugroup->testsuite = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testreport = 'qa';
$lang->menugroup->doclib = 'doc';
$lang->menugroup->people = 'company';
$lang->menugroup->dept = 'company';
$lang->menugroup->todo = 'my';
@@ -471,23 +475,23 @@ $lang->error = new stdclass();
$lang->error->companyNotFound = "The domain %s cannot be found!";
$lang->error->length = array("『%s』length error. It should be『%s』", "『%s』length should be <=『%s』and >『%s』.");
$lang->error->reg = "『%s』format error. It should be『%s』.";
$lang->error->unique = "『%s』『%s』exists. Go to Admin->Recycle to restore it, if you are sure it is deleted.";
$lang->error->unique = "『%s』『%s』exists. Go to Admin->Recycle Bin to restore it, if you are sure it is deleted.";
$lang->error->gt = "『%s』should be >『%s』.";
$lang->error->ge = "『%s』should be >=『%s』.";
$lang->error->notempty = "『%s』should not be blank.";
$lang->error->empty = "『%s』should be null.";
$lang->error->equal = "『%s』has to be『%s』.";
$lang->error->int = array("『%s』should be numbers", "『%s』should be 『%s-%s』.");
$lang->error->float = "『%s』should have numbers, decimals.";
$lang->error->float = "『%s』should have numbers, or decimals.";
$lang->error->email = "『%s』should be valid Email.";
$lang->error->date = "『%s』should be valid date.";
$lang->error->datetime = "『%s』should be valid date.";
$lang->error->code = "『%s』should be letters or numbers.";
$lang->error->account = "『%s』should be letters or numbers of three or more.";
$lang->error->account = "『%s』should be >= 3 letters or numbers.";
$lang->error->passwordsame = "Passwords should be consistent.";
$lang->error->passwordrule = "Password should abide by rules. It should be at least 6 characters.";
$lang->error->passwordrule = "Password should conform to rules. It should be >= 6 characters.";
$lang->error->accessDenied = 'Access is denied.';
$lang->error->pasteImg = 'Image is not allowed to paste in your browser!';
$lang->error->pasteImg = 'Images are not allowed to be pasted in your browser!';
$lang->error->noData = 'No data.';
$lang->error->editedByOther = 'This record might have been changed. Please refresh and try to edit again!';
$lang->error->tutorialData = 'No data can be imported in tutorial mode. Please quit tutorial first!';
@@ -510,37 +514,22 @@ $lang->proVersion = "<a href='https://www.zentao.pm/book/zentaopromanual/fre
$lang->downNotify = "Download Desktop Notification";
$lang->downloadClient = "Download Desktop Client";
$lang->clientHelp = "Client Help";
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/scrum-tool-open-source-client-214.html";
$lang->clientHelpLink = "https://www.zentao.pm/book/zentaomanual/";
$lang->website = "https://www.zentao.pm";
$lang->suhosinInfo = "Warning! Data is reaching the limit. Please change <font color=red>sohusin.post.max_vars</font> and <font color=red>sohusin.request.max_vars</font> (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved.";
$lang->maxVarsInfo = "Warning! Data is reaching the limit. Please change <font color=red>max_input_vars</font> (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved.";
$lang->pasteTextInfo = "Paste text here. Each line will be the title of each record. ";
<<<<<<< HEAD
$lang->noticeImport = "Imported data contains data that has already existed in system. Please confirm you actions on the date.";
$lang->importConfirm = "Import";
=======
$lang->noticeImport = "Imported data contains something that has already existed in system. Please confirm your actions.";
$lang->importConfirm = "Confirm";
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->importAndCover = "Override";
$lang->importAndInsert = "Insert";
$lang->noResultsMatch = "No results match found!";
$lang->searchMore = "More results:";
<<<<<<< HEAD
<<<<<<< HEAD
$lang->chooseUsersToMail = "Choose users that will be notified.";
$lang->browserNotice = 'Your current browser might not display· the best effect. Please use Chrome, Firefox, IE9+, Opera or Safari.';
=======
$lang->chooseUsersToMail = "Choose users to be notified.";
$lang->browserNotice = 'Your current browser might not display the best effect. Use Chrome, Firefox, IE9+, Opera or Safari.';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
=======
$lang->chooseUsersToMail = "Choose users to be notified";
$lang->browserNotice = 'Your browser might not display the best effect. Use Chrome, Firefox, IE9+, Opera or Safari.';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->browserNotice = 'The browser you currently use might not get the best browsing results. It is recommended that you use Chrome, Firefox, IE9+, Opera or Safari.';
$lang->noticePasteImg = "Paste images here";
$lang->pasteImgFail = "Pasting image failed. Try again later.";
$lang->pasteImgUploading = "Uploading...";
@@ -751,17 +740,10 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Add bug, testcase and testtask module. */
$lang->menu->bug = 'Bug|bug|index';
<<<<<<< HEAD
$lang->menu->testcase = 'Case|testcase|index';
$lang->menu->testsuite = 'Suite|testsuite|index';
$lang->menu->testtask = 'Test|testtask|index';
$lang->menu->caselib = 'Case Library|testsuite|library';
=======
$lang->menu->testcase = 'Test Case|testcase|index';
$lang->menu->testsuite = 'Test Suite|testsuite|index';
$lang->menu->testtask = 'Test|testtask|index';
$lang->menu->caselib = 'Case Lib|testsuite|library';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->menuOrder[6] = 'bug';
$lang->menuOrder[7] = 'testcase';
@@ -774,11 +756,11 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
$lang->bug->menu = new stdclass();
$lang->bug->menu->all = 'All|bug|browse|productID=%s&branch=%s&browseType=all&param=%s';
$lang->bug->menu->unclosed = 'Open|bug|browse|productID=%s&branch=%s&browseType=unclosed&param=%s';
$lang->bug->menu->openedbyme = 'CreateByMe|bug|browse|productID=%s&branch=%s&browseType=openedbyme&param=%s';
$lang->bug->menu->assigntome = 'AssignToMe|bug|browse|productID=%s&branch=%s&browseType=assigntome&param=%s';
$lang->bug->menu->resolvedbyme = 'ResolveByMe|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme&param=%s';
$lang->bug->menu->openedbyme = 'CreatedByMe|bug|browse|productID=%s&branch=%s&browseType=openedbyme&param=%s';
$lang->bug->menu->assigntome = 'AssignedToMe|bug|browse|productID=%s&branch=%s&browseType=assigntome&param=%s';
$lang->bug->menu->resolvedbyme = 'SolvedByMe|bug|browse|productID=%s&branch=%s&browseType=resolvedbyme&param=%s';
$lang->bug->menu->toclosed = 'ToBeClosed|bug|browse|productID=%s&branch=%s&browseType=toclosed&param=%s';
$lang->bug->menu->unresolved = 'Unresolved|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->unresolved = 'Unsolved|bug|browse|productID=%s&branch=%s&browseType=unresolved&param=%s';
$lang->bug->menu->more = array('link' => 'More|bug|browse|productID=%s&branch=%s&browseType=unconfirmed&param=%s', 'class' => 'dropdown dropdown-hover');
$lang->bug->subMenu = new stdclass();
@@ -788,7 +770,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
$lang->bug->subMenu->more->longlifebugs = 'Pending|bug|browse|productID=%s&branch=%s&browseType=longlifebugs&param=%s';
$lang->bug->subMenu->more->postponedbugs = 'Postponed|bug|browse|productID=%s&branch=%s&browseType=postponedbugs&param=%s';
$lang->bug->subMenu->more->overduebugs = 'Overdue|bug|browse|productID=%s&branch=%s&browseType=overduebugs&param=%s';
$lang->bug->subMenu->more->needconfirm = 'ToConfirm|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%s';
$lang->bug->subMenu->more->needconfirm = 'ToBeConfirmed|bug|browse|productID=%s&branch=%s&browseType=needconfirm&param=%s';
$lang->bug->menuOrder[5] = 'product';
$lang->bug->menuOrder[10] = 'all';
@@ -808,7 +790,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of testcase. */
$lang->testcase->menu = new stdclass();
$lang->testcase->menu->all = 'All|testcase|browse|productID=%s&branch=%s&browseType=all';
$lang->testcase->menu->wait = 'Wait|testcase|browse|productID=%s&branch=%s&browseType=wait';
$lang->testcase->menu->wait = 'Pending|testcase|browse|productID=%s&branch=%s&browseType=wait';
$lang->testcase->menu->bysuite = array('link' => 'Suite|testsuite|create|productID=%s', 'class' => 'dropdown dropdown-hover');
$lang->testcase->subMenu = new stdclass();
@@ -828,7 +810,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of testtask. */
$lang->testtask->menu = new stdclass();
$lang->testtask->menu->totalStatus = 'All|testtask|browse|productID=%s&branch=%s&type=%s,totalStatus';
$lang->testtask->menu->wait = 'Wait|testtask|browse|productID=%s&branch=%s&type=%s,wait';
$lang->testtask->menu->wait = 'Pending|testtask|browse|productID=%s&branch=%s&type=%s,wait';
$lang->testtask->menu->doing = 'Doing|testtask|browse|productID=%s&branch=%s&type=%s,doing';
$lang->testtask->menu->blocked = 'Blocked|testtask|browse|productID=%s&branch=%s&type=%s,blocked';
$lang->testtask->menu->done = 'Done|testtask|browse|productID=%s&branch=%s&type=%s,done';
@@ -849,7 +831,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust sub menu of caselib module. */
$lang->caselib->menu = new stdclass();
$lang->caselib->menu->all = 'All|testsuite|library|libID=%s&browseType=all';
$lang->caselib->menu->wait = 'Wait|testsuite|library|libID=%s&browseType=wait';
$lang->caselib->menu->wait = 'Pending|testsuite|library|libID=%s&browseType=wait';
$lang->caselib->menu->view = 'View|testsuite|libview|libID=%s';
$lang->caselib->menuOrder[5] = 'lib';
+5
View File
@@ -99,6 +99,7 @@ $lang->selectAll = '全选';
$lang->selectReverse = '反选';
$lang->loading = '稍候...';
$lang->notFound = '抱歉,您访问的对象并不存在!';
$lang->notPage = '抱歉,您访问的功能正在开发中!';
$lang->showAll = '[[全部显示]]';
$lang->future = '未来';
@@ -446,10 +447,13 @@ $lang->menugroup->user = 'company';
$lang->menugroup->group = 'company';
$lang->menugroup->bug = 'qa';
$lang->menugroup->testcase = 'qa';
$lang->menugroup->case = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testtask = 'qa';
$lang->menugroup->testsuite = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testreport = 'qa';
$lang->menugroup->doclib = 'doc';
$lang->menugroup->people = 'company';
$lang->menugroup->dept = 'company';
$lang->menugroup->todo = 'my';
@@ -858,6 +862,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust menu group. */
$lang->menugroup->bug = 'bug';
$lang->menugroup->testcase = 'testcase';
$lang->menugroup->case = 'testcase';
$lang->menugroup->testtask = 'testtask';
$lang->menugroup->testsuite = 'testsuite';
$lang->menugroup->testreport = 'testtask';
+5
View File
@@ -99,6 +99,7 @@ $lang->selectAll = '全選';
$lang->selectReverse = '反選';
$lang->loading = '稍候...';
$lang->notFound = '抱歉,您訪問的對象並不存在!';
$lang->notPage = '抱歉,您訪問的功能正在開發中!';
$lang->showAll = '[[全部顯示]]';
$lang->future = '未來';
@@ -446,10 +447,13 @@ $lang->menugroup->user = 'company';
$lang->menugroup->group = 'company';
$lang->menugroup->bug = 'qa';
$lang->menugroup->testcase = 'qa';
$lang->menugroup->case = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testtask = 'qa';
$lang->menugroup->testsuite = 'qa';
$lang->menugroup->caselib = 'qa';
$lang->menugroup->testreport = 'qa';
$lang->menugroup->doclib = 'doc';
$lang->menugroup->people = 'company';
$lang->menugroup->dept = 'company';
$lang->menugroup->todo = 'my';
@@ -858,6 +862,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest')
/* Adjust menu group. */
$lang->menugroup->bug = 'bug';
$lang->menugroup->testcase = 'testcase';
$lang->menugroup->case = 'testcase';
$lang->menugroup->testtask = 'testtask';
$lang->menugroup->testsuite = 'testsuite';
$lang->menugroup->testreport = 'testtask';
+27 -6
View File
@@ -1645,7 +1645,6 @@ EOD;
public function checkEntry()
{
$this->loadModel('entry');
if($this->session->valid_entry)
{
if(!$this->session->entry_code) $this->response('SESSION_CODE_MISSING');
@@ -1661,7 +1660,7 @@ EOD;
if(!$entry->key) $this->response('EMPTY_KEY');
if(empty($entry->account)) $this->response('ACCOUNT_UNBOUND');
if(!$this->checkIP($entry->ip)) $this->response('IP_DENIED');
if(!$this->checkEntryToken($entry->key)) $this->response('INVALID_TOKEN');
if(!$this->checkEntryToken($entry)) $this->response('INVALID_TOKEN');
$this->loadModel('user');
$user = $this->dao->findByAccount($entry->account)->from(TABLE_USER)->fetch();
@@ -1676,6 +1675,14 @@ EOD;
$this->session->set('VALID_ENTRY', md5(md5($this->get->code) . $this->server->remote_addr));
$this->loadModel('entry')->saveLog($entry->id, $this->server->request_uri);
/* Add for task #5384. */
if($_SERVER['REQUEST_METHOD'] == 'POST' and empty($_POST))
{
$post = file_get_contents("php://input");
if(!empty($post)) $post = json_decode($post, true);
if(!empty($post)) $_POST = $post;
}
unset($_GET['code']);
unset($_GET['token']);
}
@@ -1683,16 +1690,30 @@ EOD;
/**
* Check token of an entry.
*
* @param string $key
* @param object $entry
* @access public
* @return void
* @return bool
*/
public function checkEntryToken($key)
public function checkEntryToken($entry)
{
parse_str($this->server->query_String, $queryString);
unset($queryString['token']);
/* Change for task #5384. */
if(isset($queryString['time']))
{
$result = $this->get->token == md5($entry->code . $entry->key . $queryString['time']);
if($result)
{
if($queryString['time'] <= $entry->calledTime) $this->response('CALLED_TIME');
$this->loadModel('entry')->updateTime($entry->code, $queryString['time']);
unset($_GET['time']);
return $result;
}
}
$queryString = http_build_query($queryString);
return $this->get->token == md5(md5($queryString) . $key);
return $this->get->token == md5(md5($queryString) . $entry->key);
}
/**
+3 -3
View File
@@ -14,10 +14,10 @@ $lang->company->index = "Home";
$lang->company->edit = "Edit Company";
$lang->company->view = "Company Information";
$lang->company->browse = "User List";
$lang->company->dynamic = "Dynamic";
$lang->company->dynamic = "Dynamics";
$lang->company->orgView = 'View';
$lang->company->name = 'Name';
$lang->company->name = 'Company Name';
$lang->company->phone = 'Phone';
$lang->company->fax = 'Fax';
$lang->company->address = 'Mailing Address';
@@ -25,7 +25,7 @@ $lang->company->zipcode = 'Zip Code';
$lang->company->website = 'Website';
$lang->company->backyard = 'Intranet';
$lang->company->guest = 'Guest Login';
$lang->company->admins = 'Administrators';
$lang->company->admins = 'Administrator';
$lang->company->product = $lang->productCommon;
$lang->company->project = $lang->projectCommon;
+7 -7
View File
@@ -14,8 +14,8 @@ $lang->convert->index = 'Home';
$lang->convert->start = 'Start';
$lang->convert->desc = <<<EOT
<p>Welcome to the System Conversion Wizard, this program will assist you to convert data to ZenTao PMS.</p>
<strong>There is certain risk of conversion, so it is strongly recommended that you back up your databse and relavant files before conversion, and make sure no one is operating on either systems.</strong>
<p>Welcome to the System Conversion Wizard, this program will assist you to convert data to ZenTao.</p>
<strong>There are risks in the conversion, so it is strongly recommended that you back up your databse and relavant files before conversion, and make sure that no one is using either system.</strong>
EOT;
$lang->convert->setConfig = 'Source Config';
@@ -31,7 +31,7 @@ $lang->convert->mustSelectSource = "You must select a source system.";
$lang->convert->direction = "{$lang->projectCommon} converted to";
$lang->convert->questionTypeOfRedmine = 'Type in Redmine';
$lang->convert->aimTypeOfZentao = 'Convert to Type in Zentao';
$lang->convert->aimTypeOfZentao = 'Convert to Type in ZenTao';
$lang->convert->directionList['bug'] = 'Bug';
$lang->convert->directionList['task'] = 'Task';
@@ -51,17 +51,17 @@ $lang->convert->dbPort = 'Server Port';
$lang->convert->dbUser = 'Database User Name';
$lang->convert->dbPassword = 'Database Password';
$lang->convert->dbName = 'Database used in %s';
$lang->convert->dbCharset = '%s Database Code';
$lang->convert->dbCharset = '%s Database Coding';
$lang->convert->dbPrefix = '%s Table Prefix';
$lang->convert->installPath = '%s Installed path';
$lang->convert->installPath = '%s Installation Root Directory';
$lang->convert->checkDB = 'Database';
$lang->convert->checkTable = 'Table';
$lang->convert->checkPath = 'Installed Path';
$lang->convert->checkPath = 'Installation Path';
$lang->convert->execute = 'Convert';
$lang->convert->item = 'Item Converted';
$lang->convert->count = 'Count';
$lang->convert->count = 'No.';
$lang->convert->info = 'Info';
$lang->convert->bugfree = new stdclass();
+12 -12
View File
@@ -1,7 +1,7 @@
<?php
$lang->cron->common = 'Scheduled Task';
$lang->cron->common = 'Cron';
$lang->cron->index = 'Home';
$lang->cron->list = 'Tasks';
$lang->cron->list = 'Task';
$lang->cron->create = 'Add';
$lang->cron->edit = 'Edit';
$lang->cron->delete = 'Delete';
@@ -17,37 +17,37 @@ $lang->cron->dow = 'Week';
$lang->cron->command = 'Command';
$lang->cron->status = 'Status';
$lang->cron->type = 'Type';
$lang->cron->remark = 'Remark';
$lang->cron->lastTime = 'Last Executed';
$lang->cron->remark = 'Comment';
$lang->cron->lastTime = 'Last Run';
$lang->cron->turnonList['1'] = 'On';
$lang->cron->turnonList['0'] = 'Shutdown';
$lang->cron->turnonList['0'] = 'Off';
$lang->cron->statusList['normal'] = 'Normal';
$lang->cron->statusList['running'] = 'Running';
$lang->cron->statusList['stop'] = 'Stop';
$lang->cron->typeList['zentao'] = 'Self call';
$lang->cron->typeList['zentao'] = 'Self Call';
$lang->cron->typeList['system'] = 'System Command';
$lang->cron->toggleList['start'] = 'Activate';
$lang->cron->toggleList['stop'] = 'Deactivate';
$lang->cron->confirmDelete = 'Do you want to delete the Scheduled Task?';
$lang->cron->confirmTurnon = 'Do you want to truncoff the Cron?';
$lang->cron->confirmDelete = 'Do you want to delete the cron?';
$lang->cron->confirmTurnon = 'Do you want to turn off the cron?';
$lang->cron->introduction = <<<EOD
<p>Scheduled Task can do scheduled execution, such as update burndown chart, backup, etc.</p>
<p>This function need to be improved, so it is turned off by default.</p>
<p>Cron is to perform scheduled actions, such as update burndown chart, backup, etc.</p>
<p>Features of Cron need to be improved, so it is turned off by default.</p>
EOD;
$lang->cron->confirmOpen = <<<EOD
<p>Do you want to turn it on?<a href="%s" target='hiddenwin'><strong>Turn On Scheduled Task<strong></a></p>
EOD;
$lang->cron->notice = new stdclass();
$lang->cron->notice->m = 'Range:0-59,"*" means the numbers within the range, "/" means "per", "-" means ranger.';
$lang->cron->notice->m = 'Range:0-59,"*" means the numbers within the range, "/" means "per", "-" means the range.';
$lang->cron->notice->h = 'Range:0-23';
$lang->cron->notice->dom = 'Range:1-31';
$lang->cron->notice->mon = 'Range:1-12';
$lang->cron->notice->dow = 'Range:0-6';
$lang->cron->notice->help = 'Note:If server restarted, or Scheduled Task is not working, it means Scheduled Task has stopped. You can restart it by clicking 【Restart】 or reload this page. If the last execution time in changed, it means the Task is running.';
$lang->cron->notice->help = 'Note:If the server is restarted, or the Cron is not working, it means the Cron has stopped. You can restart it by clicking 【Restart】 or refresh this page. If the last execution time is changed, it means the Cron is running.';
$lang->cron->notice->errorRule = '"%s" is not valid';
+10 -14
View File
@@ -50,9 +50,9 @@ $lang->custom->bug->fields['severityList'] = 'Severity';
$lang->custom->bug->fields['osList'] = 'OS';
$lang->custom->bug->fields['browserList'] = 'Browser';
$lang->custom->bug->fields['typeList'] = 'Type';
$lang->custom->bug->fields['resolutionList'] = 'Resolution';
$lang->custom->bug->fields['resolutionList'] = 'Solution';
$lang->custom->bug->fields['statusList'] = 'Status';
$lang->custom->bug->fields['longlife'] = 'Longlife days';
$lang->custom->bug->fields['longlife'] = 'Pending Days';
$lang->custom->testcase = new stdClass();
$lang->custom->testcase->fields['priList'] = 'Priority';
@@ -77,29 +77,25 @@ $lang->custom->user->fields['statusList'] = 'Status';
$lang->custom->user->fields['contactField'] = 'Available Contact';
$lang->custom->user->fields['deleted'] = 'Deleted User';
$lang->custom->system = array('flow', 'working', 'required', 'score');
$lang->custom->system = array('flow', 'working', 'required', 'score', 'setDynamic');
$lang->custom->block->fields['closed'] = 'Closed Block';
$lang->custom->currentLang = 'Current Language';
$lang->custom->allLang = 'All Language';
$lang->custom->allLang = 'All Languages';
$lang->custom->confirmRestore = 'Do you want to reset the settings?';
$lang->custom->confirmRestore = 'Do you want to reset?';
$lang->custom->notice = new stdclass();
$lang->custom->notice->userFieldNotice = 'Control whether the above fields are displayed on the user-related page, and leave it blank to display all';
$lang->custom->notice->userFieldNotice = 'Control whether the above fields are displayed on the user-related page. Leave it blank and it will display all.';
$lang->custom->notice->canNotAdd = 'It will be calculated, so customization is not enabled.';
$lang->custom->notice->forceReview = '%s Review is required for certain committers.';
$lang->custom->notice->forceNotReview = "%s Review is NOT required for certain committers.";
$lang->custom->notice->longlife = 'Define longlife bugs.';
$lang->custom->notice->invalidNumberKey = 'The key should be =< 255.';
$lang->custom->notice->invalidStringKey = 'The key should be a combination of lowercase letters, numbers or underlines.';
<<<<<<< HEAD
$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set does not exist or is disabled. Timezone cannot be set.';
=======
$lang->custom->notice->cannotSetTimezone = 'date_default_timezone_set does not exist or is disabled. Time zone cannot be set.';
$lang->custom->notice->noClosedBlock = 'Blocks without permanent closure';
>>>>>>> 49933c0fcb7f076b5948bc4dba29468ed23927ec
$lang->custom->notice->indexPage['product'] = "ZenTao 8.2+ has Product Home. Do you want to go to Product Home?";
$lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Home. Do you want to go to Project Home?";
@@ -111,15 +107,15 @@ $lang->custom->notice->invalidStrlen['thirty'] = 'The key should be <= 30 ch
$lang->custom->notice->invalidStrlen['twoHundred'] = 'The key should be <= 225 characters.';
$lang->custom->storyReview = 'Review';
$lang->custom->forceReview = 'Required Review';
$lang->custom->forceNotReview = 'No review';
$lang->custom->forceReview = 'Review';
$lang->custom->forceNotReview = 'No Review';
$lang->custom->reviewList[1] = 'On';
$lang->custom->reviewList[0] = 'Off';
$lang->custom->deletedList[1] = 'Show';
$lang->custom->deletedList[0] = 'Hide';
$lang->custom->workingHours = 'hours/day';
$lang->custom->workingHours = 'hour/day';
$lang->custom->weekend = 'Weekend';
$lang->custom->weekendList[2] = '2-Day Off';
$lang->custom->weekendList[1] = '1-Day Off';
@@ -136,7 +132,7 @@ $lang->custom->workingList['onlyTest'] = 'Test Management';
$lang->custom->workingList['onlyStory'] = 'Story Management';
$lang->custom->workingList['onlyTask'] = 'Task Management';
$lang->custom->menuTip = 'Click to show/hide navigation bar. Drag to swtich display order.';
$lang->custom->menuTip = 'Click to show/hide the navigation bar. Drag to swtich display order.';
$lang->custom->saveFail = 'Failed to save!';
$lang->custom->scoreStatus[0] = 'Off';
+4 -13
View File
@@ -13,27 +13,18 @@ $lang->dept->common = 'Department';
$lang->dept->manageChild = "Department";
$lang->dept->edit = "Edit";
$lang->dept->delete = "Delete";
$lang->dept->parent = "Parent";
$lang->dept->parent = "Parent Dept";
$lang->dept->manager = "Manager";
$lang->dept->name = "Department Name";
$lang->dept->browse = "Manage";
<<<<<<< HEAD
$lang->dept->manage = "Maintain Department";
=======
$lang->dept->manage = "Manage Dept";
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->dept->manage = "Manage Department";
$lang->dept->updateOrder = "Sort";
$lang->dept->add = "Add Department";
$lang->dept->dragAndSort = "Drag and Sort";
$lang->dept->dragAndSort = "Drag to order";
$lang->dept->confirmDelete = " Do you want to delete this Department?";
$lang->dept->successSave = " Saved!";
$lang->dept->error = new stdclass();
<<<<<<< HEAD
$lang->dept->error->hasSons = 'This Department has child Department. You cannot delete it!';
$lang->dept->error->hasSons = 'This Department has child departments. You cannot delete it!';
$lang->dept->error->hasUsers = 'This Department has users. You cannot delete it!';
=======
$lang->dept->error->hasSons = 'This Dept has child departments. You cannot delete it!';
$lang->dept->error->hasUsers = 'This Dept has users. You cannot delete it!';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
+9 -9
View File
@@ -12,8 +12,8 @@ $lang->dev->noParams = 'No Parameters';
$lang->dev->post = 'POST Parameter';
$lang->dev->paramRange = 'Parameter Range: %s';
$lang->dev->paramDate = 'Date format: YY-mm-dd. such as 2019-01-01';
$lang->dev->paramColor = 'Color format: #RGB. such as #3da7f5';
$lang->dev->paramDate = 'Date format: YY-mm-dd, e.g 2019-01-01';
$lang->dev->paramColor = 'Color format: #RGB, e.g. #3da7f5';
$lang->dev->paramMailto = "User account. Separate accounts by ','.";
$lang->dev->fields = array();
@@ -28,15 +28,15 @@ $lang->dev->tableList = array();
$lang->dev->tableList['action'] = 'Action';
$lang->dev->tableList['bug'] = 'Bug';
$lang->dev->tableList['build'] = 'Build';
$lang->dev->tableList['burn'] = 'Burndown';
$lang->dev->tableList['burn'] = 'Burndown Chart';
$lang->dev->tableList['case'] = 'Test Case';
$lang->dev->tableList['casestep'] = 'Case Step';
$lang->dev->tableList['company'] = 'Company';
$lang->dev->tableList['config'] = 'Config';
$lang->dev->tableList['config'] = 'Configuration';
$lang->dev->tableList['custom'] = 'Custom';
$lang->dev->tableList['dept'] = 'Dept';
$lang->dev->tableList['doc'] = 'Doc';
$lang->dev->tableList['doclib'] = 'Doc Lib';
$lang->dev->tableList['dept'] = 'Department';
$lang->dev->tableList['doc'] = 'Document';
$lang->dev->tableList['doclib'] = 'Doc Library';
$lang->dev->tableList['effort'] = 'Effort';
$lang->dev->tableList['extension'] = 'Extension';
$lang->dev->tableList['file'] = 'File';
@@ -75,7 +75,7 @@ $lang->dev->tableList['git'] = 'GIT';
$lang->dev->tableList['index'] = 'Home';
$lang->dev->tableList['install'] = 'Install';
$lang->dev->tableList['mail'] = 'Email';
$lang->dev->tableList['misc'] = 'Misc';
$lang->dev->tableList['misc'] = 'Misc.';
$lang->dev->tableList['my'] = 'Dashboard';
$lang->dev->tableList['qa'] = 'QA';
$lang->dev->tableList['report'] = 'Report';
@@ -101,7 +101,7 @@ $lang->dev->tableList['webhook'] = 'WebHook';
$lang->dev->tableList['log'] = 'Log';
$lang->dev->tableList['message'] = 'Message';
$lang->dev->tableList['notify'] = 'Notify';
$lang->dev->tableList['userview'] = 'User View';
$lang->dev->tableList['userview'] = 'User Privilege';
$lang->dev->groupList['my'] = 'Dashboard';
$lang->dev->groupList['product'] = $lang->productCommon;
+5 -1
View File
@@ -304,12 +304,16 @@ class doc extends control
if(!$docResult or dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
$docID = $docResult['id'];
$files = $docResult['files'];
$lib = $this->doc->getLibByID($this->post->lib);
if($docResult['status'] == 'exists')
{
$this->send(array('result' => 'fail', 'message' => sprintf($this->lang->duplicate, $this->lang->doc->common), 'locate' => $this->createLink('doc', 'view', "docID=$docID")));
}
$this->action->create('doc', $docID, 'Created');
$fileAction = '';
if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ;
$this->action->create('doc', $docID, 'Created', $fileAction);
$vars = "libID=$libID&browseType=byModule&moduleID={$this->post->module}&orderBy=id_desc&from=$this->from";
$link = $this->createLink('doc', 'browse', $vars);
+17 -16
View File
@@ -18,7 +18,7 @@ $lang->doc->lib = 'Library';
$lang->doc->module = 'Module';
$lang->doc->title = 'Title';
$lang->doc->digest = 'Summary';
$lang->doc->comment = 'Remark';
$lang->doc->comment = 'Comment';
$lang->doc->type = 'Type';
$lang->doc->content = 'Text';
$lang->doc->keywords = 'Tags';
@@ -31,7 +31,7 @@ $lang->doc->editedDate = 'Edited ';
$lang->doc->version = 'Version';
$lang->doc->basicInfo = 'Basic Info';
$lang->doc->deleted = 'Deleted';
$lang->doc->fileObject = 'The Object';
$lang->doc->fileObject = 'Dependent Object';
$lang->doc->whiteList = 'White List';
$lang->doc->contentType = 'Format';
$lang->doc->separator = "<i class='icon-angle-right'></i>";
@@ -41,6 +41,7 @@ $lang->doc->extension = 'Extension';
$lang->doc->size = 'Size';
$lang->doc->download = 'Download';
$lang->doc->acl = 'Right';
$lang->doc->fileName = 'Files';
$lang->doc->groups = 'Groups';
$lang->doc->users = 'Users';
$lang->doc->item = ' Items';
@@ -152,16 +153,16 @@ $lang->doc->customObjectLibs['customFiles'] = 'Show Custom Library';
$lang->doc->orderLib = 'Library order settings';
$lang->doc->customShowLibs = 'Library display settings';
$lang->doc->customShowLibsList['zero'] = 'Display empty library';
$lang->doc->customShowLibsList['children'] = 'Display sub-category documents';
$lang->doc->customShowLibsList['unclosed'] = 'Only display projects that are not closed';
$lang->doc->customShowLibsList['children'] = 'Display child-category documents';
$lang->doc->customShowLibsList['unclosed'] = 'Display unclosed projects only';
$lang->doc->confirmDelete = "Do you want to delete this document?";
$lang->doc->confirmDeleteLib = "Do you want to delete this Doc Lib?";
$lang->doc->errorEditSystemDoc = "Ssytem document library doesn't have to be changed.";
$lang->doc->errorEditSystemDoc = "You don't have to change sytem document library.";
$lang->doc->errorEmptyProduct = "No {$lang->productCommon}. It cannot be created.";
$lang->doc->errorEmptyProject = "No {$lang->projectCommon}. It cannot be created.";
$lang->doc->errorMainSysLib = "This library cannot be deleted.";
$lang->doc->accessDenied = "Access denied!";
$lang->doc->accessDenied = "Access is denied!";
$lang->doc->versionNotFount = 'It does not exist in this build.';
$lang->doc->noDoc = 'No docs. ';
$lang->doc->cannotCreateOffice = 'Sorry, %s can only be created in ZenTao Enterprise. Contact renee@easysoft.ltd to try ZenTao Enterprise.';
@@ -170,17 +171,17 @@ $lang->doc->noEditedDoc = 'You have not edited any document.';
$lang->doc->noOpenedDoc = 'You have not created any document.';
$lang->doc->noCollectedDoc = 'You have not collected any document.';
$lang->doc->noticeAcl['lib']['product']['default'] = 'Users with privileges to access the selected products have access to it.';
$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users with privileges to access the selected products or users in the whiltelist have access to visit it.';
$lang->doc->noticeAcl['lib']['project']['default'] = 'Users with privileges to access the selected projects have access to it.';
$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users with privileges to access the selected projects or users in the whiltelist have access to it.';
$lang->doc->noticeAcl['lib']['custom']['open'] = 'All users have access to it.';
$lang->doc->noticeAcl['lib']['custom']['custom'] = 'Users in the whitelist have access to it.';
$lang->doc->noticeAcl['lib']['custom']['private'] = 'Only the one who created it has access to it.';
$lang->doc->noticeAcl['lib']['product']['default'] = 'Users with privileges to access the selected products can access it.';
$lang->doc->noticeAcl['lib']['product']['custom'] = 'Users with privileges to access the selected products or users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['project']['default'] = 'Users with privileges to access the selected projects can access it.';
$lang->doc->noticeAcl['lib']['project']['custom'] = 'Users with privileges to access the selected projects or users in the whiltelist can access it.';
$lang->doc->noticeAcl['lib']['custom']['open'] = 'All users can access it.';
$lang->doc->noticeAcl['lib']['custom']['custom'] = 'Users in the whitelist can access it.';
$lang->doc->noticeAcl['lib']['custom']['private'] = 'Only the one who created it can access it.';
$lang->doc->noticeAcl['doc']['open'] = 'Users with privileges to access the doc lib which the doc belongs to have access to it.';
$lang->doc->noticeAcl['doc']['custom'] = 'Users in the whiltelist have access to visit it.';
$lang->doc->noticeAcl['doc']['private'] = 'Only the one who created it has access to it.';
$lang->doc->noticeAcl['doc']['custom'] = 'Users in the whiltelist can access it.';
$lang->doc->noticeAcl['doc']['private'] = 'Only the one who created it can access it.';
$lang->doc->placeholder = new stdclass();
$lang->doc->placeholder->url = 'Url';
@@ -214,4 +215,4 @@ $lang->doclib->tabList['product'] = $lang->productCommon;
$lang->doclib->tabList['project'] = $lang->projectCommon;
$lang->doclib->tabList['custom'] = 'Custom';
$lang->doclib->nameList['custom'] = 'Doc lib name';
$lang->doclib->nameList['custom'] = 'Custom Name';
+1
View File
@@ -41,6 +41,7 @@ $lang->doc->extension = '类型';
$lang->doc->size = '大小';
$lang->doc->download = '下载';
$lang->doc->acl = '权限';
$lang->doc->fileName = '附件';
$lang->doc->groups = '分组';
$lang->doc->users = '用户';
$lang->doc->item = '项';
+1
View File
@@ -41,6 +41,7 @@ $lang->doc->extension = '類型';
$lang->doc->size = '大小';
$lang->doc->download = '下載';
$lang->doc->acl = '權限';
$lang->doc->fileName = '附件';
$lang->doc->groups = '分組';
$lang->doc->users = '用戶';
$lang->doc->item = '項';
+2 -1
View File
@@ -629,7 +629,7 @@ class docModel extends model
$docContent->files = join(',', array_keys($files));
$this->dao->insert(TABLE_DOCCONTENT)->data($docContent)->exec();
$this->loadModel('score')->create('doc', 'create', $docID);
return array('status' => 'new', 'id' => $docID);
return array('status' => 'new', 'id' => $docID, 'files' => $files);
}
return false;
}
@@ -1588,6 +1588,7 @@ class docModel extends model
$parantMoudles = $this->dao->select('id, name')->from(TABLE_MODULE)
->where('id')->in($path)
->andWhere('deleted')->eq(0)
->orderBy('`grade`')
->fetchAll('id');
foreach($parantMoudles as $parentID => $moduleName)
+1 -1
View File
@@ -12,7 +12,7 @@
?>
<?php include '../../common/view/header.html.php';?>
<?php $spliter = (empty($this->app->user->feedback) && !$this->cookie->feedbackView) ? true : false;?>
<div class="main-row <?php if($spliter) echo 'split-row';?>" id="mainRow">
<div class="main-row <?php if($spliter) echo 'split-row';?> fade" id="mainRow">
<?php include './side.html.php';?>
<?php if($this->cookie->browseType == 'bylist'):?>
<?php include dirname(__FILE__) . '/alllibsbylist.html.php';?>
+8 -8
View File
@@ -13,7 +13,7 @@ if($this->methodName != 'browse')
}
if(empty($type)) $type = 'product';
?>
<div class="side-col" style="width: 235px" data-min-width="235">
<div class="side-col" style="width: 238px" data-min-width="235">
<div class="cell">
<div class="tabs">
<ul class='nav nav-tabs'>
@@ -88,14 +88,14 @@ if(empty($type)) $type = 'product';
?>
<?php if($customLibCount > 0):?>
<li <?php echo $activeClass;?>>
<?php echo html::a($subLibLink, "<i class='icon {$icon}'></i> " . $subLibName, '', "class='text-ellipsis' title='{$subLibName}'");?>
<?php echo html::a($subLibLink, "<i class='icon {$icon}'></i> " . $subLibName, '', "class='text-ellipsis' title='{$subLibName}'");?>
<?php endif;?>
<?php if(isset($allModules[$subLibID])):?>
<?php if($customLibCount > 0):?>
<ul>
<?php endif;?>
<?php foreach($allModules[$subLibID] as $module):?>
<?php if($module->parent != 0) continue;?>
<?php if(isset($allModules[$subLibID])):?>
<?php if($customLibCount > 0):?>
<ul>
<?php endif;?>
<?php foreach($allModules[$subLibID] as $module):?>
<?php if($module->parent != 0) continue;?>
<li <?php if($this->methodName == 'browse' && $browseType == 'bymodule' && $moduleID == $module->id) echo "class='active'";?>>
<?php echo html::a($this->createLink('doc', 'browse', "libID=$subLibID&browseType=byModule&param={$module->id}"), "<i class='icon icon-folder-outline'></i> " . $module->name, '', "class='text-ellipsis' title='{$module->name}'");?>
<?php $this->doc->printChildModule($module, $subLibID, $this->methodName, $browseType, $moduleID);?>
+14 -14
View File
@@ -3,23 +3,23 @@ $lang->editor->common = 'Editor';
$lang->editor->api = 'API';
$lang->editor->index = 'Home';
$lang->editor->newMethod = 'New Method';
$lang->editor->extend = 'Extension';
$lang->editor->extend = 'Plug-in';
$lang->editor->api = 'API';
$lang->editor->newLang = 'New Language';
$lang->editor->newConfig = 'New Config';
$lang->editor->newHook = 'New Hook';
$lang->editor->newExtend = 'New Extension';
$lang->editor->newExtend = 'New Plug-in';
$lang->editor->newPage = 'New Page';
$lang->editor->override = 'Override';
$lang->editor->edit = 'Edit Extension';
$lang->editor->override = 'Overwrite';
$lang->editor->edit = 'Edit Plug-in';
$lang->editor->save = 'Save Page';
$lang->editor->delete = 'Delete Page';
$lang->editor->moduleList = 'Module';
$lang->editor->filePath = "Extension:";
$lang->editor->filePath = "Plug-in:";
$lang->editor->sourceFile = 'Source File:';
$lang->editor->fileName = "File Name:";
$lang->editor->isOverride = "Overridden Duplicated File";
$lang->editor->isOverride = "Overwrote Duplicated File";
$lang->editor->exampleHook = "(e.g. ***.html.hook.php)";
$lang->editor->exampleJs = "(e.g. ***.js)";
$lang->editor->exampleCss = "(e.g. ***.css)";
@@ -28,13 +28,13 @@ $lang->editor->pageName = "Page Name:";
$lang->editor->deleteConfirm = 'Do you want to delete it?';
$lang->editor->extendConfirm = 'Do you want to use original code?';
$lang->editor->repeatFile = 'File Name Dupliceted';
$lang->editor->repeatPage = 'Page existed. Do you want to override it?';
$lang->editor->repeatFile = 'File Name Duplicated';
$lang->editor->repeatPage = 'This page exists. Do you want to overwrite it?';
$lang->editor->noticeOkFile = 'For security reasons, your Admin account has to be confirmed. \n Please login ZenTao server and create %sFile.\n Note:\n 1. File is blank.\n 2. If the file existed, delete it and then create a new one.';
$lang->editor->editFileError = 'You can only modify Zentao files!';
$lang->editor->editFileError = 'You can only modify ZenTao files!';
$lang->editor->notWritable = "Not wirtable. Privilege is required. Please try chmod 777 -R ";
$lang->editor->notDelete = 'Cannot be deleted. Please check your privilege!';
$lang->editor->notWritable = "Not wirtable. Permission is required. Please try chmod 777 -R ";
$lang->editor->notDelete = 'Cannot be deleted. Please check your permissions!';
$lang->editor->emptyFileName = 'Please enter a File Name!';
$lang->editor->translate['config.php'] = 'config';
@@ -51,7 +51,7 @@ $lang->editor->modules['company'] = 'Company';
$lang->editor->modules['convert'] = 'Convert';
$lang->editor->modules['dept'] = 'Department';
$lang->editor->modules['doc'] = 'Doc';
$lang->editor->modules['extension'] = 'Extension';
$lang->editor->modules['extension'] = 'Plug-in';
$lang->editor->modules['file'] = 'File';
$lang->editor->modules['group'] = 'Group';
$lang->editor->modules['index'] = 'Homepage';
@@ -68,8 +68,8 @@ $lang->editor->modules['search'] = 'Search';
$lang->editor->modules['story'] = 'Story';
$lang->editor->modules['task'] = 'Task';
$lang->editor->modules['testcase'] = 'Case';
$lang->editor->modules['testtask'] = 'Test Task';
$lang->editor->modules['testtask'] = 'Test';
$lang->editor->modules['todo'] = 'Todo';
$lang->editor->modules['tree'] = 'Module';
$lang->editor->modules['tree'] = 'Module Maintenance';
$lang->editor->modules['upgrade'] = 'Upgrade';
$lang->editor->modules['user'] = 'User';
+1
View File
@@ -17,3 +17,4 @@ $config->entry->errcode['SESSION_VERIFY_FAILED'] = 401;
$config->entry->errcode['IP_DENIED'] = 403;
$config->entry->errcode['ACCOUNT_UNBOUND'] = 403;
$config->entry->errcode['EMPTY_ENTRY'] = 404;
$config->entry->errcode['CALLED_TIME'] = 405;
+13 -12
View File
@@ -4,13 +4,13 @@ $lang->entry->list = 'Entry List';
$lang->entry->api = 'API';
$lang->entry->webhook = 'Webhook';
$lang->entry->log = 'Log';
$lang->entry->setting = 'Setting';
$lang->entry->setting = 'Settings';
$lang->entry->browse = 'Browse';
$lang->entry->create = 'Add Entry';
$lang->entry->create = 'Create Entry';
$lang->entry->edit = 'Edit';
$lang->entry->delete = 'Delete';
$lang->entry->createKey = 'Create Key';
$lang->entry->createKey = 'Regenerate Secret Key';
$lang->entry->id = 'ID';
$lang->entry->name = 'Name';
@@ -23,8 +23,8 @@ $lang->entry->createdBy = 'Created By';
$lang->entry->createdDate = 'Created';
$lang->entry->editedby = 'Edited By';
$lang->entry->editedDate = 'Edited';
$lang->entry->date = 'Request Time';
$lang->entry->url = 'Request URL';
$lang->entry->date = 'Requesting Time';
$lang->entry->url = 'Requesting URL';
$lang->entry->confirmDelete = 'Do you want to delete this entry?';
$lang->entry->help = 'Help';
@@ -33,16 +33,17 @@ $lang->entry->notify = 'Notify';
$lang->entry->note = new stdClass();
$lang->entry->note->name = 'Name';
$lang->entry->note->code = 'Alias should be letters and numbers';
$lang->entry->note->ip = "Use comma to seperate IP. IP segment is supported, e.g. 192.168.1.*";
$lang->entry->note->allIP = 'All';
$lang->entry->note->account = 'Authenticated account in the entry';
$lang->entry->note->ip = "Use comma to seperate IPs. IP segment is supported, e.g. 192.168.1.*";
$lang->entry->note->allIP = 'All IPs';
$lang->entry->note->account = 'Entry Account';
$lang->entry->errmsg['PARAM_CODE_MISSING'] = 'Code is missing.';
$lang->entry->errmsg['PARAM_TOKEN_MISSING'] = 'Token is missing.';
$lang->entry->errmsg['PARAM_CODE_MISSING'] = 'Parameter code is missing.';
$lang->entry->errmsg['PARAM_TOKEN_MISSING'] = 'Parameter token is missing.';
$lang->entry->errmsg['SESSION_CODE_MISSING'] = 'Session code is missing.';
$lang->entry->errmsg['EMPTY_KEY'] = 'Key is missing.';
$lang->entry->errmsg['EMPTY_KEY'] = 'Secret key is missing.';
$lang->entry->errmsg['INVALID_TOKEN'] = 'Invalid token.';
$lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'Session verification failed.';
$lang->entry->errmsg['IP_DENIED'] = 'IP is denied.';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = 'Account is not bound.';
$lang->entry->errmsg['EMPTY_ENTRY'] = 'Key is missing.';
$lang->entry->errmsg['EMPTY_ENTRY'] = 'Entry does not exist.';
$lang->entry->errmsg['CALLED_TIME'] = 'Token has expired';
+1
View File
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'session验证失败';
$lang->entry->errmsg['IP_DENIED'] = '该IP被限制访问';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = '未绑定用户';
$lang->entry->errmsg['EMPTY_ENTRY'] = '应用不存在';
$lang->entry->errmsg['CALLED_TIME'] = 'Token已失效';
+1
View File
@@ -46,3 +46,4 @@ $lang->entry->errmsg['SESSION_VERIFY_FAILED'] = 'session驗證失敗';
$lang->entry->errmsg['IP_DENIED'] = '該IP被限制訪問';
$lang->entry->errmsg['ACCOUNT_UNBOUND'] = '未綁定用戶';
$lang->entry->errmsg['EMPTY_ENTRY'] = '應用不存在';
$lang->entry->errmsg['CALLED_TIME'] = 'Token已失效';
+14
View File
@@ -125,6 +125,20 @@ class entryModel extends model
return common::createChanges($oldEntry, $entry);
}
/**
* Update called time.
*
* @param string $code
* @param int $time
* @access public
* @return bool
*/
public function updateTime($code, $time)
{
$this->dao->update(TABLE_ENTRY)->set('calledTime')->eq($time)->where('code')->eq($code)->exec();
return !dao::isError();
}
/**
* Save log of an entry.
*
+34 -34
View File
@@ -9,33 +9,33 @@
* @version $Id$
* @link http://www.zentao.net
*/
$lang->extension->common = 'Extension';
$lang->extension->browse = 'Browse';
$lang->extension->common = 'Plug-in';
$lang->extension->browse = 'Plug-ins';
$lang->extension->install = 'Install';
$lang->extension->installAuto = 'Auto Install';
$lang->extension->installForce = 'Force Install';
$lang->extension->installAuto = 'Auto Installation';
$lang->extension->installForce = 'Force Installation';
$lang->extension->uninstall = 'Uninstall';
$lang->extension->activate = 'Activate';
$lang->extension->deactivate = 'Deactivate';
$lang->extension->obtain = 'Get Extension';
$lang->extension->obtain = 'Get Plug-in';
$lang->extension->view = 'Details';
$lang->extension->downloadAB = 'Download';
$lang->extension->upload = 'Local Install';
$lang->extension->upload = 'Local Installation';
$lang->extension->erase = 'Erase';
$lang->extension->upgrade = 'Extension Upgrade';
$lang->extension->agreeLicense = 'License';
$lang->extension->upgrade = 'Upgrade Plug-in';
$lang->extension->agreeLicense = 'I agree with the license.';
$lang->extension->structure = 'Structure';
$lang->extension->installed = 'Installed';
$lang->extension->deactivated = 'Deactivated';
$lang->extension->available = 'Downloaded';
$lang->extension->name = 'Extension Name';
$lang->extension->code = 'Code';
$lang->extension->desc = 'Describe';
$lang->extension->name = 'Plug-in Name';
$lang->extension->code = 'Alias';
$lang->extension->desc = 'Description';
$lang->extension->type = 'Type';
$lang->extension->dirs = 'Directory';
$lang->extension->files = 'Files';
$lang->extension->dirs = 'Installation Directory';
$lang->extension->files = 'Installation Files';
$lang->extension->status = 'Status';
$lang->extension->version = 'Version';
$lang->extension->latest = '<small>Latest:<strong><a href="%s" target="_blank" class="extension">%s</a></strong>,need zentao <a href="https://api.zentao.net/goto.php?item=latest" target="_blank"><strong>%s</strong></small>';
@@ -45,18 +45,18 @@ $lang->extension->site = 'Website';
$lang->extension->downloads = 'Downloads';
$lang->extension->compatible = 'Compatibility';
$lang->extension->grade = 'Score';
$lang->extension->depends = 'Dependent';
$lang->extension->depends = 'Dependency';
$lang->extension->expireDate = 'Expire';
$lang->extension->zentaoCompatible = 'Compatible Version';
$lang->extension->installedTime = 'Installed Time';
$lang->extension->publicList[0] = 'Manually';
$lang->extension->publicList[0] = 'Manual';
$lang->extension->publicList[1] = 'Auto';
$lang->extension->compatibleList[0] = 'Unknown';
$lang->extension->compatibleList[1] = 'Compatible';
$lang->extension->obtainOfficial[0] = 'Third party';
$lang->extension->obtainOfficial[0] = 'Third-party';
$lang->extension->obtainOfficial[1] = 'Official';
$lang->extension->byDownloads = 'Downloads';
@@ -67,22 +67,22 @@ $lang->extension->byCategory = 'Category';
$lang->extension->installFailed = '%s failed. Error:';
$lang->extension->uninstallFailed = 'Uninstallation failed. Error:';
$lang->extension->confirmUninstall = 'Uninstallation will delete or change related database. Do you want to uninstall?';
$lang->extension->installFinished = 'Congrats! The extension is %sed!';
$lang->extension->confirmUninstall = 'Uninstallation will delete or change related database. Do you want to uninstall it?';
$lang->extension->installFinished = 'Congrats! The plug-in is %sed!';
$lang->extension->refreshPage = 'Refresh';
$lang->extension->uninstallFinished = 'Extension is uninstalled.';
$lang->extension->deactivateFinished = 'Extension is deactivated.';
$lang->extension->activateFinished = 'Extension is activated.';
$lang->extension->eraseFinished = 'Extension is removed.';
$lang->extension->uninstallFinished = 'This plug-in is uninstalled.';
$lang->extension->deactivateFinished = 'This plug-in is deactivated.';
$lang->extension->activateFinished = 'This plug-in is activated.';
$lang->extension->eraseFinished = 'This plug-in is removed.';
$lang->extension->unremovedFiles = 'File or direcroty cannot be deleted. You have to manually delete';
$lang->extension->executeCommands = '<h3>Execute command lines below to fix the problem:</h3>';
$lang->extension->successDownloadedPackage = 'Extension downloaded!';
$lang->extension->successCopiedFiles = 'File copied!';
$lang->extension->successDownloadedPackage = 'This plug-in is downloaded!';
$lang->extension->successCopiedFiles = 'File is copied!';
$lang->extension->successInstallDB = 'Database is installed!';
$lang->extension->viewInstalled = 'Installed';
$lang->extension->viewAvailable = 'Available';
$lang->extension->viewDeactivated = 'Deactivated';
$lang->extension->backDBFile = 'Extension data has been backed up to %s!';
$lang->extension->viewInstalled = 'Installed Plug-ins';
$lang->extension->viewAvailable = 'Available Plug-ins';
$lang->extension->viewDeactivated = 'Deactivated Plug-ins';
$lang->extension->backDBFile = 'This plug-in data has been backed up to %s!';
$lang->extension->noticeOkFile = '<h5>For security reasons, your Admin account has to be confirmed.</h5>
<h5>Plese login your ZenTao server and create %s.</h5>
<p>Note</p>
@@ -98,10 +98,10 @@ $lang->extension->upgradeVersion = '(Upgrade %s to %s.)';
$lang->extension->waring = 'Warning!';
$lang->extension->errorOccurs = 'Error:';
$lang->extension->errorGetModules = 'Get Extension Category from www.zentao.net failed. It could be network error. Plase check your network and refresh it.';
$lang->extension->errorGetExtensions = 'Get Extension from www.zentao.net failed. It could be network error. Please go to <a href="https://www.zentao.net/extension/" target="_blank" class="alert-link">www.zentao.net</a> and download the extension, and then upload it to install.';
$lang->extension->errorDownloadPathNotFound = 'Extension download path <strong>%s</strong> is not found.<br /> Please run <strong>mkdir -p %s</strong> in Linux to fix it.';
$lang->extension->errorDownloadPathNotWritable = 'Extension download path <strong>%s</strong>is not writable. <br />Please run <strong>sudo chmod 777 %s</strong> in Linux to fix it.';
$lang->extension->errorGetModules = 'Get Plug-in Category from www.zentao.net failed. It could be network error. Plase check your network and refresh it.';
$lang->extension->errorGetExtensions = 'Get Plug-in from www.zentao.net failed. It could be network error. Please go to <a href="https://www.zentao.net/extension/" target="_blank" class="alert-link">www.zentao.net</a> and download the extension, and then upload it to install.';
$lang->extension->errorDownloadPathNotFound = 'Plug-in download path <strong>%s</strong> is not found.<br /> Please run <strong>mkdir -p %s</strong> in Linux to fix it.';
$lang->extension->errorDownloadPathNotWritable = 'Plug-in download path <strong>%s</strong>is not writable. <br />Please run <strong>sudo chmod 777 %s</strong> in Linux to fix it.';
$lang->extension->errorPackageFileExists = '<strong>%s</strong> exists in the download path.<h5> Please %s it again, <a href="%s" class="alert-link">CLICK HERE</a></h5>';
$lang->extension->errorDownloadFailed = 'Download failed. Please try it again. If still not OK, try to download it manually and upload it to install.';
$lang->extension->errorMd5Checking = 'Incomplete File. Please download it again. If still not OK, try to download it manually and upload it to install.';
@@ -112,6 +112,6 @@ $lang->extension->errorTargetPathNotWritable = '<strong>%s </strong> is not wr
$lang->extension->errorTargetPathNotExists = '<strong>%s </strong> is not found.';
$lang->extension->errorInstallDB = 'Database report execution failed. Error: %s';
$lang->extension->errorConflicts = 'Conflicted with “%s”!';
$lang->extension->errorDepends = 'Dependent extension has not been installed or the version is incorrect:<br /><br /> %s';
$lang->extension->errorDepends = 'Dependent Plug-in has not been installed or the version is incorrect:<br /><br /> %s';
$lang->extension->errorIncompatible = 'Incompatible with your ZenTao.';
$lang->extension->errorUninstallDepends = '“%s” is dependent on this extension. Please do not install it.';
$lang->extension->errorUninstallDepends = '“%s” is dependent on thiPlug-in. Please do not install it.';
+1 -23
View File
@@ -287,29 +287,7 @@ class file extends control
*/
public function sendDownHeader($fileName, $fileType, $content)
{
/* Clean the ob content to make sure no space or utf-8 bom output. */
$obLevel = ob_get_level();
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
/* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
setcookie('downloading', 1);
/* Append the extension name auto. */
$extension = '.' . $fileType;
if(strpos($fileName, $extension) === false) $fileName .= $extension;
/* urlencode the filename for ie. */
if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
/* Judge the content type. */
$mimes = $this->config->file->mimes;
$contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
header("Content-type: $contentType");
header("Content-Disposition: attachment; filename=\"$fileName\"");
header("Pragma: no-cache");
header("Expires: 0");
die($content);
$this->file->sendDownHeader($fileName, $fileType, $content);
}
/**
+10 -10
View File
@@ -22,8 +22,8 @@ $lang->file->maxUploadSize = "<span class='text-red'>%s</span>";
$lang->file->applyTemplate = "Apply Template";
$lang->file->tplTitle = "Template Name";
$lang->file->setPublic = "Set Public Template";
$lang->file->exportFields = "Export Fields";
$lang->file->exportRange = "Data Range";
$lang->file->exportFields = "Field to be exported";
$lang->file->exportRange = "Data to be exported";
$lang->file->defaultTPL = "Default Template";
$lang->file->setExportTPL = "Settings";
$lang->file->preview = "Preview";
@@ -41,19 +41,19 @@ $lang->file->encoding = 'Encoding';
$lang->file->addedBy = 'Added By';
$lang->file->addedDate = 'Added';
$lang->file->downloads = 'Downloads';
$lang->file->extra = 'Extra';
$lang->file->extra = 'Comment';
$lang->file->dragFile = 'Please drag here.';
$lang->file->childTaskTips = 'It\'s child task where \'>\' before the name.';
$lang->file->dragFile = 'Drag files here';
$lang->file->childTaskTips = 'It\'s a child task if there is a \'>\' before the name.';
$lang->file->errorNotExists = "<span class='text-red'>'%s' is not found.</span>";
$lang->file->errorCanNotWrite = "<span class='text-red'>'%s' is not writable. Please change its permission. Enter <span class='code'>sudo chmod -R 777 '%s'</span></span> in Linux.";
$lang->file->confirmDelete = " Do you want to delete it?";
$lang->file->errorFileSize = " File size exceeds the limit. It cannot be uploaded!";
$lang->file->errorFileUpload = " Uploading failed. File size might exceeds the limit.";
$lang->file->errorFileFormate = " Uploading failed, file format is limited.";
$lang->file->errorFileMove = " Uploading failed, there was an error when moving file.";
$lang->file->dangerFile = " File has been rejected to upload for security issues.";
$lang->file->errorFileUpload = " Uploading failed. The file size might exceeds the limit.";
$lang->file->errorFileFormate = " Uploading failed. The file format is not in the prescribed scope.";
$lang->file->errorFileMove = " Uploading failed. An error prompts when moving file.";
$lang->file->dangerFile = " The file failed to be uploaded for security reasons.";
$lang->file->errorSuffix = 'Format is incorrect. .zip files ONLY!';
$lang->file->errorExtract = 'Extracting file failed. File might be damaged or invalid files in the zip package.';
$lang->file->errorExtract = 'Extracting files failed. Files might be damaged or there might be invalid files in the zip package.';
$lang->file->uploadImagesExplain = 'Note: upload .jpg, .jpeg, .gif, and .png images. The image name will be taken as the title of the story and the image as its content.';
$lang->file->fileNotFound = 'The file was not found, maybe the physical file has been deleted!';
+36
View File
@@ -821,4 +821,40 @@ class fileModel extends model
unset($_SESSION['album'][$uid]);
}
}
/**
* Send the download header to the client.
*
* @param string $fileName
* @param string $fileType
* @param string $content
* @access public
* @return void
*/
public function sendDownHeader($fileName, $fileType, $content)
{
/* Clean the ob content to make sure no space or utf-8 bom output. */
$obLevel = ob_get_level();
for($i = 0; $i < $obLevel; $i++) ob_end_clean();
/* Set the downloading cookie, thus the export form page can use it to judge whether to close the window or not. */
setcookie('downloading', 1);
/* Append the extension name auto. */
$extension = '.' . $fileType;
if(strpos($fileName, $extension) === false) $fileName .= $extension;
/* urlencode the filename for ie. */
if(strpos($this->server->http_user_agent, 'MSIE') !== false or strpos($this->server->http_user_agent, 'Trident') !== false or strpos($this->server->http_user_agent, 'Edge') !== false) $fileName = urlencode($fileName);
/* Judge the content type. */
$mimes = $this->config->file->mimes;
$contentType = isset($mimes[$fileType]) ? $mimes[$fileType] : $mimes['default'];
header("Content-type: $contentType");
header("Content-Disposition: attachment; filename=\"$fileName\"");
header("Pragma: no-cache");
header("Expires: 0");
die($content);
}
}
+3 -3
View File
@@ -11,6 +11,6 @@
*/
/* Methods. */
$lang->git->common = 'Git';
$lang->git->cat = 'View Code';
$lang->git->diff = 'Diff Code';
$lang->git->apiSync = 'API: Sync Git Log';
$lang->git->cat = 'View Source Code';
$lang->git->diff = 'Compare Source Code';
$lang->git->apiSync = 'API: Synchronize Git Log';
+6 -1
View File
@@ -142,10 +142,15 @@ class group extends control
$this->view->title = $this->lang->company->common . $this->lang->colon . $group->name . $this->lang->colon . $this->lang->group->manageView;
$this->view->position[] = $group->name;
$this->view->position[] = $this->lang->group->manageView;
$this->view->group = $group;
$this->view->products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('deleted')->eq('0')->orderBy('order_desc')->fetchPairs('id', 'name');
$this->view->projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('deleted')->eq('0')->orderBy('order_desc')->fetchPairs('id', 'name');
$menugroup = array();
foreach($this->lang->menugroup as $moduleName => $groupName) $menugroup[$groupName][$moduleName] = $moduleName;
$this->view->menugroup = $menugroup;
$this->display();
}
+4
View File
@@ -1 +1,5 @@
.group-item {display:block; width:90px; float:left; margin-top:5px;}
.action-item {display:block; width:180px; float:left; margin-top:5px;}
.pl-0px {padding-left:0px !important;}
.pt-0px {padding-top:0px !important;}
+23 -15
View File
@@ -10,27 +10,16 @@ function toggleProject()
function selectAll(obj)
{
if($(obj).prop('checked'))
{
$(obj).closest('td').find(':checkbox').attr('checked', 'checked');
}
else
{
$(obj).closest('td').find(':checkbox').removeAttr('checked');
}
$(obj).closest('tr').find(':checkbox').prop('checked', $(obj).prop('checked'));
}
$('input:checkbox[name^="allchecker"]').change(function()
{
setTimeout(function(){toggleProduct(),toggleProject()}, 50);
$('.group-item :checkbox[name^="actions"]').change();
});
$('#product').change(function(){toggleProduct();})
$('#project').change(function(){toggleProject();})
$(function()
{
toggleProduct();
toggleProject();
$('.group-item :checkbox[name^="actions"]').change(function()
{
var allChecked = true;
@@ -38,6 +27,25 @@ $(function()
{
if(!$(this).prop('checked')) allChecked = false;
})
$('input:checkbox[name^="allchecker"]').prop('checked', allChecked);
$('.group-item input:checkbox[name^="allchecker"]').prop('checked', allChecked);
var id = $(this).attr('id');
if(id == 'product') toggleProduct();
if(id == 'project') toggleProject();
if($('#' + id + 'ActionBox').length == 1) $('#' + id + 'ActionBox').toggle($(this).prop("checked"));
})
})
$('.group-item :checkbox[name^="actions"]').change();
$("tr[id$='ActionBox']").each(function()
{
var allChecked = true;
$(this).find('td:last :checkbox').each(function()
{
if(!$(this).prop('checked'))
{
allChecked = false;
return true;
}
});
if(allChecked) $(this).find('th :checkbox').prop('checked', true);
});
});
+10 -9
View File
@@ -10,24 +10,25 @@
* @link http://www.zentao.net
*/
$lang->group->common = 'Privilege';
$lang->group->browse = 'Group Privilge';
$lang->group->browse = 'Groups';
$lang->group->create = 'Add Group';
$lang->group->edit = 'Edit';
$lang->group->copy = 'Copy';
$lang->group->delete = 'Delete';
$lang->group->manageView = 'View';
$lang->group->managePriv = 'Batch Assign';
$lang->group->managePrivByGroup = 'Privilege';
$lang->group->managePrivByGroup = 'Grooup Privilege';
$lang->group->managePrivByModule = 'Module Privilege';
$lang->group->byModuleTips = '<span class="tips">(Press Shift/Ctrl to Multi-select)</span>';
$lang->group->manageMember = 'Member';
$lang->group->confirmDelete = 'Do you want to delete this User Group?';
$lang->group->successSaved = 'Saved.';
$lang->group->errorNotSaved = 'Failed. Please select actions and groups.';
$lang->group->viewList = 'View';
$lang->group->productList = 'Product';
$lang->group->projectList = 'Project';
$lang->group->noticeVisit = 'Empty means no access.';
$lang->group->viewList = 'Access View';
$lang->group->productList = 'Access Product';
$lang->group->projectList = 'Access Project';
$lang->group->dynamic = 'Dynamics';
$lang->group->noticeVisit = 'Leave it empty, then the user group have no access';
$lang->group->id = 'ID';
$lang->group->name = 'Name';
@@ -42,10 +43,10 @@ $lang->group->option = 'Option';
$lang->group->inside = 'Group Users';
$lang->group->outside = 'Other Users';
$lang->group->other = 'Others';
$lang->group->all = 'All';
$lang->group->all = 'All Privileges';
$lang->group->copyOptions['copyPriv'] = 'Copy Privilege';
$lang->group->copyOptions['copyUser'] = 'Copy User';
$lang->group->copyOptions['copyPriv'] = 'Copy Privileges';
$lang->group->copyOptions['copyUser'] = 'Copy Users';
$lang->group->versions[''] = 'History';
$lang->group->versions['10_6'] = 'ZenTao10.6';
+5 -9
View File
@@ -498,9 +498,6 @@ $lang->resource->bug->report = 'reportChart';
$lang->resource->bug->export = 'export';
$lang->resource->bug->confirmStoryChange = 'confirmStoryChange';
$lang->resource->bug->delete = 'delete';
$lang->resource->bug->saveTemplate = 'saveTemplate';
$lang->resource->bug->deleteTemplate = 'deleteTemplate';
$lang->resource->bug->setPublic = 'setPublic';
$lang->resource->bug->batchChangeModule = 'batchChangeModule';
$lang->resource->bug->batchChangeBranch = 'batchChangeBranch';
@@ -525,12 +522,9 @@ $lang->bug->methodOrder[80] = 'report';
$lang->bug->methodOrder[85] = 'export';
$lang->bug->methodOrder[90] = 'confirmStoryChange';
$lang->bug->methodOrder[95] = 'delete';
$lang->bug->methodOrder[100] = 'saveTemplate';
$lang->bug->methodOrder[105] = 'deleteTemplate';
$lang->bug->methodOrder[110] = 'setPublic';
$lang->bug->methodOrder[115] = 'linkBugs';
$lang->bug->methodOrder[125] = 'batchChangeModule';
$lang->bug->methodOrder[130] = 'batchChangeBranch';
$lang->bug->methodOrder[100] = 'linkBugs';
$lang->bug->methodOrder[105] = 'batchChangeModule';
$lang->bug->methodOrder[110] = 'batchChangeBranch';
/* Test case. */
$lang->resource->testcase = new stdclass();
@@ -856,6 +850,7 @@ $lang->resource->user->dynamic = 'dynamic';
$lang->resource->user->profile = 'profile';
$lang->resource->user->batchEdit = 'batchEdit';
$lang->resource->user->unbind = 'unbind';
$lang->resource->user->setPublicTemplate = 'setPublicTemplate';
$lang->user->methodOrder[5] = 'create';
$lang->user->methodOrder[7] = 'batchCreate';
@@ -871,6 +866,7 @@ $lang->user->methodOrder[50] = 'dynamic';
$lang->user->methodOrder[55] = 'profile';
$lang->user->methodOrder[60] = 'batchEdit';
$lang->user->methodOrder[75] = 'unbind';
$lang->user->methodOrder[80] = 'setPublicTemplate';
/* Tree. */
$lang->resource->tree = new stdclass();
+5 -4
View File
@@ -24,10 +24,11 @@ $lang->group->manageMember = '成员维护';
$lang->group->confirmDelete = '您确定删除该用户分组吗?';
$lang->group->successSaved = '成功保存';
$lang->group->errorNotSaved = '没有保存,请确认选择了权限数据。';
$lang->group->viewList = '允许访问视图';
$lang->group->productList = '允许访问' . $lang->productCommon;
$lang->group->projectList = '允许访问' . $lang->projectCommon;
$lang->group->noticeVisit = '空代表访问没有访问限制';
$lang->group->viewList = '可访问视图';
$lang->group->productList = '可访问' . $lang->productCommon;
$lang->group->projectList = '可访问' . $lang->projectCommon;
$lang->group->dynamic = '可查看动态';
$lang->group->noticeVisit = '空代表没有访问限制';
$lang->group->id = '编号';
$lang->group->name = '分组名称';
+5 -4
View File
@@ -24,10 +24,11 @@ $lang->group->manageMember = '成員維護';
$lang->group->confirmDelete = '您確定刪除該用戶分組嗎?';
$lang->group->successSaved = '成功保存';
$lang->group->errorNotSaved = '沒有保存,請確認選擇了權限數據。';
$lang->group->viewList = '允許訪問視圖';
$lang->group->productList = '允許訪問' . $lang->productCommon;
$lang->group->projectList = '允許訪問' . $lang->projectCommon;
$lang->group->noticeVisit = '空代表訪問沒有訪問限制';
$lang->group->viewList = '可訪問視圖';
$lang->group->productList = '可訪問' . $lang->productCommon;
$lang->group->projectList = '可訪問' . $lang->projectCommon;
$lang->group->dynamic = '可查看動態';
$lang->group->noticeVisit = '空代表沒有訪問限制';
$lang->group->id = '編號';
$lang->group->name = '分組名稱';
+23 -1
View File
@@ -266,7 +266,29 @@ class groupModel extends model
public function updateView($groupID)
{
$actions = $this->post->actions;
if(isset($_POST['allchecker']))$actions['views'] = array();
if(isset($_POST['allchecker']))$actions['views'] = array();
if(!isset($actions['actions']))$actions['actions'] = array();
$dynamic = $actions['actions'];
if(!isset($_POST['allchecker']))
{
$dynamic = array();
foreach($actions['actions'] as $moduleName => $moduleActions)
{
if(isset($this->lang->menugroup->$moduleName))
{
$groupModule = $this->lang->menugroup->$moduleName;
if($groupModule != 'my' and !isset($actions['views'][$groupModule])) continue;
}
else
{
if($moduleName != 'my' and !isset($actions['views'][$moduleName])) continue;
}
$dynamic[$moduleName] = $moduleActions;
}
}
$actions['actions'] = $dynamic;
$actions = empty($actions) ? '' : json_encode($actions);
$this->dao->update(TABLE_GROUP)->set('acl')->eq($actions)->where('id')->eq($groupID)->exec();
+55 -3
View File
@@ -14,14 +14,14 @@
<div id='mainContent' class='main-content'>
<div class='main-header'>
<h2 title='<?php echo $group->name;?>'>
<span class='label-id'><?php echo $group->id;?></span>
<span id='groupName'><i class='icon-lock'> <?php echo $group->name;?></i></span>
<small> <?php echo $lang->arrow . $lang->group->manageView;?></small>
</h2>
</div>
<form class="load-indicator main-form form-ajax" id="manageViewForm" method="post" target='hiddenwin'>
<table class='table table-form'>
<tr>
<th class='w-100px'>
<th class='w-110px'>
<?php echo $lang->group->viewList;?>
</th>
<td>
@@ -53,6 +53,7 @@
<th class='text-right'><?php echo $lang->group->productList?></th>
<td>
<div class='input-group'>
<?php if(empty($products)) $products = array('' => '');?>
<?php echo html::select("actions[products][]", $products, isset($group->acl['products']) ? join(',', $group->acl['products']) : '', "class='form-control chosen' multiple")?>
<span class='input-group-addon strong'><?php echo $lang->group->noticeVisit?></span>
</div>
@@ -62,14 +63,65 @@
<th class='text-right'><?php echo $lang->group->projectList?></th>
<td>
<div class='input-group'>
<?php if(empty($projects)) $projects = array('' => '');?>
<?php echo html::select("actions[projects][]", $projects, isset($group->acl['projects']) ? join(',', $group->acl['projects']) : '', "class='form-control chosen' multiple")?>
<span class='input-group-addon strong'><?php echo $lang->group->noticeVisit?></span>
</div>
</td>
</tr>
<tr>
<th class='text-right text-top'><?php echo $lang->group->dynamic?></th>
<td class='pl-0px pt-0px'>
<table class='table table-form'>
<?php foreach($lang->menu as $module => $title):?>
<?php if(!isset($lang->action->dynamicAction->$module) and !isset($menugroup[$module])) continue;?>
<tr id='<?php echo "{$module}ActionBox";?>'>
<th class='w-100px text-left text-top'>
<div class='action-item'>
<div class='checkbox-primary'>
<input type="checkbox" id='allchecker' onclick="selectAll(this)"/>
<label class='priv' for='allchecker'><?php echo substr($title, 0, strpos($title, '|'));?></label>
</div>
</div>
</th>
<td>
<?php if(isset($lang->action->dynamicAction->$module)):?>
<div class='clearfix'>
<?php foreach($lang->action->dynamicAction->$module as $action => $actionTitle):?>
<div class='action-item'>
<div class='checkbox-primary'>
<input type='checkbox' id='<?php echo "$module-$action";?>' name='actions[actions][<?php echo $module;?>][<?php echo $action;?>]' value='<?php echo $action;?>' <?php if(isset($group->acl['actions'][$module][$action]) or !isset($group->acl['actions'])) echo "checked";?> />
<label class='priv' for='<?php echo "$module-$action";?>'><?php echo $actionTitle;?></label>
</div>
</div>
<?php endforeach;?>
</div>
<?php endif;?>
<?php if(isset($menugroup[$module])):?>
<?php foreach($menugroup[$module] as $subModule):?>
<?php if(isset($lang->action->dynamicAction->$subModule)):?>
<div class='clearfix'>
<?php foreach($lang->action->dynamicAction->$subModule as $action => $actionTitle):?>
<div class='action-item'>
<div class='checkbox-primary'>
<input type='checkbox' id='<?php echo "$subModule-$action";?>' name='actions[actions][<?php echo $subModule;?>][<?php echo $action;?>]' value='<?php echo $action;?>' <?php if(isset($group->acl['actions'][$subModule][$action]) or !isset($group->acl['actions'])) echo "checked";?> />
<label class='priv' for='<?php echo "$subModule-$action";?>'><?php echo $actionTitle;?></label>
</div>
</div>
<?php endforeach;?>
</div>
<?php endif;?>
<?php endforeach;?>
<?php endif;?>
</td>
</tr>
<?php endforeach;?>
</table>
</td>
</tr>
<tr>
<td colspan='2' class='form-actions text-center'>
<?php echo html::submitButton('', "onclick='setNoChecked()'");?>
<?php echo html::submitButton();?>
<?php echo html::backButton();?>
<?php echo html::hidden('foo'); // Just a hidden var, to make sure $_POST is not empty.?>
</td>
+32 -32
View File
@@ -14,29 +14,29 @@ $lang->install = new stdclass();
$lang->install->common = 'Install';
$lang->install->next = 'Next';
$lang->install->pre = 'Back';
$lang->install->reload = 'Reload';
$lang->install->reload = 'Refresh';
$lang->install->error = 'Error ';
$lang->install->officeDomain = 'https://www.zentao.pm';
$lang->install->start = 'Start';
$lang->install->keepInstalling = 'Keep installing this version.';
$lang->install->seeLatestRelease = 'View Latest Version';
$lang->install->keepInstalling = 'Continue installing this version';
$lang->install->seeLatestRelease = 'View latest version';
$lang->install->welcome = 'Thanks for choosing ZenTao!';
$lang->install->license = 'ZenTao PMS is under Z PUBLIC LICENSE(ZPL) 1.2';
$lang->install->license = 'ZenTao is under Z PUBLIC LICENSE(ZPL) 1.2';
$lang->install->desc = <<<EOT
ZenTao Project Management Software is an Open Source software released under <a href='http://zpl.pub/page/zplv12.html' target='_blank'>ZPL</a> license. It integrates with Product Management, Project Management, QA Management, Document Management, Todos Management, Company Management etc. ZenTao is the best choice for software project management.
ZenTao ALM is an Open Source software released under <a href='http://zpl.pub/page/zplv12.html' target='_blank'>Z Public License</a>. It integrates with Product Management, Project Management, QA Management, Document Management, Todos Management, Company Management etc. ZenTao is the best choice for software project management.
ZenTao PMS is built on PHP + MySQL and based on ZenTaoPHP framework, an independent framework developed by our team. Third party developers/organizations can develop extensions or customize for their requirements.
ZenTao ALM is built on PHP + MySQL and based on ZenTaoPHP framework, an independent framework developed by our team. Third party developers/organizations can develop plug-ins or customize for their requirements.
EOT;
$lang->install->links = <<<EOT
ZenTao PMS is developed by <strong><a href='http://easysoft.ltd' target='_blank' class='text-danger'>Nature Easy Soft Co., LTD</a></strong>.
ZenTao is developed by <strong><a href='http://easysoft.ltd' target='_blank' class='text-danger'>Nature Easy Soft Co., LTD</a></strong>.
Official Website : <a href='https://www.zentao.pm' target='_blank'>https://www.zentao.pm</a>
Technical Support : <a href='https://www.zentao.pm/forum/' target='_blank'>https://www.zentao.pm/forum/</a>
WhatsApp Group : <a href='https://chat.whatsapp.com/B6pi6b3gv0S7x7jqMxwhbF' target='_blank'>https://chat.whatsapp.com/B6pi6b3gv0S7x7jqMxwhbF</a>
Twitter: <a href='https://twitter.com/cneasysoft' target='_blank'>cneasysoft</a>
You are installing ZenTao <strong class='text-danger'>%s</strong> Version.
You are installing ZenTao <strong class='text-danger'>%s</strong>.
EOT;
$lang->install->newReleased= "<strong class='text-danger'>Notice</strong>:Official Website has the latest version<strong class='text-danger'>%s</strong>, released on %s.";
@@ -57,12 +57,12 @@ $lang->install->result = 'Result';
$lang->install->action = 'Action';
$lang->install->phpVersion = 'PHP Version';
$lang->install->phpFail = 'PHP Version has to be 5.2.0+';
$lang->install->phpFail = 'PHP Version should be 5.2.0+';
$lang->install->pdo = 'PDO';
$lang->install->pdoFail = 'Edit php.ini to load PDO extsion.';
$lang->install->pdoFail = 'Edit php.ini to load PDO extension.';
$lang->install->pdoMySQL = 'PDO_MySQL';
$lang->install->pdoMySQLFail = 'Edit php.ini to load PDO_MySQL extsion.';
$lang->install->pdoMySQLFail = 'Edit php.ini to load PDO_MySQL extension.';
$lang->install->json = 'JSON Extension';
$lang->install->jsonFail = 'Edit php.ini to load JSON extension.';
$lang->install->openssl = 'OpenSSL Extension';
@@ -86,18 +86,18 @@ $lang->install->sessionFail = 'Edit the php.ini file to set session.save_path.'
$lang->install->mkdirWin = '<p>%s directory has to be created.<br /> Run <code>mkdir %s</code> to create it.</p>';
$lang->install->chmodWin = ' "%s" privilege has to be changed.';
$lang->install->mkdirLinux = '<p>%s directory has to be created.<br /> Run <code>mkdir -p %s</code> to create it.</p>';
$lang->install->chmodLinux = ' "%s" privilege has to be changed.<br /> Run <code>chmod o=rwx -R %s</code> to change it.';
$lang->install->chmodLinux = ' "%s" permison has to be changed.<br /> Run <code>chmod o=rwx -R %s</code> to change it.';
$lang->install->timezone = 'Set Timezone';
$lang->install->defaultLang = 'Default Language';
$lang->install->dbHost = 'Database Host';
$lang->install->dbHostNote = 'If 127.0.0.1 is not accessible, try localhost.';
$lang->install->dbPort = 'Host Port';
$lang->install->dbUser = 'Database User';
$lang->install->dbUser = 'Database Username';
$lang->install->dbPassword = 'Database Password';
$lang->install->dbName = 'Database Name';
$lang->install->dbPrefix = 'Table Prefix';
$lang->install->clearDB = 'Clean tables if it already exists.';
$lang->install->clearDB = 'Clean up existing data';
$lang->install->importDemoData = 'Import Demo Data';
$lang->install->working = 'Operation Mode';
@@ -109,20 +109,20 @@ $lang->install->workingList['onlyTest'] = 'Only Test Management';
$lang->install->workingList['onlyStory'] = 'Only Story Management';
$lang->install->workingList['onlyTask'] = 'Only Task Management';
$lang->install->errorConnectDB = 'Connection to database Failed. ';
$lang->install->errorConnectDB = 'Connection to the database Failed. ';
$lang->install->errorDBName = 'Database name should exclude “.” ';
$lang->install->errorCreateDB = 'Failed to create the database.';
$lang->install->errorTableExists = 'Data table has existed. If ZenTao has been installed before, please return to last step and clear data. Then continue the installation.';
$lang->install->errorTableExists = 'The data table has existed. If ZenTao has been installed before, please return to last step and clear data. Then continue the installation.';
$lang->install->errorCreateTable = 'Failed to create the table.';
$lang->install->errorImportDemoData = 'Failed to import demo data.';
$lang->install->setConfig = 'Create config file';
$lang->install->setConfig = 'Create configuration file';
$lang->install->key = 'Item';
$lang->install->value = 'Value';
$lang->install->saveConfig = 'Save config';
$lang->install->save2File = '<div class="alert alert-warning">Copy the content in the text box above and save it to "<strong> %s </strong>". You can change this config file later.</div>';
$lang->install->saved2File = 'Config file has been saved to " <strong>%s</strong> ". You can change this file later.';
$lang->install->errorNotSaveConfig = 'Config file is not saved.';
$lang->install->save2File = '<div class="alert alert-warning">Copy the content in the text box above and save it to "<strong> %s </strong>". You can change this configuration file later.</div>';
$lang->install->saved2File = 'The configuration file has been saved to " <strong>%s</strong> ". You can change this file later.';
$lang->install->errorNotSaveConfig = 'The configuration file is not saved.';
$lang->install->getPriv = 'Set Admin';
$lang->install->company = 'Company Name';
@@ -132,7 +132,7 @@ $lang->install->errorEmptyPassword = 'Password should not be blank.';
$lang->install->groupList['ADMIN']['name'] = 'Admin';
$lang->install->groupList['ADMIN']['desc'] = 'System Admin';
$lang->install->groupList['DEV']['name'] = 'Dev';
$lang->install->groupList['DEV']['name'] = 'Dev.';
$lang->install->groupList['DEV']['desc'] = 'Developer';
$lang->install->groupList['QA']['name'] = 'QA';
$lang->install->groupList['QA']['desc'] = 'tester';
@@ -140,7 +140,7 @@ $lang->install->groupList['PM']['name'] = 'PM';
$lang->install->groupList['PM']['desc'] = 'Project Manager';
$lang->install->groupList['PO']['name'] = 'PO';
$lang->install->groupList['PO']['desc'] = 'Product Owner';
$lang->install->groupList['TD']['name'] = 'Dev Manager';
$lang->install->groupList['TD']['name'] = 'Dev. Manager';
$lang->install->groupList['TD']['desc'] = 'Development Manager';
$lang->install->groupList['PD']['name'] = 'PD';
$lang->install->groupList['PD']['desc'] = 'Product Director';
@@ -151,22 +151,22 @@ $lang->install->groupList['TOP']['desc'] = 'Senior Manager';
$lang->install->groupList['OTHERS']['name'] = 'Other';
$lang->install->groupList['OTHERS']['desc'] = 'other users';
$lang->install->groupList['LIMITED']['name'] = 'Limited User';
$lang->install->groupList['LIMITED']['desc'] = 'User can only edit contents related to itself';
$lang->install->groupList['LIMITED']['desc'] = 'Users can only edit contents related to themselves.';
$lang->install->cronList[''] = 'Monitor cron';
$lang->install->cronList['moduleName=project&methodName=computeburn'] = 'Update Burndown Chart';
$lang->install->cronList['moduleName=report&methodName=remind'] = 'Daily task reminder';
$lang->install->cronList['moduleName=report&methodName=remind'] = 'Daily Task Reminder';
$lang->install->cronList['moduleName=svn&methodName=run'] = 'Synchronize SVN';
$lang->install->cronList['moduleName=git&methodName=run'] = 'Synchronize GIT';
$lang->install->cronList['moduleName=backup&methodName=backup'] = 'Backup data&file';
$lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Async sending Message';
$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Async sending Webhook';
$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Delete overdue log';
$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Create repeat todos';
$lang->install->cronList['moduleName=backup&methodName=backup'] = 'Backup Data';
$lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Asynchronize sending Message';
$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Asynchronize sending Webhook';
$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Delete overdue logs';
$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Create recurring todos';
$lang->install->success = "Installed!";
$lang->install->login = 'Login ZenTao';
$lang->install->register = 'Register in ZenTao';
$lang->install->register = 'Register in ZenTao Community';
$lang->install->joinZentao = <<<EOT
<p>You have installed ZenTao %s.<strong class='text-danger'> Please delete install.php asap</strong>.</p><p>Note: In order to get the latest news of ZenTao, please register in ZenTao(<a href='https://www.zentao.pm' class='alert-link' target='_blank'>www.zentao.pm</a>).</p>
@@ -174,9 +174,9 @@ EOT;
$lang->install->product = array('chanzhi', 'ranzhi');
$lang->install->promotion = "Products from Nature Easy Soft team:";
$lang->install->promotion = "Products also from Nature Easy Soft team:";
$lang->install->chanzhi = new stdclass();
$lang->install->chanzhi->name = 'ZSITE content management system.';
$lang->install->chanzhi->name = 'ZSITE Content Management System';
$lang->install->chanzhi->logo = 'images/main/chanzhi_en.png';
$lang->install->chanzhi->url = 'http://www.zsite.net';
$lang->install->chanzhi->desc = <<<EOD
+15 -15
View File
@@ -13,7 +13,7 @@ $lang->mail->ztCloud = 'ZenTao CloudMail';
$lang->mail->gmail = 'Gmail';
$lang->mail->sendCloud = 'Notice SendCloud';
$lang->mail->batchDelete = 'Batch Delete';
$lang->mail->sendcloudUser = 'Sync Contact';
$lang->mail->sendcloudUser = 'Sync. Contact';
$lang->mail->agreeLicense = 'Yes';
$lang->mail->disagree = 'No';
@@ -28,11 +28,11 @@ $lang->mail->auth = 'SMTP Validation';
$lang->mail->username = 'SMTP Account';
$lang->mail->password = 'SMTP Password';
$lang->mail->secure = 'Encryption';
$lang->mail->debug = 'Debug Level';
$lang->mail->debug = 'Debugging Level';
$lang->mail->charset = 'Charset';
$lang->mail->accessKey = 'Access Key';
$lang->mail->secretKey = 'Secret Key';
$lang->mail->license = 'ZenTao Cloud Notice';
$lang->mail->license = 'ZenTao CloudMail Notice';
$lang->mail->selectMTA = 'Select MTA (Mail Transfer Agent)';
$lang->mail->smtp = 'SMTP';
@@ -42,14 +42,14 @@ $lang->mail->unsyncUser = 'Not Synchronized';
$lang->mail->sync = 'Synchronize';
$lang->mail->remove = 'Remove';
$lang->mail->toList = 'Receiver';
$lang->mail->toList = 'Recipient';
$lang->mail->ccList = 'Copy to';
$lang->mail->subject = 'Subject';
$lang->mail->createdBy = 'Sender';
$lang->mail->createdDate = 'Added';
$lang->mail->sendTime = 'Send';
$lang->mail->createdDate = 'Created';
$lang->mail->sendTime = 'Sent';
$lang->mail->status = 'Status';
$lang->mail->failReason = 'Fail Reason';
$lang->mail->failReason = 'Reason';
$lang->mail->statusList['sended'] = 'Sent';
$lang->mail->statusList['fail'] = 'Failed';
@@ -72,19 +72,19 @@ $lang->mail->secureList['ssl'] = 'ssl';
$lang->mail->secureList['tls'] = 'tls';
$lang->mail->more = 'More';
$lang->mail->noticeResend = 'Sent it again!';
$lang->mail->noticeResend = 'The Email has been re-sent!';
$lang->mail->inputFromEmail = 'Sender Email';
$lang->mail->nextStep = 'Next';
$lang->mail->successSaved = 'Setting is saved.';
$lang->mail->successSaved = 'Email settings are saved.';
$lang->mail->testSubject = 'Testing Email';
$lang->mail->testContent = 'Email is set!';
$lang->mail->testContent = 'Email settings are done!';
$lang->mail->successSended = 'Sent!';
$lang->mail->confirmDelete = 'Do you want to delete it?';
$lang->mail->sendmailTips = 'Note: Email sender will not receive this email.';
$lang->mail->needConfigure = 'Email setting is not found. Please set up the Email first.';
$lang->mail->needConfigure = 'Email settings are not found. Please do the Email settings first.';
$lang->mail->connectFail = 'Connection to ZenTao failed.';
$lang->mail->centifyFail = 'Verification failed. Please try to bind again!';
$lang->mail->nofsocket = 'fsocket related function has been deactivated. EMails cannot send out. Please modify allow_url_fopen in php.ini to turn on Onopenssl, and restart Apache.';
$lang->mail->centifyFail = 'Verification failed. The secret key might be changed. Please try to bind again!';
$lang->mail->nofsocket = 'fsocket related functions are deactivated. so Emails cannot be sent out. Please modify allow_url_fopen in php.ini to turn on Onopenssl, and restart Apache.';
$lang->mail->noOpenssl = 'Please turn on Onopenssl, and restart Apache.';
$lang->mail->disableSecure = 'No openssl. Disable ssl and tls.';
$lang->mail->sendCloudFail = 'Failed. Reason:';
@@ -94,8 +94,8 @@ $lang->mail->sendCloudHelp = <<<EOD
EOD;
$lang->mail->sendCloudSuccess = 'Done';
$lang->mail->closeSendCloud = 'Close';
$lang->mail->addressWhiteList = 'Add email address to the whiltelist of email server to avoid being blocked';
$lang->mail->closeSendCloud = 'Close SendCloud';
$lang->mail->addressWhiteList = 'Add email addresses to the whiltelist of your email server to avoid being blocked';
$lang->mail->ztCloudNotice = <<<EOD
+2 -2
View File
@@ -57,8 +57,8 @@
<td class='text-left'><?php echo $queue->failReason?></td>
<td class='c-actions'>
<?php
if(common::hasPriv('mail', 'delete')) echo html::a(inlink('delete', "id=$queue->id"), $lang->delete, 'hiddenwin', "class='btn btn-link'");
if(common::hasPriv('mail', 'resend') and $queue->status == 'fail') echo html::a(inlink('resend', "id=$queue->id"), $lang->mail->resend, 'hiddenwin', "class='btn btn-link'");
if(common::hasPriv('mail', 'delete')) echo html::a(inlink('delete', "id=$queue->id"), $lang->delete, 'hiddenwin');
if(common::hasPriv('mail', 'resend') and $queue->status == 'fail') echo html::a(inlink('resend', "id=$queue->id"), $lang->mail->resend, 'hiddenwin');
?>
</td>
</tr>
-4
View File
@@ -193,8 +193,4 @@ class misc extends control
$this->view->detailed = $detailed;
$this->display();
}
public function ajaxerror()
{
$this->display();
}
}
+16 -12
View File
@@ -18,7 +18,7 @@ $lang->misc->enApi = 'http://api.zentao.pm';
$lang->misc->zentao = new stdclass();
$lang->misc->zentao->version = 'Version %s';
$lang->misc->zentao->labels['about'] = 'About';
$lang->misc->zentao->labels['support'] = 'Support';
$lang->misc->zentao->labels['support'] = 'Technical Support';
$lang->misc->zentao->labels['cowin'] = 'Help Us';
$lang->misc->zentao->labels['service'] = 'Service';
@@ -41,7 +41,6 @@ $lang->misc->zentao->support['manual'] = "User Manual";
$lang->misc->zentao->cowin['reportbug'] = "Report Bug ";
$lang->misc->zentao->cowin['feedback'] = "Feedback";
@@ -57,15 +56,15 @@ $lang->misc->noGDLib = "Please visit <strong>%s</strong> in the browser of y
$lang->misc->copyright = "&copy; 2009 - 2019 <a href='http://easysoft.ltd' target='_blank'>Nature Easy Soft</a> Email <a href='mailto:Renee@easysoft.ltd'>Renee@easysoft.ltd</a>";
$lang->misc->checkTable = "Check Data Table";
$lang->misc->needRepair = "Repair Table";
$lang->misc->repairTable = "Database table is damaged due to power outage. Please check and repair!";
$lang->misc->repairTable = "Database table might be damaged due to power outage. Please check and repair!";
$lang->misc->repairFail = "Failed to repair. Please go to the data directory of your database, and try to execute <code>myisamchk -r -f %s.MYI</code> repair.";
$lang->misc->connectFail = "Failed to connect to the database. Error: %s,<br/> Please check the MySQL error log and troubleshoot.";
$lang->misc->tableName = "Table Name";
$lang->misc->tableStatus = "Status";
$lang->misc->novice = "New to ZenTao? Do you want to start ZenTao Tutorial?";
$lang->misc->noticeRepair = "<h5>If you are not Administrator, please contact your ZenTao Administrator to repair tables.</h5>
<h5>If you are, please login your Zentao host and create a file named <span>%s</span>.</h5>
$lang->misc->noticeRepair = "<h5>If you are not Administrator, contact your ZenTao Administrator to repair tables.</h5>
<h5>If you are the Administrator, login your ZenTao host and create a file named <span>%s</span>.</h5>
<p>Note:</p>
<ol>
<li>Keep the file empty.</li>
@@ -76,6 +75,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = 'Latest Version';
$lang->misc->feature->detailed = 'Details';
$lang->misc->releaseDate['11.5.stable'] = '2019-05-08';
$lang->misc->releaseDate['11.4.1'] = '2019-04-08';
$lang->misc->releaseDate['11.4.stable'] = '2019-03-25';
$lang->misc->releaseDate['11.3.stable'] = '2019-02-27';
@@ -102,11 +102,15 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '');
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'Added filters to Dynamics', 'desc' => '');
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'Integrated the latest ZenTao client', 'desc' => '');
$lang->misc->feature->all['11.4.1'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '');
$lang->misc->feature->all['11.4.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Enhanced test management.</p><p>Optimized the UI of Plan, Release, and Build linked stories and bugs.</p><p>Customize the feature whether to display files in child category.</p><p>Optimize details and fix bug.</p>');
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Add Child Plan to a Plan</p><p>Optimize the chosen</p><p>Add Timezone setting</p><p>Optimize Doc Lib and Doc modules</p>');
$lang->misc->feature->all['11.3.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Add Child Plan to a Plan</p><p>Optimize the chosen</p><p>Add Timezone settings</p><p>Optimize Document Library and Document modules</p>');
$lang->misc->feature->all['11.2.stable'][] = array('title'=>'Optimize details and fix bug.', 'desc' => '<p>Add upgrade logs and database checkup after upgrading</p><p>Fixed ZenTao client and other bugs, and optimized details.</p>');
@@ -121,7 +125,7 @@ $lang->misc->feature->all['10.5.stable'][] = array('title'=>'Adjust document lay
$lang->misc->feature->all['10.5.stable'][] = array('title'=>'Adjust the child task logic and optimize the display of parent-child task.', 'desc' => '');
$lang->misc->feature->all['10.4.stable'][] = array('title'=>'Optimize and adjust new interface', 'desc' => '<p>Detail page restore to the previous layout.</p><p>Refactore forms to add user pages</p><p>When use cases are executed, do not update the use case stause if the user manually chooses to pass and write the results.</p>');
$lang->misc->feature->all['10.4.stable'][] = array('title'=>'After the user machine hibernate and the login fails, the session will be refreshed again.', 'desc' => '');
$lang->misc->feature->all['10.4.stable'][] = array('title'=>'After the user machine hibernates and the login fails, the session will be refreshed again.', 'desc' => '');
$lang->misc->feature->all['10.4.stable'][] = array('title'=>'Upgrade existing interface mechanisms', 'desc' => '');
$lang->misc->feature->all['10.3.stable'][] = array('title'=>'Fix Bug.', 'desc' => '');
@@ -139,13 +143,13 @@ $lang->misc->feature->all['9.7.stable'][] = array('title'=>'Optimize Internation
$lang->misc->feature->all['9.6.stable'][] = array('title'=>'Added Webhook Interface feature', 'desc' => 'Support communication with BearyChat, Dingding');
$lang->misc->feature->all['9.6.stable'][] = array('title'=>'Added Point', 'desc' => 'More skilled application, more score');
$lang->misc->feature->all['9.6.stable'][] = array('title'=>'Added multiple user task and child tasks to Project', 'desc' => '');
$lang->misc->feature->all['9.6.stable'][] = array('title'=>'Added Product line management to Product View', 'desc' => '');
$lang->misc->feature->all['9.6.stable'][] = array('title'=>'Added Product line management to Product', 'desc' => '');
$lang->misc->feature->all['9.5.1'][] = array('title'=>'added Restricted Operatio', 'desc' => '');
$lang->misc->feature->all['9.5.1'][] = array('title'=>'added Restricted Operation', 'desc' => '');
$lang->misc->feature->all['9.3.beta'][] = array('title'=>'upgraded framework,Enhanced security', 'desc' => '');
$lang->misc->feature->all['9.1.stable'][] = array('title'=>'optimize Test View', 'desc' => '<p>added TestSuite,CaseLib and QA Report</p>');
$lang->misc->feature->all['9.1.stable'][] = array('title'=>'optimize Test View', 'desc' => '<p>added TestSuite, CaseLibrary and QA Report</p>');
$lang->misc->feature->all['9.1.stable'][] = array('title'=>'support Group steps of TestCase', 'desc' => '');
$lang->misc->feature->all['9.0.beta'][] = array('title'=>'ZenTao CloudMail has been added.', 'desc' => '<p>ZenTao CloudMail is a free Email service launched jointly with SendCloud. Once binded with ZenTao and passed verification, users can use this service.</p>');
@@ -159,7 +163,7 @@ $lang->misc->feature->all['8.2.stable'][] = array('title'=>'Batch Add/Edit Custo
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'Custom Story/Task/Bug/Case', 'desc' => '<p>You can custom fileds when add a Story/Task/Bug/Case.</p>');
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'Custom Export', 'desc' => '<p>You can custom fileds when export a Story/Task/Bug/Case pages. You can also save it as template for next export.</p>');
$lang->misc->feature->all['8.2.stable'][] = array('title'=>'Story/Task/Bug/Case Search ', 'desc' => '<p>On Story/Task/Bug/Case List page, you can do a combined search on Modules and Tabs.</p>');
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"Rookie's Tutorial", 'desc' => '<p>Tutorial for rookies is added for first-time users to know how to use ZenTao.</p>');
$lang->misc->feature->all['8.2.stable'][] = array('title'=>"ZenTao Tutorial", 'desc' => '<p>Tutorial for rookies is added for first-time users to know how to use ZenTao.</p>');
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'Product branch feature is added.', 'desc' => '<p>Product branch/platform is added, and its related Story/Plan/Bug/Case/Module has Branch added too.</p>');
$lang->misc->feature->all['7.4.beta'][] = array('title'=>'Release Module is improved.', 'desc' => '<p>Stop action has been added. If Stop to manage it, the Release will not show when Report Bug.</p><p>Bugs that have been omitted in the Release will be related manually.</p>');
@@ -168,7 +172,7 @@ $lang->misc->feature->all['7.4.beta'][] = array('title'=>'Create pages of Story
$lang->misc->feature->all['7.2.stable'][] = array('title'=>'Security Enhanced', 'desc' => '<p>Admin weak passwork check is enhanced.</p><p>ok file is required when code/upload an extension.</p><p>Sensitive action requires Admin password.</p><p>Do striptags, specialchars to content entered in ZenTao.</p>');
$lang->misc->feature->all['7.2.stable'][] = array('title'=>'Details Improved', 'desc' => '');
$lang->misc->feature->all['7.1.stable'][] = array('title'=>'Framework of scheduled tasks is added.', 'desc' => 'Framework of scheduled tasks is added. Daily notification, Burndown Update, Backup, Send Email and so on have been added.');
$lang->misc->feature->all['7.1.stable'][] = array('title'=>'Framework of Cron is added.', 'desc' => 'Framework of Cron is added. Daily notification, Burndown Update, Backup, Send Email and so on have been added.');
$lang->misc->feature->all['7.1.stable'][] = array('title'=>'rpm and deb packages are provided.', 'desc' => '');
$lang->misc->feature->all['6.3.stable'][] = array('title'=>'Data table is added.', 'desc' => '<p>Fields can be customized in data table and data will be displayed according to customized fields.</p>');
+5 -3
View File
@@ -41,7 +41,6 @@ $lang->misc->zentao->support['ask'] = "官方问答";
$lang->misc->zentao->support['video'] = "使用视频";
$lang->misc->zentao->support['qqgroup'] = "官方QQ群";
$lang->misc->zentao->cowin['donate'] = "捐助我们";
$lang->misc->zentao->cowin['reportbug'] = "汇报Bug";
$lang->misc->zentao->cowin['feedback'] = "反馈需求";
$lang->misc->zentao->cowin['recommend'] = "推荐给朋友";
@@ -76,6 +75,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '详情';
$lang->misc->releaseDate['11.5.stable'] = '2019-05-08';
$lang->misc->releaseDate['11.4.1'] = '2019-04-08';
$lang->misc->releaseDate['11.4.stable'] = '2019-03-25';
$lang->misc->releaseDate['11.3.stable'] = '2019-02-27';
@@ -102,6 +102,10 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '');
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'新增动态过滤机制', 'desc' => '');
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'集成新版本客户端', 'desc' => '');
$lang->misc->feature->all['11.4.1'][] = array('title'=>'完善细节,修复Bug', 'desc' => '');
$lang->misc->feature->all['11.4.stable'][] = array('title'=>'完善细节,修复Bug', 'desc' => '<p>增强测试任务管理</p><p>优化计划、发布、版本关联需求和bug的交互</p><p>文档库可以自定义是否显示子分类里的文档</p><p>修复bug,完善细节</p>');
@@ -173,5 +177,3 @@ $lang->misc->feature->all['7.1.stable'][] = array('title'=>'提供rpm和deb包',
$lang->misc->feature->all['6.3.stable'][] = array('title'=>'增加数据表格功能', 'desc' => '<p>可配置数据表格中可显示的字段,按照配置字段显示想看的数据</p>');
$lang->misc->feature->all['6.3.stable'][] = array('title'=>'继续完善细节', 'desc' => '');
$lang->misc->error = '此功能正在努力开发中...';
+5 -1
View File
@@ -41,7 +41,6 @@ $lang->misc->zentao->support['ask'] = "官方問答";
$lang->misc->zentao->support['video'] = "使用視頻";
$lang->misc->zentao->support['qqgroup'] = "官方QQ群";
$lang->misc->zentao->cowin['donate'] = "捐助我們";
$lang->misc->zentao->cowin['reportbug'] = "彙報Bug";
$lang->misc->zentao->cowin['feedback'] = "反饋需求";
$lang->misc->zentao->cowin['recommend'] = "推薦給朋友";
@@ -76,6 +75,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '詳情';
$lang->misc->releaseDate['11.5.stable'] = '2019-05-08';
$lang->misc->releaseDate['11.4.1'] = '2019-04-08';
$lang->misc->releaseDate['11.4.stable'] = '2019-03-25';
$lang->misc->releaseDate['11.3.stable'] = '2019-02-27';
@@ -102,6 +102,10 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '');
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'新增動態過濾機制', 'desc' => '');
$lang->misc->feature->all['11.5.stable'][] = array('title'=>'整合新版本客戶端', 'desc' => '');
$lang->misc->feature->all['11.4.1'][] = array('title'=>'完善細節,修復Bug', 'desc' => '');
$lang->misc->feature->all['11.4.stable'][] = array('title'=>'完善細節,修復Bug', 'desc' => '<p>增強測試任務管理</p><p>優化計劃、發佈、版本關聯需求和bug的交互</p><p>文檔庫可以自定義是否顯示子分類裡的文檔</p><p>修復bug,完善細節</p>');
+4 -4
View File
@@ -15,11 +15,11 @@ $lang->my->profile = 'My Profile';
$lang->my->dynamic = 'My Dynamic';
$lang->my->editProfile = 'Edit Profile';
$lang->my->changePassword = 'Edit Password';
$lang->my->unbind = 'Unbind Ranger';
$lang->my->unbind = 'Unbind Zdoo';
$lang->my->manageContacts = 'Manage Contact';
$lang->my->deleteContacts = 'Delete Contact';
$lang->my->shareContacts = 'Share the list';
$lang->my->limited = 'Restricted actions (editing only content related to itself)';
$lang->my->limited = 'Limited actions (only edit content related to themselves)';
$lang->my->score = 'My Point';
$lang->my->scoreRule = 'Point Rule';
$lang->my->noTodo = 'No todos. ';
@@ -38,13 +38,13 @@ $lang->my->storyMenu->reviewedByMe = 'Reviewed By Me';
$lang->my->storyMenu->closedByMe = 'Closed By Me';
$lang->my->home = new stdclass();
$lang->my->home->latest = 'Dynamic';
$lang->my->home->latest = 'Dynamics';
$lang->my->home->action = "%s, %s <em>%s</em> %s <a href='%s'>%s</a>.";
$lang->my->home->projects = $lang->projectCommon;
$lang->my->home->products = $lang->productCommon;
$lang->my->home->createProject = "Create {$lang->projectCommon}";
$lang->my->home->createProduct = "Create {$lang->productCommon}";
$lang->my->home->help = "<a href='https://www.zentao.net/help-read-79236.html' target='_blank'>Help</a>";
$lang->my->home->help = "<a href='https://www.zentao.pm/book/zentaomanual/free-open-source-project-management-software-workflow-46.html' target='_blank'>Help</a>";
$lang->my->home->noProductsTip = "No {$lang->productCommon} found here.";
$lang->my->form = new stdclass();
+1
View File
@@ -89,6 +89,7 @@ $config->product->editor = new stdclass();
$config->product->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
$config->product->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
$config->product->editor->close = array('id' => 'comment', 'tools' => 'simpleTools');
$config->product->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simpleTools');
$config->product->report = new stdclass();
$config->product->report->stage = array();
+12 -12
View File
@@ -11,8 +11,8 @@
*/
$lang->product->common = $lang->productCommon;
$lang->product->index = $lang->productCommon . 'Home';
$lang->product->browse = 'Story List';
$lang->product->dynamic = 'Dynamic';
$lang->product->browse = 'Story';
$lang->product->dynamic = 'Dynamics';
$lang->product->view = 'Overview';
$lang->product->edit = "Edit {$lang->productCommon}";
$lang->product->batchEdit = 'Batch Edit';
@@ -74,9 +74,9 @@ $lang->product->qa = 'QA';
$lang->product->release = 'Release';
$lang->product->allRelease = 'All Release';
$lang->product->maintain = 'Maintaining';
$lang->product->latestDynamic = 'Dynamic';
$lang->product->latestDynamic = 'Dynamics';
$lang->product->plan = 'Plan';
$lang->product->iteration = 'Build Iteration';
$lang->product->iteration = 'Version Iteration';
$lang->product->iterationInfo = '%s Iteration';
$lang->product->iterationView = 'Details';
@@ -91,7 +91,7 @@ $lang->product->changedStory = 'Changed';
$lang->product->willClose = 'ToBeClosed';
$lang->product->closedStory = 'Closed';
$lang->product->unclosed = 'Open';
$lang->product->unplan = 'Wait';
$lang->product->unplan = 'Unplanned';
$lang->product->allStory = 'All';
$lang->product->allProduct = 'All' . $lang->productCommon;
@@ -99,11 +99,11 @@ $lang->product->allProductsOfProject = 'All linked' . $lang->productCommon;
$lang->product->typeList[''] = '';
$lang->product->typeList['normal'] = 'Normal';
$lang->product->typeList['branch'] = 'Multi Branch';
$lang->product->typeList['platform'] = 'Multi Platform';
$lang->product->typeList['branch'] = 'Multiple Branch';
$lang->product->typeList['platform'] = 'Multiple Platform';
$lang->product->typeTips = array();
$lang->product->typeTips['branch'] = '(for the custom content)';
$lang->product->typeTips['branch'] = '(for the customized content)';
$lang->product->typeTips['platform'] = '(for IOS, Android, PC, etc.)';
$lang->product->branchName['normal'] = '';
@@ -114,12 +114,12 @@ $lang->product->statusList[''] = '';
$lang->product->statusList['normal'] = 'Normal';
$lang->product->statusList['closed'] = 'Closed';
$lang->product->aclList['open'] = "Default (User with privilege to {$lang->productCommon} can access to it.)";
$lang->product->aclList['open'] = "Default (Users with privileges to {$lang->productCommon} can access it.)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} ({$lang->projectCommon} team members only)";
$lang->product->aclList['custom'] = 'Custom (Team members and Whitelist members have access to it.)';
$lang->product->aclList['custom'] = 'Custom (Team members and Whitelist members can access it.)';
$lang->product->storySummary = " <strong>%s</strong> Story(ies), <strong>%s</strong> hour(s) estimated, case coverage is <strong>%s</strong> on this page.";
$lang->product->checkedSummary = " <strong>%total%</strong> Checked, <strong>%estimate%</strong> hour(s) estimated, case coverage is <strong>%rate%</strong>.";
$lang->product->storySummary = " <strong>%s</strong> Story, <strong>%s</strong> Hour Estimates, and Case Coverage is <strong>%s</strong> on this page.";
$lang->product->checkedSummary = " <strong>%total%</strong> Checked, <strong>%estimate%</strong> Hour Estimates, nd Case Coverage is <strong>%rate%</strong>.";
$lang->product->noModule = '<div>You have no modules</div><div>Manage now</div>';
$lang->product->noProduct = "No {$lang->productCommon}. ";
$lang->product->noMatched = '"%s" cannot be found.' . $lang->productCommon;
+1
View File
@@ -273,6 +273,7 @@
foreach($lang->story->stageList as $key => $stage)
{
if(empty($key)) continue;
if(strpos('tested|verified|released|closed', $key) === false) continue;
$actionLink = $this->createLink('story', 'batchChangeStage', "stage=$key");
echo "<li>" . html::a('#', $stage, '', "onclick=\"setFormAction('$actionLink','hiddenwin')\"") . "</li>";
}
+4 -1
View File
@@ -63,7 +63,10 @@
</tr>
<tr>
<th><?php echo $lang->product->desc;?></th>
<td colspan='2'><?php echo html::textarea('desc', '', "rows='8' class='form-control kindeditor' hidefocus='true' tabindex=''");?></td>
<td colspan='2'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', "type=product&link=desc");?>
<?php echo html::textarea('desc', '', "rows='8' class='form-control kindeditor' hidefocus='true' tabindex=''");?>
</td>
</tr>
<tr>
<th><?php echo $lang->product->acl;?></th>
+6 -1
View File
@@ -11,9 +11,12 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/kindeditor.html.php';?>
<div id='mainContent' class="main-row">
<div class="col-8 main-col">
<div class="row">
<?php $isRoadmap = common::hasPriv('product', 'roadmap');?>
<?php if($isRoadmap):?>
<div class="col-sm-6">
<div class="panel block-release">
<div class="panel-heading">
@@ -49,7 +52,8 @@
</div>
</div>
</div>
<div class="col-sm-6">
<?php endif;?>
<div class="col-sm-<?php echo $isRoadmap ? 6 : 12?>">
<div class="panel block-dynamic">
<div class="panel-heading">
<div class="panel-title"><?php echo $lang->product->latestDynamic;?></div>
@@ -73,6 +77,7 @@
</div>
<div class="col-sm-12">
<?php $blockHistory = true;?>
<?php $actionFormLink = $this->createLink('action', 'comment', "objectType=product&objectID=$product->id");?>
<?php include '../../common/view/action.html.php';?>
</div>
</div>
+8 -8
View File
@@ -16,7 +16,7 @@ $lang->productplan->create = "Create Plan";
$lang->productplan->edit = "Edit";
$lang->productplan->delete = "Delete";
$lang->productplan->view = "Details";
$lang->productplan->bugSummary = "Total <strong>%s</strong> Bugs on this page.";
$lang->productplan->bugSummary = "<strong>%s</strong> Bugs in total on this page.";
$lang->productplan->basicInfo = 'Basic Info';
$lang->productplan->batchEdit = 'Batch Edit';
@@ -33,7 +33,7 @@ $lang->productplan->linkBug = "Link Bug";
$lang->productplan->unlinkBug = "Unlink Bug";
$lang->productplan->batchUnlinkBug = "Batch Unlink Bug";
$lang->productplan->linkedBugs = 'Linked Bug';
$lang->productplan->unlinkedBugs = 'Unlinked';
$lang->productplan->unlinkedBugs = 'Unlinked Bug';
$lang->productplan->unexpired = 'Unexpired Plan';
$lang->productplan->all = 'All Plan';
@@ -51,12 +51,12 @@ $lang->productplan->begin = 'Begin';
$lang->productplan->end = 'End';
$lang->productplan->last = 'Last plan';
$lang->productplan->future = 'Pending';
$lang->productplan->stories = 'Stories';
$lang->productplan->bugs = 'Bugs';
$lang->productplan->hour = 'Hour';
$lang->productplan->stories = 'Story';
$lang->productplan->bugs = 'Bug';
$lang->productplan->hour = 'Man-hour';
$lang->productplan->project = $lang->projectCommon;
$lang->productplan->parent = "Father plan";
$lang->productplan->children= "Sub plan";
$lang->productplan->parent = "Parent plan";
$lang->productplan->children= "Child plan";
$lang->productplan->endList[7] = '1 Week';
$lang->productplan->endList[14] = '2 Weeks';
@@ -69,7 +69,7 @@ $lang->productplan->endList[365] = '1 Year';
$lang->productplan->errorNoTitle = 'ID %s title should not be empty.';
$lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.';
$lang->productplan->errorNoEnd = 'ID %s end time should not be empty.';
$lang->productplan->beginGeEnd = 'ID %s begin time value should not be greater than t.';
$lang->productplan->beginGeEnd = 'ID %s begin time should not be greater than end time.';
$lang->productplan->featureBar['browse']['all'] = 'All';
$lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired';
+1
View File
@@ -29,6 +29,7 @@ $config->project->editor->close = array('id' => 'comment', 'tools' => 'simple
$config->project->editor->start = array('id' => 'comment', 'tools' => 'simpleTools');
$config->project->editor->suspend = array('id' => 'comment', 'tools' => 'simpleTools');
$config->project->editor->tree = array('id' => 'comment', 'tools' => 'simpleTools');
$config->project->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simpleTools');
$config->project->search['module'] = 'task';
$config->project->search['fields']['name'] = $lang->task->name;
+1 -1
View File
@@ -1780,7 +1780,7 @@ class project extends control
$this->loadModel('dept');
$project = $this->project->getById($projectID);
$users = $this->user->getPairs('noclosed|nodeleted|devfirst');
$users = $this->user->getPairs('noclosed|nodeleted|devfirst|nofeedback');
$roles = $this->user->getUserRoles(array_keys($users));
$deptUsers = $dept === '' ? array() : $this->dept->getDeptUserPairs($dept);
$currentMembers = $this->project->getTeamMembers($projectID);
+49 -143
View File
@@ -19,21 +19,11 @@ $lang->project->begin = 'Begin';
$lang->project->end = 'End';
$lang->project->dateRange = 'Duration';
$lang->project->to = 'To';
<<<<<<< HEAD
<<<<<<< HEAD
$lang->project->days = 'Man-Day';
$lang->project->day = 'day';
$lang->project->workHour = 'Hours';
=======
$lang->project->days = 'Man Day';
=======
$lang->project->days = 'Man-Day';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->days = 'Available Days';
$lang->project->day = ' days';
$lang->project->workHour = ' hours';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->project->totalHours = 'Work Hours';
$lang->project->totalDays = 'Work Days';
$lang->project->totalHours = 'Hour';
$lang->project->totalDays = 'Day';
$lang->project->status = 'Status';
$lang->project->desc = 'Description';
$lang->project->owner = 'Owner';
@@ -57,34 +47,16 @@ $lang->project->viewBug = 'Bugs';
$lang->project->noProduct = "No {$lang->productCommon}";
$lang->project->createStory = "Create Story";
$lang->project->all = 'All';
$lang->project->undone = 'Unfinished';
$lang->project->undone = 'Uncompleted';
$lang->project->unclosed = 'Unclosed';
<<<<<<< HEAD
<<<<<<< HEAD
$lang->project->typeDesc = 'No story, bug, build, test task or Burndown is allowed in OPS';
$lang->project->mine = 'My Responsibility: ';
=======
$lang->project->typeDesc = 'No story, bug, build, test task or burndown is allowed in OPS';
=======
$lang->project->typeDesc = 'No story, bug, build, test or burndown is allowed in OPS';
<<<<<<< HEAD
$lang->project->typeDesc = 'No story, bug, build, test, or burndown chart is allowed in OPS';
$lang->project->mine = 'My: ';
=======
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->mine = 'Mine: ';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
>>>>>>> 1f8899a84819dad5ffe811c8eb667fd33e01136f
$lang->project->other = 'Other:';
$lang->project->deleted = 'Deleted';
$lang->project->delayed = 'Delayed';
$lang->project->product = $lang->project->products;
<<<<<<< HEAD
$lang->project->readjustTime = 'Change project duration';
$lang->project->readjustTask = 'Change task duration';
=======
$lang->project->readjustTime = "Adjust {$lang->projectCommon} begin and end time";
$lang->project->readjustTask = 'Adjust task start date and deadline';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->readjustTime = "Adjust {$lang->projectCommon} Begin and End";
$lang->project->readjustTask = 'Adjust task Begin and End';
$lang->project->effort = 'Effort';
$lang->project->relatedMember = 'Team Member';
@@ -111,11 +83,11 @@ $lang->team = new stdclass();
$lang->team->account = 'Username';
$lang->team->role = 'Role';
$lang->team->join = 'Joined';
$lang->team->hours = 'Hour/Day';
$lang->team->days = 'Work Days';
$lang->team->hours = 'hour/day';
$lang->team->days = 'day';
$lang->team->totalHours = 'Total Hours';
$lang->team->limited = 'limited user';
$lang->team->limited = 'Limited User';
$lang->team->limitedList['no'] = 'No';
$lang->team->limitedList['yes'] = 'Yes';
@@ -123,45 +95,29 @@ $lang->project->basicInfo = 'Basic Info';
$lang->project->otherInfo = 'Other Info';
/* 字段取值列表。*/
$lang->project->statusList['wait'] = 'Wait';
$lang->project->statusList['wait'] = 'Pending';
$lang->project->statusList['doing'] = 'Doing';
$lang->project->statusList['suspended'] = 'Suspend';
$lang->project->statusList['suspended'] = 'Suspended';
$lang->project->statusList['closed'] = 'Closed';
$lang->project->aclList['open'] = "Default (Users who can visit {$lang->projectCommon} have access to it.)";
$lang->project->aclList['open'] = "Default (Users who have the privilege to visit {$lang->projectCommon} can access it.)";
$lang->project->aclList['private'] = 'Private (For team members only.)';
$lang->project->aclList['custom'] = 'Whitelist (Team members and the whitelist members have access to it.)';
$lang->project->aclList['custom'] = 'Whitelist (Team members and the whitelist members can access it.)';
/* 方法列表。*/
$lang->project->index = "Home";
<<<<<<< HEAD
$lang->project->task = 'Tasks';
<<<<<<< HEAD
$lang->project->groupTask = 'View by Group';
=======
=======
$lang->project->task = 'Task';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->groupTask = 'Group View';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->project->story = 'Story';
$lang->project->bug = 'Bug';
$lang->project->dynamic = 'Dynamic';
$lang->project->latestDynamic = 'Latest Dynamic';
$lang->project->dynamic = 'Dynamics';
$lang->project->latestDynamic = 'Latest Dynamics';
$lang->project->build = 'Build';
<<<<<<< HEAD
<<<<<<< HEAD
$lang->project->testtask = 'Test';
=======
$lang->project->testtask = 'Test Task';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
=======
$lang->project->testtask = 'Test';
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->burn = 'Burndown';
$lang->project->computeBurn = 'Update';
$lang->project->burnData = 'Burndown Data';
$lang->project->fixFirst = 'Edit estimates of 1st Day';
$lang->project->fixFirst = 'Edit Estimates of 1st Day';
$lang->project->team = 'Team Member';
$lang->project->doc = 'Doc';
$lang->project->doclib = 'Doc Library';
@@ -179,11 +135,7 @@ $lang->project->delete = "Delete";
$lang->project->browse = "Browse";
$lang->project->edit = "Edit";
$lang->project->batchEdit = "Batch Edit";
<<<<<<< HEAD
$lang->project->manageMembers = 'Manange Team';
=======
$lang->project->manageMembers = 'Manage Team';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->project->unlinkMember = 'Unlink Member';
$lang->project->unlinkStory = 'Unlink Story';
$lang->project->batchUnlinkStory = 'Batch Unlink Story';
@@ -191,30 +143,30 @@ $lang->project->importTask = 'Import Task';
$lang->project->importPlanStories = 'Link Story From Plan';
$lang->project->importBug = 'Import Bug';
$lang->project->updateOrder = 'Sort';
$lang->project->tree = 'Tree';
$lang->project->tree = 'Topology Diagram';
$lang->project->treeTask = 'Show Task';
$lang->project->treeStory = 'Show Story';
$lang->project->treeOnlyTask = 'Tree View Show Task';
$lang->project->treeOnlyStory = 'Tree View Show Story';
$lang->project->treeOnlyTask = 'Task Only';
$lang->project->treeOnlyStory = 'Story Only';
$lang->project->storyKanban = 'Story Kanban';
$lang->project->storySort = 'Sort Story';
$lang->project->importPlanStory = '' . $lang->projectCommon . ' is created!\nDo you want to import stories linked to the plan?';
$lang->project->importPlanStory = '' . $lang->projectCommon . ' is created!\nDo you want to import stories that have been linked to the plan?';
$lang->project->iteration = 'Iteration';
$lang->project->iterationInfo = '%s Iterations';
$lang->project->viewAll = 'View All';
/* 分组浏览。*/
$lang->project->allTasks = 'All';
$lang->project->assignedToMe = 'Mine';
$lang->project->assignedToMe = 'My';
$lang->project->myInvolved = 'Involved';
$lang->project->statusSelects[''] = 'More';
$lang->project->statusSelects['wait'] = 'Wait';
$lang->project->statusSelects['wait'] = 'Pending';
$lang->project->statusSelects['doing'] = 'Doing';
$lang->project->statusSelects['finishedbyme'] = 'FinishedByMe';
$lang->project->statusSelects['done'] = 'Done';
$lang->project->statusSelects['closed'] = 'Closed';
$lang->project->statusSelects['cancel'] : = 'Canceled';
$lang->project->statusSelects['cancel'] = 'Canceled';
$lang->project->groups[''] = 'Group';
$lang->project->groups['story'] = 'By Story';
@@ -229,7 +181,7 @@ $lang->project->groupFilter['story']['all'] = $lang->project->all;
$lang->project->groupFilter['story']['linked'] = 'LinkedtoStory Task';
$lang->project->groupFilter['pri']['all'] = $lang->project->all;
$lang->project->groupFilter['pri']['noset'] = 'Not set';
$lang->project->groupFilter['assignedTo']['undone'] = 'Unfinished';
$lang->project->groupFilter['assignedTo']['undone'] = 'Uncompleted';
$lang->project->groupFilter['assignedTo']['all'] = $lang->project->all;
$lang->project->byQuery = 'Search';
@@ -240,74 +192,34 @@ $lang->project->aboveAllProduct = "All the above {$lang->productCommon}";
$lang->project->aboveAllProject = "All the above {$lang->projectCommon}";
/* 页面提示。*/
<<<<<<< HEAD
<<<<<<< HEAD
$lang->project->selectProject = "Select {$lang->projectCommon}";
$lang->project->beginAndEnd = 'Duration';
$lang->project->begin = 'Begin';
$lang->project->end = 'End';
$lang->project->lblStats = 'Man-Hour Summary(h) : ';
$lang->project->stats = '<strong>%s</strong> Available, <strong>%s</strong> Total Estimates, <strong>%s</strong> Cost, <strong>%s</strong> Left.';
$lang->project->taskSummary = "Tasks on this page : <strong>%s</strong> Total, <strong>%s</strong> Wait, <strong>%s</strong> Doing; &nbsp;&nbsp;&nbsp; Hours : <strong>%s</strong> Est., <strong>%s</strong> Cost, <strong>%s</strong> Left.";
$lang->project->checkedSummary = " <strong>%total%</strong> Checked, <strong>%wait%</strong> Wait, <strong>%doing%</strong> Doing; Hours: <strong>%estimate%</strong> Est., <strong>%consumed%</strong> Cost, <strong>%left%</strong> Left.";
$lang->project->memberHoursAB = "%s has <strong>%s</strong> Hours";
$lang->project->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Working Hours</div><div class="segment-value">%s</div></div></div></div>';
$lang->project->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Tasks</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">Doing</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">Wait</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
$lang->project->timeSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Est.</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">Cost</div><div class="segment-value text-red">%s</div></div><div class="segment"><div class="segment-title">Left</div><div class="segment-value">%s</div></div></div></div>';
$lang->project->groupSummaryAB = "<div>Tasks <strong>%s :</strong><span class='text-muted'>Wait</span> %s &nbsp; <span class='text-muted'>Doing</span> %s</div><div>Est. <strong>%s :</strong><span class='text-muted'>Cost</span> %s &nbsp; <span class='text-muted'>Left</span> %s</div>";
$lang->project->wbs = "Work Breakdown";
$lang->project->batchWBS = "Batch Work Breakdown";
$lang->project->howToUpdateBurn = "<a href='https://www.zentao.pm/book/zentaomanual/free-open-source-project-management-software-updateburndowncharts-98.html' target='_blank' title='How to Update the Burndown Chart?' class='btn btn-link'>Help <i class='icon icon-help'></i></a>";
$lang->project->whyNoStories = "No Story can be linked. Please check whether there is Story in {$lang->projectCommon} linked {$lang->productCommon} and make sure it has been reviewed.";
$lang->project->productStories = "{$lang->projectCommon} linked story is the subeset of {$lang->productCommon}, which can only be linked after review. Please <a href='%s'> Link Story</a>。";
$lang->project->haveDraft = "There are %s draft stories that cannot be linked.";
$lang->project->doneProjects = 'Done';
$lang->project->selectDept = 'Select Department';
$lang->project->selectDeptTitle = 'Select Department';
$lang->project->copyTeam = 'Copy Team';
$lang->project->copyFromTeam = "Copy from {$lang->projectCommon} Team: <strong>%s</strong>";
$lang->project->noMatched = "No $lang->projectCommon including '%s'can be found.";
$lang->project->copyTitle = "Choose a {$lang->projectCommon} to copy.";
$lang->project->copyTeamTitle = "Choose {$lang->projectCommon}Team to copy.";
$lang->project->copyNoProject = "No {$lang->projectCommon} can be copied.";
$lang->project->copyFromProject = "Copy from {$lang->projectCommon} <strong>%s</strong>";
$lang->project->cancelCopy = 'Cancel Copy';
$lang->project->byPeriod = 'By Time';
$lang->project->byUser = 'By User';
$lang->project->noProject = 'No projects. ';
$lang->project->noMembers = 'No members. ';
=======
$lang->project->linkStoryByPlanTips = 'It will link all stories in this plan to the project.';
=======
$lang->project->linkStoryByPlanTips = "It will link all stories in this plan to the {$lang->projectCommon}.";
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->linkStoryByPlanTips = "This action will link all stories in this plan to the {$lang->projectCommon}.";
$lang->project->selectProject = "Select {$lang->projectCommon}";
$lang->project->beginAndEnd = 'Duration';
$lang->project->begin = 'Begin';
$lang->project->end = 'End';
$lang->project->lblStats = 'Total Effort(h) : ';
$lang->project->stats = '<strong>%s</strong> Available, <strong>%s</strong> Total Estimates, <strong>%s</strong> Cost, <strong>%s</strong> Left.';
$lang->project->taskSummary = "Tasks on this page : <strong>%s</strong> Total, <strong>%s</strong> Wait, <strong>%s</strong> Doing; &nbsp;&nbsp;&nbsp; Hours : <strong>%s</strong> Est., <strong>%s</strong> Cost, <strong>%s</strong> Left.";
$lang->project->checkedSummary = " <strong>%total%</strong> Checked, <strong>%wait%</strong> Wait, <strong>%doing%</strong> Doing; Hours: <strong>%estimate%</strong> Est., <strong>%consumed%</strong> Cost, <strong>%left%</strong> Left.";
$lang->project->memberHoursAB = "%s has <strong>%s</strong> Hours";
$lang->project->lblStats = 'Total Man-hour(h) : ';
$lang->project->stats = '<strong>%s</strong> Available, <strong>%s</strong> Estimates, <strong>%s</strong> Cost, <strong>%s</strong> Left.';
$lang->project->taskSummary = "Tasks on this page : <strong>%s</strong> Total, <strong>%s</strong> Wait, <strong>%s</strong> Doing; &nbsp;&nbsp;&nbsp; Hours : <strong>%s</strong> Estimates, <strong>%s</strong> Cost, <strong>%s</strong> Left.";
$lang->project->checkedSummary = " <strong>%total%</strong> Checked, <strong>%wait%</strong> Wait, <strong>%doing%</strong> Doing; Hours: <strong>%estimate%</strong> Estimates, <strong>%consumed%</strong> Cost, <strong>%left%</strong> Left.";
$lang->project->memberHoursAB = "%s has <strong>%s</strong> hours";
$lang->project->memberHours = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">%s Working Hours</div><div class="segment-value">%s</div></div></div></div>';
$lang->project->countSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Tasks</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">Doing</div><div class="segment-value"><span class="label label-dot label-primary"></span> %s</div></div><div class="segment"><div class="segment-title">Wait</div><div class="segment-value"><span class="label label-dot label-primary muted"></span> %s</div></div></div></div>';
$lang->project->timeSummary = '<div class="table-col"><div class="clearfix segments"><div class="segment"><div class="segment-title">Est.</div><div class="segment-value">%s</div></div><div class="segment"><div class="segment-title">Cost</div><div class="segment-value text-red">%s</div></div><div class="segment"><div class="segment-title">Left</div><div class="segment-value">%s</div></div></div></div>';
$lang->project->groupSummaryAB = "<div>Tasks <strong>%s :</strong><span class='text-muted'>Wait</span> %s &nbsp; <span class='text-muted'>Doing</span> %s</div><div>Est. <strong>%s :</strong><span class='text-muted'>Cost</span> %s &nbsp; <span class='text-muted'>Left</span> %s</div>";
$lang->project->groupSummaryAB = "<div>Tasks <strong>%s :</strong><span class='text-muted'>Wait</span> %s &nbsp; <span class='text-muted'>Doing</span> %s</div><div>Estimates <strong>%s :</strong><span class='text-muted'>Cost</span> %s &nbsp; <span class='text-muted'>Left</span> %s</div>";
$lang->project->wbs = "Decompose Task";
$lang->project->batchWBS = "Batch Decompose";
$lang->project->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='How to Update the Burndown Chart?' class='btn btn-link'>Help <i class='icon icon-help'></i></a>";
$lang->project->whyNoStories = "No Story can be linked. Please check whether there is Story in {$lang->projectCommon} linked {$lang->productCommon} and make sure it has been reviewed.";
$lang->project->productStories = "{$lang->projectCommon} linked story is the subeset of {$lang->productCommon}, which can only be linked after review. Please <a href='%s'> Link Story</a>。";
$lang->project->haveDraft = "There are %s draft stories can't be linked.";
$lang->project->howToUpdateBurn = "<a href='https://api.zentao.pm/goto.php?item=burndown' target='_blank' title='How to update the Burndown Chart?' class='btn btn-link'>Help <i class='icon icon-help'></i></a>";
$lang->project->whyNoStories = "No Story can be linked. Please check whether there is any story in {$lang->projectCommon} which is linked to {$lang->productCommon} and make sure it has been reviewed.";
$lang->project->productStories = "Stories linked to {$lang->projectCommon} are the subeset of stories linked to {$lang->productCommon}. Stories can only be linked after they pass the review. <a href='%s'> Link Story</a> now.";
$lang->project->haveDraft = "%s stories in draft, so they can't be linked.";
$lang->project->doneProjects = 'Done';
$lang->project->selectDept = 'Department';
$lang->project->selectDeptTitle = 'Department';
$lang->project->selectDept = 'Select Department';
$lang->project->selectDeptTitle = 'Select User';
$lang->project->copyTeam = 'Copy Team';
$lang->project->copyFromTeam = "Copy from {$lang->projectCommon} Team: <strong>%s</strong>";
$lang->project->noMatched = "No $lang->projectCommon including '%s'can be found.";
$lang->project->copyTitle = "Choose a {$lang->projectCommon} to copy.";
$lang->project->copyTeamTitle = "Choose {$lang->projectCommon}Team to copy.";
$lang->project->copyTeamTitle = "Choose a {$lang->projectCommon}Team to copy.";
$lang->project->copyNoProject = "No {$lang->projectCommon} can be copied.";
$lang->project->copyFromProject = "Copy from {$lang->projectCommon} <strong>%s</strong>";
$lang->project->cancelCopy = 'Cancel Copy';
@@ -315,14 +227,13 @@ $lang->project->byPeriod = 'By Time';
$lang->project->byUser = 'By User';
$lang->project->noProject = "No {$lang->projectCommon}. ";
$lang->project->noMembers = 'No members. ';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
/* 交互提示。*/
$lang->project->confirmDelete = "Do you want to delete {$lang->projectCommon}[%s]?";
$lang->project->confirmDelete = "Do you want to delete the {$lang->projectCommon}[%s]?";
$lang->project->confirmUnlinkMember = "Do you want to unlink this User from {$lang->projectCommon}?";
$lang->project->confirmUnlinkStory = "Do you want to unlink this Story from {$lang->projectCommon}?";
$lang->project->errorNoLinkedProducts = "No linked {$lang->productCommon} found in {$lang->projectCommon}. You will be directed to {$lang->productCommon}linked page.";
$lang->project->errorSameProducts = "{$lang->projectCommon} cannot be linked with multiple identical {$lang->productCommon}。";
$lang->project->errorNoLinkedProducts = "No {$lang->productCommon} is linked to {$lang->projectCommon}. You will be directed to {$lang->productCommon} page to link one.";
$lang->project->errorSameProducts = "{$lang->projectCommon} cannot be linked to the same {$lang->productCommon} twice.";
$lang->project->accessDenied = "Your access to {$lang->projectCommon} is denied!";
$lang->project->tips = 'Note';
$lang->project->afterInfo = "{$lang->projectCommon} is created. Next you can ";
@@ -333,18 +244,18 @@ $lang->project->goback = "Go Back";
$lang->project->noweekend = 'excl. Weekend';
$lang->project->withweekend = 'incl. Weekend';
$lang->project->interval = 'Intervals';
$lang->project->fixFirstWithLeft = 'Modify the left';
$lang->project->fixFirstWithLeft = 'Modify Man-hour left';
$lang->project->action = new stdclass();
$lang->project->action->opened = '$date, created by <strong>$actor</strong> .' . "\n";
$lang->project->action->managed = '$date, managed by <strong>$actor</strong> .' . "\n";
$lang->project->action->extra = 'The related products are %s.';
$lang->project->action->extra = 'The linked products are %s.';
/* 统计。*/
$lang->project->charts = new stdclass();
$lang->project->charts->burn = new stdclass();
$lang->project->charts->burn->graph = new stdclass();
$lang->project->charts->burn->graph->caption = "Burndown";
$lang->project->charts->burn->graph->caption = "Burndown Chart";
$lang->project->charts->burn->graph->xAxisName = "Date";
$lang->project->charts->burn->graph->yAxisName = "Hour";
$lang->project->charts->burn->graph->baseFontSize = 12;
@@ -356,13 +267,8 @@ $lang->project->charts->burn->graph->reference = 'Ideal';
$lang->project->charts->burn->graph->actuality = 'Actual';
$lang->project->placeholder = new stdclass();
<<<<<<< HEAD
$lang->project->placeholder->code = 'Alias of project name';
$lang->project->placeholder->totalLeft = 'Estimates at the beginning of the Project.';
=======
$lang->project->placeholder->code = "Abbreviation of {$lang->projectCommon} name";
$lang->project->placeholder->totalLeft = "Estimates at the beginning of the {$lang->projectCommon}.";
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
$lang->project->selectGroup = new stdclass();
$lang->project->selectGroup->done = '(Done)';
@@ -375,17 +281,17 @@ $lang->project->orderList['stage_asc'] = "Stage Ascending";
$lang->project->orderList['stage_desc'] = "Stage Descending";
$lang->project->kanban = "Kanban";
$lang->project->kanbanSetting = "Kanban Setting";
$lang->project->resetKanban = "Reset Setting";
$lang->project->kanbanSetting = "Kanban Settings";
$lang->project->resetKanban = "Reset Settings";
$lang->project->printKanban = "Print Kanban";
$lang->project->bugList = "Bugs";
$lang->project->kanbanHideCols = 'Hide closed and canceled columns in Kanban';
$lang->project->kanbanHideCols = 'Hide closed and cancelled columns in Kanban';
$lang->project->kanbanShowOption = 'Unfold';
$lang->project->kanbanColsColor = 'Custom column color';
$lang->kanbanSetting = new stdclass();
$lang->kanbanSetting->noticeReset = 'Do you want to restore the default settings of Kanban?';
$lang->kanbanSetting->noticeReset = 'Do you want to reset Kanban?';
$lang->kanbanSetting->optionList['0'] = 'Hide';
$lang->kanbanSetting->optionList['1'] = 'Show';
+1 -1
View File
@@ -610,7 +610,7 @@ class projectModel extends model
$tasks = $this->dao->select('id,estStarted,deadline,status')->from(TABLE_TASK)
->where('deadline')->ne('0000-00-00')
->andWhere('status')->in('wait,doing')
->andWhere('project')->eq($project->id)
->andWhere('project')->eq($projectID)
->fetchAll();
foreach($tasks as $task)
{
+4 -1
View File
@@ -134,7 +134,10 @@
</tr>
<tr>
<th><?php echo $lang->project->desc;?></th>
<td colspan='3'><?php echo html::textarea('desc', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
<td colspan='3'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=project&link=desc');?>
<?php echo html::textarea('desc', '', "rows='6' class='form-control kindeditor' hidefocus='true'");?>
</td>
</tr>
<tr>
<th><?php echo $lang->project->acl;?></th>
+2
View File
@@ -11,6 +11,7 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/kindeditor.html.php';?>
<div id='mainContent' class="main-row">
<div class="col-8 main-col">
<div class="row">
@@ -141,6 +142,7 @@
</div>
<div class="col-sm-12">
<?php $blockHistory = true;?>
<?php $actionFormLink = $this->createLink('action', 'comment', "objectType=project&objectID=$project->id");?>
<?php include '../../common/view/action.html.php';?>
</div>
</div>
+4 -3
View File
@@ -136,10 +136,11 @@ class release extends control
$release = $this->release->getById((int)$releaseID, true);
if(!$release) die(js::error($this->lang->notFound) . js::locate('back'));
$stories = $this->dao->select('*')->from(TABLE_STORY)->where('id')->in($release->stories)->andWhere('deleted')->eq(0)
->beginIF($type == 'story')->orderBy($orderBy)->fi()
->fetchAll('id');
->beginIF($type == 'story')->orderBy($orderBy)->fi()
->fetchAll('id');
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story');
$stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->in($release->stories)->andWhere('branch')->eq($release->branch)->fetchPairs('story', 'stage');
foreach($stages as $storyID => $stage)$stories[$storyID]->stage = $stage;
+5 -9
View File
@@ -11,17 +11,17 @@
*/
$lang->release->common = 'Release';
$lang->release->create = "Create Release";
$lang->release->edit = "Edit";
$lang->release->edit = "Edit Release";
$lang->release->linkStory = "Link Story";
$lang->release->linkBug = "Link Bug";
$lang->release->delete = "Delete";
$lang->release->delete = "Delete Release";
$lang->release->deleted = 'Deleted';
$lang->release->view = "Overview";
$lang->release->browse = "Release";
$lang->release->changeStatus = "Change Status";
$lang->release->batchUnlink = "Batch Unlink";
$lang->release->batchUnlinkStory = "Batch Unlink Story";
$lang->release->batchUnlinkBug = "Batch Unlink";
$lang->release->batchUnlinkBug = "Batch Unlink Bug";
$lang->release->confirmDelete = "Do you want to delete this Release?";
$lang->release->confirmUnlinkStory = "Do you want to remove this Story?";
@@ -48,7 +48,7 @@ $lang->release->bugs = 'Resolved Bug';
$lang->release->leftBugs = 'Remained Bug';
$lang->release->generatedBugs = 'Remained Bug';
$lang->release->finishStories = 'Finished %s Story';
$lang->release->resolvedBugs = 'Resolved %s Bug';
$lang->release->resolvedBugs = 'Solved %s Bug';
$lang->release->createdBugs = 'Generated %s Bug';
$lang->release->export = 'Export as HTML';
$lang->release->yesterday = 'Released Yesterday';
@@ -59,7 +59,7 @@ $lang->release->scmPath = 'SCM Path : ';
$lang->release->exportTypeList['all'] = 'All';
$lang->release->exportTypeList['story'] = 'Story';
$lang->release->exportTypeList['bug'] = 'Bug';
$lang->release->exportTypeList['leftbug'] = 'Unresolved Bug';
$lang->release->exportTypeList['leftbug'] = 'Unsolved Bug';
$lang->release->statusList[''] = '';
$lang->release->statusList['normal'] = 'Normal';
@@ -69,8 +69,4 @@ $lang->release->changeStatusList['normal'] = 'Activate';
$lang->release->changeStatusList['terminate'] = 'Terminate';
$lang->release->action = new stdclass();
<<<<<<< HEAD
$lang->release->action->changestatus = array('main' => '$date, by <strong>$actor</strong> $extra。', 'extra' => 'changeStatusList');
=======
$lang->release->action->changestatus = array('main' => '$date, $extra by <strong>$actor</strong>', 'extra' => 'changeStatusList');
>>>>>>> 58a5ce3d921a17cce37484db7696956508f5d454
+6 -6
View File
@@ -11,7 +11,7 @@
*/
$lang->report->common = 'Report';
$lang->report->index = 'Home';
$lang->report->list = 'Report List';
$lang->report->list = 'Report';
$lang->report->item = 'Item';
$lang->report->value = 'Value';
$lang->report->percent = '%';
@@ -31,7 +31,7 @@ $lang->report->colors[] = '008ED6';
$lang->report->colors[] = '9D080D';
$lang->report->colors[] = 'A186BE';
$lang->report->assign['noassign'] = 'Not assigned';
$lang->report->assign['noassign'] = 'Unassigned';
$lang->report->assign['assign'] = 'Assigned';
$lang->report->singleColor[] = 'F6BD0F';
@@ -67,12 +67,12 @@ $lang->report->deviationRate = 'Deviation Rate';
$lang->report->total = 'Total';
$lang->report->to = 'to';
$lang->report->taskTotal = "Total Task";
$lang->report->manhourTotal = "Total Hour";
$lang->report->manhourTotal = "Total Man-hour";
$lang->report->validRate = "Valid Rate";
$lang->report->validRateTips = "Solution is fixed/postponed or status is resolved/closed.";
$lang->report->validRateTips = "Solution is Solved/Postponed or status is Solved/Closed.";
$lang->report->unplanned = 'Unplanned';
$lang->report->workday = 'Hour/Day';
$lang->report->diffDays = 'Man-Day';
$lang->report->workday = 'hour/day';
$lang->report->diffDays = 'day';
$lang->report->typeList['default'] = 'Default';
$lang->report->typeList['pie'] = 'Pie';
+44 -44
View File
@@ -4,11 +4,11 @@ $lang->score->record = 'Point Record';
$lang->score->current = 'Current Point';
$lang->score->level = 'Level Point';
$lang->score->reset = 'Reset';
$lang->score->tips = 'Yesterday added: <strong>%d</strong><br/> Total: <strong>%d</strong>';
$lang->score->tips = 'Added yesterday: <strong>%d</strong><br/> Total: <strong>%d</strong>';
$lang->score->resetTips = 'It will take a while. <strong>Do not close the window.</strong>';
$lang->score->resetStart = 'Start';
$lang->score->resetLoading = 'Processing: ';
$lang->score->resetFinish = 'Finished';
$lang->score->resetFinish = 'Completed';
$lang->score->id = 'ID';
$lang->score->userID = 'UserID';
@@ -32,8 +32,8 @@ $lang->score->modules['doc'] = 'Doc';
$lang->score->modules['todo'] = 'Todo';
$lang->score->modules['story'] = 'Story';
$lang->score->modules['bug'] = 'Bug';
$lang->score->modules['testcase'] = 'TestCase';
$lang->score->modules['testtask'] = 'TestTask';
$lang->score->modules['testcase'] = 'Test Case';
$lang->score->modules['testtask'] = 'Test';
$lang->score->modules['build'] = 'Build';
$lang->score->modules['project'] = 'Project';
$lang->score->modules['productplan'] = 'Plan';
@@ -41,48 +41,48 @@ $lang->score->modules['release'] = 'Release';
$lang->score->modules['block'] = 'Block';
$lang->score->modules['search'] = 'Search';
$lang->score->methods['task']['create'] = 'Create task';
$lang->score->methods['task']['close'] = 'Close task';
$lang->score->methods['task']['finish'] = 'Finish task';
$lang->score->methods['tutorial']['finish'] = 'Finish tutorial';
$lang->score->methods['task']['create'] = 'Create Task';
$lang->score->methods['task']['close'] = 'Close Task';
$lang->score->methods['task']['finish'] = 'Complete Task';
$lang->score->methods['tutorial']['finish'] = 'Complete Tutorial';
$lang->score->methods['user']['login'] = 'Login';
$lang->score->methods['user']['changePassword'] = 'Change password';
$lang->score->methods['user']['editProfile'] = 'Edit profile';
$lang->score->methods['ajax']['selectTheme'] = 'Change theme';
$lang->score->methods['ajax']['selectLang'] = 'Change lang';
$lang->score->methods['ajax']['showSearchMenu'] = 'Advanced search';
$lang->score->methods['ajax']['customMenu'] = 'Custom menu';
$lang->score->methods['ajax']['dragSelected'] = 'Drag selected';
$lang->score->methods['ajax']['lastNext'] = 'Page turned';
$lang->score->methods['ajax']['switchToDataTable'] = 'Switch dataTable';
$lang->score->methods['ajax']['submitPage'] = 'Change page number';
$lang->score->methods['ajax']['quickJump'] = 'Quick jump';
$lang->score->methods['ajax']['batchCreate'] = 'Batch create';
$lang->score->methods['ajax']['batchEdit'] = 'Batch update';
$lang->score->methods['ajax']['batchOther'] = 'Batch other';
$lang->score->methods['doc']['create'] = 'Create doc';
$lang->score->methods['todo']['create'] = 'Create todo';
$lang->score->methods['story']['create'] = 'Create story';
$lang->score->methods['story']['close'] = 'Close story';
$lang->score->methods['bug']['create'] = 'Create bug';
$lang->score->methods['bug']['confirmBug'] = 'Confirm bug';
$lang->score->methods['bug']['createFormCase'] = 'Create bug form case';
$lang->score->methods['bug']['resolve'] = 'Resolve bug';
$lang->score->methods['bug']['saveTplModal'] = 'Bug save template';
$lang->score->methods['testtask']['runCase'] = 'Run test case';
$lang->score->methods['testcase']['create'] = 'Create test case';
$lang->score->methods['build']['create'] = 'Create build';
$lang->score->methods['project']['create'] = 'Create project';
$lang->score->methods['project']['close'] = 'Project finish';
$lang->score->methods['productplan']['create'] = 'Create plan';
$lang->score->methods['release']['create'] = 'Create release';
$lang->score->methods['block']['set'] = 'Custom block';
$lang->score->methods['search']['saveQuery'] = 'Save search query';
$lang->score->methods['search']['saveQueryAdvanced'] = 'Advanced search';
$lang->score->methods['user']['changePassword'] = 'Change Password';
$lang->score->methods['user']['editProfile'] = 'Edit Profile';
$lang->score->methods['ajax']['selectTheme'] = 'Change Theme';
$lang->score->methods['ajax']['selectLang'] = 'Change Language';
$lang->score->methods['ajax']['showSearchMenu'] = 'Advanced Search';
$lang->score->methods['ajax']['customMenu'] = 'Custom Menu';
$lang->score->methods['ajax']['dragSelected'] = 'Drag on List Page';
$lang->score->methods['ajax']['lastNext'] = 'Next Page Shortcut';
$lang->score->methods['ajax']['switchToDataTable'] = 'Switch Data Table';
$lang->score->methods['ajax']['submitPage'] = 'Change Paging Number';
$lang->score->methods['ajax']['quickJump'] = 'Quick Jump';
$lang->score->methods['ajax']['batchCreate'] = 'First Batch Create';
$lang->score->methods['ajax']['batchEdit'] = 'First Batch Edit';
$lang->score->methods['ajax']['batchOther'] = 'Other Batch Action';
$lang->score->methods['doc']['create'] = 'Create Doc';
$lang->score->methods['todo']['create'] = 'Create Todo';
$lang->score->methods['story']['create'] = 'Create Story';
$lang->score->methods['story']['close'] = 'Close Story';
$lang->score->methods['bug']['create'] = 'Create Bug';
$lang->score->methods['bug']['confirmBug'] = 'Confirm Bug';
$lang->score->methods['bug']['createFormCase'] = 'Create Bug form Case';
$lang->score->methods['bug']['resolve'] = 'Solve Bug';
$lang->score->methods['bug']['saveTplModal'] = 'Save Template';
$lang->score->methods['testtask']['runCase'] = 'Run Test Case';
$lang->score->methods['testcase']['create'] = 'Create Test Case';
$lang->score->methods['build']['create'] = 'Create Build';
$lang->score->methods['project']['create'] = 'Create Project';
$lang->score->methods['project']['close'] = 'Complete Project';
$lang->score->methods['productplan']['create'] = 'Create Plan';
$lang->score->methods['release']['create'] = 'Create Release';
$lang->score->methods['block']['set'] = 'Custom Block';
$lang->score->methods['search']['saveQuery'] = 'Save Query';
$lang->score->methods['search']['saveQueryAdvanced'] = 'Advanced Search';
$lang->score->extended['user']['changePassword'] = 'Get ##strength,1## point, if password is medium. Get ##strength,2## points, if it is strong.';
$lang->score->extended['project']['close'] = 'After the project is close, project manager gets ##manager,close## point and team members get ##member,close## points. If it is done on time or earlier, project manager gets ##manager,onTime## point and team members get ##member,onTime## points.';
$lang->score->extended['user']['changePassword'] = 'Get ##strength,1## point, if the password strength is medium. Get ##strength,2## points, if it is strong.';
$lang->score->extended['project']['close'] = 'After the project is close, project manager gets ##manager,close## point and team members get ##member,close## points. If it is done on time or earlier, the project manager gets ##manager,onTime## point and team members get ##member,onTime## points.';
$lang->score->extended['bug']['resolve'] = 'After a bug is resolved, get extra points according to its severity. S1, + ##severity,3##; S2 + ##severity,2##, S3 + ##severity,1##.';
$lang->score->extended['bug']['confirmBug'] = 'After a bug is confirmed, get extra points according to its severity. S1, + ##severity,3##; S2 + ##severity,2##, S3 + ##severity,1##.';
$lang->score->extended['task']['finish'] = 'After a task is done, get extra points by round(man-hour / 10 Estimated / Consumed) + Priority point (p1 ##pri,1##, p2 ##pri,2##).';
$lang->score->extended['task']['finish'] = 'After a task is done, get extra points by round(man-hour / 10 Estimates / Cost) + Priority point (p1 ##pri,1##, p2 ##pri,2##).';
$lang->score->extended['story']['close'] = 'After a story is closed, its creator will get extra ##createID## points.';
+4 -4
View File
@@ -12,7 +12,7 @@
$lang->search->common = 'Search';
$lang->search->reset = 'Reset';
$lang->search->saveQuery = 'Save';
$lang->search->myQuery = 'My Queries';
$lang->search->myQuery = 'My Query';
$lang->search->group1 = 'Group 1';
$lang->search->group2 = 'Group 2';
$lang->search->buildForm = 'Search Form';
@@ -20,10 +20,10 @@ $lang->search->buildQuery = 'Execute Query';
$lang->search->savedQuery = 'Save Query';
$lang->search->deleteQuery = 'Delete Query';
$lang->search->setQueryTitle = 'Enter the query title. Save it After searching.';
$lang->search->select = 'Stories/Tasks Filter';
$lang->search->select = 'Story/Task Filter';
$lang->search->me = 'Me';
$lang->search->noQuery = 'No query saved!';
$lang->search->onMenuBar = 'Show in Menu';
$lang->search->noQuery = 'No query saved yet!';
$lang->search->onMenuBar = 'Show in the Menu';
$lang->search->custom = 'Custom';
$lang->search->account = 'Account';
+15
View File
@@ -0,0 +1,15 @@
<?php
/**
* The control file of setting of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yidong Wang <yidong@cnezsoft.com>
* @package setting
* @version $Id$
* @link http://www.zentao.net
*/
class setting extends control
{
}
+4 -4
View File
@@ -12,9 +12,9 @@
$lang->sso = new stdclass();
$lang->sso->settings = 'Settings';
$lang->sso->turnon = 'On';
$lang->sso->redirect = 'Jump to Zdoo';
$lang->sso->redirect = 'Auto Jump to Zdoo';
$lang->sso->code = 'Alias';
$lang->sso->key = 'Key';
$lang->sso->key = 'Secret Key';
$lang->sso->addr = 'Address';
$lang->sso->bind = 'User Binding';
$lang->sso->addrNotice = 'Example http://www.ranzhi.com/sys/sso-check.html';
@@ -31,9 +31,9 @@ $lang->sso->bindTypeList['add'] = 'Add User';
$lang->sso->help = <<<EOD
<p>1. Zdoo address is required. If use PATH_INFO, it is http://YOUR ZDOO ADDRESS/sys/sso-check.html If GET, it is http://YOUR ZDOO ADDRESS/sys/index.php?m=sso&f=check</p>
<p>2. CAlias and Key must be the same as set in Zdoo.</p>
<p>2. Alias and Secret Key must be the same as set in Zdoo.</p>
EOD;
$lang->sso->bindNotice = 'User that is just added has no privilege. You have to ask ZenTao Admin to grant permissions to the User.';
$lang->sso->bindNotice = 'User that is just added has no permissions. You have to ask ZenTao Admin to grant permissions to the User.';
$lang->sso->bindNoPassword = 'Password should not be empty.';
$lang->sso->bindNoUser = 'Password is wrong/User cannot be found!';
$lang->sso->bindHasAccount = 'This username already exists. Change your username or bind to it.';
+1 -1
View File
@@ -102,7 +102,7 @@ $config->story->datatable->fieldList['estimate']['required'] = 'no';
$config->story->datatable->fieldList['stage']['title'] = 'stageAB';
$config->story->datatable->fieldList['stage']['fixed'] = 'no';
$config->story->datatable->fieldList['stage']['width'] = '80';
$config->story->datatable->fieldList['stage']['width'] = '95';
$config->story->datatable->fieldList['stage']['required'] = 'no';
$config->story->datatable->fieldList['openedBy']['title'] = 'openedByAB';
+2 -1
View File
@@ -1453,7 +1453,8 @@ class story extends control
}
else
{
$stmt = $this->dbh->query($this->session->storyQueryCondition . ($this->post->exportType == 'selected' ? " AND t1.id IN({$this->cookie->checkedItem})" : '') . " ORDER BY " . strtr($orderBy, '_', ' '));
$field = $projectID ? 't2.id' : 't1.id';
$stmt = $this->dbh->query($this->session->storyQueryCondition . ($this->post->exportType == 'selected' ? " AND $field IN({$this->cookie->checkedItem})" : '') . " ORDER BY " . strtr($orderBy, '_', ' '));
while($row = $stmt->fetch()) $stories[$row->id] = $row;
}
+3
View File
@@ -5,4 +5,7 @@ $(function()
link = createLink('story', 'create', 'productID=' + productID + "&branch=" + branch + '&moduleID=' + moduleID);
$('#modulemenu ul.nav li.right:first').before("<li class='right'><a href='" + link + "'><i class='icon-story-create icon-plus'></i> " + createStory + "</a></li>");
}
/* Add for task #5385. */
if(config.onlybody == 'yes') $('.main-actions').css('width', '100%')
});
+1 -1
View File
@@ -1,6 +1,6 @@
$(function()
{
$('#sourceNote').parent().find('span').remove();
$('#sourceNote').prev('span').remove();
$('#sourceNote').remove();
$('table tbody tr th').addClass('w-70px');
});
+1 -1
View File
@@ -15,7 +15,7 @@ $(function()
if(href.indexOf('browse') >= 0 || href.indexOf('batchCreate') >= 0
|| href.indexOf('create') >= 0 || href.indexOf('delete') >= 0) return true;
if(href.indexOf('activate') >= 0 || href.indexOf('close') >= 0)
if($that.hasClass('iframe'))
{
url = href;
target = '';
+14 -23
View File
@@ -11,7 +11,7 @@
*/
$lang->story->create = "Add Story";
$lang->story->batchCreate = "Batch Add";
$lang->story->change = "Change";
$lang->story->change = "Change Story";
$lang->story->changed = 'Change';
$lang->story->assignTo = 'Assign';
$lang->story->review = 'Review';
@@ -36,22 +36,16 @@ $lang->story->bugCountAB = 'B';
$lang->story->caseCountAB = 'C';
$lang->story->linkStory = 'Link';
$lang->story->unlinkStory = 'UnLinked';
<<<<<<< HEAD
$lang->story->export = "Export Story";
$lang->story->zeroCase = "Story w/o cases";
$lang->story->zeroTask = "Display story w/o tasks";
=======
$lang->story->export = "Export Data";
$lang->story->zeroCase = "Story w/o case";
$lang->story->zeroTask = "Story w/o task";
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->story->reportChart = "Report";
$lang->story->copyTitle = "Copy Title";
$lang->story->batchChangePlan = "Batch Change Plans";
$lang->story->batchChangeBranch = "Batch Change Branches";
$lang->story->batchChangeStage = "Batch Change Phases";
$lang->story->batchChangePlan = "Batch Change Plan";
$lang->story->batchChangeBranch = "Batch Change Branch";
$lang->story->batchChangeStage = "Batch Change Phase";
$lang->story->batchAssignTo = "Batch Assign";
$lang->story->batchChangeModule = "Batch Change Modules";
$lang->story->batchChangeModule = "Batch Change Module";
$lang->story->viewAll = "All";
$lang->story->common = 'Story';
@@ -74,13 +68,10 @@ $lang->story->hour = 'Hour';
$lang->story->status = 'Status';
$lang->story->stage = 'Stage';
$lang->story->stageAB = 'Stage';
$lang->story->stagedBy = 'Set By';
$lang->story->mailto = 'Mail to';
$lang->story->openedBy = 'Creator';
<<<<<<< HEAD
$lang->story->openedDate = 'Create';
=======
$lang->story->openedDate = 'Created';
>>>>>>> d3fa148cb3d0ea19eb92b37374b0ec4e2a64ec6f
$lang->story->assignedTo = 'Assignee';
$lang->story->assignedDate = 'Assigned';
$lang->story->lastEditedBy = 'Last Edited';
@@ -111,7 +102,7 @@ $lang->story->unclosed = 'Unclosed';
$lang->story->deleted = 'Deleted';
$lang->story->ditto = 'Ditto';
$lang->story->dittoNotice = 'This Story does not belong to the same Product as the last one does!';
$lang->story->dittoNotice = 'This Story is not linked to the same Product as the last one does!';
$lang->story->useList[0] = 'Yes';
$lang->story->useList[1] = 'No';
@@ -123,7 +114,7 @@ $lang->story->statusList['closed'] = 'Closed';
$lang->story->statusList['changed'] = 'Changed';
$lang->story->stageList[''] = '';
$lang->story->stageList['wait'] = 'Wait';
$lang->story->stageList['wait'] = 'Pending';
$lang->story->stageList['planned'] = 'Planned';
$lang->story->stageList['projected'] = 'Projected';
$lang->story->stageList['developing'] = 'Developing';
@@ -236,8 +227,8 @@ $lang->story->action->unlinkchildstory = array('main' => '$date, unlinked by
$lang->story->report = new stdclass();
$lang->story->report->common = 'Report';
$lang->story->report->select = 'Group by';
$lang->story->report->create = 'Generate';
$lang->story->report->value = 'Count';
$lang->story->report->create = 'Generate Report';
$lang->story->report->value = 'No. of Reports';
$lang->story->report->charts['storysPerProduct'] = 'by ' . $lang->productCommon;
$lang->story->report->charts['storysPerModule'] = 'by Module';
@@ -302,13 +293,13 @@ $lang->story->report->storysPerModule->graph->xAxisName = 'Module';
$lang->story->report->storysPerSource->graph->xAxisName = 'Source';
$lang->story->report->storysPerPlan->graph->xAxisName = 'Plan';
$lang->story->report->storysPerStatus->graph->xAxisName = 'Status';
$lang->story->report->storysPerStage->graph->xAxisName = 'Stage';
$lang->story->report->storysPerStage->graph->xAxisName = 'Phase';
$lang->story->report->storysPerPri->graph->xAxisName = 'Priority';
$lang->story->report->storysPerOpenedBy->graph->xAxisName = 'Created By';
$lang->story->report->storysPerAssignedTo->graph->xAxisName = 'Assigned To';
$lang->story->report->storysPerAssignedTo->graph->xAxisName = 'Assignee';
$lang->story->report->storysPerClosedReason->graph->xAxisName = 'Close Reason';
$lang->story->report->storysPerEstimate->graph->xAxisName = 'Estimates ';
$lang->story->report->storysPerChange->graph->xAxisName = 'Change';
$lang->story->report->storysPerChange->graph->xAxisName = 'Change Times';
$lang->story->placeholder = new stdclass();
$lang->story->placeholder->estimate = $lang->story->hour;
@@ -317,4 +308,4 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = 'Choose Reviewer';
$lang->story->notice = new stdClass();
$lang->story->notice->closed = 'Story that you select are closed!';
$lang->story->notice->closed = 'Story that you select is closed!';
+1
View File
@@ -68,6 +68,7 @@ $lang->story->hour = '小时';
$lang->story->status = '当前状态';
$lang->story->stage = '所处阶段';
$lang->story->stageAB = '阶段';
$lang->story->stagedBy = '设置阶段者';
$lang->story->mailto = '抄送给';
$lang->story->openedBy = '由谁创建';
$lang->story->openedDate = '创建日期';
+1
View File
@@ -68,6 +68,7 @@ $lang->story->hour = '小時';
$lang->story->status = '當前狀態';
$lang->story->stage = '所處階段';
$lang->story->stageAB = '階段';
$lang->story->stagedBy = '設置階段者';
$lang->story->mailto = '抄送給';
$lang->story->openedBy = '由誰創建';
$lang->story->openedDate = '創建日期';
+63 -13
View File
@@ -515,6 +515,7 @@ class storyModel extends model
if(empty($_POST['branch'])) $story->branch = 0;
if(!empty($_POST['stages']))
{
$oldStages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->fetchAll('branch');
$this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->exec();
$stageList = join(',', array_keys($this->lang->story->stageList));
@@ -522,7 +523,17 @@ class storyModel extends model
$minStage = '';
foreach($this->post->stages as $branch => $stage)
{
$this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
$newStage = new stdclass();
$newStage->story = $storyID;
$newStage->branch = $branch;
$newStage->stage = $stage;
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
$newStage->stagedBy = $oldStage->stagedBy;
if($stage != $oldStage->stage) $newStage->stagedBy = (strpos('tested|verified|released|closed', $stage) !== false) ? $this->app->user->account : '';
}
$this->dao->insert(TABLE_STORYSTAGE)->data($newStage)->exec();
if(strpos($stageList, $stage) !== false and strpos($stageList, $stage) < $minStagePos)
{
$minStage = $stage;
@@ -531,6 +542,7 @@ class storyModel extends model
}
$story->stage = $minStage;
}
if($oldStory->stage != $story->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : '';
$this->dao->update(TABLE_STORY)
->data($story)
@@ -585,7 +597,7 @@ class storyModel extends model
foreach($storyIDList as $storyID)
{
if($data->pris[$storyID] == 'ditto') $data->pris[$storyID] = isset($prev['pri']) ? $prev['pri'] : 0;
if($data->branches[$storyID] == 'ditto') $data->branches[$storyID] = isset($prev['branch']) ? $prev['branch'] : 0;
if(isset($data->branches) and $data->branches[$storyID] == 'ditto') $data->branches[$storyID] = isset($prev['branch']) ? $prev['branch'] : 0;
if($data->modules[$storyID] == 'ditto') $data->modules[$storyID] = isset($prev['module']) ? $prev['module'] : 0;
if($data->plans[$storyID] == 'ditto') $data->plans[$storyID] = isset($prev['plan']) ? $prev['plan'] : 0;
if($data->sources[$storyID] == 'ditto') $data->sources[$storyID] = isset($prev['source']) ? $prev['source'] : '';
@@ -628,6 +640,7 @@ class storyModel extends model
$story->duplicateStory = isset($data->duplicateStories[$storyID]) ? $data->duplicateStories[$storyID] : $oldStory->duplicateStory;
$story->childStories = isset($data->childStoriesIDList[$storyID]) ? $data->childStoriesIDList[$storyID] : $oldStory->childStories;
$story->version = $story->title == $oldStory->title ? $oldStory->version : $oldStory->version + 1;
if($story->stage != $oldStory->stage) $story->stagedBy = (strpos('tested|verified|released|closed', $story->stage) !== false) ? $this->app->user->account : '';
if($story->title != $oldStory->title) $story->status = 'changed';
if($story->plan !== false and $story->plan == '') $story->plan = 0;
@@ -854,7 +867,6 @@ class storyModel extends model
->setDefault('assignedDate', $now)
->removeIF($this->post->closedReason != 'duplicate', 'duplicateStory')
->removeIF($this->post->closedReason != 'subdivided', 'childStories')
->setIF($this->post->closedReason == 'done', 'stage', 'released')
->setIF($this->post->closedReason != 'done', 'plan', 0)
->remove('comment')
->get();
@@ -864,7 +876,7 @@ class storyModel extends model
->batchCheck($this->config->story->close->requiredFields, 'notempty')
->checkIF($story->closedReason == 'duplicate', 'duplicateStory', 'notempty')
->where('id')->eq($storyID)->exec();
if(!dao::isError() && $this->post->closedReason == 'done') $this->loadModel('score')->create('story', 'close', $storyID);
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
return common::createChanges($oldStory, $story);
}
@@ -903,7 +915,6 @@ class storyModel extends model
$story->duplicateStory = $data->duplicateStoryIDList[$storyID] ? $data->duplicateStoryIDList[$storyID] : $oldStory->duplicateStory;
$story->childStories = $data->childStoriesIDList[$storyID] ? $data->childStoriesIDList[$storyID] : $oldStory->childStories;
if($story->closedReason == 'done') $story->stage = 'released';
if($story->closedReason != 'done') $story->plan = 0;
$stories[$storyID] = $story;
@@ -929,7 +940,7 @@ class storyModel extends model
{
die(js::error('story#' . $storyID . dao::getError(true)));
}
if(!dao::isError() && $story->stage == 'released') $this->loadModel('score')->create('story', 'close', $storyID);
if(!dao::isError()) $this->loadModel('score')->create('story', 'close', $storyID);
}
return $allChanges;
@@ -1045,6 +1056,7 @@ class storyModel extends model
{
$now = helper::now();
$allChanges = array();
$account = $this->app->user->account;
$oldStories = $this->getByList($storyIDList);
$ignoreStories = '';
foreach($storyIDList as $storyID)
@@ -1057,12 +1069,13 @@ class storyModel extends model
}
$story = new stdclass();
$story->lastEditedBy = $this->app->user->account;
$story->lastEditedBy = $account;
$story->lastEditedDate = $now;
$story->stage = $stage;
$story->stagedBy = $account;
$this->dao->update(TABLE_STORY)->data($story)->autoCheck()->where('id')->eq((int)$storyID)->exec();
$this->dao->update(TABLE_STORYSTAGE)->set('stage')->eq($stage)->where('story')->eq((int)$storyID)->exec();
$this->dao->update(TABLE_STORYSTAGE)->set('stage')->eq($stage)->set('stagedBy')->eq($account)->where('story')->eq((int)$storyID)->exec();
if(!dao::isError()) $allChanges[$storyID] = common::createChanges($oldStory, $story);
}
if($ignoreStories) echo js::alert(sprintf($this->lang->story->ignoreChangeStage, $ignoreStories));
@@ -1165,8 +1178,12 @@ class storyModel extends model
$storyID = (int)$storyID;
/* Get projects which status is doing. */
$oldStages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->fetchAll('branch');
$this->dao->delete()->from(TABLE_STORYSTAGE)->where('story')->eq($storyID)->exec();
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
$story = $this->dao->findById($storyID)->from(TABLE_STORY)->fetch();
if(!empty($story->stagedBy)) return false;
$product = $this->dao->findById($story->product)->from(TABLE_PRODUCT)->fetch();
$projects = $this->dao->select('t1.project,t3.branch')->from(TABLE_PROJECTSTORY)->alias('t1')
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
@@ -1188,7 +1205,19 @@ class storyModel extends model
{
$this->dao->update(TABLE_STORY)->set('stage')->eq('wait')->where('id')->eq($storyID)->andWhere('plan')->eq('')->exec();
foreach($stages as $branch => $stage) $this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
foreach($stages as $branch => $stage)
{
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
if(!empty($oldStage->stagedBy))
{
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
continue;
}
}
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
}
$this->dao->update(TABLE_STORY)->set('stage')->eq('planned')->where('id')->eq($storyID)->andWhere("(plan != '' AND plan != '0')")->exec();
}
@@ -1210,7 +1239,19 @@ class storyModel extends model
/* No tasks, then the stage is projected. */
if(!$tasks and $projects)
{
foreach($stages as $branch => $stage) $this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq('projected')->exec();
foreach($stages as $branch => $stage)
{
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
if(!empty($oldStage->stagedBy))
{
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
continue;
}
}
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq('projected')->exec();
}
$this->dao->update(TABLE_STORY)->set('stage')->eq('projected')->where('id')->eq($storyID)->exec();
}
@@ -1285,7 +1326,16 @@ class storyModel extends model
$minStage = '';
foreach($stages as $branch => $stage)
{
$this->dao->insert(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
$this->dao->replace(TABLE_STORYSTAGE)->set('story')->eq($storyID)->set('branch')->eq($branch)->set('stage')->eq($stage)->exec();
if(isset($oldStages[$branch]))
{
$oldStage = $oldStages[$branch];
if(!empty($oldStage->stagedBy))
{
$this->dao->replace(TABLE_STORYSTAGE)->data($oldStage)->exec();
$stage = $oldStage->$stage;
}
}
if(strpos($stageList, $stage) !== false and strpos($stageList, $stage) < $minStagePos)
{
$minStage = $stage;
@@ -2425,7 +2475,7 @@ class storyModel extends model
echo "<ul class='dropdown-menu pull-right'>";
foreach($storyStages[$story->id] as $storyBranch => $storyStage)
{
echo '<li class="text-ellipsis">' . $branches[$storyBranch] . ": " . $this->lang->story->stageList[$storyStage->stage] . '</li>';
if(isset($branches[$storyBranch])) echo '<li class="text-ellipsis">' . $branches[$storyBranch] . ": " . $this->lang->story->stageList[$storyStage->stage] . '</li>';
}
echo "</ul>";
echo '</div>';
+4 -1
View File
@@ -159,7 +159,10 @@
</tr>
<tr>
<th><?php echo $lang->story->spec;?></th>
<td colspan="4"><?php echo html::textarea('spec', $spec, "rows='9' class='form-control kindeditor disabled-ie-placeholder' hidefocus='true' placeholder='" . htmlspecialchars($lang->story->specTemplate) . "'");?></td>
<td colspan="4">
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=story&link=spec');?>
<?php echo html::textarea('spec', $spec, "rows='9' class='form-control kindeditor disabled-ie-placeholder' hidefocus='true' placeholder='" . htmlspecialchars($lang->story->specTemplate) . "'");?>
</td>
</tr>
<?php if(strpos(",$showFields,", ',verify,') !== false):?>
<tr>

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