Merge remote-tracking branch 'origin/master' into zenops_66
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
./.git
|
||||
./build
|
||||
./Jenkinsfile
|
||||
./Makefile
|
||||
@@ -1,68 +0,0 @@
|
||||
stages:
|
||||
- sonarqube
|
||||
- unit-test
|
||||
- ui-test
|
||||
- package
|
||||
- cleanup-packages
|
||||
- notify
|
||||
|
||||
program-static-analysis:
|
||||
stage: sonarqube
|
||||
image:
|
||||
name: sonarsource/sonar-scanner-cli:latest
|
||||
entrypoint: [""]
|
||||
variables:
|
||||
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
|
||||
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
|
||||
cache:
|
||||
key: "${CI_JOB_NAME}"
|
||||
paths:
|
||||
- .sonar/cache
|
||||
script:
|
||||
- sonar-scanner -Dsonar.inclusions=$(git diff --name-only HEAD~1|tr '\n' ',') -Dsonar.analysis.user=${GITLAB_USER_LOGIN}
|
||||
allow_failure: true
|
||||
only:
|
||||
- master # or the name of your main branch
|
||||
|
||||
unit-test:
|
||||
stage: unit-test
|
||||
script:
|
||||
- "/home/gitlab-runner/bin/zentao-unittest.sh ${CI_PROJECT_DIR}"
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
- merge_requests
|
||||
|
||||
ui-test:
|
||||
stage: ui-test
|
||||
script:
|
||||
- "/home/gitlab-runner/bin/zentao-uitest.sh ${CI_PROJECT_DIR}"
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
- merge_requests
|
||||
|
||||
package:
|
||||
stage: package
|
||||
script:
|
||||
- make cizip
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
|
||||
cleanup-packages:
|
||||
stage: cleanup-packages
|
||||
script:
|
||||
- make clean
|
||||
when: on_failure
|
||||
only:
|
||||
- master
|
||||
|
||||
notify:
|
||||
stage: notify
|
||||
script:
|
||||
- "/home/gitlab-runner/bin/ci-notify.php"
|
||||
when: on_success
|
||||
only:
|
||||
- master
|
||||
- merge_requests
|
||||
@@ -0,0 +1,15 @@
|
||||
FROM hub.qucheng.com/ci/zentao-ztf:latest
|
||||
|
||||
# Install zentao
|
||||
ARG VERSION
|
||||
ENV ZENTAO_VER=${VERSION}
|
||||
ENV EASYSOFT_APP_NAME="ZenTao $ZENTAO_VER"
|
||||
|
||||
ARG MYSQL_HOST
|
||||
ARG MYSQL_PASSWORD
|
||||
ENV MYSQL_HOST=${MYSQL_HOST}
|
||||
ENV MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
# Copy ZenTao
|
||||
COPY --chown=33:33 . /apps/zentao/
|
||||
+300
@@ -0,0 +1,300 @@
|
||||
pipeline {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "build-docker code-scan xuanim mysql-server"
|
||||
}
|
||||
}
|
||||
|
||||
environment {
|
||||
ZENTAO_VERSION = """${sh(
|
||||
returnStdout: true,
|
||||
script: 'cat VERSION'
|
||||
).trim()}"""
|
||||
MYSQL_SERVER_HOST = """${sh(
|
||||
returnStdout: true,
|
||||
script: 'hostname -I'
|
||||
).trim()}"""
|
||||
MYSQL_ROOT_PASSWORD = 'pass4ci'
|
||||
|
||||
MIDDLE_IMAGE_REPO = "hub.qc.oop.cc/zentao-ztf"
|
||||
MIDDLE_IMAGE_TAG = """${sh(
|
||||
returnStdout: true,
|
||||
script: 'echo $BUILD_ID'
|
||||
).trim()}"""
|
||||
}
|
||||
|
||||
stages {
|
||||
stage("checkout code") {
|
||||
steps {
|
||||
echo "checkout code success"
|
||||
}
|
||||
}
|
||||
|
||||
stage('Sonar Scanner') {
|
||||
parallel {
|
||||
stage('SonarQube') {
|
||||
steps {
|
||||
container('sonar') {
|
||||
withSonarQubeEnv('sonarqube') {
|
||||
sh 'git config --global --add safe.directory $(pwd)'
|
||||
sh 'sonar-scanner -Dsonar.inclusions=$(git diff --name-only HEAD~1|tr "\\n" ",") -Dsonar.analysis.user=$(git show -s --format=%an)'
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
success {
|
||||
container('xuanimbot') {
|
||||
sh 'git config --global --add safe.directory $(pwd)'
|
||||
sh '/usr/local/bin/xuanimbot --users "$(git show -s --format=%cn)" --title "sonar scanner" --url "https://sonar.qc.oop.cc/dashboard?id=zentaopms&branch=${GIT_BRANCH}" --content "sonar scanner success" --debug --custom'
|
||||
}
|
||||
}
|
||||
failure {
|
||||
container('xuanimbot') {
|
||||
sh 'git config --global --add safe.directory $(pwd)'
|
||||
sh '/usr/local/bin/xuanimbot --users "$(git show -s --format=%cn)" --title "sonar scanner" --url "https://sonar.qc.oop.cc/dashboard?id=zentaopms&branch=${GIT_BRANCH}" --content "sonar scanner failure" --debug --custom'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Build Image') {
|
||||
steps {
|
||||
container('docker') {
|
||||
sh 'docker build --pull . -f Dockerfile.test --build-arg VERSION=${ZENTAO_VERSION} --build-arg MIRROR=true --build-arg MYSQL_HOST=${MYSQL_SERVER_HOST} --build-arg MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD} -t ${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}'
|
||||
sh 'docker push ${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}'
|
||||
}
|
||||
}
|
||||
post {
|
||||
success {
|
||||
echo 'build image success'
|
||||
}
|
||||
failure {
|
||||
container('xuanimbot') {
|
||||
sh 'git config --global --add safe.directory $(pwd)'
|
||||
sh '/usr/local/bin/xuanimbot --users "$(git show -s --format=%cn)" --title "build image" --url "${RUN_DISPLAY_URL}" --content "Build unit test image failure" --debug --custom'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Unit Test'){
|
||||
stages{
|
||||
stage('Init') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao') {
|
||||
sh 'initdb.php ; /apps/zentao/test/ztest init'
|
||||
}
|
||||
}
|
||||
post {
|
||||
success {
|
||||
sh 'echo "stage unit init success"'
|
||||
}
|
||||
failure {
|
||||
container('xuanimbot') {
|
||||
sh 'git config --global --add safe.directory $(pwd)'
|
||||
sh '/usr/local/bin/xuanimbot --users "$(git show -s --format=%cn)" --title "unittest init" --url "${RUN_DISPLAY_URL}" --content "Unit test database initialization failed" --debug --custom'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Run') {
|
||||
parallel {
|
||||
stage('UnitTest P1') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao1"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao1') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P1 | tee /apps/zentao/test/p1.log'
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p1.log'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('UnitTest P2') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao2"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao2') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P2 | tee /apps/zentao/test/p2.log'
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p2.log'
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
stage('UnitTest P3') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao3"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao3') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P3 | tee /apps/zentao/test/p3.log'
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p3.log'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('UnitTest P4') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao4"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao4') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P4 | tee /apps/zentao/test/p4.log '
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p4.log'
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
stage('UnitTest P5') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao5"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao5') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P5 | tee /apps/zentao/test/p5.log'
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p5.log'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('UnitTest P6') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao6"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao6') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P6 | tee /apps/zentao/test/p6.log'
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p6.log'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('UnitTest P7') {
|
||||
agent {
|
||||
kubernetes {
|
||||
inheritFrom "xuanim"
|
||||
containerTemplate {
|
||||
name "zentao7"
|
||||
image "${MIDDLE_IMAGE_REPO}:${MIDDLE_IMAGE_TAG}"
|
||||
command "sleep"
|
||||
args "99d"
|
||||
}
|
||||
}
|
||||
}
|
||||
options { skipDefaultCheckout() }
|
||||
|
||||
steps {
|
||||
container('zentao7') {
|
||||
sh 'initdb.php config'
|
||||
sh '/apps/zentao/test/ztest extract ; /apps/zentao/test/ztest P7 | tee /apps/zentao/test/p7.log'
|
||||
sh 'pipeline-unittest.sh /apps/zentao/test/p7.log'
|
||||
}
|
||||
}
|
||||
}
|
||||
} // End Parallel
|
||||
}
|
||||
}
|
||||
post{
|
||||
success{
|
||||
container('xuanimbot') {
|
||||
sh 'git config --global --add safe.directory /home/jenkins/agent/workspace/pangu_pangu_xuanimbot_master'
|
||||
sh '/usr/local/bin/xuanimbot --users "$(git show -s --format=%cn)" --title "unittest" --url "${RUN_DISPLAY_URL}" --content "Unit test passed" --debug --custom'
|
||||
}
|
||||
}
|
||||
failure{
|
||||
container('xuanimbot') {
|
||||
sh 'git config --global --add safe.directory $(pwd)'
|
||||
sh '/usr/local/bin/xuanimbot --users "$(git show -s --format=%cn)" --title "unittest" --url "${RUN_DISPLAY_URL}" --content "Unit test failed" --debug --custom'
|
||||
}
|
||||
}
|
||||
}
|
||||
}//End unittest
|
||||
|
||||
} // End Root Stages
|
||||
} // End pipeline
|
||||
@@ -102,10 +102,10 @@ zentaoxx:
|
||||
mkdir zentaoxx/db/
|
||||
cp zentaoxx/db_bak/upgradexuanxuan*.sql zentaoxx/db_bak/xuanxuan.sql zentaoxx/db/
|
||||
rm -rf zentaoxx/db_bak/
|
||||
sed -i "s/\$$accountAdmin = \$$this->dao->select('account, admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();/\$$accountAdmin = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\n\$$accountAdmin->admin = in_array(\$$accountAdmin->account, \$$adminArray) ? 'super' : '';\n/" zentaoxx/extension/xuan/im/model/chat.php
|
||||
sed -i "s/\$$accountAdmin = \$$this->dao->select('account, admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();/\$$accountAdmin = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();\n\$$sysAdmins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$sysAdminArray = explode(',', \$$sysAdmins);\n\$$accountAdmin->admin = in_array(\$$accountAdmin->account, \$$sysAdminArray) ? 'super' : '';\n/" zentaoxx/extension/xuan/im/model/chat.php
|
||||
sed -i "s/\$$sysAdmins = \$$this->dao->select('id')->from(TABLE_USER)->where('admin')->eq('super')->fetchPairs();/\$$account = \$$this->loadModel('user')->getById(\$$userID);\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\nreturn in_array(\$$account, \$$adminArray);\n/" zentaoxx/extension/xuan/im/model/chat.php
|
||||
sed -i "/->on('tc.ownedBy=tu.account')/{ N ; s/type/tc.type/}" zentaoxx/extension/xuan/im/model/chat.php
|
||||
sed -i "s/\$$super = \$$this->dao->select('admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('admin');/\$$account = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('account');\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\n\$$super = in_array(\$$account, \$$adminArray) ? 'super' : '';/g" zentaoxx/extension/xuan/im/control.php
|
||||
sed -i "s/\$$super = \$$this->dao->select('admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('admin');/\$$account = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('account');\n\$$sysAdmins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$sysAdminArray = explode(',', \$$sysAdmins);\n\$$super = in_array(\$$account, \$$sysAdminArray) ? 'super' : '';/g" zentaoxx/extension/xuan/im/control.php
|
||||
sed -i "/foreach(\$$users as \$$user)/i \$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\$$adminArray = explode(',', \$$admins);" zentaoxx/extension/xuan/im/model/user.php
|
||||
sed -i "/if(\!isset(\$$user->signed)) \$$user->signed = 0;/a \$$user->admin = in_array(\$$user->account, \$$adminArray) ? 'super' : '';" zentaoxx/extension/xuan/im/model/user.php
|
||||
sed -i "/updateUser->ping/d" zentaoxx/extension/xuan/im/model/user.php
|
||||
|
||||
@@ -50,7 +50,7 @@ class hostSubmitEntry extends baseEntry
|
||||
{
|
||||
if(in_array($image->status, array('failed', 'completed'))) $image->status = $image->status == 'completed' ? 'restore_completed' : 'restore_failed';
|
||||
}
|
||||
else if($imageInfo->from == 'snapshot' && $imageInfo->status == 'creating')
|
||||
else if($imageInfo->from == 'snapshot')
|
||||
{
|
||||
if($image->status == 'failed')
|
||||
{
|
||||
|
||||
@@ -857,19 +857,6 @@ CREATE TABLE `zt_designspec` (
|
||||
`files` varchar(255) NOT NULL,
|
||||
UNIQUE KEY `design` (`design`,`version`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_dimension` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(90) NOT NULL,
|
||||
`code` varchar(45) 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`),
|
||||
KEY `code` (`code`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_doc` (
|
||||
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`vision` varchar(10) NOT NULL DEFAULT 'rnd',
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@ REPLACE INTO `zt_report` (`code`, `name`, `module`, `sql`, `vars`, `langs`, `par
|
||||
('product-quality', '{\"zh-cn\":\"\\u4ea7\\u54c1\\u8d28\\u91cf\\u8868\",\"zh-tw\":\"\\u7522\\u54c1\\u8cea\\u91cf\\u8868\",\"en\":\"Product Quality\",\"de\":\"Product Quality\",\"fr\":\"Product Quality\"}', ',product', 'select t1.id,t1.name,t2.stories,(t2.stories-t2.undone) as doneStory,t3.bugs,t3.resolutions,round(t3.bugs/(t2.stories-t2.undone),2) as bugthanstory,t3.seriousBugs from TABLE_PRODUCT as t1 \r\nleft join ztv_productstories as t2 on t1.id=t2.product \r\nleft join ztv_productbugs as t3 on t1.id=t3.product \r\nleft join TABLE_PROGRAM as t4 on t1.program=t4.id \r\nwhere t1.deleted=\'0\'\r\norder by t4.`order` asc, t1.line desc, t1.`order` asc', '', '{\"stories\":{\"zh-cn\":\"\\u9700\\u6c42\\u603b\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u603b\\u6570\",\"en\":\"Stories\"},\"doneStory\":{\"zh-cn\":\"\\u5b8c\\u6210\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u5b8c\\u6210\\u9700\\u6c42\\u6570\",\"en\":\"Finished Stories\"},\"bugs\":{\"zh-cn\":\"Bug\\u6570\",\"zh-tw\":\"Bug\\u6570\",\"en\":\"Bugs\"},\"resolutions\":{\"zh-cn\":\"\\u89e3\\u51b3Bug\\u6570\",\"zh-tw\":\"\\u89e3\\u51b3Bug\\u6570\",\"en\":\"Solved Bugs\"},\"bugthanstory\":{\"zh-cn\":\"Bug\\/\\u5b8c\\u6210\\u9700\\u6c42\",\"zh-tw\":\"Bug\\/\\u5b8c\\u6210\\u9700\\u6c42\",\"en\":\"Bug\\/Finished Story\"},\"seriousBugs\":{\"zh-cn\":\"\\u91cd\\u8981Bug\\u6570\",\"zh-tw\":\"\\u91cd\\u8981Bug\\u6570\",\"en\":\"Serious Bugs\"},\"seriousBugsPercent\":{\"zh-cn\":\"\\u4e25\\u91cdbug\\u6bd4\\u7387\",\"zh-tw\":\"\\u4e25\\u91cdbug\\u6bd4\\u7387\",\"en\":\"Serious Bugs %\"}}', '{\"group1\":\"name\",\"group2\":\"\",\"reportField\":[\"stories\",\"doneStory\",\"bugs\",\"resolutions\",\"bugthanstory\",\"seriousBugs\"],\"reportType\":[\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\"],\"sumAppend\":[\"stories\",\"doneStory\",\"bugs\",\"resolutions\",\"bugthanstory\",\"seriousBugs\"],\"percent\":{\"5\":\"1\"},\"contrast\":{\"5\":\"bugs\"},\"showAlone\":{\"5\":\"1\"}}', 2, '{\"zh-cn\":\"\\u5217\\u51fa\\u4ea7\\u54c1\\u7684\\u9700\\u6c42\\u6570\\uff0c\\u5b8c\\u6210\\u7684\\u9700\\u6c42\\u603b\\u6570\\uff0cBug\\u6570\\uff0c\\u89e3\\u51b3\\u7684Bug\\u603b\\u6570\\uff0cBug\\/\\u9700\\u6c42\\uff0c\\u91cd\\u8981Bug\\u6570\\u91cf(\\u4e25\\u91cd\\u7a0b\\u5ea6\\u4e0d\\u5927\\u4e8e3)\\u3002\",\"zh-tw\":\"\\u5217\\u51fa\\u7522\\u54c1\\u7684\\u9700\\u6c42\\u6578\\uff0c\\u5b8c\\u6210\\u7684\\u9700\\u6c42\\u7e3d\\u6578\\uff0cBug\\u6578\\uff0c\\u89e3\\u6c7a\\u7684Bug\\u7e3d\\u6578\\uff0cBug\\/\\u9700\\u6c42\\uff0c\\u91cd\\u8981Bug\\u6578\\u91cf(\\u56b4\\u91cd\\u7a0b\\u5ea6\\u4e0d\\u5927\\u65bc3)\\u3002\",\"en\":\"Serious Bug (severity is less than 3).\",\"de\":\"Serious Bug (severity is less than 3).\",\"fr\":\"Serious Bug (severity is less than 3).\"}', 'admin', '2015-07-23 17:17:40'),
|
||||
('user-login', '{\"zh-cn\":\"\\u5458\\u5de5\\u767b\\u5f55\\u6b21\\u6570\\u7edf\\u8ba1\\u8868\",\"zh-tw\":\"\\u54e1\\u5de5\\u767b\\u9304\\u6b21\\u6578\\u7d71\\u8a08\\u8868\",\"en\":\"Login Times\",\"de\":\"Login Times\",\"fr\":\"Login Times\"}', ',staff', 'select actor,LEFT(`date`,10) as `day` from TABLE_ACTION where `action`=\'login\' and if($startDate=\'\',1,`date`>=$startDate) and if($endDate=\'\',1,`date`<=$endDate) order by `date` asc, actor asc', '{\"varName\":[\"startDate\",\"endDate\"],\"showName\":[\"\\u8d77\\u59cb\\u65f6\\u95f4\",\"\\u7ed3\\u675f\\u65f6\\u95f4\"],\"requestType\":[\"date\",\"date\"],\"selectList\":[\"user\",\"user\"],\"default\":[\"$MONTHBEGIN\",\"$MONTHEND\"]}', '{\"count\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"done\":{\"zh-cn\":\"\\u5b8c\\u6210\\u6570\",\"zh-tw\":\"\\u5b8c\\u6210\\u6570\",\"en\":\"Done\"}}', '{\"group1\":\"actor\",\"isUser\":{\"group1\":[\"1\"]},\"group2\":\"\",\"reportField\":[\"day\"],\"reportType\":[\"count\"],\"sumAppend\":[\"\"],\"reportTotal\":[\"1\"]}', 2, '{\"zh-cn\":\"\\u5b9e\\u73b0\\u5458\\u5de5\\u767b\\u5f55\\u6b21\\u6570\\u7edf\\u8ba1\\u62a5\\u8868\\uff0c\\u6309\\u7167\\u5929\\u7edf\\u8ba1\\u6bcf\\u5929\\u6bcf\\u4e2a\\u4eba\\u7684\\u767b\\u5f55\\u6b21\\u6570\\uff0c\\u4ee5\\u53ca\\u603b\\u6570\\u3002\",\"zh-tw\":\"\\u5be6\\u73fe\\u54e1\\u5de5\\u767b\\u9304\\u6b21\\u6578\\u7d71\\u8a08\\u5831\\u8868\\uff0c\\u6309\\u7167\\u5929\\u7d71\\u8a08\\u6bcf\\u5929\\u6bcf\\u500b\\u4eba\\u7684\\u767b\\u9304\\u6b21\\u6578\\uff0c\\u4ee5\\u53ca\\u7e3d\\u6578\\u3002\",\"en\":\"The summary of user login times.\",\"de\":\"The summary of user login times.\",\"fr\":\"The summary of user login times.\"}', 'admin', '2015-07-24 14:28:11'),
|
||||
('effort', '{\"zh-cn\":\"\\u65e5\\u5fd7\\u6c47\\u603b\\u8868\",\"zh-tw\":\"\\u65e5\\u8a8c\\u532f\\u7e3d\\u8868\",\"en\":\"Effort Summary\",\"de\":\"Effort Summary\",\"fr\":\"Effort Summary\"}', ',staff', 'select t1.account,t1.consumed,t1.`date`,if($dept=\'0\',0,t2.dept) as dept from TABLE_EFFORT as t1 left join TABLE_USER as t2 on t1.account=t2.account where t1.`deleted`=\'0\' and if($startDate=\'\',1,t1.`date`>=$startDate) and if($endDate=\'\',1,t1.`date`<=$endDate) having dept=$dept order by `date` asc', '{\"varName\":[\"dept\",\"startDate\",\"endDate\"],\"showName\":[\"\\u90e8\\u95e8\",\"\\u8d77\\u59cb\\u65f6\\u95f4\",\"\\u7ed3\\u675f\\u65f6\\u95f4\"],\"requestType\":[\"select\",\"date\",\"date\"],\"selectList\":[\"dept\",\"user\",\"user\"],\"default\":[\"\",\"$MONTHBEGIN\",\"$MONTHEND\"]}', '{\"date\":{\"zh-cn\":\"\\u65e5\\u671f\",\"zh-tw\":\"\\u65e5\\u671f\",\"en\":\"Date\"},\"consumed\":{\"zh-cn\":\"\\u6d88\\u8017\\u5de5\\u65f6\",\"zh-tw\":\"\\u6d88\\u8017\\u5de5\\u65f6\",\"en\":\"Cost\"}}', '{\"group1\":\"account\",\"isUser\":{\"group1\":[\"1\"]},\"group2\":\"\",\"reportField\":[\"date\"],\"reportType\":[\"sum\"],\"sumAppend\":[\"consumed\"]}', 2, '{\"zh-cn\":\"\\u67e5\\u770b\\u67d0\\u4e2a\\u65f6\\u95f4\\u6bb5\\u5185\\u7684\\u65e5\\u5fd7\\u60c5\\u51b5\\uff0c\\u53ef\\u4ee5\\u6309\\u7167\\u90e8\\u95e8\\u9009\\u62e9\\u3002\",\"zh-tw\":\"\\u67e5\\u770b\\u67d0\\u500b\\u6642\\u9593\\u6bb5\\u5167\\u7684\\u65e5\\u8a8c\\u60c5\\u6cc1\\uff0c\\u53ef\\u4ee5\\u6309\\u7167\\u90e8\\u9580\\u9078\\u64c7\\u3002\",\"en\":\"Effort summary of users.\",\"de\":\"Effort summary of users\",\"fr\":\"Effort summary of users\"}', 'admin', '2015-07-27 13:53:32'),
|
||||
('company-dynamic', '{\"zh-cn\":\"\\u516c\\u53f8\\u52a8\\u6001\\u6c47\\u603b\\u8868\",\"zh-tw\":\"\\u516c\\u53f8\\u52d5\\u614b\\u532f\\u7e3d\\u8868\",\"en\":\"Company Dynamics\",\"de\":\"Company Dynamics\",\"fr\":\"Company Dynamics\"}', ',staff', 'select t1.day,t2.userlogin,t3.consumed,t4.storyopen,t5.storyclose,t6.taskopen,t7.taskfinish,t8.bugopen,t9.bugresolve,t1.actions from ztv_dayactions as t1 left join ztv_dayuserlogin as t2 on t1.day=t2.day left join ztv_dayeffort as t3 on t1.day=t3.date left join ztv_daystoryopen as t4 on t1.day=t4.day left join ztv_daystoryclose as t5 on t1.day=t5.day left join ztv_daytaskopen as t6 on t1.day=t6.day left join ztv_daytaskfinish as t7 on t1.day=t7.day left join ztv_daybugopen as t8 on t1.day=t8.day left join ztv_daybugresolve as t9 on t1.day=t9.day where if($startDate=\'\',1,t1.day>=$startDate) and if($endDate=\'\',1,t1.day<=$endDate)', '{\"varName\":[\"startDate\",\"endDate\"],\"showName\":[\"\\u8d77\\u59cb\\u65f6\\u95f4\",\"\\u7ed3\\u675f\\u65f6\\u95f4\"],\"requestType\":[\"date\",\"date\"],\"selectList\":[\"user\",\"user\"],\"default\":[\"$MONTHBEGIN\",\"$MONTHEND\"]}', '{\"day\":{\"zh-cn\":\"\\u65e5\\u671f\",\"zh-tw\":\"\\u65e5\\u671f\",\"en\":\"Date\"},\"userlogin\":{\"zh-cn\":\"\\u767b\\u5f55\\u6b21\\u6570\",\"zh-tw\":\"\\u767b\\u9304\\u6b21\\u6578\",\"en\":\"Login\"},\"consumed\":{\"zh-cn\":\"\\u65e5\\u5fd7\\u5de5\\u65f6\",\"zh-tw\":\"\\u65e5\\u8a8c\\u5de5\\u6642\",\"en\":\"Cost(h)\"},\"storyopen\":{\"zh-cn\":\"\\u65b0\\u589e\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u65b0\\u589e\\u9700\\u6c42\\u6578\",\"en\":\"Open Story\"},\"storyclose\":{\"zh-cn\":\"\\u5173\\u95ed\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u95dc\\u9589\\u9700\\u6c42\\u6578\",\"en\":\"Closed Story\"},\"taskopen\":{\"zh-cn\":\"\\u65b0\\u589e\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u65b0\\u589e\\u4efb\\u52d9\\u6578\",\"en\":\"Open Task\"},\"taskfinish\":{\"zh-cn\":\"\\u5b8c\\u6210\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5b8c\\u6210\\u4efb\\u52d9\\u6578\",\"en\":\"Finished Task\"},\"bugopen\":{\"zh-cn\":\"\\u65b0\\u589eBug\\u6570\",\"zh-tw\":\"\\u65b0\\u589eBug\\u6578\",\"en\":\"Open Bug\"},\"bugresolve\":{\"zh-cn\":\"\\u89e3\\u51b3Bug\\u6570\",\"zh-tw\":\"\\u89e3\\u51b3Bug\\u6578\",\"en\":\"Resolved bug\"},\"actions\":{\"zh-cn\":\"\\u52a8\\u6001\\u6570\",\"zh-tw\":\"\\u52d5\\u614b\\u6578\",\"en\":\"Dynamics\"}}', '{\"group1\":\"day\",\"isUser\":{\"group1\":[\"1\"]},\"group2\":\"\",\"reportField\":[\"userlogin\",\"consumed\",\"storyopen\",\"storyclose\",\"taskopen\",\"taskfinish\",\"bugopen\",\"bugresolve\",\"actions\"],\"reportType\":[\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\"],\"sumAppend\":[\"userlogin\",\"consumed\",\"storyopen\",\"storyclose\",\"taskopen\",\"taskfinish\",\"bugopen\",\"bugresolve\",\"actions\"]}', 2, '{\"zh-cn\":\"\\u53ef\\u4ee5\\u6307\\u5b9a\\u4e00\\u4e2a\\u65f6\\u671f\\uff0c\\u5217\\u51fa\\u76f8\\u5e94\\u7684\\u6570\\u636e\\uff1a1. \\u6bcf\\u5929\\u7684\\u767b\\u5f55\\u6b21\\u6570\\u30022. \\u6bcf\\u5929\\u7684\\u65e5\\u5fd7\\u5de5\\u65f6\\u91cf\\u30023. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u9700\\u6c42\\u6570\\u30024. \\u6bcf\\u5929\\u5173\\u95ed\\u7684\\u9700\\u6c42\\u6570\\u30025. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u4efb\\u52a1\\u6570\\u30026. \\u6bcf\\u5929\\u5b8c\\u6210\\u7684\\u4efb\\u52a1\\u6570\\u30027. \\u6bcf\\u5929\\u65b0\\u589e\\u7684Bug\\u6570\\u30028. \\u6bcf\\u5929\\u89e3\\u51b3\\u7684Bug\\u6570\\u30029. \\u6bcf\\u5929\\u7684\\u52a8\\u6001\\u6570\\u3002\",\"zh-tw\":\"\\u53ef\\u4ee5\\u6307\\u5b9a\\u4e00\\u500b\\u6642\\u671f\\uff0c\\u5217\\u51fa\\u76f8\\u61c9\\u7684\\u6578\\u64da\\uff1a1. \\u6bcf\\u5929\\u7684\\u767b\\u9304\\u6b21\\u6578\\u30022. \\u6bcf\\u5929\\u7684\\u65e5\\u8a8c\\u5de5\\u6642\\u91cf\\u30023. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u9700\\u6c42\\u6578\\u30024. \\u6bcf\\u5929\\u95dc\\u9589\\u7684\\u9700\\u6c42\\u6578\\u30025. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u4efb\\u52d9\\u6578\\u30026. \\u6bcf\\u5929\\u5b8c\\u6210\\u7684\\u4efb\\u52d9\\u6578\\u30027. \\u6bcf\\u5929\\u65b0\\u589e\\u7684Bug\\u6578\\u30028. \\u6bcf\\u5929\\u89e3\\u6c7a\\u7684Bug\\u6578\\u30029. \\u6bcf\\u5929\\u7684\\u52d5\\u614b\\u6578\\u3002\",\"en\":\"The summary of company dynamics\",\"de\":\"The summary of company dynamics\",\"fr\":\"The summary of company dynamics\"}', 'admin', '2015-07-27 15:09:42'),
|
||||
('company-dynamic', '{\"zh-cn\":\"\\u516c\\u53f8\\u52a8\\u6001\\u6c47\\u603b\\u8868\",\"zh-tw\":\"\\u516c\\u53f8\\u52d5\\u614b\\u532f\\u7e3d\\u8868\",\"en\":\"Company Dynamics\",\"de\":\"Company Dynamics\",\"fr\":\"Company Dynamics\"}', ',staff', 'select t1.day,t2.userlogin,t3.consumed,t4.storyopen,t5.storyclose,t6.taskopen,t7.taskfinish,t8.bugopen,t9.bugresolve,t1.actions from ztv_dayactions as t1 left join ztv_dayuserlogin as t2 on t1.day=t2.day left join ztv_dayeffort as t3 on t1.day=t3.date left join ztv_daystoryopen as t4 on t1.day=t4.day left join ztv_daystoryclose as t5 on t1.day=t5.day left join ztv_daytaskopen as t6 on t1.day=t6.day left join ztv_daytaskfinish as t7 on t1.day=t7.day left join ztv_daybugopen as t8 on t1.day=t8.day left join ztv_daybugresolve as t9 on t1.day=t9.day where if($startDate=\'\',1,t1.day>=$startDate) and if($endDate=\'\',1,t1.day<=$endDate)', '{\"varName\":[\"startDate\",\"endDate\"],\"showName\":[\"\\u8d77\\u59cb\\u65f6\\u95f4\",\"\\u7ed3\\u675f\\u65f6\\u95f4\"],\"requestType\":[\"date\",\"date\"],\"selectList\":[\"user\",\"user\"],\"default\":[\"$MONTHBEGIN\",\"$MONTHEND\"]}', '{\"day\":{\"zh-cn\":\"\\u65e5\\u671f\",\"zh-tw\":\"\\u65e5\\u671f\",\"en\":\"Date\"},\"userlogin\":{\"zh-cn\":\"\\u767b\\u5f55\\u6b21\\u6570\",\"zh-tw\":\"\\u767b\\u9304\\u6b21\\u6578\",\"en\":\"Login\"},\"consumed\":{\"zh-cn\":\"\\u65e5\\u5fd7\\u5de5\\u65f6\",\"zh-tw\":\"\\u65e5\\u8a8c\\u5de5\\u6642\",\"en\":\"Cost(h)\"},\"storyopen\":{\"zh-cn\":\"\\u65b0\\u589e\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u65b0\\u589e\\u9700\\u6c42\\u6578\",\"en\":\"Open Story\"},\"storyclose\":{\"zh-cn\":\"\\u5173\\u95ed\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u95dc\\u9589\\u9700\\u6c42\\u6578\",\"en\":\"Closed Story\"},\"taskopen\":{\"zh-cn\":\"\\u65b0\\u589e\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u65b0\\u589e\\u4efb\\u52d9\\u6578\",\"en\":\"Open Task\"},\"taskfinish\":{\"zh-cn\":\"\\u5b8c\\u6210\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5b8c\\u6210\\u4efb\\u52d9\\u6578\",\"en\":\"Finished Task\"},\"bugopen\":{\"zh-cn\":\"\\u65b0\\u589eBug\\u6570\",\"zh-tw\":\"\\u65b0\\u589eBug\\u6578\",\"en\":\"Open Bug\"},\"bugresolve\":{\"zh-cn\":\"\\u89e3\\u51b3Bug\\u6570\",\"zh-tw\":\"\\u89e3\\u51b3Bug\\u6578\",\"en\":\"Resolved bug\"},\"actions\":{\"zh-cn\":\"\\u52a8\\u6001\\u6570\",\"zh-tw\":\"\\u52d5\\u614b\\u6578\",\"en\":\"Dynamics\"}}', '{\"group1\":\"day\",\"isUser\":{\"group1\":[\"1\"]},\"group2\":\"\",\"reportField\":[\"userlogin\",\"consumed\",\"storyopen\",\"storyclose\",\"taskopen\",\"taskfinish\",\"bugopen\",\"bugresolve\",\"actions\"],\"reportType\":[\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\"],\"sumAppend\":[\"userlogin\",\"consumed\",\"storyopen\",\"storyclose\",\"taskopen\",\"taskfinish\",\"bugopen\",\"bugresolve\",\"actions\"]}', 2, '{\"zh-cn\":\"\\u53ef\\u4ee5\\u6307\\u5b9a\\u4e00\\u4e2a\\u65f6\\u671f\\uff0c\\u5217\\u51fa\\u76f8\\u5e94\\u7684\\u6570\\u636e\\uff1a1. \\u6bcf\\u5929\\u7684\\u767b\\u5f55\\u6b21\\u6570\\u30022. \\u6bcf\\u5929\\u7684\\u65e5\\u5fd7\\u5de5\\u65f6\\u91cf\\u30023. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u9700\\u6c42\\u6570\\u30024. \\u6bcf\\u5929\\u5173\\u95ed\\u7684\\u9700\\u6c42\\u6570\\u30025. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u4efb\\u52a1\\u6570\\u30026. \\u6bcf\\u5929\\u5b8c\\u6210\\u7684\\u4efb\\u52a1\\u6570\\u30027. \\u6bcf\\u5929\\u65b0\\u589e\\u7684Bug\\u6570\\u30028. \\u6bcf\\u5929\\u89e3\\u51b3\\u7684Bug\\u6570\\u30029. \\u6bcf\\u5929\\u7684\\u52a8\\u6001\\u6570\\u3002\",\"zh-tw\":\"\\u53ef\\u4ee5\\u6307\\u5b9a\\u4e00\\u500b\\u6642\\u671f\\uff0c\\u5217\\u51fa\\u76f8\\u61c9\\u7684\\u6578\\u64da\\uff1a1. \\u6bcf\\u5929\\u7684\\u767b\\u9304\\u6b21\\u6578\\u30022. \\u6bcf\\u5929\\u7684\\u65e5\\u8a8c\\u5de5\\u6642\\u91cf\\u30023. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u9700\\u6c42\\u6578\\u30024. \\u6bcf\\u5929\\u95dc\\u9589\\u7684\\u9700\\u6c42\\u6578\\u30025. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u4efb\\u52d9\\u6578\\u30026. \\u6bcf\\u5929\\u5b8c\\u6210\\u7684\\u4efb\\u52d9\\u6578\\u30027. \\u6bcf\\u5929\\u65b0\\u589e\\u7684Bug\\u6578\\u30028. \\u6bcf\\u5929\\u89e3\\u6c7a\\u7684Bug\\u6578\\u30029. \\u6bcf\\u5929\\u7684\\u52d5\\u614b\\u6578\\u3002\",\"en\":\"The summary of company dynamics\",\"de\":\"The summary of company dynamics\",\"fr\":\"The summary of company dynamics\"}', 'admin', '2015-07-27 15:09:42'),
|
||||
('bug-resolve', '{\"zh-cn\":\"Bug\\u89e3\\u51b3\\u8868\",\"zh-tw\":\"Bug\\u89e3\\u6c7a\\u8868\",\"en\":\"Solved Bugs\",\"de\":\"Solved Bugs\",\"fr\":\"Solved Bugs\"}', ',test', 'select *,if($product=\'\',0,product) as customproduct from TABLE_BUG where deleted=\'0\' and resolution!=\'\' and if($startDate=\'\',1,resolvedDate>=$startDate) and if($endDate=\'\',1,resolvedDate<=$endDate) having customproduct=$product', '{\"varName\":[\"product\",\"startDate\",\"endDate\"],\"showName\":[\"\\u4ea7\\u54c1\",\"\\u89e3\\u51b3\\u65e5\\u671f\\u5f00\\u59cb\",\"\\u89e3\\u51b3\\u65e5\\u671f\\u7ed3\\u675f\"],\"requestType\":[\"select\",\"date\",\"date\"],\"selectList\":[\"product\",\"user\",\"user\"],\"default\":[\"\",\"$MONTHBEGIN\",\"$MONTHEND\"]}', '{\"count\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"done\":{\"zh-cn\":\"\\u5b8c\\u6210\\u6570\",\"zh-tw\":\"\\u5b8c\\u6210\\u6570\",\"en\":\"Done\"}}', '{\"group1\":\"resolvedBy\",\"isUser\":{\"group1\":[\"1\"]},\"group2\":\"\",\"reportField\":[\"resolution\"],\"reportType\":[\"count\"],\"sumAppend\":[\"\"],\"reportTotal\":[\"1\"],\"percent\":[\"1\"],\"contrast\":[\"crystalTotal\"],\"showAlone\":[\"1\"]}', 2, '{\"zh-cn\":\"\\u5217\\u51fa\\u89e3\\u51b3\\u7684Bug\\u603b\\u6570\\uff0c\\u89e3\\u51b3\\u65b9\\u6848\\u7684\\u5206\\u5e03\\uff0c\\u5360\\u7684\\u6bd4\\u4f8b\\uff08\\u8be5\\u7528\\u6237\\u89e3\\u51b3\\u7684Bug\\u7684\\u6570\\u91cf\\u5360\\u6240\\u6709\\u7684\\u89e3\\u51b3\\u7684Bug\\u7684\\u6570\\u91cf)\\u3002\",\"zh-tw\":\"\\u5217\\u51fa\\u89e3\\u6c7a\\u7684Bug\\u7e3d\\u6578\\uff0c\\u89e3\\u6c7a\\u65b9\\u6848\\u7684\\u5206\\u5e03\\uff0c\\u5360\\u7684\\u6bd4\\u4f8b\\uff08\\u8a72\\u7528\\u6236\\u89e3\\u6c7a\\u7684Bug\\u7684\\u6578\\u91cf\\u5360\\u6240\\u6709\\u7684\\u89e3\\u6c7a\\u7684Bug\\u7684\\u6578\\u91cf)\\u3002\",\"en\":\"percentage:self resolved \\/ all resolved\",\"de\":\"percentage:self resolved \\/ all resolved\",\"fr\":\"percentage:self resolved \\/ all resolved\"}', 'admin', '2015-07-24 13:44:25'),
|
||||
('project-progress', '{\"zh-cn\":\"\\u9879\\u76ee\\u8fdb\\u5c55\\u8868\",\"zh-tw\":\"\\u9805\\u76ee\\u9032\\u5c55\\u8868\",\"en\":\"Project Progress Report\",\"de\":\"Project Progress Report\",\"fr\":\"Project Progress Report\",\"vi\":\"Project Progress Report\",\"ja\":\"Project Progress Report\"}', ',project', 'select t1.id,t4.name as project,t4.id,IF(t4.multiple="1",t1.name,"") as execution,t1.status,t2.number as tasks,round(t2.consumed,2) as consumed,round(t2.`left`,2) as `left`,t3.stories,t2.undone as undoneTask,t3.undone as undoneStory,t2.totalReal from TABLE_EXECUTION as t1 \r\nleft join ztv_executionsummary as t2 on t1.id=t2.execution\r\nleft join ztv_projectstories as t3 on t1.id=t3.execution\r\nleft join TABLE_PROJECT as t4 on t4.id=t1.project\r\nwhere t1.deleted=\'0\' and t1.type in (\'sprint\',\'stage\') and if($project=\'\',1,t4.id=$project) and if($execution=\'\',1,t1.id=$execution) and if($status=\'\',1,t1.status=$status)', '{\"varName\":[\"project\",\"execution\",\"status\"],\"showName\":[\"\\u9879\\u76ee\\u5217\\u8868\",\"\\u6267\\u884c\\u5217\\u8868\",\"\\u6267\\u884c\\u72b6\\u6001\"],\"requestType\":[\"select\",\"select\",\"select\"],\"selectList\":[\"project\",\"execution\",\"project.status\"],\"default\":[\"\",\"\",\"\"]}', '{\"stories\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"tasks\":{\"zh-cn\":\"\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u4efb\\u52a1\\u6570\",\"en\":\"Tasks\"},\"undoneStory\":{\"zh-cn\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"en\":\"Undone Story\"},\"undoneTask\":{\"zh-cn\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"en\":\"Undone Task\"},\"consumed\":{\"zh-cn\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"zh-tw\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"en\":\"Cost(h)\"},\"left\":{\"zh-cn\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"zh-tw\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"en\":\"Left(h)\"},\"consumedPercent\":{\"zh-cn\":\"\\u8fdb\\u5ea6\",\"zh-tw\":\"\\u8fdb\\u5ea6\",\"en\":\"Process\"},\"execution\":{\"zh-cn\":\"\\u6267\\u884c\\u540d\\u79f0\"}}', '{\"group1\":\"project\",\"group2\":\"execution\",\"reportField\":[\"stories\",\"undoneStory\",\"tasks\",\"undoneTask\",\"left\",\"consumed\"],\"reportType\":[\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\"],\"sumAppend\":[\"stories\",\"undoneStory\",\"tasks\",\"undoneTask\",\"left\",\"consumed\"],\"percent\":{\"5\":\"1\"},\"contrast\":{\"5\":\"totalReal\"},\"showAlone\":{\"5\":\"1\"}}', 2, '{\"zh-cn\":\"\\u9879\\u76ee\\u7684\\u9700\\u6c42\\u6570\\uff0c\\u4efb\\u52a1\\u6570\\uff0c\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\\uff0c\\u5269\\u4f59\\u5de5\\u65f6\\uff0c\\u5269\\u4f59\\u9700\\u6c42\\u6570\\uff0c\\u5269\\u4f59\\u4efb\\u52a1\\u6570\\uff0c\\u8fdb\\u5ea6\\u3002\",\"zh-tw\":\"\\u9805\\u76ee\\u7684\\u9700\\u6c42\\u6578\\uff0c\\u4efb\\u52d9\\u6578\\uff0c\\u5df2\\u6d88\\u8017\\u5de5\\u6642\\uff0c\\u5269\\u9918\\u5de5\\u6642\\uff0c\\u5269\\u9918\\u9700\\u6c42\\u6578\\uff0c\\u5269\\u9918\\u4efb\\u52d9\\u6578\\uff0c\\u9032\\u5ea6\\u3002\",\"en\":\"\",\"de\":\"\",\"fr\":\"\",\"vi\":\"\",\"ja\":\"\"}', 'admin', '2015-07-23 14:03:06'),
|
||||
('projectbug-type', '{\"zh-cn\":\"\\u9879\\u76eeBug\\u7c7b\\u578b\\u7edf\\u8ba1\\u8868\",\"zh-tw\":\"\\u9805\\u76eeBug\\u985e\\u578b\\u7d71\\u8a08\\u8868\",\"en\":\"Project Bug Type\",\"de\":\"Project Bug Type\",\"fr\":\"Project Bug Type\",\"vi\":\"Project Bug Type\",\"ja\":\"Project Bug Type\"}', ',project,test', 'select t1.id,t3.name as project,t3.id,IF(t3.multiple="1",t1.name,"") as execution,t2.id as bugID,t2.type from TABLE_EXECUTION as t1 \r\nleft join TABLE_BUG as t2 on t1.id=t2.execution\r\nleft join TABLE_PROJECT as t3 on t3.id=t1.project\r\nwhere t1.deleted=\'0\' and t2.deleted=\'0\' and if($project=\'\',1,t3.id=$project) and if($execution=\'\',1,t1.id=$execution)', '{\"varName\":[\"project\",\"execution\"],\"showName\":[\"\\u9879\\u76ee\\u5217\\u8868\",\"\\u6267\\u884c\\u5217\\u8868\"],\"requestType\":[\"select\",\"select\"],\"selectList\":[\"project\",\"execution\"],\"default\":[\"\",\"\"]}', '{\"stories\":{\"zh-cn\":\"\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u9700\\u6c42\\u6570\",\"en\":\"Stories\"},\"tasks\":{\"zh-cn\":\"\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u4efb\\u52a1\\u6570\",\"en\":\"Tasks\"},\"undoneStory\":{\"zh-cn\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u9700\\u6c42\\u6570\",\"en\":\"Undone Story\"},\"undoneTask\":{\"zh-cn\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5269\\u4f59\\u4efb\\u52a1\\u6570\",\"en\":\"Undone Task\"},\"consumed\":{\"zh-cn\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"zh-tw\":\"\\u5df2\\u6d88\\u8017\\u5de5\\u65f6\",\"en\":\"Cost(h)\"},\"left\":{\"zh-cn\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"zh-tw\":\"\\u5269\\u4f59\\u5de5\\u65f6\",\"en\":\"Left(h)\"},\"consumedPercent\":{\"zh-cn\":\"\\u8fdb\\u5ea6\",\"zh-tw\":\"\\u8fdb\\u5ea6\",\"en\":\"Process\"},\"execution\":{\"zh-cn\":\"\\u6267\\u884c\\u540d\\u79f0\"}}', '{\"group1\":\"project\",\"group2\":\"execution\",\"reportField\":[\"type\"],\"reportType\":[\"count\"],\"sumAppend\":[\"\"]}', 2, '{\"zh-cn\":\"\\u6309\\u7167\\u9879\\u76ee\\u7edf\\u8ba1Bug\\u7684\\u7c7b\\u578b\\u5206\\u5e03\\u60c5\\u51b5\\u3002\",\"zh-tw\":\"\\u6309\\u7167\\u9805\\u76ee\\u7d71\\u8a08Bug\\u7684\\u985e\\u578b\\u5206\\u5e03\\u60c5\\u6cc1\\u3002\",\"en\":\"\",\"de\":\"\",\"fr\":\"\",\"vi\":\"\",\"ja\":\"\"}', 'admin', '2015-08-04 13:54:22');
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
ALTER TABLE `zt_lang` MODIFY COLUMN `section` varchar(50) NOT NULL;
|
||||
DELETE FROM `zt_grouppriv` WHERE `module` = 'dev' AND `method` = 'editor';
|
||||
REPLACE INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system','common','','setPercent','1');
|
||||
DROP TABLE IF EXISTS `zt_dimension`;
|
||||
|
||||
REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
|
||||
('zh-tw', 'custom', 'URSRList', '1', '{"SRName":"\\u8edf\\u4ef6\\u9700\\u6c42","URName":"\\u7528\\u6236\\u9700\\u6c42"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '2', '{"SRName":"\\u7814\\u767c\\u9700\\u6c42","URName":"\\u7528\\u6236\\u9700\\u6c42"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '3', '{"SRName":"\\u8edf\\u9700","URName":"\\u7528\\u9700"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '4', '{"SRName":"\\u6545\\u4e8b","URName":"\\u53f2\\u8a69"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '5', '{"SRName":"\\u9700\\u6c42","URName":"\\u7528\\u6236\\u9700\\u6c42"}', '0'),
|
||||
('fr', 'custom', 'URSRList', '1', '{\"SRName\":\"Story\",\"URName\":\"Epic\"}', '0'),
|
||||
('fr', 'custom', 'URSRList', '2', '{\"SRName\":\"Software Requirement\",\"URName\":\"User Requirement\"}', '0'),
|
||||
('de', 'custom', 'URSRList', '1', '{\"SRName\":\"Story\",\"URName\":\"Epic\"}', '0'),
|
||||
('de', 'custom', 'URSRList', '2', '{\"SRName\":\"Software Requirement\",\"URName\":\"User Requirement\"}', '0');
|
||||
|
||||
REPLACE INTO `zt_report` (`code`, `name`, `module`, `sql`, `vars`, `langs`, `params`, `step`, `desc`, `addedBy`, `addedDate`) VALUES
|
||||
('company-dynamic', '{\"zh-cn\":\"\\u516c\\u53f8\\u52a8\\u6001\\u6c47\\u603b\\u8868\",\"zh-tw\":\"\\u516c\\u53f8\\u52d5\\u614b\\u532f\\u7e3d\\u8868\",\"en\":\"Company Dynamics\",\"de\":\"Company Dynamics\",\"fr\":\"Company Dynamics\"}', ',staff', 'select t1.day,t2.userlogin,t3.consumed,t4.storyopen,t5.storyclose,t6.taskopen,t7.taskfinish,t8.bugopen,t9.bugresolve,t1.actions from ztv_dayactions as t1 left join ztv_dayuserlogin as t2 on t1.day=t2.day left join ztv_dayeffort as t3 on t1.day=t3.date left join ztv_daystoryopen as t4 on t1.day=t4.day left join ztv_daystoryclose as t5 on t1.day=t5.day left join ztv_daytaskopen as t6 on t1.day=t6.day left join ztv_daytaskfinish as t7 on t1.day=t7.day left join ztv_daybugopen as t8 on t1.day=t8.day left join ztv_daybugresolve as t9 on t1.day=t9.day where if($startDate=\'\',1,t1.day>=$startDate) and if($endDate=\'\',1,t1.day<=$endDate)', '{\"varName\":[\"startDate\",\"endDate\"],\"showName\":[\"\\u8d77\\u59cb\\u65f6\\u95f4\",\"\\u7ed3\\u675f\\u65f6\\u95f4\"],\"requestType\":[\"date\",\"date\"],\"selectList\":[\"user\",\"user\"],\"default\":[\"$MONTHBEGIN\",\"$MONTHEND\"]}', '{\"day\":{\"zh-cn\":\"\\u65e5\\u671f\",\"zh-tw\":\"\\u65e5\\u671f\",\"en\":\"Date\"},\"userlogin\":{\"zh-cn\":\"\\u767b\\u5f55\\u6b21\\u6570\",\"zh-tw\":\"\\u767b\\u9304\\u6b21\\u6578\",\"en\":\"Login\"},\"consumed\":{\"zh-cn\":\"\\u65e5\\u5fd7\\u5de5\\u65f6\",\"zh-tw\":\"\\u65e5\\u8a8c\\u5de5\\u6642\",\"en\":\"Cost(h)\"},\"storyopen\":{\"zh-cn\":\"\\u65b0\\u589e\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u65b0\\u589e\\u9700\\u6c42\\u6578\",\"en\":\"Open Story\"},\"storyclose\":{\"zh-cn\":\"\\u5173\\u95ed\\u9700\\u6c42\\u6570\",\"zh-tw\":\"\\u95dc\\u9589\\u9700\\u6c42\\u6578\",\"en\":\"Closed Story\"},\"taskopen\":{\"zh-cn\":\"\\u65b0\\u589e\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u65b0\\u589e\\u4efb\\u52d9\\u6578\",\"en\":\"Open Task\"},\"taskfinish\":{\"zh-cn\":\"\\u5b8c\\u6210\\u4efb\\u52a1\\u6570\",\"zh-tw\":\"\\u5b8c\\u6210\\u4efb\\u52d9\\u6578\",\"en\":\"Finished Task\"},\"bugopen\":{\"zh-cn\":\"\\u65b0\\u589eBug\\u6570\",\"zh-tw\":\"\\u65b0\\u589eBug\\u6578\",\"en\":\"Open Bug\"},\"bugresolve\":{\"zh-cn\":\"\\u89e3\\u51b3Bug\\u6570\",\"zh-tw\":\"\\u89e3\\u51b3Bug\\u6578\",\"en\":\"Resolved bug\"},\"actions\":{\"zh-cn\":\"\\u52a8\\u6001\\u6570\",\"zh-tw\":\"\\u52d5\\u614b\\u6578\",\"en\":\"Dynamics\"}}', '{\"group1\":\"day\",\"isUser\":{\"group1\":[\"1\"]},\"group2\":\"\",\"reportField\":[\"userlogin\",\"consumed\",\"storyopen\",\"storyclose\",\"taskopen\",\"taskfinish\",\"bugopen\",\"bugresolve\",\"actions\"],\"reportType\":[\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\",\"sum\"],\"sumAppend\":[\"userlogin\",\"consumed\",\"storyopen\",\"storyclose\",\"taskopen\",\"taskfinish\",\"bugopen\",\"bugresolve\",\"actions\"]}', 2, '{\"zh-cn\":\"\\u53ef\\u4ee5\\u6307\\u5b9a\\u4e00\\u4e2a\\u65f6\\u671f\\uff0c\\u5217\\u51fa\\u76f8\\u5e94\\u7684\\u6570\\u636e\\uff1a1. \\u6bcf\\u5929\\u7684\\u767b\\u5f55\\u6b21\\u6570\\u30022. \\u6bcf\\u5929\\u7684\\u65e5\\u5fd7\\u5de5\\u65f6\\u91cf\\u30023. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u9700\\u6c42\\u6570\\u30024. \\u6bcf\\u5929\\u5173\\u95ed\\u7684\\u9700\\u6c42\\u6570\\u30025. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u4efb\\u52a1\\u6570\\u30026. \\u6bcf\\u5929\\u5b8c\\u6210\\u7684\\u4efb\\u52a1\\u6570\\u30027. \\u6bcf\\u5929\\u65b0\\u589e\\u7684Bug\\u6570\\u30028. \\u6bcf\\u5929\\u89e3\\u51b3\\u7684Bug\\u6570\\u30029. \\u6bcf\\u5929\\u7684\\u52a8\\u6001\\u6570\\u3002\",\"zh-tw\":\"\\u53ef\\u4ee5\\u6307\\u5b9a\\u4e00\\u500b\\u6642\\u671f\\uff0c\\u5217\\u51fa\\u76f8\\u61c9\\u7684\\u6578\\u64da\\uff1a1. \\u6bcf\\u5929\\u7684\\u767b\\u9304\\u6b21\\u6578\\u30022. \\u6bcf\\u5929\\u7684\\u65e5\\u8a8c\\u5de5\\u6642\\u91cf\\u30023. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u9700\\u6c42\\u6578\\u30024. \\u6bcf\\u5929\\u95dc\\u9589\\u7684\\u9700\\u6c42\\u6578\\u30025. \\u6bcf\\u5929\\u65b0\\u589e\\u7684\\u4efb\\u52d9\\u6578\\u30026. \\u6bcf\\u5929\\u5b8c\\u6210\\u7684\\u4efb\\u52d9\\u6578\\u30027. \\u6bcf\\u5929\\u65b0\\u589e\\u7684Bug\\u6578\\u30028. \\u6bcf\\u5929\\u89e3\\u6c7a\\u7684Bug\\u6578\\u30029. \\u6bcf\\u5929\\u7684\\u52d5\\u614b\\u6578\\u3002\",\"en\":\"The summary of company dynamics\",\"de\":\"The summary of company dynamics\",\"fr\":\"The summary of company dynamics\"}', 'admin', '2015-07-27 15:09:42');
|
||||
|
||||
+14
-3
@@ -6381,11 +6381,22 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
|
||||
(12,'my','limited');
|
||||
|
||||
REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) VALUES
|
||||
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),('zh-cn', 'custom', 'URSRList', '2', '{\"SRName\":\"\\u7814\\u53d1\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
|
||||
('zh-cn', 'custom', 'URSRList', '3', '{\"SRName\":\"\\u8f6f\\u9700\",\"URName\":\"\\u7528\\u9700\"}', '1'),('zh-cn', 'custom', 'URSRList', '4', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u53f2\\u8bd7\"}', '1'),
|
||||
('zh-cn', 'custom', 'URSRList', '1', '{\"SRName\":\"\\u8f6f\\u4ef6\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
|
||||
('zh-cn', 'custom', 'URSRList', '2', '{\"SRName\":\"\\u7814\\u53d1\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
|
||||
('zh-cn', 'custom', 'URSRList', '3', '{\"SRName\":\"\\u8f6f\\u9700\",\"URName\":\"\\u7528\\u9700\"}', '1'),
|
||||
('zh-cn', 'custom', 'URSRList', '4', '{\"SRName\":\"\\u6545\\u4e8b\",\"URName\":\"\\u53f2\\u8bd7\"}', '1'),
|
||||
('zh-cn', 'custom', 'URSRList', '5', '{\"SRName\":\"\\u9700\\u6c42\",\"URName\":\"\\u7528\\u6237\\u9700\\u6c42\"}', '1'),
|
||||
('zh-tw', 'custom', 'URSRList', '1', '{"SRName":"\\u8edf\\u4ef6\\u9700\\u6c42","URName":"\\u7528\\u6236\\u9700\\u6c42"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '2', '{"SRName":"\\u7814\\u767c\\u9700\\u6c42","URName":"\\u7528\\u6236\\u9700\\u6c42"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '3', '{"SRName":"\\u8edf\\u9700","URName":"\\u7528\\u9700"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '4', '{"SRName":"\\u6545\\u4e8b","URName":"\\u53f2\\u8a69"}', '0'),
|
||||
('zh-tw', 'custom', 'URSRList', '5', '{"SRName":"\\u9700\\u6c42","URName":"\\u7528\\u6236\\u9700\\u6c42"}', '0'),
|
||||
('en', 'custom', 'URSRList', '1', '{\"SRName\":\"Story\",\"URName\":\"Epic\"}', '0'),
|
||||
('en', 'custom', 'URSRList', '2', '{\"SRName\":\"Software Requirement\",\"URName\":\"User Requirement\"}', '0');
|
||||
('en', 'custom', 'URSRList', '2', '{\"SRName\":\"Software Requirement\",\"URName\":\"User Requirement\"}', '0'),
|
||||
('fr', 'custom', 'URSRList', '1', '{\"SRName\":\"Story\",\"URName\":\"Epic\"}', '0'),
|
||||
('fr', 'custom', 'URSRList', '2', '{\"SRName\":\"Software Requirement\",\"URName\":\"User Requirement\"}', '0'),
|
||||
('de', 'custom', 'URSRList', '1', '{\"SRName\":\"Story\",\"URName\":\"Epic\"}', '0'),
|
||||
('de', 'custom', 'URSRList', '2', '{\"SRName\":\"Software Requirement\",\"URName\":\"User Requirement\"}', '0');
|
||||
|
||||
REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`projectType`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES
|
||||
('需求','10','request','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'),
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
$config->task->customBatchCreateFields .= ',lane,region';
|
||||
$config->task->custom->batchCreateFields .= ',lane,region';
|
||||
$config->task->datatable->defaultField = array('id', 'pri', 'name', 'status', 'assignedTo', 'lane', 'finishedBy', 'estimate', 'consumed', 'left', 'progress', 'deadline', 'actions');
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<?php js::set('addChildTask', $lang->task->addChildTask);?>
|
||||
<?php js::set('isonlybody', isonlybody())?>
|
||||
<?php js::set('regionID', $regionID);?>
|
||||
<?php js::set('requiredFields', $config->task->create->requiredFields);?>
|
||||
<style>.c-lane,.c-region{width:150px;}</style>
|
||||
<div id="mainContent" class="main-content fade">
|
||||
<div class="main-header clearfix">
|
||||
@@ -48,11 +49,7 @@
|
||||
}
|
||||
foreach(explode(',', $config->task->create->requiredFields) as $field)
|
||||
{
|
||||
if($field)
|
||||
{
|
||||
$requiredFields[$field] = '';
|
||||
if(strpos(",{$config->task->customBatchCreateFields},", ",{$field},") !== false) $visibleFields[$field] = '';
|
||||
}
|
||||
if($field) $requiredFields[$field] = '';
|
||||
}
|
||||
$colspan = count($visibleFields) + 3;
|
||||
?>
|
||||
@@ -62,20 +59,20 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th class='c-id'><?php echo $lang->idAB;?></th>
|
||||
<th class='c-module<?php echo zget($visibleFields, 'module', ' hidden') . zget($requiredFields, 'module', '', ' required');?>'><?php echo $lang->task->module?></th>
|
||||
<th class='c-module<?php echo zget($visibleFields, 'module', ' hidden') . zget($requiredFields, 'module', '', ' required');?> moduleBox'><?php echo $lang->task->module?></th>
|
||||
<?php if($execution->type != 'ops'):?>
|
||||
<th class='c-story<?php echo zget($visibleFields, 'story', ' hidden') . zget($requiredFields, 'story', '', ' required');?>'><?php echo $lang->task->story;?></th>
|
||||
<th class='c-story<?php echo zget($visibleFields, 'story', ' hidden') . zget($requiredFields, 'story', '', ' required');?> storyBox'><?php echo $lang->task->story;?></th>
|
||||
<?php endif;?>
|
||||
<th class='c-name required has-btn'><?php echo $lang->task->name;?></span></th>
|
||||
<th class='c-region required<?php echo zget($visibleFields, 'region', ' hidden');?>'><?php echo $lang->task->region;?></th>
|
||||
<th class='c-lane required<?php echo zget($visibleFields, 'lane', ' hidden');?>'><?php echo $lang->task->lane;?></th>
|
||||
<th class='c-region required<?php echo zget($visibleFields, 'region', ' hidden');?> regionBox'><?php echo $lang->task->region;?></th>
|
||||
<th class='c-lane required<?php echo zget($visibleFields, 'lane', ' hidden');?> laneBox'><?php echo $lang->task->lane;?></th>
|
||||
<th class='c-type required'><?php echo $lang->typeAB;?></span></th>
|
||||
<th class='c-assigned<?php echo zget($visibleFields, 'assignedTo', ' hidden') . zget($requiredFields, 'assignedTo', '', ' required');?>'><?php echo $lang->task->assignedTo;?></th>
|
||||
<th class='c-estimate<?php echo zget($visibleFields, 'estimate', ' hidden') . zget($requiredFields, 'estimate', '', ' required');?>'><?php echo $lang->task->estimateAB;?></th>
|
||||
<th class='c-date<?php echo zget($visibleFields, 'estStarted', ' hidden') . zget($requiredFields, 'estStarted', '', ' required');?>'><?php echo $lang->task->estStarted;?></th>
|
||||
<th class='c-date<?php echo zget($visibleFields, 'deadline', ' hidden') . zget($requiredFields, 'deadline', '', ' required');?>'><?php echo $lang->task->deadline;?></th>
|
||||
<th class='c-desc<?php echo zget($visibleFields, 'desc', ' hidden') . zget($requiredFields, 'desc', '', ' required');?>'><?php echo $lang->task->desc;?></th>
|
||||
<th class='c-pri<?php echo zget($visibleFields, 'pri', ' hidden') . zget($requiredFields, 'pri', '', ' required');?>'><?php echo $lang->task->pri;?></th>
|
||||
<th class='c-estimate<?php echo zget($visibleFields, 'estimate', ' hidden') . zget($requiredFields, 'estimate', '', ' required');?> estimateBox'><?php echo $lang->task->estimateAB;?></th>
|
||||
<th class='c-date<?php echo zget($visibleFields, 'estStarted', ' hidden') . zget($requiredFields, 'estStarted', '', ' required');?> estStartedBox'><?php echo $lang->task->estStarted;?></th>
|
||||
<th class='c-date<?php echo zget($visibleFields, 'deadline', ' hidden') . zget($requiredFields, 'deadline', '', ' required');?> deadlineBox'><?php echo $lang->task->deadline;?></th>
|
||||
<th class='c-desc<?php echo zget($visibleFields, 'desc', ' hidden') . zget($requiredFields, 'desc', '', ' required');?> descBox'><?php echo $lang->task->desc;?></th>
|
||||
<th class='c-pri<?php echo zget($visibleFields, 'pri', ' hidden') . zget($requiredFields, 'pri', '', ' required');?> priBox'><?php echo $lang->task->pri;?></th>
|
||||
<?php
|
||||
$extendFields = $this->task->getFlowExtendFields();
|
||||
foreach($extendFields as $extendField) echo "<th class='w-100px'>{$extendField->name}</th>";
|
||||
@@ -106,12 +103,12 @@
|
||||
<?php $pri = 3;?>
|
||||
<tr>
|
||||
<td class='text-center'><?php echo $i;?></td>
|
||||
<td <?php echo zget($visibleFields, 'module', "class='hidden'")?> style='overflow:visible'>
|
||||
<td class="<?php echo zget($visibleFields, 'module', 'hidden')?> moduleBox" style='overflow:visible'>
|
||||
<?php echo html::select("module[$i]", $modules, $moduleID, "class='form-control chosen' onchange='setStories(this.value, $execution->id, $i)'")?>
|
||||
<?php echo html::hidden("parent[$i]", $parent);?>
|
||||
</td>
|
||||
<?php if($execution->type != 'ops'):?>
|
||||
<td <?php echo zget($visibleFields, 'story', "class='hidden'");?> style='overflow: visible'>
|
||||
<td class="<?php echo zget($visibleFields, 'story', 'hidden');?> storyBox" style='overflow: visible'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select("story[$i]", $stories, $currentStory, "class='form-control chosen' onchange='setStoryRelated($i)'");?>
|
||||
<span class='input-group-btn'>
|
||||
@@ -134,12 +131,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td <?php echo zget($visibleFields, 'region', "class='hidden'")?> style='overflow:visible'><?php echo html::select("region[$i]", $regionList, isset($regionID) ? $regionID : '', "class='form-control chosen' onchange='loadLaneGroup(this.value, $i)'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'lane', "class='hidden'")?> style='overflow:visible'><?php echo html::select("lane[$i]", $lanes, '', "class='form-control chosen'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'region', 'hidden');?> regionBox" style='overflow:visible'><?php echo html::select("region[$i]", $regionList, isset($regionID) ? $regionID : '', "class='form-control chosen' onchange='loadLaneGroup(this.value, $i)'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'lane', 'hidden');?> laneBox" style='overflow:visible'><?php echo html::select("lane[$i]", $lanes, '', "class='form-control chosen'");?></td>
|
||||
<td><?php echo html::select("type[$i]", $lang->task->typeList, $type, "class='form-control chosen'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'assignedTo', "class='hidden'")?> style='overflow:visible'><?php echo html::select("assignedTo[$i]", $members, $member, "class='form-control chosen'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'estimate', "class='hidden'")?>><?php echo html::input("estimate[$i]", '', "class='form-control text-center'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'estStarted', "class='hidden'")?>>
|
||||
<td class="<?php echo zget($visibleFields, 'assignedTo', 'hidden')?> assignedToBox" style='overflow:visible'><?php echo html::select("assignedTo[$i]", $members, $member, "class='form-control chosen'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'estimate', 'hidden')?> estimateBox"><?php echo html::input("estimate[$i]", '', "class='form-control text-center'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'estStarted', 'hidden')?> estStartedBox">
|
||||
<div class='input-group'>
|
||||
<?php
|
||||
echo html::input("estStarted[$i]", '', "class='form-control text-center form-date' onkeyup='toggleCheck(this)'");
|
||||
@@ -147,7 +144,7 @@
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td <?php echo zget($visibleFields, 'deadline', "class='hidden'")?>>
|
||||
<td class="<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox">
|
||||
<div class='input-group'>
|
||||
<?php
|
||||
echo html::input("deadline[$i]", '', "class='form-control text-center form-date' onkeyup='toggleCheck(this)'");
|
||||
@@ -155,8 +152,8 @@
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td <?php echo zget($visibleFields, 'desc', "class='hidden'")?>><?php echo html::textarea("desc[$i]", '', "rows='1' class='form-control autosize'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'pri', "class='hidden'")?>><?php echo html::select("pri[$i]", (array)$lang->task->priList, $pri, 'class=form-control');?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'desc', 'hidden')?> descBox"><?php echo html::textarea("desc[$i]", '', "rows='1' class='form-control autosize'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox"><?php echo html::select("pri[$i]", (array)$lang->task->priList, $pri, 'class=form-control');?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[$i]") . "</td>";?>
|
||||
</tr>
|
||||
<?php endfor;?>
|
||||
@@ -177,11 +174,11 @@
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class='text-center'>%s</td>
|
||||
<td <?php echo zget($visibleFields, 'module', "class='hidden'")?> style='overflow:visible'>
|
||||
<td class="<?php echo zget($visibleFields, 'module', 'hidden')?> moduleBox" style='overflow:visible'>
|
||||
<?php echo html::select("module[%s]", $modules, $moduleID, "class='form-control chosen' onchange='setStories(this.value, $execution->id, \"%s\")'")?>
|
||||
<?php echo html::hidden("parent[%s]", $parent);?>
|
||||
</td>
|
||||
<td <?php echo zget($visibleFields, 'story', "class='hidden'");?> style='overflow: visible'>
|
||||
<td class="<?php echo zget($visibleFields, 'story', 'hidden');?> storyBox" style='overflow: visible'>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select("story[%s]", $stories, $currentStory, "class='form-control chosen' onchange='setStoryRelated(\"%s\")'");?>
|
||||
<span class='input-group-btn'>
|
||||
@@ -203,12 +200,12 @@
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td <?php echo zget($visibleFields, 'region', "class='hidden'")?> style='overflow:visible'><?php echo html::select("region[%s]", $regionList, isset($regionID) ? $regionID : '', "class='form-control chosen' onchange='loadLaneGroup(this.value, $i)'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'lane', "class='hidden'")?> style='overflow:visible'><?php echo html::select("lane[%s]", $lanes, '', "class='form-control chosen'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'region', 'hidden');?> regionBox" style='overflow:visible'><?php echo html::select("region[%s]", $regionList, isset($regionID) ? $regionID : '', "class='form-control chosen' onchange='loadLaneGroup(this.value, $i)'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'lane', 'hidden');?> laneBox" style='overflow:visible'><?php echo html::select("lane[%s]", $lanes, '', "class='form-control chosen'");?></td>
|
||||
<td><?php echo html::select("type[%s]", $lang->task->typeList, $type, 'class="form-control"');?></td>
|
||||
<td <?php echo zget($visibleFields, 'assignedTo', "class='hidden'")?> style='overflow:visible'><?php echo html::select("assignedTo[%s]", $members, $member, "class='form-control chosen'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'estimate', "class='hidden'")?>><?php echo html::input("estimate[%s]", '', "class='form-control text-center'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'estStarted', "class='hidden'")?>>
|
||||
<td class="<?php echo zget($visibleFields, 'assignedTo', 'hidden');?> assignedToBox" style='overflow:visible'><?php echo html::select("assignedTo[%s]", $members, $member, "class='form-control chosen'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'estimate', 'hidden');?> estimateBox"><?php echo html::input("estimate[%s]", '', "class='form-control text-center'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'estStarted', 'hidden');?> estStartedBox">
|
||||
<div class='input-group'>
|
||||
<?php
|
||||
echo html::input("estStarted[%s]", '', "class='form-control text-center form-date' onkeyup='toggleCheck(this)'");
|
||||
@@ -216,15 +213,15 @@
|
||||
?>
|
||||
</div>
|
||||
</td>
|
||||
<td <?php echo zget($visibleFields, 'deadline', "class='hidden'")?>>
|
||||
<td class="<?php echo zget($visibleFields, 'deadline', 'hidden')?> deadlineBox">
|
||||
<div class='input-group'>
|
||||
<?php
|
||||
echo html::input("deadline[%s]", '', "class='form-control text-center form-date' onkeyup='toggleCheck(this)'");
|
||||
echo "<span class='input-group-addon deadlineBox'><input type='checkbox' name='deadlineDitto[%s]' id='deadlineDitto%s' checked/>{$lang->task->ditto}</span>";
|
||||
?>
|
||||
</div>
|
||||
<td <?php echo zget($visibleFields, 'desc', "class='hidden'")?>><?php echo html::textarea("desc[%s]", '', "rows='1' class='form-control autosize'");?></td>
|
||||
<td <?php echo zget($visibleFields, 'pri', "class='hidden'")?>><?php echo html::select("pri[%s]", (array)$lang->task->priList, $pri, 'class=form-control');?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'desc', 'hidden')?> descBox"><?php echo html::textarea("desc[%s]", '', "rows='1' class='form-control autosize'");?></td>
|
||||
<td class="<?php echo zget($visibleFields, 'pri', 'hidden')?> priBox"><?php echo html::select("pri[%s]", (array)$lang->task->priList, $pri, 'class=form-control');?></td>
|
||||
<?php foreach($extendFields as $extendField) echo "<td" . (($extendField->control == 'select' or $extendField->control == 'multi-select') ? " style='overflow:visible'" : '') . ">" . $this->loadModel('flow')->getFieldControl($extendField, '', $extendField->field . "[%s]") . "</td>";?>
|
||||
</tr>
|
||||
</tbody>
|
||||
|
||||
@@ -101,8 +101,6 @@ class router extends baseRouter
|
||||
global $lang;
|
||||
if(!is_object($lang)) $lang = new language();
|
||||
|
||||
$appName = '';
|
||||
|
||||
/* Set productCommon and projectCommon for flow. */
|
||||
if($moduleName == 'common') $this->setCommonLang();
|
||||
|
||||
@@ -111,7 +109,13 @@ class router extends baseRouter
|
||||
/* Replace main nav lang. */
|
||||
if($moduleName == 'common' and $this->dbh and !empty($this->config->db->name))
|
||||
{
|
||||
$customMenus = $this->dbh->query('SELECT * FROM' . TABLE_LANG . "WHERE `module`='common' AND `section`='mainNav' AND `lang`='{$this->clientLang}' AND `vision`='{$this->config->vision}'")->fetchAll();
|
||||
$customMenus = array();
|
||||
try
|
||||
{
|
||||
$customMenus = $this->dbh->query('SELECT * FROM' . TABLE_LANG . "WHERE `module`='common' AND `section`='mainNav' AND `lang`='{$this->clientLang}' AND `vision`='{$this->config->vision}'")->fetchAll();
|
||||
}
|
||||
catch(PDOException $exception){}
|
||||
|
||||
foreach($customMenus as $menu)
|
||||
{
|
||||
$menuKey = $menu->key;
|
||||
@@ -317,7 +321,12 @@ class router extends baseRouter
|
||||
}
|
||||
|
||||
/* Replace common lang. */
|
||||
$customMenus = $this->dbh->query('SELECT * FROM' . TABLE_LANG . "WHERE `module`='common' AND `lang`='{$this->clientLang}' AND `section`='' AND `vision`='{$config->vision}'")->fetchAll();
|
||||
$customMenus = array();
|
||||
try
|
||||
{
|
||||
$customMenus = $this->dbh->query('SELECT * FROM' . TABLE_LANG . "WHERE `module`='common' AND `lang`='{$this->clientLang}' AND `section`='' AND `vision`='{$config->vision}'")->fetchAll();
|
||||
}
|
||||
catch(PDOException $exception){}
|
||||
foreach($customMenus as $menu) if(isset($lang->{$menu->key})) $lang->{$menu->key} = $menu->value;
|
||||
}
|
||||
}
|
||||
@@ -356,9 +365,6 @@ class router extends baseRouter
|
||||
public function loadModuleConfig($moduleName, $appName = '')
|
||||
{
|
||||
global $config;
|
||||
|
||||
$appName = '';
|
||||
|
||||
if($config and (!isset($config->$moduleName) or !is_object($config->$moduleName))) $config->$moduleName = new stdclass();
|
||||
|
||||
/* 初始化数组。Init the variables. */
|
||||
|
||||
@@ -65,7 +65,7 @@ $config->action->majorList['project'] = array('opened', 'edited');
|
||||
$config->action->majorList['execution'] = array('opened', 'edited');
|
||||
|
||||
$config->action->needGetProjectType = 'build,task,bug,case,testcase,caselib,testtask,testsuite,testreport,doc,issue,release,risk,design,opportunity,trainplan,gapanalysis,researchplan,researchreport,';
|
||||
$config->action->needGetRelateField = ',story,productplan,release,task,build,bug,testcase,case,testtask,testreport,doc,doclib,issue,risk,opportunity,trainplan,gapanalysis,team,whitelist,researchplan,researchreport,meeting,kanbanlane,kanbancolumn,module,review,';
|
||||
$config->action->needGetRelateField = ',branch,story,productplan,release,task,build,bug,testcase,case,testtask,testreport,doc,doclib,issue,risk,opportunity,trainplan,gapanalysis,team,whitelist,researchplan,researchreport,meeting,kanbanlane,kanbancolumn,module,review,';
|
||||
$config->action->noLinkModules = ',doclib,module,webhook,gitlab,gitea,gogs,sonarqube,pipeline,jenkins,kanban,kanbanspace,kanbancolumn,kanbanlane,kanbanregion,kanbancard,execution,project,traincategory,apistruct,program,product,user,entry,repo,';
|
||||
$config->action->ignoreObjectType4Dynamic = 'kanbanregion,kanbanlane,kanbancolumn';
|
||||
|
||||
|
||||
@@ -453,7 +453,7 @@ class actionModel extends model
|
||||
elseif($actionName == 'unlinkedfromexecution')
|
||||
{
|
||||
$name = $this->dao->select('name')->from(TABLE_PROJECT)->where('id')->eq($action->extra)->fetch('name');
|
||||
if($name) $action->extra = common::hasPriv('project', 'story') ? html::a(helper::createLink('project', 'story', "projectID=$action->extra"), "#$action->extra " . $name) : "#$action->extra " . $name;
|
||||
if($name) $action->extra = common::hasPriv('execution', 'view') ? html::a(helper::createLink('execution', 'view', "executionID=$action->extra"), "#$action->extra " . $name) : "#$action->extra " . $name;
|
||||
}
|
||||
elseif($actionName == 'unlinkedfromproject')
|
||||
{
|
||||
@@ -949,7 +949,7 @@ class actionModel extends model
|
||||
else
|
||||
{
|
||||
if($actionType == 'restoredsnapshot' && in_array($action->objectType, array('vm', 'zanode')) && $value == 'defaultSnap') $value = $this->lang->$objectType->snapshot->defaultSnapName;
|
||||
|
||||
|
||||
$desc = str_replace('$' . $key, $value, $desc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ $lang->admin->setModule->auditplan = 'QA';
|
||||
$lang->admin->setModule->meeting = 'Meeting';
|
||||
$lang->admin->setModule->roadmap = 'Roadmap';
|
||||
$lang->admin->setModule->track = 'Track';
|
||||
$lang->admin->setModule->UR = 'URStroy';
|
||||
$lang->admin->setModule->UR = $lang->URCommon;
|
||||
$lang->admin->setModule->researchplan = 'Researchplan';
|
||||
$lang->admin->setModule->gapanalysis = 'Gapanalysis';
|
||||
$lang->admin->setModule->storylib = 'Story Lib';
|
||||
|
||||
@@ -106,7 +106,7 @@ $lang->admin->setModule->auditplan = 'QA';
|
||||
$lang->admin->setModule->meeting = 'Meeting';
|
||||
$lang->admin->setModule->roadmap = 'Roadmap';
|
||||
$lang->admin->setModule->track = 'Track';
|
||||
$lang->admin->setModule->UR = 'URStroy';
|
||||
$lang->admin->setModule->UR = $lang->URCommon;
|
||||
$lang->admin->setModule->researchplan = 'Researchplan';
|
||||
$lang->admin->setModule->gapanalysis = 'Gapanalysis';
|
||||
$lang->admin->setModule->storylib = 'Story Lib';
|
||||
|
||||
@@ -106,7 +106,7 @@ $lang->admin->setModule->auditplan = 'QA';
|
||||
$lang->admin->setModule->meeting = 'Meeting';
|
||||
$lang->admin->setModule->roadmap = 'Roadmap';
|
||||
$lang->admin->setModule->track = 'Track';
|
||||
$lang->admin->setModule->UR = 'URStroy';
|
||||
$lang->admin->setModule->UR = $lang->URCommon;
|
||||
$lang->admin->setModule->researchplan = 'Researchplan';
|
||||
$lang->admin->setModule->gapanalysis = 'Gapanalysis';
|
||||
$lang->admin->setModule->storylib = 'Story Lib';
|
||||
|
||||
@@ -121,7 +121,7 @@ $lang->admin->menuList->feature['tabMenu']['product']['productplan'] = array('li
|
||||
$lang->admin->menuList->feature['tabMenu']['product']['release'] = array('link' => "{$lang->release->common}|custom|required|module=release", 'exclude' => 'custom-required');
|
||||
|
||||
$lang->admin->menuList->feature['tabMenu']['execution']['execution'] = array('link' => "{$lang->execution->common}|custom|required|module=execution", 'links' => array("custom|execution|"), 'alias' => 'execution', 'exclude' => 'custom-required');
|
||||
$lang->admin->menuList->feature['tabMenu']['execution']['task'] = array('link' => "{$lang->task->common}|custom|required|module=task", 'links' => array('custom|set|module=task&field=priList', 'custom|limittaskdate'), 'alias' => 'limittaskdate','exclude' => 'custom-required');
|
||||
$lang->admin->menuList->feature['tabMenu']['execution']['task'] = array('link' => "{$lang->task->common}|custom|required|module=task", 'links' => array('custom|set|module=task&field=priList', 'custom|limittaskdate|'), 'alias' => 'limittaskdate','exclude' => 'custom-required');
|
||||
|
||||
$lang->admin->menuList->feature['tabMenu']['qa']['bug'] = array('link' => "{$lang->bug->common}|custom|required|module=bug", 'links' => array("custom|set|module=bug&field=priList"), 'exclude' => 'custom-required,custom-set');
|
||||
$lang->admin->menuList->feature['tabMenu']['qa']['testcase'] = array('link' => "{$lang->testcase->common}|custom|required|module=testcase", 'links' => array("custom|set|module=testcase&field=priList"), 'exclude' => 'custom-required,custom-set');
|
||||
|
||||
@@ -106,7 +106,7 @@ $lang->admin->setModule->auditplan = 'QA';
|
||||
$lang->admin->setModule->meeting = '会议';
|
||||
$lang->admin->setModule->roadmap = '路线图';
|
||||
$lang->admin->setModule->track = '矩阵';
|
||||
$lang->admin->setModule->UR = '用户需求';
|
||||
$lang->admin->setModule->UR = $lang->URCommon;
|
||||
$lang->admin->setModule->researchplan = '调研';
|
||||
$lang->admin->setModule->gapanalysis = '培训';
|
||||
$lang->admin->setModule->storylib = '需求库';
|
||||
|
||||
@@ -666,6 +666,7 @@ class adminModel extends model
|
||||
->limit('1')
|
||||
->fetch('date');
|
||||
|
||||
if($firstUseDate) $firstUseDate = substr($firstUseDate, 0, 10);
|
||||
return helper::getDateInterval($firstUseDate);
|
||||
}
|
||||
|
||||
|
||||
@@ -803,15 +803,15 @@ EOT;
|
||||
{
|
||||
$result = $this->api->request($method->className, $method->methodName, $action);
|
||||
$content = json_decode($result['content']);
|
||||
$status = $content->status;
|
||||
$data = json_decode($content->data);
|
||||
$status = zget($content, 'status', '');
|
||||
$data = isset($content->data) ? json_decode($content->data) : '';
|
||||
$data = '<xmp>' . print_r($data, true) . '</xmp>';
|
||||
|
||||
$response['result'] = 'success';
|
||||
$response['status'] = $status;
|
||||
$response['url'] = $result['url'];
|
||||
$response['data'] = $data;
|
||||
$this->send($response);
|
||||
return print(json_encode($response));
|
||||
}
|
||||
|
||||
$this->view->method = $method;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
$(document).ready(function()
|
||||
{
|
||||
var options =
|
||||
var options =
|
||||
{
|
||||
target : null,
|
||||
timeout : 30000,
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
$viewLink = $this->createLink('execution', 'task', 'executionID=' . $execution->id);
|
||||
?>
|
||||
<tr <?php echo $appid?>>
|
||||
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($viewLink, $execution->name, '', "title='$execution->name'");?></nobr></td>
|
||||
<td class='c-name text-left' title='<?php echo $execution->name;?>'><nobr><?php echo html::a($viewLink, $execution->name, '', "title='$execution->name' class='text-primary'");?></nobr></td>
|
||||
<td class="c-date"><?php echo $execution->end;?></td>
|
||||
<?php if($longBlock):?>
|
||||
<td class="w-70px">
|
||||
|
||||
@@ -217,7 +217,7 @@ $config->bug->datatable->fieldList['project']['fixed'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['width'] = '120';
|
||||
$config->bug->datatable->fieldList['project']['required'] = 'no';
|
||||
$config->bug->datatable->fieldList['project']['control'] = 'hidden';
|
||||
$config->bug->datatable->fieldList['project']['dataSource'] = array('module' => 'product', 'method' => 'getProjectPairsByProduct', 'params' => '$productID');
|
||||
$config->bug->datatable->fieldList['project']['dataSource'] = array('module' => 'product', 'method' => 'getProjectPairsByProduct', 'params' => '$productID&');
|
||||
|
||||
$config->bug->datatable->fieldList['execution']['title'] = 'execution';
|
||||
$config->bug->datatable->fieldList['execution']['fixed'] = 'no';
|
||||
|
||||
@@ -22,6 +22,7 @@ th.c-confirmed {text-align: center;}
|
||||
.c-severity {overflow: hidden; white-space: nowrap;}
|
||||
.c-keywords {overflow: hidden; white-space: nowrap;}
|
||||
.c-id {text-overflow: ellipsis; white-space: nowrap;}
|
||||
.c-toTask {overflow: hidden; white-space: nowrap;}
|
||||
|
||||
.body-modal #mainMenu>.btn-toolbar {width: auto;}
|
||||
|
||||
|
||||
@@ -125,7 +125,7 @@ if($this->app->tab == 'project') js::set('objectID', $bug->project);
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class='<?php if($product->shadow and isset($project) and !$project->multiple) echo 'hide'?>'>
|
||||
<tr class='<?php if($product->shadow and isset($project) and $project->multiple) echo 'hide'?>'>
|
||||
<th><?php echo $lang->bug->productplan;?></th>
|
||||
<td>
|
||||
<span id="planIdBox"><?php echo html::select('plan', $plans, $bug->plan, "class='form-control chosen'");?></span>
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
<th><?php echo $lang->bug->fromCase;?></th>
|
||||
<td><?php if($bug->case) echo html::a(helper::createLink('testcase', 'view', "caseID=$bug->case&version=$bug->caseVersion", '', true), "<i class='icon icon-sitemap'></i> {$lang->bug->fromCase}$lang->colon$bug->case", '', isonlybody() ? '' : "data-toggle='modal' data-type='iframe' data-width='80%'");?></td>
|
||||
</tr>
|
||||
<tr valign='middle' class='<?php if($product->shadow and isset($project) and !empty($project->multiple)) echo 'hide'?>'>
|
||||
<tr valign='middle' class='<?php if($product->shadow and isset($project) and empty($project->multiple)) echo 'hide'?>'>
|
||||
<th><?php echo $lang->bug->productplan;?></th>
|
||||
<td><?php if(!$bug->plan or !common::printLink('productplan', 'view', "planID=$bug->plan&type=bug", $bug->planName)) echo $bug->planName;?></td>
|
||||
</tr>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->caselib->desc;?></th>
|
||||
<td><?php echo html::textarea('desc', '', "rows=10 class='form-control'");?></td>
|
||||
<td><?php echo html::textarea('desc', '', "rows=10 class='form-control kindeditor'");?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields('', 'table');?>
|
||||
<tr>
|
||||
|
||||
@@ -90,7 +90,7 @@ $lang->viewDetails = 'View Details';
|
||||
|
||||
$lang->actions = 'Aktionen';
|
||||
$lang->restore = 'Wiederherstellen';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->confirmDraft = 'Unsaved form is found. Do you want to restore it?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Notiz';
|
||||
$lang->history = 'Historie';
|
||||
|
||||
@@ -90,7 +90,7 @@ $lang->viewDetails = 'View Details';
|
||||
|
||||
$lang->actions = 'Action';
|
||||
$lang->restore = 'Reset';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->confirmDraft = 'Unsaved form is found. Do you want to restore it?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Note';
|
||||
$lang->history = 'History';
|
||||
|
||||
@@ -90,7 +90,7 @@ $lang->viewDetails = 'View Details';
|
||||
|
||||
$lang->actions = 'Action';
|
||||
$lang->restore = 'Réinitialiser';
|
||||
$lang->confirmDraft = 'There are unsaved form of %name%. Do you want to restore them?';
|
||||
$lang->confirmDraft = 'Unsaved form is found. Do you want to restore it?';
|
||||
$lang->resume = 'resume';
|
||||
$lang->comment = 'Note';
|
||||
$lang->history = 'Historique';
|
||||
|
||||
@@ -109,6 +109,10 @@ $uid = uniqid('');
|
||||
items: editorTool,
|
||||
placeholder: $editor.attr('placeholder') || options.placeholder || '',
|
||||
pasteImage: {postUrl: createLink('file', 'ajaxPasteImg', 'uid=' + kuid), placeholder: $editor.attr('placeholder') || <?php echo json_encode($lang->noticePasteImg);?>},
|
||||
afterChange: function()
|
||||
{
|
||||
$editor.closest('.main-form').trigger('change');
|
||||
}
|
||||
});
|
||||
|
||||
try
|
||||
|
||||
@@ -236,8 +236,8 @@ $lang->custom->restDayList[6] = 'Saturday rest';
|
||||
$lang->custom->restDayList[0] = 'Sunday rest';
|
||||
|
||||
global $config;
|
||||
$lang->custom->sprintConceptList[0] = 'Program Product Iteration';
|
||||
$lang->custom->sprintConceptList[1] = 'Program Product Sprint';
|
||||
$lang->custom->sprintConceptList[0] = 'Project Product Iteration';
|
||||
$lang->custom->sprintConceptList[1] = 'Project Product Sprint';
|
||||
|
||||
$lang->custom->workingList['full'] = 'Full Management of Dev';
|
||||
|
||||
|
||||
@@ -236,8 +236,8 @@ $lang->custom->restDayList[6] = 'Saturday rest';
|
||||
$lang->custom->restDayList[0] = 'Sunday rest';
|
||||
|
||||
global $config;
|
||||
$lang->custom->sprintConceptList[0] = 'Program Product Iteration';
|
||||
$lang->custom->sprintConceptList[1] = 'Program Product Sprint';
|
||||
$lang->custom->sprintConceptList[0] = 'Project Product Iteration';
|
||||
$lang->custom->sprintConceptList[1] = 'Project Product Sprint';
|
||||
|
||||
$lang->custom->workingList['full'] = 'Application Lifecycle Management';
|
||||
|
||||
|
||||
@@ -236,8 +236,8 @@ $lang->custom->restDayList[6] = 'Saturday rest';
|
||||
$lang->custom->restDayList[0] = 'Sunday rest';
|
||||
|
||||
global $config;
|
||||
$lang->custom->sprintConceptList[0] = 'Program Product Iteration';
|
||||
$lang->custom->sprintConceptList[1] = 'Program Product Sprint';
|
||||
$lang->custom->sprintConceptList[0] = 'Project Product Iteration';
|
||||
$lang->custom->sprintConceptList[1] = 'Project Product Sprint';
|
||||
|
||||
$lang->custom->workingList['full'] = 'Application Lifecycle Management';
|
||||
|
||||
|
||||
@@ -236,8 +236,8 @@ $lang->custom->restDayList[6] = '周六休息';
|
||||
$lang->custom->restDayList[0] = '周天休息';
|
||||
|
||||
global $config;
|
||||
$lang->custom->sprintConceptList[0] = "{$lang->projectCommon} 产品 迭代";
|
||||
$lang->custom->sprintConceptList[1] = "{$lang->projectCommon} 产品 冲刺";
|
||||
$lang->custom->sprintConceptList[0] = "项目 产品 迭代";
|
||||
$lang->custom->sprintConceptList[1] = "项目 产品 冲刺";
|
||||
|
||||
$lang->custom->workingList['full'] = '完整研发管理工具';
|
||||
|
||||
|
||||
@@ -577,7 +577,6 @@ class customModel extends model
|
||||
public function getURSRPairs()
|
||||
{
|
||||
$lang = $this->app->getClientLang();
|
||||
$lang = $lang == 'zh-tw' ? 'zh-cn' : $lang;
|
||||
$langData = $this->dao->select('`key`, `value`, `system`')->from(TABLE_LANG)
|
||||
->where('lang')->eq($lang)
|
||||
->andWhere('module')->eq('custom')
|
||||
@@ -659,7 +658,6 @@ class customModel extends model
|
||||
{
|
||||
$this->app->loadLang('custom');
|
||||
$lang = $this->app->getClientLang();
|
||||
$lang = $lang == 'zh-tw' ? 'zh-cn' : $lang;
|
||||
|
||||
$langData = $this->dao->select('`key`, `value`, `system`')->from(TABLE_LANG)
|
||||
->where('lang')->eq($lang)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Entwicklung';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Datenbank';
|
||||
$lang->dev->api = 'API Document';
|
||||
$lang->dev->db = 'Data Dictionary';
|
||||
$lang->dev->editor = 'Bearbeiter';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Datenbank';
|
||||
@@ -18,7 +18,7 @@ $lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$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->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, Please turn on.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->confirmRestore = 'Do you want to reset?';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Develop';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->api = 'API Document';
|
||||
$lang->dev->db = 'Data Dictionary';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
@@ -18,7 +18,7 @@ $lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$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->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, Please turn on.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->confirmRestore = 'Do you want to reset?';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
$lang->dev->common = 'Develop';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = 'Database';
|
||||
$lang->dev->api = 'API Document';
|
||||
$lang->dev->db = 'Data Dictionary';
|
||||
$lang->dev->editor = 'Editor';
|
||||
$lang->dev->translate = 'Translate';
|
||||
$lang->dev->dbList = 'Database';
|
||||
@@ -18,7 +18,7 @@ $lang->dev->paramRange = 'Parameter Range: %s';
|
||||
$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->noteEditor = "The editor is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of the <a href='https://www.zentao.net/extension-viewExt-150.html' target='_blank'>editor</a>.";
|
||||
$lang->dev->noteEditor = "The editor is disabled for security reasons. To use this feature, Please turn on.";
|
||||
$lang->dev->noteTranslate = "The translation is disabled for security reasons. To use this feature, please go to the official website to download and install the plugin of <a href='https://www.zentao.net/extension-viewExt-151.html' target='_blank'>translation</a>.";
|
||||
$lang->dev->confirmRestore = 'Do you want to reset?';
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
$lang->dev->common = '二次开发';
|
||||
$lang->dev->api = 'API';
|
||||
$lang->dev->db = '数据库';
|
||||
$lang->dev->api = '接口文档';
|
||||
$lang->dev->db = '数据字典';
|
||||
$lang->dev->editor = '编辑器';
|
||||
$lang->dev->translate = '翻译';
|
||||
$lang->dev->dbList = '数据库';
|
||||
|
||||
+11
-3
@@ -418,6 +418,7 @@ class devModel extends model
|
||||
$originalLangs['SRCommon'] = $this->lang->dev->SR;
|
||||
|
||||
$URSRList = $this->loadModel('custom')->getItems("lang={$language}&module=custom§ion=URSRList&key={$this->config->custom->URSR}&vision={$this->config->vision}");
|
||||
if(empty($URSRList)) $URSRList = $this->custom->getItems("lang={$language}&module=custom§ion=URSRList&vision={$this->config->vision}");
|
||||
$URSRList = array_shift($URSRList);
|
||||
if($URSRList)
|
||||
{
|
||||
@@ -505,6 +506,7 @@ class devModel extends model
|
||||
$customedLangs['URCommon'] = $this->lang->dev->UR == $this->lang->URCommon ? '' : $this->lang->URCommon;
|
||||
$customedLangs['SRCommon'] = $this->lang->dev->SR == $this->lang->SRCommon ? '' : $this->lang->SRCommon;
|
||||
$URSRList = $this->custom->getItems("lang={$language}&module=custom§ion=URSRList&key={$this->config->custom->URSR}&vision={$this->config->vision}");
|
||||
if(empty($URSRList)) $URSRList = $this->custom->getItems("lang={$language}&module=custom§ion=URSRList&vision={$this->config->vision}");
|
||||
$URSRList = array_shift($URSRList);
|
||||
if($URSRList)
|
||||
{
|
||||
@@ -1040,7 +1042,12 @@ class devModel extends model
|
||||
$_POST = array();
|
||||
|
||||
$oldValue = $this->dao->select('*')->from(TABLE_LANG)->where('`key`')->eq($this->config->custom->URSR)->andWhere('section')->eq('URSRList')->andWhere('lang')->eq($language)->andWhere('module')->eq('custom')->fetch('value');
|
||||
$oldValue = json_decode($oldValue);
|
||||
$URSRList = $this->loadModel('custom')->getItems("lang={$language}&module=custom§ion=URSRList&key={$this->config->custom->URSR}&vision={$this->config->vision}");
|
||||
if(empty($URSRList)) $URSRList = $this->custom->getItems("lang={$language}&module=custom§ion=URSRList&vision={$this->config->vision}");
|
||||
$URSRList = array_shift($URSRList);
|
||||
|
||||
$this->config->custom->URSR = $URSRList->key;
|
||||
$oldValue = json_decode($URSRList->value);
|
||||
|
||||
$_POST['SRName'] = !empty($post['common_SRCommon']) ? $post['common_SRCommon'] : zget($oldValue, 'defaultSRName', $oldValue->SRName);
|
||||
$_POST['URName'] = !empty($post['common_URCommon']) ? $post['common_URCommon'] : zget($oldValue, 'defaultURName', $oldValue->URName);
|
||||
@@ -1099,10 +1106,11 @@ class devModel extends model
|
||||
$module->children = array();
|
||||
foreach($objects[$moduleKey] as $objectKey => $objectName)
|
||||
{
|
||||
$defaultValue = $type == 'module' ? $objectName : '';
|
||||
if($type == 'table' and !isset($this->lang->dev->tableList[$objectKey])) continue;
|
||||
|
||||
$object = new stdclass();
|
||||
$object->key = $objectName;
|
||||
$object->title = zget($this->lang->dev->tableList, $objectKey, $defaultValue);
|
||||
$object->title = zget($this->lang->dev->tableList, $objectKey, $objectName);
|
||||
$object->active = $objectName == $currentObject ? 1 : 0;
|
||||
if($object->active) $module->active = 1;
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
</div>
|
||||
<?php endif;?>
|
||||
|
||||
<form class='main-form form-ajax flex-1' method='post'>
|
||||
<form class='main-form form-ajax flex-1' method='post' id="data-form-<?php echo $type?>">
|
||||
<div class="main-content">
|
||||
<div class="title-content flex">
|
||||
<?php if(str_replace('-', '_', $this->app->getClientLang()) != $language):?>
|
||||
|
||||
@@ -236,8 +236,7 @@ class doc extends control
|
||||
|
||||
$response['message'] = $this->lang->saveSuccess;
|
||||
$response['result'] = 'success';
|
||||
$response['closeModal'] = true;
|
||||
$response['callback'] = "redirectParentWindow($hasLibPriv, $libID, $objectID)";
|
||||
$response['locate'] = 'parent';
|
||||
return $this->send($response);
|
||||
}
|
||||
|
||||
|
||||
@@ -160,9 +160,16 @@ class editor extends control
|
||||
{
|
||||
$filePath = helper::safe64Decode($filePath);
|
||||
if(strpos(strtolower($filePath), strtolower($this->app->getBasePath())) !== 0) return print($this->lang->editor->editFileError);
|
||||
|
||||
$fileName = empty($_POST['fileName']) ? '' : trim($this->post->fileName);
|
||||
if(empty($fileName)) return print(js::error($this->lang->editor->emptyFileName));
|
||||
|
||||
if($action != 'edit' and $action != 'newPage') $filePath = $this->editor->getSavePath($filePath, $action);
|
||||
if($action != 'edit' and $action != 'newPage' and file_exists($filePath) and !$this->post->override) return print(js::error($this->lang->editor->repeatFile));
|
||||
if(!$this->editor->save($filePath)) return;
|
||||
|
||||
$result = $this->editor->save($filePath);
|
||||
if(is_string($result)) return print(js::alert($result));
|
||||
|
||||
echo js::reload('parent.parent.extendWin');
|
||||
return print(js::locate(inlink('edit', "filePath=" . helper::safe64Encode($filePath) . "&action=edit"), 'parent'));
|
||||
}
|
||||
|
||||
@@ -12,3 +12,4 @@
|
||||
.m-editor-extend .main-header {padding: 10px 20px; }
|
||||
.m-editor-extend .main-content {padding: 0px; padding-top: 10px; box-shadow: none;}
|
||||
#extendTree li a {white-space: nowrap;}
|
||||
#extendTree span {padding: 0 4px;}
|
||||
|
||||
@@ -47,4 +47,12 @@ function initModuleTree()
|
||||
$(this).parent().addClass('active');
|
||||
$(this).parent().parent().parent().addClass('active');
|
||||
})
|
||||
|
||||
$firstModule = $('#moduleTree li a:not([data-has-children="true"])');
|
||||
if($firstModule.length)
|
||||
{
|
||||
$firstModule = $firstModule.eq(0);
|
||||
$firstModule.closest('li.has-list').addClass('open in');
|
||||
$firstModule.trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,7 +34,8 @@ $lang->editor->noticeOkFile = 'Aus Sicherheitsgründen muss Ihr Adminkonto best
|
||||
$lang->editor->editFileError = 'Sie können nur ZenTao Dateien verändern!';
|
||||
$lang->editor->turnOff = "If you don't use the editor function, you can turn it off here.";
|
||||
|
||||
$lang->editor->notWritable = "Nicht beschreibbar. Berechtigung erforderlich. Bitte versuchen Sie chmod 777 -R ";
|
||||
$lang->editor->notExists = "Not exists. Please create it. Try mkdir -p %s";
|
||||
$lang->editor->notWritable = "Nicht beschreibbar. Berechtigung erforderlich. Bitte versuchen Sie chmod 777 -R %s";
|
||||
$lang->editor->notDelete = 'Kann nicht gelöscht werden. Bitte prüfen Sie Ihre Berechtigungen!';
|
||||
$lang->editor->emptyFileName = 'Bitte geben Sie einen Dateinamen an!';
|
||||
$lang->editor->onlyLocalVisit = "This feature only works when the IP is 127.0.0.1. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Help</a>";
|
||||
|
||||
@@ -34,7 +34,8 @@ $lang->editor->noticeOkFile = 'For security reasons, your Admin account has to
|
||||
$lang->editor->editFileError = 'You can only modify ZenTao files!';
|
||||
$lang->editor->turnOff = "If you don't use the editor function, you can turn it off here.";
|
||||
|
||||
$lang->editor->notWritable = "Not wirtable. Permission is required. Please try chmod 777 -R ";
|
||||
$lang->editor->notExists = "Not exists. Please create it. Try mkdir -p %s";
|
||||
$lang->editor->notWritable = "Not wirtable. Permission is required. Please try chmod 777 -R %s";
|
||||
$lang->editor->notDelete = 'Cannot be deleted. Please check your permissions!';
|
||||
$lang->editor->emptyFileName = 'Please enter a File Name!';
|
||||
$lang->editor->onlyLocalVisit = "This feature only works when the IP is 127.0.0.1 for security. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Help</a>";
|
||||
|
||||
@@ -34,7 +34,8 @@ $lang->editor->noticeOkFile = 'Pour des raisons de s?curit?, votre compte admin
|
||||
$lang->editor->editFileError = 'Vous pouvez seulement modifier les fichiers ZenTao !';
|
||||
$lang->editor->turnOff = "If you don't use the editor function, you can turn it off here.";
|
||||
|
||||
$lang->editor->notWritable = "Non inscriptible. Permission requise. Essayez chmod 777 -R ";
|
||||
$lang->editor->notExists = "Not exists. Please create it. Try mkdir -p %s";
|
||||
$lang->editor->notWritable = "Non inscriptible. Permission requise. Essayez chmod 777 -R %s";
|
||||
$lang->editor->notDelete = 'Ne peut pas ?tre supprim?. V?rifiez les permissions !';
|
||||
$lang->editor->emptyFileName = 'Entrez un nom de fichier !';
|
||||
$lang->editor->onlyLocalVisit = "Cette fonctionnalit? ne fonctionne que pour une IP 127.0.0.1. <a href='https://api.zentao.pm/goto.php?item=howtodevelop&from=en' target='_blank'>Aide</a>";
|
||||
|
||||
@@ -34,7 +34,8 @@ $lang->editor->noticeOkFile = '为了安全起见,系统需要确认您的管
|
||||
$lang->editor->editFileError = '只能修改禅道文件!';
|
||||
$lang->editor->turnOff = '如不使用编辑器功能,可在此关闭。';
|
||||
|
||||
$lang->editor->notWritable = "无法写入,可能没有权限。请尝试执行 chmod 777 -R ";
|
||||
$lang->editor->notExists = "不存在该目录,请先创建。请尝试执行 mkdir -p %s";
|
||||
$lang->editor->notWritable = "无法写入,可能没有权限。请尝试执行 chmod 777 -R %s";
|
||||
$lang->editor->notDelete = '无法删除,请检查权限!';
|
||||
$lang->editor->emptyFileName = '请写入一个文件名!';
|
||||
$lang->editor->onlyLocalVisit = "该功能只能在IP:127.0.0.1下访问。<a href='https://api.zentao.net/goto.php?item=howtodevelop' target='_blank'>说明文档</a>";
|
||||
|
||||
@@ -320,24 +320,21 @@ class editorModel extends model
|
||||
*
|
||||
* @param string $filePath
|
||||
* @access public
|
||||
* @return bool
|
||||
* @return string
|
||||
*/
|
||||
public function save($filePath)
|
||||
{
|
||||
/* Reduce expiration time for check safe file. */
|
||||
$this->config->safeFileTimeout = 15 * 60;
|
||||
$statusFile = $this->loadModel('common')->checkSafeFile();
|
||||
if($statusFile)
|
||||
{
|
||||
print(js::alert(sprintf($this->lang->editor->noticeOkFile, str_replace('\\', '/', $statusFile))));
|
||||
return false;
|
||||
}
|
||||
if($statusFile) return sprintf($this->lang->editor->noticeOkFile, str_replace('\\', '/', $statusFile));
|
||||
|
||||
$dirPath = dirname($filePath);
|
||||
$extFilePath = substr($filePath, 0, strpos($filePath, DS . 'ext' . DS) + 4);
|
||||
if(!is_dir($dirPath) and is_writable($extFilePath)) mkdir($dirPath, 0777, true);
|
||||
if(!is_dir($dirPath) or !is_writable($dirPath)) return print(js::alert($this->lang->editor->notWritable . $extFilePath));
|
||||
if(strpos(strtolower(realpath($dirPath)), strtolower($this->app->getBasePath())) !== 0) return print(js::alert($this->lang->editor->editFileError));
|
||||
if(!is_dir($dirPath)) return sprintf($this->lang->editor->notExists, $extFilePath);
|
||||
if(!is_writable($dirPath)) return sprintf($this->lang->editor->notWritable, $extFilePath);
|
||||
if(strpos(strtolower(realpath($dirPath)), strtolower($this->app->getBasePath())) !== 0) return $this->lang->editor->editFileError;
|
||||
|
||||
$fileContent = $this->post->fileContent;
|
||||
$evils = array('eval', 'exec', 'passthru', 'proc_open', 'shell_exec', 'system', '$$', 'include', 'require', 'assert', 'javascript', 'onclick');
|
||||
|
||||
@@ -51,6 +51,14 @@ $(function()
|
||||
{
|
||||
if(!$(this).hasClass('active')) $(this).removeClass('text-primary');
|
||||
});
|
||||
|
||||
var $firstBtn = $('a[target="editWin"]');
|
||||
if($firstBtn.length)
|
||||
{
|
||||
$firstBtn = $firstBtn.eq(0);
|
||||
$firstBtn.trigger('click');
|
||||
$(parent.document).find('#editWin').attr('src', $firstBtn.attr('href'));
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no' class='hidden'></iframe>
|
||||
|
||||
@@ -2177,6 +2177,7 @@ class execution extends control
|
||||
$allProjects = $this->project->getPairsByModel($project->model, 0, 'noclosed', isset($projectID) ? $projectID : 0);
|
||||
$this->project->setMenu($projectID);
|
||||
$this->view->project = $project;
|
||||
if($project->model == 'waterfall' or $project->model == 'waterfallplus') $this->lang->execution->common = $this->lang->execution->stage;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -27,5 +27,5 @@
|
||||
|
||||
#cfdChart {margin-top: -20px;}
|
||||
|
||||
#triggerModal .modal-dialog {top: 15% !important; overflow-y: auto; max-height: 80%;}
|
||||
#triggerModal .modal-dialog {top: 15% !important; max-height: 80%;}
|
||||
#triggerModal .modal-dialog::-webkit-scrollbar-track {background-color: white;}
|
||||
|
||||
@@ -654,8 +654,8 @@ $lang->execution->gantt->exportFail = '导出失败。';
|
||||
|
||||
$lang->execution->boardColorList = array('#32C5FF', '#006AF1', '#9D28B2', '#FF8F26', '#7FBB00', '#424BAC', '#66c5f8', '#EC2761');
|
||||
|
||||
$lang->execution->linkBranchStoryByPlanTips = "执行按计划关联需求时,只导入本执行所关联%s的激活状态的需求。";
|
||||
$lang->execution->linkNormalStoryByPlanTips = "执行按计划关联需求时,只导入激活状态的需求。";
|
||||
$lang->execution->linkBranchStoryByPlanTips = "{$lang->execution->common}按计划关联需求时,只导入本{$lang->execution->common}所关联%s的激活状态的需求。";
|
||||
$lang->execution->linkNormalStoryByPlanTips = "{$lang->execution->common}按计划关联需求时,只导入激活状态的需求。";
|
||||
|
||||
$lang->execution->featureBar['dynamic']['all'] = '全部';
|
||||
$lang->execution->featureBar['dynamic']['today'] = '今天';
|
||||
|
||||
@@ -390,11 +390,11 @@ class executionModel extends model
|
||||
$type = 'sprint';
|
||||
if($project) $type = zget($this->config->execution->modelList, $project->model, 'sprint');
|
||||
|
||||
if(($project->model == 'waterfall' or $project->model == 'waterfallplus') and isset($this->config->setPercent) and $this->config->setPercent == 1)
|
||||
if($project->model == 'waterfall' or $project->model == 'waterfallplus')
|
||||
{
|
||||
$_POST['products'] = array_filter($_POST['products']);
|
||||
if(empty($_POST['products'])) dao::$errors['products0'] = $this->lang->project->errorNoProducts;
|
||||
$this->checkWorkload('create', $_POST['percent'], $project);
|
||||
if(isset($this->config->setPercent) and $this->config->setPercent == 1) $this->checkWorkload('create', $_POST['percent'], $project);
|
||||
if(dao::isError()) return false;
|
||||
}
|
||||
|
||||
@@ -1311,6 +1311,27 @@ class executionModel extends model
|
||||
unset($execution->end);
|
||||
}
|
||||
|
||||
if($this->post->readjustTime && $oldExecution->grade > 1)
|
||||
{
|
||||
$parent = $this->getByID($oldExecution->parent);
|
||||
$begin = $execution->begin;
|
||||
$end = $execution->end;
|
||||
$parentBegin = $parent->begin;
|
||||
$parentEnd = $parent->end;
|
||||
|
||||
if($begin < $parentBegin)
|
||||
{
|
||||
dao::$errors["message"][] = sprintf($this->lang->execution->errorLetterParent, $parentBegin);
|
||||
}
|
||||
|
||||
if($end > $parentEnd)
|
||||
{
|
||||
dao::$errors["message"][] = sprintf($this->lang->execution->errorGreaterParent, $parentEnd);
|
||||
}
|
||||
}
|
||||
|
||||
if(dao::isError()) return false;
|
||||
|
||||
$execution = $this->loadModel('file')->processImgURL($execution, $this->config->execution->editor->activate['id'], $this->post->uid);
|
||||
$this->dao->update(TABLE_EXECUTION)->data($execution)
|
||||
->autoCheck()
|
||||
@@ -5684,12 +5705,13 @@ class executionModel extends model
|
||||
*/
|
||||
public function generateRow($executions, $users, $productID)
|
||||
{
|
||||
$rows = array();
|
||||
$today = helper::today();
|
||||
$rows = array();
|
||||
foreach($executions as $id => $execution)
|
||||
{
|
||||
$label = $execution->type == 'stage' ? 'label-warning' : 'label-info';
|
||||
$link = $execution->type == 'kanban' ? helper::createLink('execution', 'kanban', "id=$execution->id") : helper::createLink('execution', 'task', "id=$execution->id");
|
||||
$execution->name = "<span class='project-type-label label label-outline $label'>{$this->lang->execution->typeList[$execution->type]}</span> " . (empty($execution->children) ? html::a($link, $execution->name) : $execution->name);
|
||||
$execution->name = "<span class='project-type-label label label-outline $label'>{$this->lang->execution->typeList[$execution->type]}</span> " . (empty($execution->children) ? html::a($link, $execution->name, '_self', 'class="text-primary"') : $execution->name) . (strtotime($today) > strtotime($execution->end) ? '<span class="label label-danger label-badge">' . $this->lang->execution->delayed . '</span>' : '');;
|
||||
$execution->project = $execution->projectName;
|
||||
$execution->parent = ($execution->parent and $execution->grade > 1) ? $execution->parent : '';
|
||||
$execution->asParent = !empty($execution->children);
|
||||
|
||||
@@ -271,6 +271,7 @@
|
||||
<?php foreach($stories as $key => $story):?>
|
||||
<?php
|
||||
$totalEstimate += $story->estimate;
|
||||
$story->from = $this->app->tab;
|
||||
?>
|
||||
<tr id="story<?php echo $story->id;?>" data-id='<?php echo $story->id;?>' data-order='<?php echo $story->order ?>' data-estimate='<?php echo $story->estimate?>' data-cases='<?php echo zget($storyCases, $story->id, 0)?>'>
|
||||
<?php foreach($setting as $key => $value)
|
||||
@@ -286,7 +287,7 @@
|
||||
<?php if(!empty($story->children)):?>
|
||||
<?php $i = 0;?>
|
||||
<?php foreach($story->children as $key => $child):?>
|
||||
<?php $child->from = 'execution';?>
|
||||
<?php $child->from = $this->app->tab;?>
|
||||
<?php $class = $i == 0 ? ' table-child-top' : '';?>
|
||||
<?php $class .= ($i + 1 == count($story->children)) ? ' table-child-bottom' : '';?>
|
||||
<tr class='table-children<?php echo $class;?> parent-<?php echo $story->id;?>' data-id='<?php echo $child->id?>' data-status='<?php echo $child->status?>' data-estimate='<?php echo $child->estimate?>' data-cases='<?php echo zget($storyCases, $story->id, 0);?>'>
|
||||
@@ -404,7 +405,7 @@
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="icon icon-close"></i></button>
|
||||
<?php
|
||||
$linkStoryByPlanTips = $multiBranch ? sprintf($lang->execution->linkBranchStoryByPlanTips, $lang->project->branch) : $lang->execution->linkNormalStoryByPlanTips;
|
||||
$linkStoryByPlanTips = $execution->multiple ? $linkStoryByPlanTips : str_replace($lang->executionCommon, $lang->projectCommon, $linkStoryByPlanTips);
|
||||
$linkStoryByPlanTips = $execution->multiple ? $linkStoryByPlanTips : str_replace($lang->execution->common, $lang->projectCommon, $linkStoryByPlanTips);
|
||||
?>
|
||||
<h4 class="modal-title"><?php echo $lang->execution->linkStoryByPlan;?></h4><?php echo '(' . $linkStoryByPlanTips . ')';?>
|
||||
</div>
|
||||
|
||||
@@ -733,7 +733,7 @@ class fileModel extends model
|
||||
$line = str_replace('""', '"', $line);
|
||||
|
||||
/* if only one column then line is the data. */
|
||||
if(strpos($line, ',') === false and $line[0] != '"' and $col == -1)
|
||||
if(strpos($line, ',') === false and isset($line[0]) and $line[0] != '"' and $col == -1)
|
||||
{
|
||||
$data[$row][0] = trim($line, '"');
|
||||
}
|
||||
|
||||
@@ -62,17 +62,6 @@ class index extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Just test the extension engine.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function testext()
|
||||
{
|
||||
echo $this->fetch('misc', 'getsid');
|
||||
}
|
||||
|
||||
/**
|
||||
* ajaxClearObjectSession
|
||||
*
|
||||
|
||||
@@ -39,7 +39,7 @@ class mr extends control
|
||||
->andWhere('synced')->eq(1)
|
||||
->orderBy('id')
|
||||
->count();
|
||||
if($repoCount == 0) $this->locate($this->repo->createLink('create'));
|
||||
if($repoCount == 0) $this->locate($this->loadModel('repo')->createLink('create'));
|
||||
|
||||
$repoID = $this->loadModel('repo')->saveState($repoID, $objectID);
|
||||
$repo = $this->repo->getRepoByID($repoID);
|
||||
|
||||
+7
-5
@@ -1112,11 +1112,12 @@ class myModel extends model
|
||||
{
|
||||
if($checkExists) return true;
|
||||
$story = new stdclass();
|
||||
$story->id = $data->id;
|
||||
$story->title = $data->title;
|
||||
$story->type = 'story';
|
||||
$story->time = $data->openedDate;
|
||||
$story->status = $data->status;
|
||||
$story->id = $data->id;
|
||||
$story->title = $data->title;
|
||||
$story->type = 'story';
|
||||
$story->storyType = $data->type;
|
||||
$story->time = $data->openedDate;
|
||||
$story->status = $data->status;
|
||||
$stories[$story->id] = $story;
|
||||
}
|
||||
|
||||
@@ -1435,6 +1436,7 @@ class myModel extends model
|
||||
$review->status = $objectType == 'attend' ? $object->reviewStatus : ((isset($object->status) and !isset($flows[$objectType])) ? $object->status : 'done');
|
||||
if(strpos($review->result, ',') !== false) list($review->result) = explode(',', $review->result);
|
||||
|
||||
if($objectType == 'story') $review->storyType = $object->type;
|
||||
if($review->type == 'review') $review->type = 'projectreview';
|
||||
if($review->type == 'case') $review->type = 'testcase';
|
||||
$review->title = '';
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
$typeName = '';
|
||||
if(isset($lang->{$review->type}->common)) $typeName = $lang->{$review->type}->common;
|
||||
if($type == 'story') $typeName = $lang->SRCommon;
|
||||
if($type == 'story') $typeName = $review->storyType == 'story' ? $lang->SRCommon : $lang->URCommon;
|
||||
if($review->type == 'projectreview') $typeName = $lang->project->common;
|
||||
if(isset($flows[$review->type])) $typeName = $flows[$review->type];
|
||||
|
||||
|
||||
@@ -1275,6 +1275,7 @@ class productModel extends model
|
||||
public function getProjectPairsByProduct($productID, $branch = 0, $appendProject = 0, $status = '', $param = '')
|
||||
{
|
||||
$product = $this->getById($productID);
|
||||
if(empty($product)) return array();
|
||||
|
||||
return $this->dao->select('t2.id, t2.name')->from(TABLE_PROJECTPRODUCT)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id')
|
||||
|
||||
@@ -4,26 +4,27 @@
|
||||
<?php js::set('extra', $extra);?>
|
||||
<style>
|
||||
#navTabs {position: sticky; top: 0; background: #fff; z-index: 950;}
|
||||
#navTabs>li {padding: 0px 10px; display: inline-block}
|
||||
#navTabs>li>span {display: inline-block;}
|
||||
#navTabs>li>a {margin: 0!important; padding: 8px 0px; display: inline-block}
|
||||
#navTabs > li {padding: 0px 10px; display: inline-block}
|
||||
#navTabs > li > span {display: inline-block;}
|
||||
#navTabs > li > a {margin: 0!important; padding: 8px 0px; display: inline-block}
|
||||
|
||||
#tabContent {margin-top: 5px; z-index: 900; max-width: 220px}
|
||||
.productTree ul {list-style: none; margin: 0}
|
||||
.productTree .products>ul {padding-left: 7px;}
|
||||
.productTree .products>ul>li>div {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center;}
|
||||
.productTree .products>ul>li label {background: rgba(255,255,255,0.5); line-height: unset; color: #838a9d; border: 1px solid #d8d8d8; border-radius: 2px; padding: 1px 4px;}
|
||||
.productTree .products>ul > li > div {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center;}
|
||||
.productTree .products>ul > li label {background: rgba(255,255,255,0.5); line-height: unset; color: #838a9d; border: 1px solid #d8d8d8; border-radius: 2px; padding: 1px 4px;}
|
||||
.productTree li a i.icon {font-size: 15px !important;}
|
||||
.productTree li a i.icon:before {min-width: 16px !important;}
|
||||
.productTree li .label {position: unset; margin-bottom: 0;}
|
||||
.productTree li>a, div.hide-in-search>a {display: block; padding: 2px 10px 2px 5px; overflow: hidden; line-height: 20px; text-overflow: ellipsis; white-space: nowrap; border-radius: 4px;}
|
||||
.productTree .tree li>.list-toggle {line-height: 24px;}
|
||||
.productTree li > a, div.hide-in-search>a {display: block; padding: 2px 10px 2px 5px; overflow: hidden; line-height: 20px; text-overflow: ellipsis; white-space: nowrap; border-radius: 4px;}
|
||||
.productTree .tree li > .list-toggle {line-height: 24px;}
|
||||
.productTree .tree li.has-list.open:before {content: unset;}
|
||||
.tree.noProgram li {padding-left: 0;}
|
||||
|
||||
#swapper li>div.hide-in-search>a:focus, #swapper li>div.hide-in-search>a:hover {color: #838a9d; cursor: default;}
|
||||
#swapper li > div.hide-in-search>a:focus, #swapper li > div.hide-in-search>a:hover {color: #838a9d; cursor: default;}
|
||||
#swapper li > a {margin-top: 4px; margin-bottom: 4px;}
|
||||
#swapper li {padding-top: 0; padding-bottom: 0;}
|
||||
#swapper .tree li>.list-toggle {top: -1px;}
|
||||
#swapper .tree li > .list-toggle {top: -1px;}
|
||||
|
||||
#subHeader .tree ul {display: block;}
|
||||
div#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;}
|
||||
@@ -56,9 +57,9 @@ foreach($products as $programID => $programProducts)
|
||||
}
|
||||
$productsPinYin = common::convert2Pinyin($productNames);
|
||||
|
||||
$myProductsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '';
|
||||
$normalProductsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '';
|
||||
$closedProductsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '';
|
||||
$myProductsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '<ul class="tree noProgram">';
|
||||
$normalProductsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '<ul class="tree noProgram">';
|
||||
$closedProductsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '<ul class="tree noProgram">';
|
||||
|
||||
foreach($products as $programID => $programProducts)
|
||||
{
|
||||
@@ -168,7 +169,7 @@ $(function()
|
||||
$('.nav-tabs li span').hide();
|
||||
$('.nav-tabs li.active').find('span').show();
|
||||
|
||||
$('.nav-tabs>li a').click(function()
|
||||
$('.nav-tabs > li a').click(function()
|
||||
{
|
||||
if($('#swapper input[type="search"]').val() == '')
|
||||
{
|
||||
|
||||
@@ -28,7 +28,7 @@ class productplan extends control
|
||||
$this->lang->product->branch = sprintf($this->lang->product->branch, $this->lang->product->branchName[$product->type]);
|
||||
|
||||
$this->app->loadConfig('execution');
|
||||
$this->product->setMenu($productID, $branch);
|
||||
if(!$product->shadow) $this->product->setMenu($productID, $branch);
|
||||
$this->session->set('currentProductType', $product->type);
|
||||
|
||||
$branches = $this->loadModel('branch')->getList($productID, 0, 'all');
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#planForm tr td {vertical-align: top;}
|
||||
#mainContent .methodTitle, #mainContent .methodTip {display: inline-block; vertical-align: middle;}
|
||||
.type-list-radio {display: inline-block; padding: 10px 5px;}
|
||||
#planForm .c-attribute {width: 110px;}
|
||||
|
||||
@@ -3,26 +3,27 @@
|
||||
<?php js::set('method', $method);?>
|
||||
<style>
|
||||
#navTabs {position: sticky; top: 0; background: #fff; z-index: 950;}
|
||||
#navTabs>li {padding: 0px 10px; display: inline-block}
|
||||
#navTabs>li>span {display: inline-block;}
|
||||
#navTabs>li>a {margin: 0!important; padding: 8px 0px; display: inline-block}
|
||||
#navTabs > li {padding: 0px 10px; display: inline-block}
|
||||
#navTabs > li > span {display: inline-block;}
|
||||
#navTabs > li > a {margin: 0!important; padding: 8px 0px; display: inline-block}
|
||||
|
||||
#tabContent {margin-top: 5px; z-index: 900; max-width: 220px}
|
||||
.projectTree ul {list-style: none; margin: 0}
|
||||
.projectTree .projects>ul {padding-left: 7px;}
|
||||
.projectTree .projects>ul>li>div {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center;}
|
||||
.projectTree .projects>ul>li label {background: rgba(255,255,255,0.5); line-height: unset; color: #838a9d; border: 1px solid #d8d8d8; border-radius: 2px; padding: 1px 4px;}
|
||||
.projectTree .projects > ul {padding-left: 7px;}
|
||||
.projectTree .projects > ul > li > div {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center;}
|
||||
.projectTree .projects > ul > li label {background: rgba(255,255,255,0.5); line-height: unset; color: #838a9d; border: 1px solid #d8d8d8; border-radius: 2px; padding: 1px 4px;}
|
||||
.projectTree li a i.icon {font-size: 15px !important;}
|
||||
.projectTree li a i.icon:before {min-width: 16px !important;}
|
||||
.projectTree li .label {position: unset; margin-bottom: 0;}
|
||||
.projectTree li>a, div.hide-in-search>a {display: block; padding: 2px 10px 2px 5px; overflow: hidden; line-height: 20px; text-overflow: ellipsis; white-space: nowrap; border-radius: 4px;}
|
||||
.projectTree .tree li>.list-toggle {line-height: 24px;}
|
||||
.projectTree li > a, div.hide-in-search>a {display: block; padding: 2px 10px 2px 5px; overflow: hidden; line-height: 20px; text-overflow: ellipsis; white-space: nowrap; border-radius: 4px;}
|
||||
.projectTree .tree li > .list-toggle {line-height: 24px;}
|
||||
.projectTree .tree li.has-list.open:before {content: unset;}
|
||||
.tree.noProgram li {padding-left: 0;}
|
||||
|
||||
#swapper li>div.hide-in-search>a:focus, #swapper li>div.hide-in-search>a:hover {color: #838a9d; cursor: default;}
|
||||
#swapper li > div.hide-in-search>a:focus, #swapper li > div.hide-in-search>a:hover {color: #838a9d; cursor: default;}
|
||||
#swapper li > a {margin-top: 4px; margin-bottom: 4px;}
|
||||
#swapper li {padding-top: 0; padding-bottom: 0;}
|
||||
#swapper .tree li>.list-toggle {top: -1px;}
|
||||
#swapper .tree li > .list-toggle {top: -1px;}
|
||||
|
||||
#dropMenu div#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;}
|
||||
#gray-line {width:230px; height: 1px; margin-left: 10px; margin-bottom:2px; background-color: #ddd;}
|
||||
@@ -199,7 +200,7 @@ $(function()
|
||||
$('.nav-tabs li span').hide();
|
||||
$('.nav-tabs li.active').find('span').show();
|
||||
|
||||
$('.nav-tabs>li a').click(function()
|
||||
$('.nav-tabs > li a').click(function()
|
||||
{
|
||||
if($('#swapper input[type="search"]').val() == '')
|
||||
{
|
||||
|
||||
@@ -447,9 +447,7 @@ class projectrelease extends control
|
||||
$html .= "<h3>{$this->lang->release->stories}</h3>";
|
||||
$this->loadModel('story');
|
||||
|
||||
$stories = $this->dao->select('id, title')->from(TABLE_STORY)->where($this->session->storyQueryCondition)
|
||||
->beginIF($this->session->storyOrderBy != false)->orderBy($this->session->storyOrderBy)->fi()
|
||||
->fetchAll('id');
|
||||
$stories = $this->dbh->query($this->session->storyQueryCondition . " ORDER BY " . strtr($this->session->storyOrderBy, '_', ' '))->fetchAll();
|
||||
|
||||
foreach($stories as $story) $story->title = "<a href='" . common::getSysURL() . $this->createLink('story', 'view', "storyID=$story->id") . "' target='_blank'>$story->title</a>";
|
||||
|
||||
|
||||
@@ -368,9 +368,7 @@ class release extends control
|
||||
$html .= "<h3>{$this->lang->release->stories}</h3>";
|
||||
$this->loadModel('story');
|
||||
|
||||
$stories = $this->dao->select('id, title')->from(TABLE_STORY)->where($this->session->storyQueryCondition)
|
||||
->beginIF($this->session->storyOrderBy != false)->orderBy($this->session->storyOrderBy)->fi()
|
||||
->fetchAll('id');
|
||||
$stories = $this->dbh->query($this->session->storyQueryCondition . " ORDER BY " . strtr($this->session->storyOrderBy, '_', ' '))->fetchAll();
|
||||
|
||||
foreach($stories as $story) $story->title = "<a href='" . common::getSysURL() . $this->createLink('story', 'view', "storyID=$story->id") . "' target='_blank'>$story->title</a>";
|
||||
|
||||
|
||||
@@ -1267,9 +1267,14 @@ class story extends control
|
||||
|
||||
if($this->app->tab == 'project')
|
||||
{
|
||||
$module = 'projectstory';
|
||||
$method = 'view';
|
||||
$params = "storyID=$storyID";
|
||||
$module = 'projectstory';
|
||||
$method = 'view';
|
||||
$params = "storyID=$storyID";
|
||||
if(!$this->session->multiple)
|
||||
{
|
||||
$module = 'story';
|
||||
$params .= "&version=0¶m={$this->session->project}&storyType=$storyType";
|
||||
}
|
||||
}
|
||||
elseif($this->app->tab == 'execution')
|
||||
{
|
||||
@@ -1283,7 +1288,8 @@ class story extends control
|
||||
$method = 'view';
|
||||
$params = "storyID=$storyID&version=0¶m=0&storyType=$storyType";
|
||||
}
|
||||
return print(js::locate($this->createLink($module, $method, $params), 'parent'));
|
||||
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $this->createLink($module, $method, $params)));
|
||||
}
|
||||
|
||||
$this->commonAction($storyID);
|
||||
@@ -1631,7 +1637,7 @@ class story extends control
|
||||
{
|
||||
$module = 'story';
|
||||
$method = 'view';
|
||||
$params = "storyID=$storyID&version=0¶m=0&storyType=$storyType";
|
||||
$params = "storyID=$storyID&version=0¶m={$this->session->execution}&storyType=$storyType";
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1800,9 +1806,6 @@ class story extends control
|
||||
$story = $this->story->getById($storyID);
|
||||
$product = $this->product->getById($story->product);
|
||||
|
||||
/* Set menu. */
|
||||
$this->product->setMenu($story->product, $story->branch);
|
||||
|
||||
/* Get reviewers. */
|
||||
$reviewers = $product->reviewer;
|
||||
if(!$reviewers and $product->acl != 'open') $reviewers = $this->loadModel('user')->getProductViewListUsers($product, '', '', '', '');
|
||||
|
||||
+13
-10
@@ -1591,6 +1591,7 @@ class storyModel extends model
|
||||
->setDefault('reviewedDate', $date)
|
||||
->stripTags($this->config->story->editor->review['id'], $this->config->allowedTags)
|
||||
->setIF(!$this->post->assignedTo, 'assignedTo', '')
|
||||
->setIF(!empty($_POST['assignedTo']), 'assignedDate', $now)
|
||||
->removeIF($this->post->result != 'reject', 'closedReason, duplicateStory, childStories')
|
||||
->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'duplicate', 'duplicateStory')
|
||||
->removeIF($this->post->result == 'reject' and $this->post->closedReason != 'subdivided', 'childStories')
|
||||
@@ -3625,7 +3626,7 @@ class storyModel extends model
|
||||
}
|
||||
|
||||
$this->dao->sqlobj->sql = $query;
|
||||
return $this->mergePlanTitle($productID, $stories, $branch, $type);
|
||||
return $this->mergePlanTitle($productID, $stories, $branch, $storyType);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4685,7 +4686,7 @@ class storyModel extends model
|
||||
$menu .= "</ul></div>";
|
||||
}
|
||||
|
||||
if(($this->app->tab == 'execution' || (!empty($execution) and $execution->multiple === '0')) and $story->status == 'active') $menu .= $this->buildMenu('task', 'create', "execution={$this->session->execution}&{$params}&moduleID=$story->module", $story, $type, 'plus', '', 'showinonlybody');
|
||||
if(($this->app->tab == 'execution' or (!empty($execution) and $execution->multiple === '0')) and $story->status == 'active' and $story->type == 'story') $menu .= $this->buildMenu('task', 'create', "execution={$this->session->execution}&{$params}&moduleID=$story->module", $story, $type, 'plus', '', 'showinonlybody');
|
||||
|
||||
$menu .= "<div class='divider'></div>";
|
||||
$menu .= $this->buildFlowMenu('story', $story, $type, 'direct');
|
||||
@@ -4995,7 +4996,7 @@ class storyModel extends model
|
||||
}
|
||||
else
|
||||
{
|
||||
$storyLink = helper::createLink('story', 'view', "storyID=$story->id&version=0¶m={$this->session->project}&storyType=$story->type");
|
||||
$storyLink = helper::createLink('story', 'view', "storyID=$story->id&version=0¶m={$this->session->execution}&storyType=$story->type");
|
||||
}
|
||||
}
|
||||
elseif($tab == 'execution')
|
||||
@@ -5167,12 +5168,13 @@ class storyModel extends model
|
||||
{
|
||||
$showBranch = isset($this->config->product->browse->showBranch) ? $this->config->product->browse->showBranch : 1;
|
||||
}
|
||||
if($storyType == 'requirement' and $story->type == 'story') echo '<span class="label label-badge label-light">SR</span> ';
|
||||
if($story->parent > 0 and isset($story->parentName)) $story->title = "{$story->parentName} / {$story->title}";
|
||||
if(isset($branches[$story->branch]) and $showBranch and $this->config->vision == 'rnd') echo "<span class='label label-outline label-badge' title={$branches[$story->branch]}>{$branches[$story->branch]}</span> ";
|
||||
if($story->module and isset($modulePairs[$story->module])) echo "<span class='label label-gray label-badge'>{$modulePairs[$story->module]}</span> ";
|
||||
if($story->parent > 0) echo '<span class="label label-badge label-light" title="' . $this->lang->story->children . '">' . $this->lang->story->childrenAB . '</span> ';
|
||||
echo $canView ? html::a($storyLink, $story->title, '', "title='$story->title' style='color: $story->color' data-app='$tab'") : "<span style='color: $story->color'>{$story->title}</span>";
|
||||
$titleHtml = '';
|
||||
if($storyType == 'requirement' and $story->type == 'story') $titleHtml = '<span class="label label-badge label-light">SR</span> ';
|
||||
if($story->parent > 0 and isset($story->parentName)) $titleHtml = "{$story->parentName} / ";
|
||||
if(isset($branches[$story->branch]) and $showBranch and $this->config->vision == 'rnd') $titleHtml = "<span class='label label-outline label-badge' title={$branches[$story->branch]}>{$branches[$story->branch]}</span> ";
|
||||
if($story->module and isset($modulePairs[$story->module])) $titleHtml = "<span class='label label-gray label-badge'>{$modulePairs[$story->module]}</span> ";
|
||||
if($story->parent > 0) $titleHtml = '<span class="label label-badge label-light" title="' . $this->lang->story->children . '">' . $this->lang->story->childrenAB . '</span> ';
|
||||
echo $canView ? html::a($storyLink, $titleHtml . $story->title, '', "title='$story->title' style='color: $story->color' data-app='$tab'") : "<span style='color: $story->color'>{$titleHtml}{$story->title}</span>";
|
||||
if(!empty($story->children)) echo '<a class="story-toggle" data-id="' . $story->id . '"><i class="icon icon-angle-right"></i></a>';
|
||||
break;
|
||||
case 'plan':
|
||||
@@ -5276,9 +5278,10 @@ class storyModel extends model
|
||||
echo $story->version;
|
||||
break;
|
||||
case 'actions':
|
||||
if($tab == 'execution' || ($tab == 'project' && isset($_SESSION['multiple']) && empty($_SESSION['multiple'])))
|
||||
if($tab == 'execution' or ($tab == 'project' and isset($_SESSION['multiple']) and empty($_SESSION['multiple'])))
|
||||
{
|
||||
$menuType = 'execution';
|
||||
if($storyType == 'requirement') $menuType = 'browse';
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -104,9 +104,9 @@ function copyStoryTitle(num)
|
||||
endPosition = storyTitle.lastIndexOf('[');
|
||||
storyTitle = storyTitle.substr(startPosition, endPosition - startPosition);
|
||||
|
||||
$('#name\\[' + num + '\\]').val(storyTitle);
|
||||
$('#estimate\\[' + num + '\\]').val($('#storyEstimate' + num).val());
|
||||
$('#desc\\[' + num + '\\]').val(($('#storyDesc' + num).val()).replace(/<[^>]+>/g,'').replace(/(\n)+\n/g, "\n").replace(/^\n/g, '').replace(/\t/g, ''));
|
||||
$('#name' + num).val(storyTitle);
|
||||
$('#estimate' + num).val($('#storyEstimate' + num).val());
|
||||
$('#desc' + num).val(($('#storyDesc' + num).val()).replace(/<[^>]+>/g,'').replace(/(\n)+\n/g, "\n").replace(/^\n/g, '').replace(/\t/g, ''));
|
||||
|
||||
var storyPri = $('#storyPri' + num).val();
|
||||
if(storyPri == 0) $('#pri' + num ).val('3');
|
||||
|
||||
@@ -125,6 +125,7 @@ class taskModel extends model
|
||||
->setIF(is_numeric($this->post->left), 'left', (float)$this->post->left)
|
||||
->setDefault('openedBy', $this->app->user->account)
|
||||
->setDefault('openedDate', helper::now())
|
||||
->setDefault('vision', $this->config->vision)
|
||||
->cleanINT('execution,story,module')
|
||||
->stripTags($this->config->task->editor->create['id'], $this->config->allowedTags)
|
||||
->join('mailto', ',')
|
||||
@@ -189,6 +190,7 @@ class taskModel extends model
|
||||
if($bugID > 0)
|
||||
{
|
||||
$this->dao->update(TABLE_TASK)->set('fromBug')->eq($bugID)->where('id')->eq($taskID)->exec();
|
||||
$this->dao->update(TABLE_BUG)->set('toTask')->eq($taskID)->where('id')->eq($bugID)->exec();
|
||||
$this->loadModel('action')->create('bug', $bugID, 'converttotask', '', $taskID);
|
||||
}
|
||||
|
||||
|
||||
@@ -389,7 +389,7 @@ class todo extends control
|
||||
$todo = $this->todo->getById($todoID, true);
|
||||
if(!$todo)
|
||||
{
|
||||
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'message' => '404 Not found'));
|
||||
if((defined('RUN_MODE') && RUN_MODE == 'api') or $this->app->viewType == 'json') return $this->send(array('status' => 'fail', 'message' => '404 Not found'));
|
||||
return print(js::error($this->lang->notFound) . js::locate('back'));
|
||||
}
|
||||
|
||||
|
||||
@@ -355,7 +355,7 @@ class tree extends control
|
||||
$parentModules = $this->tree->getParents($currentModuleID);
|
||||
$newModule = (version_compare($execution->openedVersion, '4.1', '>') and $products) ? true : false;
|
||||
|
||||
$title = $this->lang->tree->manageExecution;
|
||||
$title = $execution->multiple ? $this->lang->tree->manageExecution : $this->lang->tree->manageProject;
|
||||
$position[] = html::a($this->createLink('execution', 'task', "executionID=$rootID"), $execution->name);
|
||||
$position[] = $this->lang->tree->manageExecution;
|
||||
|
||||
@@ -363,6 +363,7 @@ class tree extends control
|
||||
$this->view->position = $position;
|
||||
$this->view->rootID = $rootID;
|
||||
$this->view->productID = $productID;
|
||||
$this->view->execution = $execution;
|
||||
$this->view->allProject = $executions;
|
||||
$this->view->newModule = $newModule;
|
||||
$this->view->modules = $this->tree->getTaskTreeMenu($rootID, $productID, $rooteModuleID = 0, array('treeModel', 'createTaskManageLink'), 'allModule');
|
||||
|
||||
@@ -18,7 +18,8 @@ $lang->tree->browseTask = 'Aufgaben Modul verwalten';
|
||||
$lang->tree->manage = 'Modul verwalten';
|
||||
$lang->tree->fix = 'Fix';
|
||||
$lang->tree->manageProduct = "Verwalte {$lang->productCommon}";
|
||||
$lang->tree->manageExecution = "Verwalte {$lang->executionCommon}";
|
||||
$lang->tree->manageProject = "Verwalte {$lang->projectCommon}";
|
||||
$lang->tree->manageExecution = "Verwalte {$lang->execution->common}";
|
||||
$lang->tree->manageLine = "Manage Product Line";
|
||||
$lang->tree->manageBug = 'Verwalte Bugs';
|
||||
$lang->tree->manageCase = 'Verwalte Fälle';
|
||||
@@ -34,7 +35,8 @@ $lang->tree->manageCaseChild = 'Verwalte Fälle';
|
||||
$lang->tree->manageCaselibChild = 'Verwalte Bibliothek';
|
||||
$lang->tree->manageDashboard = 'Manage Dashboard Module';
|
||||
$lang->tree->manageDashboardChild = 'Manage Dashboard Child Module';
|
||||
$lang->tree->manageTaskChild = "Verwalte {$lang->executionCommon}";
|
||||
$lang->tree->manageProjectChild = "Verwalte {$lang->projectCommon}";
|
||||
$lang->tree->manageTaskChild = "Verwalte {$lang->execution->common}";
|
||||
$lang->tree->syncFromProduct = "Copy from Other {$lang->productCommon}s";
|
||||
$lang->tree->dragAndSort = "Ziehen und Sotieren";
|
||||
$lang->tree->sort = "Sortieren";
|
||||
|
||||
@@ -18,6 +18,7 @@ $lang->tree->browseTask = 'Manage Task Module';
|
||||
$lang->tree->manage = 'Manage Module';
|
||||
$lang->tree->fix = 'Fix Module';
|
||||
$lang->tree->manageProduct = "Manage {$lang->productCommon} Modules";
|
||||
$lang->tree->manageProject = "Manage {$lang->projectCommon} Modules";
|
||||
$lang->tree->manageExecution = "Manage {$lang->execution->common} Modules";
|
||||
$lang->tree->manageLine = "Manage Product Line";
|
||||
$lang->tree->manageBug = 'Manage Bug';
|
||||
@@ -34,6 +35,7 @@ $lang->tree->manageCaseChild = 'Manage Child Cases';
|
||||
$lang->tree->manageCaselibChild = 'Manage Child Libraries';
|
||||
$lang->tree->manageDashboard = 'Manage Dashboard Module';
|
||||
$lang->tree->manageDashboardChild = 'Manage Dashboard Child Module';
|
||||
$lang->tree->manageProjectChild = "Manage Child {$lang->projectCommon} Modules";
|
||||
$lang->tree->manageTaskChild = "Manage Child {$lang->execution->common} Modules";
|
||||
$lang->tree->syncFromProduct = "Copy from Other {$lang->productCommon}s";
|
||||
$lang->tree->dragAndSort = "Drag to order";
|
||||
|
||||
@@ -18,7 +18,8 @@ $lang->tree->browseTask = 'Gérer les Modules Tâche';
|
||||
$lang->tree->manage = 'Gérer les Modules';
|
||||
$lang->tree->fix = 'Corrigez Module';
|
||||
$lang->tree->manageProduct = "Gérer les Modules {$lang->productCommon}";
|
||||
$lang->tree->manageExecution = "Gérer les Modules {$lang->executionCommon}";
|
||||
$lang->tree->manageProject = "Gérer les Modules {$lang->projectCommon}";
|
||||
$lang->tree->manageExecution = "Gérer les Modules {$lang->execution->common}";
|
||||
$lang->tree->manageLine = 'Gérer Ligne Produit';
|
||||
$lang->tree->manageBug = 'Gérer Bugs';
|
||||
$lang->tree->manageCase = 'Gérer CasTests';
|
||||
@@ -34,7 +35,8 @@ $lang->tree->manageCaseChild = 'Gérer Sous-CasTests';
|
||||
$lang->tree->manageCaselibChild = 'Gérer Sous-Librairies';
|
||||
$lang->tree->manageDashboard = 'Manage Dashboard Module';
|
||||
$lang->tree->manageDashboardChild = 'Manage Dashboard Child Module';
|
||||
$lang->tree->manageTaskChild = "Gérer Sous-Modules {$lang->executionCommon}";
|
||||
$lang->tree->manageProjectChild = "Gérer Sous-Modules {$lang->projectCommon}";
|
||||
$lang->tree->manageTaskChild = "Gérer Sous-Modules {$lang->execution->common}";
|
||||
$lang->tree->syncFromProduct = "Copier d'un autre {$lang->productCommon}";
|
||||
$lang->tree->dragAndSort = "Faites glisser pour ordonner";
|
||||
$lang->tree->sort = "Ordonnez";
|
||||
|
||||
@@ -18,6 +18,7 @@ $lang->tree->browseTask = '任务模块维护';
|
||||
$lang->tree->manage = '维护模块';
|
||||
$lang->tree->fix = '修正数据';
|
||||
$lang->tree->manageProduct = "维护{$lang->productCommon}视图模块";
|
||||
$lang->tree->manageProject = "维护{$lang->projectCommon}视图模块";
|
||||
$lang->tree->manageExecution = "维护{$lang->execution->common}视图模块";
|
||||
$lang->tree->manageLine = "维护产品线";
|
||||
$lang->tree->manageBug = '维护测试视图模块';
|
||||
@@ -34,6 +35,7 @@ $lang->tree->manageCaseChild = '维护用例子模块';
|
||||
$lang->tree->manageCaselibChild = '维护用例库子模块';
|
||||
$lang->tree->manageDashboard = '维护仪表盘模块';
|
||||
$lang->tree->manageDashboardChild = '维护仪表盘子模块';
|
||||
$lang->tree->manageProjectChild = "维护{$lang->projectCommon}子模块";
|
||||
$lang->tree->manageTaskChild = "维护{$lang->execution->common}子模块";
|
||||
$lang->tree->syncFromProduct = '复制模块';
|
||||
$lang->tree->dragAndSort = "拖放排序";
|
||||
|
||||
@@ -998,6 +998,7 @@ class treeModel extends model
|
||||
|
||||
if($linkObject)
|
||||
{
|
||||
$branch = zget($extra, 'branchID', 0);
|
||||
/* Get object paths of this execution. */
|
||||
if(strpos(',story,case,', ",$linkObject,") !== false)
|
||||
{
|
||||
@@ -1009,7 +1010,7 @@ class treeModel extends model
|
||||
->orWhere('t4.project')->eq($executionID)->markRight(1)
|
||||
->andWhere('t3.deleted')->eq(0)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->beginIF(isset($extra['branchID']))->andWhere('t2.branch')->eq(zget($extra, 'branchID', 0))->fi()
|
||||
->beginIF(isset($extra['branchID']) and $branch !== 'all')->andWhere('t2.branch')->eq($branch)->fi()
|
||||
->fetchPairs();
|
||||
}
|
||||
elseif($linkObject == 'bug' and strpos(',project,execution,', ",{$this->app->tab},") !== false)
|
||||
@@ -1018,7 +1019,7 @@ class treeModel extends model
|
||||
->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module = t2.id')
|
||||
->where('t1.deleted')->eq(0)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->andWhere('t1.branch')->eq(zget($extra, 'branchID', 0))
|
||||
->beginIF(isset($extra['branchID']) and $branch !== 'all')->andWhere('t1.branch')->eq($branch)->fi()
|
||||
->andWhere("t1.{$this->app->tab}")->eq($executionID)
|
||||
->fetchPairs();
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ li.story-item > .tree-actions .tree-action[data-type=delete] {display: none;}
|
||||
<form id='childrenForm' method='post' target='hiddenwin' action='<?php echo $this->createLink('tree', 'manageChild', "root={$root->id}&viewType=task");?>'>
|
||||
<div class='panel'>
|
||||
<div class='panel-heading'>
|
||||
<div class='panel-title'><?php echo $lang->tree->manageTaskChild;?></div>
|
||||
<div class='panel-title'><?php echo $execution->multiple ? $lang->tree->manageTaskChild : $lang->tree->manageProjectChild;?></div>
|
||||
</div>
|
||||
<div class='panel-body'>
|
||||
<table class='table table-form table-auto'>
|
||||
|
||||
@@ -405,18 +405,6 @@ $config->delete['17_8'][] = 'extension/max/common/ext/lang/fr/crystal.php';
|
||||
$config->delete['17_8'][] = 'extension/max/common/ext/lang/vi/crystal.php';
|
||||
$config->delete['18_0'][] = 'extension/max/custom/ext/view/mode.zentaomax.html.hook.php';
|
||||
$config->delete['18_0'][] = 'extension/max/my/ext/view/audit.html.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/common/ext/lang/de/report.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/common/ext/lang/en/report.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/common/ext/lang/fr/report.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/common/ext/lang/vi/report.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/common/ext/lang/zh-cn/report.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/common/ext/lang/zh-tw/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/de/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/en/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/fr/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/vi/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/zh-cn/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/common/ext/lang/zh-tw/report.php';
|
||||
$config->delete['18_0'][] = 'extension/max/block/ext/config/zentaomax.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/control/ajaxgetcommitinfo.php';
|
||||
$config->delete['18_0'][] = 'extension/biz/repo/ext/control/ajaxgetbranchesandtags.php';
|
||||
|
||||
@@ -7622,12 +7622,19 @@ class upgradeModel extends model
|
||||
if($project->status == 'closed') $this->action->create('project', $projectID, 'closedbysystem');
|
||||
|
||||
$project->id = $projectID;
|
||||
$this->createProjectDocLib($project);
|
||||
if($fromMode == 'classic')
|
||||
{
|
||||
$this->dao->update(TABLE_PROJECT)->set('multiple')->eq('0')->where('id')->eq($sprint->id)->exec();
|
||||
$this->dao->update(TABLE_DOCLIB)->set('project')->eq($projectID)->set('type')->eq('project')->set('execution')->eq(0)->where('execution')->eq($sprint->id)->andWhere('type')->eq('execution')->exec();
|
||||
$this->dao->update(TABLE_DOC)->set('project')->eq($projectID)->set('execution')->eq(0)->where('execution')->eq($sprint->id)->exec();
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->createProjectDocLib($project);
|
||||
}
|
||||
|
||||
$productIdList = $this->dao->select('product')->from(TABLE_PROJECTPRODUCT)->where('project')->eq($sprint->id)->fetchPairs();
|
||||
$this->processMergedData($programID, $projectID, '', $productIdList, array($sprint->id));
|
||||
|
||||
if($fromMode == 'classic') $this->dao->update(TABLE_PROJECT)->set('multiple')->eq('0')->where('id')->eq($sprint->id)->exec();
|
||||
}
|
||||
|
||||
$this->fixProjectPath($programID);
|
||||
|
||||
+20
-10
@@ -124,7 +124,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Modify story title. */
|
||||
$this->loadModel('story');
|
||||
@@ -167,7 +168,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Set the menu. */
|
||||
$this->view->userList = $this->user->setUserList($users, $userID);
|
||||
@@ -208,7 +210,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Set menu. */
|
||||
$this->view->userList = $this->user->setUserList($users, $userID);
|
||||
@@ -248,7 +251,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Set menu. */
|
||||
$this->view->userList = $this->user->setUserList($users, $userID);
|
||||
@@ -299,7 +303,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Append id for secend sort. */
|
||||
$sort = common::appendOrder($orderBy);
|
||||
@@ -355,7 +360,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -395,7 +401,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -435,7 +442,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* Load pager. */
|
||||
$this->app->loadClass('pager', $static = true);
|
||||
@@ -468,7 +476,8 @@ class user extends control
|
||||
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
$this->view->title = "USER #$user->id $user->account/" . $this->lang->user->profile;
|
||||
$this->view->position[] = $this->lang->user->common;
|
||||
@@ -1204,7 +1213,8 @@ class user extends control
|
||||
{
|
||||
$user = $this->user->getById($userID, 'id');
|
||||
$account = $user->account;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'id');
|
||||
$deptID = $this->app->user->admin ? 0 : $this->app->user->dept;
|
||||
$users = $this->loadModel('dept')->getDeptUserPairs($deptID, 'id');
|
||||
|
||||
/* set menus. */
|
||||
$this->view->userList = $this->user->setUserList($users, $userID);
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
sonar.projectKey=zentaopms
|
||||
sonar.sourceEncoding=UTF-8
|
||||
sonar.qualitygate.wait=true
|
||||
sonar.coverage.exclusions=**/*.*
|
||||
sonar.inclusions=**/**.php
|
||||
sonar.exclusions=**/*.bak,**/*.sql,**/*.js,**/*.css,**/*.yaml,**/*.zip,**/*.out
|
||||
|
||||
+120
-109
@@ -3,119 +3,130 @@ $builder = new stdclass();
|
||||
|
||||
$builder->company = array('rows' => 2, 'extends' => array('company'));
|
||||
$builder->user = array('rows' => 1000, 'extends' => array('user'));
|
||||
$builder->todo = array('rows' => 2000, 'extends' => array('todo'));
|
||||
$builder->todocycle = array('rows' => 5, 'extends' => array('todo','todocycle'));
|
||||
$builder->effort = array('rows' => 100, 'extends' => array('effort'));
|
||||
$builder->usergroup = array('rows' => 600, 'extends' => array('usergroup'));
|
||||
$builder->usercontact = array('rows' => 61, 'extends' => array('usercontact'));
|
||||
$builder->userview = array('rows' => 400, 'extends' => array('userview'));
|
||||
$builder->dept = array('rows' => 100, 'extends' => array('dept'));
|
||||
$builder->action = array('rows' => 100, 'extends' => array('action'));
|
||||
$builder->history = array('rows' => 100, 'extends' => array('history'));
|
||||
$builder->file = array('rows' => 100, 'extends' => array('file'));
|
||||
$builder->score = array('rows' => 100, 'extends' => array('score'));
|
||||
$builder->extension = array('rows' => 10, 'extends' => array('extension'));
|
||||
//$builder->todo = array('rows' => 2000, 'extends' => array('todo'));
|
||||
//$builder->todocycle = array('rows' => 5, 'extends' => array('todo','todocycle'));
|
||||
//$builder->effort = array('rows' => 100, 'extends' => array('effort'));
|
||||
//$builder->usergroup = array('rows' => 600, 'extends' => array('usergroup'));
|
||||
//$builder->usercontact = array('rows' => 61, 'extends' => array('usercontact'));
|
||||
//$builder->userview = array('rows' => 400, 'extends' => array('userview'));
|
||||
//$builder->action = array('rows' => 100, 'extends' => array('action'));
|
||||
//$builder->history = array('rows' => 100, 'extends' => array('history'));
|
||||
//$builder->file = array('rows' => 100, 'extends' => array('file'));
|
||||
//$builder->score = array('rows' => 100, 'extends' => array('score'));
|
||||
//$builder->extension = array('rows' => 10, 'extends' => array('extension'));
|
||||
|
||||
$builder->program = array('rows' => 10, 'extends' => array('project', 'program'));
|
||||
$builder->project = array('rows' => 90, 'extends' => array('project', 'project'));
|
||||
$builder->sprint = array('rows' => 600, 'extends' => array('project', 'execution'));
|
||||
$builder->projectalone = array('rows' => 20, 'extends' => array('project', 'projectalone'));
|
||||
$builder->pipeline = array('rows' => 5, 'extends' => array('pipeline'));
|
||||
$builder->repo = array('rows' => 1, 'extends' => array('repo'));
|
||||
$builder->job = array('rows' => 2, 'extends' => array('job'));
|
||||
$builder->mr = array('rows' => 1, 'extends' => array('mr'));
|
||||
|
||||
$builder->story = array('rows' => 400, 'extends' => array('story'));
|
||||
$builder->childstory = array('rows' => 50, 'extends' => array('story','childstory'));
|
||||
$builder->storyreview = array('rows' => 100, 'extends' => array('storyreview'));
|
||||
$builder->storymodule = array('rows' => 800, 'extends' => array('module','storymodule'));
|
||||
$builder->storymoduleson = array('rows' => 400, 'extends' => array('module','storymoduleson'));
|
||||
$builder->storyplan = array('rows' => 400, 'extends' => array('planstory'));
|
||||
$builder->storystage = array('rows' => 450, 'extends' => array('storystage'));
|
||||
$builder->storyspec = array('rows' => 570, 'extends' => array('storyspec'));
|
||||
$builder->storyestimate = array('rows' => 6, 'extends' => array('storyestimate'));
|
||||
$builder->relation = array('rows' => 12, 'extends' => array('relation'));
|
||||
$builder->task = array('rows' => 600, 'extends' => array('task','task'));
|
||||
$builder->taskmore = array('rows' => 300, 'extends' => array('task','moretask'));
|
||||
$builder->taskspec = array('rows' => 600, 'extends' => array('taskspec'));
|
||||
$builder->taskmodule = array('rows' => 1800, 'extends' => array('module','taskmodule'));
|
||||
$builder->taskmoduleson = array('rows' => 600, 'extends' => array('module','taskmoduleson'));
|
||||
$builder->taskestimate = array('rows' => 600, 'extends' => array('taskestimate'));
|
||||
$builder->taskson = array('rows' => 10, 'extends' => array('task', 'taskson'));
|
||||
$builder->case = array('rows' => 400, 'extends' => array('case'));
|
||||
$builder->libcase = array('rows' => 10, 'extends' => array('case','libcase'));
|
||||
$builder->unitcase = array('rows' => 150, 'extends' => array('case','unitcase'));
|
||||
$builder->casestep = array('rows' => 400, 'extends' => array('casestep'));
|
||||
$builder->casemodule = array('rows' => 100, 'extends' => array('module', 'casemodule'));
|
||||
$builder->casemoduleson = array('rows' => 200, 'extends' => array('module', 'casemoduleson'));
|
||||
$builder->bug = array('rows' => 300, 'extends' => array('bug'));
|
||||
$builder->morebug = array('rows' => 15, 'extends' => array('bug','morebug'));
|
||||
$builder->bugmodule = array('rows' => 100, 'extends' => array('module','bugmodule'));
|
||||
$builder->bugmoduleson = array('rows' => 200, 'extends' => array('module','bugmoduleson'));
|
||||
$builder->feedback = array('rows' => 100, 'extends' => array('feedback'));
|
||||
$builder->feedbackmodule = array('rows' => 100, 'extends' => array('module','feedbackmodule'));
|
||||
$builder->feedbackmoduleson = array('rows' => 200, 'extends' => array('module','feedbackmoduleson'));
|
||||
|
||||
$builder->testtask = array('rows' => 100, 'extends' => array('testtask'));
|
||||
$builder->testresult = array('rows' => 70, 'extends' => array('testresult'));
|
||||
$builder->testrun = array('rows' => 70, 'extends' => array('testrun'));
|
||||
$builder->testreport = array('rows' => 10, 'extends' => array('testreport'));
|
||||
$builder->testsuite = array('rows' => 201, 'extends' => array('testsuite'));
|
||||
$builder->suitecase = array('rows' => 400, 'extends' => array('suitecase'));
|
||||
|
||||
$builder->product = array('rows' => 100, 'extends' => array('product'));
|
||||
$builder->productalone = array('rows' => 20, 'extends' => array('product','productalone'));
|
||||
$builder->productline = array('rows' => 20, 'extends' => array('module', 'productline'));
|
||||
$builder->productplan = array('rows' => 70, 'extends' => array('productplan'));
|
||||
$builder->productsonplan = array('rows' => 10, 'extends' => array('productplan', 'productsonplan'));
|
||||
$builder->branch = array('rows' => 240, 'extends' => array('branch'));
|
||||
$builder->projectproduct = array('rows' => 200, 'extends' => array('projectproduct'));
|
||||
$builder->projectproductalone = array('rows' => 28, 'extends' => array('projectproduct','projectproductalone'));
|
||||
$builder->projectstory = array('rows' => 200, 'extends' => array('projectstory'));
|
||||
$builder->projectcase = array('rows' => 400, 'extends' => array('projectcase'));
|
||||
$builder->executionstory = array('rows' => 180, 'extends' => array('projectstory','executionstory'));
|
||||
|
||||
$builder->kanbanspace = array('rows' => 50, 'extends' => array('kanbanspace'));
|
||||
$builder->kanban = array('rows' => 100, 'extends' => array('kanban'));
|
||||
$builder->kanbanregion = array('rows' => 100, 'extends' => array('kanbanregion','kanbanregion'));
|
||||
$builder->kanbangroup = array('rows' => 100, 'extends' => array('kanbangroup','kanbangroup'));
|
||||
$builder->kanbanlane = array('rows' => 100, 'extends' => array('kanbanlane','kanbanlane'));
|
||||
$builder->kanbancolumn = array('rows' => 400, 'extends' => array('kanbancolumn','kanbancolumn'));
|
||||
$builder->kanbancard = array('rows' => 1000, 'extends' => array('kanbancard','kanbancard'));
|
||||
$builder->kanbancell = array('rows' => 400, 'extends' => array('kanbancell','kanbancell'));
|
||||
|
||||
$builder->kanbanregionproject = array('rows' => 180, 'extends' => array('kanbanregion','kanbanregionproject'));
|
||||
$builder->kanbangroupproject = array('rows' => 540, 'extends' => array('kanbangroup','kanbangroupproject'));
|
||||
$builder->kanbanlaneproject = array('rows' => 540, 'extends' => array('kanbanlane','kanbanlaneproject'));
|
||||
$builder->kanbancolumnproject = array('rows' => 4860, 'extends' => array('kanbancolumn','kanbancolumnproject'));
|
||||
$builder->kanbancellproject = array('rows' => 4860, 'extends' => array('kanbancell','kanbancellproject'));
|
||||
|
||||
|
||||
$builder->team = array('rows' => 400, 'extends' => array('team'));
|
||||
$builder->teamtask = array('rows' => 20, 'extends' => array('team', 'teamtask'));
|
||||
$builder->stakeholder = array('rows' => 1, 'extends' => array('stakeholder'));
|
||||
$builder->expect = array('rows' => 270, 'extends' => array('expect'));
|
||||
$builder->stageson = array('rows' => 30, 'extends' => array('project', 'executionson'));
|
||||
|
||||
$builder->doclib = array('rows' => 910, 'extends' => array('doclib'));
|
||||
$builder->doc = array('rows' => 900, 'extends' => array('doc'));
|
||||
$builder->doccontent = array('rows' => 910, 'extends' => array('doccontent'));
|
||||
$builder->docmodule = array('rows' => 100, 'extends' => array('module','docmodule'));
|
||||
$builder->docmoduleon = array('rows' => 200, 'extends' => array('module','docmoduleson'));
|
||||
|
||||
$builder->build = array('rows' => 20, 'extends' => array('build'));
|
||||
$builder->release = array('rows' => 10, 'extends' => array('release'));
|
||||
$builder->design = array('rows' => 120, 'extends' => array('design'));
|
||||
$builder->designspec = array('rows' => 120, 'extends' => array('designspec'));
|
||||
|
||||
$builder->stage = array('rows' => 6, 'extends' => array('stage'));
|
||||
$builder->webhook = array('rows' => 7, 'extends' => array('webhook'));
|
||||
$builder->entry = array('rows' => 1, 'extends' => array('entry'));
|
||||
$builder->log = array('rows' => 10, 'extends' => array('log'));
|
||||
$builder->weeklyreport = array('rows' => 10, 'extends' => array('weeklyreport'));
|
||||
$builder->metting = array('rows' => 10, 'extends' => array('meeting'));
|
||||
$builder->usertpl = array('rows' => 10, 'extends' => array('usertpl'));
|
||||
|
||||
$builder->pipeline = array('rows' => 5, 'extends' => array('pipeline'));
|
||||
$builder->holiday = array('rows' => 100, 'extends' => array('holiday'));
|
||||
$builder->repo = array('rows' => 1, 'extends' => array('repo'));
|
||||
$builder->job = array('rows' => 2, 'extends' => array('job'));
|
||||
$builder->mr = array('rows' => 1, 'extends' => array('mr'));
|
||||
$builder->oauth = array('rows' => 100, 'extends' => array('oauth'));
|
||||
$builder->notify = array('rows' => 10, 'extends' => array('notify'));
|
||||
//$builder->todo = array('rows' => 2000, 'extends' => array('todo'));
|
||||
//$builder->todocycle = array('rows' => 5, 'extends' => array('todo','todocycle'));
|
||||
//$builder->effort = array('rows' => 100, 'extends' => array('effort'));
|
||||
//$builder->usergroup = array('rows' => 600, 'extends' => array('usergroup'));
|
||||
//$builder->usercontact = array('rows' => 61, 'extends' => array('usercontact'));
|
||||
//$builder->userview = array('rows' => 400, 'extends' => array('userview'));
|
||||
//$builder->action = array('rows' => 100, 'extends' => array('action'));
|
||||
//$builder->history = array('rows' => 100, 'extends' => array('history'));
|
||||
//$builder->file = array('rows' => 100, 'extends' => array('file'));
|
||||
//$builder->score = array('rows' => 100, 'extends' => array('score'));
|
||||
//$builder->extension = array('rows' => 10, 'extends' => array('extension'));
|
||||
//$builder->story = array('rows' => 400, 'extends' => array('story'));
|
||||
//$builder->childstory = array('rows' => 50, 'extends' => array('story','childstory'));
|
||||
//$builder->storyreview = array('rows' => 100, 'extends' => array('storyreview'));
|
||||
//$builder->storymodule = array('rows' => 800, 'extends' => array('module','storymodule'));
|
||||
//$builder->storymoduleson = array('rows' => 400, 'extends' => array('module','storymoduleson'));
|
||||
//$builder->storyplan = array('rows' => 400, 'extends' => array('planstory'));
|
||||
//$builder->storystage = array('rows' => 450, 'extends' => array('storystage'));
|
||||
//$builder->storyspec = array('rows' => 570, 'extends' => array('storyspec'));
|
||||
//$builder->storyestimate = array('rows' => 6, 'extends' => array('storyestimate'));
|
||||
//$builder->relation = array('rows' => 12, 'extends' => array('relation'));
|
||||
//$builder->task = array('rows' => 600, 'extends' => array('task','task'));
|
||||
//$builder->taskmore = array('rows' => 300, 'extends' => array('task','moretask'));
|
||||
//$builder->taskspec = array('rows' => 600, 'extends' => array('taskspec'));
|
||||
//$builder->taskmodule = array('rows' => 1800, 'extends' => array('module','taskmodule'));
|
||||
//$builder->taskmoduleson = array('rows' => 600, 'extends' => array('module','taskmoduleson'));
|
||||
//$builder->taskestimate = array('rows' => 600, 'extends' => array('taskestimate'));
|
||||
//$builder->taskson = array('rows' => 10, 'extends' => array('task', 'taskson'));
|
||||
//$builder->case = array('rows' => 400, 'extends' => array('case'));
|
||||
//$builder->libcase = array('rows' => 10, 'extends' => array('case','libcase'));
|
||||
//$builder->unitcase = array('rows' => 150, 'extends' => array('case','unitcase'));
|
||||
//$builder->casestep = array('rows' => 400, 'extends' => array('casestep'));
|
||||
//$builder->casemodule = array('rows' => 100, 'extends' => array('module', 'casemodule'));
|
||||
//$builder->casemoduleson = array('rows' => 200, 'extends' => array('module', 'casemoduleson'));
|
||||
//$builder->bug = array('rows' => 300, 'extends' => array('bug'));
|
||||
//$builder->morebug = array('rows' => 15, 'extends' => array('bug','morebug'));
|
||||
//$builder->bugmodule = array('rows' => 100, 'extends' => array('module','bugmodule'));
|
||||
//$builder->bugmoduleson = array('rows' => 200, 'extends' => array('module','bugmoduleson'));
|
||||
//$builder->feedback = array('rows' => 100, 'extends' => array('feedback'));
|
||||
//$builder->feedbackmodule = array('rows' => 100, 'extends' => array('module','feedbackmodule'));
|
||||
//$builder->feedbackmoduleson = array('rows' => 200, 'extends' => array('module','feedbackmoduleson'));
|
||||
//
|
||||
//$builder->testtask = array('rows' => 100, 'extends' => array('testtask'));
|
||||
//$builder->testresult = array('rows' => 70, 'extends' => array('testresult'));
|
||||
//$builder->testrun = array('rows' => 70, 'extends' => array('testrun'));
|
||||
//$builder->testreport = array('rows' => 10, 'extends' => array('testreport'));
|
||||
//$builder->testsuite = array('rows' => 201, 'extends' => array('testsuite'));
|
||||
//$builder->suitecase = array('rows' => 400, 'extends' => array('suitecase'));
|
||||
//
|
||||
//$builder->product = array('rows' => 100, 'extends' => array('product'));
|
||||
//$builder->productalone = array('rows' => 20, 'extends' => array('product','productalone'));
|
||||
//$builder->productline = array('rows' => 20, 'extends' => array('module', 'productline'));
|
||||
//$builder->productplan = array('rows' => 70, 'extends' => array('productplan'));
|
||||
//$builder->productsonplan = array('rows' => 10, 'extends' => array('productplan', 'productsonplan'));
|
||||
//$builder->branch = array('rows' => 240, 'extends' => array('branch'));
|
||||
//$builder->projectproduct = array('rows' => 200, 'extends' => array('projectproduct'));
|
||||
//$builder->projectproductalone = array('rows' => 28, 'extends' => array('projectproduct','projectproductalone'));
|
||||
//$builder->projectstory = array('rows' => 200, 'extends' => array('projectstory'));
|
||||
//$builder->projectcase = array('rows' => 400, 'extends' => array('projectcase'));
|
||||
//$builder->executionstory = array('rows' => 180, 'extends' => array('projectstory','executionstory'));
|
||||
//
|
||||
//$builder->kanbanspace = array('rows' => 50, 'extends' => array('kanbanspace'));
|
||||
//$builder->kanban = array('rows' => 100, 'extends' => array('kanban'));
|
||||
//$builder->kanbanregion = array('rows' => 100, 'extends' => array('kanbanregion','kanbanregion'));
|
||||
//$builder->kanbangroup = array('rows' => 100, 'extends' => array('kanbangroup','kanbangroup'));
|
||||
//$builder->kanbanlane = array('rows' => 100, 'extends' => array('kanbanlane','kanbanlane'));
|
||||
//$builder->kanbancolumn = array('rows' => 400, 'extends' => array('kanbancolumn','kanbancolumn'));
|
||||
//$builder->kanbancard = array('rows' => 1000, 'extends' => array('kanbancard','kanbancard'));
|
||||
//$builder->kanbancell = array('rows' => 400, 'extends' => array('kanbancell','kanbancell'));
|
||||
//
|
||||
//$builder->kanbanregionproject = array('rows' => 180, 'extends' => array('kanbanregion','kanbanregionproject'));
|
||||
//$builder->kanbangroupproject = array('rows' => 540, 'extends' => array('kanbangroup','kanbangroupproject'));
|
||||
//$builder->kanbanlaneproject = array('rows' => 540, 'extends' => array('kanbanlane','kanbanlaneproject'));
|
||||
//$builder->kanbancolumnproject = array('rows' => 4860, 'extends' => array('kanbancolumn','kanbancolumnproject'));
|
||||
//$builder->kanbancellproject = array('rows' => 4860, 'extends' => array('kanbancell','kanbancellproject'));
|
||||
//
|
||||
//
|
||||
//$builder->team = array('rows' => 400, 'extends' => array('team'));
|
||||
//$builder->teamtask = array('rows' => 20, 'extends' => array('team', 'teamtask'));
|
||||
//$builder->stakeholder = array('rows' => 1, 'extends' => array('stakeholder'));
|
||||
//$builder->expect = array('rows' => 270, 'extends' => array('expect'));
|
||||
//$builder->stageson = array('rows' => 30, 'extends' => array('project', 'executionson'));
|
||||
//
|
||||
//$builder->doclib = array('rows' => 910, 'extends' => array('doclib'));
|
||||
//$builder->doc = array('rows' => 900, 'extends' => array('doc'));
|
||||
//$builder->doccontent = array('rows' => 910, 'extends' => array('doccontent'));
|
||||
//$builder->docmodule = array('rows' => 100, 'extends' => array('module','docmodule'));
|
||||
//$builder->docmoduleon = array('rows' => 200, 'extends' => array('module','docmoduleson'));
|
||||
//
|
||||
//$builder->build = array('rows' => 20, 'extends' => array('build'));
|
||||
//$builder->release = array('rows' => 10, 'extends' => array('release'));
|
||||
//$builder->design = array('rows' => 120, 'extends' => array('design'));
|
||||
//$builder->designspec = array('rows' => 120, 'extends' => array('designspec'));
|
||||
//
|
||||
//$builder->stage = array('rows' => 6, 'extends' => array('stage'));
|
||||
//$builder->webhook = array('rows' => 7, 'extends' => array('webhook'));
|
||||
//$builder->entry = array('rows' => 1, 'extends' => array('entry'));
|
||||
//$builder->log = array('rows' => 10, 'extends' => array('log'));
|
||||
//$builder->weeklyreport = array('rows' => 10, 'extends' => array('weeklyreport'));
|
||||
//$builder->metting = array('rows' => 10, 'extends' => array('meeting'));
|
||||
//$builder->usertpl = array('rows' => 10, 'extends' => array('usertpl'));
|
||||
//
|
||||
//$builder->holiday = array('rows' => 100, 'extends' => array('holiday'));
|
||||
//$builder->oauth = array('rows' => 100, 'extends' => array('oauth'));
|
||||
//$builder->notify = array('rows' => 10, 'extends' => array('notify'));
|
||||
|
||||
@@ -32,26 +32,26 @@ class Processor
|
||||
{
|
||||
$this->dao->begin();
|
||||
|
||||
$this->initBassicSql();
|
||||
//$this->initBassicSql();
|
||||
$this->initDept();
|
||||
$this->initUser();
|
||||
$this->initProgram();
|
||||
$this->initProduct();
|
||||
$this->initPlan();
|
||||
//$this->initProduct();
|
||||
//$this->initPlan();
|
||||
$this->initProject();
|
||||
$this->initBuild();
|
||||
$this->initTask();
|
||||
//$this->initBuild();
|
||||
//$this->initTask();
|
||||
$this->initExecution();
|
||||
$this->initRelease();
|
||||
$this->initStakeholder();
|
||||
$this->initUserquery();
|
||||
$this->initMessage();
|
||||
$this->initUpdateKanban();
|
||||
$this->initStory();
|
||||
$this->initBug();
|
||||
$this->initTest();
|
||||
$this->initTodo();
|
||||
$this->initSonPlan();
|
||||
//$this->initRelease();
|
||||
//$this->initStakeholder();
|
||||
//$this->initUserquery();
|
||||
//$this->initMessage();
|
||||
//$this->initUpdateKanban();
|
||||
//$this->initStory();
|
||||
//$this->initBug();
|
||||
//$this->initTest();
|
||||
//$this->initTodo();
|
||||
//$this->initSonPlan();
|
||||
|
||||
$this->dao->commit();
|
||||
}
|
||||
|
||||
+11
-1
@@ -46,6 +46,15 @@ function ztfRun($dir)
|
||||
global $config;
|
||||
|
||||
$ztfPath = RUNTIME_ROOT . 'ztf';
|
||||
$modelPath = TEST_BASEHPATH . '/model';
|
||||
|
||||
$runTestPath = '';
|
||||
if(is_array($dir))
|
||||
{
|
||||
foreach($dir as $model) $runTestPath .= " $modelPath/$model";
|
||||
}
|
||||
|
||||
if($runTestPath) $dir = $runTestPath;
|
||||
$command = "$ztfPath $dir";
|
||||
system($command);
|
||||
}
|
||||
@@ -62,7 +71,8 @@ function ztfExtract($dir)
|
||||
global $config;
|
||||
|
||||
$ztfPath = RUNTIME_ROOT . 'ztf';
|
||||
$command = "$ztfPath extract $dir";
|
||||
$testPath = TEST_BASEHPATH;
|
||||
$command = "$ztfPath extract $testPath/$dir";
|
||||
system($command);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -34,4 +33,3 @@ r($action->createTest($objectTypeList[2], $objectIDList[0], $actionTypeList[2]))
|
||||
r($action->createTest($objectTypeList[3], $objectIDList[0], $actionTypeList[3])) && p('objectType,objectId,action,comment') && e('bug,,closed,'); // 测试创建bug 1 closed动态
|
||||
r($action->createTest($objectTypeList[4], $objectIDList[0], $actionTypeList[4], $comment)) && p('objectType,objectId,action,comment') && e('story,,comments,测试备注'); // 测试创建story 1 comment动态
|
||||
r($action->createTest($objectTypeList[2], $objectIDList[0], $actionTypeList[5], '', '', $actor)) && p() && e('0'); // 测试创建游客 logout动态
|
||||
$db->restoreDB();
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
title: zt_action
|
||||
author: auto_getbyid
|
||||
version: "1.0"
|
||||
fields:
|
||||
- field: id
|
||||
range: 101-105
|
||||
- field: objectType
|
||||
range: product,story,productplan,release,project
|
||||
- field: action
|
||||
range: common,extra,opened,created,changed
|
||||
- field: comment
|
||||
range: 1-5
|
||||
prefix: 这是一个系统日志测试备注
|
||||
...
|
||||
@@ -0,0 +1,68 @@
|
||||
-- MySQL dump 10.19 Distrib 10.3.34-MariaDB, for debian-linux-gnu (x86_64)
|
||||
--
|
||||
-- Host: 127.0.0.1 Database: zentao1243
|
||||
-- ------------------------------------------------------
|
||||
-- Server version 5.7.36
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8mb4 */;
|
||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
|
||||
--
|
||||
-- Table structure for table `zt_action`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `zt_action`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `zt_action` (
|
||||
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`objectType` varchar(30) NOT NULL DEFAULT '',
|
||||
`objectID` mediumint(8) unsigned NOT NULL DEFAULT '0',
|
||||
`product` text NOT NULL,
|
||||
`project` mediumint(8) unsigned NOT NULL,
|
||||
`execution` mediumint(8) unsigned NOT NULL,
|
||||
`actor` varchar(100) NOT NULL DEFAULT '',
|
||||
`action` varchar(80) NOT NULL DEFAULT '',
|
||||
`date` datetime NOT NULL,
|
||||
`comment` text NOT NULL,
|
||||
`extra` text,
|
||||
`read` enum('0','1') NOT NULL DEFAULT '0',
|
||||
`vision` varchar(10) NOT NULL DEFAULT 'rnd',
|
||||
`efforted` tinyint(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `date` (`date`),
|
||||
KEY `actor` (`actor`),
|
||||
KEY `project` (`execution`),
|
||||
KEY `objectID` (`objectID`),
|
||||
KEY `action` (`action`)
|
||||
) ENGINE=MyISAM AUTO_INCREMENT=420 DEFAULT CHARSET=utf8;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `zt_action`
|
||||
--
|
||||
|
||||
LOCK TABLES `zt_action` WRITE;
|
||||
/*!40000 ALTER TABLE `zt_action` DISABLE KEYS */;
|
||||
INSERT INTO `zt_action` VALUES (101,'product',0,'',0,0,'','common','0000-00-00 00:00:00','这是一个系统日志测试备注1',NULL,'0','rnd',0),(102,'story',0,'',0,0,'','extra','0000-00-00 00:00:00','这是一个系统日志测试备注2',NULL,'0','rnd',0),(103,'productplan',0,'',0,0,'','opened','0000-00-00 00:00:00','这是一个系统日志测试备注3',NULL,'0','rnd',0),(104,'release',0,'',0,0,'','created','0000-00-00 00:00:00','这是一个系统日志测试备注4',NULL,'0','rnd',0),(105,'project',0,'',0,0,'','changed','0000-00-00 00:00:00','这是一个系统日志测试备注5',NULL,'0','rnd',0);
|
||||
/*!40000 ALTER TABLE `zt_action` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
-- Dump completed on 2022-11-17 8:52:10
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -22,4 +21,3 @@ $action = new actionTest();
|
||||
r($action->deleteByTypeTest('')) && p() && e('1'); // 测试删除object为空动态
|
||||
r($action->deleteByTypeTest('story')) && p() && e('1'); // 测试删除objectType为story的动态
|
||||
r($action->deleteByTypeTest('test')) && p() && e('1'); // 测试删除objectType为不存在的test的动态
|
||||
$db->restoreDB();
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -18,4 +17,3 @@ pid=1
|
||||
$action = new actionTest();
|
||||
|
||||
r($action->hideAllTest()) && p('0:extra;1:extra;2:extra') && e('2;2;2'); // 隐藏回收站全部信息
|
||||
$db->restoreDB();
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -25,4 +24,3 @@ r($action->hideOneTest($actionIDList[0])) && p('extra') && e('2'); // 隐藏acti
|
||||
r($action->hideOneTest($actionIDList[1])) && p('extra') && e('2'); // 隐藏action 87
|
||||
r($action->hideOneTest($actionIDList[2])) && p('extra') && e('2'); // 隐藏已隐藏action 9
|
||||
r($action->hideOneTest($actionIDList[3])) && p('extra') && e('1'); // 隐藏非删除action 1
|
||||
$db->restoreDB();
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -35,4 +34,3 @@ r($action->logHistoryTest($actionIDList[1], $changes2)) && p('0:field,old,new')
|
||||
r($action->logHistoryTest($actionIDList[2], $changes3)) && p('0:field,old,new') && e('name,name1,name2'); // 测试新增actionID 10003 历史记录
|
||||
r($action->logHistoryTest($actionIDList[3], $changes4)) && p('0:field,old,new') && e('code,code1,code2'); // 测试新增actionID 10004 历史记录
|
||||
r($action->logHistoryTest($actionIDList[4], $changes5)) && p('0:field,old,new') && e('assignedTo,test2,test1'); // 测试新增actionID 10005 历史记录
|
||||
$db->restoreDB();
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -29,4 +28,3 @@ r($action->readTest($objectType[1], $objectID[1])) && p('0:objectType,objectID,r
|
||||
r($action->readTest($objectType[2], $objectID[2])) && p('0:objectType,objectID,read') && e('productplan,3,1'); // 测试对action 3 进行阅读操作
|
||||
r($action->readTest($objectType[3], $objectID[3])) && p('0:objectType,objectID,read') && e('release,4,1'); // 测试对action 4 进行阅读操作
|
||||
r($action->readTest($objectType[4], $objectID[4])) && p('0:objectType,objectID,read') && e('project,5,1'); // 测试对action 5 进行阅读操作
|
||||
$db->restoreDB();
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -36,4 +35,3 @@ r($action->saveIndexTest($objectTypeList[1], $objectIdList[0], $actionTypeList[1
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[1], $actionTypeList[1])) && p() && e('1'); // 测试保存stroyId为1, action为created的数据
|
||||
r($action->saveIndexTest($objectTypeList[1], $objectIdList[2], $actionTypeList[1])) && p() && e('1'); // 测试保存stroyId为100000, action为created的数据
|
||||
r($action->saveIndexTest($objectTypeList[2], $objectIdList[2], $actionTypeList[2])) && p() && e('1'); // 测试保存不存在类型的数据
|
||||
$db->restoreDB();
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<?php
|
||||
include dirname(dirname(dirname(__FILE__))) . '/lib/init.php';
|
||||
include dirname(dirname(dirname(__FILE__))) . '/class/action.class.php';
|
||||
$db->switchDB();
|
||||
su('admin');
|
||||
|
||||
/**
|
||||
@@ -25,4 +24,3 @@ r($action->undeleteTest($actionIDList[0])) && p('extra') && e('0'); // 测试还
|
||||
r($action->undeleteTest($actionIDList[1])) && p('extra') && e('0'); // 测试还原action 87
|
||||
r($action->undeleteTest($actionIDList[2])) && p('extra') && e('0'); // 测试还原action 9
|
||||
r($action->undeleteTest($actionIDList[3])) && p('extra') && e('1'); // 测试还原未删除action 1
|
||||
$db->restoreDB();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user