From 40a653554d0143b70cf110e3afcdc90ab1013a46 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 20 Dec 2017 16:25:25 +0800 Subject: [PATCH 001/206] * Fix Bug #1245. --- module/bug/model.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/module/bug/model.php b/module/bug/model.php index 7683e0f71d..0fc4a2dffd 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -2459,7 +2459,8 @@ class bugModel extends model echo substr($bug->openedDate, 5, 11); break; case 'openedBuild': - foreach(explode(',', $bug->openedBuild) as $build) echo zget($builds, $build) . ' '; + $builds = array_flip($builds); + foreach(explode(',', $bug->openedBuild) as $build) echo html::a(helper::createLink('build', 'view', "buildID=$builds[$build]"), $build, '', "title='$bug->openedBuild'"); break; case 'assignedTo': echo zget($users, $bug->assignedTo, $bug->assignedTo); From a42b0008c9e93592b927e11fc1db59833d7abc54 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 20 Dec 2017 16:46:42 +0800 Subject: [PATCH 002/206] * adjust for demo. --- db/demo.sql | 1 - module/common/view/action.html.php | 2 +- module/user/control.php | 4 +++- module/user/view/login.html.php | 10 ++++++---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/db/demo.sql b/db/demo.sql index c1979dd99c..76fd161119 100644 --- a/db/demo.sql +++ b/db/demo.sql @@ -295,7 +295,6 @@ INSERT INTO `zt_testrun` (`id`, `task`, `case`, `version`, `assignedTo`, `lastRu INSERT INTO `zt_testtask` (`id`, `name`, `product`, `project`, `build`, `owner`, `begin`, `end`, `desc`, `status`, `deleted`) VALUES(1, '企业网站第一期测试任务', 1, 1, 'trunk', 'testManager', '2012-06-05', '2013-06-21', '', 'wait', '0'); - INSERT INTO `zt_user` (`id`, `dept`, `account`, `password`, `role`, `realname`, `nickname`, `commiter`, `avatar`, `birthday`, `gender`, `email`, `skype`, `qq`, `yahoo`, `gtalk`, `wangwang`, `mobile`, `phone`, `address`, `zipcode`, `join`, `visits`, `ip`, `last`, `deleted`) VALUES(2, 5, 'productManager', 'e10adc3949ba59abbe56e057f20f883e', 'po', '产品经理', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 3, '192.168.0.8', 1338866083, '0'); INSERT INTO `zt_user` (`id`, `dept`, `account`, `password`, `role`, `realname`, `nickname`, `commiter`, `avatar`, `birthday`, `gender`, `email`, `skype`, `qq`, `yahoo`, `gtalk`, `wangwang`, `mobile`, `phone`, `address`, `zipcode`, `join`, `visits`, `ip`, `last`, `deleted`) VALUES(3, 6, 'projectManager', 'e10adc3949ba59abbe56e057f20f883e', 'pm', '项目经理', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 3, '192.168.0.8', 1338865876, '0'); INSERT INTO `zt_user` (`id`, `dept`, `account`, `password`, `role`, `realname`, `nickname`, `commiter`, `avatar`, `birthday`, `gender`, `email`, `skype`, `qq`, `yahoo`, `gtalk`, `wangwang`, `mobile`, `phone`, `address`, `zipcode`, `join`, `visits`, `ip`, `last`, `deleted`) VALUES(4, 2, 'dev1', 'e10adc3949ba59abbe56e057f20f883e', 'dev', '开发甲', '', '', '', '0000-00-00', 'm', '', '', '', '', '', '', '', '', '', '', '0000-00-00', 1, '192.168.0.8', 1338863860, '0'); diff --git a/module/common/view/action.html.php b/module/common/view/action.html.php index 36a1dc282d..d480890fc6 100755 --- a/module/common/view/action.html.php +++ b/module/common/view/action.html.php @@ -132,7 +132,7 @@ $(function()
    - comment and $this->methodName == 'view' and $action->actor == $this->app->user->account);?> + comment and $this->methodName == 'view' and $action->actor == $this->app->user->account and common::hasPriv('action', 'editComment'));?>
  1. actor])) $action->actor = $users[$action->actor]; diff --git a/module/user/control.php b/module/user/control.php index 2188c95621..27e4df9819 100644 --- a/module/user/control.php +++ b/module/user/control.php @@ -807,7 +807,9 @@ class user extends control { if(!empty($this->config->global->showDemoUsers)) { - $demoUsers = $this->user->getPairs('noletter|noempty|noclosed|nodeleted'); + $demoUsers = 'productManager,projectManager,dev1,dev2,dev3,tester1,tester2,tester3,testManager'; + if($this->app->getClientLang() == 'en') $demoUsers = 'thePO,pm1,pm2,pg1,pg2,pg3,thePM,qa1,theQS'; + $demoUsers = $this->dao->select('account,password,realname')->from(TABLE_USER)->where('account')->in($demoUsers)->fetchAll('account'); $this->view->demoUsers = $demoUsers; } diff --git a/module/user/view/login.html.php b/module/user/view/login.html.php index b232c4519b..15592b4b43 100644 --- a/module/user/view/login.html.php +++ b/module/user/view/login.html.php @@ -60,11 +60,13 @@ if(empty($config->notMd5Pwd))js::import($jsRoot . 'md5.js');
    user->loginWithDemoUser; ?> requestType == 'GET' ? '&' : '?'; - foreach($demoUsers as $demoUser => $demoRealname) + $password = md5('123456'); + $link = inlink('login'); + $link .= strpos($link, '?') !== false ? '&' : '?'; + foreach($demoUsers as $demoAccount => $demoUser) { - if(strpos($this->app->company->admins, ",{$demoUser},") !== false) continue; - echo html::a(inlink('login') . $sign . "account={$demoUser}&password=" . md5(md5('123456') + $this->session->rand), $demoRealname, 'hiddenwin'); + if($demoUser->password != $password) continue; + echo html::a($link . "account={$demoAccount}&password=" . md5($password . $this->session->rand), $demoUser->realname, 'hiddenwin'); } ?>
    From c6778fdd1711b5293435d82a8592f01444643193 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 20 Dec 2017 17:04:55 +0800 Subject: [PATCH 003/206] * adjust for doc showfiles page. --- config/filter.php | 4 +++- module/doc/control.php | 6 +++++- module/doc/view/showfiles.html.php | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/config/filter.php b/config/filter.php index 66e2c6ce16..6b684691fd 100644 --- a/config/filter.php +++ b/config/filter.php @@ -53,6 +53,7 @@ $filter->bug->default = new stdclass(); $filter->bug->create = new stdclass(); $filter->bug->export = new stdclass(); $filter->doc->browse = new stdclass(); +$filter->doc->showfiles = new stdclass(); $filter->doc->default = new stdclass(); $filter->doc->showfiles = new stdclass(); $filter->mail->ztcloud = new stdclass(); @@ -99,6 +100,7 @@ $filter->bug->export->cookie['checkedItem'] = 'reg::checked'; $filter->doc->browse->cookie['browseType'] = 'reg::browseType'; $filter->doc->default->cookie['from'] = 'code'; $filter->doc->default->cookie['product'] = 'int'; +$filter->doc->showfiles->cookie['docFilesViewType'] = 'code'; $filter->file->download->cookie[$config->sessionVar] = 'code'; @@ -203,4 +205,4 @@ $filter->user->edit->get['from'] = 'reg::word'; $filter->git->cat->get['repoUrl'] = 'reg::base64'; $filter->git->diff->get['repoUrl'] = 'reg::base64'; $filter->svn->cat->get['repoUrl'] = 'reg::base64'; -$filter->svn->diff->get['repoUrl'] = 'reg::base64'; \ No newline at end of file +$filter->svn->diff->get['repoUrl'] = 'reg::base64'; diff --git a/module/doc/control.php b/module/doc/control.php index 0523918d42..3a577564e6 100644 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -601,13 +601,16 @@ class doc extends control * @access public * @return void */ - public function showFiles($type, $objectID, $viewType='card', $orderBy='t1.id_desc', $recTotal=0, $recPerPage=20, $pageID=1) + public function showFiles($type, $objectID, $viewType = '', $orderBy = 't1.id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1) { $uri = $this->app->getURI(true); $this->app->session->set('taskList', $uri); $this->app->session->set('storyList', $uri); $this->app->session->set('docList', $uri); + if(empty($viewType)) $viewType = !empty($_COOKIE['docFilesViewType']) ? $this->cookie->docFilesViewType : 'card'; + setcookie('docFilesViewType', $viewType, $this->config->cookieLife, $this->config->webRoot); + $table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT; $object = $this->dao->select('id,name')->from($table)->where('id')->eq($objectID)->fetch(); @@ -658,6 +661,7 @@ class doc extends control $this->view->type = $type; $this->view->object = $object; $this->view->files = $this->doc->getLibFiles($type, $objectID, $orderBy, $pager); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->view->pager = $pager; $this->view->viewType = $viewType; $this->view->orderBy = $orderBy; diff --git a/module/doc/view/showfiles.html.php b/module/doc/view/showfiles.html.php index 0d190921c9..4892ad6917 100644 --- a/module/doc/view/showfiles.html.php +++ b/module/doc/view/showfiles.html.php @@ -72,7 +72,7 @@ pathname;?> extension;?> size / 1024 , 1) . 'K';?> - addedBy) ? $file->addedBy : '';?> + addedBy) ? zget($users, $file->addedBy) : '';?> addedDate) ? substr($file->addedDate, 0, 10) : '';?> Date: Thu, 21 Dec 2017 09:27:39 +0800 Subject: [PATCH 004/206] * Fix bug --- module/task/js/create.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/task/js/create.js b/module/task/js/create.js index 6df54d035f..ec649d38f1 100644 --- a/module/task/js/create.js +++ b/module/task/js/create.js @@ -104,11 +104,13 @@ function setAfter() $('input[value="toTaskList"]').attr('checked', 'checked'); } $('input[value="continueAdding"]').attr('disabled', 'disabled'); + $('input[value="toStoryList"]').attr('disabled', 'disabled'); } else { if(!toTaskList) $('input[value="continueAdding"]').attr('checked', 'checked'); $('input[value="continueAdding"]').attr('disabled', false); + $('input[value="toStoryList"]').attr('disabled', false); } } From 9e628c464b281e3b6b008d9b2c2c6ffaada3226f Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 21 Dec 2017 11:22:10 +0800 Subject: [PATCH 005/206] * fix bug for export with child. --- module/project/control.php | 26 +++++++++------ module/project/view/taskheader.html.php | 2 +- module/task/config.php | 4 +-- module/task/control.php | 44 ++++++++++++++++++++++--- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/module/project/control.php b/module/project/control.php index 46a77050f1..0b891b5eaf 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -251,14 +251,29 @@ class project extends control /* Get tasks and group them. */ if(empty($groupBy))$groupBy = 'story'; - $tasks = $this->loadModel('task')->getProjectTasks($projectID, $productID = 0, $status = 'all', $modules = 0, $groupBy); + $sort = $this->loadModel('common')->appendOrder($groupBy); + $tasks = $this->loadModel('task')->getProjectTasks($projectID, $productID = 0, $status = 'all', $modules = 0, $sort); $groupBy = str_replace('`', '', $groupBy); $taskLang = $this->lang->task; $groupByList = array(); $groupTasks = array(); + $groupTasks = array(); + foreach($tasks as $task) + { + $groupTasks[] = $task; + if(isset($task->children)) + { + foreach($task->children as $child) $groupTasks[] = $child; + $task->children = true; + unset($task->children); + } + } + /* Get users. */ $users = $this->loadModel('user')->getPairs('noletter'); + $tasks = $groupTasks; + $groupTasks = array(); foreach($tasks as $task) { if($groupBy == 'story') @@ -290,14 +305,6 @@ class project extends control { $groupTasks[$task->$groupBy][] = $task; } - if(isset($task->children)) - { - foreach($task->children as $child) - { - $groupTasks[$child->assignedToRealName][] = $child; - } - $task->children = true; - } } /* Process closed data when group by assignedTo. */ if($groupBy == 'assignedTo' and isset($groupTasks['Closed'])) @@ -307,7 +314,6 @@ class project extends control $groupTasks['closed'] = $closedTasks; } - /* Assign. */ $this->app->loadLang('tree'); $this->view->members = $this->project->getTeamMembers($projectID); diff --git a/module/project/view/taskheader.html.php b/module/project/view/taskheader.html.php index e6590fc19e..766a2fa3a7 100644 --- a/module/project/view/taskheader.html.php +++ b/module/project/view/taskheader.html.php @@ -98,7 +98,7 @@ diff --git a/module/task/config.php b/module/task/config.php index bbdb6c92d8..a2ae9c915c 100644 --- a/module/task/config.php +++ b/module/task/config.php @@ -27,10 +27,10 @@ $config->task->editor->cancel = array('id' => 'comment', 'tools' => 'simpleToo $config->task->editor->pause = array('id' => 'comment', 'tools' => 'simpleTools'); $config->task->exportFields = ' - id, project, module, progress, story, + id, project, module, story, name, desc, type, pri,estStarted, realStarted, deadline, status,estimate, consumed, left, - mailto, + mailto, progress, openedBy, openedDate, assignedTo, assignedDate, finishedBy, finishedDate, canceledBy, canceledDate, closedBy, closedDate, closedReason, diff --git a/module/task/control.php b/module/task/control.php index 936c061f4a..1901f2c303 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -1179,7 +1179,7 @@ class task extends control * @access public * @return void */ - public function export($projectID, $orderBy) + public function export($projectID, $orderBy, $type) { $project = $this->project->getById($projectID); $allExportFields = $this->config->task->exportFields; @@ -1191,6 +1191,7 @@ class task extends control $taskLang = $this->lang->task; /* Create field lists. */ + $sort = $this->loadModel('common')->appendOrder($orderBy); $fields = $this->post->exportFields ? $this->post->exportFields : explode(',', $allExportFields); foreach($fields as $key => $fieldName) { @@ -1205,7 +1206,7 @@ class task extends control { $tasks = $this->dao->select('*')->from(TABLE_TASK)->alias('t1')->where($this->session->taskQueryCondition) ->beginIF($this->post->exportType == 'selected')->andWhere('t1.id')->in($this->cookie->checkedItem)->fi() - ->orderBy($orderBy)->fetchAll('id'); + ->orderBy($sort)->fetchAll('id'); foreach($tasks as $key => $task) { @@ -1222,7 +1223,6 @@ class task extends control { $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; } - $task->progress .= '%'; } } @@ -1252,9 +1252,34 @@ class task extends control $relatedFiles = $this->dao->select('id, objectID, pathname, title')->from(TABLE_FILE)->where('objectType')->eq('task')->andWhere('objectID')->in(@array_keys($tasks))->andWhere('extra')->ne('editor')->fetchGroup('objectID'); $relatedModules = $this->loadModel('tree')->getTaskOptionMenu($projectID); - $children = $this->dao->select('*')->from(TABLE_TASK)->where('deleted')->eq(0)->andWhere('parent')->in(array_keys($tasks))->fetchGroup('parent', 'id'); + $children = $this->dao->select('*')->from(TABLE_TASK)->where('deleted')->eq(0) + ->andWhere('parent')->in(array_keys($tasks)) + ->beginIF($this->post->exportType == 'selected')->andWhere('id')->in($this->cookie->checkedItem)->fi() + ->orderBy($sort) + ->fetchGroup('parent', 'id'); if(!empty($children)) { + foreach($children as $parent => $childTasks) + { + foreach($childTasks as $task) + { + /* Compute task progress. */ + if($task->consumed == 0 and $task->left == 0) + { + $task->progress = 0; + } + elseif($task->consumed != 0 and $task->left == 0) + { + $task->progress = 100; + } + else + { + $task->progress = round($task->consumed / ($task->consumed + $task->left), 2) * 100; + } + $task->progress .= '%'; + } + } + $position = 0; foreach($tasks as $task) { @@ -1267,6 +1292,17 @@ class task extends control } } + if($type == 'group') + { + $groupTasks = array(); + foreach($tasks as $task) $groupTasks[$task->$orderBy][] = $task; + $tasks = array(); + foreach($groupTasks as $groupTask) + { + foreach($groupTask as $task)$tasks[] = $task; + } + } + foreach($tasks as $task) { if($this->post->fileType == 'csv') From 897686168d88dd7cbda830e7553e0300f05a649a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 12:41:42 +0800 Subject: [PATCH 006/206] * Fix bug --- module/story/config.php | 4 ++-- module/tree/control.php | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/module/story/config.php b/module/story/config.php index f6db8e00e8..59f211a57c 100644 --- a/module/story/config.php +++ b/module/story/config.php @@ -38,8 +38,8 @@ $config->story->list->exportFields = ' childStories, linkStories, duplicateStory, files'; $config->story->list->customCreateFields = 'source,verify,pri,estimate,mailto,keywords'; -$config->story->list->customBatchCreateFields = 'module,plan,spec,source,verify,pri,estimate,review,keywords'; -$config->story->list->customBatchEditFields = 'branch,module,plan,estimate,pri,assignedTo,source,stage,closedBy,closedReason,keywords'; +$config->story->list->customBatchCreateFields = 'plan,spec,source,verify,pri,estimate,review,keywords'; +$config->story->list->customBatchEditFields = 'branch,plan,estimate,pri,assignedTo,source,stage,closedBy,closedReason,keywords'; $config->story->custom = new stdclass(); $config->story->custom->createFields = $config->story->list->customCreateFields; diff --git a/module/tree/control.php b/module/tree/control.php index 8be48097e6..02542e5fbe 100644 --- a/module/tree/control.php +++ b/module/tree/control.php @@ -326,9 +326,11 @@ class tree extends control * AJAX: Get the option menu of modules. * * @param int $rootID - * @param string $viewType - * @param int $rootModuleID + * @param string $viewType + * @param int $branch + * @param int $rootModuleID * @param string $returnType + * @param string $fieldID * @param bool $needManage * @access public * @return string the html select string. From 04c33a382aa7935688555aa33155b23551ad6ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 13:06:21 +0800 Subject: [PATCH 007/206] * Fix bug --- module/story/js/batchedit.js | 4 ++-- module/story/view/batchedit.html.php | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/module/story/js/batchedit.js b/module/story/js/batchedit.js index 2faf80e809..65980335e0 100644 --- a/module/story/js/batchedit.js +++ b/module/story/js/batchedit.js @@ -31,11 +31,11 @@ function loadBranches(product, branch, storyID) if(!branch) branch = 0; moduleLink = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + product + '&viewtype=story&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=' + storyID + '&needManage=true'); - $('#modules' + storyID).parent('td').load(moduleLink, function(){$('#modules' + storyID).chosen(defaultChosenOptions);}) + $('#modules' + storyID).parent('td > .input-group').load(moduleLink, function(){$('#modules' + storyID).chosen(defaultChosenOptions);}); planID = $('#plans' + storyID).val(); planLink = createLink('product', 'ajaxGetPlans', 'productID=' + product + '&branch=' + branch + '&planID=' + planID + '&fieldID=' + storyID + '&needCreate=true'); - $('#plans' + storyID).parent('td').load(planLink, function(){$('#plans' + storyID).chosen(defaultChosenOptions);}); + $('#plans' + storyID).parent('td > .input-group').load(planLink, function(data){$('#plans' + storyID).chosen(defaultChosenOptions);}); } $(document).ready(removeDitto());//Remove 'ditto' in first row. diff --git a/module/story/view/batchedit.html.php b/module/story/view/batchedit.html.php index 0302921c71..567590ca8f 100644 --- a/module/story/view/batchedit.html.php +++ b/module/story/view/batchedit.html.php @@ -87,8 +87,12 @@ foreach(explode(',', $showFields) as $field) branch, "class='form-control chosen' onchange='loadBranches($branchProductID, this.value, $storyID);' $disabled");?> - ' style='overflow:visible'> module, "class='form-control chosen'");?> - ' style='overflow:visible'> plan, "class='form-control chosen'");?> + ' style='overflow:visible'> +
    module, "class='form-control chosen'");?>
    + + ' style='overflow:visible'> +
    plan, "class='form-control chosen'");?>
    +
    color, "data-provide='colorpicker' data-wrapper='input-group-btn fix-border-right' data-pull-menu-right='false' data-btn-tip='{$lang->story->colorTag}' data-update-text='#titles\\[{$storyID}\\]'");?> From 7799d1ee427491d3987b43bb4df8d8c4fb568a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 13:46:16 +0800 Subject: [PATCH 008/206] * Fix bug. --- module/block/view/taskblock.html.php | 2 +- module/my/view/task.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index 3ab4b05f0b..e1a8fa224b 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -31,7 +31,7 @@ td.delayed{background: #e84e0f!important; color: white;} ?> > id;?> - task->priList, $task->pri, $task->pri)?> + task->priList), $task->pri, $task->pri)?> name?> estimate?> '>deadline, 0, 4) > 0) echo $task->deadline;?> diff --git a/module/my/view/task.html.php b/module/my/view/task.html.php index c6aa3391d4..5b53c66c4f 100644 --- a/module/my/view/task.html.php +++ b/module/my/view/task.html.php @@ -52,7 +52,7 @@ createLink('task', 'view', "taskID=$task->id"), sprintf('%03d', $task->id));?> - task->priList, $task->pri, $task->pri);?>'>task->priList, $task->pri, $task->pri);?> + task->priList), $task->pri, $task->pri);?>'>task->priList), $task->pri, $task->pri);?> createLink('project', 'browse', "projectid=$task->projectID"), $task->projectName);?> createLink('task', 'view', "taskID=$task->id"), $task->name, null, "style='color: $task->color'");?> openedBy);?> From 39765cdd131e2b6d83def2fa8f38d3476b53c503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 14:16:45 +0800 Subject: [PATCH 009/206] * Fix bug. --- module/story/js/batchedit.js | 8 ++++---- module/story/view/batchedit.html.php | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/story/js/batchedit.js b/module/story/js/batchedit.js index 65980335e0..864b39fb39 100644 --- a/module/story/js/batchedit.js +++ b/module/story/js/batchedit.js @@ -30,12 +30,12 @@ function loadBranches(product, branch, storyID) if(typeof(branch) == 'undefined') branch = 0; if(!branch) branch = 0; - moduleLink = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + product + '&viewtype=story&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=' + storyID + '&needManage=true'); - $('#modules' + storyID).parent('td > .input-group').load(moduleLink, function(){$('#modules' + storyID).chosen(defaultChosenOptions);}); + moduleLink = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + product + '&viewtype=story&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=' + storyID); + $('#modules' + storyID).parent('td').load(moduleLink, function(){$('#modules' + storyID).chosen(defaultChosenOptions);}); planID = $('#plans' + storyID).val(); - planLink = createLink('product', 'ajaxGetPlans', 'productID=' + product + '&branch=' + branch + '&planID=' + planID + '&fieldID=' + storyID + '&needCreate=true'); - $('#plans' + storyID).parent('td > .input-group').load(planLink, function(data){$('#plans' + storyID).chosen(defaultChosenOptions);}); + planLink = createLink('product', 'ajaxGetPlans', 'productID=' + product + '&branch=' + branch + '&planID=' + planID + '&fieldID=' + storyID); + $('#plans' + storyID).parent('td').load(planLink, function(){$('#plans' + storyID).chosen(defaultChosenOptions);}); } $(document).ready(removeDitto());//Remove 'ditto' in first row. diff --git a/module/story/view/batchedit.html.php b/module/story/view/batchedit.html.php index 567590ca8f..711c626b31 100644 --- a/module/story/view/batchedit.html.php +++ b/module/story/view/batchedit.html.php @@ -88,10 +88,10 @@ foreach(explode(',', $showFields) as $field) ' style='overflow:visible'> -
    module, "class='form-control chosen'");?>
    + module, "class='form-control chosen'");?> ' style='overflow:visible'> -
    plan, "class='form-control chosen'");?>
    + plan, "class='form-control chosen'");?>
    From c7d758b6f0f079e37dae67f7497bc0bd78b71d48 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 21 Dec 2017 14:50:49 +0800 Subject: [PATCH 010/206] * fix bug #1337. --- module/task/model.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/module/task/model.php b/module/task/model.php index d6798dfde7..beff8bd80f 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -1218,6 +1218,7 @@ class taskModel extends model ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') ->leftJoin(TABLE_TEAM)->alias('t4')->on('t1.id = t4.task') + ->leftJoin(TABLE_MODULE)->alias('t5')->on('t1.module = t5.id') ->where('t1.project')->eq((int)$projectID) ->beginIF(!in_array($type, array('assignedtome', 'myinvolved')))->andWhere('t1.parent')->eq(0)->fi() ->beginIF($type == 'myinvolved') @@ -1225,7 +1226,7 @@ class taskModel extends model ->orWhere('t1.assignedTo')->eq($this->app->user->account) ->orWhere('t1.finishedby')->eq($this->app->user->account) ->markRight(1)->fi() - ->beginIF($productID)->andWhere('t2.product')->eq((int)$productID)->fi() + ->beginIF($productID)->andWhere("((t5.root=" . (int)$productID . " and t5.type='story') OR t2.product=" . (int)$productID . ")")->fi() ->beginIF($type == 'undone')->andWhere("(t1.status = 'wait' or t1.status ='doing')")->fi() ->beginIF($type == 'needconfirm')->andWhere('t2.version > t1.storyVersion')->andWhere("t2.status = 'active'")->fi() ->beginIF($type == 'assignedtome')->andWhere('t1.assignedTo')->eq($this->app->user->account)->fi() @@ -1254,10 +1255,11 @@ class taskModel extends model ->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') + ->leftJoin(TABLE_MODULE)->alias('t4')->on('t1.module = t4.id') ->where('t1.project')->eq((int)$projectID) ->andWhere('t1.parent')->in($taskList) ->andWhere('t1.deleted')->eq(0) - ->beginIF($productID)->andWhere('t2.product')->eq((int)$productID)->fi() + ->beginIF($productID)->andWhere("((t4.root=" . (int)$productID . " and t4.type='story') OR t2.product=" . (int)$productID . ")")->fi() ->beginIF($type == 'undone')->andWhere("(t1.status = 'wait' or t1.status ='doing')")->fi() ->beginIF($type == 'needconfirm')->andWhere('t2.version > t1.storyVersion')->andWhere("t2.status = 'active'")->fi() ->beginIF($type == 'assignedtome')->andWhere('t1.assignedTo')->eq($this->app->user->account)->fi() From ee157b0e84114b250fba6adf57608d0d609aa108 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 21 Dec 2017 15:18:16 +0800 Subject: [PATCH 011/206] * fix bug #1342. --- module/story/model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index a6141dd336..815bd46bae 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2287,7 +2287,6 @@ class storyModel extends model } $plans = $this->dao->select('id,title')->from(TABLE_PRODUCTPLAN) ->where('product')->in($productID) - ->beginIF($branch)->andWhere('branch')->in($branch)->fi() ->andWhere('deleted')->eq(0) ->fetchPairs('id', 'title'); $stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('branch')->in($branch)->fetchGroup('story', 'branch'); From cc8bf62fe512fb345f2f396e92e20b8b2e5cc1d6 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 21 Dec 2017 15:27:01 +0800 Subject: [PATCH 012/206] * fix bug #1008. --- module/todo/control.php | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/module/todo/control.php b/module/todo/control.php index 70041e2b70..580db82dec 100644 --- a/module/todo/control.php +++ b/module/todo/control.php @@ -254,11 +254,23 @@ class todo extends control } /* Set menus. */ - $this->lang->todo->menu = $this->lang->user->menu; - $this->lang->todo->menuOrder = $this->lang->user->menuOrder; - $this->loadModel('user')->setMenu($this->user->getPairs(), $todo->account); - $this->lang->company->menu->browseUser['subModule'] = 'todo'; - $this->lang->set('menugroup.todo', $from); + $this->loadModel('user'); + if($from == 'company') + { + $this->lang->todo->menu = $this->lang->user->menu; + $this->lang->todo->menuOrder = $this->lang->user->menuOrder; + $this->user->setMenu($this->user->getPairs(), $todo->account); + $this->lang->company->menu->browseUser['subModule'] = 'todo'; + $this->lang->set('menugroup.todo', $from); + } + elseif($from == 'my') + { + $this->lang->todo->menu = $this->lang->my->menu; + $this->lang->todo->menuOrder = $this->lang->my->menuOrder; + $this->loadModel('my')->setMenu(); + $this->lang->my->menu->todo['subModule'] = 'todo'; + $this->lang->set('menugroup.todo', $from); + } $this->view->title = "{$this->lang->todo->common} #$todo->id $todo->name"; $this->view->position[] = $this->lang->todo->view; From 496e6fdca43aa65f662e057479a69a460f4b6492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 15:38:17 +0800 Subject: [PATCH 013/206] * Fix bug. --- module/story/model.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/module/story/model.php b/module/story/model.php index 815bd46bae..41a9fe3583 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2271,8 +2271,10 @@ class storyModel extends model /** * Merge plan title. * - * @param int|array $productID - * @param array $stories + * @param int|array $productID + * @param array $stories + * @param int $branch + * * @access public * @return array */ @@ -2289,10 +2291,7 @@ class storyModel extends model ->where('product')->in($productID) ->andWhere('deleted')->eq(0) ->fetchPairs('id', 'title'); - $stages = $this->dao->select('*')->from(TABLE_STORYSTAGE)->where('branch')->in($branch)->fetchGroup('story', 'branch'); - $branch = trim(str_replace(',0,', '', ",$branch,"), ','); - $branch = empty($branch) ? 0 : $branch; foreach($stories as $story) { $story->planTitle = ''; From bb7d362acfe01058bd137ab9ff6417b490a6f117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 15:41:01 +0800 Subject: [PATCH 014/206] * Format code. --- module/story/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/story/model.php b/module/story/model.php index 41a9fe3583..f877f00b02 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -1310,6 +1310,7 @@ class storyModel extends model * Get stories list of a product. * * @param int $productID + * @param int $branch * @param array|string $moduleIdList * @param string $status * @param string $orderBy From 31fb6383b27f9c28673f7cb42cf2cd69aac8fab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 21 Dec 2017 16:06:13 +0800 Subject: [PATCH 015/206] * Fix bug. --- module/task/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/model.php b/module/task/model.php index beff8bd80f..f0450108ab 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -1239,7 +1239,7 @@ class taskModel extends model ->page($pager) ->fetchAll('id'); - $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'task', ($productID or $type == 'needconfirm' or $type == 'myinvolved') ? false : true); + $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'task', ($productID or in_array($type, array('assignedtome', 'myinvolved', 'needconfirm'))) ? false : true); if(empty($tasks)) return array(); From 60ebe9fa2ea055ce98f67fd0f015bfdcc3dbcf38 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 22 Dec 2017 09:05:34 +0800 Subject: [PATCH 016/206] * fix for upgrade. --- VERSION | 2 +- config/config.php | 2 +- module/bug/lang/en.php | 6 +++++- module/bug/lang/zh-cn.php | 6 ++++++ module/common/lang/en.php | 2 +- module/group/lang/resource.php | 10 +++++++--- module/misc/lang/en.php | 11 +++++++++++ module/misc/lang/zh-cn.php | 1 + module/product/lang/en.php | 3 +++ module/product/lang/zh-cn.php | 6 ++++++ module/release/config.php | 2 +- module/release/model.php | 2 +- module/testcase/lang/en.php | 1 + module/testcase/lang/zh-cn.php | 1 + module/upgrade/lang/en.php | 1 + module/upgrade/lang/zh-cn.php | 1 + module/upgrade/model.php | 9 +++++++++ module/user/control.php | 27 +-------------------------- module/user/model.php | 26 ++++++++++++++++++++++++++ tools/check.php | 8 +++----- 20 files changed, 87 insertions(+), 40 deletions(-) diff --git a/VERSION b/VERSION index d1c0682f9d..c05b5267dc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.6.3 +9.7.stable diff --git a/config/config.php b/config/config.php index b01c02e9c7..8befc3e86c 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '9.6.3'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '9.7'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. $config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php. diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index dad314be53..7a30d7cced 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -77,7 +77,8 @@ $lang->bug->confirmBug = 'Confirm'; $lang->bug->batchConfirm = 'Batch Confirm'; $lang->bug->edit = 'Edit'; $lang->bug->batchEdit = 'Batch Edit'; -$lang->bug->batchChangeModule = 'Batch Modify'; +$lang->bug->batchChangeModule = 'Batch Modify Module'; +$lang->bug->batchChangeBranch = 'Batch Modify Branch'; $lang->bug->batchClose = 'Batch Close'; $lang->bug->assignTo = 'Assign'; $lang->bug->batchAssignTo = 'Batch Assign'; @@ -367,6 +368,9 @@ $lang->bug->mySelects['resolvedbyme'] = $lang->bug->resolvedByMe; $lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed; $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; + + + $lang->bug->featureBar['browse']['my'] = $lang->bug->my; $lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 90b0fc7337..6b891f3303 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -78,6 +78,7 @@ $lang->bug->batchConfirm = '批量确认'; $lang->bug->edit = '编辑'; $lang->bug->batchEdit = '批量编辑'; $lang->bug->batchChangeModule = '批量修改模块'; +$lang->bug->batchChangeBranch = '批量修改分支'; $lang->bug->batchClose = '批量关闭'; $lang->bug->assignTo = '指派'; $lang->bug->batchAssignTo = '批量指派'; @@ -361,11 +362,16 @@ $lang->bug->placeholder = new stdclass(); $lang->bug->placeholder->chooseBuilds = '选择相关版本...'; $lang->bug->placeholder->newBuildName = '新版本名称'; + + + + $lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed; $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; $lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe; $lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe; $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe; + $lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 2946a1b829..b38493eb76 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -337,6 +337,7 @@ $lang->user->menu = $lang->company->menu; $lang->admin = new stdclass(); $lang->admin->menu = new stdclass(); $lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); + $lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); $lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail'); $lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); @@ -346,7 +347,6 @@ $lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModu $lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); $lang->admin->menu->api = array('link' => 'API|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); $lang->admin->menu->sso = 'RangerTeam|admin|sso'; -//$lang->admin->menu->extension = array('link' => 'Extension|extension|browse', 'subModule' => 'extension'); $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 437461f233..763705c285 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -483,6 +483,7 @@ $lang->resource->bug->saveTemplate = 'saveTemplate'; $lang->resource->bug->deleteTemplate = 'deleteTemplate'; $lang->resource->bug->setPublic = 'setPublic'; $lang->resource->bug->batchChangeModule = 'batchChangeModule'; +$lang->resource->bug->batchChangeBranch = 'batchChangeBranch'; $lang->bug->methodOrder[0] = 'index'; $lang->bug->methodOrder[5] = 'browse'; @@ -511,6 +512,7 @@ $lang->bug->methodOrder[110] = 'setPublic'; $lang->bug->methodOrder[115] = 'linkBugs'; $lang->bug->methodOrder[120] = 'unlinkBug'; $lang->bug->methodOrder[125] = 'batchChangeModule'; +$lang->bug->methodOrder[130] = 'batchChangeBranch'; /* Test case. */ $lang->resource->testcase = new stdclass(); @@ -534,6 +536,7 @@ $lang->resource->testcase->showImport = 'showImport'; $lang->resource->testcase->confirmChange = 'confirmChange'; $lang->resource->testcase->confirmStoryChange = 'confirmStoryChange'; $lang->resource->testcase->batchChangeModule = 'batchChangeModule'; +$lang->resource->testcase->batchChangeBranch = 'batchChangeBranch'; $lang->resource->testcase->bugs = 'bugs'; $lang->resource->testcase->review = 'review'; $lang->resource->testcase->batchReview = 'batchReview'; @@ -556,9 +559,10 @@ $lang->testcase->methodOrder[55] = 'confirmStoryChange'; $lang->testcase->methodOrder[60] = 'batchEdit'; $lang->testcase->methodOrder[65] = 'batchDelete'; $lang->testcase->methodOrder[70] = 'batchChangeModule'; -$lang->testcase->methodOrder[75] = 'linkCases'; -$lang->testcase->methodOrder[80] = 'unlinkCase'; -$lang->testcase->methodOrder[85] = 'bugs'; +$lang->testcase->methodOrder[75] = 'batchChangeBranch'; +$lang->testcase->methodOrder[80] = 'linkCases'; +$lang->testcase->methodOrder[85] = 'unlinkCase'; +$lang->testcase->methodOrder[90] = 'bugs'; $lang->testcase->methodOrder[95] = 'review'; $lang->testcase->methodOrder[100] = 'batchReview'; $lang->testcase->methodOrder[105] = 'batchConfirmStoryChange'; diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 93cd9a2034..6c096acfc2 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -30,13 +30,24 @@ $lang->misc->zentao->about['official'] = "Official Website"; $lang->misc->zentao->about['changelog'] = "Change Log"; $lang->misc->zentao->about['license'] = "License"; + + $lang->misc->zentao->support['vip'] = "VIP Technical Support"; $lang->misc->zentao->support['manual'] = "User Manual"; + + + + + $lang->misc->zentao->cowin['reportbug'] = "Report Bug "; $lang->misc->zentao->cowin['feedback'] = "Feedback"; + $lang->misc->zentao->cowin['cowinmore'] = "More"; + + + $lang->misc->zentao->service['servicemore']= 'More'; $lang->misc->mobile = "Mobile Access"; diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index d91f6fe451..12867b03a8 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -44,6 +44,7 @@ $lang->misc->zentao->cowin['reportbug'] = "汇报Bug"; $lang->misc->zentao->cowin['feedback'] = "反馈需求"; $lang->misc->zentao->cowin['recommend'] = "推荐给朋友"; + $lang->misc->zentao->service['zentaotrain']= '禅道使用培训'; $lang->misc->zentao->service['idc'] = '禅道在线托管'; $lang->misc->zentao->service['custom'] = '禅道定制开发'; diff --git a/module/product/lang/en.php b/module/product/lang/en.php index b80d3e5ee3..2662684846 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -120,6 +120,9 @@ $lang->product->mySelects['resolvedbyme'] = $lang->product->reviewedByMe; $lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; $lang->product->featureBar['browse']['unplan'] = $lang->product->unplan; $lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; + + + $lang->product->featureBar['browse']['my'] = $lang->product->my; $lang->product->featureBar['browse']['closedbyme'] = $lang->product->closedByMe; $lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index e5fadf1a90..c47a0f512c 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -83,6 +83,7 @@ $lang->product->closedStory = '已关闭'; $lang->product->unclosed = '未关闭'; $lang->product->unplan = '未计划'; + $lang->product->allStory = '全部需求'; $lang->product->allProduct = '全部' . $lang->productCommon; $lang->product->allProductsOfProject = '全部关联' . $lang->productCommon; @@ -112,12 +113,17 @@ $lang->product->storySummary = "本页共 %s 个需求,预 $lang->product->checkedSummary = "选中 %total% 个需求,预计 %estimate% 个工时,用例覆盖率%rate%。"; $lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon; + + + + $lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; $lang->product->featureBar['browse']['unplan'] = $lang->product->unplan; $lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; $lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; $lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; $lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; + $lang->product->featureBar['browse']['closedbyme'] = $lang->product->closedByMe; $lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; $lang->product->featureBar['browse']['activestory'] = $lang->product->activeStory; diff --git a/module/release/config.php b/module/release/config.php index 7e52377cd7..464702d309 100644 --- a/module/release/config.php +++ b/module/release/config.php @@ -3,7 +3,7 @@ $config->release = new stdclass(); $config->release->create = new stdclass(); $config->release->edit = new stdclass(); $config->release->create->requiredFields = 'name,date'; -$config->release->edit->requiredFields = 'name,date'; +$config->release->edit->requiredFields = 'name,date,build'; $config->release->editor = new stdclass(); $config->release->editor->create = array('id' => 'desc', 'tools' => 'simpleTools'); diff --git a/module/release/model.php b/module/release/model.php index ef6b28cd13..b9e5f341e4 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -172,7 +172,7 @@ class releaseModel extends model $this->dao->update(TABLE_RELEASE)->data($release) ->autoCheck() ->batchCheck($this->config->release->edit->requiredFields, 'notempty') - ->check('name', 'unique', "id != $releaseID AND product = {$release->product} AND branch = $branch AND deleted = '0'") + ->check('name', 'unique', "id != '$releaseID' AND product = '{$release->product}' AND branch = '$branch' AND deleted = '0'") ->where('id')->eq((int)$releaseID) ->exec(); if(!dao::isError()) diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index 0776e58901..931e92ba6d 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -78,6 +78,7 @@ $lang->testcase->batchReview = "Batch Review"; $lang->testcase->edit = "Edit"; $lang->testcase->batchEdit = "Batch Edit "; $lang->testcase->batchChangeModule = "Batch Change Module"; +$lang->testcase->batchChangeBranch = "Batch Change Branch"; $lang->testcase->delete = "Delete"; $lang->testcase->batchDelete = "Batch Delete "; $lang->testcase->batchConfirmStoryChange = "Batch Confirm Story Change"; diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index 6647574ac3..8015cf76d4 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -78,6 +78,7 @@ $lang->testcase->batchReview = "批量评审"; $lang->testcase->edit = "编辑"; $lang->testcase->batchEdit = "批量编辑 "; $lang->testcase->batchChangeModule = "批量修改模块"; +$lang->testcase->batchChangeBranch = "批量修改分支"; $lang->testcase->delete = "删除"; $lang->testcase->batchDelete = "批量删除 "; $lang->testcase->batchConfirmStoryChange = "批量确认变更"; diff --git a/module/upgrade/lang/en.php b/module/upgrade/lang/en.php index 84a645e2f5..e135153752 100644 --- a/module/upgrade/lang/en.php +++ b/module/upgrade/lang/en.php @@ -129,3 +129,4 @@ $lang->upgrade->fromVersions['9_5_1'] = '9.5.1'; $lang->upgrade->fromVersions['9_6'] = '9.6'; $lang->upgrade->fromVersions['9_6_1'] = '9.6.1'; $lang->upgrade->fromVersions['9_6_2'] = '9.6.2'; +$lang->upgrade->fromVersions['9_6_3'] = '9.6.3'; diff --git a/module/upgrade/lang/zh-cn.php b/module/upgrade/lang/zh-cn.php index cfbc9a4ab8..871050c61a 100644 --- a/module/upgrade/lang/zh-cn.php +++ b/module/upgrade/lang/zh-cn.php @@ -129,3 +129,4 @@ $lang->upgrade->fromVersions['9_5_1'] = '9.5.1'; $lang->upgrade->fromVersions['9_6'] = '9.6'; $lang->upgrade->fromVersions['9_6_1'] = '9.6.1'; $lang->upgrade->fromVersions['9_6_2'] = '9.6.2'; +$lang->upgrade->fromVersions['9_6_3'] = '9.6.3'; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 6ea04e8f06..b2f5c2535a 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -195,6 +195,12 @@ class upgradeModel extends model $this->fixDatatableColsConfig(); case '9_6_1': $this->addLimitedGroup(); + case '9_6_2': + case '9_6_3': + $this->execSQL($this->getUpgradeFile('9.6.3')); + $this->changeLimitedName(); + $this->adjustPriv9_7(); + $this->changeStoryWidth(); } $this->deletePatch(); @@ -294,6 +300,9 @@ class upgradeModel extends model case '9_5': $confirmContent .= file_get_contents($this->getUpgradeFile('9.5')); case '9_5_1': $confirmContent .= file_get_contents($this->getUpgradeFile('9.5.1')); case '9_6': $confirmContent .= file_get_contents($this->getUpgradeFile('9.6')); + case '9_6_1': + case '9_6_2': + case '9_6_3': $confirmContent .= file_get_contents($this->getUpgradeFile('9.6.3')); } return str_replace('zt_', $this->config->db->prefix, $confirmContent); } diff --git a/module/user/control.php b/module/user/control.php index 27e4df9819..0dbe8e1df5 100644 --- a/module/user/control.php +++ b/module/user/control.php @@ -626,31 +626,6 @@ class user extends control } } - /** - * Check Tmp dir. - * - * @access public - * @return void - */ - public function checkTmp() - { - if(!is_dir($this->app->tmpRoot)) mkdir($this->app->tmpRoot, 0755, true); - if(!is_dir($this->app->cacheRoot)) mkdir($this->app->cacheRoot, 0755, true); - if(!is_dir($this->app->logRoot)) mkdir($this->app->logRoot, 0755, true); - if(!is_dir($this->app->logRoot)) return false; - - $file = $this->app->logRoot . DS . 'demo.txt'; - if($fp = @fopen($file, 'a+')) - { - @fclose($fp); - @unlink($file); - } - else - { - return false; - } - return true; - } /** * User login, identify him and authorize him. @@ -663,7 +638,7 @@ class user extends control */ public function login($referer = '', $from = '') { - if($this->checkTmp() === false) + if($this->user->checkTmp() === false) { echo ""; echo "
    "; diff --git a/module/user/model.php b/module/user/model.php index d124add45d..3e0acf77d2 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -1188,4 +1188,30 @@ class userModel extends model return $strength; } + + /** + * Check Tmp dir. + * + * @access public + * @return void + */ + public function checkTmp() + { + if(!is_dir($this->app->tmpRoot)) mkdir($this->app->tmpRoot, 0755, true); + if(!is_dir($this->app->cacheRoot)) mkdir($this->app->cacheRoot, 0755, true); + if(!is_dir($this->app->logRoot)) mkdir($this->app->logRoot, 0755, true); + if(!is_dir($this->app->logRoot)) return false; + + $file = $this->app->logRoot . DS . 'demo.txt'; + if($fp = @fopen($file, 'a+')) + { + @fclose($fp); + @unlink($file); + } + else + { + return false; + } + return true; + } } diff --git a/tools/check.php b/tools/check.php index d0b398aba4..843f16fd6b 100755 --- a/tools/check.php +++ b/tools/check.php @@ -193,11 +193,9 @@ foreach(glob($moduleRoot . '*') as $modulePath) $lines = file($langFile); foreach($mainLines as $lineNO => $line) { - if(strpos($line, '$lang') === false) - { - //if($line != $lines[$lineNO]) echo $moduleName . ' ' . $langKey . ' ' . $lineNO . "\n"; - } - else + if(!isset($lines[$lineNO]) OR empty(trim($lines[$lineNO]))) continue; + if(empty(trim($line))) continue; + if(strpos($line, '$lang') === 0) { if(strpos($line, '=') !== false) { From c0847347bdd5f342a3f90068bd501b39ad5820cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 22 Dec 2017 09:37:24 +0800 Subject: [PATCH 017/206] * Fix task page bug. --- module/task/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/model.php b/module/task/model.php index f0450108ab..036aaccfbe 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -1236,7 +1236,7 @@ class taskModel extends model ->beginIF($modules)->andWhere('t1.module')->in($modules)->fi() ->andWhere('t1.deleted')->eq(0) ->orderBy('t1.`parent`,' . $orderBy) - ->page($pager) + ->page($pager, 't1.id') ->fetchAll('id'); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'task', ($productID or in_array($type, array('assignedtome', 'myinvolved', 'needconfirm'))) ? false : true); From 63635f871631ce2dac984a843951489d8da874a2 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 22 Dec 2017 10:05:26 +0800 Subject: [PATCH 018/206] * fix bug. --- module/project/view/story.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/project/view/story.html.php b/module/project/view/story.html.php index 156627e13f..d8281ea514 100644 --- a/module/project/view/story.html.php +++ b/module/project/view/story.html.php @@ -10,9 +10,10 @@ * @link http://www.zentao.net */ ?> + - + @@ -73,7 +74,6 @@
    - From 1eeb0ca399acdf538f26ab655b2a6186b6cd6d7a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 22 Dec 2017 10:08:54 +0800 Subject: [PATCH 019/206] * change for zh-tw. --- module/action/lang/zh-tw.php | 1 + module/block/lang/zh-tw.php | 2 +- module/bug/lang/zh-tw.php | 17 +++++++--- module/dev/lang/zh-tw.php | 3 ++ module/doc/lang/zh-tw.php | 1 + module/extension/lang/zh-tw.php | 1 + module/install/lang/zh-tw.php | 55 ++++++++++++++++++------------- module/mail/lang/zh-tw.php | 1 + module/misc/lang/zh-tw.php | 7 ++-- module/my/lang/zh-tw.php | 1 + module/product/lang/zh-tw.php | 23 +++++++++---- module/productplan/lang/zh-tw.php | 3 +- module/project/lang/zh-tw.php | 11 ++++--- module/story/lang/zh-tw.php | 2 +- module/task/lang/zh-tw.php | 4 ++- module/testcase/lang/zh-tw.php | 3 +- module/tree/lang/zh-tw.php | 1 + module/tutorial/lang/zh-tw.php | 2 +- module/upgrade/lang/zh-tw.php | 1 + module/user/lang/zh-tw.php | 1 + 20 files changed, 92 insertions(+), 48 deletions(-) diff --git a/module/action/lang/zh-tw.php b/module/action/lang/zh-tw.php index 673315df31..0f5f81460b 100755 --- a/module/action/lang/zh-tw.php +++ b/module/action/lang/zh-tw.php @@ -25,6 +25,7 @@ $lang->action->undelete = '還原'; $lang->action->hideOne = '隱藏'; $lang->action->hideAll = '全部隱藏'; $lang->action->editComment = '修改備註'; +$lang->action->comment = '備註'; $lang->action->trashTips = '提示:為了保證系統的完整性,禪道系統的刪除都是標記刪除。'; $lang->action->textDiff = '文本格式'; diff --git a/module/block/lang/zh-tw.php b/module/block/lang/zh-tw.php index f81409d8af..c0a91c9444 100644 --- a/module/block/lang/zh-tw.php +++ b/module/block/lang/zh-tw.php @@ -302,7 +302,7 @@ $lang->block->modules['project']->moreLinkList->task = 'my|task|type=%s'; $lang->block->modules['qa']->moreLinkList = new stdclass(); $lang->block->modules['qa']->moreLinkList->bug = 'my|bug|type=%s'; $lang->block->modules['qa']->moreLinkList->case = 'my|testcase|type=%s'; -$lang->block->modules['qa']->moreLinkList->testtask = 'my|testtask|type=%s'; +$lang->block->modules['qa']->moreLinkList->testtask = 'testtask|browse|type=%s'; $lang->block->modules['todo']->moreLinkList = new stdclass(); $lang->block->modules['todo']->moreLinkList->list = 'my|todo|type=all'; $lang->block->modules['common'] = new stdclass(); diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php index 0e144dc698..e4eaa7e2c6 100644 --- a/module/bug/lang/zh-tw.php +++ b/module/bug/lang/zh-tw.php @@ -72,12 +72,13 @@ $lang->bug->colorTag = '顏色標籤'; /* 方法列表。*/ $lang->bug->index = '首頁'; $lang->bug->create = '提Bug'; -$lang->bug->batchCreate = '批量添加'; +$lang->bug->batchCreate = '批量提Bug'; $lang->bug->confirmBug = '確認'; $lang->bug->batchConfirm = '批量確認'; $lang->bug->edit = '編輯'; $lang->bug->batchEdit = '批量編輯'; $lang->bug->batchChangeModule = '批量修改模組'; +$lang->bug->batchChangeBranch = '批量修改分支'; $lang->bug->batchClose = '批量關閉'; $lang->bug->assignTo = '指派'; $lang->bug->batchAssignTo = '批量指派'; @@ -115,6 +116,7 @@ $lang->bug->byQuery = '搜索'; $lang->bug->needConfirm = '需求變動'; $lang->bug->allProduct = '所有' . $lang->productCommon; + $lang->bug->ditto = '同上'; $lang->bug->dittoNotice = '該bug與上一bug不屬於同一產品!'; @@ -216,17 +218,17 @@ $lang->bug->browserList['other'] = '其他'; $lang->bug->typeList[''] = ''; $lang->bug->typeList['codeerror'] = '代碼錯誤'; $lang->bug->typeList['interface'] = '界面優化'; -$lang->bug->typeList['designchange'] = '設計變更'; -$lang->bug->typeList['newfeature'] = '新增需求'; -$lang->bug->typeList['designdefect'] = '設計缺陷'; $lang->bug->typeList['config'] = '配置相關'; $lang->bug->typeList['install'] = '安裝部署'; $lang->bug->typeList['security'] = '安全相關'; $lang->bug->typeList['performance'] = '性能問題'; $lang->bug->typeList['standard'] = '標準規範'; $lang->bug->typeList['automation'] = '測試腳本'; -$lang->bug->typeList['trackthings'] = '事務跟蹤'; $lang->bug->typeList['others'] = '其他'; +$lang->bug->typeList['designchange'] = '設計變更'; +$lang->bug->typeList['newfeature'] = '新增需求'; +$lang->bug->typeList['designdefect'] = '設計缺陷'; +$lang->bug->typeList['trackthings'] = '事務跟蹤'; $lang->bug->statusList[''] = ''; $lang->bug->statusList['active'] = '激活'; @@ -360,11 +362,16 @@ $lang->bug->placeholder = new stdclass(); $lang->bug->placeholder->chooseBuilds = '選擇相關版本...'; $lang->bug->placeholder->newBuildName = '新版本名稱'; + + + + $lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed; $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; $lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe; $lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe; $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe; + $lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; diff --git a/module/dev/lang/zh-tw.php b/module/dev/lang/zh-tw.php index 8652c239a8..03d134b0c4 100644 --- a/module/dev/lang/zh-tw.php +++ b/module/dev/lang/zh-tw.php @@ -90,6 +90,9 @@ $lang->dev->tableList['doccontent'] = '文檔內容'; $lang->dev->tableList['storystage'] = '需求階段'; $lang->dev->tableList['tutorial'] = '新手教程'; $lang->dev->tableList['suitecase'] = '套件用例'; +$lang->dev->tableList['score'] = '積分'; +$lang->dev->tableList['entry'] = '應用'; +$lang->dev->tableList['webhook'] = 'WebHook'; $lang->dev->groupList['my'] = '我的地盤'; $lang->dev->groupList['product'] = $lang->productCommon; diff --git a/module/doc/lang/zh-tw.php b/module/doc/lang/zh-tw.php index 47903d006e..9f18df2444 100644 --- a/module/doc/lang/zh-tw.php +++ b/module/doc/lang/zh-tw.php @@ -64,6 +64,7 @@ $lang->doc->manageType = '維護分類'; $lang->doc->editType = '編輯分類'; $lang->doc->deleteType = '刪除分類'; $lang->doc->addType = '增加分類'; +$lang->doc->childType = '子分類'; $lang->doc->libName = '文檔庫名稱'; $lang->doc->libType = '文檔庫類型'; diff --git a/module/extension/lang/zh-tw.php b/module/extension/lang/zh-tw.php index d4a863996c..661f560f6f 100644 --- a/module/extension/lang/zh-tw.php +++ b/module/extension/lang/zh-tw.php @@ -46,6 +46,7 @@ $lang->extension->downloads = '下載量'; $lang->extension->compatible = '兼容性'; $lang->extension->grade = '評分'; $lang->extension->depends = '依賴'; +$lang->extension->expireDate = '到期日期'; $lang->extension->zentaoCompatible = '適用版本'; $lang->extension->installedTime = '安裝時間'; diff --git a/module/install/lang/zh-tw.php b/module/install/lang/zh-tw.php index f2f4865f37..3f94b379ba 100644 --- a/module/install/lang/zh-tw.php +++ b/module/install/lang/zh-tw.php @@ -126,26 +126,28 @@ $lang->install->account = '管理員帳號'; $lang->install->password = '管理員密碼'; $lang->install->errorEmptyPassword = '密碼不能為空'; -$lang->install->groupList['ADMIN']['name'] = '管理員'; -$lang->install->groupList['ADMIN']['desc'] = '系統管理員'; -$lang->install->groupList['DEV']['name'] = '研發'; -$lang->install->groupList['DEV']['desc'] = '研發人員'; -$lang->install->groupList['QA']['name'] = '測試'; -$lang->install->groupList['QA']['desc'] = '測試人員'; -$lang->install->groupList['PM']['name'] = '項目經理'; -$lang->install->groupList['PM']['desc'] = '項目經理'; -$lang->install->groupList['PO']['name'] = '產品經理'; -$lang->install->groupList['PO']['desc'] = '產品經理'; -$lang->install->groupList['TD']['name'] = '研發主管'; -$lang->install->groupList['TD']['desc'] = '研發主管'; -$lang->install->groupList['PD']['name'] = '產品主管'; -$lang->install->groupList['PD']['desc'] = '產品主管'; -$lang->install->groupList['QD']['name'] = '測試主管'; -$lang->install->groupList['QD']['desc'] = '測試主管'; -$lang->install->groupList['TOP']['name'] = '高層管理'; -$lang->install->groupList['TOP']['desc'] = '高層管理'; -$lang->install->groupList['OTHERS']['name'] = '其他'; -$lang->install->groupList['OTHERS']['desc'] = '其他'; +$lang->install->groupList['ADMIN']['name'] = '管理員'; +$lang->install->groupList['ADMIN']['desc'] = '系統管理員'; +$lang->install->groupList['DEV']['name'] = '研發'; +$lang->install->groupList['DEV']['desc'] = '研發人員'; +$lang->install->groupList['QA']['name'] = '測試'; +$lang->install->groupList['QA']['desc'] = '測試人員'; +$lang->install->groupList['PM']['name'] = '項目經理'; +$lang->install->groupList['PM']['desc'] = '項目經理'; +$lang->install->groupList['PO']['name'] = '產品經理'; +$lang->install->groupList['PO']['desc'] = '產品經理'; +$lang->install->groupList['TD']['name'] = '研發主管'; +$lang->install->groupList['TD']['desc'] = '研發主管'; +$lang->install->groupList['PD']['name'] = '產品主管'; +$lang->install->groupList['PD']['desc'] = '產品主管'; +$lang->install->groupList['QD']['name'] = '測試主管'; +$lang->install->groupList['QD']['desc'] = '測試主管'; +$lang->install->groupList['TOP']['name'] = '高層管理'; +$lang->install->groupList['TOP']['desc'] = '高層管理'; +$lang->install->groupList['OTHERS']['name'] = '其他'; +$lang->install->groupList['OTHERS']['desc'] = '其他'; +$lang->install->groupList['LIMITED']['name'] = '受限用戶'; +$lang->install->groupList['LIMITED']['desc'] = '受限用戶分組(只能編輯與自己相關的內容)'; $lang->install->cronList[''] = '監控定時任務'; $lang->install->cronList['moduleName=project&methodName=computeburn'] = '更新燃盡圖'; @@ -165,9 +167,11 @@ EOT; $lang->install->product = array('chanzhi', 'ranzhi', 'xuanxuan'); -$lang->install->promotion = "為您推薦易軟天創旗下其他產品:"; -$lang->install->chanzhi = new stdclass(); +$lang->install->promotion = "為您推薦易軟天創旗下其他產品:"; +$lang->install->chanzhi = new stdclass(); $lang->install->chanzhi->name = '蟬知企業門戶系統'; +$lang->install->chanzhi->logo = 'images/main/chanzhi.png'; +$lang->install->chanzhi->url = 'http://www.chanzhi.org'; $lang->install->chanzhi->desc = <<
  2. 專業的企業營銷門戶系統
  3. @@ -176,8 +180,11 @@ $lang->install->chanzhi->desc = <<開源免費,不限商用! EOD; + $lang->install->ranzhi = new stdclass(); $lang->install->ranzhi->name = '然之協同管理系統'; +$lang->install->ranzhi->logo = 'images/main/ranzhi.png'; +$lang->install->ranzhi->url = 'http://www.ranzhi.org'; $lang->install->ranzhi->desc = <<
  4. 客戶管理,訂單跟蹤
  5. @@ -186,6 +193,7 @@ $lang->install->ranzhi->desc = <<論壇博客,動態消息 EOD; + $lang->install->zdoo = new stdclass(); $lang->install->zdoo->name = '可深度定製的雲端一體化協作平台'; $lang->install->zdoo->desc = <<install->zdoo->desc = <<提供一體化管理平台 EOD; + $lang->install->xuanxuan = new stdclass(); $lang->install->xuanxuan->name = '喧喧即時聊天軟件'; +$lang->install->xuanxuan->logo = 'images/main/xuanxuan.png'; +$lang->install->xuanxuan->url = 'http://www.xuan.im'; $lang->install->xuanxuan->desc = <<
  6. 輕:輕量級架構,容易部署
  7. diff --git a/module/mail/lang/zh-tw.php b/module/mail/lang/zh-tw.php index b92f30e3ac..e050d419ce 100644 --- a/module/mail/lang/zh-tw.php +++ b/module/mail/lang/zh-tw.php @@ -10,6 +10,7 @@ $lang->mail->resend = '重發'; $lang->mail->browse = '郵件列表'; $lang->mail->delete = '刪除郵件'; $lang->mail->ztCloud = '禪道雲發信'; +$lang->mail->gmail = 'GMAIL發信'; $lang->mail->sendCloud = 'Notice發信'; $lang->mail->batchDelete = '批量刪除'; $lang->mail->sendcloudUser = '同步聯繫人'; diff --git a/module/misc/lang/zh-tw.php b/module/misc/lang/zh-tw.php index 70769c06d4..f90bd986ec 100644 --- a/module/misc/lang/zh-tw.php +++ b/module/misc/lang/zh-tw.php @@ -30,25 +30,24 @@ $lang->misc->zentao->about['official'] = "官方網站"; $lang->misc->zentao->about['changelog'] = "版本歷史"; $lang->misc->zentao->about['license'] = "授權協議"; $lang->misc->zentao->about['extension'] = "插件平台"; +$lang->misc->zentao->about['follow'] = "關注我們"; $lang->misc->zentao->support['vip'] = "商業技術支持"; $lang->misc->zentao->support['manual'] = "用戶手冊"; $lang->misc->zentao->support['faq'] = "常見問題"; $lang->misc->zentao->support['ask'] = "官方問答"; +$lang->misc->zentao->support['video'] = "使用視頻"; $lang->misc->zentao->support['qqgroup'] = "官方QQ群"; $lang->misc->zentao->cowin['donate'] = "捐助我們"; $lang->misc->zentao->cowin['reportbug'] = "彙報Bug"; $lang->misc->zentao->cowin['feedback'] = "反饋需求"; $lang->misc->zentao->cowin['recommend'] = "推薦給朋友"; -$lang->misc->zentao->cowin['cowinmore'] = "更多方式..."; + $lang->misc->zentao->service['zentaotrain']= '禪道使用培訓'; -$lang->misc->zentao->service['scrumtrain'] = '敏捷開發培訓'; $lang->misc->zentao->service['idc'] = '禪道在綫託管'; $lang->misc->zentao->service['custom'] = '禪道定製開發'; -$lang->misc->zentao->service['install'] = '禪道安裝服務'; -$lang->misc->zentao->service['fixissue'] = '禪道問題解決'; $lang->misc->zentao->service['servicemore']= '更多服務...'; $lang->misc->mobile = "手機訪問"; diff --git a/module/my/lang/zh-tw.php b/module/my/lang/zh-tw.php index 9e09c76c72..370471058c 100644 --- a/module/my/lang/zh-tw.php +++ b/module/my/lang/zh-tw.php @@ -17,6 +17,7 @@ $lang->my->changePassword = '修改密碼'; $lang->my->unbind = '解除然之綁定'; $lang->my->manageContacts = '維護聯繫人'; $lang->my->deleteContacts = '刪除聯繫人'; +$lang->my->shareContacts = '共享聯繫人列表'; $lang->my->limited = '受限操作(只能編輯與自己相關的內容)'; $lang->my->score = '我的積分'; $lang->my->scoreRule = '積分規則'; diff --git a/module/product/lang/zh-tw.php b/module/product/lang/zh-tw.php index 6e59b146bc..b9f14bbcfd 100644 --- a/module/product/lang/zh-tw.php +++ b/module/product/lang/zh-tw.php @@ -16,7 +16,7 @@ $lang->product->dynamic = "動態"; $lang->product->view = "{$lang->productCommon}概況"; $lang->product->edit = "編輯{$lang->productCommon}"; $lang->product->batchEdit = "批量編輯"; -$lang->product->create = "新增{$lang->productCommon}"; +$lang->product->create = "添加{$lang->productCommon}"; $lang->product->delete = "刪除{$lang->productCommon}"; $lang->product->deleted = "已刪除"; $lang->product->close = "關閉"; @@ -71,16 +71,18 @@ $lang->product->whitelist = '分組白名單'; $lang->product->branch = '所屬%s'; $lang->product->searchStory = '搜索'; -$lang->product->assignedToMe = '指派給我'; -$lang->product->openedByMe = '由我創建'; -$lang->product->reviewedByMe = '由我評審'; -$lang->product->closedByMe = '由我關閉'; +$lang->product->assignedToMe = '指給我'; +$lang->product->openedByMe = '我創建'; +$lang->product->reviewedByMe = '我評審'; +$lang->product->closedByMe = '我關閉'; $lang->product->draftStory = '草稿'; $lang->product->activeStory = '激活'; $lang->product->changedStory = '已變更'; $lang->product->willClose = '待關閉'; $lang->product->closedStory = '已關閉'; $lang->product->unclosed = '未關閉'; +$lang->product->unplan = '未計劃'; + $lang->product->allStory = '全部需求'; $lang->product->allProduct = '全部' . $lang->productCommon; @@ -107,14 +109,21 @@ $lang->product->aclList['open'] = "預設設置(有{$lang->productCommon}視 $lang->product->aclList['private'] = "私有{$lang->productCommon}(只有{$lang->productCommon}相關負責人和{$lang->projectCommon}團隊成員才能訪問)"; $lang->product->aclList['custom'] = '自定義白名單(團隊成員和白名單的成員可以訪問)'; -$lang->product->storySummary = "本頁共 %s 個需求,預計 %s 個工時,用例覆蓋率%s。"; -$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon; +$lang->product->storySummary = "本頁共 %s 個需求,預計 %s 個工時,用例覆蓋率%s。"; +$lang->product->checkedSummary = "選中 %total% 個需求,預計 %estimate% 個工時,用例覆蓋率%rate%。"; +$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon; + + + + $lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featureBar['browse']['unplan'] = $lang->product->unplan; $lang->product->featureBar['browse']['allstory'] = $lang->product->allStory; $lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe; $lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe; $lang->product->featureBar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; + $lang->product->featureBar['browse']['closedbyme'] = $lang->product->closedByMe; $lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory; $lang->product->featureBar['browse']['activestory'] = $lang->product->activeStory; diff --git a/module/productplan/lang/zh-tw.php b/module/productplan/lang/zh-tw.php index 2adf15a56c..4d1edc9b12 100644 --- a/module/productplan/lang/zh-tw.php +++ b/module/productplan/lang/zh-tw.php @@ -17,7 +17,7 @@ $lang->productplan->edit = "編輯計劃"; $lang->productplan->delete = "刪除計劃"; $lang->productplan->view = "計劃詳情"; $lang->productplan->bugSummary = "本頁共 %s 個Bug"; -$lang->productplan->basicInfo = '基本信息'; +$lang->productplan->info = '信息'; $lang->productplan->batchEdit = '批量編輯'; $lang->productplan->batchUnlink = "批量移除"; @@ -26,6 +26,7 @@ $lang->productplan->unlinkStory = "移除需求"; $lang->productplan->batchUnlinkStory = "批量移除需求"; $lang->productplan->linkedStories = '需求'; $lang->productplan->unlinkedStories = '未關聯需求'; +$lang->productplan->updateOrder = '排序'; $lang->productplan->linkBug = "關聯Bug"; $lang->productplan->unlinkBug = "移除Bug"; diff --git a/module/project/lang/zh-tw.php b/module/project/lang/zh-tw.php index b534e98c07..22d5f90aa0 100644 --- a/module/project/lang/zh-tw.php +++ b/module/project/lang/zh-tw.php @@ -42,7 +42,7 @@ $lang->project->progress = '進度'; $lang->project->hours = '預計 %s 消耗 %s 剩餘 %s'; $lang->project->viewBug = '查看bug'; $lang->project->noProduct = "無{$lang->productCommon}{$lang->projectCommon}"; -$lang->project->createStory = "新增需求"; +$lang->project->createStory = "添加需求"; $lang->project->all = '所有'; $lang->project->undone = '未完成'; $lang->project->unclosed = '未關閉'; @@ -139,8 +139,9 @@ $lang->project->storyKanban = '需求看板'; $lang->project->storySort = '需求排序'; /* 分組瀏覽。*/ -$lang->project->allTasks = '所有'; -$lang->project->assignedToMe = '指派給我'; +$lang->project->allTasks = '所有'; +$lang->project->assignedToMe = '指派給我'; +$lang->project->myInvolved = '由我參與'; $lang->project->statusSelects[''] = '更多'; $lang->project->statusSelects['wait'] = '未開始'; @@ -179,6 +180,7 @@ $lang->project->beginAndEnd = '起止時間'; $lang->project->lblStats = '工時統計'; $lang->project->stats = '可用工時%s工時,總共預計%s工時,已經消耗%s工時,預計剩餘%s工時'; $lang->project->taskSummary = "本頁共 %s 個任務,未開始 %s,進行中 %s,總預計%s工時,已消耗%s工時,剩餘%s工時。"; +$lang->project->checkedSummary = "選中 %total% 個任務,未開始 %wait%,進行中 %doing%,總預計%estimate%工時,已消耗%consumed%工時,剩餘%left%工時。"; $lang->project->memberHours = "%s共有 %s 個可用工時,"; $lang->project->groupSummary = "本組共 %s 個任務,未開始 %s,進行中 %s,總預計%s工時,已消耗%s工時,剩餘%s工時。"; $lang->project->groupSummaryAB = "總任務%s ,未開始%s,進行中%s。
    總預計%s,已消耗%s,剩餘%s。"; @@ -213,7 +215,7 @@ $lang->project->tips = '提示'; $lang->project->afterInfo = "{$lang->projectCommon}添加成功,您現在可以進行以下操作:"; $lang->project->setTeam = '設置團隊'; $lang->project->linkStory = '關聯需求'; -$lang->project->createTask = '添加任務'; +$lang->project->createTask = '創建任務'; $lang->project->goback = "返回任務列表"; $lang->project->noweekend = '去除周末'; $lang->project->withweekend = '顯示周末'; @@ -275,6 +277,7 @@ $lang->printKanban->typeList['increment'] = '增量'; $lang->project->featureBar['task']['unclosed'] = $lang->project->unclosed; $lang->project->featureBar['task']['all'] = $lang->project->allTasks; $lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe; +$lang->project->featureBar['task']['myinvolved'] = $lang->project->myInvolved; $lang->project->featureBar['task']['delayed'] = '已延期'; $lang->project->featureBar['task']['needconfirm'] = '需求變動'; $lang->project->featureBar['task']['status'] = $lang->project->statusSelects['']; diff --git a/module/story/lang/zh-tw.php b/module/story/lang/zh-tw.php index e79851cc16..a9a957de78 100644 --- a/module/story/lang/zh-tw.php +++ b/module/story/lang/zh-tw.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ $lang->story->create = "提需求"; -$lang->story->batchCreate = "批量添加"; +$lang->story->batchCreate = "批量提需求"; $lang->story->change = "變更"; $lang->story->changed = '需求變更'; $lang->story->review = '評審'; diff --git a/module/task/lang/zh-tw.php b/module/task/lang/zh-tw.php index 2632a2ab9d..9c9b30446c 100644 --- a/module/task/lang/zh-tw.php +++ b/module/task/lang/zh-tw.php @@ -11,7 +11,7 @@ */ $lang->task->index = "任務一覽"; $lang->task->create = "建任務"; -$lang->task->batchCreate = "批量添加"; +$lang->task->batchCreate = "批量建任務"; $lang->task->batchEdit = "批量編輯"; $lang->task->batchChangeModule = "批量修改模組"; $lang->task->batchClose = "批量關閉"; @@ -45,6 +45,7 @@ $lang->task->project = '所屬' . $lang->projectCommon; $lang->task->module = '所屬模組'; $lang->task->moduleAB = '模組'; $lang->task->story = '相關需求'; +$lang->task->storyAB = '需求'; $lang->task->storySpec = '需求描述'; $lang->task->storyVerify = '驗收標準'; $lang->task->name = '任務名稱'; @@ -103,6 +104,7 @@ $lang->task->transferTo = '轉交給'; $lang->task->children = '子任務'; $lang->task->childrenAB = '子'; $lang->task->parent = '父任務'; +$lang->task->parentAB = '父'; $lang->task->lblPri = 'P'; $lang->task->lblHour = '(h)'; $lang->task->deniedNotice = '此任務只允許由團隊第一人開始。'; diff --git a/module/testcase/lang/zh-tw.php b/module/testcase/lang/zh-tw.php index d31c17f1af..7cd2c075b3 100644 --- a/module/testcase/lang/zh-tw.php +++ b/module/testcase/lang/zh-tw.php @@ -70,7 +70,7 @@ $lang->testcase->stepVersion = '版本'; $lang->testcase->common = '用例'; $lang->testcase->index = "用例管理首頁"; $lang->testcase->create = "建用例"; -$lang->testcase->batchCreate = "批量添加"; +$lang->testcase->batchCreate = "批量建用例"; $lang->testcase->delete = "刪除用例"; $lang->testcase->view = "用例詳情"; $lang->testcase->review = "評審"; @@ -78,6 +78,7 @@ $lang->testcase->batchReview = "批量評審"; $lang->testcase->edit = "編輯"; $lang->testcase->batchEdit = "批量編輯 "; $lang->testcase->batchChangeModule = "批量修改模組"; +$lang->testcase->batchChangeBranch = "批量修改分支"; $lang->testcase->delete = "刪除"; $lang->testcase->batchDelete = "批量刪除 "; $lang->testcase->batchConfirmStoryChange = "批量確認變更"; diff --git a/module/tree/lang/zh-tw.php b/module/tree/lang/zh-tw.php index 6d0956dab7..fc16aa1637 100644 --- a/module/tree/lang/zh-tw.php +++ b/module/tree/lang/zh-tw.php @@ -45,6 +45,7 @@ $lang->tree->repeatName = '模組名“%s”已經存在!'; $lang->tree->name = '模組名稱'; $lang->tree->line = '產品綫名稱'; +$lang->tree->cate = '分類名稱'; $lang->tree->root = '所屬根'; $lang->tree->branch = '平台/分支'; $lang->tree->path = '路徑'; diff --git a/module/tutorial/lang/zh-tw.php b/module/tutorial/lang/zh-tw.php index cd0f0b8303..fffb263c39 100644 --- a/module/tutorial/lang/zh-tw.php +++ b/module/tutorial/lang/zh-tw.php @@ -39,7 +39,7 @@ $lang->tutorial->tasks['createAccount']['nav'] = array('module' => 'user', 'met $lang->tutorial->tasks['createAccount']['desc'] = "

    在系統創建一個新的用戶帳號:

    • 打開 組織 用戶 添加用戶 頁面;
    • 在添加用戶表單中填寫新用戶信息;
    • 保存用戶信息。
    "; $lang->tutorial->tasks['createProduct'] = array('title' => '創建產品'); -$lang->tutorial->tasks['createProduct']['nav'] = array('module' => 'product', 'method' => 'create', 'menu' => 'create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '新增產品'); +$lang->tutorial->tasks['createProduct']['nav'] = array('module' => 'product', 'method' => 'create', 'menu' => 'create', 'form' => '#dataform', 'submit' => '#submit', 'targetPageName' => '添加產品'); $lang->tutorial->tasks['createProduct']['desc'] = "

    在系統創建一個新的產品:

    • 打開 產品 添加產品 頁面;
    • 在表單中填寫要創建的產品信息;
    • 保存產品信息。
    "; $lang->tutorial->tasks['createStory'] = array('title' => '創建需求'); diff --git a/module/upgrade/lang/zh-tw.php b/module/upgrade/lang/zh-tw.php index 7da01c03ea..3bac753691 100644 --- a/module/upgrade/lang/zh-tw.php +++ b/module/upgrade/lang/zh-tw.php @@ -129,3 +129,4 @@ $lang->upgrade->fromVersions['9_5_1'] = '9.5.1'; $lang->upgrade->fromVersions['9_6'] = '9.6'; $lang->upgrade->fromVersions['9_6_1'] = '9.6.1'; $lang->upgrade->fromVersions['9_6_2'] = '9.6.2'; +$lang->upgrade->fromVersions['9_6_3'] = '9.6.3'; diff --git a/module/user/lang/zh-tw.php b/module/user/lang/zh-tw.php index a0766cfce1..ea3c98fdef 100644 --- a/module/user/lang/zh-tw.php +++ b/module/user/lang/zh-tw.php @@ -145,6 +145,7 @@ $lang->user->error->realname = "ID %s,必須填寫真實姓名"; $lang->user->error->password = "ID %s,密碼必須六位以上"; $lang->user->error->mail = "ID %s,請填寫正確的郵箱地址"; $lang->user->error->role = "ID %s,職位不能為空"; +$lang->user->error->reserved = "ID %s,該用戶名系統預留"; $lang->user->error->verifyPassword = "安全驗證密碼錯誤,請輸入你的登錄密碼"; $lang->user->error->originalPassword = "原密碼不正確"; From 2e83fc72f57570d526f6f0a695413c1ab1ea0e0d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 22 Dec 2017 10:13:23 +0800 Subject: [PATCH 020/206] * change for changelog. --- doc/CHANGELOG | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 4d553aefc7..0e333cf5b7 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,3 +1,106 @@ +2017-12-22 9.7.stable +完成的需求 +2475 批量操作时增加列中切换快捷键支持 +2496 英文专业版中部分画面带有中文字符 +2515 调整国际版的发信功能 +2514 打包一个国际版的安装包 +2537 The report of bug resolve里面没有做翻译 +2532 英文版一键安装包里面需要跳转 +2530 翻译国际版一键安装包的英文界面 +2558 修正两个画面的翻译 +2557 修正五个画面的排版细节 +2556 修正 “修改密码”画面的排版问题 +2555 修正 “产品动态”和“项目动态“的中的汉字 +2547 修正 “查看项目画面”的排版问题 +2546 修正 “BUG的自定义画面“的排版问题 +2545 修正 “创建项目文档库”画面的提示框翻译 +2544 修正一键安装包中“ 报表/自定义/项目 ”的空缺内容 +2543 调整报表模块界面的列显示,消除列名显示不全 +2542 调整添加用户界面,输入提示显示不全 +2541 调整一键安装包英文界面下,做系统备份成功时的英文翻译 +2524 将国际版筛选标签里面和我相关的菜单折叠到一个My标签里面 +2520 需求详情的用例按钮中间增加空格 +2519 调整国际版下面的每个表单保证控件组的对齐 +2518 调整后台首页国际版下面的内容和链接 +2509 测试视图主页,点击待测版本区块more,可以跳转到测试-测试单下 +2506 受限操作分组维护分组描述 +2493 需求、任务、bug、用例、日志列表勾选左下方全选,导出数据时选择选中记录,可以导出全选的数据 +2492 任务列表下方统计信息,显示子任务的统计信息 +2474 需求的批量编辑画面,布局有问题,未利用所有的屏幕宽度 +2355 自定义列表字段把能够展示的字段都梳理一遍 +2351 调整后台首页和关于页面的链接 +2297 计划或者项目创建需求的时候可以批量创建 +2527 bug状态已解决翻译有误 +2516 精简一级导航菜单的单词 +2513 创建英文版本的demo +2487 编辑webhook页面,把类型字段显示出来 +2463 后台增加对 tmp和session目录读写权限检查和结果展示的功能 +2553 历史记录里面的旧记录翻译需要修改 +2552 优化国际版下面页脚统计信息的翻译 +2551 创建计划时日期选择翻译错了 +2550 计划关联需求的翻译弄反了 +2549 需求关闭页面closed reaseon换行 +2540 调整需求创建时推荐模板的翻译 +2539 各个统计报表的翻译需要调整 +2538 公司视图的统计需要调整翻译。 +2536 国际版去掉用不到的bug类型 +2535 调整国际版里面的网站链接 +2534 调整权限分组里面的翻译和排版 +2531 需求变更页面翻译需要调整 +2529 bug详情页面的create应当是Copy +2528 bug创建表单keywords空间需要去掉空格 +2488 项目 任务视图,增加由我参与的任务按钮,展示由我参与的任务(多人任务)。 + +修复的BUG +1008 我的地盘首页的待办点击后跳转到组织-用户-待办页面 +1214 项目起止时间显示优化 +1219 从桌面客户端查看待办,页面显示不对。 +1221 任务报表统计中没有显示自定义的值 +1224 非多平台产品,在测试管理工作方式中,测试视图显示异常。 +1225 调用api反馈 nogdlib实际是有gd库的 +1228 手机浏览器访问开源版报错 +1232 任务、用例、bug,直接在列表下进行编辑操作,操作后底部统计栏不再固定显示 +1234 需求评审结果显示错误 +1240 提交需求会列出没有权限查看的产品名称 +1244 组织-日志中,选择本月或上月时,结束日期显示准确。 +1251 测试用例导出csv文件,报文格式数据不显示 +1255 zbox一键安装包,建议安装 aria_chk +1256 搜索条件为日期介于时间段时,搜索后点击重置,搜索条件还在,需要重新点击搜索,条件才会重置。 +1261 批量分解任务无法分配相同名称的任务 +1264 没有产品的时候打开debug,进入以下页面会产生大量警告性的错误 +1268 需求细分功能如果没有填写任何数据被细分的需求也会关闭 +1273 测试视图,bug列表,单选框无法正常单选。 +1274 开源版集成svn/git查看显示403 +1275 文档维护分类,把模块和子模块改为分类。 +1280 后台-备份在直线还原操作的时候先检查备份文件的权限是否可以正常执行还原动作 +1283 列表页面,批操作菜单,会被遮盖。建议优化。 +1292 子任务指派给用户时,用户登陆后,不会在指派给我中显示 +1305 修复邮件发送公司信息没有及时更新的问题 +1309 开启测试管理工具(产品-项目流程),多分支产品,版本根据分支筛选功能异常。 +1314 产品-需求 无法批量关闭需求 +1324 产品-需求-编辑,删除所属计划后保存不生效 +1325 windows一键安装包9.0升9.6.3,admin登录提示没首页权限 +1326 子任务关闭或删除后,父任务预计工时还会统计 +1327 任务全选,导出数据,不能导出子任务. +1328 项目概况预计工时,与燃尽图不符。 +1329 多人任务,按照指派给分组,显示优化。 +1330 项目任务,编辑任务,更换所属项目,顶部弹出窗口,点击取消;选中内容还是目标内容 +1332 保持登录功能可能失效 +1335 测试管理工具,产品--版本产品下载地址显示有问题 +1336 测试管理工具,项目--迭代,添加项目页面报错。 +1337 项目-任务按照模块和产品筛选数据有问题 +1338 后台-二次开发-数据库 --其他模块,显示英文字段 +1340 编辑bug解决日期会显示被修改 +1341 点击任务开始剩余工时选择0点击确定完成任务的时候没有把指派人更换成创建人 +1342 产品-需求列表在某个分支下无法显示所属计划 +1343 待评审状态用例,批量编辑后,状态会更新为空 +1344 测试bug,解决bug与激活bug功能,版本下拉,没有根据项目进行过滤。 +1345 多人任务都完成后没有指派给创建人 +1347 bug编辑日期可以输入汉字且被保存 +1348 子任务工时在所有项目页面,工时会统计为双倍 +1349 测试-用例列表,用例选择多个适用阶段,列表显示错行 +1350 项目任务列表,高级表格,延期任务,选中,鼠标放置上去,显示异常。 + 2017-11-06 9.6 完成的需求 1988 需求,任务,bug,用例,待办都可以选择看板模式。 From 994e0b56d71506b8ce199bc10ae28f1826448ef3 Mon Sep 17 00:00:00 2001 From: Catouse Date: Fri, 22 Dec 2017 13:28:56 +0800 Subject: [PATCH 021/206] * fix js error. --- module/my/js/todo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/my/js/todo.js b/module/my/js/todo.js index 100457f29e..d3ef3db01e 100644 --- a/module/my/js/todo.js +++ b/module/my/js/todo.js @@ -13,7 +13,7 @@ $(function() if(hash.indexOf('#todo-') === 0) { var todoId = hash.substr(6); - var url = createLink('todo', 'view', 'id=1&from=my&onlybody=yes'); + var url = createLink('todo', 'view', 'id=' + todoId + '&from=my&onlybody=yes'); var $a = $(''); $a.attr({href: url}).modalTrigger( { From e9419639d6e0fafa833b2032b321a228eebce4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 22 Dec 2017 14:23:55 +0800 Subject: [PATCH 022/206] * Fix bug. --- module/bug/control.php | 2 +- module/bug/view/browse.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 7abd9c2b1c..6343c59727 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -847,7 +847,7 @@ class bug extends control } $this->loadModel('score')->create('ajax', 'batchOther'); } - if($type == 'product') die(js::locate($this->createLink('bug', 'browse', "productID=$projectID"))); + if($type == 'product') die(js::locate($this->createLink('bug', 'browse', "productID=$projectID"), 'parent')); if($type == 'my') die(js::locate($this->createLink('my', 'bug'))); die(js::locate($this->createLink('project', 'bug', "projectID=$projectID"))); } diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php index d96aed6646..6c2bd0bce8 100644 --- a/module/bug/view/browse.html.php +++ b/module/bug/view/browse.html.php @@ -330,7 +330,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow foreach ($memberPairs as $key => $value) { if(empty($key)) continue; - echo "
  8. " . html::a("javascript:$(\".table-actions #assignedTo\").val(\"$key\");setFormAction(\"$actionLink\")", $value, '', '') . '
  9. '; + echo "
  10. " . html::a("javascript:$(\"#assignedTo\").val(\"$key\");setFormAction(\"$actionLink\",\"hiddenwin\")", $value, '', '') . '
  11. '; } echo ""; if($withSearch) echo ""; From 9e06211e6685e0a7a8638c4b83c443df4c0cc375 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 22 Dec 2017 16:21:11 +0800 Subject: [PATCH 023/206] * adjust for install cron lang. --- module/install/lang/en.php | 2 ++ module/install/lang/zh-cn.php | 2 ++ module/install/lang/zh-tw.php | 2 ++ 3 files changed, 6 insertions(+) diff --git a/module/install/lang/en.php b/module/install/lang/en.php index f6eb6ac942..7cb06c43f4 100644 --- a/module/install/lang/en.php +++ b/module/install/lang/en.php @@ -156,6 +156,8 @@ $lang->install->cronList['moduleName=svn&methodName=run'] = 'Synchro $lang->install->cronList['moduleName=git&methodName=run'] = 'Synchronize GIT'; $lang->install->cronList['moduleName=backup&methodName=backup'] = 'Backup'; $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Asynchronous sending'; +$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Asynchronous seding Webhook'; +$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Delete overdue log'; $lang->install->success = "Installed!"; $lang->install->login = 'Login ZenTao'; diff --git a/module/install/lang/zh-cn.php b/module/install/lang/zh-cn.php index b11a4f4e00..c2383fd9b9 100644 --- a/module/install/lang/zh-cn.php +++ b/module/install/lang/zh-cn.php @@ -156,6 +156,8 @@ $lang->install->cronList['moduleName=svn&methodName=run'] = '同步S $lang->install->cronList['moduleName=git&methodName=run'] = '同步GIT'; $lang->install->cronList['moduleName=backup&methodName=backup'] = '备份数据和附件'; $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = '异步发信'; +$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = '异步发送Webhook'; +$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = '删除过期日志'; $lang->install->success = "安装成功"; $lang->install->login = '登录禅道管理系统'; diff --git a/module/install/lang/zh-tw.php b/module/install/lang/zh-tw.php index 3f94b379ba..48d8205a9e 100644 --- a/module/install/lang/zh-tw.php +++ b/module/install/lang/zh-tw.php @@ -156,6 +156,8 @@ $lang->install->cronList['moduleName=svn&methodName=run'] = '同步S $lang->install->cronList['moduleName=git&methodName=run'] = '同步GIT'; $lang->install->cronList['moduleName=backup&methodName=backup'] = '備份數據和附件'; $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = '非同步發信'; +$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = '非同步發送Webhook'; +$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = '刪除過期日誌'; $lang->install->success = "安裝成功"; $lang->install->login = '登錄禪道管理系統'; From f038c37608584aad28b7c59cc39eebe898df714d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 25 Dec 2017 10:12:21 +0800 Subject: [PATCH 024/206] * fix bug for ajax custom in english. --- module/datatable/view/ajaxcustom.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/datatable/view/ajaxcustom.html.php b/module/datatable/view/ajaxcustom.html.php index 03b8a8327e..c27d2484c9 100644 --- a/module/datatable/view/ajaxcustom.html.php +++ b/module/datatable/view/ajaxcustom.html.php @@ -60,12 +60,12 @@ $autoWidth = $col['width'] == 'auto'; ?>
    ' data-key='' data-fixed='' data-width=''> -   ({$lang->datatable->required})"?>
    datatable->width?> '>
    +   ({$lang->datatable->required})"?>
    From 55fa326b889eb311260c3ab167c112fb40db28a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 25 Dec 2017 14:16:26 +0800 Subject: [PATCH 025/206] * Format code. --- module/testcase/model.php | 112 ++++++++++++++--------------- module/testsuite/model.php | 142 ++++++++++++++++++------------------- 2 files changed, 127 insertions(+), 127 deletions(-) diff --git a/module/testcase/model.php b/module/testcase/model.php index f21de59846..a3e8fbb4d2 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -15,9 +15,9 @@ class testcaseModel extends model { /** * Set menu. - * - * @param array $products - * @param int $productID + * + * @param array $products + * @param int $productID * @access public * @return void */ @@ -203,7 +203,7 @@ class testcaseModel extends model ->batchCheck($this->config->testcase->create->requiredFields, 'notempty') ->exec(); - if(dao::isError()) + if(dao::isError()) { echo js::error(dao::getError()); die(js::reload('parent')); @@ -230,11 +230,11 @@ class testcaseModel extends model /** * Get cases of a module. - * - * @param int $productID + * + * @param int $productID * @param int $moduleIdList - * @param string $orderBy - * @param object $pager + * @param string $orderBy + * @param object $pager * @access public * @return array */ @@ -252,13 +252,13 @@ class testcaseModel extends model /** * Get by suite. - * - * @param int $productID - * @param int $branch - * @param int $suiteID - * @param array $moduleIdList - * @param string $orderBy - * @param object $pager + * + * @param int $productID + * @param int $branch + * @param int $suiteID + * @param array $moduleIdList + * @param string $orderBy + * @param object $pager * @access public * @return void */ @@ -277,9 +277,9 @@ class testcaseModel extends model /** * Get case info by ID. - * - * @param int $caseID - * @param int $version + * + * @param int $caseID + * @param int $version * @access public * @return object|bool */ @@ -295,7 +295,7 @@ class testcaseModel extends model $case->storyStatus = $story->status; $case->latestStoryVersion = $story->version; } - if($case->fromBug) $case->fromBugTitle = $this->dao->findById($case->fromBug)->from(TABLE_BUG)->fields('title')->fetch('title'); + if($case->fromBug) $case->fromBugTitle = $this->dao->findById($case->fromBug)->from(TABLE_BUG)->fields('title')->fetch('title'); $case->toBugs = array(); $toBugs = $this->dao->select('id, title')->from(TABLE_BUG)->where('`case`')->eq($caseID)->fetchAll(); @@ -454,10 +454,10 @@ class testcaseModel extends model /** * Get cases by openedBy - * - * @param string $account - * @param string $orderBy - * @param object $pager + * + * @param string $account + * @param string $orderBy + * @param object $pager * @access public * @return array */ @@ -506,8 +506,8 @@ class testcaseModel extends model /** * Update a case. - * - * @param int $caseID + * + * @param int $caseID * @access public * @return void */ @@ -544,7 +544,7 @@ class testcaseModel extends model $i = 0; foreach($oldCase->steps as $key => $oldStep) { - if(trim($oldStep->desc) != trim($steps[$i]['desc']) or trim($oldStep->expect) != $steps[$i]['expect']) + if(trim($oldStep->desc) != trim($steps[$i]['desc']) or trim($oldStep->expect) != $steps[$i]['expect']) { $stepChanged = true; break; @@ -602,9 +602,9 @@ class testcaseModel extends model } /** - * Review case - * - * @param int $caseID + * Review case + * + * @param int $caseID * @access public * @return bool */ @@ -629,8 +629,8 @@ class testcaseModel extends model /** * Batch review cases. - * - * @param array $caseIDList + * + * @param array $caseIDList * @access public * @return array */ @@ -746,7 +746,7 @@ class testcaseModel extends model /** * Batch update testcases. - * + * * @access public * @return array */ @@ -823,9 +823,9 @@ class testcaseModel extends model /** * Batch change branch. - * - * @param array $caseIDList - * @param int $branchID + * + * @param array $caseIDList + * @param int $branchID * @access public * @return array */ @@ -883,8 +883,8 @@ class testcaseModel extends model /** * Batch case type change. - * - * @param array $caseIDList + * + * @param array $caseIDList * @param string $result * @access public * @return array @@ -901,7 +901,7 @@ class testcaseModel extends model $case->lastEditedBy = $this->app->user->account; $case->lastEditedDate = $now; $case->type = $result; - + $this->dao->update(TABLE_CASE)->data($case)->autoCheck()->where('id')->eq($caseID)->exec(); $this->action->create('case', $caseID, 'Edited', '', ucfirst($result)); } @@ -909,8 +909,8 @@ class testcaseModel extends model /** * Join steps to a string, thus can diff them. - * - * @param array $steps + * + * @param array $steps * @access public * @return string */ @@ -924,8 +924,8 @@ class testcaseModel extends model /** * Create case steps from a bug's step. - * - * @param string $steps + * + * @param string $steps * @access public * @return array */ @@ -943,7 +943,7 @@ class testcaseModel extends model if($lblStepPos === false or $lblResultPos === false or $lblExpectPos === false) return $caseSteps; $caseSteps = substr($steps, $lblStepPos + strlen($lblStep), $lblResultPos - strlen($lblStep)); - $caseExpect = substr($steps, $lblExpectPos + strlen($lblExpect)); + $caseExpect = substr($steps, $lblExpectPos + strlen($lblExpect)); $caseSteps = trim($caseSteps); $caseExpect = trim($caseExpect); @@ -959,9 +959,9 @@ class testcaseModel extends model /** * Adjust the action is clickable. - * - * @param object $case - * @param string $action + * + * @param object $case + * @param string $action * @access public * @return void */ @@ -976,9 +976,9 @@ class testcaseModel extends model } /** - * Create from import - * - * @param int $productID + * Create from import + * + * @param int $productID * @access public * @return void */ @@ -1058,7 +1058,7 @@ class testcaseModel extends model foreach($this->post->desc[$key] as $id => $desc) { $desc = trim($desc); - if(empty($desc))continue; + if(empty($desc)) continue; $step = new stdclass(); $step->type = $data->stepType[$key][$id]; $step->desc = $desc; @@ -1119,7 +1119,7 @@ class testcaseModel extends model } $oldCase->steps = $this->joinStep($oldStep); $caseData->steps = $this->joinStep($steps); - $changes = common::createChanges($oldCase, $caseData); + $changes = common::createChanges($oldCase, $caseData); $actionID = $this->action->create('case', $caseID, 'Edited'); $this->action->logHistory($actionID, $changes); } @@ -1164,7 +1164,7 @@ class testcaseModel extends model /** * Get fields for import. - * + * * @access public * @return array */ @@ -1188,8 +1188,8 @@ class testcaseModel extends model /** * Import case from Lib. - * - * @param int $productID + * + * @param int $productID * @access public * @return void */ @@ -1396,8 +1396,8 @@ class testcaseModel extends model /** * Append bugs and results. - * - * @param array $cases + * + * @param array $cases * @param string $type * @access public * @return array diff --git a/module/testsuite/model.php b/module/testsuite/model.php index 37a814a095..8c8b3adf07 100644 --- a/module/testsuite/model.php +++ b/module/testsuite/model.php @@ -14,10 +14,10 @@ class testsuiteModel extends model { /** - * Set the menu. - * - * @param array $products - * @param int $productID + * Set the menu. + * + * @param array $products + * @param int $productID * @access public * @return void */ @@ -35,12 +35,12 @@ class testsuiteModel extends model /** * Build select string. - * - * @param array $products - * @param int $productID - * @param string $currentModule - * @param string $currentMethod - * @param string $extra + * + * @param array $products + * @param int $productID + * @param string $currentModule + * @param string $currentMethod + * @param string $extra * @access public * @return string */ @@ -67,9 +67,9 @@ class testsuiteModel extends model /** * Set library menu. - * - * @param array $libraries - * @param int $libID + * + * @param array $libraries + * @param int $libID * @access public * @return void */ @@ -120,8 +120,8 @@ class testsuiteModel extends model /** * Create a test suite. - * - * @param int $productID + * + * @param int $productID * @access public * @return bool|int */ @@ -149,10 +149,10 @@ class testsuiteModel extends model /** * Get test suites of a product. - * - * @param int $productID - * @param string $orderBy - * @param object $pager + * + * @param int $productID + * @param string $orderBy + * @param object $pager * @access public * @return array */ @@ -169,8 +169,8 @@ class testsuiteModel extends model /** * Get test suite info by id. - * - * @param int $suiteID + * + * @param int $suiteID * @param bool $setImgSize * @access public * @return object @@ -185,8 +185,8 @@ class testsuiteModel extends model /** * Update a test suite. - * - * @param int $suiteID + * + * @param int $suiteID * @access public * @return bool|array */ @@ -215,8 +215,8 @@ class testsuiteModel extends model /** * Link cases. - * - * @param int $suiteID + * + * @param int $suiteID * @access public * @return void */ @@ -236,11 +236,11 @@ class testsuiteModel extends model /** * Get linked cases for suite. - * - * @param int $suiteID - * @param string $orderBy - * @param object $pager - * @param bool $append + * + * @param int $suiteID + * @param string $orderBy + * @param object $pager + * @param bool $append * @access public * @return array */ @@ -263,10 +263,10 @@ class testsuiteModel extends model /** * Get unlinked cases for suite. - * - * @param object $suite - * @param int $param - * @param object $pager + * + * @param object $suite + * @param int $param + * @param object $pager * @access public * @return array */ @@ -300,10 +300,10 @@ class testsuiteModel extends model } /** - * Delete suite and library. - * - * @param int $suiteID - * @param string $table + * Delete suite and library. + * + * @param int $suiteID + * @param string $table * @access public * @return bool */ @@ -324,7 +324,7 @@ class testsuiteModel extends model /** * Get libraries. - * + * * @access public * @return array */ @@ -340,7 +340,7 @@ class testsuiteModel extends model /** * Create lib. - * + * * @access public * @return int */ @@ -369,13 +369,13 @@ class testsuiteModel extends model /** * Get lib cases. - * - * @param int $libID - * @param string $browseType - * @param int $queryID - * @param int $moduleID - * @param string $sort - * @param object $pager + * + * @param int $libID + * @param string $browseType + * @param int $queryID + * @param int $moduleID + * @param string $sort + * @param object $pager * @access public * @return array */ @@ -435,11 +435,11 @@ class testsuiteModel extends model /** * Get not imported cases. - * - * @param int $productID - * @param int $libID - * @param string $orderBy - * @param object $pager + * + * @param int $productID + * @param int $libID + * @param string $orderBy + * @param object $pager * @access public * @return array */ @@ -476,7 +476,7 @@ class testsuiteModel extends model if($withAllLib) $query = str_replace($allLib, 1, $query); if(!$withAllLib) $query .= " AND `lib` = '$libID'"; } - + return $this->dao->select('*')->from(TABLE_CASE)->where('deleted')->eq(0) ->beginIF($browseType != 'bysearch')->andWhere('lib')->eq($libID)->fi() ->beginIF($browseType == 'bysearch')->andWhere($query)->fi() @@ -489,11 +489,11 @@ class testsuiteModel extends model /** * Build search form. - * - * @param int $libID - * @param array $libraries - * @param int $queryID - * @param string $actionURL + * + * @param int $libID + * @param array $libraries + * @param int $queryID + * @param string $actionURL * @access public * @return void */ @@ -525,10 +525,10 @@ class testsuiteModel extends model /** * Get lib link. - * - * @param string $module - * @param string $method - * @param string $extra + * + * @param string $module + * @param string $method + * @param string $extra * @access public * @return string */ @@ -559,8 +559,8 @@ class testsuiteModel extends model /** * Create from import. - * - * @param int $libID + * + * @param int $libID * @access public * @return void */ @@ -569,8 +569,8 @@ class testsuiteModel extends model $this->loadModel('action'); $this->loadModel('testcase'); $this->loadModel('file'); - $now = helper::now(); - $data = fixer::input('post')->get(); + $now = helper::now(); + $data = fixer::input('post')->get(); if(!empty($_POST['id'])) { @@ -630,7 +630,7 @@ class testsuiteModel extends model foreach($data->desc[$key] as $id => $desc) { $desc = trim($desc); - if(empty($desc))continue; + if(empty($desc)) continue; $step = new stdclass(); $step->type = $data->stepType[$key][$id]; $step->desc = $desc; @@ -690,7 +690,7 @@ class testsuiteModel extends model } $oldCase->steps = $this->joinStep($oldStep); $caseData->steps = $this->joinStep($steps); - $changes = common::createChanges($oldCase, $caseData); + $changes = common::createChanges($oldCase, $caseData); $actionID = $this->action->create('case', $caseID, 'Edited'); $this->action->logHistory($actionID, $changes); } @@ -733,8 +733,8 @@ class testsuiteModel extends model /** * Batch create case for lib. - * - * @param int $libID + * + * @param int $libID * @access public * @return void */ @@ -793,7 +793,7 @@ class testsuiteModel extends model ->batchCheck($this->config->testcase->create->requiredFields, 'notempty') ->exec(); - if(dao::isError()) + if(dao::isError()) { echo js::error(dao::getError()); die(js::reload('parent')); From 0c39022280555adf7e2b2286c6500942e7f72d42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 25 Dec 2017 15:06:30 +0800 Subject: [PATCH 026/206] * Fix bug#1126 --- module/testcase/model.php | 4 ++-- module/testsuite/model.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/testcase/model.php b/module/testcase/model.php index a3e8fbb4d2..f882088460 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -1110,7 +1110,7 @@ class testcaseModel extends model $stepData->parent = ($stepData->type == 'item') ? $parentStepID : 0; $stepData->case = $caseID; $stepData->version = $version; - $stepData->desc = htmlspecialchars($step['desc']); + $stepData->desc = $step['desc']; $stepData->expect = htmlspecialchars($step['expect']); $this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec(); if($stepData->type == 'group') $parentStepID = $this->dao->lastInsertID(); @@ -1147,7 +1147,7 @@ class testcaseModel extends model $stepData->parent = ($stepData->type == 'item') ? $parentStepID : 0; $stepData->case = $caseID; $stepData->version = 1; - $stepData->desc = htmlspecialchars($desc); + $stepData->desc = $desc; $stepData->expect = htmlspecialchars($this->post->expect[$key][$id]); $this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec(); if($stepData->type == 'group') $parentStepID = $this->dao->lastInsertID(); diff --git a/module/testsuite/model.php b/module/testsuite/model.php index 8c8b3adf07..8b564537e9 100644 --- a/module/testsuite/model.php +++ b/module/testsuite/model.php @@ -681,7 +681,7 @@ class testsuiteModel extends model $stepData->parent = ($stepData->type == 'item') ? $parentStepID : 0; $stepData->case = $caseID; $stepData->version = $version; - $stepData->desc = htmlspecialchars($step['desc']); + $stepData->desc = $step['desc']; $stepData->expect = htmlspecialchars($step['expect']); $this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec(); if($stepData->type == 'group') $parentStepID = $this->dao->lastInsertID(); @@ -716,7 +716,7 @@ class testsuiteModel extends model $stepData->parent = ($stepData->type == 'item') ? $parentStepID : 0; $stepData->case = $caseID; $stepData->version = 1; - $stepData->desc = htmlspecialchars($desc); + $stepData->desc = $desc; $stepData->expect = htmlspecialchars($data->expect[$key][$id]); $this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec(); if($stepData->type == 'group') $parentStepID = $this->dao->lastInsertID(); From cc79cf52c9c7be6d7398dc2794b0898c2a029a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 25 Dec 2017 16:57:37 +0800 Subject: [PATCH 027/206] * Fix bug#1326 --- module/task/control.php | 153 ++++++++++++++++++++-------------------- module/task/model.php | 26 +++---- 2 files changed, 90 insertions(+), 89 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index 1901f2c303..f49ace5cec 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -13,7 +13,7 @@ class task extends control { /** * Construct function, load model of project and story modules. - * + * * @access public * @return void */ @@ -63,7 +63,7 @@ class task extends control $projectID = $task->project; } - $project = $this->project->getById($projectID); + $project = $this->project->getById($projectID); $taskLink = $this->createLink('project', 'browse', "projectID=$projectID&tab=task"); $storyLink = $this->session->storyList ? $this->session->storyList : $this->createLink('project', 'story', "projectID=$projectID"); @@ -177,11 +177,11 @@ class task extends control * @param int $taskID * * @access public - * @return void + * @return void */ public function batchCreate($projectID = 0, $storyID = 0, $iframe = 0, $taskID = 0) { - $project = $this->project->getById($projectID); + $project = $this->project->getById($projectID); $taskLink = $this->createLink('project', 'browse', "projectID=$projectID&tab=task"); $storyLink = $this->session->storyList ? $this->session->storyList : $this->createLink('project', 'story', "projectID=$projectID"); @@ -228,8 +228,8 @@ class task extends control /** * Common actions of task module. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -247,8 +247,8 @@ class task extends control /** * Edit a task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -302,15 +302,15 @@ class task extends control $this->view->position[] = $this->lang->task->common; $this->view->position[] = $this->lang->task->edit; $this->view->stories = $this->story->getProjectStoryPairs($this->view->project->id); - $this->view->users = $this->loadModel('user')->getPairs('nodeleted', "{$this->view->task->openedBy},{$this->view->task->canceledBy},{$this->view->task->closedBy}"); + $this->view->users = $this->loadModel('user')->getPairs('nodeleted', "{$this->view->task->openedBy},{$this->view->task->canceledBy},{$this->view->task->closedBy}"); $this->view->modules = $this->tree->getTaskOptionMenu($this->view->task->project); $this->display(); } /** * Batch edit task. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -355,7 +355,7 @@ class task extends control /* The tasks of project. */ if($projectID) { - $project = $this->project->getById($projectID); + $project = $this->project->getById($projectID); $this->project->setMenu($this->project->getPairs(), $project->id); /* Set modules and members. */ @@ -411,7 +411,7 @@ class task extends control } /** - * Update assign of task + * Update assign of task * * @param int $requestID * @access public @@ -482,9 +482,9 @@ class task extends control } /** - * Batch update assign of task. - * - * @param int $project + * Batch update assign of task. + * + * @param int $project * @access public * @return void */ @@ -569,9 +569,9 @@ class task extends control } /** - * Confirm story change - * - * @param int $taskID + * Confirm story change + * + * @param int $taskID * @access public * @return void */ @@ -585,8 +585,8 @@ class task extends control /** * Start a task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -630,14 +630,14 @@ class task extends control $this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->start; $this->view->position[] = $this->lang->task->start; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->display(); } - + /** - * Record consumed and estimate. - * - * @param int $taskID + * Record consumed and estimate. + * + * @param int $taskID * @access public * @return void */ @@ -679,9 +679,9 @@ class task extends control } /** - * Edit consumed and estimate. - * - * @param int $estimateID + * Edit consumed and estimate. + * + * @param int $estimateID * @access public * @return void */ @@ -709,10 +709,10 @@ class task extends control } /** - * Delete estimate. - * - * @param int $estimateID - * @param string $confirm + * Delete estimate. + * + * @param int $estimateID + * @param string $confirm * @access public * @return void */ @@ -736,8 +736,8 @@ class task extends control /** * Finish a task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -809,8 +809,8 @@ class task extends control /** * Pause task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -835,15 +835,15 @@ class task extends control $this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->pause; $this->view->position[] = $this->lang->task->pause; - + $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->display(); } /** - * Restart task - * - * @param int $taskID + * Restart task + * + * @param int $taskID * @access public * @return void */ @@ -870,14 +870,14 @@ class task extends control $this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->restart; $this->view->position[] = $this->lang->task->restart; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->display(); } /** * Close a task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -903,7 +903,7 @@ class task extends control $this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->finish; $this->view->position[] = $this->lang->task->finish; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->display(); @@ -911,8 +911,8 @@ class task extends control /** * Batch cancel tasks. - * - * @param string $skipTaskIdList + * + * @param string $skipTaskIdList * @access public * @return void */ @@ -946,7 +946,7 @@ class task extends control /** * Batch close tasks. - * + * * @access public * @return void */ @@ -994,8 +994,8 @@ class task extends control /** * Cancel a task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -1021,15 +1021,15 @@ class task extends control $this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->cancel; $this->view->position[] = $this->lang->task->cancel; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); - + $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->display(); } /** * Activate a task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -1056,15 +1056,15 @@ class task extends control if(!isset($this->view->members[$this->view->task->finishedBy])) $this->view->members[$this->view->task->finishedBy] = $this->view->task->finishedBy; $this->view->title = $this->view->project->name . $this->lang->colon .$this->lang->task->activate; $this->view->position[] = $this->lang->task->activate; - $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->display(); } /** * Delete a task. - * - * @param int $projectID - * @param int $taskID + * + * @param int $projectID + * @param int $taskID * @param string $confirm yes|no * @access public * @return void @@ -1080,6 +1080,7 @@ class task extends control { $story = $this->dao->select('story')->from(TABLE_TASK)->where('id')->eq($taskID)->fetch('story'); $this->task->delete(TABLE_TASK, $taskID); + $this->task->computeWorkingHours($task->parent); if($task->fromBug != 0) $this->dao->update(TABLE_BUG)->set('toTask')->eq(0)->where('id')->eq($task->fromBug)->exec(); if($story) $this->loadModel('story')->setStage($story); die(js::locate($this->session->taskList, 'parent')); @@ -1087,11 +1088,11 @@ class task extends control } /** - * AJAX: return tasks of a user in html select. - * - * @param string $account - * @param string $id - * @param string $status + * AJAX: return tasks of a user in html select. + * + * @param string $account + * @param string $id + * @param string $status * @access public * @return string */ @@ -1106,9 +1107,9 @@ class task extends control /** * AJAX: return project tasks in html select. - * - * @param int $projectID - * @param int $taskID + * + * @param int $projectID + * @param int $taskID * @access public * @return string */ @@ -1120,8 +1121,8 @@ class task extends control /** * AJAX: get the actions of a task. for web app. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -1133,9 +1134,9 @@ class task extends control /** * The report page. - * - * @param int $projectID - * @param string $browseType + * + * @param int $projectID + * @param string $browseType * @access public * @return void */ @@ -1173,9 +1174,9 @@ class task extends control /** * get data to export - * - * @param int $projectID - * @param string $orderBy + * + * @param int $projectID + * @param string $orderBy * @access public * @return void */ @@ -1364,8 +1365,8 @@ class task extends control /** * Ajax get task by ID. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ diff --git a/module/task/model.php b/module/task/model.php index 036aaccfbe..b7777cc9a0 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -259,7 +259,7 @@ class taskModel extends model { if(!$taskID) return true; - $tasks = $this->dao->select('`id`,`estimate`,`consumed`,`left`')->from(TABLE_TASK)->where('parent')->eq($taskID)->andWhere('status')->ne('cancel')->fetchAll('id'); + $tasks = $this->dao->select('`id`,`estimate`,`consumed`,`left`')->from(TABLE_TASK)->where('parent')->eq($taskID)->andWhere('status')->ne('cancel')->andWhere('deleted')->eq(0)->fetchAll('id'); if(empty($tasks)) return true; $estimate = 0; @@ -287,7 +287,7 @@ class taskModel extends model * @param $parentID * @param $status * - * @access public + * @access public * @return bool */ public function updateParentStatus($parentID, $status = 'done') @@ -941,7 +941,7 @@ class taskModel extends model } if($task->finishedDate == substr($now, 0, 10)) $task->finishedDate = $now; - + /* Record consumed and left. */ $consumed = $task->consumed - $oldTask->consumed; if($consumed < 0) die(js::error($this->lang->task->error->consumedSmall)); @@ -1352,7 +1352,7 @@ class taskModel extends model ->andWhere('t1.deleted')->eq(0) ->beginIF($status != 'all')->andWhere('t1.status')->in($status)->fi() ->query(); - + $tasks = array(); while($task = $stmt->fetch()) { @@ -1415,7 +1415,7 @@ class taskModel extends model ->beginIF($projectID)->andWhere('project')->eq($projectID)->fi() ->groupBy('story') ->fetchPairs(); - foreach($stories as $storyID) + foreach($stories as $storyID) { if(!isset($taskCounts[$storyID])) $taskCounts[$storyID] = 0; } @@ -1697,7 +1697,7 @@ class taskModel extends model if(!$datas) return array(); $projects = $this->loadModel('project')->getPairs('all'); - foreach($datas as $projectID => $data) + foreach($datas as $projectID => $data) { $data->name = isset($projects[$projectID]) ? $projects[$projectID] : $this->lang->report->undefined; } @@ -1740,9 +1740,9 @@ class taskModel extends model ->orderBy('value DESC') ->fetchAll('name'); if(!$datas) return array(); - + if(!isset($this->users)) $this->users = $this->loadModel('user')->getPairs('noletter'); - foreach($datas as $account => $data) + foreach($datas as $account => $data) { if(isset($this->users[$account])) $data->name = $this->users[$account]; } @@ -1764,8 +1764,8 @@ class taskModel extends model ->orderBy('value DESC') ->fetchAll('name'); if(!$datas) return array(); - - foreach($datas as $type => $data) + + foreach($datas as $type => $data) { if(isset($this->lang->task->typeList[$type])) $data->name = $this->lang->task->typeList[$type]; } @@ -1876,7 +1876,7 @@ class taskModel extends model ->fetchAll('name'); if(!isset($this->users)) $this->users = $this->loadModel('user')->getPairs('noletter'); - foreach($datas as $account => $data) + foreach($datas as $account => $data) { if(isset($this->users[$account])) $data->name = $this->users[$account]; } @@ -2170,7 +2170,7 @@ class taskModel extends model common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true); common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true); common::printIcon('task', 'edit', "taskID=$task->id", $task, 'list'); - if(empty($task->team) or empty($task->children)) + if(empty($task->team) or empty($task->children)) { common::printIcon('task', 'batchCreate', "project=$task->project&storyID=$task->story&moduleID=$task->module&taskID=$task->id", $task, 'list', 'plus', '', '', '', '', $this->lang->task->children); } @@ -2217,7 +2217,7 @@ class taskModel extends model foreach(glob($modulePath . 'ext/view/sendmail.*.html.hook.php') as $hookFile) include $hookFile; $mailContent = ob_get_contents(); ob_end_clean(); - + chdir($oldcwd); /* Set toList and ccList. */ From 6e86db8ce4719bae89223b28f3e26b283d27d982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 25 Dec 2017 17:05:43 +0800 Subject: [PATCH 028/206] * Fix bug --- module/task/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/model.php b/module/task/model.php index b7777cc9a0..5e4c3404c3 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -1057,7 +1057,7 @@ class taskModel extends model ->get(); $this->dao->update(TABLE_TASK)->data($task)->autoCheck()->where('id')->eq((int)$taskID)->exec(); - + $this->computeWorkingHours($oldTask->parent); if($oldTask->story) $this->loadModel('story')->setStage($oldTask->story); if(!dao::isError()) return common::createChanges($oldTask, $task); } From eee6b9d62fd251768e2a0246b775887590c2a29c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 26 Dec 2017 13:06:48 +0800 Subject: [PATCH 029/206] * Rollback Bug#1344. --- module/bug/control.php | 4 +-- module/build/model.php | 75 ++++++++++++++++++++---------------------- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 6343c59727..0912d2d749 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -960,7 +960,7 @@ class bug extends control $this->view->users = $users; $this->view->assignedTo = $assignedTo; $this->view->projects = $this->loadModel('product')->getProjectPairs($productID, $bug->branch ? "0,{$bug->branch}" : 0, $params = 'nodeleted'); - $this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch = 0, 'all', true , $bug->project); + $this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $branch = 0, 'all'); $this->view->actions = $this->action->getList('bug', $bugID); $this->display(); } @@ -1018,7 +1018,7 @@ class bug extends control $this->view->bug = $bug; $this->view->users = $this->user->getPairs('nodeleted', $bug->resolvedBy); - $this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $bug->branch, 'noempty', true, $bug->project); + $this->view->builds = $this->loadModel('build')->getProductBuildPairs($productID, $bug->branch, 'noempty'); $this->view->actions = $this->action->getList('bug', $bugID); $this->display(); diff --git a/module/build/model.php b/module/build/model.php index 33dea5c83d..f40a24ddf4 100644 --- a/module/build/model.php +++ b/module/build/model.php @@ -15,8 +15,8 @@ class buildModel extends model { /** * Get build info. - * - * @param int $buildID + * + * @param int $buildID * @param bool $setImgSize * @access public * @return object @@ -39,8 +39,8 @@ class buildModel extends model /** * Get by ID list. - * - * @param array $idList + * + * @param array $idList * @access public * @return array */ @@ -51,8 +51,8 @@ class buildModel extends model /** * Get builds of a project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return array */ @@ -70,10 +70,10 @@ class buildModel extends model } /** - * Get builds of a project in pairs. - * - * @param int $projectID - * @param int $productID + * Get builds of a project in pairs. + * + * @param int $projectID + * @param int $productID * @param string $params noempty|notrunk, can be a set of them * @access public * @return array @@ -122,25 +122,22 @@ class buildModel extends model * @param int $branch * @param string $params noempty|notrunk, can be a set of them * @param bool $replace - * @param int $project * * @access public * @return array */ - public function getProductBuildPairs($products, $branch = 0, $params = 'noterminate, nodone', $replace = true, $project = 0) + public function getProductBuildPairs($products, $branch = 0, $params = 'noterminate, nodone', $replace = true) { $sysBuilds = array(); if(strpos($params, 'noempty') === false) $sysBuilds = array('' => ''); if(strpos($params, 'notrunk') === false) $sysBuilds = $sysBuilds + array('trunk' => $this->lang->trunk); - /* Add project for Bug#1344. */ $productBuilds = $this->dao->select('t1.id, t1.name, t1.project, t2.status as projectStatus, t3.id as releaseID, t3.status as releaseStatus, t4.name as branchName')->from(TABLE_BUILD)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') ->leftJoin(TABLE_RELEASE)->alias('t3')->on('t1.id = t3.build') ->leftJoin(TABLE_BRANCH)->alias('t4')->on('t1.branch = t4.id') ->where('t1.product')->in($products) ->beginIF($branch)->andWhere('t1.branch')->in("0,$branch")->fi() - ->beginIF($project)->andWhere('t1.project')->eq($project)->fi() ->andWhere('t1.deleted')->eq(0) ->orderBy('t1.date desc, t1.id desc')->fetchAll('id'); @@ -172,14 +169,14 @@ class buildModel extends model /** * Get last build. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return bool | object */ public function getLast($projectID) { - return $this->dao->select('id, name')->from(TABLE_BUILD) + return $this->dao->select('id, name')->from(TABLE_BUILD) ->where('project')->eq((int)$projectID) ->orderBy('date DESC,id DESC') ->limit(1) @@ -188,8 +185,8 @@ class buildModel extends model /** * Create a build - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -226,8 +223,8 @@ class buildModel extends model /** * Update a build. - * - * @param int $buildID + * + * @param int $buildID * @access public * @return void */ @@ -256,8 +253,8 @@ class buildModel extends model /** * Update linked bug to resolved. - * - * @param object $build + * + * @param object $build * @access public * @return void */ @@ -299,8 +296,8 @@ class buildModel extends model /** * Link stories - * - * @param int $buildID + * + * @param int $buildID * @access public * @return void */ @@ -317,10 +314,10 @@ class buildModel extends model } /** - * Unlink story - * - * @param int $buildID - * @param int $storyID + * Unlink story + * + * @param int $buildID + * @param int $storyID * @access public * @return void */ @@ -334,8 +331,8 @@ class buildModel extends model /** * Batch unlink story. - * - * @param int $buildID + * + * @param int $buildID * @access public * @return void */ @@ -357,8 +354,8 @@ class buildModel extends model /** * Link bugs. - * - * @param int $buildID + * + * @param int $buildID * @access public * @return void */ @@ -376,10 +373,10 @@ class buildModel extends model } /** - * Unlink bug. - * - * @param int $buildID - * @param int $bugID + * Unlink bug. + * + * @param int $buildID + * @param int $bugID * @access public * @return void */ @@ -393,8 +390,8 @@ class buildModel extends model /** * Batch unlink bug. - * - * @param int $buildID + * + * @param int $buildID * @access public * @return void */ From dc8ee0995ec02161253afc0d4d5de909df46a5be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 26 Dec 2017 16:30:17 +0800 Subject: [PATCH 030/206] * Fix bug. --- module/misc/lang/en.php | 1 + module/misc/lang/zh-cn.php | 3 ++- module/misc/view/links.html.php | 3 +-- module/user/config.php | 4 ++-- module/user/view/create.html.php | 8 +------- module/user/view/edit.html.php | 6 +----- module/user/view/profile.html.php | 18 ++++++------------ 7 files changed, 14 insertions(+), 29 deletions(-) diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 6c096acfc2..ee3ed24864 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -12,6 +12,7 @@ $lang->misc = new stdclass(); $lang->misc->common = 'Misc'; $lang->misc->ping = 'Ping'; +$lang->misc->api = 'http://api.zentao.pm'; $lang->misc->zentao = new stdclass(); $lang->misc->zentao->version = 'Version %s'; diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index 12867b03a8..fb2f8facc7 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -12,6 +12,7 @@ $lang->misc = new stdclass(); $lang->misc->common = '杂项'; $lang->misc->ping = '防超时'; +$lang->misc->api = 'http://api.zentao.net'; $lang->misc->zentao = new stdclass(); $lang->misc->zentao->version = '版本%s'; @@ -67,7 +68,7 @@ $lang->misc->noticeRepair = "
    普通用户请联系管理员进行修复
    1. 文件内容为空。
    2. 如果之前文件存在,删除之后重新创建。
    3. -
    "; + "; $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = '最新版本'; diff --git a/module/misc/view/links.html.php b/module/misc/view/links.html.php index 088b1a5150..bf6def0661 100755 --- a/module/misc/view/links.html.php +++ b/module/misc/view/links.html.php @@ -2,7 +2,6 @@
    misc->zentao->version); - $API = $this->app->getClientLang() == 'en' ? 'http://api.zentao.pm' : 'http://api.zentao.net'; ?> misc->zentao as $label => $groupItems):?> @@ -15,7 +14,7 @@
      $label):?> -
    • +
    • misc->api . "/goto.php?item=$item&from=about", $label, '_blank', "id='$item'");;?>
    diff --git a/module/user/config.php b/module/user/config.php index b4211a351f..bd2bfb21c9 100644 --- a/module/user/config.php +++ b/module/user/config.php @@ -6,8 +6,8 @@ $config->user->edit = new stdclass(); $config->user->create->requiredFields = 'account,realname,password,password1,password2'; $config->user->edit->requiredFields = 'account,realname'; -$config->user->customBatchCreateFields = 'dept,email,gender,commiter,join,skype,qq,yahoo,gtalk,wangwang,mobile,phone,address,zipcode'; -$config->user->customBatchEditFields = 'dept,email,commiter,join,skype,qq,yahoo,gtalk,wangwang,mobile,phone,address,zipcode'; +$config->user->customBatchCreateFields = 'dept,email,gender,commiter,skype,qq,yahoo,gtalk,wangwang,mobile,phone,address,zipcode'; +$config->user->customBatchEditFields = 'dept,email,commiter,skype,qq,yahoo,gtalk,wangwang,mobile,phone,address,zipcode'; $config->user->custom = new stdclass(); $config->user->custom->batchCreateFields = 'dept,email,gender'; diff --git a/module/user/view/create.html.php b/module/user/view/create.html.php index 01bae78aa6..a2e2d8c86e 100644 --- a/module/user/view/create.html.php +++ b/module/user/view/create.html.php @@ -24,7 +24,7 @@
    -
    +
    @@ -69,12 +69,6 @@ - diff --git a/module/user/view/edit.html.php b/module/user/view/edit.html.php index 5b6a859e33..f1d93fe75b 100644 --- a/module/user/view/edit.html.php +++ b/module/user/view/edit.html.php @@ -39,10 +39,6 @@ - @@ -100,7 +96,7 @@ - + diff --git a/module/user/view/profile.html.php b/module/user/view/profile.html.php index 64e3f40f07..9d8f5aee0c 100644 --- a/module/user/view/profile.html.php +++ b/module/user/view/profile.html.php @@ -74,12 +74,6 @@ - @@ -95,11 +89,11 @@ - + - + @@ -107,11 +101,11 @@ - + - + @@ -119,11 +113,11 @@ - + - + From d09eabbad812a056b830ead6a80c57a8e3ecfd5d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 26 Dec 2017 16:40:18 +0800 Subject: [PATCH 031/206] * fix bug and delete test code. --- config/config.php | 8 ++++---- module/bug/view/browse.html.php | 20 ++++++++++---------- module/install/view/index.html.php | 2 +- module/productplan/js/view.js | 1 - module/productplan/lang/en.php | 2 +- module/productplan/lang/zh-cn.php | 2 +- module/productplan/view/view.html.php | 14 +++++++------- module/project/model.php | 3 ++- module/project/view/task.html.php | 2 +- module/story/control.php | 10 +++++----- module/task/model.php | 4 ++-- module/testtask/view/batchrun.html.php | 2 +- 12 files changed, 35 insertions(+), 35 deletions(-) diff --git a/config/config.php b/config/config.php index 8befc3e86c..29bf857529 100644 --- a/config/config.php +++ b/config/config.php @@ -111,6 +111,10 @@ $config->file->allowed = 'txt,doc,docx,dot,wps,wri,pdf,ppt,pptx,xls,xlsx,ett,xlt $filterConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'filter.php'; if(file_exists($filterConfig)) include $filterConfig; +/* 引用自定义的配置。 Include the custom config file. */ +$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php'; +if(file_exists($myConfig)) include $myConfig; + /* 禅道配置文件。zentaopms settings. */ $zentaopmsConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'zentaopms.php'; if(file_exists($zentaopmsConfig)) include $zentaopmsConfig; @@ -118,7 +122,3 @@ if(file_exists($zentaopmsConfig)) include $zentaopmsConfig; /* Include extension config files. */ $extConfigFiles = glob(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ext/*.php'); if($extConfigFiles) foreach($extConfigFiles as $extConfigFile) include $extConfigFile; - -/* 引用自定义的配置。 Include the custom config file. */ -$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php'; -if(file_exists($myConfig)) include $myConfig; diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php index 6c2bd0bce8..640bc46f09 100644 --- a/module/bug/view/browse.html.php +++ b/module/bug/view/browse.html.php @@ -91,15 +91,15 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow name, 'QUERY' === 0) ? (int)substr($menuItem->name, 5) : 0;?> name == 'my'):?> "; - echo html::a('javascript:;', $menuItem->text . " ", '', "data-toggle='dropdown'"); - echo "'; + echo "'; ?>
  12. createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=$browseType¶m=$param"), $menuItem->text)?>
  13. @@ -137,7 +137,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow else { $misc = common::hasPriv('bug', 'create') ? "class='btn btn-primary'" : "class='btn btn-primary disabled'"; - $link = common::hasPriv('bug', 'create') ? $this->createLink('bug', 'create', "productID=$productID&branch=$branch&extra=moduleID=$moduleID") : '#'; + $link = common::hasPriv('bug', 'create') ? $this->createLink('bug', 'create', "productID=$productID&branch=$branch&extra=moduleID=$moduleID") : '#'; echo html::a($link, "" . $lang->bug->create, '', $misc); } diff --git a/module/install/view/index.html.php b/module/install/view/index.html.php index f6aa52dd75..928ace7dde 100644 --- a/module/install/view/index.html.php +++ b/module/install/view/index.html.php @@ -43,7 +43,7 @@
    install->promotion?>
    install->product as $product):?> -
    +
    diff --git a/module/productplan/js/view.js b/module/productplan/js/view.js index 5222235cbc..ad52ab8eca 100644 --- a/module/productplan/js/view.js +++ b/module/productplan/js/view.js @@ -46,7 +46,6 @@ $(function() { var list = ''; for(i = 0; i < data.list.length; i++) list += $(data.list[i]).attr('data-id') + ','; - console.log(list); $.post(createLink('productplan', 'ajaxStorySort', 'planID=' + planID), {'storys' : list, 'orderBy' : orderBy}, function() { var $target = $(data.element[0]); diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index f0450c5f84..c8d9744a0a 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -17,7 +17,7 @@ $lang->productplan->edit = "Edit"; $lang->productplan->delete = "Delete"; $lang->productplan->view = "Details"; $lang->productplan->bugSummary = "%s Bugs in total on this page."; -$lang->productplan->info = 'Info'; +$lang->productplan->info = 'Info'; $lang->productplan->batchEdit = 'Batch Edit'; $lang->productplan->batchUnlink = "Batch Unlink"; diff --git a/module/productplan/lang/zh-cn.php b/module/productplan/lang/zh-cn.php index 4f6b622a60..c2c8b5973e 100644 --- a/module/productplan/lang/zh-cn.php +++ b/module/productplan/lang/zh-cn.php @@ -17,7 +17,7 @@ $lang->productplan->edit = "编辑计划"; $lang->productplan->delete = "删除计划"; $lang->productplan->view = "计划详情"; $lang->productplan->bugSummary = "本页共 %s 个Bug"; -$lang->productplan->info = '信息'; +$lang->productplan->info = '信息'; $lang->productplan->batchEdit = '批量编辑'; $lang->productplan->batchUnlink = "批量移除"; diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index 59422c92de..a3f29aeb65 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -401,12 +401,12 @@
    - type != 'normal'):?> - - - - - + type != 'normal'):?> + + + + + @@ -423,7 +423,7 @@
    - +
    diff --git a/module/project/model.php b/module/project/model.php index 62da93a77d..63ea757374 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1846,7 +1846,8 @@ class projectModel extends model $totalLeft += (($task->status == 'cancel' or $task->closedReason == 'cancel') ? 0 : $task->left); $statusVar = 'status' . ucfirst($task->status); $$statusVar ++; - if(!empty($task->children)){ + if(!empty($task->children)) + { $taskSum += count($task->children); foreach($task->children as $child) { diff --git a/module/project/view/task.html.php b/module/project/view/task.html.php index 8a7efdad3f..38cab6a3f1 100644 --- a/module/project/view/task.html.php +++ b/module/project/view/task.html.php @@ -76,7 +76,7 @@ js::set('browseType', $browseType);
    - + task->printCell($field, $task, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table');?> children)):?> diff --git a/module/story/control.php b/module/story/control.php index 6defe6006a..b78433997c 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -243,11 +243,11 @@ class story extends control $this->product->setMenu($products, $product->id, $branch); /* Init vars. */ - $planID = $plan; - $pri = 0; - $estimate = ''; - $title = ''; - $spec = ''; + $planID = $plan; + $pri = 0; + $estimate = ''; + $title = ''; + $spec = ''; /* Process upload images. */ if($this->session->storyImagesFile) diff --git a/module/task/model.php b/module/task/model.php index 5e4c3404c3..49a3084350 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -2039,7 +2039,7 @@ class taskModel extends model $class = ''; if($id == 'status') $class .= ' task-' . $task->status; if($id == 'id') $class .= ' cell-id'; - if($id == 'name') $class .= ' text-left'; + if($id == 'name') $class .= ' text-left'; if($id == 'deadline' and isset($task->delay)) $class .= ' delayed'; if($id == 'assignedTo' && $task->assignedTo == $account) $class .= ' red'; @@ -2138,7 +2138,7 @@ class taskModel extends model } else { - echo $task->storyTitle; + echo ""; } } break; diff --git a/module/testtask/view/batchrun.html.php b/module/testtask/view/batchrun.html.php index 7e8df732a4..98fc6cf8ba 100644 --- a/module/testtask/view/batchrun.html.php +++ b/module/testtask/view/batchrun.html.php @@ -36,7 +36,7 @@ - + - - + + - + From f1e5a2c6dd91c91a20d6e5f82939ff44058c4c2a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 27 Dec 2017 17:55:48 +0800 Subject: [PATCH 042/206] * fix bug #1362. --- module/task/view/batchcreate.html.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/module/task/view/batchcreate.html.php b/module/task/view/batchcreate.html.php index da7d9e202f..6e0eceec37 100644 --- a/module/task/view/batchcreate.html.php +++ b/module/task/view/batchcreate.html.php @@ -74,8 +74,11 @@ if($hiddenStory and isset($visibleFields['story'])) $colspan -= 1; ?> - - + + type != 'ops'):?> - + plans) ? count($product->plans) : 1;?> - + plans)):?> plans as $plan):?> From a8a1d0c11ccdc4ce310c0d5fe8f140909b782d49 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 28 Dec 2017 10:16:44 +0800 Subject: [PATCH 044/206] * fix bug for search in link story. --- module/story/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index f877f00b02..7ec40cf7ee 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -1596,7 +1596,7 @@ class storyModel extends model ->fetchPairs(); $sql = str_replace(array('`product`', '`version`'), array('t1.`product`', 't1.`version`'), $sql); - $tmpStories = $this->dao->select('*')->from(TABLE_STORY)->alias('t1') + $tmpStories = $this->dao->select('t1.*')->from(TABLE_STORY)->alias('t1') ->leftJoin(TABLE_PROJECTSTORY)->alias('t2')->on('t1.id=t2.story') ->where($sql) ->beginIF($productID != 'all' and $productID != '')->andWhere('t1.`product`')->eq((int)$productID)->fi() From cbf08b828a0b37be332f16b280459f4ad4076520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 28 Dec 2017 18:03:48 +0800 Subject: [PATCH 045/206] * Task#3561 --- db/update9.7.sql | 4 + module/convert/converter/redmine1.1.php | 132 +++---- module/doc/model.php | 121 +++---- module/my/control.php | 92 ++--- module/my/view/project.html.php | 4 +- module/product/model.php | 10 +- module/project/model.php | 447 ++++++++++++------------ module/score/model.php | 6 +- module/story/model.php | 9 +- module/task/control.php | 11 +- module/task/model.php | 75 ++-- module/user/model.php | 147 ++++---- module/user/view/project.html.php | 6 +- 13 files changed, 565 insertions(+), 499 deletions(-) create mode 100644 db/update9.7.sql diff --git a/db/update9.7.sql b/db/update9.7.sql new file mode 100644 index 0000000000..a02909c04c --- /dev/null +++ b/db/update9.7.sql @@ -0,0 +1,4 @@ +ALTER TABLE `zt_team` DROP PRIMARY KEY; +ALTER TABLE `zt_team` CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'; +ALTER TABLE `zt_team` DROP `task`; +ALTER TABLE `zt_team` ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`; diff --git a/module/convert/converter/redmine1.1.php b/module/convert/converter/redmine1.1.php index 0d7c93071a..563a1f5026 100644 --- a/module/convert/converter/redmine1.1.php +++ b/module/convert/converter/redmine1.1.php @@ -34,7 +34,7 @@ class redmine11ConvertModel extends redmineConvertModel } /** * Execute the converter. - * + * * @access public * @return array */ @@ -74,11 +74,11 @@ class redmine11ConvertModel extends redmineConvertModel $result['docs'] = self::$convertDocCount; $result['files'] = self::$convertFileCount; return $result; - } - - /** - * Set table names. - * + } + + /** + * Set table names. + * * @access public * @return void */ @@ -137,9 +137,9 @@ class redmine11ConvertModel extends redmineConvertModel /** * Convert groups. - * + * * @access public - * @return void + * @return void */ public function convertGroup() { @@ -176,9 +176,9 @@ class redmine11ConvertModel extends redmineConvertModel /** * Convert users. - * + * * @access public - * @return void + * @return void */ public function convertUser() { @@ -217,8 +217,8 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert relationship between user and group. - * + * convert relationship between user and group. + * * @access public * @return void */ @@ -255,10 +255,10 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert products. - * + * convert products. + * * @access public - * @return void + * @return void */ public function convertProduct() { @@ -280,9 +280,9 @@ class redmine11ConvertModel extends redmineConvertModel /** * Convert projects. - * + * * @access public - * @return void + * @return void */ public function convertProject() { @@ -313,12 +313,12 @@ class redmine11ConvertModel extends redmineConvertModel $convertCount = count($projects) + count($this->map['projectOfProduct']); self::$convertProjectCount += $convertCount; } - + /** - * convert builds and releases - * + * convert builds and releases + * * @access public - * @return void + * @return void */ public function convertBuildAndRelease() { @@ -370,10 +370,10 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert productPlans - * + * convert productPlans + * * @access public - * @return void + * @return void */ public function convertProductPlan() { @@ -401,11 +401,11 @@ class redmine11ConvertModel extends redmineConvertModel } $convertCount = count($this->map['products']) + count($productPlans); self::$convertProductPlanCount += $convertCount; - } + } /** - * convert relationship between project and product. - * + * convert relationship between project and product. + * * @access public * @return void */ @@ -424,8 +424,8 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert teams. - * + * convert teams. + * * @access public * @return void */ @@ -454,10 +454,10 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert docLibs. - * + * convert docLibs. + * * @access public - * @return void + * @return void */ public function convertDocLib() { @@ -478,10 +478,10 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert docs. - * + * convert docs. + * * @access public - * @return void + * @return void */ public function convertDoc() { @@ -507,10 +507,10 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert news. - * + * convert news. + * * @access public - * @return void + * @return void */ public function convertNews() { @@ -541,12 +541,12 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert issue - * + * convert issue + * * @param array $aimTypes //aimTypes['issueTypeID'] = aimtype eg. aimTypes[1] = 'bug'; * @param array $statusTypes //statusTypes['task']['statusTypeID'] = statusType eg. statusTypes['task'][1] = 'wait'; * //statusTypes['bug']['statusTypeID'] = statusType eg. statusTypes['bug'][1] = 'active'; - * @param array $priTypes //priTypes['task']['priTypeID'] = priType; eg. priTypes['task'][1] = 1; + * @param array $priTypes //priTypes['task']['priTypeID'] = priType; eg. priTypes['task'][1] = 1; * @access public * @return void */ @@ -574,13 +574,13 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert story - * - * @param array $issueType - * @param array $statusTypes - * @param array $priTypes + * convert story + * + * @param array $issueType + * @param array $statusTypes + * @param array $priTypes * @access public - * @return void + * @return void */ public function convertStory($issueType, $statusTypes, $priTypes) { @@ -623,13 +623,13 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert task - * - * @param array $issueType - * @param array $statusTypes - * @param array $priTypes + * convert task + * + * @param array $issueType + * @param array $statusTypes + * @param array $priTypes * @access public - * @return void + * @return void */ public function convertTask($issueType, $statusTypes, $priTypes) { @@ -651,7 +651,7 @@ class redmine11ConvertModel extends redmineConvertModel $task->pri = $priTypes['task'][$task->pri]; $task->status = $statusTypes['task'][$task->status]; if($task->project == 0) - { + { $task->project = $this->map['projectOfProduct'][$task->product]; } else @@ -668,13 +668,13 @@ class redmine11ConvertModel extends redmineConvertModel } /** - * convert bug - * - * @param array $issueType - * @param array $statusTypes - * @param array $priTypes + * convert bug + * + * @param array $issueType + * @param array $statusTypes + * @param array $priTypes * @access public - * @return void + * @return void */ public function convertBug($issueType, $statusTypes, $priTypes) { @@ -704,7 +704,7 @@ class redmine11ConvertModel extends redmineConvertModel $bug->caseVersion = 1; $bug->result = 0; if($bug->project == 0) - { + { $bug->project = $this->map['projectOfProduct'][$bug->product]; } else @@ -712,7 +712,7 @@ class redmine11ConvertModel extends redmineConvertModel $bug->project = $this->map['project'][$bug->project]; } unset($bug->id); - $this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec(); + $this->dao->dbh($this->dbh)->insert(TABLE_BUG)->data($bug)->exec(); $this->map['issueID'][$issueID] = $this->dao->lastInsertID(); $this->map['issueType'][$issueID] = 'bug'; } @@ -721,9 +721,9 @@ class redmine11ConvertModel extends redmineConvertModel /** * Convert attachments. - * + * * @access public - * @return void + * @return void */ public function convertFile() { @@ -752,7 +752,7 @@ class redmine11ConvertModel extends redmineConvertModel /* Transform objectType and objectID */ if($file->objectType == 'Issue') { - $file->objectType = $this->map['issueType'][$file->objectID]; + $file->objectType = $this->map['issueType'][$file->objectID]; $file->objectID = $this->map['issueID'][$file->objectID]; } elseif($file->objectType == 'Document') @@ -808,7 +808,7 @@ class redmine11ConvertModel extends redmineConvertModel /** * Clear the converted records. - * + * * @access public * @return void */ diff --git a/module/doc/model.php b/module/doc/model.php index 9345c10628..574f7ec20a 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -15,10 +15,10 @@ class docModel extends model { /** * Set menus - * - * @param array $libs - * @param int $libID - * @param string $moduleID + * + * @param array $libs + * @param int $libID + * @param string $moduleID * @access public * @return void */ @@ -80,8 +80,8 @@ class docModel extends model /** * Get library by id. - * - * @param int $libID + * + * @param int $libID * @access public * @return object */ @@ -92,7 +92,7 @@ class docModel extends model /** * Get libraries. - * + * * @access public * @return array */ @@ -127,7 +127,7 @@ class docModel extends model /** * Create a library. - * + * * @access public * @return void */ @@ -151,8 +151,8 @@ class docModel extends model /** * Update a library. - * - * @param int $libID + * + * @param int $libID * @access public * @return void */ @@ -373,7 +373,7 @@ class docModel extends model /** * Create a doc. - * + * * @access public * @return void */ @@ -438,8 +438,8 @@ class docModel extends model /** * Update a doc. - * - * @param int $docID + * + * @param int $docID * @access public * @return void */ @@ -541,7 +541,7 @@ class docModel extends model /** * Get pairs of project modules. - * + * * @access public * @return array */ @@ -556,9 +556,9 @@ class docModel extends model /** * Get doc menu. - * - * @param int $libID - * @param int $parent + * + * @param int $libID + * @param int $parent * @access public * @return array */ @@ -576,8 +576,8 @@ class docModel extends model * Extract css styles for tables created in kindeditor. * * Like this:
    user->dept;?> user->commiter;?>
    user->gender;?> user->genderList, 'm');?>
    user->gender;?> user->genderList, $user->gender);?>
    phone, "class='form-control' autocomplete='off'");?> user->address;?> address, "class='form-control' autocomplete='off'");?>
    user->zipcode;?> zipcode, "class='form-control' autocomplete='off'");?>user->email;?> email;?>
    user->visits;?> visits;?>
    user->skype;?> skype) echo html::a("callto://$user->skype", $user->skype);?>
    user->qq;?> qq) echo html::a("tencent://message/?uin=$user->qq", $user->qq);?>
    user->yahoo;?> yahoo;?>
    user->gtalk;?> gtalk;?>
    user->wangwang;?> wangwang;?>
    user->mobile;?> mobile;?>
    user->phone;?> phone;?>
    user->address;?> address;?>
    user->zipcode;?> zipcode;?>productplan->title;?> title;?>
    product->branch;?>branch];?>
    product->branch;?>branch];?>
    productplan->begin;?> begin;?>
    version)?> module] . "'>" . $moduleOptionMenu[$cases[$caseID]->module] . ""?>title}'>{$cases[$caseID]->title}"?>我是测试的测试的测试我是测试的测试的测试我是测试的测试的测试我是测试的测试的测试我是测试的测试的测试title}'>{$cases[$caseID]->title}"?> precondition}'>{$cases[$caseID]->precondition}"?> lang->testcase->resultList, 'pass', "onclick='showAction(this.value,\".action$caseID\")'", 'block')?> From e585e048b970598378c472c2d096f4500b67aa3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 26 Dec 2017 16:46:59 +0800 Subject: [PATCH 032/206] * Format code. --- module/misc/model.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/misc/model.php b/module/misc/model.php index ec1e10c213..7372f15931 100644 --- a/module/misc/model.php +++ b/module/misc/model.php @@ -20,8 +20,8 @@ class miscModel extends model /** * Get table and status. - * - * @param string $type + * + * @param string $type * @access public * @return array|false */ @@ -30,13 +30,13 @@ class miscModel extends model if($type != 'check' and $type != 'repair') return false; $tables = array(); $stmt = $this->dao->query("show full tables"); - while($table = $stmt->fetch(PDO::FETCH_ASSOC)) + while($table = $stmt->fetch(PDO::FETCH_ASSOC)) { $tableName = $table["Tables_in_{$this->config->db->name}"]; $tableType = strtolower($table['Table_type']); if($tableType == 'base table') { - $tableStatus = $this->dao->query("$type table $tableName")->fetch(); + $tableStatus = $this->dao->query("$type table $tableName")->fetch(); $tables[$tableName] = strtolower($tableStatus->Msg_text); } } From 2450f3b4cd86ece0c186cef4b466ad181413ae49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 26 Dec 2017 17:41:19 +0800 Subject: [PATCH 033/206] * Format code. --- module/misc/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/misc/model.php b/module/misc/model.php index 7372f15931..cc0dff3cbf 100644 --- a/module/misc/model.php +++ b/module/misc/model.php @@ -1,7 +1,6 @@ @@ -22,6 +21,7 @@ class miscModel extends model * Get table and status. * * @param string $type + * * @access public * @return array|false */ @@ -29,7 +29,7 @@ class miscModel extends model { if($type != 'check' and $type != 'repair') return false; $tables = array(); - $stmt = $this->dao->query("show full tables"); + $stmt = $this->dao->query("show full tables"); while($table = $stmt->fetch(PDO::FETCH_ASSOC)) { $tableName = $table["Tables_in_{$this->config->db->name}"]; From 3a59ee210ca2adf3c16772eacbc490c8725caadd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 27 Dec 2017 09:07:49 +0800 Subject: [PATCH 034/206] * Fix bug for EN. --- module/common/lang/en.php | 9 +++++---- module/common/lang/zh-cn.php | 9 +++++---- module/common/view/footer.html.php | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/module/common/lang/en.php b/module/common/lang/en.php index b38493eb76..043bdfb566 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -468,6 +468,7 @@ $lang->pager->summery = "%s-%s of %s."; $lang->proVersion = "ZenTao Pro   "; $lang->downNotify = "Download Desktop Notification"; +$lang->website = "http://www.zentao.pm"; $lang->suhosinInfo = "Warning! Data is reaching the limit. Please change sohusin.post.max_vars and sohusin.request.max_vars (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved."; $lang->maxVarsInfo = "Warning! Data is reaching the limit. Please change max_input_vars (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved."; @@ -608,7 +609,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyStory') /* Adjust sub menu of product module. */ unset($lang->product->menu->project); unset($lang->product->menu->doc); - + /* Rename product module. */ $lang->menu->product = "{$lang->productCommon}|product|index"; @@ -806,7 +807,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->build->menu = $lang->product->menu; $lang->build->menuOrder = $lang->product->menuOrder; - + /* Adjust menu group. */ $lang->menugroup->bug = 'bug'; $lang->menugroup->testcase = 'testcase'; @@ -814,8 +815,8 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->menugroup->testsuite = 'testsuite'; $lang->menugroup->testreport = 'testtask'; $lang->menugroup->build = 'product'; - - /* Adjust search objects. */ + + /* Adjust search objects. */ unset($lang->searchObjects['story']); unset($lang->searchObjects['task']); unset($lang->searchObjects['release']); diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 7a19df6df4..1e701daec1 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -468,6 +468,7 @@ $lang->pager->summery = "第 %s-%s 项,共 %sproVersion = "专业版   "; $lang->downNotify = "下载桌面提醒"; +$lang->website = "http://www.zentao.net"; $lang->suhosinInfo = "警告:数据太多,请在php.ini中修改sohusin.post.max_vars和sohusin.request.max_vars(大于%s的数)。 保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。"; $lang->maxVarsInfo = "警告:数据太多,请在php.ini中修改max_input_vars(大于%s的数)。 保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。"; @@ -608,7 +609,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyStory') /* Adjust sub menu of product module. */ unset($lang->product->menu->project); unset($lang->product->menu->doc); - + /* Rename product module. */ $lang->menu->product = "{$lang->productCommon}|product|index"; @@ -806,7 +807,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->build->menu = $lang->product->menu; $lang->build->menuOrder = $lang->product->menuOrder; - + /* Adjust menu group. */ $lang->menugroup->bug = 'bug'; $lang->menugroup->testcase = 'testcase'; @@ -814,8 +815,8 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->menugroup->testsuite = 'testsuite'; $lang->menugroup->testreport = 'testtask'; $lang->menugroup->build = 'product'; - - /* Adjust search objects. */ + + /* Adjust search objects. */ unset($lang->searchObjects['story']); unset($lang->searchObjects['task']); unset($lang->searchObjects['release']); diff --git a/module/common/view/footer.html.php b/module/common/view/footer.html.php index 780115ee9a..c344e96652 100755 --- a/module/common/view/footer.html.php +++ b/module/common/view/footer.html.php @@ -1,7 +1,7 @@ getExtViewFile(__FILE__)){include $extView; return helper::cd();}?> - +
    @@ -12,7 +12,7 @@ moduleName, isset($position) ? $position : ''); ?> @@ -47,7 +47,7 @@ $(function(){ redirect('', 'config->sso -loadModel('cron')->runable()) js::execute('startCron()'); if(isset($pageJS)) js::execute($pageJS); // load the js for current page. From 1a456cada8c0075fde934419594c3d4418704f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 27 Dec 2017 15:05:14 +0800 Subject: [PATCH 035/206] * Fix bug for EN. --- module/misc/lang/en.php | 2 +- module/misc/lang/zh-cn.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index ee3ed24864..853072653f 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -53,7 +53,7 @@ $lang->misc->zentao->service['servicemore']= 'More'; $lang->misc->mobile = "Mobile Access"; $lang->misc->noGDLib = "Please use the browser on your phone to visit %s"; -$lang->misc->copyright = "© 2009 - 2016 Qingdao Nature Easy Soft Co., Ltd Tel 4006-8899-23 Email co@zentao.net"; +$lang->misc->copyright = "© 2009 - 2018 Nature Easy Soft Network Technology Co,LTD Email Max@easysoft.ltd"; $lang->misc->checkTable = "Check Data Table"; $lang->misc->needRepair = "Repair Table"; $lang->misc->repairTable = "Database table is damaged due to power outage. Please chech and repair!"; diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index fb2f8facc7..23e21d26ce 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -53,7 +53,7 @@ $lang->misc->zentao->service['servicemore']= '更多服务...'; $lang->misc->mobile = "手机访问"; $lang->misc->noGDLib = "请用手机浏览器访问:%s"; -$lang->misc->copyright = "© 2009 - 2016 青岛易软天创网络科技有限公司 电话:4006-8899-23 Email:co@zentao.net QQ:1492153927"; +$lang->misc->copyright = "© 2009 - 2018 青岛易软天创网络科技有限公司 电话:4006-8899-23 Email:co@zentao.net QQ:1492153927"; $lang->misc->checkTable = "检查修复数据表"; $lang->misc->needRepair = "修复表"; $lang->misc->repairTable = "数据库表可能因为断电原因损坏,需要检查修复!!"; From 89565cfbc61935991d2525eb5a7327d2216e4f18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 27 Dec 2017 15:42:03 +0800 Subject: [PATCH 036/206] * Format code. --- module/common/lang/en.php | 170 +++++++++++++++++------------------ module/common/lang/zh-cn.php | 150 +++++++++++++++---------------- 2 files changed, 160 insertions(+), 160 deletions(-) diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 043bdfb566..7590afad4a 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -86,9 +86,9 @@ $lang->loading = 'Loading...'; $lang->notFound = 'Not found!'; $lang->showAll = '[[Show All]]'; -$lang->future = 'Pending'; -$lang->year = 'Year'; -$lang->workingHour = 'Hour'; +$lang->future = 'Pending'; +$lang->year = 'Year'; +$lang->workingHour = 'Hour'; $lang->idAB = 'ID'; $lang->priAB = 'P'; @@ -102,14 +102,14 @@ $lang->common->common = 'Common Module'; /* 主导航菜单。*/ $lang->menu = new stdclass(); -$lang->menu->my = 'Dashboard|my|index'; -$lang->menu->product = $lang->productCommon . '|product|index'; -$lang->menu->project = $lang->projectCommon . '|project|index'; -$lang->menu->qa = 'QA|qa|index'; -$lang->menu->doc = 'Doc|doc|index'; -$lang->menu->report = 'Report|report|index'; -$lang->menu->company = 'Company|company|index'; -$lang->menu->admin = 'Admin|admin|index'; +$lang->menu->my = 'Dashboard|my|index'; +$lang->menu->product = $lang->productCommon . '|product|index'; +$lang->menu->project = $lang->projectCommon . '|project|index'; +$lang->menu->qa = 'QA|qa|index'; +$lang->menu->doc = 'Doc|doc|index'; +$lang->menu->report = 'Report|report|index'; +$lang->menu->company = 'Company|company|index'; +$lang->menu->admin = 'Admin|admin|index'; /* 查询条中可以选择的对象列表。*/ $lang->searchObjects['bug'] = 'Bug'; @@ -145,12 +145,12 @@ $lang->exportTypeList['selected'] = 'Selected'; $lang->lang = 'Language'; /* 风格列表。*/ -$lang->theme = 'Theme'; -$lang->themes['default'] = 'Default'; -$lang->themes['green'] = 'Green'; -$lang->themes['red'] = 'Red'; -$lang->themes['lightblue'] = 'Bright Blue'; -$lang->themes['blackberry'] = 'Blackberry'; +$lang->theme = 'Theme'; +$lang->themes['default'] = 'Default'; +$lang->themes['green'] = 'Green'; +$lang->themes['red'] = 'Red'; +$lang->themes['lightblue'] = 'Bright Blue'; +$lang->themes['blackberry'] = 'Blackberry'; /* 首页菜单设置。*/ $lang->index = new stdclass(); @@ -187,20 +187,20 @@ $lang->score->menu = $lang->my->menu; $lang->product = new stdclass(); $lang->product->menu = new stdclass(); -$lang->product->menu->list = array('link' => '%s', 'fixed' => true); -$lang->product->menu->story = array('link' => 'Story|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); -$lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s'; -$lang->product->menu->plan = array('link' => 'Plan|productplan|browse|productID=%s', 'subModule' => 'productplan'); -$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release'); -$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s'; -$lang->product->menu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); -$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; -$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story'; -$lang->product->menu->view = array('link' => 'Overview|product|view|productID=%s', 'alias' => 'edit'); -$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; -$lang->product->menu->create = array('link' => " Add{$lang->productCommon}|product|create", 'float' => 'right'); -$lang->product->menu->all = array('link' => " All{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); -$lang->product->menu->index = array('link' => "{$lang->productCommon}|product|index|locate=no", 'float' => 'right'); +$lang->product->menu->list = array('link' => '%s', 'fixed' => true); +$lang->product->menu->story = array('link' => 'Story|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); +$lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s'; +$lang->product->menu->plan = array('link' => 'Plan|productplan|browse|productID=%s', 'subModule' => 'productplan'); +$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s'; +$lang->product->menu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); +$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; +$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story'; +$lang->product->menu->view = array('link' => 'Overview|product|view|productID=%s', 'alias' => 'edit'); +$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; +$lang->product->menu->create = array('link' => " Add{$lang->productCommon}|product|create", 'float' => 'right'); +$lang->product->menu->all = array('link' => " All{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); +$lang->product->menu->index = array('link' => "{$lang->productCommon}|product|index|locate=no", 'float' => 'right'); $lang->story = new stdclass(); $lang->productplan = new stdclass(); @@ -216,20 +216,20 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'fixed' => true); -$lang->project->menu->task = array('link' => 'Task|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); -$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; -$lang->project->menu->dynamic = 'Dynamic|project|dynamic|projectID=%s'; -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => 'Test Task|project|testtask|projectID=%s'); -$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); -$lang->project->menu->create = array('link' => " Add {$lang->projectCommon}|project|create", 'float' => 'right'); -$lang->project->menu->all = array('link' => " All {$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); -$lang->project->menu->index = array('link' => "{$lang->projectCommon}|project|index|locate=no", 'float' => 'right'); +$lang->project->menu->list = array('link' => '%s', 'fixed' => true); +$lang->project->menu->task = array('link' => 'Task|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); +$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; +$lang->project->menu->dynamic = 'Dynamic|project|dynamic|projectID=%s'; +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => 'Test Task|project|testtask|projectID=%s'); +$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); +$lang->project->menu->create = array('link' => " Add {$lang->projectCommon}|project|create", 'float' => 'right'); +$lang->project->menu->all = array('link' => " All {$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); +$lang->project->menu->index = array('link' => "{$lang->projectCommon}|project|index|locate=no", 'float' => 'right'); $lang->task = new stdclass(); $lang->build = new stdclass(); @@ -296,9 +296,9 @@ $lang->caselib->menu->index = array('link' => "Test $lang->doc = new stdclass(); $lang->doc->menu = new stdclass(); -$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->create = array('link' => ' Add Doc Lib|doc|createLib', 'float' => 'right'); +$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->create = array('link' => ' Add Doc Lib|doc|createLib', 'float' => 'right'); /* 统计视图菜单设置。*/ $lang->report = new stdclass(); @@ -336,17 +336,17 @@ $lang->user->menu = $lang->company->menu; /* 后台管理菜单设置。*/ $lang->admin = new stdclass(); $lang->admin->menu = new stdclass(); -$lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); +$lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); -$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); -$lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail'); -$lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); -$lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak'); -$lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); -$lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action'); -$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); -$lang->admin->menu->api = array('link' => 'API|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); -$lang->admin->menu->sso = 'RangerTeam|admin|sso'; +$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); +$lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail'); +$lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); +$lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak'); +$lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); +$lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action'); +$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); +$lang->admin->menu->api = array('link' => 'API|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); +$lang->admin->menu->sso = 'RangerTeam|admin|sso'; $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); @@ -466,32 +466,32 @@ $lang->pager->previousPage = "Prev"; $lang->pager->nextPage = "Next"; $lang->pager->summery = "%s-%s of %s."; -$lang->proVersion = "ZenTao Pro   "; -$lang->downNotify = "Download Desktop Notification"; -$lang->website = "http://www.zentao.pm"; +$lang->proVersion = "ZenTao Pro   "; +$lang->downNotify = "Download Desktop Notification"; +$lang->website = "http://www.zentao.pm"; $lang->suhosinInfo = "Warning! Data is reaching the limit. Please change sohusin.post.max_vars and sohusin.request.max_vars (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved."; $lang->maxVarsInfo = "Warning! Data is reaching the limit. Please change max_input_vars (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved."; $lang->pasteTextInfo = "Paste text here. Each line will be a header of each data record. "; $lang->noticeImport = "

    Imported data contains data that has already existed in system. Please confirm you actions on the date

    Override New Insertion

    "; -$lang->noResultsMatch = "No results match!"; -$lang->searchMore = "More results:"; -$lang->chooseUsersToMail = "Choose users that will be notified."; -$lang->browserNotice = 'Your current browser might not show the best effect. Please use Chrome, Firefox, IE9+, Opera or Safari.'; -$lang->noticePasteImg = "Paste image here."; +$lang->noResultsMatch = "No results match!"; +$lang->searchMore = "More results:"; +$lang->chooseUsersToMail = "Choose users that will be notified."; +$lang->browserNotice = 'Your current browser might not show the best effect. Please use Chrome, Firefox, IE9+, Opera or Safari.'; +$lang->noticePasteImg = "Paste image here."; /* 时间格式设置。*/ -if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); -if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); -if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i'); -if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n/d H:i'); -if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); -if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); -if(!defined('DT_DATE3')) define('DT_DATE3', 'Y/m/d'); -if(!defined('DT_DATE4')) define('DT_DATE4', 'n/j'); -if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); -if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); +if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); +if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); +if(!defined('DT_MONTHTIME1')) define('DT_MONTHTIME1', 'n/d H:i'); +if(!defined('DT_MONTHTIME2')) define('DT_MONTHTIME2', 'n/d H:i'); +if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); +if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); +if(!defined('DT_DATE3')) define('DT_DATE3', 'Y/m/d'); +if(!defined('DT_DATE4')) define('DT_DATE4', 'n/j'); +if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); +if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); /* datepicker 时间*/ $lang->datepicker = new stdclass(); @@ -762,15 +762,15 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->testtask->menu->report = array('link' => 'Report|testreport|browse'); $lang->testtask->menu->create = array('link' => " Create|testtask|create|productID=%s", 'float' => 'right'); - $lang->testtask->menuOrder[5] = 'product'; - $lang->testtask->menuOrder[10] = 'scope'; - $lang->testtask->menuOrder[15] = 'wait'; - $lang->testtask->menuOrder[20] = 'doing'; - $lang->testtask->menuOrder[25] = 'blocked'; - $lang->testtask->menuOrder[30] = 'done'; - $lang->testtask->menuOrder[35] = 'totalStatus'; - $lang->testtask->menuOrder[40] = 'report'; - $lang->testtask->menuOrder[45] = 'create'; + $lang->testtask->menuOrder[5] = 'product'; + $lang->testtask->menuOrder[10] = 'scope'; + $lang->testtask->menuOrder[15] = 'wait'; + $lang->testtask->menuOrder[20] = 'doing'; + $lang->testtask->menuOrder[25] = 'blocked'; + $lang->testtask->menuOrder[30] = 'done'; + $lang->testtask->menuOrder[35] = 'totalStatus'; + $lang->testtask->menuOrder[40] = 'report'; + $lang->testtask->menuOrder[45] = 'create'; $lang->testreport->menu = $lang->testtask->menu; $lang->testreport->menuOrder = $lang->testtask->menuOrder; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 1e701daec1..b6433b8b48 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -86,9 +86,9 @@ $lang->loading = '稍候...'; $lang->notFound = '抱歉,您访问的对象并不存在!'; $lang->showAll = '[[全部显示]]'; -$lang->future = '未来'; -$lang->year = '年'; -$lang->workingHour = '工时'; +$lang->future = '未来'; +$lang->year = '年'; +$lang->workingHour = '工时'; $lang->idAB = 'ID'; $lang->priAB = 'P'; @@ -102,14 +102,14 @@ $lang->common->common = '公有模块'; /* 主导航菜单。*/ $lang->menu = new stdclass(); -$lang->menu->my = ' 我的地盘|my|index'; -$lang->menu->product = $lang->productCommon . '|product|index'; -$lang->menu->project = $lang->projectCommon . '|project|index'; -$lang->menu->qa = '测试|qa|index'; -$lang->menu->doc = '文档|doc|index'; -$lang->menu->report = '统计|report|index'; -$lang->menu->company = '组织|company|index'; -$lang->menu->admin = '后台|admin|index'; +$lang->menu->my = ' 我的地盘|my|index'; +$lang->menu->product = $lang->productCommon . '|product|index'; +$lang->menu->project = $lang->projectCommon . '|project|index'; +$lang->menu->qa = '测试|qa|index'; +$lang->menu->doc = '文档|doc|index'; +$lang->menu->report = '统计|report|index'; +$lang->menu->company = '组织|company|index'; +$lang->menu->admin = '后台|admin|index'; /* 查询条中可以选择的对象列表。*/ $lang->searchObjects['bug'] = 'Bug'; @@ -145,12 +145,12 @@ $lang->exportTypeList['selected'] = '选中记录'; $lang->lang = 'Language'; /* 风格列表。*/ -$lang->theme = '主题'; -$lang->themes['default'] = '默认'; -$lang->themes['green'] = '绿色'; -$lang->themes['red'] = '红色'; -$lang->themes['lightblue'] = '亮蓝'; -$lang->themes['blackberry'] = '黑莓'; +$lang->theme = '主题'; +$lang->themes['default'] = '默认'; +$lang->themes['green'] = '绿色'; +$lang->themes['red'] = '红色'; +$lang->themes['lightblue'] = '亮蓝'; +$lang->themes['blackberry'] = '黑莓'; /* 首页菜单设置。*/ $lang->index = new stdclass(); @@ -187,20 +187,20 @@ $lang->score->menu = $lang->my->menu; $lang->product = new stdclass(); $lang->product->menu = new stdclass(); -$lang->product->menu->list = array('link' => '%s', 'fixed' => true); -$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); -$lang->product->menu->dynamic = '动态|product|dynamic|productID=%s'; -$lang->product->menu->plan = array('link' => '计划|productplan|browse|productID=%s', 'subModule' => 'productplan'); -$lang->product->menu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release'); -$lang->product->menu->roadmap = '路线图|product|roadmap|productID=%s'; -$lang->product->menu->doc = array('link' => '文档|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); -$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; -$lang->product->menu->module = '模块|tree|browse|productID=%s&view=story'; -$lang->product->menu->view = array('link' => '概况|product|view|productID=%s', 'alias' => 'edit'); -$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; -$lang->product->menu->create = array('link' => " 添加{$lang->productCommon}|product|create", 'float' => 'right'); -$lang->product->menu->all = array('link' => " 所有{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); -$lang->product->menu->index = array('link' => "{$lang->productCommon}主页|product|index|locate=no", 'float' => 'right'); +$lang->product->menu->list = array('link' => '%s', 'fixed' => true); +$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); +$lang->product->menu->dynamic = '动态|product|dynamic|productID=%s'; +$lang->product->menu->plan = array('link' => '计划|productplan|browse|productID=%s', 'subModule' => 'productplan'); +$lang->product->menu->release = array('link' => '发布|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap = '路线图|product|roadmap|productID=%s'; +$lang->product->menu->doc = array('link' => '文档|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); +$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; +$lang->product->menu->module = '模块|tree|browse|productID=%s&view=story'; +$lang->product->menu->view = array('link' => '概况|product|view|productID=%s', 'alias' => 'edit'); +$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; +$lang->product->menu->create = array('link' => " 添加{$lang->productCommon}|product|create", 'float' => 'right'); +$lang->product->menu->all = array('link' => " 所有{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); +$lang->product->menu->index = array('link' => "{$lang->productCommon}主页|product|index|locate=no", 'float' => 'right'); $lang->story = new stdclass(); $lang->productplan = new stdclass(); @@ -216,20 +216,20 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'fixed' => true); -$lang->project->menu->task = array('link' => '任务|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); -$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; -$lang->project->menu->dynamic = '动态|project|dynamic|projectID=%s'; -$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => '测试单|project|testtask|projectID=%s'); -$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->view = array('link' => '概况|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); -$lang->project->menu->create = array('link' => " 添加{$lang->projectCommon}|project|create", 'float' => 'right'); -$lang->project->menu->all = array('link' => " 所有{$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); -$lang->project->menu->index = array('link' => "{$lang->projectCommon}主页|project|index|locate=no", 'float' => 'right'); +$lang->project->menu->list = array('link' => '%s', 'fixed' => true); +$lang->project->menu->task = array('link' => '任务|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); +$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; +$lang->project->menu->dynamic = '动态|project|dynamic|projectID=%s'; +$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => '测试单|project|testtask|projectID=%s'); +$lang->project->menu->team = array('link' => '团队|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->doc = array('link' => '文档|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->view = array('link' => '概况|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); +$lang->project->menu->create = array('link' => " 添加{$lang->projectCommon}|project|create", 'float' => 'right'); +$lang->project->menu->all = array('link' => " 所有{$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); +$lang->project->menu->index = array('link' => "{$lang->projectCommon}主页|project|index|locate=no", 'float' => 'right'); $lang->task = new stdclass(); $lang->build = new stdclass(); @@ -296,9 +296,9 @@ $lang->caselib->menu->index = array('link' => "测 $lang->doc = new stdclass(); $lang->doc->menu = new stdclass(); -$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->create = array('link' => ' 添加文档库|doc|createLib', 'float' => 'right'); +$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->create = array('link' => ' 添加文档库|doc|createLib', 'float' => 'right'); /* 统计视图菜单设置。*/ $lang->report = new stdclass(); @@ -466,32 +466,32 @@ $lang->pager->previousPage = "上一页"; $lang->pager->nextPage = "下一页"; $lang->pager->summery = "第 %s-%s 项,共 %s 项"; -$lang->proVersion = "专业版   "; -$lang->downNotify = "下载桌面提醒"; -$lang->website = "http://www.zentao.net"; +$lang->proVersion = "专业版   "; +$lang->downNotify = "下载桌面提醒"; +$lang->website = "http://www.zentao.net"; $lang->suhosinInfo = "警告:数据太多,请在php.ini中修改sohusin.post.max_vars和sohusin.request.max_vars(大于%s的数)。 保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。"; $lang->maxVarsInfo = "警告:数据太多,请在php.ini中修改max_input_vars(大于%s的数)。 保存并重新启动apache或php-fpm,否则会造成部分数据无法保存。"; $lang->pasteTextInfo = "粘贴文本到文本域中,每行文字作为一条数据的标题。"; $lang->noticeImport = "

    导入数据中,含有已经存在系统的数据,请确认这些数据要覆盖或者全新插入

    覆盖 全新插入

    "; -$lang->noResultsMatch = "没有匹配结果"; -$lang->searchMore = "搜索此关键字的更多结果:"; -$lang->chooseUsersToMail = "选择要发信通知的用户..."; -$lang->browserNotice = '你目前使用的浏览器可能无法得到最佳浏览效果,建议使用Chrome、火狐、IE9+、Opera、Safari浏览器。'; -$lang->noticePasteImg = "可以在编辑器直接贴图。"; +$lang->noResultsMatch = "没有匹配结果"; +$lang->searchMore = "搜索此关键字的更多结果:"; +$lang->chooseUsersToMail = "选择要发信通知的用户..."; +$lang->browserNotice = '你目前使用的浏览器可能无法得到最佳浏览效果,建议使用Chrome、火狐、IE9+、Opera、Safari浏览器。'; +$lang->noticePasteImg = "可以在编辑器直接贴图。"; /* 时间格式设置。*/ -if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); -if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); -if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i'); -if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n月d日 H:i'); -if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); -if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); -if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日'); -if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日'); -if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); -if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); +if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); +if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); +if(!defined('DT_MONTHTIME1')) define('DT_MONTHTIME1', 'n/d H:i'); +if(!defined('DT_MONTHTIME2')) define('DT_MONTHTIME2', 'n月d日 H:i'); +if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); +if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); +if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日'); +if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日'); +if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); +if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); /* datepicker 时间*/ $lang->datepicker = new stdclass(); @@ -762,15 +762,15 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->testtask->menu->report = array('link' => '报告|testreport|browse', 'alias' => 'view,create,edit'); $lang->testtask->menu->create = array('link' => " 提交测试|testtask|create|productID=%s", 'float' => 'right'); - $lang->testtask->menuOrder[5] = 'product'; - $lang->testtask->menuOrder[10] = 'scope'; - $lang->testtask->menuOrder[15] = 'wait'; - $lang->testtask->menuOrder[20] = 'doing'; - $lang->testtask->menuOrder[25] = 'blocked'; - $lang->testtask->menuOrder[30] = 'done'; - $lang->testtask->menuOrder[35] = 'totalStatus'; - $lang->testtask->menuOrder[40] = 'report'; - $lang->testtask->menuOrder[45] = 'create'; + $lang->testtask->menuOrder[5] = 'product'; + $lang->testtask->menuOrder[10] = 'scope'; + $lang->testtask->menuOrder[15] = 'wait'; + $lang->testtask->menuOrder[20] = 'doing'; + $lang->testtask->menuOrder[25] = 'blocked'; + $lang->testtask->menuOrder[30] = 'done'; + $lang->testtask->menuOrder[35] = 'totalStatus'; + $lang->testtask->menuOrder[40] = 'report'; + $lang->testtask->menuOrder[45] = 'create'; $lang->testreport->menu = $lang->testtask->menu; $lang->testreport->menuOrder = $lang->testtask->menuOrder; From 807cd311a4a6f3590ad1f422d42837776bd9e6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 27 Dec 2017 16:05:56 +0800 Subject: [PATCH 037/206] * Fix bug for devel db. --- module/dev/lang/en.php | 2 ++ module/dev/lang/zh-cn.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/module/dev/lang/en.php b/module/dev/lang/en.php index c50930a5c1..560b414418 100644 --- a/module/dev/lang/en.php +++ b/module/dev/lang/en.php @@ -93,6 +93,8 @@ $lang->dev->tableList['suitecase'] = 'Suite Case'; $lang->dev->tableList['score'] = 'Score'; $lang->dev->tableList['entry'] = 'Entry'; $lang->dev->tableList['webhook'] = 'WebHook'; +$lang->dev->tableList['webhookdatas'] = 'WebHookDatas'; +$lang->dev->tableList['log'] = 'Log'; $lang->dev->groupList['my'] = 'Dashboard'; $lang->dev->groupList['product'] = $lang->productCommon; diff --git a/module/dev/lang/zh-cn.php b/module/dev/lang/zh-cn.php index dc44c5b126..fc9ae49d9b 100644 --- a/module/dev/lang/zh-cn.php +++ b/module/dev/lang/zh-cn.php @@ -93,6 +93,8 @@ $lang->dev->tableList['suitecase'] = '套件用例'; $lang->dev->tableList['score'] = '积分'; $lang->dev->tableList['entry'] = '应用'; $lang->dev->tableList['webhook'] = 'WebHook'; +$lang->dev->tableList['webhookdatas'] = 'WebHook数据'; +$lang->dev->tableList['log'] = '接口日志'; $lang->dev->groupList['my'] = '我的地盘'; $lang->dev->groupList['product'] = $lang->productCommon; From f71a2edc9d071f28e01400c7b795439975272505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 27 Dec 2017 16:19:24 +0800 Subject: [PATCH 038/206] * Fix bug. --- module/task/control.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index f49ace5cec..6ddd1df180 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -778,15 +778,16 @@ class task extends control die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); } - $task = $this->view->task; - $members = $this->loadModel('user')->getPairs('noletter'); + $task = $this->view->task; + $members = $this->loadModel('user')->getPairs('noletter'); + $task->nextBy = $task->assignedTo; $this->view->users = $members; if(!empty($task->team)) { $teams = array_keys($task->team); - $task->nextBy = $this->task->getNextUser($teams, $task->assignedTo); + $task->nextBy = $this->task->getNextUser($teams, $task->assignedTo); $task->myConsumed = $this->dao->select('consumed')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->fetch('consumed'); $lastAccount = end($teams); From 2bea6f457a48a78590d9287c40aacc58af1ca526 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 27 Dec 2017 16:21:59 +0800 Subject: [PATCH 039/206] * fix bug #1356. --- module/bug/view/browse.html.php | 4 ++-- module/product/view/build.html.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php index 640bc46f09..c81ee70997 100644 --- a/module/bug/view/browse.html.php +++ b/module/bug/view/browse.html.php @@ -87,7 +87,7 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow moduleName, $this->methodName) as $menuItem):?> hidden)) continue;?> config->global->flow == 'onlyTest' and $menuItem->name == 'needconfirm') continue;?> - name, 'QUERY' === 0) ? 'bySearch' : $menuItem->name;?> + name, 'QUERY' === 0) ? 'bySearch' : $menuItem->name;?> name, 'QUERY' === 0) ? (int)substr($menuItem->name, 5) : 0;?> name == 'my'):?> bug->mySelects[$browseType]) && in_array($brow echo ''; ?> -
  14. createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=$browseType¶m=$param"), $menuItem->text)?>
  15. +
  16. createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=$menuBrowseType¶m=$param"), $menuItem->text)?>
  17.  bug->byQuery;?>
  18. diff --git a/module/product/view/build.html.php b/module/product/view/build.html.php index a07931ddf0..3ab95d193b 100755 --- a/module/product/view/build.html.php +++ b/module/product/view/build.html.php @@ -35,8 +35,8 @@
    id;?> createLink('build', 'view', "build=$build->id"), $build->name);?>scmPath, 'http') === true ? html::a($build->scmPath) : $build->scmPath;?>filePath, 'http') === true ? html::a($build->filePath) : $build->filePath;?>scmPath, 'http') === 0 ? html::a($build->scmPath) : $build->scmPath;?>filePath, 'http') === 0 ? html::a($build->filePath) : $build->filePath;?> date?> builder]?> From 9cf249835e8fcaed7c56d3db4b01fb307463e112 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 27 Dec 2017 17:29:20 +0800 Subject: [PATCH 040/206] * fix bug for custom story review. --- module/custom/control.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/module/custom/control.php b/module/custom/control.php index 07e09e6b71..353a7f6a5c 100644 --- a/module/custom/control.php +++ b/module/custom/control.php @@ -81,7 +81,12 @@ class custom extends control if(strtolower($_SERVER['REQUEST_METHOD']) == "post") { - if(($module == 'story' or $module == 'testcase') and $field == 'review') + if($module == 'story' and $field == 'review') + { + $data = fixer::input('post')->join('forceReview', ',')->get(); + $this->loadModel('setting')->setItems("system.$module", $data); + } + elseif($module == 'testcase' and $field == 'review') { $review = fixer::input('post')->get(); if($review->needReview) $data = fixer::input('post')->join('forceNotReview', ',')->remove('forceReview')->get(); From 0dad383f6799dc509408ed307e4572d9c0a284ba Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 27 Dec 2017 17:36:32 +0800 Subject: [PATCH 041/206] * fix bug #1352. --- module/testcase/control.php | 1 + module/testcase/view/groupcase.html.php | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index 0d1df328f8..c7ddbdae68 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -160,6 +160,7 @@ class testcase extends control $cases = $this->testcase->getModuleCases($productID, $branch, 0, $groupBy); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'testcase', false); + $cases = $this->loadModel('story')->checkNeedConfirm($cases); $cases = $this->testcase->appendData($cases); $groupCases = array(); diff --git a/module/testcase/view/groupcase.html.php b/module/testcase/view/groupcase.html.php index 90ac7b82ae..01886bcfe8 100644 --- a/module/testcase/view/groupcase.html.php +++ b/module/testcase/view/groupcase.html.php @@ -47,7 +47,20 @@ lastRunner];?> lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?> lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?>testcase->statusList[$case->status];?> + needconfirm) + { + echo "({$lang->story->changed} "; + echo html::a(helper::createLink('testcase', 'confirmStoryChange', "caseID=$case->id"), $lang->confirm, 'hiddenwin'); + echo ")"; + } + else + { + echo $lang->testcase->statusList[$case->status]; + } + ?> + bugs) ? html::a(inlink('bugs', "runID=0&caseID={$case->id}"), $case->bugs, '', "class='iframe'") : $case->bugs;?> results) ? html::a($this->createLink('testtask', 'results', "runID=0&caseID={$case->id}"), $case->results, '', "class='iframe'") : $case->results;?> stepNumber;?>
    style='overflow:visible'>id, $i)'")?> style='overflow:visible'> + id, $i)'")?> + + style='overflow: visible'>
    @@ -109,7 +112,10 @@ if($hiddenStory and isset($visibleFields['story'])) $colspan -= 1;
    %s style='overflow:visible'>id, \"%s\")'")?> style='overflow:visible'> + id, \"%s\")'")?> + + style='overflow: visible'>
    From ee5036c6326e5475200f959acb615b3c1bb7acde Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 28 Dec 2017 09:59:06 +0800 Subject: [PATCH 043/206] * fix error with zget. --- module/report/view/productsummary.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/report/view/productsummary.html.php b/module/report/view/productsummary.html.php index 4b317d3dbc..4becbd5de1 100644 --- a/module/report/view/productsummary.html.php +++ b/module/report/view/productsummary.html.php @@ -47,7 +47,7 @@
    " . html::a($this->createLink('product', 'view', "product=$product->id"), $product->name) . "

    ";?>
    " . $users[$product->PO] . '

    ';?>
    " . zget($users, $product->PO) . '

    ';?>
    - * - * @param string $content + * + * @param string $content * @access public * @return void */ @@ -611,8 +611,8 @@ class docModel extends model /** * Check priv. - * - * @param object $object + * + * @param object $object * @access public * @return bool */ @@ -639,13 +639,13 @@ class docModel extends model if(strpos(",$object->groups,", ",$groupID,") !== false) return true; } } - + if(isset($object->lib)) { static $libs; if(empty($libs)) $libs = $this->getLibs('all'); if(!isset($libs[$object->lib])) return false; - + } if($object->project) @@ -667,10 +667,10 @@ class docModel extends model /** * Get all libs by type. - * - * @param string $type - * @param int $pager - * @param string $extra + * + * @param string $type + * @param int $pager + * @param string $extra * @access public * @return array */ @@ -708,7 +708,7 @@ class docModel extends model /** * Get all lib groups. - * + * * @access public * @return array */ @@ -792,9 +792,9 @@ class docModel extends model /** * Get limit libs. - * - * @param string $type - * @param int $limit + * + * @param string $type + * @param int $limit * @access public * @return array */ @@ -836,11 +836,11 @@ class docModel extends model } /** - * Get project or product libs groups. - * - * @param string $type - * @param array $idList - * @param int $limit + * Get project or product libs groups. + * + * @param string $type + * @param array $idList + * @param int $limit * @access public * @return array */ @@ -879,10 +879,10 @@ class docModel extends model /** * Get libs by object. - * - * @param string $type - * @param int $objectID - * @param string $mode + * + * @param string $type + * @param int $objectID + * @param string $mode * @access public * @return array */ @@ -983,8 +983,8 @@ class docModel extends model /** * Get doc tree. - * - * @param int $libID + * + * @param int $libID * @access public * @return array */ @@ -1003,9 +1003,9 @@ class docModel extends model /** * Fill docs in tree. - * - * @param object $node - * @param int $libID + * + * @param object $node + * @param int $libID * @access public * @return array */ @@ -1063,11 +1063,11 @@ class docModel extends model } /** - * Get crumbs. - * - * @param int $libID - * @param int $moduleID - * @param int $docID + * Get crumbs. + * + * @param int $libID + * @param int $moduleID + * @param int $docID * @access public * @return string */ @@ -1076,7 +1076,7 @@ class docModel extends model if(empty($libID)) return ''; $lib = $this->getLibById($libID); - if(!$this->checkPriv($lib)) + if(!$this->checkPriv($lib)) { echo(js::alert($this->lang->doc->accessDenied)); $loginLink = $this->config->requestType == 'GET' ? "?{$this->config->moduleVar}=user&{$this->config->methodVar}=login" : "user{$this->config->requestFix}login"; @@ -1116,9 +1116,9 @@ class docModel extends model /** * Get product crumb. - * - * @param int $productID - * @param int $projectID + * + * @param int $productID + * @param int $projectID * @access public * @return string */ @@ -1147,9 +1147,9 @@ class docModel extends model /** * Set lib users. - * - * @param string $type - * @param int $objectID + * + * @param string $type + * @param int $objectID * @access public * @return bool */ @@ -1159,15 +1159,16 @@ class docModel extends model if($type == 'product') { $teams = $this->dao->select('t1.account')->from(TABLE_TEAM)->alias('t1') - ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.project=t2.project') - ->leftJoin(TABLE_PROJECT)->alias('t3')->on('t1.project=t3.id') + ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.root=t2.project') + ->leftJoin(TABLE_PROJECT)->alias('t3')->on('t1.root=t3.id') ->where('t2.product')->eq($objectID) + ->andWhere('t1.type')->eq('project') ->andWhere('t3.deleted')->eq('0') ->fetchPairs('account', 'account'); } elseif($type == 'project') { - $teams = $this->dao->select('account')->from(TABLE_TEAM)->where('project')->eq($objectID)->fetchPairs('account', 'account'); + $teams = $this->dao->select('account')->from(TABLE_TEAM)->where('root')->eq($objectID)->andWhere('type')->eq('project')->fetchPairs('account', 'account'); } return $teams; diff --git a/module/my/control.php b/module/my/control.php index e1791ea6fe..64edbca388 100644 --- a/module/my/control.php +++ b/module/my/control.php @@ -13,7 +13,7 @@ class my extends control { /** * Construct function. - * + * * @access public * @return void */ @@ -27,7 +27,7 @@ class my extends control /** * Index page, goto todo. - * + * * @access public * @return void */ @@ -63,14 +63,14 @@ class my extends control } /** - * My todos. - * - * @param string $type - * @param string $account - * @param string $status - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * My todos. + * + * @param string $type + * @param string $account + * @param string $status + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -114,12 +114,12 @@ class my extends control } /** - * My stories - - * @param string $type - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * My stories + + * @param string $type + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -153,11 +153,11 @@ class my extends control /** * My tasks - * - * @param string $type - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * + * @param string $type + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -195,12 +195,12 @@ class my extends control /** * My bugs. - * - * @param string $type - * @param string $orderBy - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * + * @param string $type + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -209,7 +209,7 @@ class my extends control /* Save session. load Lang. */ if($this->app->viewType != 'json') $this->session->set('bugList', $this->app->getURI(true)); $this->app->loadLang('bug'); - + /* Load pager. */ $this->app->loadClass('pager', $static = true); if($this->app->getViewType() == 'mhtml') $recPerPage = 10; @@ -239,7 +239,7 @@ class my extends control /** * My test task. - * + * * @access public * @return void */ @@ -260,7 +260,7 @@ class my extends control $this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->testTask; $this->view->position[] = $this->lang->my->testTask; $this->view->tasks = $this->loadModel('testtask')->getByUser($this->app->user->account, $pager, $sort, $type); - + $this->view->recTotal = $recTotal; $this->view->recPerPage = $recPerPage; $this->view->pageID = $pageID; @@ -327,7 +327,7 @@ class my extends control /** * My projects. - * + * * @access public * @return void */ @@ -344,8 +344,8 @@ class my extends control } /** - * Edit profile - * + * Edit profile + * * @access public * @return void */ @@ -369,8 +369,8 @@ class my extends control } /** - * Change password - * + * Change password + * * @access public * @return void */ @@ -495,7 +495,7 @@ class my extends control /** * View my profile. - * + * * @access public * @return void */ @@ -509,18 +509,18 @@ class my extends control $this->view->position[] = $this->lang->my->profile; $this->view->user = $user; $this->view->groups = $this->loadModel('group')->getByAccount($this->app->user->account); - $this->view->deptPath = $this->dept->getParents($user->dept); + $this->view->deptPath = $this->dept->getParents($user->dept); $this->display(); } /** * My dynamic. - * - * @param string $type - * @param string $orderBy - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * + * @param string $type + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -562,9 +562,9 @@ class my extends control } /** - * Unbind ranzhi - * - * @param string $confirm + * Unbind ranzhi + * + * @param string $confirm * @access public * @return void */ diff --git a/module/my/view/project.html.php b/module/my/view/project.html.php index 9e1e9b2abd..70adaf0273 100644 --- a/module/my/view/project.html.php +++ b/module/my/view/project.html.php @@ -23,7 +23,7 @@ - + @@ -52,5 +52,5 @@ -
    idAB;?> project->code;?>project->name;?>project->name;?> project->begin;?> project->end;?> statusAB;?>
    +
    diff --git a/module/product/model.php b/module/product/model.php index 9f9a0f8f3f..202a89ffa1 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -614,10 +614,11 @@ class productModel extends model } if(empty($teams)) { - $teams = $this->dao->select('t1.project, t1.account')->from(TABLE_TEAM)->alias('t1') - ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') + $teams = $this->dao->select('t1.root, t1.account')->from(TABLE_TEAM)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.root = t2.id') ->where('t2.deleted')->eq(0) - ->fetchGroup('project', 'account'); + ->andWhere('t1.type')->eq('project') + ->fetchGroup('root', 'account'); } if(!isset($projects[$product->id])) return $members; @@ -788,7 +789,7 @@ class productModel extends model $products = $this->dao->select('distinct t1.id')->from(TABLE_PRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product') - ->leftJoin(TABLE_TEAM)->alias('t3')->on('t2.project = t3.project') + ->leftJoin(TABLE_TEAM)->alias('t3')->on('t2.project = t3.root') ->leftJoin(TABLE_PROJECT)->alias('t4')->on('t2.project = t4.id') ->beginIF($this->app->user->admin)->where('t1.deleted')->eq(0)->fi() ->beginIF(!$this->app->user->admin) @@ -800,6 +801,7 @@ class productModel extends model ->orWhere('t1.createdBy')->eq($this->app->user->account) ->orWhere('t3.account')->eq($this->app->user->account) ->andWhere('t1.deleted')->eq(0) + ->andWhere('t3.type')->eq('project') ->andWhere('t4.deleted')->eq(0) ->fi() ->fetchAll('id'); diff --git a/module/project/model.php b/module/project/model.php index 63ea757374..8b0914a30f 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -17,16 +17,16 @@ class projectModel extends model const LINK_MEMBERS_ONE_TIME = 20; /** - * Check the privilege. - * - * @param object $project + * Check the privilege. + * + * @param object $project * @access public * @return bool */ public function checkPriv($project) { /* If is admin, return true. */ - if($this->app->user->admin) return true; + if($this->app->user->admin) return true; $acls = $this->app->user->rights['acls']; if(!empty($acls['projects']) and !in_array($project->id, $acls['projects'])) return false; @@ -36,7 +36,7 @@ class projectModel extends model /* Get all teams of all projects and group by projects, save it as static. */ static $teams; - if(empty($teams)) $teams = $this->dao->select('project, account')->from(TABLE_TEAM)->fetchGroup('project', 'account'); + if(empty($teams)) $teams = $this->dao->select('root, account')->from(TABLE_TEAM)->where('type')->eq('project')->fetchGroup('root', 'account'); $currentTeam = isset($teams[$project->id]) ? $teams[$project->id] : array(); /* If project is private, only members can access. */ @@ -61,9 +61,9 @@ class projectModel extends model /** * Set menu. - * - * @param array $projects - * @param int $projectID + * + * @param array $projects + * @param int $projectID * @param string $extra * @access public * @return void @@ -74,7 +74,7 @@ class projectModel extends model $project = $this->getById($projectID); /* Unset story, bug, build and testtask if type is ops. */ - if($project and $project->type == 'ops') + if($project and $project->type == 'ops') { unset($this->lang->project->menu->story); unset($this->lang->project->menu->bug); @@ -93,7 +93,7 @@ class projectModel extends model $moduleName = $this->app->getModuleName(); $methodName = $this->app->getMethodName(); - if($this->cookie->projectMode == 'noclosed' and $project->status == 'done') + if($this->cookie->projectMode == 'noclosed' and $project->status == 'done') { setcookie('projectMode', 'all'); $this->cookie->projectMode = 'all'; @@ -108,12 +108,12 @@ class projectModel extends model } /** - * Create the select code of projects. - * - * @param array $projects - * @param int $projectID - * @param string $currentModule - * @param string $currentMethod + * Create the select code of projects. + * + * @param array $projects + * @param int $projectID + * @param string $currentModule + * @param string $currentMethod * @param string $extra * @access public * @return string @@ -133,7 +133,7 @@ class projectModel extends model /** * Get project tree menu. - * + * * @access public * @return void */ @@ -150,7 +150,7 @@ class projectModel extends model $productName = isset($products[$productID]) ? $products[$productID] : $this->lang->project->noProduct; $projectTree .= "
  19. $productName
      "; - + foreach($projects as $project) { if($project->status != 'done') @@ -160,9 +160,9 @@ class projectModel extends model } $hasDone = false; - foreach($projects as $project) + foreach($projects as $project) { - if($project->status == 'done') + if($project->status == 'done') { $hasDone = true; break; @@ -191,9 +191,9 @@ class projectModel extends model /** * Save the project id user last visited to session. - * - * @param int $projectID - * @param array $projects + * + * @param int $projectID + * @param array $projects * @access public * @return int */ @@ -217,8 +217,8 @@ class projectModel extends model } /** - * Create a project. - * + * Create a project. + * * @access public * @return void */ @@ -257,14 +257,15 @@ class projectModel extends model $this->file->updateObjectID($this->post->uid, $projectID, 'project'); /* Copy team of project. */ - if($copyProjectID != '') + if($copyProjectID != '') { - $members = $this->dao->select('*')->from(TABLE_TEAM)->where('project')->eq($copyProjectID)->fetchAll(); + $members = $this->dao->select('*')->from(TABLE_TEAM)->where('root')->eq($copyProjectID)->andWhere('type')->eq('project')->fetchAll(); foreach($members as $member) { - $member->project = $projectID; - $member->join = $today; - $member->days = $project->days; + $member->root = $projectID; + $member->join = $today; + $member->days = $project->days; + $member->type = 'project'; $this->dao->insert(TABLE_TEAM)->data($member)->exec(); if($member->account == $this->app->user->account) $creatorExists = true; } @@ -274,12 +275,13 @@ class projectModel extends model if($copyProjectID == '' or !$creatorExists) { $member = new stdclass(); - $member->project = $projectID; - $member->account = $this->app->user->account; - $member->role = $this->lang->user->roleList[$this->app->user->role]; - $member->join = $today; - $member->days = $project->days; - $member->hours = $this->config->project->defaultWorkhours; + $member->root = $projectID; + $member->account = $this->app->user->account; + $member->role = $this->lang->user->roleList[$this->app->user->role]; + $member->join = $today; + $member->type = 'project'; + $member->days = $project->days; + $member->hours = $this->config->project->defaultWorkhours; $this->dao->insert(TABLE_TEAM)->data($member)->exec(); } @@ -293,13 +295,13 @@ class projectModel extends model $this->dao->insert(TABLE_DOCLIB)->data($lib)->exec(); if(!dao::isError()) $this->loadModel('score')->create('project', 'create', $projectID); return $projectID; - } + } } /** * Update a project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return array */ @@ -336,11 +338,12 @@ class projectModel extends model { if(!empty($value) and !isset($team[$value])) { - $member->project = (int)$projectID; + $member->root = (int)$projectID; $member->account = $value; $member->join = helper::today(); $member->role = $this->lang->project->$fieldName; $member->days = $project->days; + $member->type = 'project'; $member->hours = $this->config->project->defaultWorkhours; $this->dao->replace(TABLE_TEAM)->data($member)->exec(); } @@ -356,8 +359,8 @@ class projectModel extends model } /** - * Batch update. - * + * Batch update. + * * @access public * @return void */ @@ -365,7 +368,7 @@ class projectModel extends model { $projects = array(); $allChanges = array(); - $data = fixer::input('post')->get(); + $data = fixer::input('post')->get(); $oldProjects = $this->getByIdList($this->post->projectIDList); foreach($data->projectIDList as $projectID) { @@ -410,7 +413,8 @@ class projectModel extends model if(!empty($value) and !isset($team[$value])) { $member = new stdClass(); - $member->project = (int)$projectID; + $member->root = (int)$projectID; + $member->type = 'project'; $member->account = $value; $member->join = helper::today(); $member->role = $this->lang->project->$fieldName; @@ -430,8 +434,8 @@ class projectModel extends model /** * Start project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -453,8 +457,8 @@ class projectModel extends model /** * Put project off. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -474,8 +478,8 @@ class projectModel extends model /** * Suspend project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -497,8 +501,8 @@ class projectModel extends model /** * Activate project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -561,8 +565,8 @@ class projectModel extends model /** * Close project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return array */ @@ -587,8 +591,8 @@ class projectModel extends model /** * Get project pairs. - * - * @param string $mode all|noclosed or empty + * + * @param string $mode all|noclosed or empty * @access public * @return array */ @@ -624,8 +628,8 @@ class projectModel extends model /** * Get by idList. - * - * @param array $projectIDList + * + * @param array $projectIDList * @access public * @return array */ @@ -636,10 +640,10 @@ class projectModel extends model /** * Get project lists. - * + * * @param string $status all|undone|wait|running - * @param int $limit - * @param int $productID + * @param int $limit + * @param int $productID * @access public * @return array */ @@ -677,10 +681,10 @@ class projectModel extends model /** * Get project lists. - * + * * @param string $status involved - * @param int $limit - * @param int $productID + * @param int $limit + * @param int $productID * @param int $branch * @access public * @return array @@ -691,7 +695,7 @@ class projectModel extends model { return $this->dao->select('t2.*')->from(TABLE_PROJECTPRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') - ->leftJoin(TABLE_TEAM)->alias('t3')->on('t3.project=t2.id') + ->leftJoin(TABLE_TEAM)->alias('t3')->on('t3.root=t2.id') ->where('t1.product')->eq($productID) ->andWhere('t2.deleted')->eq(0) ->andWhere('t2.iscat')->eq(0) @@ -699,6 +703,7 @@ class projectModel extends model ->andWhere('t2.openedBy', true)->eq($this->app->user->account) ->orWhere('t3.account')->eq($this->app->user->account) ->markRight(1) + ->andWhere('t3.type')->eq('project') ->orderBy('order_desc') ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); @@ -706,12 +711,13 @@ class projectModel extends model else { return $this->dao->select('t1.*, IF(INSTR(" done", t1.status) < 2, 0, 1) AS isDone')->from(TABLE_PROJECT)->alias('t1') - ->leftJoin(TABLE_TEAM)->alias('t2')->on('t2.project=t1.id') + ->leftJoin(TABLE_TEAM)->alias('t2')->on('t2.root=t1.id') ->where('t1.iscat')->eq(0) ->andWhere('t1.openedBy', true)->eq($this->app->user->account) ->orWhere('t2.account')->eq($this->app->user->account) ->markRight(1) ->andWhere('t1.deleted')->eq(0) + ->andWhere('t2.type')->eq('project') ->orderBy('t1.order_desc') ->beginIF($limit)->limit($limit)->fi() ->fetchAll('id'); @@ -720,7 +726,7 @@ class projectModel extends model /** * Get projects lists grouped by product. - * + * * @access public * @return array */ @@ -738,14 +744,14 @@ class projectModel extends model { foreach($product as $ID => $project) { - if(!$this->checkPriv($projects[$project->id])) + if(!$this->checkPriv($projects[$project->id])) { unset($list[$id][$ID]); } if(!$project->product) { if($this->checkPriv($projects[$project->id])) $noProducts[] = $project; - unset($list[$id][$ID]); + unset($list[$id][$ID]); } } } @@ -757,12 +763,12 @@ class projectModel extends model /** * Get project stats. - * - * @param string $status - * @param int $productID - * @param int $itemCounts - * @param string $orderBy - * @param int $pager + * + * @param string $status + * @param int $productID + * @param int $itemCounts + * @param string $orderBy + * @param int $pager * @access public * @return void */ @@ -949,8 +955,8 @@ class projectModel extends model /** * Get project by id. - * - * @param int $projectID + * + * @param int $projectID * @param bool $setImgSize * @access public * @return void @@ -970,8 +976,8 @@ class projectModel extends model } $total = $this->dao->select(' - SUM(estimate) AS totalEstimate, - SUM(consumed) AS totalConsumed, + SUM(estimate) AS totalEstimate, + SUM(consumed) AS totalConsumed, SUM(`left`) AS totalLeft') ->from(TABLE_TASK) ->where('project')->eq((int)$projectID) @@ -980,7 +986,7 @@ class projectModel extends model ->andWhere('parent')->eq(0) ->fetch(); $project->days = $project->days ? $project->days : ''; - $project->totalHours = $this->dao->select('sum(days * hours) AS totalHours')->from(TABLE_TEAM)->where('project')->eq($project->id)->fetch('totalHours'); + $project->totalHours = $this->dao->select('sum(days * hours) AS totalHours')->from(TABLE_TEAM)->where('root')->eq($project->id)->andWhere('type')->eq('project')->fetch('totalHours'); $project->totalEstimate = round($total->totalEstimate, 1); $project->totalConsumed = round($total->totalConsumed, 1); $project->totalLeft = round($total->totalLeft, 1); @@ -992,9 +998,9 @@ class projectModel extends model } /** - * Get the default managers for a project from it's related products. - * - * @param int $projectID + * Get the default managers for a project from it's related products. + * + * @param int $projectID * @access public * @return object */ @@ -1015,8 +1021,8 @@ class projectModel extends model /** * Get products of a project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return array */ @@ -1039,12 +1045,12 @@ class projectModel extends model /** * Build story search form. - * - * @param array $products - * @param array $branchGroups - * @param array $modules - * @param int $queryID - * @param string $actionURL + * + * @param array $products + * @param array $branchGroups + * @param array $modules + * @param int $queryID + * @param string $actionURL * @param string $type * @access public * @return void @@ -1103,9 +1109,9 @@ class projectModel extends model } /** - * Get projects to import + * Get projects to import * - * @param array $projectIds + * @param array $projectIds * @access public * @return array */ @@ -1128,8 +1134,8 @@ class projectModel extends model /** * Update products of a project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -1166,9 +1172,9 @@ class projectModel extends model } /** - * Get related projects - * - * @param int $projectID + * Get related projects + * + * @param int $projectID * @access public * @return array */ @@ -1190,9 +1196,9 @@ class projectModel extends model /** * Get tasks can be imported. - * + * * @param int $toProject - * @param array $branches + * @param array $branches * @access public * @return array */ @@ -1217,8 +1223,8 @@ class projectModel extends model /** * Import tasks. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -1257,9 +1263,14 @@ class projectModel extends model { if(!isset($teamMembers[$account])) { - $role = $this->dao->select('*')->from(TABLE_TEAM)->where('project')->eq($preProjectID)->andWhere('account')->eq($account)->fetch(); - $role->project = $projectID; - $role->join = helper::today(); + $role = $this->dao->select('*')->from(TABLE_TEAM) + ->where('root')->eq($preProjectID) + ->andWhere('account')->eq($account) + ->andWhere('type')->eq('project') + ->fetch(); + + $role->root = $projectID; + $role->join = helper::today(); $this->dao->insert(TABLE_TEAM)->data($role)->exec(); } } @@ -1279,9 +1290,9 @@ class projectModel extends model } /** - * Import task from Bug. - * - * @param int $projectID + * Import task from Bug. + * + * @param int $projectID * @access public * @return void */ @@ -1326,7 +1337,7 @@ class projectModel extends model if(!$bug->confirmed) $this->dao->update(TABLE_BUG)->set('confirmed')->eq(1)->where('id')->eq($bug->id)->exec(); $this->dao->insert(TABLE_TASK)->data($task)->checkIF($bugToTasks->estimate[$key] != '', 'estimate', 'float')->exec(); - if(dao::isError()) + if(dao::isError()) { echo js::error(dao::getError()); die(js::reload('parent')); @@ -1387,8 +1398,8 @@ class projectModel extends model /** * Get child projects. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -1399,8 +1410,8 @@ class projectModel extends model /** * Update childs. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -1419,8 +1430,8 @@ class projectModel extends model /** * Link story. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -1444,14 +1455,14 @@ class projectModel extends model $this->dao->insert(TABLE_PROJECTSTORY)->data($data)->exec(); $this->story->setStage($storyID); $this->action->create('story', $storyID, 'linked2project', '', $projectID); - } + } } /** - * Unlink story. - * - * @param int $projectID - * @param int $storyID + * Unlink story. + * + * @param int $projectID + * @param int $storyID * @access public * @return void */ @@ -1481,9 +1492,9 @@ class projectModel extends model } /** - * Get team members. - * - * @param int $projectID + * Get team members. + * + * @param int $projectID * @access public * @return array */ @@ -1492,15 +1503,16 @@ class projectModel extends model if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getTeamMembers(); return $this->dao->select("t1.*, t1.hours * t1.days AS totalHours, if(t2.deleted='0', t2.realname, t1.account) as realname")->from(TABLE_TEAM)->alias('t1') ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account') - ->where('t1.project')->eq((int)$projectID) + ->where('t1.root')->eq((int)$projectID) + ->andWhere('t1.type')->eq('project') ->fetchAll('account'); } /** * Get team members in pair. - * - * @param int $projectID - * @param string $params + * + * @param int $projectID + * @param string $params * @access public * @return array */ @@ -1509,7 +1521,8 @@ class projectModel extends model if(defined('TUTORIAL')) return $this->loadModel('tutorial')->getTeamMembersPairs(); $users = $this->dao->select('t1.account, t2.realname')->from(TABLE_TEAM)->alias('t1') ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account = t2.account') - ->where('t1.project')->eq((int)$projectID) + ->where('t1.root')->eq((int)$projectID) + ->andWhere('t1.type')->eq('project') ->beginIF($params == 'nodeleted' or empty($this->config->user->showDeleted)) ->andWhere('t2.deleted')->eq(0) ->fi() @@ -1525,29 +1538,30 @@ class projectModel extends model /** * Get teams which can be imported. - * - * @param string $account - * @param int $currentProject + * + * @param string $account + * @param int $currentProject * @access public * @return array */ public function getTeams2Import($account, $currentProject) { - return $this->dao->select('t1.project, t2.name as projectName') + return $this->dao->select('t1.root, t2.name as projectName') ->from(TABLE_TEAM)->alias('t1') - ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.root = t2.id') ->where('t1.account')->eq($account) - ->andWhere('t1.project')->ne($currentProject) - ->groupBy('t1.project') - ->orderBy('t1.project DESC') + ->andWhere('t1.root')->ne($currentProject) + ->andWhere('t1.type')->eq('project') + ->groupBy('t1.root') + ->orderBy('t1.root DESC') ->fetchPairs(); } /** * Get members of a project who can be imported. - * - * @param int $project - * @param array $currentMembers + * + * @param int $project + * @param array $currentMembers * @access public * @return array */ @@ -1557,8 +1571,9 @@ class projectModel extends model return $this->dao->select('account, role, hours') ->from(TABLE_TEAM) - ->where('project')->eq($project) + ->where('root')->eq($project) ->andWhere('account')->notIN($currentMembers) + ->andWhere('type')->eq('project') ->fetchAll('account'); } @@ -1590,15 +1605,17 @@ class projectModel extends model { $this->dao->update(TABLE_TEAM) ->data($member) - ->where('project')->eq((int)$projectID) + ->where('root')->eq((int)$projectID) ->andWhere('account')->eq($account) + ->andWhere('type')->eq('project') ->exec(); } else { - $member->project = (int)$projectID; + $member->root = (int)$projectID; $member->account = $account; $member->join = helper::today(); + $member->type = 'project'; $this->dao->insert(TABLE_TEAM)->data($member)->exec(); } } @@ -1606,20 +1623,20 @@ class projectModel extends model /** * Unlink a member. - * - * @param int $projectID - * @param string $account + * + * @param int $projectID + * @param string $account * @access public * @return void */ public function unlinkMember($projectID, $account) { - $this->dao->delete()->from(TABLE_TEAM)->where('project')->eq((int)$projectID)->andWhere('account')->eq($account)->exec(); + $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('account')->eq($account)->andWhere('type')->eq('project')->exec(); } /** * Compute burn of a project. - * + * * @access public * @return array */ @@ -1654,8 +1671,8 @@ class projectModel extends model /** * Fix burn for first day. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return void */ @@ -1678,9 +1695,9 @@ class projectModel extends model } /** - * Get burn data for flot - * - * @param int $projectID + * Get burn data for flot + * + * @param int $projectID * @access public * @return array */ @@ -1694,7 +1711,7 @@ class projectModel extends model $count = 0; $burnData = array(); - foreach($sets as $date => $set) + foreach($sets as $date => $set) { if($date < $project->begin) continue; if($date > $project->end) continue; @@ -1709,12 +1726,12 @@ class projectModel extends model /** * Process burndown datas when the sets is smaller than the itemCounts. - * - * @param array $sets - * @param int $itemCounts - * @param date $begin - * @param date $end - * @param string $mode + * + * @param array $sets + * @param int $itemCounts + * @param date $begin + * @param date $end + * @param string $mode * @access public * @return array */ @@ -1772,10 +1789,10 @@ class projectModel extends model /** * Get taskes by search. - * - * @param string $condition - * @param object $pager - * @param string $orderBy + * + * @param string $condition + * @param object $pager + * @param string $orderBy * @access public * @return array */ @@ -1802,13 +1819,13 @@ class projectModel extends model } /** - * Get bugs by search in project. - * - * @param int $products - * @param int $projectID - * @param int $sql - * @param int $pager - * @param int $orderBy + * Get bugs by search in project. + * + * @param int $products + * @param int $projectID + * @param int $sql + * @param int $pager + * @param int $orderBy * @access public * @return void */ @@ -1829,8 +1846,8 @@ class projectModel extends model /** * Get the summary of project. - * - * @param array $tasks + * + * @param array $tasks * @access public * @return string */ @@ -1862,9 +1879,9 @@ class projectModel extends model /** * Judge an action is clickable or not. - * + * * @param object $project - * @param string $action + * @param string $action * @access public * @return bool */ @@ -1883,10 +1900,10 @@ class projectModel extends model /** * Create the link from module,method,extra - * - * @param string $module - * @param string $method - * @param mix $extra + * + * @param string $module + * @param string $method + * @param mix $extra * @access public * @return void */ @@ -1897,12 +1914,12 @@ class projectModel extends model { $module = 'project'; $method = 'task'; - } + } if($module == 'build' and ($method == 'edit' || $method= 'view')) - { + { $module = 'project'; $method = 'build'; - } + } if($module == 'project' and $method == 'create') return; if($extra != '') @@ -1923,12 +1940,12 @@ class projectModel extends model } /** - * Get no weekend date - * - * @param string $begin - * @param string $end - * @param string $type - * @param string|int $interval + * Get no weekend date + * + * @param string $begin + * @param string $end + * @param string $type + * @param string|int $interval * @param string $format * @access public * @return array @@ -1978,8 +1995,8 @@ class projectModel extends model /** * Get total estimate. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return float */ @@ -2002,7 +2019,7 @@ class projectModel extends model if($this->app->user->admin) return true; /* Get all teams of all projects and group by projects, save it as static. */ - $projects = $this->dao->select('project, limited')->from(TABLE_TEAM)->where('account')->eq($this->app->user->account)->andWhere('limited')->eq('yes')->orderBy('project asc')->fetchPairs('project', 'project'); + $projects = $this->dao->select('root, limited')->from(TABLE_TEAM)->where('account')->eq($this->app->user->account)->andWhere('limited')->eq('yes')->andWhere('type')->eq('project')->orderBy('root asc')->fetchPairs('root', 'root'); $_SESSION['limitedProjects'] = join(',', $projects); } @@ -2028,8 +2045,8 @@ class projectModel extends model /** * Get branches of project. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return array */ @@ -2146,11 +2163,11 @@ class projectModel extends model } /** - * Get Kanban tasks - * - * @param int $projectID - * @param string $orderBy - * @param object $pager + * Get Kanban tasks + * + * @param int $projectID + * @param string $orderBy + * @param object $pager * @access public * @return void */ @@ -2173,10 +2190,10 @@ class projectModel extends model } /** - * Get kanban group data. - * - * @param array $tasks - * @param array $bugs + * Get kanban group data. + * + * @param array $tasks + * @param array $bugs * @access public * @return array */ @@ -2227,9 +2244,9 @@ class projectModel extends model /** * Save Kanban Data. - * - * @param int $projectID - * @param array $kanbanDatas + * + * @param int $projectID + * @param array $kanbanDatas * @access public * @return void */ @@ -2243,8 +2260,8 @@ class projectModel extends model /** * Get Prev Kanban. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return array */ @@ -2256,8 +2273,8 @@ class projectModel extends model /** * Get kanban setting. - * - * @param int $projectID + * + * @param int $projectID * @access public * @return object */ @@ -2282,10 +2299,10 @@ class projectModel extends model /** * Build burn data. - * - * @param int $projectID - * @param array $dateList - * @param string $type + * + * @param int $projectID + * @param array $dateList + * @param string $type * @access public * @return array */ @@ -2449,9 +2466,9 @@ class projectModel extends model /** * Format tasks for tree. - * - * @param array $tasks - * @param object $story + * + * @param array $tasks + * @param object $story * @access public * @return array */ diff --git a/module/score/model.php b/module/score/model.php index 75331f34c1..e3d394f7a0 100644 --- a/module/score/model.php +++ b/module/score/model.php @@ -143,7 +143,7 @@ class scoreModel extends model } /* Project team user. */ - $teams = $this->dao->select('account')->from(TABLE_TEAM)->where('project')->eq($param->id)->fetchPairs(); + $teams = $this->dao->select('account')->from(TABLE_TEAM)->where('root')->eq($param->id)->andWhere('type')->eq('project')->fetchPairs(); if(!empty($teams)) { $rule['score'] = $extended['member']['close']; @@ -159,7 +159,7 @@ class scoreModel extends model } /* When the project is closed, no more user get score. */ - return true; + return true; } break; case 'search': @@ -295,7 +295,7 @@ class scoreModel extends model $notice = sprintf($this->lang->score->tips, $score, $this->app->user->score); $fullNotice = << +
      {$notice}
      diff --git a/module/story/model.php b/module/story/model.php index f877f00b02..18c37fe29b 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -115,10 +115,11 @@ class storyModel extends model /* Get team members. */ if($story->projects) { - $story->teams = $this->dao->select('account, project') + $story->teams = $this->dao->select('account, root') ->from(TABLE_TEAM) - ->where('project')->in(array_keys($story->projects)) - ->fetchGroup('project'); + ->where('root')->in(array_keys($story->projects)) + ->andWhere('type')->eq('project') + ->fetchGroup('root'); } /* Get affected bugs. */ @@ -1834,7 +1835,7 @@ class storyModel extends model ->andWhere('t2.status')->eq('doing') ->andWhere('t2.deleted')->eq(0) ->fetchPairs(); - if($projects) return($this->dao->select('account')->from(TABLE_TEAM)->where('project')->in($projects)->fetchPairs('account')); + if($projects) return($this->dao->select('account')->from(TABLE_TEAM)->where('root')->in($projects)->andWhere('type')->eq('project')->fetchPairs('account')); } /** diff --git a/module/task/control.php b/module/task/control.php index 6ddd1df180..a619af168a 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -788,7 +788,11 @@ class task extends control $teams = array_keys($task->team); $task->nextBy = $this->task->getNextUser($teams, $task->assignedTo); - $task->myConsumed = $this->dao->select('consumed')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->fetch('consumed'); + $task->myConsumed = $this->dao->select('consumed')->from(TABLE_TEAM) + ->where('root')->eq($taskID) + ->andWhere('account')->eq($task->assignedTo) + ->andWhere('type')->eq('task') + ->fetch('consumed'); $lastAccount = end($teams); if($lastAccount != $task->assignedTo) @@ -1243,7 +1247,10 @@ class task extends control foreach($tasks as $task) $relatedStoryIdList[$task->story] = $task->story; /* Get team for multiple task. */ - $taskTeam = $this->dao->select('*')->from(TABLE_TEAM)->where('task')->in(array_keys($tasks))->fetchGroup('task'); + $taskTeam = $this->dao->select('*')->from(TABLE_TEAM) + ->where('root')->in(array_keys($tasks)) + ->andWhere('type')->eq('task') + ->fetchGroup('root'); if(!empty($taskTeam)) { foreach($taskTeam as $taskID => $team) $tasks[$taskID]->team = $team; diff --git a/module/task/model.php b/module/task/model.php index 49a3084350..7ae4d1a5a3 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -59,7 +59,7 @@ class taskModel extends model { if(empty($account) or isset($team[$account])) continue; $member = new stdClass(); - $member->project = 0; + $member->root = 0; $member->account = $account; $member->role = $assignedTo; $member->join = helper::today(); @@ -125,7 +125,8 @@ class taskModel extends model { foreach($teams as $team) { - $team->task = $taskID; + $team->root = $taskID; + $team->type = 'task'; $this->dao->insert(TABLE_TEAM)->data($team)->autoCheck()->exec(); } } @@ -358,11 +359,11 @@ class taskModel extends model if(empty($account) or isset($team[$account])) continue; $member = new stdClass(); - $member->project = 0; $member->account = $account; $member->role = $task->assignedTo; $member->join = helper::today(); - $member->task = $taskID; + $member->root = $taskID; + $member->type = 'task'; $member->estimate = $this->post->teamEstimate[$row] ? $this->post->teamEstimate[$row] : 0; $member->consumed = $this->post->teamConsumed[$row] ? $this->post->teamConsumed[$row] : 0; $member->left = $member->estimate - $member->consumed; @@ -403,8 +404,11 @@ class taskModel extends model $this->computeWorkingHours($oldTask->parent); /* Save team. */ - $this->dao->delete()->from(TABLE_TEAM)->where('task')->eq($taskID)->exec(); - if(!empty($teams)) foreach($teams as $member) $this->dao->insert(TABLE_TEAM)->data($member)->autoCheck()->exec(); + $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq($taskID)->andWhere('type')->eq('task')->exec(); + if(!empty($teams)) + { + foreach($teams as $member) $this->dao->insert(TABLE_TEAM)->data($member)->autoCheck()->exec(); + } if($this->post->story != false) $this->loadModel('story')->setStage($this->post->story); if(!dao::isError()) @@ -692,7 +696,11 @@ class taskModel extends model $newTeamInfo = new stdClass(); $newTeamInfo->consumed = $task->consumed; $newTeamInfo->left = 0; - $this->dao->update(TABLE_TEAM)->data($newTeamInfo)->where('task')->eq($taskID)->andWhere('account')->eq($oldTask->assignedTo)->exec(); + $this->dao->update(TABLE_TEAM)->data($newTeamInfo) + ->where('root')->eq($taskID) + ->andWhere('account')->eq($oldTask->assignedTo) + ->andWhere('type')->eq('task') + ->exec(); $newTask = new stdClass(); $newTask->left = 0; @@ -829,14 +837,26 @@ class taskModel extends model { $teams = array_keys($task->team); - $myConsumed = $this->dao->select('`consumed`')->from(TABLE_TEAM)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->fetch('consumed'); + $myConsumed = $this->dao->select('`consumed`')->from(TABLE_TEAM) + ->where('root')->eq($taskID) + ->andWhere('account')->eq($task->assignedTo) + ->andWhere('type')->eq('task') + ->fetch('consumed'); $newTeamInfo = new stdClass(); $newTeamInfo->consumed = $myConsumed + $consumed; $newTeamInfo->left = $left; - $this->dao->update(TABLE_TEAM)->data($newTeamInfo)->where('task')->eq($taskID)->andWhere('account')->eq($task->assignedTo)->exec(); + $this->dao->update(TABLE_TEAM)->data($newTeamInfo) + ->where('root')->eq($taskID) + ->andWhere('account')->eq($task->assignedTo) + ->andWhere('type')->eq('task') + ->exec(); - $teamTime = $this->dao->select("sum(`consumed`) as consumed,sum(`left`) as leftTime")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in($teams)->fetch(); + $teamTime = $this->dao->select("sum(`consumed`) as consumed,sum(`left`) as leftTime")->from(TABLE_TEAM) + ->where('root')->eq((int)$taskID) + ->andWhere('account')->in($teams) + ->andWhere('type')->eq('task') + ->fetch(); $data->consumed = $teamTime->consumed; $data->left = $teamTime->leftTime; @@ -918,15 +938,27 @@ class taskModel extends model { $teams = array_keys($oldTask->team); - $myConsumed = $this->dao->select("`consumed`")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->eq($oldTask->assignedTo)->fetch('consumed'); + $myConsumed = $this->dao->select("`consumed`")->from(TABLE_TEAM) + ->where('root')->eq((int)$taskID) + ->andWhere('account')->eq($oldTask->assignedTo) + ->andWhere('type')->eq('task') + ->fetch('consumed'); if($task->consumed < $myConsumed) die(js::error($this->lang->task->error->consumedSmall)); $data = new stdClass(); $data->left = 0; $data->consumed = $task->consumed; - $this->dao->update(TABLE_TEAM)->data($data)->where('task')->eq((int)$taskID)->andWhere('account')->eq($oldTask->assignedTo)->exec(); + $this->dao->update(TABLE_TEAM)->data($data) + ->where('root')->eq((int)$taskID) + ->andWhere('account')->eq($oldTask->assignedTo) + ->andWhere('type')->eq('task') + ->exec(); - $myTime = $this->dao->select("sum(`left`) as leftTime,sum(`consumed`) as consumed")->from(TABLE_TEAM)->where('task')->eq((int)$taskID)->andWhere('account')->in($teams)->fetch(); + $myTime = $this->dao->select("sum(`left`) as leftTime,sum(`consumed`) as consumed")->from(TABLE_TEAM) + ->where('root')->eq((int)$taskID) + ->andWhere('account')->in($teams) + ->andWhere('type')->eq('task') + ->fetch(); $newTask = new stdClass(); $newTask->left = $myTime->leftTime; @@ -1131,8 +1163,11 @@ class taskModel extends model /* Check parent Task. */ if(!empty($task->parent)) $task->parentName = $this->dao->findById($task->parent)->from(TABLE_TASK)->fetch('name'); - $teams = $this->dao->select('*')->from(TABLE_TEAM)->where('task')->eq($taskID)->orderBy('order_desc')->fetchGroup('task', 'account'); - foreach($teams as $key => $team) $teams[$key] = array_reverse($team, true); + $teams = $this->dao->select('*')->from(TABLE_TEAM)->where('root')->eq($taskID)->andWhere('type')->eq('task')->orderBy('order_desc')->fetchGroup('root', 'account'); + if(!empty($teams)) + { + foreach($teams as $key => $team) $teams[$key] = array_reverse($team, true); + } $task->team = isset($teams[$taskID]) ? $teams[$taskID] : array(); foreach($children as $child) $child->team = isset($teams[$child->id]) ? $teams[$child->id] : array(); @@ -1217,15 +1252,13 @@ class taskModel extends model ->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_STORY)->alias('t2')->on('t1.story = t2.id') ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') - ->leftJoin(TABLE_TEAM)->alias('t4')->on('t1.id = t4.task') + ->leftJoin(TABLE_TEAM)->alias('t4')->on('t4.root = t1.id') ->leftJoin(TABLE_MODULE)->alias('t5')->on('t1.module = t5.id') ->where('t1.project')->eq((int)$projectID) ->beginIF(!in_array($type, array('assignedtome', 'myinvolved')))->andWhere('t1.parent')->eq(0)->fi() ->beginIF($type == 'myinvolved') - ->andWhere('t4.account', true)->eq($this->app->user->account) - ->orWhere('t1.assignedTo')->eq($this->app->user->account) - ->orWhere('t1.finishedby')->eq($this->app->user->account) - ->markRight(1)->fi() + ->andWhere("((t4.`account` = '{$this->app->user->account}' AND t4.`type` = 'task') OR t1.`assignedTo` = '{$this->app->user->account}' OR t1.`finishedby` = '{$this->app->user->account}')") + ->fi() ->beginIF($productID)->andWhere("((t5.root=" . (int)$productID . " and t5.type='story') OR t2.product=" . (int)$productID . ")")->fi() ->beginIF($type == 'undone')->andWhere("(t1.status = 'wait' or t1.status ='doing')")->fi() ->beginIF($type == 'needconfirm')->andWhere('t2.version > t1.storyVersion')->andWhere("t2.status = 'active'")->fi() @@ -1244,7 +1277,7 @@ class taskModel extends model if(empty($tasks)) return array(); $taskList = array_keys($tasks); - $taskTeam = $this->dao->select('*')->from(TABLE_TEAM)->where('task')->in($taskList)->fetchGroup('task'); + $taskTeam = $this->dao->select('*')->from(TABLE_TEAM)->where('root')->in($taskList)->andWhere('type')->eq('task')->fetchGroup('root'); if(!empty($taskTeam)) { foreach($taskTeam as $taskID => $team) $tasks[$taskID]->team = $team; diff --git a/module/user/model.php b/module/user/model.php index 3e0acf77d2..c73afbc37b 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -15,7 +15,7 @@ class userModel extends model { /** * Set the menu. - * + * * @param array $users user pairs * @param string $account current account * @access public @@ -34,11 +34,11 @@ class userModel extends model /** * Set users list. - * - * @param array $users - * @param string $account + * + * @param array $users + * @param string $account * @access public - * @return html + * @return html */ public function setUserList($users, $account) { @@ -52,7 +52,7 @@ class userModel extends model /** * Get users list of current company. - * + * * @access public * @return void */ @@ -112,9 +112,9 @@ class userModel extends model /** * Get commiters from the user table. - * + * * @access public - * @return array + * @return array */ public function getCommiters() { @@ -133,11 +133,11 @@ class userModel extends model return $commiters; } - + /** * Get user list with email and real name. - * - * @param string|array $users + * + * @param string|array $users * @access public * @return array */ @@ -151,8 +151,8 @@ class userModel extends model /** * Get roles for some users. - * - * @param string $users + * + * @param string $users * @access public * @return array */ @@ -167,8 +167,8 @@ class userModel extends model /** * Get user info by ID. - * - * @param int $userID + * + * @param int $userID * @access public * @return object|bool */ @@ -182,9 +182,9 @@ class userModel extends model /** * Get users by sql. - * - * @param int $query - * @param int $pager + * + * @param int $query + * @param int $pager * @access public * @return void */ @@ -287,7 +287,7 @@ class userModel extends model $data[$i]->group = $users->group[$i] == 'ditto' ? (isset($prev['group']) ? $prev['group'] : '') : $users->group[$i]; $data[$i]->email = $users->email[$i]; $data[$i]->gender = $users->gender[$i]; - $data[$i]->password = md5($users->password[$i]); + $data[$i]->password = md5($users->password[$i]); $data[$i]->commiter = $users->commiter[$i]; $data[$i]->join = empty($users->join[$i]) ? '0000-00-00' : ($user->join[$i]); $data[$i]->skype = $users->skype[$i]; @@ -333,7 +333,7 @@ class userModel extends model } unset($user->group); $this->dao->insert(TABLE_USER)->data($user)->autoCheck()->exec(); - if(dao::isError()) + if(dao::isError()) { echo js::error(dao::getError()); die(js::reload('parent')); @@ -347,8 +347,8 @@ class userModel extends model /** * Update a user. - * - * @param int $userID + * + * @param int $userID * @access public * @return void */ @@ -523,9 +523,9 @@ class userModel extends model } /** - * Update password - * - * @param string $userID + * Update password + * + * @param string $userID * @access public * @return void */ @@ -560,14 +560,14 @@ class userModel extends model /** * Reset password. - * + * * @access public * @return bool */ public function resetPassword() { if(!$this->checkPassword()) return; - + $user = $this->getById($this->post->account); if(!$user) return false; @@ -584,7 +584,7 @@ class userModel extends model /** * Check the passwds posted. - * + * * @access public * @return bool */ @@ -601,7 +601,7 @@ class userModel extends model /** * Identify a user. - * + * * @param string $account the user account * @param string $password the user password or auth hash * @access public @@ -663,7 +663,7 @@ class userModel extends model /** * Identify user by PHP_AUTH_USER. - * + * * @access public * @return void */ @@ -684,7 +684,7 @@ class userModel extends model /** * Identify user by cookie. - * + * * @access public * @return void */ @@ -707,7 +707,7 @@ class userModel extends model /** * Authorize a user. - * + * * @param string $account * @access public * @return array the user rights. @@ -795,7 +795,7 @@ class userModel extends model /** * Judge a user is logon or not. - * + * * @access public * @return bool */ @@ -806,8 +806,8 @@ class userModel extends model /** * Get groups a user belongs to. - * - * @param string $account + * + * @param string $account * @access public * @return array */ @@ -817,17 +817,18 @@ class userModel extends model } /** - * Get projects a user participated. - * - * @param string $account + * Get projects a user participated. + * + * @param string $account * @access public * @return array */ public function getProjects($account) { $projects = $this->dao->select('t1.*,t2.*')->from(TABLE_TEAM)->alias('t1') - ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.root = t2.id') ->where('t1.account')->eq($account) + ->andWhere('t1.type')->eq('project') ->andWhere('t2.deleted')->eq(0) ->fetchAll(); @@ -846,8 +847,8 @@ class userModel extends model /** * Plus the fail times. - * - * @param int $account + * + * @param int $account * @access public * @return void */ @@ -857,8 +858,8 @@ class userModel extends model if(empty($user)) return 0; $fails = $user->fails; - $fails ++; - if($fails < $this->config->user->failTimes) + $fails ++; + if($fails < $this->config->user->failTimes) { $locked = '0000-00-00 00:00:00'; $failTimes = $fails; @@ -873,15 +874,15 @@ class userModel extends model } /** - * Check whether the user is locked. - * - * @param int $account + * Check whether the user is locked. + * + * @param int $account * @access public * @return void */ public function checkLocked($account) { - $user = $this->dao->select('locked')->from(TABLE_USER)->where('account')->eq($account)->fetch(); + $user = $this->dao->select('locked')->from(TABLE_USER)->where('account')->eq($account)->fetch(); if(empty($user)) return false; if((strtotime(date('Y-m-d H:i:s')) - strtotime($user->locked)) > $this->config->user->lockMinutes * 60) return false; @@ -889,9 +890,9 @@ class userModel extends model } /** - * Unlock the locked user. - * - * @param int $account + * Unlock the locked user. + * + * @param int $account * @access public * @return void */ @@ -901,9 +902,9 @@ class userModel extends model } /** - * Unbind Ranzhi - * - * @param string $account + * Unbind Ranzhi + * + * @param string $account * @access public * @return void */ @@ -914,7 +915,7 @@ class userModel extends model /** * Get contact list of a user. - * + * * @param string $account * @param string $params withempty|withnote * @@ -960,8 +961,8 @@ class userModel extends model /** * Get a contact list by id. - * - * @param int $listID + * + * @param int $listID * @access public * @return object */ @@ -972,8 +973,8 @@ class userModel extends model /** * Get user account and realname pairs from a contact list. - * - * @param string $accountList + * + * @param string $accountList * @access public * @return array */ @@ -984,9 +985,9 @@ class userModel extends model /** * Create a contact list. - * - * @param string $listName - * @param string $userList + * + * @param string $listName + * @param string $userList * @access public * @return int */ @@ -1013,10 +1014,10 @@ class userModel extends model /** * Update a contact list. - * - * @param int $listID - * @param string $listName - * @param string $userList + * + * @param int $listID + * @param string $listName + * @param string $userList * @access public * @return void */ @@ -1065,8 +1066,8 @@ class userModel extends model /** * Delete a contact list. - * - * @param int $listID + * + * @param int $listID * @access public * @return void */ @@ -1077,8 +1078,8 @@ class userModel extends model /** * Get data in JSON. - * - * @param object $user + * + * @param object $user * @access public * @return array */ @@ -1094,7 +1095,7 @@ class userModel extends model /** * Get weak users. - * + * * @access public * @return array */ @@ -1142,9 +1143,9 @@ class userModel extends model } /** - * Compute password strength. - * - * @param string $password + * Compute password strength. + * + * @param string $password * @access public * @return int */ diff --git a/module/user/view/project.html.php b/module/user/view/project.html.php index d7d3882904..35f86b240c 100644 --- a/module/user/view/project.html.php +++ b/module/user/view/project.html.php @@ -18,7 +18,7 @@ idAB;?> project->code;?> - project->name;?> + project->name;?> project->begin;?> project->end;?> statusAB;?> @@ -33,7 +33,7 @@ id);?> code;?> - name);?> + name);?> begin;?> end;?> delay)):?> @@ -47,5 +47,5 @@ - + From e5b312e326df526a29629a0b0d39119c85d3985f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 09:11:19 +0800 Subject: [PATCH 046/206] * Add upgrade for Task#3561 --- db/update9.7.sql | 4 - module/upgrade/model.php | 170 ++++++++++++++++++++++----------------- 2 files changed, 94 insertions(+), 80 deletions(-) diff --git a/db/update9.7.sql b/db/update9.7.sql index a02909c04c..e69de29bb2 100644 --- a/db/update9.7.sql +++ b/db/update9.7.sql @@ -1,4 +0,0 @@ -ALTER TABLE `zt_team` DROP PRIMARY KEY; -ALTER TABLE `zt_team` CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'; -ALTER TABLE `zt_team` DROP `task`; -ALTER TABLE `zt_team` ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index b2f5c2535a..e5e0fb7f5d 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -75,13 +75,13 @@ class upgradeModel extends model $this->execSQL($this->getUpgradeFile('3.3')); $this->updateTaskAssignedTo(); case '4_0_beta1': $this->execSQL($this->getUpgradeFile('4.0.beta1')); - case '4_0_beta2': + case '4_0_beta2': $this->execSQL($this->getUpgradeFile('4.0.beta2')); $this->updateProjectType(); $this->updateEstimatePriv(); - case '4_0': + case '4_0': $this->execSQL($this->getUpgradeFile('4.0')); - case '4_0_1': + case '4_0_1': $this->execSQL($this->getUpgradeFile('4.0.1')); $this->addPriv4_0_1(); case '4_1': @@ -201,6 +201,8 @@ class upgradeModel extends model $this->changeLimitedName(); $this->adjustPriv9_7(); $this->changeStoryWidth(); + case '9_7': + $this->changeTeamFields(); } $this->deletePatch(); @@ -208,8 +210,8 @@ class upgradeModel extends model /** * Create the confirm contents. - * - * @param string $fromVersion + * + * @param string $fromVersion * @access public * @return string */ @@ -275,7 +277,7 @@ class upgradeModel extends model case '8_0_1': $confirmContent .= file_get_contents($this->getUpgradeFile('8.0.1')); case '8_1': $confirmContent .= file_get_contents($this->getUpgradeFile('8.1')); case '8_1_3': $confirmContent .= file_get_contents($this->getUpgradeFile('8.1.3')); - case '8_2_beta': + case '8_2_beta': case '8_2': case '8_2_1': $confirmContent .= file_get_contents($this->getUpgradeFile('8.2.1')); case '8_2_2': @@ -338,7 +340,7 @@ class upgradeModel extends model /** * Update ubb code in bug table and user Templates table to html. - * + * * @access public * @return void */ @@ -400,7 +402,7 @@ class upgradeModel extends model /** * Update nl to br from 1.3 version. - * + * * @access public * @return void */ @@ -446,7 +448,7 @@ class upgradeModel extends model /** * Update task fields. - * + * * @access public * @return void */ @@ -528,8 +530,8 @@ class upgradeModel extends model } /** - * Update activated count of Bug. - * + * Update activated count of Bug. + * * @access public * @return void */ @@ -552,7 +554,7 @@ class upgradeModel extends model /** * Update lastRun and lastResult field in zt_case - * + * * @access public * @return void */ @@ -570,21 +572,21 @@ class upgradeModel extends model } /** - * Update type of projects. - * + * Update type of projects. + * * @access public * @return void */ public function updateProjectType() { - $projects = $this->dao->select('root')->from(TABLE_MODULE)->where('type')->eq('task')->fetchPairs('root'); - $this->dao->update(TABLE_PROJECT)->set('type')->eq('waterfall')->where('id')->in($projects)->exec(); + $projects = $this->dao->select('root')->from(TABLE_MODULE)->where('type')->eq('task')->fetchPairs('root'); + $this->dao->update(TABLE_PROJECT)->set('type')->eq('waterfall')->where('id')->in($projects)->exec(); return true; } /** * Update estimate priv. - * + * * @access public * @return void */ @@ -637,8 +639,8 @@ class upgradeModel extends model } /** - * Update the data of action. - * + * Update the data of action. + * * @access public * @return void */ @@ -682,8 +684,8 @@ class upgradeModel extends model } /** - * Init the data of product and project order field. - * + * Init the data of product and project order field. + * * @access public * @return void */ @@ -704,7 +706,7 @@ class upgradeModel extends model /** * Update task assignedTo. - * + * * @access public * @return void */ @@ -719,7 +721,7 @@ class upgradeModel extends model /** * Delete the patch record. - * + * * @access public * @return void */ @@ -731,8 +733,8 @@ class upgradeModel extends model /** * Get the upgrade sql file. - * - * @param string $version + * + * @param string $version * @access public * @return string */ @@ -743,8 +745,8 @@ class upgradeModel extends model /** * Execute a sql. - * - * @param string $sqlFile + * + * @param string $sqlFile * @access public * @return void */ @@ -755,7 +757,7 @@ class upgradeModel extends model /* Read the sql file to lines, remove the comment lines, then join theme by ';'. */ $sqls = explode("\n", file_get_contents($sqlFile)); - foreach($sqls as $key => $line) + foreach($sqls as $key => $line) { $line = trim($line); $sqls[$key] = $line; @@ -780,7 +782,7 @@ class upgradeModel extends model { $this->dbh->exec($sql); } - catch (PDOException $e) + catch (PDOException $e) { $errorInfo = $e->errorInfo; $errorCode = $errorInfo[1]; @@ -790,8 +792,8 @@ class upgradeModel extends model } /** - * Add priv for version 4.0.1 - * + * Add priv for version 4.0.1 + * * @access public * @return void */ @@ -832,10 +834,10 @@ class upgradeModel extends model } /** - * Add priv for version 4.1 - * + * Add priv for version 4.1 + * * @access public - * @return bool + * @return bool */ public function addPriv4_1() { @@ -927,7 +929,7 @@ class upgradeModel extends model /** * Add priv for 8.2. - * + * * @access public * @return bool */ @@ -973,7 +975,7 @@ class upgradeModel extends model /** * Adjust config section and key. - * + * * @access public * @return bool */ @@ -992,8 +994,8 @@ class upgradeModel extends model /** * To lower table. - * - * @param string $build + * + * @param string $build * @access public * @return bool */ @@ -1037,7 +1039,7 @@ class upgradeModel extends model /** * Process finishedBy and finishedDate of task. - * + * * @access public * @return bool */ @@ -1055,7 +1057,7 @@ class upgradeModel extends model /** * Delete company field for the table of zt_config and zt_groupPriv. - * + * * @access public * @return void */ @@ -1089,7 +1091,7 @@ class upgradeModel extends model /** * Merge the goal and desc of project. - * + * * @access public * @return void */ @@ -1110,7 +1112,7 @@ class upgradeModel extends model /** * Fix OS info of bugs. - * + * * @access public * @return void */ @@ -1122,7 +1124,7 @@ class upgradeModel extends model /** * Fix finishedBy of task. - * + * * @access public * @return void */ @@ -1152,7 +1154,7 @@ class upgradeModel extends model /** * Touch index.html for upload when has not it. - * + * * @access public * @return bool */ @@ -1168,7 +1170,7 @@ class upgradeModel extends model /** * Init order. - * + * * @access public * @return bool */ @@ -1187,7 +1189,7 @@ class upgradeModel extends model /** * Adjust order for 7.3 - * + * * @access public * @return void */ @@ -1200,8 +1202,8 @@ class upgradeModel extends model } /** - * Adjust priv for 7.4.beta - * + * Adjust priv for 7.4.beta + * * @access public * @return void */ @@ -1222,7 +1224,7 @@ class upgradeModel extends model /** * Adjust doc module. - * + * * @access public * @return bool */ @@ -1331,7 +1333,7 @@ class upgradeModel extends model /** * Update file objectID in editor. - * + * * @access public * @return bool */ @@ -1437,7 +1439,7 @@ class upgradeModel extends model /** * Move doc content to table zt_doccontent. - * + * * @access public * @return bool */ @@ -1447,7 +1449,7 @@ class upgradeModel extends model $processFields = 0; foreach($descDoc as $field) { - if($field->Field == 'content' or $field->Field == 'digest' or $field->Field == 'url') $processFields ++; + if($field->Field == 'content' or $field->Field == 'digest' or $field->Field == 'url') $processFields ++; } if($processFields < 3) return true; @@ -1475,8 +1477,8 @@ class upgradeModel extends model } /** - * Adjust priv 8.3 - * + * Adjust priv 8.3 + * * @access public * @return bool */ @@ -1499,10 +1501,10 @@ class upgradeModel extends model } return true; } - + /** * Rename main lib. - * + * * @access public * @return bool */ @@ -1516,7 +1518,7 @@ class upgradeModel extends model /** * Adjust priv for 8.4. - * + * * @access public * @return bool */ @@ -1547,8 +1549,8 @@ class upgradeModel extends model } /** - * Adjust priv for 9.0 - * + * Adjust priv for 9.0 + * * @access public * @return void */ @@ -1577,7 +1579,7 @@ class upgradeModel extends model /** * Fix projectproduct data. - * + * * @access public * @return bool */ @@ -1589,7 +1591,7 @@ class upgradeModel extends model /** * Add bug deadline for custom fields. - * + * * @access public * @return bool */ @@ -1621,8 +1623,8 @@ class upgradeModel extends model } /** - * Adjust priv for 9.0.1. - * + * Adjust priv for 9.0.1. + * * @access public * @return bool */ @@ -1728,7 +1730,7 @@ class upgradeModel extends model * Adjust priv for 9.4. * * @access public - * @return bool + * @return bool */ public function adjustPriv9_4() { @@ -1756,7 +1758,7 @@ class upgradeModel extends model /** * Get errors during the upgrading. - * + * * @access public * @return array */ @@ -1769,7 +1771,7 @@ class upgradeModel extends model /** * Check safe file. - * + * * @access public * @return string|false */ @@ -1782,7 +1784,7 @@ class upgradeModel extends model /** * Check weither process or not. - * + * * @access public * @return array */ @@ -1795,8 +1797,8 @@ class upgradeModel extends model } /** - * Process customMenus for different working. - * + * Process customMenus for different working. + * * @access public * @return void */ @@ -1815,7 +1817,7 @@ class upgradeModel extends model /** * Init project story order. - * + * * @access public * @return bool */ @@ -1840,7 +1842,7 @@ class upgradeModel extends model /** * Fix datatable cols config. - * + * * @access public * @return bool */ @@ -1868,7 +1870,7 @@ class upgradeModel extends model /** * Add limited group. - * + * * @access public * @return bool */ @@ -1913,7 +1915,7 @@ class upgradeModel extends model /** * Change limited name. - * + * * @access public * @return bool */ @@ -1929,8 +1931,8 @@ class upgradeModel extends model } /** - * Adjust Priv for 9.7 - * + * Adjust Priv for 9.7 + * * @access public * @return bool */ @@ -1950,7 +1952,7 @@ class upgradeModel extends model /** * Change story field width. - * + * * @access public * @return bool */ @@ -1968,4 +1970,20 @@ class upgradeModel extends model } return true; } + + /** + * Change team field for 9.8. + * + * @access public + * @return bool + */ + public function changeTeamFields() + { + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " DROP PRIMARY KEY"); + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'"); + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`"); + $this->dao->exec("UPDATE " . TABLE_TEAM . " SET `root` = `task`, `type` = 'task' WHERE `task` > '0'"); + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " DROP `task`"); + return true; + } } From b4a165b5738e5cc3c77d680a062f33bd50bcf216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 09:16:58 +0800 Subject: [PATCH 047/206] * Add install sql for Task#3561 --- db/zentao.sql | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/db/zentao.sql b/db/zentao.sql index bafc633bfb..8074392b9b 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -412,7 +412,7 @@ CREATE TABLE IF NOT EXISTS `zt_product` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `name` varchar(90) NOT NULL, `code` varchar(45) NOT NULL, - `line` mediumint(8) NOT NULL, + `line` mediumint(8) NOT NULL, `type` varchar(30) NOT NULL default 'normal', `status` varchar(30) NOT NULL default '', `desc` text NOT NULL, @@ -627,8 +627,8 @@ CREATE TABLE IF NOT EXISTS `zt_taskestimate` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_team`; CREATE TABLE IF NOT EXISTS `zt_team` ( - `project` mediumint(8) unsigned NOT NULL default '0', - `task` mediumint(8) NOT NULL DEFAULT '0', + `root` mediumint(8) unsigned NOT NULL default '0', + `type` enum('project','task') NOT NULL DEFAULT 'project', `account` char(30) NOT NULL default '', `role` char(30) NOT NULL default '', `limited` char(8) NOT NULL default 'no', @@ -638,9 +638,8 @@ CREATE TABLE IF NOT EXISTS `zt_team` ( `estimate` DECIMAL(12,2) UNSIGNED NOT NULL DEFAULT '0', `consumed` DECIMAL(12,2) UNSIGNED NOT NULL DEFAULT '0', `left` DECIMAL(12,2) UNSIGNED NOT NULL DEFAULT '0', - `order` TINYINT(3) NOT NULL DEFAULT '0', - PRIMARY KEY (`project`, `task`, `account`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; + `order` TINYINT(3) NOT NULL DEFAULT '0' + ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_testreport`; CREATE TABLE IF NOT EXISTS `zt_testreport` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, @@ -699,11 +698,11 @@ CREATE TABLE IF NOT EXISTS `zt_testsuite` ( `desc` text NOT NULL, `type` varchar(20) NOT NULL, `addedBy` char(30) NOT NULL, - `addedDate` datetime NOT NULL, + `addedDate` datetime NOT NULL, `lastEditedBy` char(30) NOT NULL, - `lastEditedDate` datetime NOT NULL, + `lastEditedDate` datetime NOT NULL, `deleted` enum('0','1') NOT NULL, - PRIMARY KEY (`id`) + PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_testtask`; CREATE TABLE IF NOT EXISTS `zt_testtask` ( From d88201be75bf4342357ce0d54dc0e6a164bc3823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 09:26:05 +0800 Subject: [PATCH 048/206] * Format code. --- config/config.php | 10 ++--- module/mail/control.php | 82 ++++++++++++++++++++--------------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/config/config.php b/config/config.php index 29bf857529..00d3117e93 100644 --- a/config/config.php +++ b/config/config.php @@ -5,7 +5,7 @@ * * The author disclaims copyright to this source code. In place of * a legal notice, here is a blessing: - * + * * May you do good and not evil. * May you find forgiveness for yourself and forgive others. * May you share freely, never taking more than you give. @@ -32,12 +32,12 @@ $config->sessionVar = 'zentaosid'; // 请求类型为GET:session变 $config->views = ',html,json,mhtml,'; // 支持的视图类型。 Supported view formats. /* 支持的主题和语言。Supported thems and languages. */ -$config->themes['default'] = 'default'; +$config->themes['default'] = 'default'; $config->langs['zh-cn'] = '简体'; $config->langs['zh-tw'] = '繁體'; $config->langs['en'] = 'English'; -/* 设备类型视图文件前缀。The prefix for view file for different device. */ +/* 设备类型视图文件前缀。The prefix for view file for different device. */ $config->devicePrefix['mhtml'] = ''; /* 默认值设置。Default settings. */ @@ -80,7 +80,7 @@ $config->domainPostfix .= "|rocks|social|co.com|bio|reviews|link|sexy|us.com|con $config->domainPostfix .= "|menu|info|events|webcam|dating|vacations|flights|cruises|global|ca|guru|"; $config->domainPostfix .= "|futbol|rentals|dance|lawyer|attorney|democrat|republican|actor|condos|immobilien|"; $config->domainPostfix .= "|villas|foundation|expert|works|tools|watch|zone|bargains|agency|best|solar|"; -$config->domainPostfix .= "|farm|pics|photo|marketing|holiday|gift|buzz|guitars|trade|construction|"; +$config->domainPostfix .= "|farm|pics|photo|marketing|holiday|gift|buzz|guitars|trade|construction|"; $config->domainPostfix .= "|international|house|coffee|florist|rich|ceo|camp|education|repair|win|site|"; /* 系统框架配置。Framework settings. */ @@ -103,7 +103,7 @@ $config->framework->detectDevice['zh-tw'] = true; // 在zh-tw语言情况下, $config->framework->detectDevice['en'] = true; // 在en语言情况下,是否启用设备检测功能。 Whether enable device detect or not. /* 文件上传设置。 Upload settings. */ -$config->file = new stdclass(); +$config->file = new stdclass(); $config->file->dangers = 'php,php3,php4,phtml,php5,jsp,py,rb,asp,aspx,ashx,asa,cer,cdx,aspl,shtm,shtml,html,htm'; $config->file->allowed = 'txt,doc,docx,dot,wps,wri,pdf,ppt,pptx,xls,xlsx,ett,xlt,xlsm,csv,jpg,jpeg,png,psd,gif,ico,bmp,swf,avi,rmvb,rm,mp3,mp4,3gp,flv,mov,movie,rar,zip,bz,bz2,tar,gz,mpp,rp,pdm,vsdx,vsd,sql'; diff --git a/module/mail/control.php b/module/mail/control.php index 3c9ad804f3..cdc4a5ddd1 100755 --- a/module/mail/control.php +++ b/module/mail/control.php @@ -13,7 +13,7 @@ class mail extends control { /** * Construct. - * + * * @access public * @return void */ @@ -31,7 +31,7 @@ class mail extends control /** * The index page, goto edit page or detect page. - * + * * @access public * @return void */ @@ -51,7 +51,7 @@ class mail extends control /** * Detect email config auto. - * + * * @access public * @return void */ @@ -91,7 +91,7 @@ class mail extends control /** * Edit the mail config. - * + * * @access public * @return void */ @@ -119,15 +119,15 @@ class mail extends control $this->view->position[] = html::a(inlink('index'), $this->lang->mail->common); $this->view->position[] = $this->lang->mail->edit; - $this->view->mailExist = $this->mail->mailExist(); - $this->view->mailConfig = $mailConfig; - $this->view->openssl = extension_loaded('openssl'); + $this->view->mailExist = $this->mail->mailExist(); + $this->view->mailConfig = $mailConfig; + $this->view->openssl = extension_loaded('openssl'); $this->display(); } /** - * Save the email config. - * + * Save the email config. + * * @access public * @return void */ @@ -141,7 +141,7 @@ class mail extends control $mailConfig->turnon = $this->post->turnon; $mailConfig->mta = 'smtp'; $mailConfig->async = $this->post->async; - $mailConfig->fromAddress = trim($this->post->fromAddress); + $mailConfig->fromAddress = trim($this->post->fromAddress); $mailConfig->fromName = trim($this->post->fromName); $mailConfig->domain = trim($this->post->domain); $mailConfig->smtp->host = trim($this->post->host); @@ -183,14 +183,14 @@ class mail extends control $this->view->position[] = html::a(inlink('index'), $this->lang->mail->common); $this->view->position[] = $this->lang->mail->save; - $this->view->mailExist = $this->mail->mailExist(); + $this->view->mailExist = $this->mail->mailExist(); $this->display(); } } /** * Set SendCloud. - * + * * @access public * @return void */ @@ -201,12 +201,12 @@ class mail extends control $mailConfig = new stdclass(); $mailConfig->sendcloud = new stdclass(); - $mailConfig->turnon = $this->post->turnon; - $mailConfig->mta = 'sendcloud'; - $mailConfig->async = $this->post->async; - $mailConfig->fromAddress = ''; - $mailConfig->fromName = ''; - $mailConfig->domain = trim($this->post->domain); + $mailConfig->turnon = $this->post->turnon; + $mailConfig->mta = 'sendcloud'; + $mailConfig->async = $this->post->async; + $mailConfig->fromAddress = ''; + $mailConfig->fromName = ''; + $mailConfig->domain = trim($this->post->domain); $mailConfig->sendcloud->accessKey = trim($this->post->accessKey); $mailConfig->sendcloud->secretKey = trim($this->post->secretKey); @@ -241,7 +241,7 @@ class mail extends control /** * Send test email. - * + * * @access public * @return void */ @@ -288,19 +288,19 @@ class mail extends control /** * Reset the email config. - * + * * @access public * @return void */ public function reset() { - $this->dao->delete('*')->from(TABLE_CONFIG)->where('module')->eq('mail')->exec(); + $this->dao->delete('*')->from(TABLE_CONFIG)->where('module')->eq('mail')->exec(); $this->locate(inlink('index')); } /** * Async send mail. - * + * * @access public * @return void */ @@ -351,8 +351,8 @@ class mail extends control } /** - * Resend fail mails. - * + * Resend fail mails. + * * @access public * @return void */ @@ -385,12 +385,12 @@ class mail extends control } /** - * Browse mail queue. - * - * @param string $orderBy - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * Browse mail queue. + * + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -411,10 +411,10 @@ class mail extends control } /** - * Delete mail queue. - * - * @param int $id - * @param string $confirm + * Delete mail queue. + * + * @param int $id + * @param string $confirm * @access public * @return void */ @@ -428,8 +428,8 @@ class mail extends control /** * Batch delete mail queue. - * - * @param string $confirm + * + * @param string $confirm * @access public * @return void */ @@ -450,7 +450,7 @@ class mail extends control /** * Sendcloud user. - * + * * @access public * @return void */ @@ -500,7 +500,7 @@ class mail extends control /** * zentao cloud. - * + * * @access public * @return void */ @@ -514,7 +514,7 @@ class mail extends control $mailConfig->turnon = $this->post->turnon; $mailConfig->mta = 'ztcloud'; $mailConfig->async = $this->post->async; - $mailConfig->fromAddress = $this->post->fromAddress; + $mailConfig->fromAddress = $this->post->fromAddress; $mailConfig->fromName = $this->post->fromName; $mailConfig->domain = trim($this->post->domain); @@ -562,8 +562,8 @@ class mail extends control if((isset($data->qq) and empty($data->qq)) or (isset($data->company) and empty($data->company))) { $params = ''; - if(empty($data->qq))$params .= 'qq,'; - if(empty($data->company))$params .= 'company,'; + if(empty($data->qq)) $params .= 'qq,'; + if(empty($data->company)) $params .= 'company,'; die(js::locate($this->createLink('admin', 'ztCompany', 'fields=' . trim($params, ',')))); } if($result->result == 'fail' and empty($data->emailCertified)) From 92601443c97b71e9196c2bb28c5d1b0b99e5570c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 11:04:50 +0800 Subject: [PATCH 049/206] * Finish Task#3565. --- module/bug/view/sendmail.html.php | 4 ++- module/report/model.php | 50 +++++++++++++------------- module/story/view/sendmail.html.php | 4 ++- module/task/view/sendmail.html.php | 4 ++- module/testtask/view/sendmail.html.php | 4 ++- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/module/bug/view/sendmail.html.php b/module/bug/view/sendmail.html.php index bd70d8ee20..cb7e4f2f30 100644 --- a/module/bug/view/sendmail.html.php +++ b/module/bug/view/sendmail.html.php @@ -16,7 +16,9 @@ - +
      config->mail, 'domain', common::getSysURL()) . helper::createLink('bug', 'view', "bugID=$bug->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?>color;?>'> + config->mail, 'domain', common::getSysURL()) . helper::createLink('bug', 'view', "bugID=$bug->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> +
      diff --git a/module/report/model.php b/module/report/model.php index a52a888639..60be384fea 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -15,8 +15,8 @@ class reportModel extends model { /** * Compute percent of every item. - * - * @param array $datas + * + * @param array $datas * @access public * @return array */ @@ -69,9 +69,9 @@ class reportModel extends model /** * Convert date format. - * - * @param array $dateList - * @param string $format + * + * @param array $dateList + * @param string $format * @access public * @return array */ @@ -82,8 +82,8 @@ class reportModel extends model } /** - * Get projects. - * + * Get projects. + * * @access public * @return void */ @@ -121,10 +121,10 @@ class reportModel extends model } /** - * Get products. - * + * Get products. + * * @access public - * @return array + * @return array */ public function getProducts($conditions) { @@ -195,10 +195,10 @@ class reportModel extends model } /** - * Get bugs - * - * @param int $begin - * @param int $end + * Get bugs + * + * @param int $begin + * @param int $end * @access public * @return array */ @@ -232,12 +232,12 @@ class reportModel extends model $bugCreate[$account]['validRate'] = (isset($bug['resolved']) and $bug['resolved']) ? ($validRate / $bug['resolved']) : "0"; } uasort($bugCreate, 'sortSummary'); - return $bugCreate; + return $bugCreate; } /** - * Get workload. - * + * Get workload. + * * @access public * @return array */ @@ -275,10 +275,10 @@ class reportModel extends model } /** - * Get bug assign. - * + * Get bug assign. + * * @access public - * @return array + * @return array */ public function getBugAssign() { @@ -307,7 +307,7 @@ class reportModel extends model /** * Get System URL. - * + * * @access public * @return void */ @@ -331,7 +331,7 @@ class reportModel extends model /** * Get user bugs. - * + * * @access public * @return void */ @@ -351,7 +351,7 @@ class reportModel extends model /** * Get user tasks. - * + * * @access public * @return void */ @@ -372,7 +372,7 @@ class reportModel extends model /** * Get user todos. - * + * * @access public * @return void */ @@ -398,7 +398,7 @@ class reportModel extends model /** * Get user testTasks. - * + * * @access public * @return array */ diff --git a/module/story/view/sendmail.html.php b/module/story/view/sendmail.html.php index 27b9370106..a89fb3e0f3 100644 --- a/module/story/view/sendmail.html.php +++ b/module/story/view/sendmail.html.php @@ -16,7 +16,9 @@ - +
      config->mail, 'domain', common::getSysURL()) . helper::createLink('story', 'view', "storyID=$story->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?>color;?>'> + config->mail, 'domain', common::getSysURL()) . helper::createLink('story', 'view', "storyID=$story->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> +
      diff --git a/module/task/view/sendmail.html.php b/module/task/view/sendmail.html.php index 2a7b0dda6d..4c29d4bbf5 100644 --- a/module/task/view/sendmail.html.php +++ b/module/task/view/sendmail.html.php @@ -16,7 +16,9 @@ - +
      config->mail, 'domain', common::getSysURL()) . helper::createLink('task', 'view', "taskID=$task->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?>color;?>'> + config->mail, 'domain', common::getSysURL()) . helper::createLink('task', 'view', "taskID=$task->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> +
      diff --git a/module/testtask/view/sendmail.html.php b/module/testtask/view/sendmail.html.php index 1e1320d78d..437cb4dcbc 100644 --- a/module/testtask/view/sendmail.html.php +++ b/module/testtask/view/sendmail.html.php @@ -16,7 +16,9 @@ - +
      config->mail, 'domain', common::getSysURL()) . helper::createLink('testtask', 'view', "testtaskID=$testtask->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> + config->mail, 'domain', common::getSysURL()) . helper::createLink('testtask', 'view', "testtaskID=$testtask->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> +
      From d71d582f3d15275a49aca0f791cc972549871dad Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 29 Dec 2017 11:25:53 +0800 Subject: [PATCH 050/206] * adjust code. --- lib/dao/dao.class.php | 2 +- module/bug/model.php | 17 ++++++++++++++++- module/common/model.php | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/dao/dao.class.php b/lib/dao/dao.class.php index ea12a7ddb6..441109e7b3 100644 --- a/lib/dao/dao.class.php +++ b/lib/dao/dao.class.php @@ -22,7 +22,7 @@ class dao extends baseDAO { public function exec($sql = '') { - if(isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode']) die(js::alert($this->lang->error->tutorialData)); + if(isset($_SESSION['tutorialMode']) and $_SESSION['tutorialMode']) die(); return parent::exec($sql); } diff --git a/module/bug/model.php b/module/bug/model.php index c88ea9c114..0f3d11b426 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -2468,7 +2468,22 @@ class bugModel extends model break; case 'openedBuild': $builds = array_flip($builds); - foreach(explode(',', $bug->openedBuild) as $build) echo html::a(helper::createLink('build', 'view', "buildID=$builds[$build]"), $build, '', "title='$bug->openedBuild'"); + foreach(explode(',', $bug->openedBuild) as $build) + { + $buildID = zget($builds, $build, ''); + if($buildID == 'trunk') + { + echo $build; + } + elseif($buildID and common::hasPriv('build', 'view')) + { + echo html::a(helper::createLink('build', 'view', "buildID=$buildID"), $build, '', "title='$bug->openedBuild'"); + } + else + { + echo $build; + } + } break; case 'assignedTo': echo zget($users, $bug->assignedTo, $bug->assignedTo); diff --git a/module/common/model.php b/module/common/model.php index 0208b25cfb..51533490bd 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -1162,6 +1162,7 @@ class commonModel extends model if($menu == 'my' or $menu == 'index' or $module == 'tree') return true; if($module == 'company' and $method == 'dynamic') return true; if($module == 'action' and $method == 'editcomment') return true; + if($module == 'action' and $method == 'comment') return true; if(!isset($acls['views'][$menu])) return false; return true; From ba2439d26502bbd03ba2503487b14980735c74d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 15:53:10 +0800 Subject: [PATCH 051/206] * Finish Task#3566. --- module/doc/view/view.html.php | 66 +++++++++++++++++------------------ 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/module/doc/view/view.html.php b/module/doc/view/view.html.php index b584f29a10..96a0a7e6e0 100644 --- a/module/doc/view/view.html.php +++ b/module/doc/view/view.html.php @@ -89,41 +89,38 @@
      -
      - doc->content;?> -
      - content; - if($doc->type == 'url') - { - $url = $doc->content; - if(!preg_match('/^https?:\/\//', $doc->content)) $url = 'http://' . $url; - $content = html::a($url, $doc->content, '_blank'); - } - echo $content; - ?> -
      - files as $file):?> - extension, $config->file->imageExtensions)):?> - file->uploadDate . substr($file->addedDate, 0, 10);?> -
    • - - id}");?>" alt="title?>"> - - - ", '', "class='btn-icon' onclick='deleteFile($file->id)' title='$lang->delete'");?> - -
    • - files[$file->id]);?> - - -
      - -
      fetch('file', 'printFiles', array('files' => $doc->files, 'fieldset' => 'false'));?>
      +
      + content; + if($doc->type == 'url') + { + $url = $doc->content; + if(!preg_match('/^https?:\/\//', $doc->content)) $url = 'http://' . $url; + $content = html::a($url, $doc->content, '_blank'); + } + echo $content; + ?> +
      + files as $file):?> + extension, $config->file->imageExtensions)):?> + file->uploadDate . substr($file->addedDate, 0, 10);?> +
    • + + id}");?>" alt="title?>"> + + + ", '', "class='btn-icon' onclick='deleteFile($file->id)' title='$lang->delete'");?> + +
    • + files[$file->id]);?> + +
      -
      + +
      fetch('file', 'printFiles', array('files' => $doc->files, 'fieldset' => 'false'));?>
      +
      deleted) echo $actionLinks;?>
      - +
      comment;?> id")?>' target='hiddenwin'> @@ -133,7 +130,7 @@
      -
      +
      From 71b62c922c8948bda1af22aa80c12474fcbe9cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 16:09:04 +0800 Subject: [PATCH 052/206] * Finish Task#3554. --- module/story/model.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/story/model.php b/module/story/model.php index d053df7ac9..f6e154ec9c 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -494,6 +494,7 @@ class storyModel extends model if(!dao::isError()) { + $this->setStage($storyID); if($story->product != $oldStory->product) { $this->dao->update(TABLE_PROJECTSTORY)->set('product')->eq($story->product)->where('story')->eq($storyID)->exec(); @@ -615,6 +616,7 @@ class storyModel extends model if(!dao::isError()) { + $this->setStage($storyID); if($story->closedReason == 'done') $this->loadModel('score')->create('story', 'close'); $allChanges[$storyID] = common::createChanges($oldStory, $story); } From 345178901a7d2f086de515190825b7503d65caf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 16:21:56 +0800 Subject: [PATCH 053/206] * Finish Task#3552. --- db/update9.7.sql | 1 + module/story/lang/en.php | 1 + module/story/lang/zh-cn.php | 1 + module/story/model.php | 2 ++ 4 files changed, 5 insertions(+) diff --git a/db/update9.7.sql b/db/update9.7.sql index e69de29bb2..c02990a3b1 100644 --- a/db/update9.7.sql +++ b/db/update9.7.sql @@ -0,0 +1 @@ +ALTER TABLE `zt_story` CHANGE `stage` `stage` ENUM('','wait','planned','projected','developing','developed','testing','tested','verified','released','closed') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'wait'; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index f07f6418ce..66b643ee86 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -114,6 +114,7 @@ $lang->story->stageList['testing'] = 'Testing'; $lang->story->stageList['tested'] = 'Tested'; $lang->story->stageList['verified'] = 'Accepted'; $lang->story->stageList['released'] = 'Released'; +$lang->story->stageList['closed'] = 'Closed'; $lang->story->reasonList[''] = ''; $lang->story->reasonList['done'] = 'Done'; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 3c328f6cae..6734e32f82 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -114,6 +114,7 @@ $lang->story->stageList['testing'] = '测试中'; $lang->story->stageList['tested'] = '测试完毕'; $lang->story->stageList['verified'] = '已验收'; $lang->story->stageList['released'] = '已发布'; +$lang->story->stageList['closed'] = '已关闭'; $lang->story->reasonList[''] = ''; $lang->story->reasonList['done'] = '已完成'; diff --git a/module/story/model.php b/module/story/model.php index f6e154ec9c..265f8beee9 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -803,6 +803,7 @@ class storyModel extends model ->add('assignedTo', 'closed') ->add('assignedDate', $now) ->add('status', 'closed') + ->add('stage', 'closed') ->removeIF($this->post->closedReason != 'duplicate', 'duplicateStory') ->removeIF($this->post->closedReason != 'subdivided', 'childStories') ->setIF($this->post->closedReason == 'done', 'stage', 'released') @@ -848,6 +849,7 @@ class storyModel extends model $story->assignedTo = 'closed'; $story->assignedDate = $now; $story->status = 'closed'; + $story->stage = 'closed'; $story->closedReason = $data->closedReasons[$storyID]; $story->duplicateStory = $data->duplicateStoryIDList[$storyID] ? $data->duplicateStoryIDList[$storyID] : $oldStory->duplicateStory; From 9abd1d6cf3ffd23d0793caa3c80f9bc890439f40 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 29 Dec 2017 17:01:35 +0800 Subject: [PATCH 054/206] * finish task #3588. --- module/action/model.php | 16 ++++++++++++++ module/bug/control.php | 15 +++++++++++++ module/story/control.php | 18 ++++++++++++++- module/task/control.php | 17 ++++++++++++++- module/todo/control.php | 1 + module/todo/js/view.js | 9 ++++++++ module/todo/lang/en.php | 7 +++++- module/todo/lang/zh-cn.php | 7 +++++- module/todo/view/view.html.php | 40 +++++++++++++++++++++++++++++++++- 9 files changed, 125 insertions(+), 5 deletions(-) diff --git a/module/action/model.php b/module/action/model.php index 1907cb753d..52b1243bc6 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -325,6 +325,22 @@ class actionModel extends model } } } + elseif($actionName == 'finished' and $objectType == 'todo') + { + $action->appendLink = ''; + if(strpos($action->extra, ':')!== false) + { + list($extra, $id) = explode(':', $action->extra); + $action->extra = strtolower($extra); + if($id) + { + $table = $this->config->objectTables[$action->extra]; + $field = $this->config->action->objectNameFields[$action->extra]; + $name = $this->dao->select($field)->from($table)->where('id')->eq($id)->fetch($field); + if($name) $action->appendLink = html::a(helper::createLink($action->extra, 'view', "id=$id"), "#$id " . $name); + } + } + } $action->history = isset($histories[$actionID]) ? $histories[$actionID] : array(); $actionName = strtolower($action->action); diff --git a/module/bug/control.php b/module/bug/control.php index 0912d2d749..085655bdec 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -247,6 +247,14 @@ class bug extends control $actionID = $this->action->create('bug', $bugID, 'Opened'); $this->bug->sendmail($bugID, $actionID); + $extras = str_replace(array(',', ' '), array('&', ''), $extras); + parse_str($extras, $output); + if(isset($output['todoID'])) + { + $this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq($output['todoID'])->exec(); + $this->action->create('todo', $output['todoID'], 'finished', '', "BUG:$bugID"); + } + $location = $this->createLink('bug', 'browse', "productID={$this->post->product}&branch=$branch&type=byModule¶m={$this->post->module}"); $response['locate'] = isset($_SESSION['bugList']) ? $this->session->bugList : $location; $this->send($response); @@ -304,6 +312,13 @@ class bug extends control $deadline = $bug->deadline; $color = $bug->color; } + if(isset($todoID)) + { + $todo = $this->loadModel('todo')->getById($todoID); + $title = $todo->name; + $steps = $todo->desc; + $pri = $todo->pri; + } /* If projectID is setted, get builds and stories of this project. */ if($projectID) diff --git a/module/story/control.php b/module/story/control.php index b78433997c..f3ae1cb61a 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -37,10 +37,11 @@ class story extends control * @param int $projectID * @param int $bugID * @param int $planID + * @param int $todoID * @access public * @return void */ - public function create($productID = 0, $branch = 0, $moduleID = 0, $storyID = 0, $projectID = 0, $bugID = 0, $planID = 0) + public function create($productID = 0, $branch = 0, $moduleID = 0, $storyID = 0, $projectID = 0, $bugID = 0, $planID = 0, $todoID = 0) { if(!empty($_POST)) { @@ -75,6 +76,12 @@ class story extends control $actionID = $this->action->create('story', $storyID, $action, '', $extra); $this->story->sendmail($storyID, $actionID); + if($todoID > 0) + { + $this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq($todoID)->exec(); + $this->action->create('todo', $todoID, 'finished', '', "STORY:$storyID"); + } + if($this->post->newStory) { $response['message'] = $this->lang->story->successSaved . $this->lang->story->newStory; @@ -156,6 +163,15 @@ class story extends control } } + if($todoID > 0) + { + $todo = $this->loadModel('todo')->getById($todoID); + $source = 'todo'; + $title = $todo->name; + $spec = $todo->desc; + $pri = $todo->pri; + } + /* Set Custom*/ foreach(explode(',', $this->config->story->list->customCreateFields) as $field) $customFields[$field] = $this->lang->story->$field; $this->view->customFields = $customFields; diff --git a/module/task/control.php b/module/task/control.php index a619af168a..5532939675 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -39,10 +39,11 @@ class task extends control * @param int $storyID * @param int $moduleID * @param int $taskID + * @param int $todoID * @access public * @return void */ - public function create($projectID = 0, $storyID = 0, $moduleID = 0, $taskID = 0) + public function create($projectID = 0, $storyID = 0, $moduleID = 0, $taskID = 0, $todoID = 0) { $task = new stdClass(); $task->module = $moduleID; @@ -63,6 +64,14 @@ class task extends control $projectID = $task->project; } + if($todoID > 0) + { + $todo = $this->loadModel('todo')->getById($todoID); + $task->name = $todo->name; + $task->pri = $todo->pri; + $task->desc = $todo->desc; + } + $project = $this->project->getById($projectID); $taskLink = $this->createLink('project', 'browse', "projectID=$projectID&tab=task"); $storyLink = $this->session->storyList ? $this->session->storyList : $this->createLink('project', 'story', "projectID=$projectID"); @@ -115,6 +124,12 @@ class task extends control $this->send($response); } + if($todoID > 0) + { + $this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq($todoID)->exec(); + $this->action->create('todo', $todoID, 'finished', '', "TASK:$taskID"); + } + /* Locate the browser. */ if($this->post->after == 'continueAdding') { diff --git a/module/todo/control.php b/module/todo/control.php index 580db82dec..8ed528c181 100644 --- a/module/todo/control.php +++ b/module/todo/control.php @@ -279,6 +279,7 @@ class todo extends control $this->view->users = $this->user->getPairs('noletter'); $this->view->actions = $this->loadModel('action')->getList('todo', $todoID); $this->view->from = $from; + $this->view->projects = $this->loadModel('project')->getPairs(); $this->display(); } diff --git a/module/todo/js/view.js b/module/todo/js/view.js index e69de29bb2..c60317fea0 100644 --- a/module/todo/js/view.js +++ b/module/todo/js/view.js @@ -0,0 +1,9 @@ +$(function() +{ + $('#toTaskButton').click(function() + { + var projectID = $(this).closest('.input-group').find('#project').val(); + var link = createLink('task', 'create', 'projectID=' + projectID + '&storyID=0&moduleID=0&taskID=0&todoID=' + todoID); + parent.location.href = link; + }) +}); diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index a15c2185eb..a8bac3c891 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -24,6 +24,11 @@ $lang->todo->import2Today = "Import to Today"; $lang->todo->import = "Import"; $lang->todo->legendBasic = "Basic Info"; +$lang->todo->reasonList['story'] = "Transfer Story"; +$lang->todo->reasonList['task'] = "Transfer Task"; +$lang->todo->reasonList['bug'] = "Transfer Bug"; +$lang->todo->reasonList['done'] = "Done"; + $lang->todo->id = 'ID'; $lang->todo->account = 'Owner'; $lang->todo->date = 'Date'; @@ -83,5 +88,5 @@ $lang->todo->periods['before'] = 'Undone'; $lang->todo->periods['all'] = 'All'; $lang->todo->action = new stdclass(); -$lang->todo->action->finished = array('main' => '$date, is finished by $actor.'); +$lang->todo->action->finished = array('main' => '$date, is $extra by $actor.', 'extra' => 'reasonList'); $lang->todo->action->marked = array('main' => '$date, is marked by $actor as $extra.', 'extra' => 'statusList'); diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index d28c4187f1..793b25e2c9 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -24,6 +24,11 @@ $lang->todo->import2Today = "导入到今天"; $lang->todo->import = "导入"; $lang->todo->legendBasic = "基本信息"; +$lang->todo->reasonList['story'] = "转需求"; +$lang->todo->reasonList['task'] = "转任务"; +$lang->todo->reasonList['bug'] = "转Bug"; +$lang->todo->reasonList['done'] = "完成"; + $lang->todo->id = '编号'; $lang->todo->account = '所有者'; $lang->todo->date = '日期'; @@ -83,5 +88,5 @@ $lang->todo->periods['before'] = '未完'; $lang->todo->periods['all'] = '所有'; $lang->todo->action = new stdclass(); -$lang->todo->action->finished = array('main' => '$date, 由 $actor完成'); +$lang->todo->action->finished = array('main' => '$date, 由 $actor $extra。$appendLink', 'extra' => 'reasonList'); $lang->todo->action->marked = array('main' => '$date, 由 $actor 标记为$extra。', 'extra' => 'statusList'); diff --git a/module/todo/view/view.html.php b/module/todo/view/view.html.php index 5a9138e896..e562341050 100644 --- a/module/todo/view/view.html.php +++ b/module/todo/view/view.html.php @@ -84,7 +84,28 @@ $browseLink = $this->createLink('user', 'todo', "account=$todo->account"); } - common::printIcon('todo', 'finish', "id=$todo->id", $todo, 'button', '', 'hiddenwin', 'showinonlybody btn-success'); + if($todo->status != 'done') + { + echo "
      "; + echo html::a($this->createLink('todo', 'finish', "id=$todo->id", 'html', true), " " . $lang->todo->finish, 'hiddenwin', "class='btn showinonlybody btn-success'"); + $createStoryPriv = common::hasPriv('story', 'create'); + $createTaskPriv = common::hasPriv('task', 'create'); + $createBugPriv = common::hasPriv('bug', 'create'); + if($createStoryPriv or $createTaskPriv or $createBugPriv) + { + $isonlybody = isonlybody(); + unset($_GET['onlybody']); + echo ""; + echo ""; + if($isonlybody) $_GET['onlybody'] = 'yes'; + } + echo "
      "; + } + if($todo->account == $app->user->account) { common::printIcon('todo', 'edit', "todoID=$todo->id"); @@ -94,6 +115,23 @@ ?>
      + +id);?> todo->thisIsPrivate;?> From 0d5b43fb5ccb27e112971784785a4952b4db511d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 29 Dec 2017 17:27:58 +0800 Subject: [PATCH 055/206] * Task#3574 --- module/report/control.php | 62 ++++++++++++++++------------ module/report/js/workload.js | 23 ++++++----- module/report/lang/en.php | 3 ++ module/report/lang/zh-cn.php | 3 ++ module/report/model.php | 7 +++- module/report/view/workload.html.php | 5 ++- 6 files changed, 63 insertions(+), 40 deletions(-) diff --git a/module/report/control.php b/module/report/control.php index 6b08d41115..eeabacfdcb 100644 --- a/module/report/control.php +++ b/module/report/control.php @@ -13,13 +13,13 @@ class report extends control { /** * The index of report, goto project deviation. - * + * * @access public * @return void */ public function index() { - $this->locate(inlink('productSummary')); + $this->locate(inlink('productSummary')); } /** @@ -45,7 +45,7 @@ class report extends control /** * Product information report. - * + * * @access public * @return void */ @@ -65,9 +65,9 @@ class report extends control /** * Bug create report. - * - * @param int $begin - * @param int $end + * + * @param int $begin + * @param int $end * @access public * @return void */ @@ -88,12 +88,12 @@ class report extends control $this->view->project = $project; $this->view->product = $product; $this->view->submenu = 'test'; - $this->display(); + $this->display(); } /** * Bug assign report. - * + * * @access public * @return void */ @@ -104,34 +104,43 @@ class report extends control $this->view->submenu = 'test'; $this->view->assigns = $this->report->getBugAssign(); $this->view->users = $this->loadModel('user')->getPairs('noletter|noclosed|nodeleted'); - $this->display(); + $this->display(); } /** * Workload report. - * + * + * @param string $begin + * @param string $end + * @param int $days + * @param int $workday + * @param int $dept + * @param int $assign + * * @access public * @return void */ - public function workload($begin = '', $end = '', $days = 0, $workday = 0, $dept = 0) + public function workload($begin = '', $end = '', $days = 0, $workday = 0, $dept = 0, $assign = 1) { if($_POST) { - $data = fixer::input('post')->get(); - $begin = $data->begin; - $end = $data->end; - $dept = $data->dept; - $days = $data->days; - $workday = $data->workday; + $data = fixer::input('post')->get(); + $begin = $data->begin; + $end = $data->end; + $dept = $data->dept; + $days = $data->days; + $assign = $data->assign; + $workday = $data->workday; } $this->app->loadConfig('project'); - $begin = $begin ? strtotime($begin) : time(); - $end = $end ? strtotime($end) : time() + (7 * 24 * 3600); - $end += 24 * 3600; + $begin = $begin ? strtotime($begin) : time(); + $end = $end ? strtotime($end) : time() + (7 * 24 * 3600); + $end += 24 * 3600; $beginWeekDay = date('w', $begin); - $begin = date('Y-m-d', $begin); - $end = date('Y-m-d', $end); + $begin = date('Y-m-d', $begin); + $end = date('Y-m-d', $end); + $assign = empty($assign) ? 0 : 1; if(empty($workday))$workday = $this->config->project->defaultWorkhours; $diffDays = helper::diffDate($end, $begin); @@ -150,7 +159,7 @@ class report extends control $this->view->title = $this->lang->report->workload; $this->view->position[] = $this->lang->report->workload; - $this->view->workload = $this->report->getWorkload($dept); + $this->view->workload = $this->report->getWorkload($dept, $assign); $this->view->users = $this->loadModel('user')->getPairs('noletter|noclosed|nodeleted'); $this->view->depts = $this->loadModel('dept')->getOptionMenu(); $this->view->begin = $begin; @@ -158,6 +167,7 @@ class report extends control $this->view->days = $days; $this->view->workday = $workday; $this->view->dept = $dept; + $this->view->assign = $assign; $this->view->allHour = $days * $workday; $this->view->submenu = 'staff'; $this->display(); @@ -165,7 +175,7 @@ class report extends control /** * Send daily reminder mail. - * + * * @access public * @return void */ @@ -176,7 +186,7 @@ class report extends control if($this->config->report->dailyreminder->task) $tasks = $this->report->getUserTasks(); if($this->config->report->dailyreminder->todo) $todos = $this->report->getUserTodos(); if($this->config->report->dailyreminder->testTask) $testTasks = $this->report->getUserTestTasks(); - + $reminder = array(); $users = array_unique(array_merge(array_keys($bugs), array_keys($tasks), array_keys($todos), array_keys($testTasks))); @@ -216,7 +226,7 @@ class report extends control if($oldViewType == 'json') $this->viewType = 'html'; $mailContent = $this->parse('report', 'dailyreminder'); $this->viewType == $oldViewType; - + /* Send email.*/ echo date('Y-m-d H:i:s') . " sending to $user, "; $this->mail->send($user, $mailTitle, $mailContent, '', true); diff --git a/module/report/js/workload.js b/module/report/js/workload.js index 2a2d960b64..2fda97f533 100644 --- a/module/report/js/workload.js +++ b/module/report/js/workload.js @@ -9,6 +9,7 @@ function changeParams(obj) var end = $('.main .row').find('#end').val(); var workday = $('.main .row').find('#workday').val(); var dept = $('.main .row').find('#dept').val(); + var assign = $('.main .row').find('#assign').val(); var days = diffDate(begin, end); $('#days').val(days); @@ -17,23 +18,23 @@ function changeParams(obj) { var beginarray = begin.split("-"); var begin = ''; - for(i=0 ; i < beginarray.length ; i++) begin = begin + beginarray[i]; + for(i=0 ; i < beginarray.length ; i++) begin = begin + beginarray[i]; } if(end.indexOf('-') != -1) { var endarray = end.split("-"); var end = ''; - for(i=0 ; i < endarray.length ; i++) end = end + endarray[i]; + for(i=0 ; i < endarray.length ; i++) end = end + endarray[i]; } - link = createLink('report', 'workload', 'begin=' + begin + '&end=' + end + '&days=' + days + '&workday=' + workday + '&dept=' + dept); + link = createLink('report', 'workload', 'begin=' + begin + '&end=' + end + '&days=' + days + '&workday=' + workday + '&dept=' + dept + '&assign=' + assign); location.href=link; } /** * Convert a date string to date object in js. - * - * @param string $date + * + * @param string $date * @access public * @return date */ @@ -45,9 +46,9 @@ function convertStringToDate(dateString) /** * Compute the diff days of two date. - * - * @param string $date1 - * @param string $date1 + * + * @param string $date1 + * @param string $date1 * @access public * @return int */ @@ -65,12 +66,12 @@ function diffDate(date1, date2) date1 += 1000 * 60 * 60 * 24; date1 = new Date(date1); } - return delta - weekEnds; + return delta - weekEnds; } $(function() { - var options = + var options = { language: config.clientLang, weekStart: 1, @@ -85,4 +86,4 @@ $(function() startDate: new Date() }; $('input#begin,input#end').fixedDate().datetimepicker(options); -}) +}); diff --git a/module/report/lang/en.php b/module/report/lang/en.php index 41855b2346..355388f501 100644 --- a/module/report/lang/en.php +++ b/module/report/lang/en.php @@ -31,6 +31,9 @@ $lang->report->colors[] = '008ED6'; $lang->report->colors[] = '9D080D'; $lang->report->colors[] = 'A186BE'; +$lang->report->isAssign[0] = 'Not assigned'; +$lang->report->isAssign[1] = 'Assigned'; + $lang->report->singleColor[] = 'F6BD0F'; $lang->report->projectDeviation = $lang->projectCommon . ' Deviation'; diff --git a/module/report/lang/zh-cn.php b/module/report/lang/zh-cn.php index 0965b08343..91b5ad9bc2 100644 --- a/module/report/lang/zh-cn.php +++ b/module/report/lang/zh-cn.php @@ -31,6 +31,9 @@ $lang->report->colors[] = '008ED6'; $lang->report->colors[] = '9D080D'; $lang->report->colors[] = 'A186BE'; +$lang->report->isAssign[0] = '未指派'; +$lang->report->isAssign[1] = '已指派'; + $lang->report->singleColor[] = 'F6BD0F'; $lang->report->projectDeviation = $lang->projectCommon . '偏差报表'; diff --git a/module/report/model.php b/module/report/model.php index 60be384fea..f043ae8c2e 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -238,10 +238,13 @@ class reportModel extends model /** * Get workload. * + * @param int $dept + * @param int $assign + * * @access public * @return array */ - public function getWorkload($dept = 0) + public function getWorkload($dept = 0, $assign = 1) { $depts = array(); if($dept) $depts = $this->loadModel('dept')->getAllChildId($dept); @@ -265,7 +268,7 @@ class reportModel extends model $workload[$user]['task'][$task->projectName]['count'] = isset($workload[$user]['task'][$task->projectName]['count']) ? $workload[$user]['task'][$task->projectName]['count'] + 1 : 1; $workload[$user]['task'][$task->projectName]['manhour'] = isset($workload[$user]['task'][$task->projectName]['manhour']) ? $workload[$user]['task'][$task->projectName]['manhour'] + $task->left : $task->left; $workload[$user]['task'][$task->projectName]['projectID'] = $task->project; - $workload[$user]['total']['count'] = isset($workload[$user]['total']['count']) ? $workload[$user]['total']['count'] + 1 : 1; + $workload[$user]['total']['count'] = isset($workload[$user]['total']['count']) ? $workload[$user]['total']['count'] + 1 : 1; if($task->parent == 0) $workload[$user]['total']['manhour'] = isset($workload[$user]['total']['manhour']) ? $workload[$user]['total']['manhour'] + $task->left : $task->left; } } diff --git a/module/report/view/workload.html.php b/module/report/view/workload.html.php index 87e8a599d8..96f711b686 100644 --- a/module/report/view/workload.html.php +++ b/module/report/view/workload.html.php @@ -17,7 +17,7 @@
      -
      +
      report->dept;?> @@ -43,6 +43,9 @@
      +
      + report->isAssign, $assign, "class='form-control' onchange='changeParams(this)'");?> +
      report->query);?>
      From 0ec4afb68b6f7308ef8baa176739f420c9de59e7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 2 Jan 2018 08:55:33 +0800 Subject: [PATCH 056/206] * finish task #3558. --- config/config.php | 10 +++++++--- module/install/view/step3.html.php | 10 ++++++---- www/upgrade.php.tmp | 22 +++++++++++++++++----- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/config/config.php b/config/config.php index 00d3117e93..5cb5e74efa 100644 --- a/config/config.php +++ b/config/config.php @@ -111,9 +111,9 @@ $config->file->allowed = 'txt,doc,docx,dot,wps,wri,pdf,ppt,pptx,xls,xlsx,ett,xlt $filterConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'filter.php'; if(file_exists($filterConfig)) include $filterConfig; -/* 引用自定义的配置。 Include the custom config file. */ -$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php'; -if(file_exists($myConfig)) include $myConfig; +/* 引用数据库的配置。 Include the database config file. */ +$dbConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'db.php'; +if(file_exists($dbConfig)) include $dbConfig; /* 禅道配置文件。zentaopms settings. */ $zentaopmsConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'zentaopms.php'; @@ -122,3 +122,7 @@ if(file_exists($zentaopmsConfig)) include $zentaopmsConfig; /* Include extension config files. */ $extConfigFiles = glob(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ext/*.php'); if($extConfigFiles) foreach($extConfigFiles as $extConfigFile) include $extConfigFile; + +/* 引用自定义的配置。 Include the custom config file. */ +$myConfig = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my.php'; +if(file_exists($myConfig)) include $myConfig; diff --git a/module/install/view/step3.html.php b/module/install/view/step3.html.php index d475a1ed9f..3b0573bf9c 100644 --- a/module/install/view/step3.html.php +++ b/module/install/view/step3.html.php @@ -55,21 +55,23 @@ EOT;
      app->getConfigRoot(); + $dbConfigFile = $configRoot . 'db.php'; $myConfigFile = $configRoot . 'my.php'; if(is_writable($configRoot)) { - if(@file_put_contents($myConfigFile, $configContent)) + if(@file_put_contents($dbConfigFile, $configContent)) { - printf($lang->install->saved2File, $myConfigFile); + printf($lang->install->saved2File, $dbConfigFile); } else { - printf($lang->install->save2File, $this->app->getConfigRoot() . 'my.php'); + printf($lang->install->save2File, $dbConfigFile); } + @file_put_contents($myConfigFile, "install->save2File, $this->app->getConfigRoot() . 'my.php'); + printf($lang->install->save2File, $dbConfigFile); } ?>
      diff --git a/www/upgrade.php.tmp b/www/upgrade.php.tmp index e06df6eab8..102fa22b3f 100644 --- a/www/upgrade.php.tmp +++ b/www/upgrade.php.tmp @@ -11,12 +11,24 @@ */ /* Judge my.php exists or not. */ define('IN_UPGRADE', true); -$myConfig = dirname(dirname(__FILE__)) . '/config/my.php'; -if(!file_exists($myConfig)) +$dbConfig = dirname(dirname(__FILE__)) . '/config/db.php'; +if(!file_exists($dbConfig)) { - echo "文件" . $myConfig . "不存在! 提示:不要重命名原来的禅道安装目录,下载最新的源码包,覆盖即可。" . "
      "; - echo $myConfig . " doesn't exists! Please don't rename zentao before overriding the source code!"; - exit; + $myConfig = dirname(dirname(__FILE__)) . '/config/my.php'; + if(!file_exists($myConfig)) + { + echo "文件" . $dbConfig . "不存在! 提示:不要重命名原来的禅道安装目录,下载最新的源码包,覆盖即可。" . "
      "; + echo $dbConfig . " doesn't exists! Please don't rename zentao before overriding the source code!"; + exit; + } + if(!@rename($myConfig, $dbConfig)) + { + $configDir = dirname(dirname(__FILE__)) . '/config/'; + echo "请执行命令 chmod 777 $configDir 来修改权限,保证禅道在该目录有操作文件权限" . "
      "; + echo "Please execute the command 'chmod 777 $configDir' to modify the permissions to ensure that the ZenTao has operating file permissions in this directory"; + exit; + } + file_put_contents($myConfig, " Date: Tue, 2 Jan 2018 10:07:45 +0800 Subject: [PATCH 057/206] * Add db.php for .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b90aa51640..3ef6b26261 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +config/db.php config/my.php www/data/ www/install.php From 8c776b66075d465adecd04589a29342637497957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 2 Jan 2018 17:20:21 +0800 Subject: [PATCH 058/206] * Fix bug. --- module/common/view/header.lite.html.php | 2 +- module/upgrade/model.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module/common/view/header.lite.html.php b/module/common/view/header.lite.html.php index f7773c6115..d78a690368 100755 --- a/module/common/view/header.lite.html.php +++ b/module/common/view/header.lite.html.php @@ -12,7 +12,7 @@ $clientTheme = $this->app->getClientTheme(); - + zentaoPMS); diff --git a/module/upgrade/model.php b/module/upgrade/model.php index e5e0fb7f5d..d2db3077ec 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -1979,11 +1979,11 @@ class upgradeModel extends model */ public function changeTeamFields() { - $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " DROP PRIMARY KEY"); - $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'"); - $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`"); - $this->dao->exec("UPDATE " . TABLE_TEAM . " SET `root` = `task`, `type` = 'task' WHERE `task` > '0'"); - $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " DROP `task`"); + $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "`` DROP PRIMARY KEY"); + $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'"); + $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`"); + $this->dao->exec("UPDATE `" . TABLE_TEAM . "` SET `root` = `task`, `type` = 'task' WHERE `task` > '0'"); + $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` DROP `task`"); return true; } } From 86a3b53329772f7733789b79595b5b01e70e4f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 2 Jan 2018 17:21:42 +0800 Subject: [PATCH 059/206] * Fix bug. --- module/upgrade/model.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/upgrade/model.php b/module/upgrade/model.php index d2db3077ec..28bb16b4e2 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -1979,7 +1979,7 @@ class upgradeModel extends model */ public function changeTeamFields() { - $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "`` DROP PRIMARY KEY"); + $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` DROP PRIMARY KEY"); $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'"); $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`"); $this->dao->exec("UPDATE `" . TABLE_TEAM . "` SET `root` = `task`, `type` = 'task' WHERE `task` > '0'"); From fad9e34e8d188f144c1be1876046cc1b143951b7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 3 Jan 2018 16:40:27 +0800 Subject: [PATCH 060/206] * finish task #3585. --- db/update9.7.sql | 4 + db/zentao.sql | 3 +- module/install/lang/en.php | 1 + module/install/lang/zh-cn.php | 1 + module/my/view/todo.html.php | 4 +- module/todo/config.php | 4 +- module/todo/control.php | 14 +++ module/todo/js/create.js | 23 +++++ module/todo/js/view.js | 6 ++ module/todo/lang/en.php | 13 +++ module/todo/lang/zh-cn.php | 13 +++ module/todo/model.php | 132 +++++++++++++++++++++++++++- module/todo/view/batchedit.html.php | 18 ++-- module/todo/view/create.html.php | 44 ++++++++++ module/todo/view/edit.html.php | 48 ++++++++++ module/todo/view/view.html.php | 38 +++++++- module/user/model.php | 4 + 17 files changed, 352 insertions(+), 18 deletions(-) diff --git a/db/update9.7.sql b/db/update9.7.sql index c02990a3b1..fc4d315116 100644 --- a/db/update9.7.sql +++ b/db/update9.7.sql @@ -1 +1,5 @@ ALTER TABLE `zt_story` CHANGE `stage` `stage` ENUM('','wait','planned','projected','developing','developed','testing','tested','verified','released','closed') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'wait'; +ALTER TABLE `zt_todo` ADD `config` varchar(255) NOT NULL; +ALTER TABLE `zt_todo` ADD `cycle` tinyint unsigned NOT NULL DEFAULT '0' AFTER `type`; +INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES +('1', '1', '*', '*', '*', 'moduleName=todo&methodName=createCycle', '生成周期性待办', 'zentao', 1, 'normal', '0000-00-00 00:00:00'); diff --git a/db/zentao.sql b/db/zentao.sql index 8074392b9b..93970e4650 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -902,7 +902,8 @@ INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type ('30', '0', '*', '*', '*', 'moduleName=backup&methodName=backup', '备份数据和附件', 'zentao', 1, 'normal', '0000-00-00 00:00:00'), ('*/5', '*', '*', '*', '*', 'moduleName=mail&methodName=asyncSend', '异步发信', 'zentao', 1, 'normal', '0000-00-00 00:00:00'), ('*/5', '*', '*', '*', '*', 'moduleName=webhook&methodName=asyncSend', '异步发送Webhook', 'zentao', 1, 'normal', '0000-00-00 00:00:00'), -('*/5', '*', '*', '*', '*', 'moduleName=admin&methodName=deleteLog', '删除过期日志', 'zentao', 1, 'normal', '0000-00-00 00:00:00'); +('*/5', '*', '*', '*', '*', 'moduleName=admin&methodName=deleteLog', '删除过期日志', 'zentao', 1, 'normal', '0000-00-00 00:00:00'), +('1', '1', '*', '*', '*', 'moduleName=todo&methodName=createCycle', '生成周期性待办', 'zentao', 1, 'normal', '0000-00-00 00:00:00'); INSERT INTO `zt_group` (`id`, `name`, `role`, `desc`) VALUES (1, 'ADMIN', 'admin', 'for administrator'), diff --git a/module/install/lang/en.php b/module/install/lang/en.php index 7cb06c43f4..339345f73c 100644 --- a/module/install/lang/en.php +++ b/module/install/lang/en.php @@ -158,6 +158,7 @@ $lang->install->cronList['moduleName=backup&methodName=backup'] = 'Backup' $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Asynchronous sending'; $lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Asynchronous seding Webhook'; $lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Delete overdue log'; +$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Create cycle todos.'; $lang->install->success = "Installed!"; $lang->install->login = 'Login ZenTao'; diff --git a/module/install/lang/zh-cn.php b/module/install/lang/zh-cn.php index c2383fd9b9..5a0ce60726 100644 --- a/module/install/lang/zh-cn.php +++ b/module/install/lang/zh-cn.php @@ -158,6 +158,7 @@ $lang->install->cronList['moduleName=backup&methodName=backup'] = '备份 $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = '异步发信'; $lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = '异步发送Webhook'; $lang->install->cronList['moduleName=admin&methodName=deleteLog'] = '删除过期日志'; +$lang->install->cronList['moduleName=todo&methodName=createCycle'] = '生成周期性待办'; $lang->install->success = "安装成功"; $lang->install->login = '登录禅道管理系统'; diff --git a/module/my/view/todo.html.php b/module/my/view/todo.html.php index 96cd9268b8..4c593ec68b 100644 --- a/module/my/view/todo.html.php +++ b/module/my/view/todo.html.php @@ -64,7 +64,7 @@ - + id; ?> @@ -95,6 +95,7 @@ +
      + show();?> diff --git a/module/todo/config.php b/module/todo/config.php index 6ee664628b..af20d428df 100644 --- a/module/todo/config.php +++ b/module/todo/config.php @@ -20,8 +20,8 @@ $config->todo->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools'); $config->todo->list = new stdclass(); $config->todo->list->exportFields = 'id, account, date, begin, end, type, idvalue, pri, name, desc, status, private'; $config->todo->list->customBatchCreateFields = 'type,pri,desc,beginAndEnd'; -$config->todo->list->customBatchEditFields = 'type,pri,desc,beginAndEnd,status'; +$config->todo->list->customBatchEditFields = 'pri,desc,beginAndEnd,status'; $config->todo->custom = new stdclass(); $config->todo->custom->batchCreateFields = 'type,pri,desc,beginAndEnd'; -$config->todo->custom->batchEditFields = 'type,pri,beginAndEnd,status'; +$config->todo->custom->batchEditFields = 'pri,beginAndEnd,status'; diff --git a/module/todo/control.php b/module/todo/control.php index 8ed528c181..65b888a473 100644 --- a/module/todo/control.php +++ b/module/todo/control.php @@ -57,6 +57,7 @@ class todo extends control die(js::locate($this->createLink('my', 'todo', "type=$date"), 'parent')); } + unset($this->lang->todo->typeList['cycle']); $this->view->title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->create; $this->view->position[] = $this->lang->todo->common; $this->view->position[] = $this->lang->todo->create; @@ -96,6 +97,7 @@ class todo extends control } /* Set Custom*/ + unset($this->lang->todo->typeList['cycle']); foreach(explode(',', $this->config->todo->list->customBatchCreateFields) as $field) $customFields[$field] = $this->lang->todo->$field; $this->view->customFields = $customFields; $this->view->showFields = $this->config->todo->custom->batchCreateFields; @@ -454,4 +456,16 @@ class todo extends control $this->view->actions = $this->loadModel('action')->getList('todo', $todoID); $this->display(); } + + /** + * Create cycle. + * + * @access public + * @return void + */ + public function createCycle() + { + $todoList = $this->dao->select('*')->from(TABLE_TODO)->where('cycle')->eq(1)->fetchAll('id'); + $this->todo->createByCycle($todoList); + } } diff --git a/module/todo/js/create.js b/module/todo/js/create.js index 2f6cadec2b..5022d01b81 100644 --- a/module/todo/js/create.js +++ b/module/todo/js/create.js @@ -7,4 +7,27 @@ $(function() $('#begin').val(selectTime); selectNext(); }) + + $('#cycle').change(function() + { + if($(this).prop('checked')) + { + $('.cycleConfig').removeClass('hidden'); + $('#switchDate').closest('.input-group-addon').addClass('hidden'); + $('#type').find('option').each(function() + { + if($(this).val() != 'custom') $(this).addClass('hidden'); + }) + } + else + { + $('.cycleConfig').addClass('hidden'); + $('#switchDate').closest('.input-group-addon').removeClass('hidden'); + $('#type').find('option').removeClass('hidden'); + } + }); + $('ul.nav-tabs a').click(function() + { + if($(this).data('type'))$('input[id*=type][id*=config]').val($(this).data('type')); + }); }) diff --git a/module/todo/js/view.js b/module/todo/js/view.js index c60317fea0..d770f94475 100644 --- a/module/todo/js/view.js +++ b/module/todo/js/view.js @@ -2,8 +2,14 @@ $(function() { $('#toTaskButton').click(function() { + var onlybody = config.onlybody; + config.onlybody = 'no'; + var projectID = $(this).closest('.input-group').find('#project').val(); var link = createLink('task', 'create', 'projectID=' + projectID + '&storyID=0&moduleID=0&taskID=0&todoID=' + todoID); + + config.onlybody = onlybody; parent.location.href = link; + }) }); diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index a8bac3c891..563dee71c2 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -23,6 +23,8 @@ $lang->todo->delete = "Delete"; $lang->todo->import2Today = "Import to Today"; $lang->todo->import = "Import"; $lang->todo->legendBasic = "Basic Info"; +$lang->todo->cycle = "Cycle"; +$lang->todo->cycleConfig = "Cycle Config"; $lang->todo->reasonList['story'] = "Transfer Story"; $lang->todo->reasonList['task'] = "Transfer Task"; @@ -44,6 +46,14 @@ $lang->todo->name = 'Name'; $lang->todo->status = 'Status'; $lang->todo->desc = 'Description'; $lang->todo->private = 'Private'; +$lang->todo->cycleDay = 'Day'; +$lang->todo->cycleWeek = 'Week'; +$lang->todo->cycleMonth = 'Month'; +$lang->todo->deadline = 'Deadline'; + +$lang->todo->every = 'Every'; +$lang->todo->beforeDays = "%searly in advance to be done"; +$lang->todo->dayNames = array(1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 0 => 'Sunday'); $lang->todo->confirmBug = 'This To-Do is related to Bug #%s. Do you want to edit it?'; $lang->todo->confirmTask = 'This To-Do is related to Task #%s,Do you want to edit it?'; @@ -62,6 +72,7 @@ $lang->todo->priList[4] = '4'; $lang->todo->priList[0] = ''; $lang->todo->typeList['custom'] = 'Custom'; +$lang->todo->typeList['cycle'] = 'Cycle'; $lang->todo->typeList['bug'] = 'Bug'; $lang->todo->typeList['task'] = $lang->projectCommon . 'Task'; $lang->todo->typeList['story'] = $lang->projectCommon . 'Story'; @@ -73,6 +84,7 @@ if($config->global->flow == 'onlyTask' or $config->global->flow == 'onlyStory') $lang->todo->confirmDelete = "Are you sure to delete this To-Do?"; $lang->todo->thisIsPrivate = 'This is a private To-Do:)'; $lang->todo->lblDisableDate = 'Set later.'; +$lang->todo->lblBeforeDays = "%s early in advance to be done"; $lang->todo->noTodo = 'No this type of to-dos.'; $lang->todo->periods['today'] = 'Today'; @@ -86,6 +98,7 @@ $lang->todo->periods['thisYear'] = 'This Year'; $lang->todo->periods['future'] = 'Pending'; $lang->todo->periods['before'] = 'Undone'; $lang->todo->periods['all'] = 'All'; +$lang->todo->periods['cycle'] = 'Cycle'; $lang->todo->action = new stdclass(); $lang->todo->action->finished = array('main' => '$date, is $extra by $actor.', 'extra' => 'reasonList'); diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index 793b25e2c9..5202990c6c 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -23,6 +23,8 @@ $lang->todo->delete = "删除待办"; $lang->todo->import2Today = "导入到今天"; $lang->todo->import = "导入"; $lang->todo->legendBasic = "基本信息"; +$lang->todo->cycle = "周期"; +$lang->todo->cycleConfig = "周期设置"; $lang->todo->reasonList['story'] = "转需求"; $lang->todo->reasonList['task'] = "转任务"; @@ -44,6 +46,14 @@ $lang->todo->name = '名称'; $lang->todo->status = '状态'; $lang->todo->desc = '描述'; $lang->todo->private = '私人事务'; +$lang->todo->cycleDay = '天'; +$lang->todo->cycleWeek = '周'; +$lang->todo->cycleMonth = '月'; +$lang->todo->deadline = '过期时间'; + +$lang->todo->every = '间隔'; +$lang->todo->beforeDays = "提前%s天生成待办"; +$lang->todo->dayNames = array(1 => '星期一', 2 => '星期二', 3 => '星期三', 4 => '星期四', 5 => '星期五', 6 => '星期六', 0 => '星期日'); $lang->todo->confirmBug = '该Todo关联的是Bug #%s,需要修改它吗?'; $lang->todo->confirmTask = '该Todo关联的是Task #%s,需要修改它吗?'; @@ -62,6 +72,7 @@ $lang->todo->priList[4] = '最低'; $lang->todo->priList[0] = ''; $lang->todo->typeList['custom'] = '自定义'; +$lang->todo->typeList['cycle'] = '周期'; $lang->todo->typeList['bug'] = 'Bug'; $lang->todo->typeList['task'] = $lang->projectCommon . '任务'; $lang->todo->typeList['story'] = $lang->projectCommon . '需求'; @@ -73,6 +84,7 @@ if($config->global->flow == 'onlyTask' or $config->global->flow == 'onlyStory') $lang->todo->confirmDelete = "您确定要删除这条待办吗?"; $lang->todo->thisIsPrivate = '这是一条私人事务。:)'; $lang->todo->lblDisableDate = '暂时不设定时间'; +$lang->todo->lblBeforeDays = "提前%s天生成待办"; $lang->todo->noTodo = '该类型没有待办事务'; $lang->todo->periods['today'] = '今日'; @@ -86,6 +98,7 @@ $lang->todo->periods['thisYear'] = '本年'; $lang->todo->periods['future'] = '待定'; $lang->todo->periods['before'] = '未完'; $lang->todo->periods['all'] = '所有'; +$lang->todo->periods['cycle'] = '周期'; $lang->todo->action = new stdclass(); $lang->todo->action->finished = array('main' => '$date, 由 $actor $extra。$appendLink', 'extra' => 'reasonList'); diff --git a/module/todo/model.php b/module/todo/model.php index 94b19c55a3..080d476e36 100644 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -36,6 +36,29 @@ class todoModel extends model ->stripTags($this->config->todo->editor->create['id'], $this->config->allowedTags) ->remove('bug, task, uid') ->get(); + if(empty($todo->cycle)) unset($todo->config); + if(!empty($todo->cycle)) + { + $todo->config['begin'] = $todo->date; + if($todo->config['type'] == 'day') + { + unset($todo->config['week']); + unset($todo->config['month']); + } + if($todo->config['type'] == 'week') + { + unset($todo->config['day']); + unset($todo->config['month']); + $todo->config['week'] = join(',', $todo->config['week']); + } + if($todo->config['type'] == 'month') + { + unset($todo->config['day']); + unset($todo->config['week']); + $todo->config['month'] = join(',', $todo->config['month']); + } + $todo->config = json_encode($todo->config); + } $todo = $this->loadModel('file')->processImgURL($todo, $this->config->todo->editor->create['id'], $this->post->uid); $this->dao->insert(TABLE_TODO)->data($todo) @@ -51,6 +74,7 @@ class todoModel extends model $todoID = $this->dao->lastInsertID(); $this->file->updateObjectID($this->post->uid, $todoID, 'todo'); $this->loadModel('score')->create('todo', 'create', $todoID); + if(!empty($todo->cycle)) $this->createByCycle(array($todoID => $todo)); return $todoID; } } @@ -126,6 +150,7 @@ class todoModel extends model if(in_array($oldTodo->type, array('bug', 'task', 'story'))) $oldTodo->name = ''; $todo = fixer::input('post') ->cleanInt('date, pri, begin, end, private') + ->add('account', $oldTodo->account) ->setIF(in_array($oldTodo->type, array('bug', 'task', 'story')), 'name', '') ->setIF($this->post->date == false, 'date', '2030-01-01') ->setIF($this->post->begin == false, 'begin', '2400') @@ -134,6 +159,28 @@ class todoModel extends model ->stripTags($this->config->todo->editor->edit['id'], $this->config->allowedTags) ->remove('uid') ->get(); + if(!empty($oldTodo->cycle)) + { + $todo->config['begin'] = $todo->date; + if($todo->config['type'] == 'day') + { + unset($todo->config['week']); + unset($todo->config['month']); + } + if($todo->config['type'] == 'week') + { + unset($todo->config['day']); + unset($todo->config['month']); + $todo->config['week'] = join(',', $todo->config['week']); + } + if($todo->config['type'] == 'month') + { + unset($todo->config['day']); + unset($todo->config['week']); + $todo->config['month'] = join(',', $todo->config['month']); + } + $todo->config = json_encode($todo->config); + } $todo = $this->loadModel('file')->processImgURL($todo, $this->config->todo->editor->edit['id'], $this->post->uid); $this->dao->update(TABLE_TODO)->data($todo) @@ -144,6 +191,7 @@ class todoModel extends model if(!dao::isError()) { $this->file->updateObjectID($this->post->uid, $todoID, 'todo'); + if(!empty($oldTodo->cycle)) $this->createByCycle(array($todoID => $todo)); return common::createChanges($oldTodo, $todo); } } @@ -310,6 +358,10 @@ class todoModel extends model $begin = '1970-01-01'; $end = date::yesterday(); } + elseif($date == 'cycle') + { + $begin = $end = ''; + } else { $begin = $end = $date; @@ -319,10 +371,12 @@ class todoModel extends model $stmt = $this->dao->select('*')->from(TABLE_TODO) ->where('account')->eq($account) - ->andWhere('date')->ge($begin) - ->andWhere('date')->le($end) + ->beginIF($begin)->andWhere('date')->ge($begin)->fi() + ->beginIF($end)->andWhere('date')->le($end)->fi() ->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi() ->beginIF($status == 'undone')->andWhere('status')->ne('done')->fi() + ->beginIF($date == 'cycle')->andWhere('cycle')->eq('1')->fi() + ->beginIF($date != 'cycle')->andWhere('cycle')->eq('0')->fi() ->orderBy($orderBy) ->beginIF($limit > 0)->limit($limit)->fi() ->page($pager) @@ -365,8 +419,80 @@ class todoModel extends model { $action = strtolower($action); - if($action == 'finish') return $todo->status != 'done'; + if($action == 'finish') + { + if(!empty($todo->cycle)) return false; + return $todo->status != 'done'; + } return true; } + + /** + * CreateByCycle + * + * @param int $todoList + * @access public + * @return void + */ + public function createByCycle($todoList) + { + $this->loadModel('action'); + $lastCycleList = $this->dao->select('*')->from(TABLE_TODO)->where('type')->eq('cycle')->andWhere('idvalue')->in(array_keys($todoList))->orderBy('date_asc')->fetchAll('idvalue'); + foreach($todoList as $todoID => $todo) + { + $todo->config = json_decode($todo->config); + if(!empty($todo->config->end) and time() > strtotime($todo->config->end)) continue; + $lastCycle = zget($lastCycleList, $todoID, ''); + $time = time(); + for($i = 0; $i <= $todo->config->beforeDays; $i++) + { + $newDate = ''; + $newTodo = new stdclass(); + $newTodo->account = $todo->account; + $newTodo->begin = $todo->begin; + $newTodo->end = $todo->end; + $newTodo->type = 'cycle'; + $newTodo->idvalue = $todoID; + $newTodo->pri = $todo->pri; + $newTodo->name = $todo->name; + $newTodo->desc = $todo->desc; + $newTodo->status = 'wait'; + $newTodo->private = $todo->private; + + $date = date('Y-m-d', $time + $i * 24 * 3600); + if($todo->config->type == 'day') + { + if(empty($lastCycle)) $newDate = date('Y-m-d', $time + ($todo->config->day - 1) * 24 * 3600); + if(!empty($lastCycle->date)) $newDate = date('Y-m-d', strtotime($lastCycle->date) + $todo->config->day * 24 * 3600); + } + elseif($todo->config->type == 'week') + { + $week = date('w', strtotime($date)); + if(strpos(",{$todo->config->week},", ",{$week},") !== false) + { + if(empty($lastCycle)) $newDate = $date; + if($lastCycle->date < $date) $newDate = $date; + } + } + elseif($todo->config->type == 'month') + { + $day = date('j', strtotime($date)); + if(strpos(",{$todo->config->month},", ",{$day},") !== false) + { + if(empty($lastCycle)) $newDate = $date; + if($lastCycle->date < $date) $newDate = $date; + } + } + + if($date == $newDate) + { + $newTodo->date = $newDate; + $this->dao->insert(TABLE_TODO)->data($newTodo)->exec(); + $this->action->create('todo', $this->dao->lastInsertID(), 'opened'); + $lastCycleList[$todo->id] = $newTodo; + } + } + } + } } diff --git a/module/todo/view/batchedit.html.php b/module/todo/view/batchedit.html.php index cae87e63ca..4c110d1d25 100644 --- a/module/todo/view/batchedit.html.php +++ b/module/todo/view/batchedit.html.php @@ -38,12 +38,12 @@ $columns = count($visibleFields) + 3; idAB;?> todo->date;?> - '> todo->type;?> - '> todo->pri;?> + todo->type;?> + '> todo->pri;?> todo->name;?> >todo->desc;?> '>todo->beginAndEnd;?> - '> todo->status;?> + '> todo->status;?> @@ -51,13 +51,13 @@ $columns = count($visibleFields) + 3; id . html::hidden("todoIDList[$todo->id]", $todo->id);?> id]", $todo->date, "class='form-control form-date'");?> - >id]", $lang->todo->typeList, $todo->type, "onchange=loadList(this.value,$todo->id) class='form-control'");?> - >id]", $lang->todo->priList, $todo->pri, 'class=form-control');?> + todo->typeList, $todo->type);?> + >id]", $lang->todo->priList, $todo->pri, "class='form-control chosen'");?>
      type == 'custom') + if($todo->type == 'custom' or $todo->type == 'cycle') { echo html::input("names[$todo->id]", $todo->name, "class='form-control' autocomplete='off'"); ; } @@ -73,12 +73,12 @@ $columns = count($visibleFields) + 3;
      >id]", $todo->descs, "rows='1' class='form-control'");?> - > + style='overflow:visible'>
      - id]", $times, $todo->begin, 'class="form-control" style="width: 50%"') . html::select("ends[$todo->id]", $times, $todo->end, 'class="form-control" style="width: 50%"');?> + id]", $times, $todo->begin, 'class="form-control chosen" style="width: 50%"') . html::select("ends[$todo->id]", $times, $todo->end, 'class="form-control chosen" style="width: 50%"');?>
      - >id]", $lang->todo->statusList, $todo->status, "class='form-control'");?> + style='overflow:visible'>id]", $lang->todo->statusList, $todo->status, "class='form-control chosen'");?> diff --git a/module/todo/view/create.html.php b/module/todo/view/create.html.php index a0d281b24a..d1b1990e24 100644 --- a/module/todo/view/create.html.php +++ b/module/todo/view/create.html.php @@ -29,9 +29,53 @@
      todo->periods['future'];?> + todo->cycle;?>
      + + todo->cycleConfig;?> + + +
      +
      +
      + todo->every;?> + + todo->cycleDay;?> +
      +
      +
      + todo->dayNames)?> +
      +
      + " . html::checkbox('config[month]', $days) . '

      '; + $days = array(); + for($i = 11; $i <= 20; $i ++) $days[$i] = $i; + echo "

      " . html::checkbox('config[month]', $days) . '

      '; + $days = array(); + for($i = 21; $i <= 31; $i ++) $days[$i] = $i; + echo "

      " . html::checkbox('config[month]', $days) . '

      '; + ?> +
      +
      + +
      + todo->beforeDays, html::input('config[beforeDays]', 0, "class='form-control'"));?> +
      + + + + todo->deadline;?> + + todo->type;?> todo->typeList, '', 'onchange=loadList(this.value); class=form-control');?> diff --git a/module/todo/view/edit.html.php b/module/todo/view/edit.html.php index 6d6a0dc8e4..502f296b44 100644 --- a/module/todo/view/edit.html.php +++ b/module/todo/view/edit.html.php @@ -29,10 +29,58 @@
      date, "class='form-control form-date'");?> + cycle)):?> todo->periods['future'];?> +
      + cycle):?> + config = json_decode($todo->config);?> + + todo->cycleConfig;?> + + +
      +
      +
      + todo->every;?> + config->day) ? $todo->config->day : 1, "class='form-control'")?> + todo->cycleDay;?> +
      +
      +
      + todo->dayNames, isset($todo->config->week) ? $todo->config->week : '')?> +
      +
      + " . html::checkbox('config[month]', $days, isset($todo->config->month) ? $todo->config->month : '') . '

      '; + $days = array(); + for($i = 11; $i <= 20; $i ++) $days[$i] = $i; + echo "

      " . html::checkbox('config[month]', $days, isset($todo->config->month) ? $todo->config->month : '') . '

      '; + $days = array(); + for($i = 21; $i <= 31; $i ++) $days[$i] = $i; + echo "

      " . html::checkbox('config[month]', $days, isset($todo->config->month) ? $todo->config->month : '') . '

      '; + ?> +
      +
      + config->type)?> +
      + todo->beforeDays, html::input('config[beforeDays]', $todo->config->beforeDays, "class='form-control'"));?> +
      + + + + todo->deadline;?> + config->end, "class='form-control form-date'");?> + + todo->type;?> todo->typeList[$todo->type];?> diff --git a/module/todo/view/view.html.php b/module/todo/view/view.html.php index e562341050..8269a3486f 100644 --- a/module/todo/view/view.html.php +++ b/module/todo/view/view.html.php @@ -39,7 +39,7 @@
      - todo->legendBasic;?> + todo->legendBasic;?> @@ -66,6 +66,40 @@
      todo->pri;?>begin])) echo $times[$todo->begin]; if(isset($times[$todo->end])) echo ' ~ ' . $times[$todo->end];?>
      +
      + cycle):?> + config = json_decode($todo->config);?> +
      + todo->cycle;?> + + + + + + + + + +
      todo->beginAndEnd?>config->begin . " ~ " . $todo->config->end;?>
      todo->cycleConfig?> + config->type == 'day') + { + echo $lang->todo->every . $todo->config->day . $lang->day; + } + elseif($todo->config->type == 'week') + { + foreach(explode(',', $todo->config->week) as $week) echo $lang->todo->dayNames[$week] . ' '; + } + elseif($todo->config->type == 'month') + { + foreach(explode(',', $todo->config->month) as $month) echo $month . ' '; + } + echo '
      '; + if($todo->config->beforeDays) printf($lang->todo->lblBeforeDays, $todo->config->beforeDays); + ?> +
      +
      +
      @@ -125,7 +159,7 @@
      diff --git a/module/user/model.php b/module/user/model.php index c73afbc37b..7407be94cf 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -657,6 +657,10 @@ class userModel extends model } $this->dao->update(TABLE_USER)->set('visits = visits + 1')->set('ip')->eq($ip)->set('last')->eq($last)->where('account')->eq($account)->exec(); + + /* Create cycle todo in login. */ + $todoList = $this->dao->select('*')->from(TABLE_TODO)->where('cycle')->eq(1)->andWhere('account')->eq($user->account)->fetchAll('id'); + $this->loadModel('todo')->createByCycle($todoList); } return $user; } From 88653f881fa56c2a1e770d7cbaf6c167e77bff60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 3 Jan 2018 21:14:05 +0800 Subject: [PATCH 061/206] * Finish task#3574 --- module/report/model.php | 34 ++++++++++++++++++++++++++++ module/report/view/workload.html.php | 9 ++++++++ 2 files changed, 43 insertions(+) diff --git a/module/report/model.php b/module/report/model.php index f043ae8c2e..853fad668c 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -249,6 +249,40 @@ class reportModel extends model $depts = array(); if($dept) $depts = $this->loadModel('dept')->getAllChildId($dept); + if($assign == 0) + { + $project = $this->dao->select('id')->from(TABLE_PROJECT) + ->where('deleted')->eq(0) + ->andWhere('status')->notin('cancel, closed, done, suspended') + ->fetchPairs('id'); + + $members = $this->dao->select('t1.account')->from(TABLE_TEAM)->alias('t1') + ->leftJoin(TABLE_USER)->alias('t2')->on('t2.account = t1.account') + ->where('t1.type')->eq('project') + ->beginIF($dept)->andWhere('t2.dept')->in($depts)->fi() + ->andWhere('t1.root')->in(array_keys($project)) + ->fetchPairs('account'); + + $taskAccounts = $this->dao->select('assignedTo')->from(TABLE_TASK) + ->where('deleted')->eq(0) + ->andWhere('project')->in(array_keys($project)) + ->andWhere('status')->notin('cancel, closed, done, pause') + ->fetchPairs('assignedTo'); + + if(!empty($taskAccounts) && !empty($members)) + { + foreach($members as $member) + { + if(!empty($member) && in_array($member, $taskAccounts)) + { + unset($members[$member]); + } + } + } + + return $members; + } + $tasks = $this->dao->select('t1.*, t2.name as projectName')->from(TABLE_TASK)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project = t2.id') ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') diff --git a/module/report/view/workload.html.php b/module/report/view/workload.html.php index 96f711b686..7092ce9c3e 100644 --- a/module/report/view/workload.html.php +++ b/module/report/view/workload.html.php @@ -70,6 +70,7 @@ + $info):?> ';?> @@ -90,6 +91,14 @@ '; $id ++;?> + + + 0 + 0 + 0 + 0 + 0 + From a92a0bdb29c9dd3876c43889872b358dd2e7e56d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 3 Jan 2018 22:06:04 +0800 Subject: [PATCH 062/206] * Finish task#3553 --- module/productplan/config.php | 4 +- module/productplan/js/create.js | 20 +++++--- module/productplan/js/edit.js | 19 +++++--- module/productplan/lang/en.php | 16 ++++--- module/productplan/lang/zh-cn.php | 16 ++++--- module/productplan/model.php | 66 +++++++++++++++------------ module/productplan/view/edit.html.php | 19 ++++---- module/productplan/view/view.html.php | 2 +- 8 files changed, 95 insertions(+), 67 deletions(-) diff --git a/module/productplan/config.php b/module/productplan/config.php index c506aacdc0..0f7486b95b 100644 --- a/module/productplan/config.php +++ b/module/productplan/config.php @@ -2,8 +2,8 @@ $config->productplan = new stdclass(); $config->productplan->create = new stdclass(); $config->productplan->edit = new stdclass(); -$config->productplan->create->requiredFields = 'title,begin,end'; -$config->productplan->edit->requiredFields = 'title,begin,end'; +$config->productplan->create->requiredFields = 'title,begin'; +$config->productplan->edit->requiredFields = 'title,begin'; $config->productplan->editor = new stdclass(); $config->productplan->editor->create = array('id' => 'desc', 'tools' => 'simpleTools'); diff --git a/module/productplan/js/create.js b/module/productplan/js/create.js index e58173c215..c7d495d46f 100644 --- a/module/productplan/js/create.js +++ b/module/productplan/js/create.js @@ -1,7 +1,7 @@ /** * Convert a date string like 2011-11-11 to date object in js. - * - * @param string $date + * + * @param string $date * @access public * @return date */ @@ -9,14 +9,14 @@ function convertStringToDate(dateString) { dateString = dateString.split('-'); dateString = dateString[1] + '/' + dateString[2] + '/' + dateString[0]; - + return Date.parse(dateString); } /** * Compute the end date for productplan. - * - * @param int $delta + * + * @param int $delta * @access public * @return void */ @@ -33,7 +33,15 @@ function computeEndDate(delta) } endDate = beginDate.addDays(delta - 1).toString('yyyy-MM-dd'); - $('#end').val(endDate); + + if(delta == 9999) + { + $('#end').val('').attr("disabled","disabled"); + } + else + { + $('#end').val(endDate).removeAttr('disabled'); + } } $('#begin').on('change', function() diff --git a/module/productplan/js/edit.js b/module/productplan/js/edit.js index b23058c54e..c7fb9892ad 100644 --- a/module/productplan/js/edit.js +++ b/module/productplan/js/edit.js @@ -1,7 +1,7 @@ /** * Convert a date string like 2011-11-11 to date object in js. - * - * @param string $date + * + * @param string $date * @access public * @return date */ @@ -9,14 +9,14 @@ function convertStringToDate(dateString) { dateString = dateString.split('-'); dateString = dateString[1] + '/' + dateString[2] + '/' + dateString[0]; - + return Date.parse(dateString); } /** * Compute the end date for productplan. - * - * @param int $delta + * + * @param int $delta * @access public * @return void */ @@ -33,5 +33,12 @@ function computeEndDate(delta) } endDate = beginDate.addDays(delta - 1).toString('yyyy-MM-dd'); - $('#end').val(endDate).datetimepicker('update') + if(delta == 9999) + { + $('#end').val('').attr("disabled","disabled"); + } + else + { + $('#end').val(endDate).removeAttr('disabled').datetimepicker('update'); + } } diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index c8d9744a0a..6a3b5fba20 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -46,14 +46,16 @@ $lang->productplan->desc = 'Description'; $lang->productplan->begin = 'Begin'; $lang->productplan->end = 'End'; $lang->productplan->last = 'Last plan'; +$lang->productplan->future = 'Future'; -$lang->productplan->endList[7] = '1 Week'; -$lang->productplan->endList[14] = '2 Weeks'; -$lang->productplan->endList[31] = '1 Month'; -$lang->productplan->endList[62] = '2 Months'; -$lang->productplan->endList[93] = '3 Months'; -$lang->productplan->endList[186] = '6 Months'; -$lang->productplan->endList[365] = '1 Year'; +$lang->productplan->endList[7] = '1 Week'; +$lang->productplan->endList[14] = '2 Weeks'; +$lang->productplan->endList[31] = '1 Month'; +$lang->productplan->endList[62] = '2 Months'; +$lang->productplan->endList[93] = '3 Months'; +$lang->productplan->endList[186] = '6 Months'; +$lang->productplan->endList[365] = '1 Year'; +$lang->productplan->endList[9999] = 'Future'; $lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; $lang->productplan->errorNoBegin = 'ID %s begin time should not be empty.'; diff --git a/module/productplan/lang/zh-cn.php b/module/productplan/lang/zh-cn.php index c2c8b5973e..509b88a4bf 100644 --- a/module/productplan/lang/zh-cn.php +++ b/module/productplan/lang/zh-cn.php @@ -46,14 +46,16 @@ $lang->productplan->desc = '描述'; $lang->productplan->begin = '开始日期'; $lang->productplan->end = '结束日期'; $lang->productplan->last = '上次计划'; +$lang->productplan->future = '待定'; -$lang->productplan->endList[7] = '一星期'; -$lang->productplan->endList[14] = '两星期'; -$lang->productplan->endList[31] = '一个月'; -$lang->productplan->endList[62] = '两个月'; -$lang->productplan->endList[93] = '三个月'; -$lang->productplan->endList[186] = '半年'; -$lang->productplan->endList[365] = '一年'; +$lang->productplan->endList[7] = '一星期'; +$lang->productplan->endList[14] = '两星期'; +$lang->productplan->endList[31] = '一个月'; +$lang->productplan->endList[62] = '两个月'; +$lang->productplan->endList[93] = '三个月'; +$lang->productplan->endList[186] = '半年'; +$lang->productplan->endList[365] = '一年'; +$lang->productplan->endList[9999] = '待定'; $lang->productplan->errorNoTitle = 'ID %s 标题不能为空'; $lang->productplan->errorNoBegin = 'ID %s 开始时间不能为空'; diff --git a/module/productplan/model.php b/module/productplan/model.php index 22f6b0604b..ab3f767ecc 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -15,8 +15,8 @@ class productplanModel extends model { /** * Get plan by id. - * - * @param int $planID + * + * @param int $planID * @param bool $setImgSize * @access public * @return object @@ -30,9 +30,9 @@ class productplanModel extends model } /** - * Get plans by idList - * - * @param int $planIDList + * Get plans by idList + * + * @param int $planIDList * @access public * @return array */ @@ -43,8 +43,8 @@ class productplanModel extends model /** * Get last plan. - * - * @param int $productID + * + * @param int $productID * @access public * @return void */ @@ -60,9 +60,9 @@ class productplanModel extends model } /** - * Get list - * - * @param int $product + * Get list + * + * @param int $product * @param int $branch * @param string $browseType * @param object $pager @@ -85,9 +85,9 @@ class productplanModel extends model /** * Get plan pairs. - * - * @param array|int $product - * @param string $expired + * + * @param array|int $product + * @param string $expired * @access public * @return array */ @@ -117,9 +117,9 @@ class productplanModel extends model } /** - * Get plans for products - * - * @param int $products + * Get plans for products + * + * @param int $products * @access public * @return void */ @@ -133,13 +133,16 @@ class productplanModel extends model /** * Create a plan. - * + * * @access public * @return int */ public function create() { - $plan = fixer::input('post')->stripTags($this->config->productplan->editor->create['id'], $this->config->allowedTags)->remove('delta,uid')->get(); + $plan = fixer::input('post')->stripTags($this->config->productplan->editor->create['id'], $this->config->allowedTags) + ->setIF($this->post->delta == 9999 || empty($this->post->end), 'end', '2030-01-01') + ->remove('delta,uid') + ->get(); $plan = $this->loadModel('file')->processImgURL($plan, $this->config->productplan->editor->create['id'], $this->post->uid); $this->dao->insert(TABLE_PRODUCTPLAN) ->data($plan) @@ -158,15 +161,18 @@ class productplanModel extends model /** * Update a plan - * - * @param int $planID + * + * @param int $planID * @access public * @return array */ public function update($planID) { $oldPlan = $this->dao->findByID((int)$planID)->from(TABLE_PRODUCTPLAN)->fetch(); - $plan = fixer::input('post')->stripTags($this->config->productplan->editor->edit['id'], $this->config->allowedTags)->remove('delta,uid')->get(); + $plan = fixer::input('post')->stripTags($this->config->productplan->editor->edit['id'], $this->config->allowedTags) + ->setIF($this->post->delta == 9999 || empty($this->post->end), 'end', '2030-01-01') + ->remove('delta,uid') + ->get(); $plan = $this->loadModel('file')->processImgURL($plan, $this->config->productplan->editor->edit['id'], $this->post->uid); $this->dao->update(TABLE_PRODUCTPLAN) ->data($plan) @@ -184,8 +190,8 @@ class productplanModel extends model /** * Batch update plan. - * - * @param int $productID + * + * @param int $productID * @access public * @return array */ @@ -233,8 +239,8 @@ class productplanModel extends model /** * Link stories. - * - * @param int $planID + * + * @param int $planID * @access public * @return void */ @@ -267,9 +273,9 @@ class productplanModel extends model } /** - * Unlink story - * - * @param int $storyID + * Unlink story + * + * @param int $storyID * @access public * @return void */ @@ -284,8 +290,8 @@ class productplanModel extends model /** * Link bugs. - * - * @param int $planID + * + * @param int $planID * @access public * @return void */ diff --git a/module/productplan/view/edit.html.php b/module/productplan/view/edit.html.php index 2585b5532f..9bba0bad30 100644 --- a/module/productplan/view/edit.html.php +++ b/module/productplan/view/edit.html.php @@ -24,28 +24,31 @@
      - +
      - + type != 'normal'):?> - + - + - + - + @@ -53,11 +56,11 @@ - + - + From 783c5acfa39e755d68499bf4bfe637cc8629e5da Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 4 Jan 2018 09:46:30 +0800 Subject: [PATCH 063/206] * finish task #3570. --- framework/base/router.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/base/router.class.php b/framework/base/router.class.php index d700da5fc4..184dd2efa9 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -2184,6 +2184,7 @@ class baseRouter { /* 设置错误信息(Set the error info) */ $message = htmlspecialchars($message); + if(preg_match('/[^\x00-\x80]/', $message)) $message = helper::convertEncoding($message, 'gbk'); $log = "ERROR: $message in $file on line $line"; if(isset($_SERVER['SCRIPT_URI'])) $log .= ", request: $_SERVER[SCRIPT_URI]";; $trace = debug_backtrace(); @@ -2236,6 +2237,7 @@ class baseRouter * 设置错误信息。 * Set the error info. **/ + if(preg_match('/[^\x00-\x80]/', $message)) $message = helper::convertEncoding($message, 'gbk'); $errorLog = "\n" . date('H:i:s') . " $message in $file on line $line "; $errorLog .= "when visiting " . htmlspecialchars($this->getURI()) . "\n"; From bfa06024b64610d58eaffb403e45f14f947b1192 Mon Sep 17 00:00:00 2001 From: Renee Date: Thu, 4 Jan 2018 11:18:47 +0800 Subject: [PATCH 064/206] Update README.md Sync with manual --- README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 986ed32761..f855d1538e 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ ===================== -ZenTao is an open source project management software, developed by Qingdao Nature Easy Soft Network Technology Co., Ltd. Integrating product management, project management, quality management, document management, organization management and to-do management, ZenTao is a professional development project management tool, covering the core processes of development project management. +ZenTao is an open source project management software, developed by Qingdao Nature Easy Soft Network Technology Co. Ltd. Combining product management, project management, QA management, document management, company management and todo management. It is a professional project management software, covering the core process of software development projects. + + +ZenTao is practical and pragmatic. It has full features and beautiful interfaces, and is easy to use. ZenTao is well structured and can be flexibly extended. It also has powerful search features, various forms of statistical reports and complete API. -ZenTao is practical and pragmatic. It has full features and a beautiful interface, and is easy to operate. Zentao is well structured and can be extended flexibly. It also has powerful search features, various reports and API. ZenTao focuses on development project management! @@ -12,26 +14,26 @@ ZenTao focuses on development project management! ============================ -Zen(禅) and Tao(道) are two Chinese characters that have rich meanings in both religion and culture. ZenTao Project Management Software takes the cutural meaning of Zen and Tao, and is expected to convey our understanding and thinking on management. Inspired by The Tao of Programming and The Zen of Programming, we named our software ZenTao. +Zen(禅) and Tao(道) are the two Chinese characters that have rich meanings in both religion and culture. ZenTao Project Management Software takes the cultural meaning of Zen and Tao, and is expected to convey our understanding and thinking of management. Inspired by The Tao of Programming and The Zen of Programming, we named our software ZenTao. 3. Design philosophy of ZenTao Project Management Software ========================================================== -The main management philosophy of ZenTao Project Management Software is based on Scrum, an internationally popular Agile management methodology. Scrum is very pragmatic and easy to operate, so it fits in the fast iterative software development projects. However, Scrum only defines the core management framework. Therefore, details and workflows have to be extended and developed. Based on the philosophy of Scrum and the observation of the current development situation in China, ZenTao integrates bug management, test management, release management and document management, which covers the entire life cycle of software development. In ZenTao, the concept of product, project and test is clearly defined. Product team, development team and QA team coordinate and check with each other while they function differently. The three teams interact with each other through working on stories, tasks and bugs, and eventually deliver the product with quality. +The main design philosophy of ZenTao Project Management Software is based on Scrum, an internationally popular Agile methodology. Scrum is very pragmatic and easy to operate, so it fits in the fast iterative development of software projects. However, Scrum only defines the core management framework. There are still many details and processes that have to be extended and developed. Based on the philosophy of Scrum and with the observation of the current development situations in China, ZenTao integrates bug management, test case management, release management and document management, and it completely covers the entire lifecycle of software development. In ZenTao, the concepts of product, project and test are clearly defined. Product team, development team and QA team coordinate and check with each other while they function differently. The three teams interact with each other through stories, tasks and bugs, and eventually deliver the product with quality. 4. Why choose ZenTao Project Management Software? =============================================== -* ZenTao is a professional development project management software and canot be replaced by one simple project management software. +* ZenTao is a professional development project management software and cannot be replaced by any simple project management software. * ZenTao has precise and pragmatic management philosphy, which will accelerate Agile development. * ZenTao has full features as a project management software, so you don’t have to integrate several systems together, like mantisbt + trac + testlink. * Open source codes and flexible extension mechanism. It is convenient to use and develop based on ZenTao. -* Underlying framework and front-end UI framework developed independently; robust and stable with beautiful interface and friendly interaction. +* Underlying framework and frontend UI framework are developed independently; robust and stable with beautiful interface and friendly interaction. * Perfect community mechanism; you can get technical support and help in time. -* Zero input, which means you have no risk for choosing ZenTao compared with other commercial software that cost you thousands of dollars. -* Support various ways of deployment, either private deployment or cloud service. +* Zero input, which means you have no risk for choosing ZenTao, compared with other commercial software that cost you thousands of dollars. +* Support various deployments, either private or cloud. 5. Features of ZenTao Project Management Software @@ -39,15 +41,15 @@ The main management philosophy of ZenTao Project Management Software is based on ====================================================== * Product management: including products, stories, plans, releases and roadmaps; -* Project management: including projects, tasks, teams, versions and burn-down charts; +* Project management: including projects, tasks, teams, builds and burn-down charts; * Quality management: including bugs, test cases, test tasks and test results; * Document management: including product document library, project document library and customized document library; * Work management: including to-do management and personal management, such as my tasks, my bugs, my story and my projects; * Organization management: including department, users, groups and privileges; * Statistics: various reports; -* Search: powerful search features to help you find the data you need. -* Extension mechanism: extensible almost anywhere in ZenTao; -* API mechanism, visible API: convenient for integration with other systems. +* Search: powerful search functions to help you find the data you need. +* Extension mechanism: extensible in almost any parts of ZenTao; +* API mechanism: convenient for integration with other systems. 6. Website From 8a9ad3f23a276c6a54bf77be06b7f2e6eaaaa7ab Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 4 Jan 2018 14:12:02 +0800 Subject: [PATCH 065/206] * finish task #3584. --- module/bug/control.php | 5 ++++- module/bug/js/report.js | 6 ++++++ module/bug/view/report.html.php | 13 +++++++++++-- module/common/view/chart.html.php | 15 +++++++++++++++ module/report/lang/en.php | 5 +++++ module/report/lang/zh-cn.php | 5 +++++ module/story/control.php | 6 ++++-- module/story/js/report.js | 6 ++++++ module/story/view/report.html.php | 13 +++++++++++-- module/task/control.php | 5 +++-- module/task/js/report.js | 6 ++++++ module/task/view/report.html.php | 11 +++++++++-- module/testtask/control.php | 5 ++++- module/testtask/js/report.js | 6 ++++++ module/testtask/view/report.html.php | 14 ++++++++++++-- 15 files changed, 107 insertions(+), 14 deletions(-) diff --git a/module/bug/control.php b/module/bug/control.php index 085655bdec..bab86e6424 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -179,7 +179,7 @@ class bug extends control * @access public * @return void */ - public function report($productID, $browseType, $branchID, $moduleID) + public function report($productID, $browseType, $branchID, $moduleID, $chartType = '') { $this->loadModel('report'); $this->view->charts = array(); @@ -191,6 +191,7 @@ class bug extends control $chartFunc = 'getDataOf' . $chart; $chartData = $this->bug->$chartFunc(); $chartOption = $this->lang->bug->report->$chart; + if(!empty($chartType)) $chartOption->type = $chartType; $this->bug->mergeChartOption($chart); $this->view->charts[$chart] = $chartOption; @@ -204,7 +205,9 @@ class bug extends control $this->view->position[] = $this->lang->bug->reportChart; $this->view->productID = $productID; $this->view->browseType = $browseType; + $this->view->branchID = $branchID; $this->view->moduleID = $moduleID; + $this->view->chartType = $chartType; $this->view->checkedCharts = $this->post->charts ? join(',', $this->post->charts) : ''; $this->display(); } diff --git a/module/bug/js/report.js b/module/bug/js/report.js index 38276947f3..5c00682a61 100644 --- a/module/bug/js/report.js +++ b/module/bug/js/report.js @@ -12,3 +12,9 @@ $(function() fixedTableHead('.table-wrapper'); $(window).resize(resizeChartTable); }); + +function changeChartType(type) +{ + $('form').attr('action', createLink('bug', 'report', 'productID=' + productID + '&browseType=' + browseType + '&branchID=' + branchID + '&moduleID=' + moduleID + '&chartType=' + type)); + $('form').find('#submit').click(); +} diff --git a/module/bug/view/report.html.php b/module/bug/view/report.html.php index 2b3242d339..99d13ee63a 100644 --- a/module/bug/view/report.html.php +++ b/module/bug/view/report.html.php @@ -40,8 +40,13 @@
      - bug->report->common;?> - report->notice->help?> + bug->report->common;?> +
      + report->typeList as $type => $typeName):?> + + +
      + report->notice->help?>
      productplan->product;?> name;?>
      product->branch;?> branch, 'class="form-control"');?>
      productplan->title;?> title, "class='form-control' autocomplete='off'");?>
      productplan->begin;?> begin, "class='form-control form-date'");?>
      productplan->end;?>end, 'class="form-control form-date"');?> + end == '2030-01-01' ? ' disabled="disabled"' : '';?> + end : '', 'class="form-control form-date"' . $disabled);?> +     productplan->endList , '', "onclick='computeEndDate(this.value)'");?>
      productplan->desc;?> desc), "rows='10' class='form-control'");?>
      - id); diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index a3f29aeb65..7b018fa00c 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -413,7 +413,7 @@
      productplan->end;?>end;?>end == '2030-01-01' ? $lang->productplan->future : $plan->end;?>
      productplan->desc;?>
      @@ -81,4 +86,8 @@ + + + + diff --git a/module/common/view/chart.html.php b/module/common/view/chart.html.php index dbbdd494c1..b6de446727 100644 --- a/module/common/view/chart.html.php +++ b/module/common/view/chart.html.php @@ -82,6 +82,21 @@ if($config->debug) chart = $canvas.barChart(data, options); } + else if(chartType === 'line') + { + var labels = [], dataset = {label: $table.find('thead .chart-label').text(), color: nextAccentColor().toCssStr(), data: []}; + + var $rows = $table.find('tbody > tr').each(function(idx) + { + var $row = $(this); + labels.push($row.find('.chart-label').text()); + dataset.data.push(parseInt($row.find('.chart-value').text())); + }); + var data = {labels: labels, datasets: [dataset]}; + if(labels.length) options.barValueSpacing = 5; + + chart = $canvas.lineChart(data, options); + } if(chart !== null) $table.data('zui.chart', chart); }); diff --git a/module/report/lang/en.php b/module/report/lang/en.php index 355388f501..88e0fee571 100644 --- a/module/report/lang/en.php +++ b/module/report/lang/en.php @@ -75,6 +75,11 @@ $lang->report->unplanned = 'Unplanned'; $lang->report->workday = 'Hours/Day'; $lang->report->diffDays = 'Man-Day'; +$lang->report->typeList[''] = 'Default'; +$lang->report->typeList['pie'] = 'Pie'; +$lang->report->typeList['bar'] = 'Bar'; +$lang->report->typeList['line'] = 'Line'; + $lang->report->conditions = 'Filter by:'; $lang->report->closedProduct = 'Closed ' . $lang->productCommon; $lang->report->overduePlan = 'Overdue Plan'; diff --git a/module/report/lang/zh-cn.php b/module/report/lang/zh-cn.php index 91b5ad9bc2..985f243a1d 100644 --- a/module/report/lang/zh-cn.php +++ b/module/report/lang/zh-cn.php @@ -75,6 +75,11 @@ $lang->report->unplanned = '未计划'; $lang->report->workday = '每天工时'; $lang->report->diffDays = '工作日天数'; +$lang->report->typeList[''] = '默认'; +$lang->report->typeList['pie'] = '饼图'; +$lang->report->typeList['bar'] = '柱状图'; +$lang->report->typeList['line'] = '折线图'; + $lang->report->conditions = '筛选条件:'; $lang->report->closedProduct = '关闭' . $lang->productCommon; $lang->report->overduePlan = '过期计划'; diff --git a/module/story/control.php b/module/story/control.php index f3ae1cb61a..a02ee50f97 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1330,7 +1330,7 @@ class story extends control * @access public * @return void */ - public function report($productID, $browseType, $branchID, $moduleID) + public function report($productID, $browseType, $branchID, $moduleID, $chartType = '') { $this->loadModel('report'); $this->view->charts = array(); @@ -1342,9 +1342,9 @@ class story extends control $chartFunc = 'getDataOf' . $chart; $chartData = $this->story->$chartFunc(); $chartOption = $this->lang->story->report->$chart; + if(!empty($chartType)) $chartOption->type = $chartType; $this->story->mergeChartOption($chart); - $this->view->charts[$chart] = $chartOption; $this->view->datas[$chart] = $this->report->computePercent($chartData); } @@ -1356,8 +1356,10 @@ class story extends control $this->view->position[] = $this->products[$productID]; $this->view->position[] = $this->lang->story->reportChart; $this->view->productID = $productID; + $this->view->branchID = $branchID; $this->view->browseType = $browseType; $this->view->moduleID = $moduleID; + $this->view->chartType = $chartType; $this->view->checkedCharts = $this->post->charts ? join(',', $this->post->charts) : ''; $this->display(); } diff --git a/module/story/js/report.js b/module/story/js/report.js index 38276947f3..2c8ef3ee94 100644 --- a/module/story/js/report.js +++ b/module/story/js/report.js @@ -12,3 +12,9 @@ $(function() fixedTableHead('.table-wrapper'); $(window).resize(resizeChartTable); }); + +function changeChartType(type) +{ + $('form').attr('action', createLink('story', 'report', 'productID=' + productID + '&browseType=' + browseType + '&branchID=' + branchID + '&moduleID=' + moduleID + '&chartType=' + type)); + $('form').find('#submit').click(); +} diff --git a/module/story/view/report.html.php b/module/story/view/report.html.php index afd936ddb2..9125e58479 100644 --- a/module/story/view/report.html.php +++ b/module/story/view/report.html.php @@ -40,8 +40,13 @@
      - story->report->common;?> - report->notice->help;?> + story->report->common;?> +
      + report->typeList as $type => $typeName):?> + + +
      + report->notice->help;?>
      @@ -80,4 +85,8 @@ + + + + diff --git a/module/task/control.php b/module/task/control.php index 5532939675..f7c37f1cf1 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -1160,9 +1160,8 @@ class task extends control * @access public * @return void */ - public function report($projectID, $browseType = 'all') + public function report($projectID, $browseType = 'all', $chartType = '') { - $this->loadModel('report'); $this->view->charts = array(); @@ -1173,6 +1172,7 @@ class task extends control $chartFunc = 'getDataOf' . $chart; $chartData = $this->task->$chartFunc(); $chartOption = $this->lang->task->report->$chart; + if(!empty($chartType)) $chartOption->type = $chartType; $this->task->mergeChartOption($chart); $this->view->charts[$chart] = $chartOption; @@ -1187,6 +1187,7 @@ class task extends control $this->view->position[] = $this->lang->task->report->common; $this->view->projectID = $projectID; $this->view->browseType = $browseType; + $this->view->chartType = $chartType; $this->view->checkedCharts = $this->post->charts ? join(',', $this->post->charts) : ''; $this->display(); diff --git a/module/task/js/report.js b/module/task/js/report.js index 38276947f3..ddc921dd01 100644 --- a/module/task/js/report.js +++ b/module/task/js/report.js @@ -12,3 +12,9 @@ $(function() fixedTableHead('.table-wrapper'); $(window).resize(resizeChartTable); }); + +function changeChartType(type) +{ + $('form').attr('action', createLink('task', 'report', 'projectID=' + projectID + '&browseType=' + browseType + '&chartType=' + type)); + $('form').find('#submit').click(); +} diff --git a/module/task/view/report.html.php b/module/task/view/report.html.php index 616325efc3..5ca4e5fff4 100644 --- a/module/task/view/report.html.php +++ b/module/task/view/report.html.php @@ -40,8 +40,13 @@
      - task->report->common;?> - report->notice->help?> + task->report->common;?> +
      + report->typeList as $type => $typeName):?> + + +
      + report->notice->help?>
      @@ -82,4 +87,6 @@ + + diff --git a/module/testtask/control.php b/module/testtask/control.php index e6fe6e9207..16aed09ef7 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -317,7 +317,7 @@ class testtask extends control * @access public * @return void */ - public function report($productID, $taskID, $browseType, $branchID, $moduleID) + public function report($productID, $taskID, $browseType, $branchID, $moduleID = 0, $chartType = '') { $this->loadModel('report'); $this->view->charts = array(); @@ -332,6 +332,7 @@ class testtask extends control $chartFunc = 'getDataOf' . $chart; $chartData = isset($bugInfo[$chart]) ? $bugInfo[$chart] : $this->testtask->$chartFunc($taskID); $chartOption = $this->testtask->mergeChartOption($chart); + if(!empty($chartType)) $chartOption->type = $chartType; $this->view->charts[$chart] = $chartOption; $this->view->datas[$chart] = $this->report->computePercent($chartData); @@ -346,6 +347,8 @@ class testtask extends control $this->view->taskID = $taskID; $this->view->browseType = $browseType; $this->view->moduleID = $moduleID; + $this->view->branchID = $branchID; + $this->view->chartType = $chartType; $this->view->checkedCharts = $this->post->charts ? join(',', $this->post->charts) : ''; $this->display(); diff --git a/module/testtask/js/report.js b/module/testtask/js/report.js index 38276947f3..2390207bcd 100644 --- a/module/testtask/js/report.js +++ b/module/testtask/js/report.js @@ -12,3 +12,9 @@ $(function() fixedTableHead('.table-wrapper'); $(window).resize(resizeChartTable); }); + +function changeChartType(type) +{ + $('form').attr('action', createLink('testtask', 'report', 'productID=' + productID + '&taskID=' + taskID + '&browseType=' + browseType + '&branchID=' + branchID + '&moduleID=' + moduleID + '&chartType=' + type)); + $('form').find('#submit').click(); +} diff --git a/module/testtask/view/report.html.php b/module/testtask/view/report.html.php index 03bdcb16f8..754606ace7 100644 --- a/module/testtask/view/report.html.php +++ b/module/testtask/view/report.html.php @@ -40,8 +40,13 @@
      - testtask->report->common;?> - report->notice->help?> + testtask->report->common;?> +
      + report->typeList as $type => $typeName):?> + + +
      + report->notice->help?>
      @@ -81,4 +86,9 @@ + + + + + From e35451994cbe418da53cc909321e22db4050726b Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 4 Jan 2018 14:18:49 +0800 Subject: [PATCH 066/206] * finish task #3582. --- module/file/view/export.html.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/file/view/export.html.php b/module/file/view/export.html.php index 904b1916d8..d37e25bbf2 100644 --- a/module/file/view/export.html.php +++ b/module/file/view/export.html.php @@ -167,7 +167,6 @@ $(document).ready(function() if(!$hasDefaultField)$selectedFields[] = $field; } ?> -
      + - + @@ -90,11 +90,11 @@ foreach(explode(',', $showFields) as $field) - - - - - + + + + + @@ -110,9 +110,9 @@ foreach(explode(',', $showFields) as $field) $os = $i - $nextStart == 0 ? '' : 'ditto'; $browser = $i - $nextStart == 0 ? '' : 'ditto'; ?> - + - + @@ -123,11 +123,11 @@ foreach(explode(',', $showFields) as $field) - - - - - + + + + + @@ -139,9 +139,9 @@ foreach(explode(',', $showFields) as $field)
      '>' style='overflow:visible'> ' style='overflow:visible'> ' style='overflow:visible'> '> '> bug->typeList, $type, "class='form-control'");?>'> bug->priList, $pri, "class='form-control'");?>'>bug->severityList, '', "class='form-control'");?>'> bug->osList, $os, "class='form-control'");?>'> bug->browserList, $browser, "class='form-control'");?>' style='overflow:visible'> bug->typeList, $type, "class='form-control chosen'");?>' style='overflow:visible'> bug->priList, $pri, "class='form-control chosen'");?>' style='overflow:visible'>bug->severityList, '', "class='form-control chosen'");?>' style='overflow:visible'> bug->osList, $os, "class='form-control chosen'");?>' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> '>
      '>' style='overflow:visible'> ' style='overflow:visible'> ' style='overflow:visible'> '> '> bug->typeList, $type, "class='form-control'");?>'> bug->priList, $pri, "class='form-control'");?>'>bug->severityList, '', "class='form-control'");?>'> bug->osList, $os, "class='form-control'");?>'> bug->browserList, $browser, "class='form-control'");?>' style='overflow:visible'> bug->typeList, $type, "class='form-control chosen'");?>' style='overflow:visible'> bug->priList, $pri, "class='form-control chosen'");?>' style='overflow:visible'>bug->severityList, '', "class='form-control chosen'");?>' style='overflow:visible'> bug->osList, $os, "class='form-control chosen'");?>' style='overflow:visible'> bug->browserList, $browser, "class='form-control chosen'");?> '>
      - + - + @@ -152,11 +152,11 @@ foreach(explode(',', $showFields) as $field) - - - - - + + + + + diff --git a/module/bug/view/create.html.php b/module/bug/view/create.html.php index a1ba83fc4f..947148fefd 100644 --- a/module/bug/view/create.html.php +++ b/module/bug/view/create.html.php @@ -74,15 +74,15 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate); unset($lang->bug->typeList['designchange']); unset($lang->bug->typeList['newfeature']); unset($lang->bug->typeList['trackthings']); - echo html::select('type', $lang->bug->typeList, $type, "class='form-control'"); + echo html::select('type', $lang->bug->typeList, $type, "class='form-control chosen'"); ?> bug->os?> - bug->osList, $os, "class='form-control'");?> + bug->osList, $os, "class='form-control chosen'");?> bug->browser?> - bug->browserList, $browser, "class='form-control'");?> + bug->browserList, $browser, "class='form-control chosen'");?> @@ -129,15 +129,15 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate); unset($lang->bug->typeList['designchange']); unset($lang->bug->typeList['newfeature']); unset($lang->bug->typeList['trackthings']); - echo html::select('type', $lang->bug->typeList, $type, "class='form-control'"); + echo html::select('type', $lang->bug->typeList, $type, "class='form-control chosen'"); ?> bug->os?> - bug->osList, $os, "class='form-control'");?> + bug->osList, $os, "class='form-control chosen'");?> bug->browser?> - bug->browserList, $browser, "class='form-control'");?> + bug->browserList, $browser, "class='form-control chosen'");?> @@ -173,7 +173,7 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate); } ?> - bug->severityList, $severity, "class='form-control minw-80px'");?> + bug->severityList, $severity, "class='form-control minw-80px chosen'");?> - + - + - + @@ -151,11 +151,11 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild); - + - + @@ -163,7 +163,10 @@ js::set('oldResolvedBuild' , $bug->resolvedBuild); - +
      %s'>' style='overflow:visible'> ' style='overflow:visible'> ' style='overflow:visible'> '> '> bug->typeList, $type, "class='form-control'");?>'> bug->priList, '', "class='form-control'");?>'>bug->severityList, '', "class='form-control'");?>'> bug->osList, $os, "class='form-control'");?>'> bug->browserList, $browser, "class='form-control'");?>' style='overflow:visible'> bug->typeList, $type, "class='form-control'");?>' style='overflow:visible'> bug->priList, '', "class='form-control'");?>' style='overflow:visible'>bug->severityList, '', "class='form-control'");?>' style='overflow:visible'> bug->osList, $os, "class='form-control'");?>' style='overflow:visible'> bug->browserList, $browser, "class='form-control'");?> '>
      bug->severity;?>bug->severityList, $bug->severity, "class='form-control'");?>bug->severityList, $bug->severity, "class='form-control chosen'");?>
      bug->pri;?>bug->priList, $bug->pri, "class='form-control'");?>bug->priList, $bug->pri, "class='form-control chosen'");?>
      bug->status;?>bug->statusList, $bug->status, "class='form-control'");?>bug->statusList, $bug->status, "class='form-control chosen'");?>
      bug->confirmed;?>
      bug->os;?>bug->osList, $bug->os, "class='form-control'");?>bug->osList, $bug->os, "class='form-control chosen'");?>
      bug->browser;?>bug->browserList, $bug->browser, "class='form-control'");?>bug->browserList, $bug->browser, "class='form-control chosen'");?>
      bug->keywords;?>
      bug->mailto;?>mailto), 'class="form-control chosen" multiple');?> + mailto), 'class="form-control chosen" multiple');?> + fetch('my', 'buildContactLists');?> +
      diff --git a/module/story/view/batchcreate.html.php b/module/story/view/batchcreate.html.php index 186532129f..f53046a876 100644 --- a/module/story/view/batchcreate.html.php +++ b/module/story/view/batchcreate.html.php @@ -93,7 +93,7 @@ if($this->story->checkForceReview()) unset($visibleFields['review']); - '> + ' style='overflow:visible'> ' style='overflow:visible'> ' style='overflow:visible'> @@ -121,7 +121,7 @@ if($this->story->checkForceReview()) unset($visibleFields['review']); %s - '> + ' style='overflow:visible'> ' style='overflow:visible'> ' style='overflow:visible'> diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index a114a8a932..0303cb03b6 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -71,9 +71,9 @@
      story->source?> - story->sourceList, $source, "class='form-control'");?> + story->sourceList, $source, "class='form-control chosen'");?> story->sourceNote?> - +
      @@ -120,8 +120,8 @@ } } ?> - - story->priList, $pri, "class='form-control minw-80px'");?> + + story->priList, $pri, "class='form-control minw-80px chosen'");?>
      - +
      @@ -52,14 +52,14 @@ - + - + - + + config->global->flow == 'onlyTask') echo "class='hidden'";?>> + + + - + - + > diff --git a/module/project/view/edit.html.php b/module/project/view/edit.html.php index 85f467c348..220cdaa3ca 100644 --- a/module/project/view/edit.html.php +++ b/module/project/view/edit.html.php @@ -23,11 +23,11 @@ -
      project->name;?>
      project->code;?>
      project->dateRange;?>
      - project->begin . "'");?> + begin) ? $plan->begin : date('Y-m-d')), "class='form-control w-100px form-date' onchange='computeWorkDays()' placeholder='" . $lang->project->begin . "'");?> project->to;?> - project->end . "'");?> + end) ? $plan->end : ''), "class='form-control form-date' onchange='computeWorkDays()' placeholder='" . $lang->project->end . "'");?>
      @@ -70,15 +70,15 @@ project->days;?>
      - + begin) ? helper::workDays($plan->begin, $plan->end) : ''), "class='form-control' autocomplete='off'");?> project->day;?>
      project->teamname;?>
      project->type;?> @@ -96,8 +96,8 @@
      - id, "class='form-control chosen' onchange='loadBranches(this)'");?> - + id, "class='form-control chosen' onchange='loadBranches(this)' data-last='" . $product->id . "'");?> + type != 'normal') echo html::select("branch[$i]", $branchGroups[$product->id], $product->branch, "class='form-control' style='width:80px'")?>
      @@ -106,20 +106,32 @@
      - +
      project->linkPlan;?> +
      + begin)):?> +
      + product;?>]", $productPlan, $plan->id, "class='form-control'");?> +
      + +
      +
      project->desc;?>
      project->acl;?> project->aclList, $acl, "onclick='setWhite(this.value);'", 'block'));?>
      project->whitelist;?>
      +
      - + @@ -58,15 +58,15 @@ project->day;?> - + - + - + @@ -115,7 +115,7 @@
      - id, "class='form-control chosen' onchange='loadBranches(this)'");?> + id, "class='form-control chosen' onchange='loadBranches(this)' data-last='" . $product->id . "'");?> type != 'normal' and isset($branchGroups[$product->id])) echo html::select("branch[$i]", $branchGroups[$product->id], $product->branch, "class='form-control' style='width:80px'")?>
      @@ -131,6 +131,18 @@
      + config->global->flow == 'onlyTask') echo "class='hidden'";?>> + + + From a5e2e4a6e63e26fc58c8153b42a20e84b56da0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 10 Jan 2018 09:51:56 +0800 Subject: [PATCH 072/206] * Fix bug. --- module/project/js/common.js | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/module/project/js/common.js b/module/project/js/common.js index 0a5e812749..b27ac9b066 100644 --- a/module/project/js/common.js +++ b/module/project/js/common.js @@ -159,25 +159,20 @@ function loadBranches(product) }); var productID = $(product).val(); - if(productID != 0) + + if(productID == 0 || productID != $(product).data('last')) $("#plan" + $(product).data('last')).remove(); + + if(productID != 0 && $("#plan" + productID).length == 0) { - console.log($("#plan" + productID).length ); - if($("#plan" + productID).length == 0) + $(product).data("last", productID); + $.get(createLink('product', 'ajaxGetPlans', "productID=" + productID), function(data) { - $(product).data("last", productID); - $.get(createLink('product', 'ajaxGetPlans', "productID=" + productID), function(data) + if(data) { - if(data) - { - $("#plansBox .row").append('
      ' + data + '
      '); - $("#plan" + $(product).val()).find('select').attr('name', 'plans[' + productID + ']').attr('id', 'plans' + productID); - } - }); - } - } - else - { - $("#plan" + $(product).data('last')).remove(); + $("#plansBox .row").append('
      ' + data + '
      '); + $("#plan" + $(product).val()).find('select').attr('name', 'plans[' + productID + ']').attr('id', 'plans' + productID); + } + }); } } From 13458b1b38c2a73c492eac797e54e58a50513d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 10 Jan 2018 11:25:08 +0800 Subject: [PATCH 073/206] * Task#3576 --- module/project/control.php | 11 +++++++- module/project/lang/en.php | 1 + module/project/lang/zh-cn.php | 1 + module/project/model.php | 40 ++++++++++++++++++++++++++--- module/project/view/create.html.php | 2 +- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/module/project/control.php b/module/project/control.php index be4742c6ec..8d7d238e11 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -882,6 +882,7 @@ class project extends control { if($projectID) { + if(!empty($planID)) $this->project->linkStories($projectID); $this->view->title = $this->lang->project->tips; $this->view->tips = $this->fetch('project', 'tips', "projectID=$projectID"); $this->view->projectID = $projectID; @@ -926,7 +927,15 @@ class project extends control if(dao::isError()) die(js::error(dao::getError())); $this->loadModel('action')->create('project', $projectID, 'opened'); - die(js::locate($this->createLink('project', 'create', "projectID=$projectID"), 'parent')); + $url = $this->createLink('project', 'create', "projectID=$projectID"); + if(!empty($planID)) + { + die(js::confirm($this->lang->project->importPlanStory, $url . '©ProjectID=&planID=' . $planID, $url, 'parent', 'parent')); + } + else + { + die(js::locate($url, 'parent')); + } } $this->project->setMenu($this->projects, key($this->projects)); diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 99d7c04758..8f3a4ca2b7 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -138,6 +138,7 @@ $lang->project->updateOrder = 'Order'; $lang->project->tree = 'Tree'; $lang->project->storyKanban = 'Story Kanban'; $lang->project->storySort = 'Story Sort'; +$lang->project->importPlanStory = 'Import the stories with the plan?'; /* 分组浏览。*/ $lang->project->allTasks = 'All'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 8c9e8b899f..5d1267724f 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -138,6 +138,7 @@ $lang->project->updateOrder = '排序'; $lang->project->tree = '树状图'; $lang->project->storyKanban = '需求看板'; $lang->project->storySort = '需求排序'; +$lang->project->importPlanStory = '是否导入计划关联的相关需求?'; /* 分组浏览。*/ $lang->project->allTasks = '所有'; diff --git a/module/project/model.php b/module/project/model.php index ce9148dee0..397d66f1df 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1435,21 +1435,25 @@ class projectModel extends model /** * Link story. * - * @param int $projectID + * @param int $projectID + * @param array $stories + * @param array $products + * * @access public - * @return void + * @return mixed */ - public function linkStory($projectID, $stories = array()) + public function linkStory($projectID, $stories = array(), $products = array()) { if(empty($stories)) $stories = $this->post->stories; if(empty($stories)) return false; + if(empty($products)) $products = $this->post->products; $this->loadModel('action'); $versions = $this->loadModel('story')->getVersions($stories); $lastOrder = (int)$this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->orderBy('order_desc')->limit(1)->fetch('order'); foreach($stories as $key => $storyID) { - $productID = (int)$this->post->products[$storyID]; + $productID = (int)$products[$storyID]; $data = new stdclass(); $data->project = $projectID; $data->product = $productID; @@ -1462,6 +1466,34 @@ class projectModel extends model } } + /** + * Link all stories by project. + * + * @param $projectID + */ + public function linkStories($projectID) + { + $plans = $this->dao->select('plan,product')->from(TABLE_PROJECTPRODUCT) + ->where('project')->eq($projectID) + ->fetchPairs('plan', 'product'); + + $planStories = array(); + $planProducts = array(); + if(!empty($plans)) + { + foreach($plans as $planID => $productID) + { + $planStory = $this->loadModel('story')->getPlanStories($planID); + if(!empty($planStory)) + { + $planStories = array_merge($planStories, array_keys($planStory)); + foreach($planStory as $story) $planProducts[$story->id] = $story->product; + } + } + } + $this->linkStory($projectID, $planStories, $planProducts); + } + /** * Unlink story. * diff --git a/module/project/view/create.html.php b/module/project/view/create.html.php index 7fd8311882..14783bff39 100644 --- a/module/project/view/create.html.php +++ b/module/project/view/create.html.php @@ -118,7 +118,7 @@
      begin)):?>
      - product;?>]", $productPlan, $plan->id, "class='form-control'");?> + product . "]", $productPlan, $plan->id, "class='form-control'");?>
      From 1e12da117ffb82e6a889a1e021aec41eb91ea7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 10 Jan 2018 16:43:17 +0800 Subject: [PATCH 074/206] * Finish Task#3576. --- module/project/control.php | 37 ++++++++++++++++++++++++++++-- module/project/js/story.js | 11 +++++++++ module/project/lang/en.php | 1 + module/project/lang/zh-cn.php | 1 + module/project/model.php | 8 +++---- module/project/view/story.html.php | 29 +++++++++++++++++++++-- 6 files changed, 79 insertions(+), 8 deletions(-) diff --git a/module/project/control.php b/module/project/control.php index 8d7d238e11..107aae875d 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -603,16 +603,27 @@ class project extends control /* Count T B C */ $storyIdList = array_keys($stories);; - $storyTasks = $this->loadModel('task')->getStoryTaskCounts($storyIdList,$projectID); - $storyBugs = $this->loadModel('bug')->getStoryBugCounts($storyIdList,$projectID); + $storyTasks = $this->loadModel('task')->getStoryTaskCounts($storyIdList, $projectID); + $storyBugs = $this->loadModel('bug')->getStoryBugCounts($storyIdList, $projectID); $storyCases = $this->loadModel('testcase')->getStoryCaseCounts($storyIdList); + $plans = $this->project->getPlans($productID); + $allPlans = array('' => ''); + if(!empty($plans)) + { + foreach($plans as $productID => $plan) + { + $allPlans = $allPlans + $plan; + } + } + /* Assign. */ $this->view->title = $title; $this->view->position = $position; $this->view->productID = $productID; $this->view->project = $project; $this->view->stories = $stories; + $this->view->allPlans = $allPlans; $this->view->summary = $this->product->summary($stories); $this->view->orderBy = $orderBy; $this->view->type = $type; @@ -2235,4 +2246,26 @@ class project extends control die(js::reload('parent.parent')); } + + /** + * Import stories by plan. + * + * @param int $projectID + * @param int $planID + * + * @access public + * @return void + */ + public function importPlanStories($projectID, $planID) + { + $planStories = $planProducts = array(); + $planStory = $this->loadModel('story')->getPlanStories($planID); + if(!empty($planStory)) + { + $planStories = array_keys($planStory); + foreach($planStory as $story) $planProducts[$story->id] = $story->product; + $this->project->linkStory($projectID, $planStories, $planProducts); + } + die(js::locate(helper::createLink('project', 'story', 'projectID=' . $projectID), 'parent')); + } } diff --git a/module/project/js/story.js b/module/project/js/story.js index f9290a4e9f..c05d3acb30 100644 --- a/module/project/js/story.js +++ b/module/project/js/story.js @@ -24,6 +24,17 @@ $(function() $('#branch' + branchID).addClass('active'); $(document).on('click', "#storyList tbody tr", function(){showCheckedSummary();}); $(document).on('change', "#storyList :checkbox", function(){showCheckedSummary();}); + + $("a[data-toggle='linkStoryByPlan']").click(function(){$('#linkStoryByPlan').modal('show')}) + + $('#toTaskButton').on('click', function () + { + var planID = $('#plan').val(); + if(planID) + { + parent.location.href = createLink('project', 'importPlanStories', 'projectID=' + projectID + '&planID=' + planID); + } + }) }); function showCheckedSummary() diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 8f3a4ca2b7..a6c53cd92f 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -118,6 +118,7 @@ $lang->project->doc = 'Doc'; $lang->project->manageProducts = 'Link ' . $lang->productCommon; $lang->project->linkStory = 'Linked Story'; $lang->project->linkPlan = 'Linked Plan'; +$lang->project->linkStoryByPlan = 'Linked Story From Plan'; $lang->project->unlinkStoryTasks = 'Unlinked'; $lang->project->linkedProducts = 'Linked Products'; $lang->project->unlinkedProducts = 'Unlinked Products'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 5d1267724f..fd5fb6cc5f 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -117,6 +117,7 @@ $lang->project->team = '团队成员'; $lang->project->doc = '文档列表'; $lang->project->manageProducts = '关联' . $lang->productCommon; $lang->project->linkStory = '关联需求'; +$lang->project->linkStoryByPlan = '按照计划关联'; $lang->project->linkPlan = '关联计划'; $lang->project->unlinkStoryTasks = '未关联需求任务'; $lang->project->linkedProducts = '已关联'; diff --git a/module/project/model.php b/module/project/model.php index 397d66f1df..29bbb52f03 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2581,16 +2581,16 @@ class projectModel extends model } /** - * Get plans by projectID. + * Get plans by $productID. * - * @param int|array $projectID + * @param int|array $productID * * @return mixed */ - public function getPlans($projectID) + public function getPlans($productID) { $plans = $this->dao->select('id,title,product')->from(TABLE_PRODUCTPLAN) - ->where('product')->in($projectID) + ->where('product')->in($productID) ->fetchAll(); $productPlans = array(); diff --git a/module/project/view/story.html.php b/module/project/view/story.html.php index d8281ea514..87e47d2962 100644 --- a/module/project/view/story.html.php +++ b/module/project/view/story.html.php @@ -25,7 +25,7 @@
      - lang->story->create = $this->lang->project->createStory; @@ -52,7 +52,15 @@ } else { + echo "
      "; common::printIcon('project', 'linkStory', "project=$project->id", '', 'button', 'link', '', 'link-story-btn'); + echo "'; + echo "'; + echo '
      '; } ?>
      @@ -109,7 +117,7 @@
      @@ -233,6 +241,23 @@
      project->name;?> name, "class='form-control' autocomplete='off'");?>
      project->code;?> code, "class='form-control' autocomplete='off'");?>
      project->type;?> project->typeList, $project->type, "class='form-control'");?>
      project->teamname;?> team, "class='form-control' autocomplete='off'");?>
      project->status;?> project->statusList, $project->status, "class='form-control'");?>
      project->linkPlan;?> +
      + $plan):?> +
      + plan, "class='form-control'");?> +
      + +
      +
      project->desc;?> desc), "rows='6' class='form-control'");?>
      - + id));?>
      + + product->checkedSummary);?> id);?> From 1177206405064cb1f52e64e750b1081e5b8d1c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 10 Jan 2018 17:29:30 +0800 Subject: [PATCH 075/206] * Finish Task#3551. --- module/my/view/task.html.php | 12 ++++++------ module/productplan/lang/en.php | 1 + module/productplan/lang/zh-cn.php | 1 + module/productplan/model.php | 19 +++++++++++-------- module/productplan/view/browse.html.php | 4 +++- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/module/my/view/task.html.php b/module/my/view/task.html.php index 5b53c66c4f..3ec7d32495 100644 --- a/module/my/view/task.html.php +++ b/module/my/view/task.html.php @@ -42,7 +42,7 @@ statusAB);?> actions;?> - + @@ -52,7 +52,7 @@ createLink('task', 'view', "taskID=$task->id"), sprintf('%03d', $task->id));?> - task->priList), $task->pri, $task->pri);?>'>task->priList), $task->pri, $task->pri);?> + pri;?>'>pri;?> createLink('project', 'browse', "projectid=$task->projectID"), $task->projectName);?> createLink('task', 'view', "taskID=$task->id"), $task->name, null, "style='color: $task->color'");?> openedBy);?> @@ -64,7 +64,7 @@ '>deadline, 0, 4) > 0) echo $task->deadline;?> task->statusList[$task->status];?> - project&taskID=$task->id", $task, 'list', 'hand-right', '', 'iframe', true); common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', 'play', '', 'iframe', true); common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task, 'list', 'time', '', 'iframe', true); @@ -81,7 +81,7 @@
      - "; if($canBatchEdit) @@ -96,13 +96,13 @@ } echo '
      '; ?> - + show();?> - + diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index c48173e494..b18e1f4bee 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -50,6 +50,7 @@ $lang->productplan->future = 'Future'; $lang->productplan->stories = 'Stories'; $lang->productplan->bugs = 'Bugs'; $lang->productplan->hour = 'Hour'; +$lang->productplan->project = $lang->projectCommon; $lang->productplan->endList[7] = '1 Week'; $lang->productplan->endList[14] = '2 Weeks'; diff --git a/module/productplan/lang/zh-cn.php b/module/productplan/lang/zh-cn.php index 88f4c3b93c..97102a30ab 100644 --- a/module/productplan/lang/zh-cn.php +++ b/module/productplan/lang/zh-cn.php @@ -50,6 +50,7 @@ $lang->productplan->future = '待定'; $lang->productplan->stories = '需求数'; $lang->productplan->bugs = 'Bug数'; $lang->productplan->hour = '工时'; +$lang->productplan->project = $lang->projectCommon; $lang->productplan->endList[7] = '一星期'; $lang->productplan->endList[14] = '两星期'; diff --git a/module/productplan/model.php b/module/productplan/model.php index e2e55f6b35..ceac3c65ba 100644 --- a/module/productplan/model.php +++ b/module/productplan/model.php @@ -73,11 +73,13 @@ class productplanModel extends model public function getList($product = 0, $branch = 0, $browseType = 'all', $pager = null, $orderBy = 'begin_desc') { $date = date('Y-m-d'); - $productPlans = $this->dao->select('*')->from(TABLE_PRODUCTPLAN)->where('product')->eq($product) - ->andWhere('deleted')->eq(0) - ->beginIF(!empty($branch))->andWhere('branch')->eq($branch)->fi() - ->beginIF($browseType == 'unexpired')->andWhere('end')->gt($date)->fi() - ->beginIF($browseType == 'overdue')->andWhere('end')->le($date)->fi() + $productPlans = $this->dao->select('t1.*,t2.project')->from(TABLE_PRODUCTPLAN)->alias('t1') + ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t2.plan = t1.id and t2.product = ' . $product) + ->where('t1.product')->eq($product) + ->andWhere('t1.deleted')->eq(0) + ->beginIF(!empty($branch))->andWhere('t1.branch')->eq($branch)->fi() + ->beginIF($browseType == 'unexpired')->andWhere('t1.end')->gt($date)->fi() + ->beginIF($browseType == 'overdue')->andWhere('t1.end')->le($date)->fi() ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); @@ -90,9 +92,10 @@ class productplanModel extends model ->where("CONCAT(',', plan, ',')")->like("%,{$productPlan->id},%") ->andWhere('deleted')->eq(0) ->fetchPairs('id', 'estimate'); - $productPlan->stories = count($stories); - $productPlan->bugs = $this->dao->select()->from(TABLE_BUG)->where("plan")->eq($productPlan->id)->andWhere('deleted')->eq(0)->count(); - $productPlan->hour = array_sum($stories); + $productPlan->stories = count($stories); + $productPlan->bugs = $this->dao->select()->from(TABLE_BUG)->where("plan")->eq($productPlan->id)->andWhere('deleted')->eq(0)->count(); + $productPlan->hour = array_sum($stories); + $productPlan->projectID = $productPlan->project; } } return $productPlans; diff --git a/module/productplan/view/browse.html.php b/module/productplan/view/browse.html.php index 5d0712187b..db9c272f1b 100644 --- a/module/productplan/view/browse.html.php +++ b/module/productplan/view/browse.html.php @@ -51,6 +51,7 @@ productplan->stories;?> productplan->bugs;?> productplan->hour;?> + productplan->project;?> productplan->desc;?> productplan->begin);?> productplan->end);?> @@ -73,6 +74,7 @@ stories;?> bugs;?> hour;?> + projectID)) echo html::a(helper::createLink('project', 'task', 'projectID=' . $plan->projectID), '');?>
      desc;?>
      begin;?> end == '2030-01-01' ? $lang->productplan->future : $plan->end;?> @@ -95,7 +97,7 @@ - '> + '>
      edit);?> From fa00dc9d9cc367b06edf0aad5b16f18bd58e164a Mon Sep 17 00:00:00 2001 From: dajiao007 Date: Wed, 10 Jan 2018 19:39:51 +0800 Subject: [PATCH 076/206] modify the translate --- module/action/lang/en.php | 22 +-- module/admin/lang/en.php | 16 +- module/block/lang/en.php | 20 +- module/block/view/productblock.html.php | 6 +- module/block/view/projectblock.html.php | 2 +- module/block/view/taskblock.html.php | 2 +- module/block/view/testtaskblock.html.php | 12 +- module/block/view/todoblock.html.php | 2 +- module/bug/config.php | 2 +- module/bug/lang/en.php | 51 ++--- module/bug/lang/zh-cn.php | 2 + module/bug/lang/zh-tw.php | 2 + module/bug/view/assignto.html.php | 4 +- module/build/lang/en.php | 4 +- module/build/view/linkstory.html.php | 4 +- module/build/view/view.html.php | 4 +- module/common/lang/en.php | 186 +++++++++---------- module/company/lang/en.php | 12 +- module/company/view/edit.html.php | 2 +- module/company/view/view.html.php | 2 +- module/custom/lang/en.php | 42 ++--- module/custom/view/set.html.php | 2 +- module/datatable/lang/en.php | 6 +- module/dept/lang/en.php | 6 +- module/dev/lang/en.php | 2 +- module/doc/lang/en.php | 32 ++-- module/editor/lang/en.php | 2 +- module/file/lang/en.php | 12 +- module/group/lang/en.php | 26 +-- module/install/lang/en.php | 16 +- module/mail/lang/en.php | 26 +-- module/mail/view/edit.html.php | 2 +- module/my/lang/en.php | 36 ++-- module/product/lang/en.php | 36 ++-- module/product/view/all.html.php | 2 +- module/product/view/create.html.php | 2 +- module/product/view/dynamic.html.php | 4 +- module/productplan/lang/en.php | 30 +-- module/project/lang/en.php | 90 ++++----- module/project/view/burn.html.php | 2 +- module/project/view/create.html.php | 2 +- module/project/view/fixfirst.html.php | 2 +- module/project/view/grouptask.html.php | 6 +- module/release/lang/en.php | 6 +- module/report/lang/en.php | 26 +-- module/search/lang/en.php | 10 +- module/story/config.php | 4 +- module/story/lang/en.php | 60 +++--- module/task/config.php | 2 +- module/task/lang/en.php | 100 +++++----- module/testcase/lang/en.php | 47 ++--- module/testcase/lang/zh-cn.php | 3 + module/testcase/lang/zh-tw.php | 3 + module/testcase/view/review.html.php | 6 +- module/testreport/lang/en.php | 34 ++-- module/testreport/lang/zh-cn.php | 2 + module/testreport/lang/zh-tw.php | 2 + module/testreport/view/blockbugs.html.php | 2 +- module/testreport/view/blockstories.html.php | 2 +- module/testsuite/lang/en.php | 22 +-- module/testtask/lang/en.php | 34 ++-- module/todo/lang/en.php | 32 ++-- module/tree/lang/en.php | 14 +- module/user/lang/en.php | 26 +-- 64 files changed, 601 insertions(+), 579 deletions(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 34e6c6c784..922bce1f49 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -12,10 +12,10 @@ $lang->action->common = 'Log'; $lang->action->product = $lang->productCommon; $lang->action->project = $lang->projectCommon; -$lang->action->objectType = 'Object'; +$lang->action->objectType = 'Object Type'; $lang->action->objectID = 'ID'; -$lang->action->objectName = 'Name'; -$lang->action->actor = 'Done by'; +$lang->action->objectName = 'Object Name'; +$lang->action->actor = 'Operator'; $lang->action->action = 'Action'; $lang->action->actionID = 'Action ID'; $lang->action->date = 'Date'; @@ -44,11 +44,11 @@ $lang->action->history->diff = 'Diff'; $lang->action->dynamic = new stdclass(); $lang->action->dynamic->today = 'Today'; $lang->action->dynamic->yesterday = 'Yesterday'; -$lang->action->dynamic->twoDaysAgo = 'Two Days Ago'; -$lang->action->dynamic->thisWeek = 'This Week'; -$lang->action->dynamic->lastWeek = 'Last Week'; -$lang->action->dynamic->thisMonth = 'This Month'; -$lang->action->dynamic->lastMonth = 'Last Month'; +$lang->action->dynamic->twoDaysAgo = 'TwoDaysAgo'; +$lang->action->dynamic->thisWeek = 'ThisWeek'; +$lang->action->dynamic->lastWeek = 'LastWeek'; +$lang->action->dynamic->thisMonth = 'ThisMonth'; +$lang->action->dynamic->lastMonth = 'LastMonth'; $lang->action->dynamic->all = 'All'; $lang->action->dynamic->hidden = 'Hidden'; $lang->action->dynamic->search = 'Search'; @@ -68,7 +68,7 @@ $lang->action->objectTypes['testtask'] = 'Test Build'; $lang->action->objectTypes['user'] = 'User'; $lang->action->objectTypes['doc'] = 'Doc'; $lang->action->objectTypes['doclib'] = 'Doc Lib'; -$lang->action->objectTypes['todo'] = 'To-Dos'; +$lang->action->objectTypes['todo'] = 'Todo'; $lang->action->objectTypes['branch'] = 'Branch'; $lang->action->objectTypes['module'] = 'Module'; $lang->action->objectTypes['testsuite'] = 'Suite'; @@ -197,7 +197,7 @@ $lang->action->label->case = 'Case|testcase|view|caseID=%s'; $lang->action->label->testtask = 'Test Task|testtask|view|caseID=%s'; $lang->action->label->testsuite = 'Test Suite|testsuite|view|suiteID=%s'; $lang->action->label->caselib = 'Case Library|testsuite|libview|libID=%s'; -$lang->action->label->todo = 'To-Do|todo|view|todoID=%s'; +$lang->action->label->todo = 'Todo|todo|view|todoID=%s'; $lang->action->label->doclib = 'Doc Lib|doc|browse|libID=%s'; $lang->action->label->doc = 'Doc|doc|view|docID=%s'; $lang->action->label->user = 'User|user|view|account=%s'; @@ -220,7 +220,7 @@ $lang->action->search->objectTypeList['testtask'] = 'Test Task'; $lang->action->search->objectTypeList['user'] = 'User'; $lang->action->search->objectTypeList['doc'] = 'Doc'; $lang->action->search->objectTypeList['doclib'] = 'Doc Lib'; -$lang->action->search->objectTypeList['todo'] = 'To-Dos'; +$lang->action->search->objectTypeList['todo'] = 'Todo'; $lang->action->search->objectTypeList['build'] = 'Build'; $lang->action->search->objectTypeList['release'] = 'Release'; $lang->action->search->objectTypeList['productplan'] = 'Plan'; diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index f7c4e122d0..2d7b427ca2 100644 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -29,23 +29,23 @@ $lang->admin->saveSuccess = 'Saved.'; $lang->admin->info = new stdclass(); $lang->admin->info->version = 'Current Version is %s. '; -$lang->admin->info->links = 'You can visit '; +$lang->admin->info->links = 'You can visit links below'; $lang->admin->info->account = 'Your ZenTao account is %s.'; $lang->admin->info->log = 'Logs that is beyond valid days will be deleted and it has to run cron.'; $lang->admin->notice = new stdclass(); -$lang->admin->notice->register = "Note: You haven't registered in ZenTao(www.zentao.pm). Register %s and get the latest ZenTao news."; +$lang->admin->notice->register = "Note: You haven't registered in ZenTao(www.zentao.pm). %s then get the Latest ZenTao Upgrades and News."; $lang->admin->notice->ignore = "Ignore"; $lang->admin->notice->int = "『%s』should be a positive integer."; $lang->admin->register = new stdclass(); -$lang->admin->register->common = 'Account Binding'; -$lang->admin->register->caption = 'Register'; -$lang->admin->register->click = 'Click Here'; -$lang->admin->register->lblAccount = 'at least 3 characters; must contain letters and numbers.'; -$lang->admin->register->lblPasswd = 'at least 6 characters; must contain letters and numbers.'; +$lang->admin->register->common = 'Binding New Account'; +$lang->admin->register->caption = 'Register in Zentao Community'; +$lang->admin->register->click = 'Please Register here'; +$lang->admin->register->lblAccount = 'at least 3 characters pls; contains letters and numbers.'; +$lang->admin->register->lblPasswd = 'at least 6 characters pls; contains letters and numbers.'; $lang->admin->register->submit = 'Register'; -$lang->admin->register->bind = "If you have already registered an account, link your account %s."; +$lang->admin->register->bind = "Binding Exsit Account"; $lang->admin->register->success = "You have registered with us!"; $lang->admin->bind = new stdclass(); diff --git a/module/block/lang/en.php b/module/block/lang/en.php index c34dbae5b6..aecc5fb0a7 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -46,7 +46,7 @@ $lang->block->refresh = 'Refresh'; $lang->block->hidden = 'Hide'; $lang->block->dynamicInfo = "%s, %s %s %s %s."; -$lang->block->default['product']['1']['title'] = 'Open' . $lang->productCommon; +$lang->block->default['product']['1']['title'] = 'Open ' . $lang->productCommon . 's'; $lang->block->default['product']['1']['block'] = 'list'; $lang->block->default['product']['1']['grid'] = 8; @@ -61,7 +61,7 @@ $lang->block->default['product']['2']['params']['num'] = 15; $lang->block->default['product']['2']['params']['orderBy'] = 'id_desc'; $lang->block->default['product']['2']['params']['type'] = 'assignedTo'; -$lang->block->default['project']['1']['title'] = 'Doing' . $lang->projectCommon; +$lang->block->default['project']['1']['title'] = 'Active ' . $lang->projectCommon . 's'; $lang->block->default['project']['1']['block'] = 'list'; $lang->block->default['project']['1']['grid'] = 8; @@ -111,7 +111,7 @@ $lang->block->default['full']['my']['2']['grid'] = 4; $lang->block->default['full']['my']['2']['source'] = ''; $lang->block->default['full']['my']['3'] = $lang->block->default['project']['1']; $lang->block->default['full']['my']['3']['source'] = 'project'; -$lang->block->default['full']['my']['4']['title'] = 'My To-Dos'; +$lang->block->default['full']['my']['4']['title'] = 'My Todo'; $lang->block->default['full']['my']['4']['block'] = 'list'; $lang->block->default['full']['my']['4']['grid'] = 4; $lang->block->default['full']['my']['4']['source'] = 'todo'; @@ -134,7 +134,7 @@ $lang->block->default['onlyTest']['my']['2']['title'] = 'Dynamic'; $lang->block->default['onlyTest']['my']['2']['block'] = 'dynamic'; $lang->block->default['onlyTest']['my']['2']['grid'] = 4; $lang->block->default['onlyTest']['my']['2']['source'] = ''; -$lang->block->default['onlyTest']['my']['3']['title'] = 'My To-Dos'; +$lang->block->default['onlyTest']['my']['3']['title'] = 'My Todo'; $lang->block->default['onlyTest']['my']['3']['block'] = 'list'; $lang->block->default['onlyTest']['my']['3']['grid'] = 6; $lang->block->default['onlyTest']['my']['3']['source'] = 'todo'; @@ -150,7 +150,7 @@ $lang->block->default['onlyStory']['my']['2']['title'] = 'Dynamic'; $lang->block->default['onlyStory']['my']['2']['block'] = 'dynamic'; $lang->block->default['onlyStory']['my']['2']['grid'] = 4; $lang->block->default['onlyStory']['my']['2']['source'] = ''; -$lang->block->default['onlyStory']['my']['3']['title'] = 'My To-Dos'; +$lang->block->default['onlyStory']['my']['3']['title'] = 'My Todo'; $lang->block->default['onlyStory']['my']['3']['block'] = 'list'; $lang->block->default['onlyStory']['my']['3']['grid'] = 6; $lang->block->default['onlyStory']['my']['3']['source'] = 'todo'; @@ -166,7 +166,7 @@ $lang->block->default['onlyTask']['my']['2']['title'] = 'Dynamic'; $lang->block->default['onlyTask']['my']['2']['block'] = 'dynamic'; $lang->block->default['onlyTask']['my']['2']['grid'] = 4; $lang->block->default['onlyTask']['my']['2']['source'] = ''; -$lang->block->default['onlyTask']['my']['3']['title'] = 'My To-Dos'; +$lang->block->default['onlyTask']['my']['3']['title'] = 'My Todo'; $lang->block->default['onlyTask']['my']['3']['block'] = 'list'; $lang->block->default['onlyTask']['my']['3']['grid'] = 6; $lang->block->default['onlyTask']['my']['3']['source'] = 'todo'; @@ -181,7 +181,7 @@ $lang->block->orderBy = 'Order by'; $lang->block->availableBlocks = new stdclass(); -$lang->block->availableBlocks->todo = 'My To-Dos'; +$lang->block->availableBlocks->todo = 'My Todo'; $lang->block->availableBlocks->task = 'My Tasks'; $lang->block->availableBlocks->bug = 'My Bugs'; $lang->block->availableBlocks->case = 'My Cases'; @@ -196,7 +196,7 @@ $lang->block->availableBlocks->testtask = 'Test Builds'; $lang->block->moduleList['product'] = $lang->productCommon; $lang->block->moduleList['project'] = $lang->projectCommon; $lang->block->moduleList['qa'] = 'QA'; -$lang->block->moduleList['todo'] = 'To-Dos'; +$lang->block->moduleList['todo'] = 'Todo'; $lang->block->modules['product'] = new stdclass(); $lang->block->modules['product']->availableBlocks = new stdclass(); @@ -216,7 +216,7 @@ $lang->block->modules['qa']->availableBlocks->case = 'Cases'; $lang->block->modules['qa']->availableBlocks->testtask = 'Test Builds'; $lang->block->modules['todo'] = new stdclass(); $lang->block->modules['todo']->availableBlocks = new stdclass(); -$lang->block->modules['todo']->availableBlocks->list = 'To-Dos'; +$lang->block->modules['todo']->availableBlocks->list = 'Todo'; $lang->block->orderByList = new stdclass(); @@ -282,7 +282,7 @@ $lang->block->typeList->product['closed'] = 'Closed'; $lang->block->typeList->product['all'] = 'All'; $lang->block->typeList->product['involved'] = 'Involved'; -$lang->block->typeList->project['undone'] = 'Undone'; +$lang->block->typeList->project['undone'] = 'Unfinished'; $lang->block->typeList->project['isdoing'] = 'Doing'; $lang->block->typeList->project['all'] = 'All'; $lang->block->typeList->project['involved'] = 'Involved'; diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php index 09386e9293..309018596d 100644 --- a/module/block/view/productblock.html.php +++ b/module/block/view/productblock.html.php @@ -18,9 +18,9 @@ story->statusList['changed'];?> story->statusList['draft'];?> product->plans;?> - product->releases;?> - product->bugs;?> - bug->unResolved;?> + product->releases;?> + product->bugs;?> + bug->unResolved;?> diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php index e6858c71e0..ac4b9fd2e3 100644 --- a/module/block/view/projectblock.html.php +++ b/module/block/view/projectblock.html.php @@ -19,7 +19,7 @@ project->name;?> project->end;?> - statusAB;?> + statusAB;?> project->totalEstimate;?> project->totalConsumed;?> project->totalLeft;?> diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index e1a8fa224b..e5e611d872 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -19,7 +19,7 @@ td.delayed{background: #e84e0f!important; color: white;} idAB?> priAB?> task->name;?> - task->estimateAB;?> + task->estimateAB;?> task->deadline;?> statusAB;?> diff --git a/module/block/view/testtaskblock.html.php b/module/block/view/testtaskblock.html.php index 90b8a2a2ad..b4dc0d55fd 100644 --- a/module/block/view/testtaskblock.html.php +++ b/module/block/view/testtaskblock.html.php @@ -13,12 +13,12 @@ - - - - - - + + + + + + diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php index 1bb55b5a37..868393caae 100644 --- a/module/block/view/todoblock.html.php +++ b/module/block/view/todoblock.html.php @@ -16,7 +16,7 @@ - + diff --git a/module/bug/config.php b/module/bug/config.php index 190b518f2d..6ac9bc0717 100644 --- a/module/bug/config.php +++ b/module/bug/config.php @@ -267,7 +267,7 @@ $config->bug->datatable->fieldList['openedBuild']['fixed'] = 'no'; $config->bug->datatable->fieldList['openedBuild']['width'] = '120'; $config->bug->datatable->fieldList['openedBuild']['required'] = 'no'; -$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedTo'; +$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB'; $config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no'; $config->bug->datatable->fieldList['assignedTo']['width'] = '80'; $config->bug->datatable->fieldList['assignedTo']['required'] = 'no'; diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 7a30d7cced..2473e677c2 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -21,9 +21,9 @@ $lang->bug->project = $lang->projectCommon; $lang->bug->story = 'Story'; $lang->bug->task = 'Task'; $lang->bug->title = 'Title'; -$lang->bug->severity = 'Severity'; +$lang->bug->severity = 'Severity(S)'; $lang->bug->severityAB = 'S'; -$lang->bug->pri = 'Priority'; +$lang->bug->pri = 'Priority(P)'; $lang->bug->type = 'Type'; $lang->bug->os = 'OS'; $lang->bug->browser = 'Browser'; @@ -37,26 +37,28 @@ $lang->bug->confirmed = 'Confirmed'; $lang->bug->toTask = 'Convert to Task'; $lang->bug->toStory = 'Convert to Story'; $lang->bug->mailto = 'Mail To'; -$lang->bug->openedBy = 'Open By'; -$lang->bug->openedDate = 'Open On'; -$lang->bug->openedDateAB = 'Created on'; +$lang->bug->openedBy = 'Creator'; +$lang->bug->openedDate = 'Created on'; +$lang->bug->openedDateAB = 'Created'; $lang->bug->openedBuild = 'Open Build'; -$lang->bug->assignedTo = 'Assigned To'; +$lang->bug->assignedTo = 'To'; +$lang->bug->assignBug = 'Assign To'; +$lang->bug->assignedToAB = 'To'; $lang->bug->assignedDate = 'Assigned On'; -$lang->bug->resolvedBy = 'Resolved By'; +$lang->bug->resolvedBy = 'Resolved'; $lang->bug->resolvedByAB = 'Resolved'; $lang->bug->resolution = 'Solution'; $lang->bug->resolutionAB = 'Solution'; $lang->bug->resolvedBuild = 'Resolved Build'; -$lang->bug->resolvedDate = 'Resolved On'; -$lang->bug->resolvedDateAB = 'Resolved On'; +$lang->bug->resolvedDate = 'Resolved on'; +$lang->bug->resolvedDateAB = 'Resolved'; $lang->bug->deadline = 'Deadline'; $lang->bug->plan = 'Plan'; $lang->bug->closedBy = 'Closed By'; $lang->bug->closedDate = 'Closed On'; $lang->bug->duplicateBug = 'Duplicate'; -$lang->bug->lastEditedBy = 'Last Edited By'; -$lang->bug->linkBug = 'linked'; +$lang->bug->lastEditedBy = 'Edited By'; +$lang->bug->linkBug = 'Linked Bug'; $lang->bug->linkBugs = 'Link Bug'; $lang->bug->unlinkBug = 'Unlink'; $lang->bug->case = 'Case'; @@ -88,32 +90,33 @@ $lang->bug->resolve = 'Resolve'; $lang->bug->batchResolve = 'Batch Resolve'; $lang->bug->close = 'Close'; $lang->bug->activate = 'Activate'; -$lang->bug->batchActivate = 'batchActivate'; +$lang->bug->batchActivate = 'Batch Activate'; $lang->bug->reportChart = 'Report'; $lang->bug->export = 'Export'; $lang->bug->delete = 'Delete'; $lang->bug->deleted = 'Deleted'; $lang->bug->saveTemplate = 'Save as Template'; -$lang->bug->setPublic = 'Set as Public'; +$lang->bug->setPublic = 'Set as Public Template'; $lang->bug->deleteTemplate = 'Delete Template'; $lang->bug->confirmStoryChange = 'Confirm Story Change'; $lang->bug->copy = 'Copy'; /* 查询条件列表。*/ -$lang->bug->assignToMe = 'Assigned to Me'; -$lang->bug->openedByMe = 'Created by Me'; -$lang->bug->resolvedByMe = 'Resolved by Me'; -$lang->bug->closedByMe = 'Closed by Me'; +$lang->bug->assignToMe = 'AssignedToMe'; +$lang->bug->openedByMe = 'CreatedByMe'; +$lang->bug->resolvedByMe = 'ResolvedByMe'; +$lang->bug->closedByMe = 'ClosedByMe'; $lang->bug->assignToNull = 'Unassigned'; +$lang->bug->unConfirmed = 'Unconfirmed'; $lang->bug->unResolved = 'Unresolved'; -$lang->bug->toClosed = 'To Be Closed'; -$lang->bug->unclosed = 'Open'; +$lang->bug->toClosed = 'WaitForClose'; +$lang->bug->unclosed = 'Active'; $lang->bug->longLifeBugs = 'Pending'; $lang->bug->postponedBugs = 'Postponed'; $lang->bug->overdueBugs = 'Overdue'; $lang->bug->allBugs = 'All'; $lang->bug->byQuery = 'Search'; -$lang->bug->needConfirm = 'Story Change'; +$lang->bug->needConfirm = 'StoryChanged'; $lang->bug->allProduct = 'All' . $lang->productCommon; $lang->bug->my = 'My'; @@ -137,7 +140,7 @@ $lang->bug->lblTypeAndSeverity = 'Type/Priority Level'; $lang->bug->lblSystemBrowserAndHardware = 'System/Browser'; $lang->bug->legendSteps = 'Repro Steps'; $lang->bug->legendComment = 'Note'; -$lang->bug->legendLife = 'Lifecycle'; +$lang->bug->legendLife = 'Life of Bug'; $lang->bug->legendMisc = 'Misc'; $lang->bug->legendRelated = 'Related Info'; @@ -239,14 +242,14 @@ $lang->bug->confirmedList[1] = 'Yes'; $lang->bug->confirmedList[0] = 'No'; $lang->bug->resolutionList[''] = ''; -$lang->bug->resolutionList['bydesign'] = 'Design Issue'; +$lang->bug->resolutionList['bydesign'] = 'By Design'; $lang->bug->resolutionList['duplicate'] = 'Duplicated'; $lang->bug->resolutionList['external'] = 'External'; $lang->bug->resolutionList['fixed'] = 'Resolved'; $lang->bug->resolutionList['notrepro'] = 'Irreproducible'; $lang->bug->resolutionList['postponed'] = 'Postponed'; $lang->bug->resolutionList['willnotfix'] = "Not to Resolve"; -$lang->bug->resolutionList['tostory'] = 'Convert to Story'; +$lang->bug->resolutionList['tostory'] = 'Converted to Story'; /* 统计报表。*/ $lang->bug->report = new stdclass(); @@ -372,7 +375,7 @@ $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; $lang->bug->featureBar['browse']['my'] = $lang->bug->my; -$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; +$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->unConfirmed; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; $lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 6b891f3303..583f2f8694 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -42,6 +42,8 @@ $lang->bug->openedDate = '创建日期'; $lang->bug->openedDateAB = '创建日期'; $lang->bug->openedBuild = '影响版本'; $lang->bug->assignedTo = '指派给'; +$lang->bug->assignBug = '指派给'; +$lang->bug->assignedToAB = '指派给'; $lang->bug->assignedDate = '指派日期'; $lang->bug->resolvedBy = '解决者'; $lang->bug->resolvedByAB = '解决'; diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php index e4eaa7e2c6..9a5246988a 100644 --- a/module/bug/lang/zh-tw.php +++ b/module/bug/lang/zh-tw.php @@ -42,6 +42,8 @@ $lang->bug->openedDate = '創建日期'; $lang->bug->openedDateAB = '創建日期'; $lang->bug->openedBuild = '影響版本'; $lang->bug->assignedTo = '指派給'; +$lang->bug->assignBug = '指派給'; +$lang->bug->assignedToAB = '指派給'; $lang->bug->assignedDate = '指派日期'; $lang->bug->resolvedBy = '解決者'; $lang->bug->resolvedByAB = '解決'; diff --git a/module/bug/view/assignto.html.php b/module/bug/view/assignto.html.php index a4279e4d1e..b06b1b2330 100644 --- a/module/bug/view/assignto.html.php +++ b/module/bug/view/assignto.html.php @@ -20,14 +20,14 @@ js::set('page', 'assignedto');
      icons['bug']);?> id;?> createLink('bug', 'view', 'bug=' . $bug->id), $bug->title, '_blank');?> - bug->assignedTo;?> icons['assignTo']);?> + bug->assignBug;?> icons['assignTo']);?>
      idAB?> testtask->product;?> testtask->name;?> testtask->project . '/' . $lang->testtask->build;?>testtask->begin;?>testtask->end;?>idAB?>testtask->product;?> testtask->name;?>testtask->project . '/' . $lang->testtask->build;?>testtask->begin;?>testtask->end;?>
      todo->date?> priAB?> todo->name;?>todo->beginAB;?>todo->beginAB;?> todo->endAB;?>
      - + diff --git a/module/build/lang/en.php b/module/build/lang/en.php index 8ddec86168..f5d21f084b 100644 --- a/module/build/lang/en.php +++ b/module/build/lang/en.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ $lang->build->common = "Build"; -$lang->build->create = "Create"; +$lang->build->create = "Create Build"; $lang->build->edit = "Edit"; $lang->build->linkStory = "Link Story"; $lang->build->linkBug = "Link Bug"; @@ -44,7 +44,7 @@ $lang->build->unlinkStory = 'Unlink Story'; $lang->build->unlinkBug = 'Unlink Bug'; $lang->build->stories = 'Finished Story'; $lang->build->bugs = 'Resolved Bug'; -$lang->build->generatedBugs = 'Remained Bug'; +$lang->build->generatedBugs = 'Left Bug'; $lang->build->noProduct = " This {$lang->projectCommon} has not linked to {$lang->productCommon}, so Build cannot be created. Please first link {$lang->productCommon}"; $lang->build->finishStories = ' %s Story(ies) have been finished.'; diff --git a/module/build/view/linkstory.html.php b/module/build/view/linkstory.html.php index e62a058945..cb56ed2cf9 100644 --- a/module/build/view/linkstory.html.php +++ b/module/build/view/linkstory.html.php @@ -26,9 +26,9 @@ include '../../common/view/tablesorter.html.php'; - + - + diff --git a/module/build/view/view.html.php b/module/build/view/view.html.php index 2a5406e30f..e4ad7a3649 100644 --- a/module/build/view/view.html.php +++ b/module/build/view/view.html.php @@ -102,7 +102,7 @@ tfoot tr td .table-actions .btn{display:none;} - + @@ -162,7 +162,7 @@ tfoot tr td .table-actions .btn{display:none;} - + diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 7590afad4a..113a6244f9 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -46,7 +46,7 @@ $lang->goback = 'Back'; $lang->goPC = 'PC'; $lang->more = 'More'; $lang->day = 'Day'; -$lang->customConfig = 'Custom'; +$lang->customConfig = 'Custom Configuration'; $lang->public = 'Public'; $lang->trunk = 'Trunk'; $lang->sort = 'Order'; @@ -86,14 +86,14 @@ $lang->loading = 'Loading...'; $lang->notFound = 'Not found!'; $lang->showAll = '[[Show All]]'; -$lang->future = 'Pending'; -$lang->year = 'Year'; -$lang->workingHour = 'Hour'; +$lang->future = 'Pending'; +$lang->year = 'Year'; +$lang->workingHour = 'Hour'; $lang->idAB = 'ID'; $lang->priAB = 'P'; $lang->statusAB = 'Status'; -$lang->openedByAB = 'Created by'; +$lang->openedByAB = 'Creator'; $lang->assignedToAB = 'Assignee'; $lang->typeAB = 'Type'; @@ -102,14 +102,14 @@ $lang->common->common = 'Common Module'; /* 主导航菜单。*/ $lang->menu = new stdclass(); -$lang->menu->my = 'Dashboard|my|index'; -$lang->menu->product = $lang->productCommon . '|product|index'; -$lang->menu->project = $lang->projectCommon . '|project|index'; -$lang->menu->qa = 'QA|qa|index'; -$lang->menu->doc = 'Doc|doc|index'; -$lang->menu->report = 'Report|report|index'; -$lang->menu->company = 'Company|company|index'; -$lang->menu->admin = 'Admin|admin|index'; +$lang->menu->my = 'Dashboard|my|index'; +$lang->menu->product = $lang->productCommon . '|product|index'; +$lang->menu->project = $lang->projectCommon . '|project|index'; +$lang->menu->qa = 'QA|qa|index'; +$lang->menu->doc = 'Doc|doc|index'; +$lang->menu->report = 'Report|report|index'; +$lang->menu->company = 'Company|company|index'; +$lang->menu->admin = 'Admin|admin|index'; /* 查询条中可以选择的对象列表。*/ $lang->searchObjects['bug'] = 'Bug'; @@ -145,12 +145,12 @@ $lang->exportTypeList['selected'] = 'Selected'; $lang->lang = 'Language'; /* 风格列表。*/ -$lang->theme = 'Theme'; -$lang->themes['default'] = 'Default'; -$lang->themes['green'] = 'Green'; -$lang->themes['red'] = 'Red'; -$lang->themes['lightblue'] = 'Bright Blue'; -$lang->themes['blackberry'] = 'Blackberry'; +$lang->theme = 'Theme'; +$lang->themes['default'] = 'Default'; +$lang->themes['green'] = 'Green'; +$lang->themes['red'] = 'Red'; +$lang->themes['lightblue'] = 'Bright Blue'; +$lang->themes['blackberry'] = 'Blackberry'; /* 首页菜单设置。*/ $lang->index = new stdclass(); @@ -165,7 +165,7 @@ $lang->my->menu = new stdclass(); $lang->my->menu->account = array('link' => ' %s' . $lang->arrow . '', 'fixed' => true); $lang->my->menu->index = 'Home|my|index'; -$lang->my->menu->todo = array('link' => 'To-Do|my|todo|', 'subModule' => 'todo'); +$lang->my->menu->todo = array('link' => 'Todo|my|todo|', 'subModule' => 'todo'); $lang->my->menu->task = array('link' => 'Task|my|task|', 'subModule' => 'task'); $lang->my->menu->bug = array('link' => 'Bug|my|bug|', 'subModule' => 'bug'); $lang->my->menu->testtask = array('link' => 'Test Task|my|testtask|', 'subModule' => 'testcase,testtask', 'alias' => 'testcase'); @@ -187,20 +187,20 @@ $lang->score->menu = $lang->my->menu; $lang->product = new stdclass(); $lang->product->menu = new stdclass(); -$lang->product->menu->list = array('link' => '%s', 'fixed' => true); -$lang->product->menu->story = array('link' => 'Story|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); -$lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s'; -$lang->product->menu->plan = array('link' => 'Plan|productplan|browse|productID=%s', 'subModule' => 'productplan'); -$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release'); -$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s'; -$lang->product->menu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); -$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; -$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story'; -$lang->product->menu->view = array('link' => 'Overview|product|view|productID=%s', 'alias' => 'edit'); -$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; -$lang->product->menu->create = array('link' => " Add{$lang->productCommon}|product|create", 'float' => 'right'); -$lang->product->menu->all = array('link' => " All{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); -$lang->product->menu->index = array('link' => "{$lang->productCommon}|product|index|locate=no", 'float' => 'right'); +$lang->product->menu->list = array('link' => '%s', 'fixed' => true); +$lang->product->menu->story = array('link' => 'Story|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); +$lang->product->menu->dynamic = 'Dynamic|product|dynamic|productID=%s'; +$lang->product->menu->plan = array('link' => 'Plan|productplan|browse|productID=%s', 'subModule' => 'productplan'); +$lang->product->menu->release = array('link' => 'Release|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap = 'Roadmap|product|roadmap|productID=%s'; +$lang->product->menu->doc = array('link' => 'Doc|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); +$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; +$lang->product->menu->module = 'Module|tree|browse|productID=%s&view=story'; +$lang->product->menu->view = array('link' => 'Overview|product|view|productID=%s', 'alias' => 'edit'); +$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; +$lang->product->menu->create = array('link' => " Add{$lang->productCommon}|product|create", 'float' => 'right'); +$lang->product->menu->all = array('link' => " All{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); +$lang->product->menu->index = array('link' => "{$lang->productCommon}|product|index|locate=no", 'float' => 'right'); $lang->story = new stdclass(); $lang->productplan = new stdclass(); @@ -216,20 +216,20 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'fixed' => true); -$lang->project->menu->task = array('link' => 'Task|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); -$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; -$lang->project->menu->dynamic = 'Dynamic|project|dynamic|projectID=%s'; -$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => 'Test Task|project|testtask|projectID=%s'); -$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); -$lang->project->menu->create = array('link' => " Add {$lang->projectCommon}|project|create", 'float' => 'right'); -$lang->project->menu->all = array('link' => " All {$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); -$lang->project->menu->index = array('link' => "{$lang->projectCommon}|project|index|locate=no", 'float' => 'right'); +$lang->project->menu->list = array('link' => '%s', 'fixed' => true); +$lang->project->menu->task = array('link' => 'Task|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); +$lang->project->menu->story = array('link' => 'Story|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; +$lang->project->menu->dynamic = 'Dynamic|project|dynamic|projectID=%s'; +$lang->project->menu->build = array('link' => 'Build|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => 'Test Task|project|testtask|projectID=%s'); +$lang->project->menu->team = array('link' => 'Team|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->doc = array('link' => 'Doc|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->view = array('link' => 'Overview|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); +$lang->project->menu->create = array('link' => " Add {$lang->projectCommon}|project|create", 'float' => 'right'); +$lang->project->menu->all = array('link' => " All {$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); +$lang->project->menu->index = array('link' => "{$lang->projectCommon}|project|index|locate=no", 'float' => 'right'); $lang->task = new stdclass(); $lang->build = new stdclass(); @@ -296,9 +296,9 @@ $lang->caselib->menu->index = array('link' => "Test $lang->doc = new stdclass(); $lang->doc->menu = new stdclass(); -$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->create = array('link' => ' Add Doc Lib|doc|createLib', 'float' => 'right'); +$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->create = array('link' => ' Add Doc Lib|doc|createLib', 'float' => 'right'); /* 统计视图菜单设置。*/ $lang->report = new stdclass(); @@ -336,17 +336,17 @@ $lang->user->menu = $lang->company->menu; /* 后台管理菜单设置。*/ $lang->admin = new stdclass(); $lang->admin->menu = new stdclass(); -$lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); +$lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); -$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); -$lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail'); -$lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); -$lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak'); -$lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); -$lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action'); -$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); -$lang->admin->menu->api = array('link' => 'API|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); -$lang->admin->menu->sso = 'RangerTeam|admin|sso'; +$lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); +$lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail'); +$lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); +$lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak'); +$lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); +$lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action'); +$lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); +$lang->admin->menu->api = array('link' => 'API|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); +$lang->admin->menu->sso = 'RangerTeam|admin|sso'; $lang->convert = new stdclass(); $lang->upgrade = new stdclass(); @@ -454,7 +454,7 @@ $lang->error->entry['SESSION_VERIFY_FAILED'] = 'Session verification failed.'; /* 分页信息。*/ $lang->pager = new stdclass(); -$lang->pager->noRecord = "No History"; +$lang->pager->noRecord = "No Records"; $lang->pager->digest = " %s in total. %s %s/%s   "; $lang->pager->recPerPage = " %s per page"; $lang->pager->first = ""; @@ -466,32 +466,32 @@ $lang->pager->previousPage = "Prev"; $lang->pager->nextPage = "Next"; $lang->pager->summery = "%s-%s of %s."; -$lang->proVersion = "ZenTao Pro   "; -$lang->downNotify = "Download Desktop Notification"; +$lang->proVersion = "ZenTao Pro   "; +$lang->downNotify = "Download Desktop Notification"; $lang->website = "http://www.zentao.pm"; $lang->suhosinInfo = "Warning! Data is reaching the limit. Please change sohusin.post.max_vars and sohusin.request.max_vars (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved."; $lang->maxVarsInfo = "Warning! Data is reaching the limit. Please change max_input_vars (set larger %s value) in php.ini, then save and restart Apache or php-fpm, or some data will not be saved."; -$lang->pasteTextInfo = "Paste text here. Each line will be a header of each data record. "; +$lang->pasteTextInfo = "Paste text here. Each line will be the title of each record. "; $lang->noticeImport = "

      Imported data contains data that has already existed in system. Please confirm you actions on the date

      Override New Insertion

      "; -$lang->noResultsMatch = "No results match!"; -$lang->searchMore = "More results:"; -$lang->chooseUsersToMail = "Choose users that will be notified."; -$lang->browserNotice = 'Your current browser might not show the best effect. Please use Chrome, Firefox, IE9+, Opera or Safari.'; -$lang->noticePasteImg = "Paste image here."; +$lang->noResultsMatch = "No results match!"; +$lang->searchMore = "More results:"; +$lang->chooseUsersToMail = "Choose users that will be notified."; +$lang->browserNotice = 'Your current browser might not show the best effect. Please use Chrome, Firefox, IE9+, Opera or Safari.'; +$lang->noticePasteImg = "Support pasting images."; /* 时间格式设置。*/ -if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); -if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); -if(!defined('DT_MONTHTIME1')) define('DT_MONTHTIME1', 'n/d H:i'); -if(!defined('DT_MONTHTIME2')) define('DT_MONTHTIME2', 'n/d H:i'); -if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); -if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); -if(!defined('DT_DATE3')) define('DT_DATE3', 'Y/m/d'); -if(!defined('DT_DATE4')) define('DT_DATE4', 'n/j'); -if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); -if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); +if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); +if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); +if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i'); +if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n/d H:i'); +if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); +if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); +if(!defined('DT_DATE3')) define('DT_DATE3', 'Y/m/d'); +if(!defined('DT_DATE4')) define('DT_DATE4', 'n/j'); +if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); +if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); /* datepicker 时间*/ $lang->datepicker = new stdclass(); @@ -609,7 +609,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyStory') /* Adjust sub menu of product module. */ unset($lang->product->menu->project); unset($lang->product->menu->doc); - + /* Rename product module. */ $lang->menu->product = "{$lang->productCommon}|product|index"; @@ -762,15 +762,15 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->testtask->menu->report = array('link' => 'Report|testreport|browse'); $lang->testtask->menu->create = array('link' => " Create|testtask|create|productID=%s", 'float' => 'right'); - $lang->testtask->menuOrder[5] = 'product'; - $lang->testtask->menuOrder[10] = 'scope'; - $lang->testtask->menuOrder[15] = 'wait'; - $lang->testtask->menuOrder[20] = 'doing'; - $lang->testtask->menuOrder[25] = 'blocked'; - $lang->testtask->menuOrder[30] = 'done'; - $lang->testtask->menuOrder[35] = 'totalStatus'; - $lang->testtask->menuOrder[40] = 'report'; - $lang->testtask->menuOrder[45] = 'create'; + $lang->testtask->menuOrder[5] = 'product'; + $lang->testtask->menuOrder[10] = 'scope'; + $lang->testtask->menuOrder[15] = 'wait'; + $lang->testtask->menuOrder[20] = 'doing'; + $lang->testtask->menuOrder[25] = 'blocked'; + $lang->testtask->menuOrder[30] = 'done'; + $lang->testtask->menuOrder[35] = 'totalStatus'; + $lang->testtask->menuOrder[40] = 'report'; + $lang->testtask->menuOrder[45] = 'create'; $lang->testreport->menu = $lang->testtask->menu; $lang->testreport->menuOrder = $lang->testtask->menuOrder; @@ -807,7 +807,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->build->menu = $lang->product->menu; $lang->build->menuOrder = $lang->product->menuOrder; - + /* Adjust menu group. */ $lang->menugroup->bug = 'bug'; $lang->menugroup->testcase = 'testcase'; @@ -815,8 +815,8 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->menugroup->testsuite = 'testsuite'; $lang->menugroup->testreport = 'testtask'; $lang->menugroup->build = 'product'; - - /* Adjust search objects. */ + + /* Adjust search objects. */ unset($lang->searchObjects['story']); unset($lang->searchObjects['task']); unset($lang->searchObjects['release']); diff --git a/module/company/lang/en.php b/module/company/lang/en.php index 94d6b0e864..06eb84d09a 100644 --- a/module/company/lang/en.php +++ b/module/company/lang/en.php @@ -11,25 +11,25 @@ */ $lang->company->common = 'Company'; $lang->company->index = "Home"; -$lang->company->edit = "Edit"; -$lang->company->view = "Info"; +$lang->company->edit = "Edit Company"; +$lang->company->view = "Company Info"; $lang->company->browse = "User List"; $lang->company->dynamic = "Dynamic"; $lang->company->orgView = 'View'; -$lang->company->name = 'Company Name'; +$lang->company->name = 'Name'; $lang->company->phone = 'Phone'; $lang->company->fax = 'Fax'; $lang->company->address = 'Mailing Address'; $lang->company->zipcode = 'Zip Code'; $lang->company->website = 'Website'; $lang->company->backyard = 'Intranet'; -$lang->company->guest = 'Guest Login'; +$lang->company->guest = 'Anonymous Login'; $lang->company->admins = 'Administrators'; $lang->company->product = $lang->productCommon; $lang->company->project = $lang->projectCommon; $lang->company->user = 'User'; -$lang->company->guestOptions[0] = 'Off'; -$lang->company->guestOptions[1] = 'On'; +$lang->company->guestOptions[0] = 'Deny'; +$lang->company->guestOptions[1] = 'Allow'; diff --git a/module/company/view/edit.html.php b/module/company/view/edit.html.php index 9984d80b42..bb0d58468d 100644 --- a/module/company/view/edit.html.php +++ b/module/company/view/edit.html.php @@ -20,7 +20,7 @@
      bug->assignedTo;?>bug->assignBug;?> assignedTo, "class='form-control chosen'");?>
      story->title;?> openedByAB;?> assignedToAB;?> story->estimateAB;?> story->estimateAB;?> statusAB;?> story->stageAB;?> story->stageAB;?>
      story->estimateAB);?> statusAB);?> story->stageAB);?> actions?> actions?>
      bug->openedDateAB);?> bug->resolvedByAB);?> bug->resolvedDateAB);?> actions?> actions?>
      - + diff --git a/module/company/view/view.html.php b/module/company/view/view.html.php index cad834d888..2694dec2f0 100644 --- a/module/company/view/view.html.php +++ b/module/company/view/view.html.php @@ -20,7 +20,7 @@
      company->name;?>company->name;?> name, "class='form-control' autocomplete='off'");?>
      - + diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index 07ab03f68a..1f830c8b6e 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -5,9 +5,9 @@ $lang->custom->set = 'Customize'; $lang->custom->restore = 'Reset to Default'; $lang->custom->key = 'Key'; $lang->custom->value = 'Value'; -$lang->custom->flow = 'Process'; -$lang->custom->working = 'Working'; -$lang->custom->select = 'Select Process'; +$lang->custom->flow = 'Workflow'; +$lang->custom->working = 'WorkStyle'; +$lang->custom->select = 'Select Workflow'; $lang->custom->branch = 'Multi Branch'; $lang->custom->owner = 'Owner'; $lang->custom->module = 'Module'; @@ -23,25 +23,25 @@ $lang->custom->object['task'] = 'Task'; $lang->custom->object['bug'] = 'Bug'; $lang->custom->object['testcase'] = 'Case'; $lang->custom->object['testtask'] = 'Build'; -$lang->custom->object['todo'] = 'To-Dos'; +$lang->custom->object['todo'] = 'Todo'; $lang->custom->object['user'] = 'User'; -$lang->custom->object['block'] = 'Block'; +$lang->custom->object['block'] = 'ClosedBlock'; $lang->custom->story = new stdClass(); $lang->custom->story->fields['priList'] = 'Priority'; $lang->custom->story->fields['sourceList'] = 'Source'; -$lang->custom->story->fields['reasonList'] = 'Reason'; +$lang->custom->story->fields['reasonList'] = 'Close Reason'; $lang->custom->story->fields['stageList'] = 'Stage'; $lang->custom->story->fields['statusList'] = 'Status'; -$lang->custom->story->fields['reviewResultList'] = 'Result'; -$lang->custom->story->fields['review'] = 'Review'; +$lang->custom->story->fields['reviewResultList'] = 'Review Result'; +$lang->custom->story->fields['review'] = 'Review Required'; $lang->custom->task = new stdClass(); $lang->custom->task->fields['priList'] = 'Priority'; $lang->custom->task->fields['typeList'] = 'Type'; -$lang->custom->task->fields['reasonList'] = 'Reason'; +$lang->custom->task->fields['reasonList'] = 'Close Reason'; $lang->custom->task->fields['statusList'] = 'Status'; -$lang->custom->task->fields['hours'] = 'Working hours'; +$lang->custom->task->fields['hours'] = 'Man-hours'; $lang->custom->bug = new stdClass(); $lang->custom->bug->fields['priList'] = 'Priority'; @@ -51,7 +51,7 @@ $lang->custom->bug->fields['browserList'] = 'Browser'; $lang->custom->bug->fields['typeList'] = 'Type'; $lang->custom->bug->fields['resolutionList'] = 'Solution'; $lang->custom->bug->fields['statusList'] = 'Status'; -$lang->custom->bug->fields['longlife'] = 'Long Life Days'; +$lang->custom->bug->fields['longlife'] = 'Shelved Days'; $lang->custom->testcase = new stdClass(); $lang->custom->testcase->fields['priList'] = 'Priority'; @@ -59,7 +59,7 @@ $lang->custom->testcase->fields['typeList'] = 'Type'; $lang->custom->testcase->fields['stageList'] = 'Stage'; $lang->custom->testcase->fields['resultList'] = 'Result'; $lang->custom->testcase->fields['statusList'] = 'Status'; -$lang->custom->testcase->fields['review'] = 'Review'; +$lang->custom->testcase->fields['review'] = 'Review Required'; $lang->custom->testtask = new stdClass(); $lang->custom->testtask->fields['priList'] = 'Priority'; @@ -84,10 +84,10 @@ $lang->custom->confirmRestore = 'Do you want to reset to Default?'; $lang->custom->notice = new stdclass(); $lang->custom->notice->userRole = 'Key must be no more than 20 characters!'; -$lang->custom->notice->canNotAdd = 'This item will be processed, so customized feature is not enabled.'; -$lang->custom->notice->forceReview = 'Review is required for %s submitted by certain assignee.'; -$lang->custom->notice->forceNotReview = "Not review is required for %s submitted by certain assignee."; -$lang->custom->notice->longlife = 'List "Undone" bugs that are older than hold days from "Longlife" bugs.'; +$lang->custom->notice->canNotAdd = 'These items are parameters of calculation, so customized creation is not enabled.'; +$lang->custom->notice->forceReview = '%s Review is required for certain submitters.'; +$lang->custom->notice->forceNotReview = "%s Review is NOT required for certain submitters."; +$lang->custom->notice->longlife = 'Define shelved bugs.'; $lang->custom->notice->priListKey = 'Priority list key should be numbers!'; $lang->custom->notice->keyList = 'key should be English or digital!'; $lang->custom->notice->severityListKey = 'Bug severity list key should be numbers.'; @@ -96,7 +96,7 @@ $lang->custom->notice->indexPage['project'] = "ZenTao 8.2+ has Project Homepage. $lang->custom->notice->indexPage['qa'] = "ZenTao 8.2+ has QA Homepage. Do you want to go to QA Homepage?"; $lang->custom->storyReview = 'Review'; -$lang->custom->forceReview = 'Review Required'; +$lang->custom->forceReview = 'Selective Review'; $lang->custom->forceNotReview = 'No review'; $lang->custom->reviewList[1] = 'On'; $lang->custom->reviewList[0] = 'Off'; @@ -116,10 +116,10 @@ $lang->custom->productProject->relation['1_1'] = 'Project - Sprint'; $lang->custom->productProject->notice = 'Please select according to your team.'; -$lang->custom->workingList['full'] = 'Full'; -$lang->custom->workingList['onlyTest'] = 'Test'; -$lang->custom->workingList['onlyStory'] = 'Story'; -$lang->custom->workingList['onlyTask'] = 'Task'; +$lang->custom->workingList['full'] = 'Full Management of Dev'; +$lang->custom->workingList['onlyTest'] = 'Test Management'; +$lang->custom->workingList['onlyStory'] = 'Story Management'; +$lang->custom->workingList['onlyTask'] = 'Task Management'; $lang->custom->menuTip = 'Click to show/hide navigation bar. Drag to swtich display order.'; $lang->custom->saveFail = 'Failed to save!'; diff --git a/module/custom/view/set.html.php b/module/custom/view/set.html.php index 726474c997..49458f5d5d 100644 --- a/module/custom/view/set.html.php +++ b/module/custom/view/set.html.php @@ -115,7 +115,7 @@ EOT;
      company->name;?>company->name;?> name;?>
      - + diff --git a/module/datatable/lang/en.php b/module/datatable/lang/en.php index 099a89c79e..27e72fcff3 100644 --- a/module/datatable/lang/en.php +++ b/module/datatable/lang/en.php @@ -8,8 +8,8 @@ $lang->datatable->reset = 'Reset'; $lang->datatable->custom = 'Custom Columns'; $lang->datatable->customTip = 'Check Columns to Display'; -$lang->datatable->switchToTable = 'Switch to Table'; -$lang->datatable->switchToDatatable = 'Switch to Datatable'; +$lang->datatable->switchToTable = 'Switch to Common Table'; +$lang->datatable->switchToDatatable = 'Switch to Advanced Table'; $lang->datatable->required = 'Required'; $lang->datatable->confirmReset = 'Do you want to restore the default settings?'; $lang->datatable->setGlobal = 'Global'; @@ -18,7 +18,7 @@ $lang->datatable->resetGlobal = 'Reset Global Default'; $lang->datatable->branch = 'Branch'; $lang->datatable->platform = 'Platform'; -$lang->datatable->showModule = 'Show/Hide Module Name'; +$lang->datatable->showModule = 'Show/Hide module name'; $lang->datatable->showModuleList[] = 'N/A'; $lang->datatable->showModuleList['base'] = 'Base Node'; $lang->datatable->showModuleList['end'] = 'End Node'; diff --git a/module/dept/lang/en.php b/module/dept/lang/en.php index 3b8801e1a4..b35d0c2bb6 100644 --- a/module/dept/lang/en.php +++ b/module/dept/lang/en.php @@ -10,15 +10,15 @@ * @link http://www.zentao.net */ $lang->dept->common = 'Department'; -$lang->dept->manageChild = "Children"; +$lang->dept->manageChild = "Child Department"; $lang->dept->edit = "Edit"; $lang->dept->delete = "Delete"; $lang->dept->parent = "Parent"; $lang->dept->manager = "Manager"; $lang->dept->name = "Dept Name"; -$lang->dept->browse = "Departments"; +$lang->dept->browse = "Manage"; $lang->dept->manage = "Maintain Dept"; -$lang->dept->updateOrder = "Update/Order"; +$lang->dept->updateOrder = "Sort"; $lang->dept->add = "Add Dept"; $lang->dept->dragAndSort = "Drag and Sort"; diff --git a/module/dev/lang/en.php b/module/dev/lang/en.php index 560b414418..92ac52554e 100644 --- a/module/dev/lang/en.php +++ b/module/dev/lang/en.php @@ -53,7 +53,7 @@ $lang->dev->tableList['team'] = 'Team'; $lang->dev->tableList['testresult'] = 'Testing Result'; $lang->dev->tableList['testrun'] = 'Run Testing '; $lang->dev->tableList['testtask'] = 'Test Task'; -$lang->dev->tableList['todo'] = 'To-Do'; +$lang->dev->tableList['todo'] = 'Todo'; $lang->dev->tableList['user'] = 'User'; $lang->dev->tableList['usercontact'] = 'User Contact'; $lang->dev->tableList['usergroup'] = 'User Group'; diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php index 3d17d4127c..66d46a32dc 100644 --- a/module/doc/lang/en.php +++ b/module/doc/lang/en.php @@ -24,10 +24,10 @@ $lang->doc->content = 'Text'; $lang->doc->keywords = 'Keywords'; $lang->doc->url = 'URL'; $lang->doc->files = 'File'; -$lang->doc->addedBy = 'Added By'; -$lang->doc->addedDate = 'Added Date'; -$lang->doc->editedBy = 'Edited By'; -$lang->doc->editedDate = 'Edited Date'; +$lang->doc->addedBy = 'Creator'; +$lang->doc->addedDate = 'Create Date'; +$lang->doc->editedBy = 'Edit By'; +$lang->doc->editedDate = 'Edit Date'; $lang->doc->version = 'Version'; $lang->doc->basicInfo = 'Basic Info'; $lang->doc->deleted = 'Deleted'; @@ -45,22 +45,22 @@ $lang->doc->groups = 'Groups'; $lang->doc->users = 'Users'; $lang->doc->moduleDoc = 'By Module'; -$lang->doc->searchDoc = 'By Search'; +$lang->doc->searchDoc = 'Search'; $lang->doc->allDoc = 'All'; -$lang->doc->openedByMe = 'Opened By Me'; +$lang->doc->openedByMe = 'My'; $lang->doc->orderByOpen = 'Recently Added'; $lang->doc->orderByEdit = 'Recently Modifie'; /* 方法列表。*/ $lang->doc->index = 'Home'; -$lang->doc->create = 'Create'; +$lang->doc->create = 'Create Doc'; $lang->doc->edit = 'Edit'; $lang->doc->delete = 'Delete'; $lang->doc->browse = 'List'; $lang->doc->view = 'Details'; $lang->doc->diff = 'Diff'; $lang->doc->sort = 'Sort'; -$lang->doc->manageType = 'Manage Category'; +$lang->doc->manageType = 'Manage category'; $lang->doc->editType = 'Edit'; $lang->doc->deleteType = 'Delete'; $lang->doc->addType = 'Add'; @@ -74,8 +74,8 @@ $lang->doc->createLib = 'Create Library'; $lang->doc->allLibs = 'Libraries'; $lang->doc->objectLibs = "{$lang->productCommon}/{$lang->projectCommon} Library List"; $lang->doc->showFiles = 'File Library'; -$lang->doc->editLib = 'Edit'; -$lang->doc->deleteLib = 'Delete'; +$lang->doc->editLib = 'Edit Library'; +$lang->doc->deleteLib = 'Delete Library'; $lang->doc->fixedMenu = 'Fixed In Menu'; $lang->doc->removeMenu = 'Remove From Menu'; $lang->doc->search = 'Search'; @@ -84,8 +84,8 @@ $lang->doc->search = 'Search'; $lang->doc->allProduct = 'All' . $lang->productCommon; $lang->doc->allProject = 'All' . $lang->projectCommon; -$lang->doc->libTypeList['product'] = $lang->productCommon . ' Library'; -$lang->doc->libTypeList['project'] = $lang->projectCommon . ' Library'; +$lang->doc->libTypeList['product'] = $lang->productCommon . ' Scope'; +$lang->doc->libTypeList['project'] = $lang->projectCommon . ' Scope'; $lang->doc->libTypeList['custom'] = 'Custom Library'; $lang->doc->systemLibs['product'] = $lang->productCommon . 'Doc Lib'; @@ -127,14 +127,14 @@ $lang->doc->placeholder->url = 'Url'; $lang->doclib = new stdclass(); $lang->doclib->name = 'Name'; -$lang->doclib->control = 'Privilege'; +$lang->doclib->control = 'Access Control'; $lang->doclib->group = 'Group'; $lang->doclib->user = 'User'; $lang->doclib->files = 'Files'; -$lang->doclib->all = 'All'; +$lang->doclib->all = 'All Library'; $lang->doclib->select = 'Select'; $lang->doclib->project = $lang->projectCommon . ' Library'; $lang->doclib->product = $lang->productCommon . ' Library'; -$lang->doclib->main['product'] = $lang->productCommon . ' Main'; -$lang->doclib->main['project'] = $lang->projectCommon . ' Main'; +$lang->doclib->main['product'] = 'Main Lib'; +$lang->doclib->main['project'] = 'Main Lib'; diff --git a/module/editor/lang/en.php b/module/editor/lang/en.php index a6bd08f16d..d8bb227313 100644 --- a/module/editor/lang/en.php +++ b/module/editor/lang/en.php @@ -69,7 +69,7 @@ $lang->editor->modules['story'] = 'Story'; $lang->editor->modules['task'] = 'Task'; $lang->editor->modules['testcase'] = 'Case'; $lang->editor->modules['testtask'] = 'Test Task'; -$lang->editor->modules['todo'] = 'To-Do'; +$lang->editor->modules['todo'] = 'Todo'; $lang->editor->modules['tree'] = 'Module'; $lang->editor->modules['upgrade'] = 'Upgrade'; $lang->editor->modules['user'] = 'User'; diff --git a/module/file/lang/en.php b/module/file/lang/en.php index 48ee394ecc..9e5a8fa7ea 100644 --- a/module/file/lang/en.php +++ b/module/file/lang/en.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ $lang->file = new stdclass(); -$lang->file->common = 'Attachment'; +$lang->file->common = 'File'; $lang->file->uploadImages = 'Batch Upload Images'; $lang->file->download = 'Download Files'; $lang->file->uploadDate = 'Uploaded on'; @@ -26,16 +26,16 @@ $lang->file->exportFields = "Fileds to be Exported"; $lang->file->defaultTPL = "Default Template"; $lang->file->setExportTPL = "Settings"; $lang->file->preview = "Preview"; -$lang->file->addFile = 'Add File'; -$lang->file->beginUpload = 'Start uploading'; -$lang->file->uploadSuccess = 'uploaded Successfully'; +$lang->file->addFile = 'Add'; +$lang->file->beginUpload = 'Upload'; +$lang->file->uploadSuccess = 'Uploaded!'; $lang->file->pathname = 'Path Name'; $lang->file->title = 'Title'; $lang->file->extension = 'Extension'; $lang->file->size = 'Size'; $lang->file->addedBy = 'Added By'; -$lang->file->addedDate = 'Added Date'; +$lang->file->addedDate = 'Added On'; $lang->file->downloads = 'Downloads'; $lang->file->extra = 'Extra'; @@ -50,4 +50,4 @@ $lang->file->errorFileMove = " Uploading failed, there was an error when movi $lang->file->dangerFile = " File has been rejected to upload for security issues."; $lang->file->errorSuffix = 'Format is incorrect. .zip files ONLY!'; $lang->file->errorExtract = 'Extracting file failed. File might be damaged or invalid files in the zip package.'; -$lang->file->uploadImagesExplain = 'Note: please upload "jpg, jpeg, gif, png" format of the picture, the program will use the file name as the title, the picture as content.'; +$lang->file->uploadImagesExplain = 'Note: upload .jpg, .jpeg, .gif, and .png images. The image name will be taken as the title of the story and the image as its content.'; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index af75a14132..fb4dbf69aa 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -9,25 +9,25 @@ * @version $Id: en.php 4719 2013-05-03 02:20:28Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->group->common = 'Privileges'; -$lang->group->browse = 'Groups'; -$lang->group->create = 'Add a Group'; +$lang->group->common = 'Groups'; +$lang->group->browse = 'Browse Groups'; +$lang->group->create = 'Create Group'; $lang->group->edit = 'Edit'; $lang->group->copy = 'Copy'; $lang->group->delete = 'Delete'; -$lang->group->manageView = 'View'; -$lang->group->managePriv = 'Privileges'; -$lang->group->managePrivByGroup = 'Assign by Groups'; -$lang->group->managePrivByModule = 'Assign by Modules'; +$lang->group->manageView = 'Object Privilege'; +$lang->group->managePriv = 'Batch Assign Operations'; +$lang->group->managePrivByGroup = 'Operation Privilege'; +$lang->group->managePrivByModule = 'Batch Assign Operations'; $lang->group->byModuleTips = '(Press shift/control to multi select)'; $lang->group->manageMember = 'Members'; $lang->group->confirmDelete = 'Do you want to delete this User Group?'; $lang->group->successSaved = 'Saved!'; $lang->group->errorNotSaved = 'Not saved. Please select actions and groups.'; -$lang->group->viewList = 'Access List'; -$lang->group->productList = 'Access is allowed.' . $lang->productCommon; -$lang->group->projectList = 'Access is allowed.' . $lang->projectCommon; -$lang->group->noticeVisit = 'N/A means access is not restricted.'; +$lang->group->viewList = 'Views can be accessed'; +$lang->group->productList = 'Products can be accessed'; +$lang->group->projectList = 'Projects can be accessed'; +$lang->group->noticeVisit = 'Empty means All.'; $lang->group->id = 'ID'; $lang->group->name = 'Name'; @@ -36,8 +36,8 @@ $lang->group->role = 'Role'; $lang->group->acl = 'Right'; $lang->group->users = 'Users'; $lang->group->module = 'Module'; -$lang->group->method = 'Method'; -$lang->group->priv = 'P'; +$lang->group->method = 'Operation'; +$lang->group->priv = 'Group'; $lang->group->option = 'Option'; $lang->group->inside = 'Group Users'; $lang->group->outside = 'Other Users'; diff --git a/module/install/lang/en.php b/module/install/lang/en.php index 339345f73c..c95bab54a1 100644 --- a/module/install/lang/en.php +++ b/module/install/lang/en.php @@ -23,7 +23,7 @@ $lang->install->seeLatestRelease = 'View Latest Version'; $lang->install->welcome = 'Welcome to ZenTao Project Management Software!'; $lang->install->license = 'ZenTao PMS is under Z PUBLIC LICENSE(ZPL) 1.2'; $lang->install->desc = <<ZPL. It us an open source and free project management software, integrated with Product Management、Project Management、QA Management, as weel as To-Dos Management, Company Managementetc, which is the best choice for small and medium organizations to manage projects. +ZenTao Project Management Software (ZenTao PMS) is originated in China and under ZPL. It us an open source and free project management software, integrated with Product Management、Project Management、QA Management, as weel as Todo Management, Company Managementetc, which is the best choice for small and medium organizations to manage projects. ZenTao PMS uses PHP + MySQL as programming langugages and is based on ZenTaoPHP, an independent framwork developed by our team. Third party developers/organizations can develop extensions or customization tailored to their needs. EOT; @@ -100,10 +100,10 @@ $lang->install->working = 'Working way'; $lang->install->requestTypes['GET'] = 'GET'; $lang->install->requestTypes['PATH_INFO'] = 'PATH_INFO'; -$lang->install->workingList['full'] = 'Full'; -$lang->install->workingList['onlyTest'] = 'Only Test'; -$lang->install->workingList['onlyStory'] = 'Only Story'; -$lang->install->workingList['onlyTask'] = 'Only Task'; +$lang->install->workingList['full'] = 'Full Management of Dev'; +$lang->install->workingList['onlyTest'] = 'Only Test Management'; +$lang->install->workingList['onlyStory'] = 'Only Story Management'; +$lang->install->workingList['onlyTask'] = 'Only Task Management'; $lang->install->errorConnectDB = 'Connection to database Failed. '; $lang->install->errorDBName = 'Database name should exclude “.” '; @@ -139,9 +139,9 @@ $lang->install->groupList['PO']['desc'] = 'for Product Owner'; $lang->install->groupList['TD']['name'] = 'Dev Manager'; $lang->install->groupList['TD']['desc'] = 'for Dev Manager'; $lang->install->groupList['PD']['name'] = 'PD'; -$lang->install->groupList['PD']['desc'] = 'for Product Director'; +$lang->install->groupList['PD']['desc'] = 'for Product Manager'; $lang->install->groupList['QD']['name'] = 'QD'; -$lang->install->groupList['QD']['desc'] = 'for QA Director'; +$lang->install->groupList['QD']['desc'] = 'for QA Manager'; $lang->install->groupList['TOP']['name'] = 'Senior'; $lang->install->groupList['TOP']['desc'] = 'for Senior Manager'; $lang->install->groupList['OTHERS']['name'] = 'Other'; @@ -185,7 +185,7 @@ $lang->install->chanzhi->desc = <<install->ranzhi = new stdclass(); -$lang->install->ranzhi->name = 'Ranger Collaborative System'; +$lang->install->ranzhi->name = 'Zdoo Collaborative System'; $lang->install->ranzhi->logo = 'images/main/zdoo_org.png'; $lang->install->ranzhi->url = 'http://www.zdoo.org'; $lang->install->ranzhi->desc = <<mail->sendcloudUser = 'Sync Contact'; $lang->mail->agreeLicense = 'Yes'; $lang->mail->disagree = 'No'; -$lang->mail->turnon = 'Turn On'; -$lang->mail->async = 'Asynchronous'; -$lang->mail->fromAddress = 'Email Address'; +$lang->mail->turnon = 'Turn On Mail'; +$lang->mail->async = 'Async Sending'; +$lang->mail->fromAddress = 'Sender Email'; $lang->mail->fromName = 'Sender'; -$lang->mail->domain = 'Domain'; +$lang->mail->domain = 'Zentao Domain'; $lang->mail->host = 'SMTP Server'; $lang->mail->port = 'SMTP Port'; -$lang->mail->auth = 'Acceptance Required'; +$lang->mail->auth = 'Validation Required'; $lang->mail->username = 'SMTP Account'; $lang->mail->password = 'SMTP Password'; -$lang->mail->secure = 'Secure'; -$lang->mail->debug = 'Debug'; +$lang->mail->secure = 'Encryption'; +$lang->mail->debug = 'Debug Level'; $lang->mail->charset = 'Charset'; $lang->mail->accessKey = 'Access Key'; $lang->mail->secretKey = 'Secret Key'; $lang->mail->license = 'ZenTao Cloud Notice'; -$lang->mail->selectMTA = 'Select MTA'; +$lang->mail->selectMTA = 'Select MTA(Mail Transfer Agent)'; $lang->mail->smtp = 'SMTP'; $lang->mail->syncedUser = 'Synchronized'; @@ -45,8 +45,8 @@ $lang->mail->remove = 'Remove'; $lang->mail->toList = 'Addressee'; $lang->mail->ccList = 'Copy to'; $lang->mail->subject = 'Subject'; -$lang->mail->createdBy = 'Sender'; -$lang->mail->createdDate = 'Added Date'; +$lang->mail->addedBy = 'Sender'; +$lang->mail->addedDate = 'Added Date'; $lang->mail->sendTime = 'Send Date'; $lang->mail->status = 'Status'; $lang->mail->failReason = 'Fail Reason'; @@ -73,7 +73,7 @@ $lang->mail->secureList['tls'] = 'tls'; $lang->mail->more = 'More'; $lang->mail->noticeResend = 'Sent it again!'; -$lang->mail->inputFromEmail = 'Enter Email Address'; +$lang->mail->inputFromEmail = 'Enter Sender Email'; $lang->mail->nextStep = 'Next'; $lang->mail->successSaved = 'Configuration has been saved.'; $lang->mail->testSubject = 'Testing Email'; @@ -95,7 +95,7 @@ $lang->mail->sendCloudHelp = <<mail->sendCloudSuccess = 'Done'; $lang->mail->closeSendCloud = 'Close'; -$lang->mail->addressWhiteList = 'Please add the email to the whilte list on email server to avoid be treated as spam'; +$lang->mail->addressWhiteList = 'Please add to the whilte list of email server to avoid being blocked'; $lang->mail->ztCloudNotice = <<mail->ztCloudNotice = <<mail->placeholder = new stdclass(); -$lang->mail->placeholder->password = 'Some mail needs to fill in the auth code, specific to the mailbox related settings query.'; +$lang->mail->placeholder->password = 'Some mail server needs auth code, refer to your mail supplier.'; diff --git a/module/mail/view/edit.html.php b/module/mail/view/edit.html.php index 7e5b43e58c..b42a8c1f6e 100755 --- a/module/mail/view/edit.html.php +++ b/module/mail/view/edit.html.php @@ -22,7 +22,7 @@ include '../../common/view/header.html.php'; ' id='dataform'>
      custom->user->fields['deleted'];?>custom->user->fields['deleted'];?> custom->deletedList, $showDeleted);?>
      - + diff --git a/module/my/lang/en.php b/module/my/lang/en.php index a5909c9093..35e6b0278f 100644 --- a/module/my/lang/en.php +++ b/module/my/lang/en.php @@ -3,37 +3,37 @@ $lang->my->common = 'Dashboard'; /* Method List。*/ $lang->my->index = 'Home'; -$lang->my->todo = 'My To-Dos'; -$lang->my->task = 'My Tasks'; -$lang->my->bug = 'My Bugs'; -$lang->my->testTask = 'My Builds'; -$lang->my->testCase = 'My Cases'; -$lang->my->story = 'My Stories'; -$lang->my->myProject = "My {$lang->projectCommon}s"; +$lang->my->todo = 'My Todo'; +$lang->my->task = 'My Task'; +$lang->my->bug = 'My Bug'; +$lang->my->testTask = 'My Build'; +$lang->my->testCase = 'My Case'; +$lang->my->story = 'My Story'; +$lang->my->myProject = "My {$lang->projectCommon}"; $lang->my->profile = 'My Profile'; $lang->my->dynamic = 'My Dynamic'; -$lang->my->editProfile = 'Edit'; +$lang->my->editProfile = 'Edit Profile'; $lang->my->changePassword = 'Edit Password'; $lang->my->unbind = 'Unbind Ranger'; $lang->my->manageContacts = 'Maintain Contact'; $lang->my->deleteContacts = 'Delete Contact'; -$lang->my->shareContacts = 'Share List'; +$lang->my->shareContacts = 'Share the list'; $lang->my->limited = 'Restricted operation (editing only content related to itself)'; $lang->my->score = 'My Score'; $lang->my->scoreRule = 'Score Rule'; $lang->my->taskMenu = new stdclass(); -$lang->my->taskMenu->assignedToMe = 'Assigned to Me'; -$lang->my->taskMenu->openedByMe = 'Created by Me'; -$lang->my->taskMenu->finishedByMe = 'Finished by Me'; -$lang->my->taskMenu->closedByMe = 'Closed by Me'; -$lang->my->taskMenu->canceledByMe = 'Cancelled by Me'; +$lang->my->taskMenu->assignedToMe = 'AssignedToMe'; +$lang->my->taskMenu->openedByMe = 'CreatedByMe'; +$lang->my->taskMenu->finishedByMe = 'FinishedByMe'; +$lang->my->taskMenu->closedByMe = 'ClosedByMe'; +$lang->my->taskMenu->canceledByMe = 'CancelledByMe'; $lang->my->storyMenu = new stdclass(); -$lang->my->storyMenu->assignedToMe = 'Assigned to Me'; -$lang->my->storyMenu->openedByMe = 'Created by Me'; -$lang->my->storyMenu->reviewedByMe = 'Reviewed by Me'; -$lang->my->storyMenu->closedByMe = 'Closed by Me'; +$lang->my->storyMenu->assignedToMe = 'AssignedToMe'; +$lang->my->storyMenu->openedByMe = 'CreatedByMe'; +$lang->my->storyMenu->reviewedByMe = 'ReviewedByMe'; +$lang->my->storyMenu->closedByMe = 'ClosedByMe'; $lang->my->home = new stdclass(); $lang->my->home->latest = 'Dynamic'; diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 2662684846..9e88ab4704 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -9,11 +9,11 @@ * @version $Id: en.php 5091 2013-07-10 06:06:46Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->product->common = $lang->productCommon . 'View'; +$lang->product->common = $lang->productCommon; $lang->product->index = $lang->productCommon . "Home"; $lang->product->browse = "Story List"; $lang->product->dynamic = "Dynamic"; -$lang->product->view = "{$lang->productCommon}s"; +$lang->product->view = "Overview"; $lang->product->edit = "Edit {$lang->productCommon}"; $lang->product->batchEdit = "Batch Edit"; $lang->product->create = "Create {$lang->productCommon}"; @@ -31,13 +31,13 @@ $lang->product->export = "Export"; $lang->product->basicInfo = 'Basic Info'; $lang->product->otherInfo = 'Other Info'; -$lang->product->plans = 'Plans'; -$lang->product->releases = 'Releases'; +$lang->product->plans = 'Plan'; +$lang->product->releases = 'Release'; $lang->product->docs = 'Doc'; $lang->product->bugs = 'Linked Bug'; $lang->product->projects = "Linked {$lang->projectCommon}"; -$lang->product->cases = 'Cases'; -$lang->product->builds = 'Builds'; +$lang->product->cases = 'Case'; +$lang->product->builds = 'Build'; $lang->product->roadmap = 'Roadmap'; $lang->product->doc = 'Doc'; $lang->product->project = $lang->projectCommon . 'List'; @@ -48,7 +48,7 @@ $lang->product->changedStories = 'Changed Story'; $lang->product->draftStories = 'Draft Story'; $lang->product->closedStories = 'Closed Story'; $lang->product->unResolvedBugs = 'Unresolved Bug'; -$lang->product->assignToNullBugs = 'No Assigned Bug'; +$lang->product->assignToNullBugs = 'Unassigned Bug'; $lang->product->confirmDelete = " Do you want to delete {$lang->productCommon}?"; @@ -64,27 +64,27 @@ $lang->product->type = "Type"; $lang->product->status = 'Status'; $lang->product->desc = 'Description'; $lang->product->PO = "PO"; -$lang->product->QD = 'QD'; -$lang->product->RD = 'RD'; -$lang->product->acl = 'Acceptance'; +$lang->product->QD = 'QA Manager'; +$lang->product->RD = 'Release Manager'; +$lang->product->acl = 'Access Control'; $lang->product->whitelist = 'Whitelist'; $lang->product->branch = '%s'; $lang->product->searchStory = 'Search'; -$lang->product->assignedToMe = 'Assigned to Me'; -$lang->product->openedByMe = 'Created by Me'; -$lang->product->reviewedByMe = 'Reviewed by Me'; -$lang->product->closedByMe = 'Closed by Me'; +$lang->product->assignedToMe = 'AssignedToMe'; +$lang->product->openedByMe = 'CreatedByMe'; +$lang->product->reviewedByMe = 'ReviewedByMe'; +$lang->product->closedByMe = 'ClosedByMe'; $lang->product->draftStory = 'Draft'; -$lang->product->activeStory = 'Activate'; +$lang->product->activeStory = 'Activated'; $lang->product->changedStory = 'Changed'; -$lang->product->willClose = 'To be Closed'; +$lang->product->willClose = 'ToBeClose'; $lang->product->closedStory = 'Closed'; $lang->product->unclosed = 'Open'; -$lang->product->unplan = 'No plan'; +$lang->product->unplan = 'Wait'; $lang->product->my = 'My'; -$lang->product->allStory = 'All Stories'; +$lang->product->allStory = 'All'; $lang->product->allProduct = 'All' . $lang->productCommon; $lang->product->allProductsOfProject = 'All linked' . $lang->productCommon; diff --git a/module/product/view/all.html.php b/module/product/view/all.html.php index 6322c4bdb0..4c96ad190a 100644 --- a/module/product/view/all.html.php +++ b/module/product/view/all.html.php @@ -66,7 +66,7 @@ - + diff --git a/module/product/view/create.html.php b/module/product/view/create.html.php index f905b5854b..687bf6ac15 100644 --- a/module/product/view/create.html.php +++ b/module/product/view/create.html.php @@ -23,7 +23,7 @@
      mail->turnon; ?>mail->turnon; ?> mail->turnonList, 1);?> product->line);?> product->activeStories;?> product->changedStories;?>product->draftStories;?>product->draftStories;?> product->closedStories;?> product->plans;?> product->releases;?>
      - + diff --git a/module/product/view/dynamic.html.php b/module/product/view/dynamic.html.php index c18dd79ca1..18899fccea 100755 --- a/module/product/view/dynamic.html.php +++ b/module/product/view/dynamic.html.php @@ -31,10 +31,10 @@ recTotal}&recPerPage={$pager->recPerPage}"; ?> - + - + diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index c48173e494..8b8d8856bb 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -9,7 +9,7 @@ * @version $Id: en.php 4659 2013-04-17 06:45:08Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->productplan->common = $lang->productCommon . 'Plan'; +$lang->productplan->common = $lang->productCommon . ' Plan'; $lang->productplan->browse = "View"; $lang->productplan->index = "List"; $lang->productplan->create = "Create"; @@ -21,16 +21,16 @@ $lang->productplan->info = 'Info'; $lang->productplan->batchEdit = 'Batch Edit'; $lang->productplan->batchUnlink = "Batch Unlink"; -$lang->productplan->linkStory = "Linked Story"; +$lang->productplan->linkStory = "Link Story"; $lang->productplan->unlinkStory = "Unlink Story"; $lang->productplan->batchUnlinkStory = "Batch Unlink"; -$lang->productplan->linkedStories = 'link Story'; -$lang->productplan->unlinkedStories = 'UnLinkEd'; -$lang->productplan->updateOrder = 'Ranking'; +$lang->productplan->linkedStories = 'Linked Story'; +$lang->productplan->unlinkedStories = 'Unlinked Story'; +$lang->productplan->updateOrder = 'Sort'; $lang->productplan->linkBug = "Link Bug"; $lang->productplan->unlinkBug = "Unlink Bug"; -$lang->productplan->batchUnlinkBug = "Batch Unlink"; +$lang->productplan->batchUnlinkBug = "Batch Unlink Bug"; $lang->productplan->linkedBugs = 'Linked Bug'; $lang->productplan->unlinkedBugs = 'Unlinked'; @@ -51,13 +51,13 @@ $lang->productplan->stories = 'Stories'; $lang->productplan->bugs = 'Bugs'; $lang->productplan->hour = 'Hour'; -$lang->productplan->endList[7] = '1 Week'; -$lang->productplan->endList[14] = '2 Weeks'; -$lang->productplan->endList[31] = '1 Month'; -$lang->productplan->endList[62] = '2 Months'; -$lang->productplan->endList[93] = '3 Months'; -$lang->productplan->endList[186] = '6 Months'; -$lang->productplan->endList[365] = '1 Year'; +$lang->productplan->endList[7] = '1 Week'; +$lang->productplan->endList[14] = '2 Weeks'; +$lang->productplan->endList[31] = '1 Month'; +$lang->productplan->endList[62] = '2 Months'; +$lang->productplan->endList[93] = '3 Months'; +$lang->productplan->endList[186] = '6 Months'; +$lang->productplan->endList[365] = '1 Year'; $lang->productplan->endList[9999] = 'Future'; $lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; @@ -66,5 +66,5 @@ $lang->productplan->errorNoEnd = 'ID %s end time should not be empty.'; $lang->productplan->beginGeEnd = 'ID %s begin time value should not be greater than t.'; $lang->productplan->featureBar['browse']['all'] = 'All'; -$lang->productplan->featureBar['browse']['unexpired'] = 'On Time'; -$lang->productplan->featureBar['browse']['overdue'] = 'Overdue'; +$lang->productplan->featureBar['browse']['unexpired'] = 'Unexpired'; +$lang->productplan->featureBar['browse']['overdue'] = 'Expired'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index a6c53cd92f..4712206b75 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -17,43 +17,43 @@ $lang->project->name = 'Name'; $lang->project->code = 'Alias'; $lang->project->begin = 'Begin'; $lang->project->end = 'End'; -$lang->project->dateRange = 'Time Frame'; +$lang->project->dateRange = 'Duration'; $lang->project->to = 'To'; $lang->project->days = 'Man-Day'; $lang->project->day = 'day'; -$lang->project->workHour = 'Hour'; +$lang->project->workHour = 'Hour(s)'; $lang->project->status = 'Status'; $lang->project->desc = 'Desc'; $lang->project->owner = 'Owner'; -$lang->project->PO = $lang->productCommon . ' Owner'; -$lang->project->PM = $lang->projectCommon . ' Manager'; -$lang->project->QD = 'Quality Director'; -$lang->project->RD = 'Release Director'; +$lang->project->PO = 'PO'; +$lang->project->PM = 'PM'; +$lang->project->QD = 'QA Manager'; +$lang->project->RD = 'Release Manager'; $lang->project->acl = 'Access Control'; $lang->project->teamname = 'Team Name'; $lang->project->order = "Sort {$lang->projectCommon}"; -$lang->project->products = "Link {$lang->productCommon}"; +$lang->project->products = "Linked {$lang->productCommon}"; $lang->project->whitelist = 'Whitelist'; -$lang->project->totalEstimate = 'Est.'; -$lang->project->totalConsumed = 'Consumed'; -$lang->project->totalLeft = 'Total Remained'; -$lang->project->Left = 'Remained'; +$lang->project->totalEstimate = 'Est.(h)'; +$lang->project->totalConsumed = 'Cost'; +$lang->project->totalLeft = 'Left'; +$lang->project->Left = 'Left'; $lang->project->progress = 'Progress'; -$lang->project->hours = 'Estimate %s, Consumed %s, Remained %s'; +$lang->project->hours = '%s Estimate, %s Cost, %s Left.'; $lang->project->viewBug = 'Bugs'; $lang->project->noProduct = "No {$lang->productCommon}"; $lang->project->createStory = "Create Story"; $lang->project->all = 'All'; -$lang->project->undone = 'Undone'; +$lang->project->undone = 'Unfinished'; $lang->project->unclosed = 'Unclosed'; -$lang->project->typeDesc = 'No story, bug, build, testtask and burndown allowed in OPS'; +$lang->project->typeDesc = 'No story, bug, build, test task or burndown is allowed in OPS'; $lang->project->mine = 'My Responsibility: '; $lang->project->other = 'Other:'; $lang->project->deleted = 'Deleted'; $lang->project->delayed = 'Delayed'; $lang->project->product = $lang->project->products; -$lang->project->readjustTime = 'Readjust project time for begin and end'; -$lang->project->readjustTask = 'Readjust task start date and deadline'; +$lang->project->readjustTime = 'Adjust project begin and end time'; +$lang->project->readjustTask = 'Adjust task start date and deadline'; $lang->project->start = 'Start'; $lang->project->activate = 'Activate'; @@ -77,12 +77,12 @@ $lang->project->endList[365] = '1 Year'; $lang->team = new stdclass(); $lang->team->account = 'Account'; $lang->team->role = 'Role'; -$lang->team->join = 'Joined Date'; +$lang->team->join = 'Joined'; $lang->team->hours = 'Hour/Day'; $lang->team->days = 'Workdays'; $lang->team->totalHours = 'Total'; -$lang->team->limited = 'limited User'; +$lang->team->limited = 'Limited User'; $lang->team->limitedList['no'] = 'No'; $lang->team->limitedList['yes'] = 'Yes'; @@ -95,14 +95,14 @@ $lang->project->statusList['doing'] = 'Doing'; $lang->project->statusList['suspended'] = 'Suspend'; $lang->project->statusList['done'] = 'Done'; -$lang->project->aclList['open'] = "Default (You have access to {$lang->projectCommon}, if you can view it.)"; -$lang->project->aclList['private'] = 'Private (Only team members can access to it.)'; -$lang->project->aclList['custom'] = 'Whitelist (Team members and the whitelist members have access to it.)'; +$lang->project->aclList['open'] = "Default (Those who can visit ‘project view’ can access.)"; +$lang->project->aclList['private'] = 'Private (Only team members can access.)'; +$lang->project->aclList['custom'] = 'Whitelist (Team members and the whitelist members can access.)'; /* 方法列表。*/ $lang->project->index = "Home"; $lang->project->task = 'Tasks'; -$lang->project->groupTask = 'View by'; +$lang->project->groupTask = 'View by Group'; $lang->project->story = 'Stories'; $lang->project->bug = 'Bugs'; $lang->project->dynamic = 'Dynamic'; @@ -112,7 +112,7 @@ $lang->project->burn = 'Burndown'; $lang->project->baseline = 'Base Line'; $lang->project->computeBurn = 'Update'; $lang->project->burnData = 'Burndown Data'; -$lang->project->fixFirst = 'Edit 1st Day Data'; +$lang->project->fixFirst = 'Edit 1st Day Man-hour'; $lang->project->team = 'Team Member'; $lang->project->doc = 'Doc'; $lang->project->manageProducts = 'Link ' . $lang->productCommon; @@ -122,8 +122,8 @@ $lang->project->linkStoryByPlan = 'Linked Story From Plan'; $lang->project->unlinkStoryTasks = 'Unlinked'; $lang->project->linkedProducts = 'Linked Products'; $lang->project->unlinkedProducts = 'Unlinked Products'; -$lang->project->view = "Info"; -$lang->project->create = "Add"; +$lang->project->view = "Overview"; +$lang->project->create = "Create Project"; $lang->project->copy = "Copy {$lang->projectCommon}"; $lang->project->delete = "Delete"; $lang->project->browse = "Browse"; @@ -138,13 +138,13 @@ $lang->project->importBug = 'Import Bug'; $lang->project->updateOrder = 'Order'; $lang->project->tree = 'Tree'; $lang->project->storyKanban = 'Story Kanban'; -$lang->project->storySort = 'Story Sort'; +$lang->project->storySort = 'Sort Story'; $lang->project->importPlanStory = 'Import the stories with the plan?'; /* 分组浏览。*/ $lang->project->allTasks = 'All'; -$lang->project->assignedToMe = 'Assigned to Me'; -$lang->project->myInvolved = 'My Involved'; +$lang->project->assignedToMe = 'My'; +$lang->project->myInvolved = 'Involved'; $lang->project->statusSelects[''] = 'More'; $lang->project->statusSelects['wait'] = 'Wait'; @@ -179,14 +179,14 @@ $lang->project->aboveAllProject = "All the above {$lang->projectCommon}"; /* 页面提示。*/ $lang->project->selectProject = "Select {$lang->projectCommon}"; -$lang->project->beginAndEnd = 'Time Frame'; -$lang->project->lblStats = 'Hour Report'; -$lang->project->stats = '%s Hour(s) available, %s Hour(s) Estimated, %s Hour(s) Consumed, %s Hour(s) Remained.'; -$lang->project->taskSummary = " %s Tasks on this page, %s Wait, %s Doing. %s Hour(s) Estimated, %s Hour(s) Consumed, %s Hour(s) Remained."; -$lang->project->checkedSummary = " %total% Checked, %wait% Wait, %doing% Doing, %estimate% Hour(s) Estimated, %consumed% Hour(s) Consumed, %left% Hour(s) Remained."; +$lang->project->beginAndEnd = 'Duration'; +$lang->project->lblStats = 'Man-Hour Summary(h) : '; +$lang->project->stats = '%s Available, %s Total Estimated, %s Cost, %s Left.'; +$lang->project->taskSummary = "Tasks on this page : %s Total, %s Wait, %s Doing;     Hours : %s Est., %s Cost, %s Left."; +$lang->project->checkedSummary = " %total% Checked, %wait% Wait, %doing% Doing, %estimate% Hour(s) Estimated, %consumed% Hour(s) Cost, %left% Hour(s) Left."; $lang->project->memberHours = "%s has %s Hour(s) available "; -$lang->project->groupSummary = "%s Tasks in this group, Wait %s, Doing %s. %s Hour(s) Estimated , %s Hour(s) Consumed, %s Hour(s) Remained."; -$lang->project->groupSummaryAB = "Total Tasks %s, Wait %s, Doing %s.
      %s Hour(s) Estimated, %s Hour(s) Consumed,%s Hour(s) Remained."; +$lang->project->groupSummary = "%s Tasks in this group, Wait %s, Doing %s. %s Hour(s) Estimated , %s Hour(s) Cost, %s Hour(s) Left."; +$lang->project->groupSummaryAB = "Tasks:%s Total,%s Wait, %s Doing.
      Hours: %s Est., %s Cost,%s Left."; $lang->project->noTimeSummary = " %s Tasks in this group, Wait %s, Doing %s."; $lang->project->wbs = "Decompose Task"; $lang->project->batchWBS = "Batch Decompose"; @@ -205,7 +205,7 @@ $lang->project->copyNoProject = "No {$lang->projectCommon} can be duplicated." $lang->project->copyFromProject = "Duplicate from {$lang->projectCommon} %s"; $lang->project->cancelCopy = 'Cancel Duplication'; $lang->project->byPeriod = 'By Time'; -$lang->project->byUser = 'By User'; +$lang->project->byUser = 'ByUser'; /* 交互提示。*/ $lang->project->confirmDelete = "Do you want to delete {$lang->projectCommon}[%s]?"; @@ -223,7 +223,7 @@ $lang->project->goback = "Go Back"; $lang->project->noweekend = 'Without Weekend'; $lang->project->withweekend = 'With Weekend'; $lang->project->interval = 'Intervals'; -$lang->project->fixFirstWithLeft = 'Modify the left time'; +$lang->project->fixFirstWithLeft = 'Modify the left'; /* 统计。*/ $lang->project->charts = new stdclass(); @@ -239,8 +239,8 @@ $lang->project->charts->burn->graph->rotateNames = 1; $lang->project->charts->burn->graph->showValues = 0; $lang->project->placeholder = new stdclass(); -$lang->project->placeholder->code = "{$lang->projectCommon} Code"; -$lang->project->placeholder->totalLeft = 'Hour(s) remained at the beginning of Project'; +$lang->project->placeholder->code = 'Project abbreviation in team'; +$lang->project->placeholder->totalLeft = 'Hour(s) remained at Project Starting'; $lang->project->selectGroup = new stdclass(); $lang->project->selectGroup->done = '(Done)'; @@ -258,7 +258,7 @@ $lang->project->resetKanban = "Reset Setting"; $lang->project->printKanban = "Print Kanban"; $lang->project->bugList = "Bugs"; -$lang->project->kanbanHideCols = 'Kanban hidden has been closed and canceled columns'; +$lang->project->kanbanHideCols = 'hide closed and canceled columns in Kanban'; $lang->project->kanbanShowOption = 'Display folding information'; $lang->project->kanbanColsColor = 'Custom color for Kanban column'; @@ -282,14 +282,14 @@ $lang->project->featureBar['task']['all'] = $lang->project->allTasks; $lang->project->featureBar['task']['assignedtome'] = $lang->project->assignedToMe; $lang->project->featureBar['task']['myinvolved'] = $lang->project->myInvolved; $lang->project->featureBar['task']['delayed'] = 'Delayed'; -$lang->project->featureBar['task']['needconfirm'] = 'Story Changed'; +$lang->project->featureBar['task']['needconfirm'] = 'StoryChanged'; $lang->project->featureBar['task']['status'] = $lang->project->statusSelects['']; $lang->project->treeLevel = array(); -$lang->project->treeLevel['root'] = 'Show Root'; -$lang->project->treeLevel['story'] = 'Show Story'; -$lang->project->treeLevel['task'] = 'Show Task'; -$lang->project->treeLevel['all'] = 'Show All'; +$lang->project->treeLevel['root'] = 'Collapse All'; +$lang->project->treeLevel['story'] = 'Show Story'; +$lang->project->treeLevel['task'] = 'Show Task'; +$lang->project->treeLevel['all'] = 'Expand All'; global $config; if($config->global->flow == 'onlyTask') diff --git a/module/project/view/burn.html.php b/module/project/view/burn.html.php index 2cb4e85d64..6d1c6d5df2 100644 --- a/module/project/view/burn.html.php +++ b/module/project/view/burn.html.php @@ -27,7 +27,7 @@ $weekend = ($type == 'noweekend') ? 'withweekend' : "noweekend"; common::printLink('project', 'computeBurn', 'reload=yes', $lang->project->computeBurn, 'hiddenwin', "title='{$lang->project->computeBurn}{$lang->project->burn}' class='btn btn-primary btn-sm' id='computeBurn'"); echo html::a($this->createLink('project', 'burn', "projectID=$projectID&type=$weekend&interval=$interval"), $lang->project->$weekend, '', "class='btn btn-sm'"); - common::printLink('project', 'fixFirst', "project=$project->id", $lang->project->fixFirst, '', "class='btn btn-sm iframe' data-width='500'"); + common::printLink('project', 'fixFirst', "project=$project->id", $lang->project->fixFirst, '', "class='btn btn-sm iframe' data-width='600'"); echo $lang->project->howToUpdateBurn; ?> diff --git a/module/project/view/create.html.php b/module/project/view/create.html.php index 14783bff39..0b823d15e1 100644 --- a/module/project/view/create.html.php +++ b/module/project/view/create.html.php @@ -46,7 +46,7 @@
      product->name;?>product->name;?>
      action->date);?>action->date);?> action->actor);?> action->action);?> action->objectType);?> action->objectType);?> idAB);?> action->objectName;?>
      - + diff --git a/module/project/view/fixfirst.html.php b/module/project/view/fixfirst.html.php index d31f4c4cde..ddf3f03e3b 100644 --- a/module/project/view/fixfirst.html.php +++ b/module/project/view/fixfirst.html.php @@ -21,7 +21,7 @@ -
      project->totalEstimate . $project->totalEstimate . $lang->project->workHour;?>
      +
      project->totalEstimate . ' : ' . $project->totalEstimate . $lang->project->workHour;?>
      project->name;?>project->name;?>
      diff --git a/module/project/view/grouptask.html.php b/module/project/view/grouptask.html.php index 699f4a1b63..bb798c8d78 100644 --- a/module/project/view/grouptask.html.php +++ b/module/project/view/grouptask.html.php @@ -25,21 +25,21 @@ - - + - + diff --git a/module/release/lang/en.php b/module/release/lang/en.php index 71d06752f7..bd330b0bb4 100644 --- a/module/release/lang/en.php +++ b/module/release/lang/en.php @@ -16,11 +16,11 @@ $lang->release->linkStory = "Link Story"; $lang->release->linkBug = "Link Bug"; $lang->release->delete = "Delete"; $lang->release->deleted = 'Deleted'; -$lang->release->view = "Info"; -$lang->release->browse = "Releases"; +$lang->release->view = "Overview"; +$lang->release->browse = "Browse"; $lang->release->changeStatus = "Change Status"; $lang->release->batchUnlink = "Batch Unlink"; -$lang->release->batchUnlinkStory = "Batch Unlink"; +$lang->release->batchUnlinkStory = "Batch Unlink Story"; $lang->release->batchUnlinkBug = "Batch Unlink"; $lang->release->confirmDelete = "Do you want to delete this Release?"; diff --git a/module/report/lang/en.php b/module/report/lang/en.php index 88e0fee571..ac2da1bd5c 100644 --- a/module/report/lang/en.php +++ b/module/report/lang/en.php @@ -11,7 +11,7 @@ */ $lang->report->common = 'Report'; $lang->report->index = 'Home'; -$lang->report->list = 'List'; +$lang->report->list = 'Report List'; $lang->report->item = 'Item'; $lang->report->value = 'Value'; $lang->report->percent = '%'; @@ -42,9 +42,9 @@ $lang->report->bugCreate = 'Bug Submission Report'; $lang->report->bugAssign = 'Bug Assignment Report'; $lang->report->workload = 'Workload'; $lang->report->workloadAB = 'Workload'; -$lang->report->bugOpenedDate = 'Bug Opened From'; +$lang->report->bugOpenedDate = 'Bug Created From'; $lang->report->taskAssignedDate = 'From'; -$lang->report->beginAndEnd = 'Date'; +$lang->report->beginAndEnd = ' From'; $lang->report->dept = 'Dept'; $lang->report->deviationChart = $lang->projectCommon . ' Deviation Chart'; @@ -57,12 +57,12 @@ $lang->reportList->staff->lists[10] = 'Workload|report|workload'; $lang->report->id = 'ID'; $lang->report->project = $lang->projectCommon; $lang->report->product = $lang->productCommon; -$lang->report->user = 'Username'; +$lang->report->user = 'Name'; $lang->report->bugTotal = 'Bug'; $lang->report->task = 'Task'; -$lang->report->estimate = 'Hour'; -$lang->report->consumed = 'Consumed'; -$lang->report->remain = 'Remained'; +$lang->report->estimate = 'Est.(h)'; +$lang->report->consumed = 'Cost'; +$lang->report->remain = 'Left'; $lang->report->deviation = 'Deviation'; $lang->report->deviationRate = 'Deviation Rate'; $lang->report->total = 'Total'; @@ -82,21 +82,21 @@ $lang->report->typeList['line'] = 'Line'; $lang->report->conditions = 'Filter by:'; $lang->report->closedProduct = 'Closed ' . $lang->productCommon; -$lang->report->overduePlan = 'Overdue Plan'; +$lang->report->overduePlan = 'Expired Plan'; /* daily reminder. */ $lang->report->idAB = 'ID'; $lang->report->bugTitle = 'Bug Title'; $lang->report->taskName = 'Task Name'; -$lang->report->todoName = 'To-Do Name'; +$lang->report->todoName = 'Todo Name'; $lang->report->testTaskName = 'Test Task Name'; $lang->report->deadline = 'Deadline'; $lang->report->mailTitle = new stdclass(); $lang->report->mailTitle->begin = 'Notice: You have'; -$lang->report->mailTitle->bug = " Bug(%s),"; -$lang->report->mailTitle->task = " Task(%s),"; -$lang->report->mailTitle->todo = " To-Do(%s),"; -$lang->report->mailTitle->testTask = " Test Task(%s),"; +$lang->report->mailTitle->bug = " Bug (%s),"; +$lang->report->mailTitle->task = " Task (%s),"; +$lang->report->mailTitle->todo = " Todo (%s),"; +$lang->report->mailTitle->testTask = " Test Task (%s),"; $lang->report->proVersion = 'Try ZenTao Pro for more!'; diff --git a/module/search/lang/en.php b/module/search/lang/en.php index 4564626295..0868ec317f 100644 --- a/module/search/lang/en.php +++ b/module/search/lang/en.php @@ -13,13 +13,13 @@ $lang->search->common = 'Search'; $lang->search->reset = 'Reset'; $lang->search->saveQuery = 'Save'; $lang->search->myQuery = 'My Queries'; -$lang->search->group1 = '1'; -$lang->search->group2 = '2'; +$lang->search->group1 = 'Group 1'; +$lang->search->group2 = 'Group 2'; $lang->search->buildForm = 'Search Form'; $lang->search->buildQuery = 'Execute Query'; -$lang->search->saveQuery = 'Save'; -$lang->search->deleteQuery = 'Delete'; -$lang->search->setQueryTitle = 'Please enter the title( Save it before searching.):'; +$lang->search->saveQuery = 'Save Query'; +$lang->search->deleteQuery = 'Delete Query'; +$lang->search->setQueryTitle = 'Enter the query title. Save it After searching.'; $lang->search->select = 'Stories/Tasks Filter'; $lang->search->me = 'Me'; $lang->search->noQuery = 'No query saved!'; diff --git a/module/story/config.php b/module/story/config.php index 59f211a57c..3c117df04c 100644 --- a/module/story/config.php +++ b/module/story/config.php @@ -91,12 +91,12 @@ $config->story->datatable->fieldList['sourceNote']['required'] = 'no'; $config->story->datatable->fieldList['status']['title'] = 'statusAB'; $config->story->datatable->fieldList['status']['fixed'] = 'no'; -$config->story->datatable->fieldList['status']['width'] = '50'; +$config->story->datatable->fieldList['status']['width'] = '60'; $config->story->datatable->fieldList['status']['required'] = 'no'; $config->story->datatable->fieldList['estimate']['title'] = 'estimateAB'; $config->story->datatable->fieldList['estimate']['fixed'] = 'no'; -$config->story->datatable->fieldList['estimate']['width'] = '50'; +$config->story->datatable->fieldList['estimate']['width'] = '55'; $config->story->datatable->fieldList['estimate']['required'] = 'no'; $config->story->datatable->fieldList['stage']['title'] = 'stageAB'; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 66b643ee86..fa895ba551 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -9,7 +9,7 @@ * @version $Id: en.php 5141 2013-07-15 05:57:15Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->story->create = "Story"; +$lang->story->create = "Create Story"; $lang->story->batchCreate = "Batch Create"; $lang->story->change = "Change"; $lang->story->changed = 'Change'; @@ -35,8 +35,8 @@ $lang->story->caseCountAB = 'C'; $lang->story->linkStory = 'Link'; $lang->story->unlinkStory = 'UnLinked'; $lang->story->export = "Export Data"; -$lang->story->zeroCase = "Zero Case"; -$lang->story->zeroTask = "Zero Task"; +$lang->story->zeroCase = "Stories without cases"; +$lang->story->zeroTask = "Only Show Stories without tasks"; $lang->story->reportChart = "Report"; $lang->story->copyTitle = "Copy Title"; $lang->story->batchChangePlan = "Batch Change Plans"; @@ -58,25 +58,25 @@ $lang->story->title = 'Title'; $lang->story->spec = 'Description'; $lang->story->verify = 'Acceptance'; $lang->story->pri = 'Priority'; -$lang->story->estimate = 'Hour'; -$lang->story->estimateAB = 'Hour'; +$lang->story->estimate = 'Est.(h)'; +$lang->story->estimateAB = 'Est.(h)'; $lang->story->hour = 'Hour'; $lang->story->status = 'Status'; $lang->story->stage = 'Stage'; $lang->story->stageAB = 'Stage'; $lang->story->mailto = 'Mailto'; -$lang->story->openedBy = 'Open By'; -$lang->story->openedDate = 'Open on'; +$lang->story->openedBy = 'Creator'; +$lang->story->openedDate = 'Create on'; $lang->story->assignedTo = 'Assignee'; -$lang->story->assignedDate = 'Assigned On'; -$lang->story->lastEditedBy = 'Last Edited By'; -$lang->story->lastEditedDate = 'Last Edited On'; -$lang->story->closedBy = 'Closed By'; -$lang->story->closedDate = 'Closed On'; -$lang->story->closedReason = 'Reason'; +$lang->story->assignedDate = 'Assigned on'; +$lang->story->lastEditedBy = 'Last Edited'; +$lang->story->lastEditedDate = 'Edited on'; +$lang->story->closedBy = 'Closed by'; +$lang->story->closedDate = 'Closed on'; +$lang->story->closedReason = 'Close Reason'; $lang->story->rejectedReason = 'Reject Reason'; $lang->story->reviewedBy = 'Reviewer'; -$lang->story->reviewedDate = 'Review on'; +$lang->story->reviewedDate = 'Reviewed on'; $lang->story->version = 'Version'; $lang->story->plan = 'Plan'; $lang->story->planAB = 'Plan'; @@ -119,11 +119,11 @@ $lang->story->stageList['closed'] = 'Closed'; $lang->story->reasonList[''] = ''; $lang->story->reasonList['done'] = 'Done'; $lang->story->reasonList['subdivided'] = 'Decomposed'; -$lang->story->reasonList['duplicate'] = 'Duplicate'; +$lang->story->reasonList['duplicate'] = 'Duplicated'; $lang->story->reasonList['postponed'] = 'Postponed'; $lang->story->reasonList['willnotdo'] = "Ignore"; $lang->story->reasonList['cancel'] = 'Cancelled'; -$lang->story->reasonList['bydesign'] = 'Default Design'; +$lang->story->reasonList['bydesign'] = 'By Design'; //$lang->story->reasonList['isbug'] = 'Bug!'; $lang->story->reviewResultList[''] = ''; @@ -161,7 +161,7 @@ $lang->story->legendLifeTime = 'Story Life '; $lang->story->legendRelated = 'Related Info'; $lang->story->legendMailto = 'Mail To'; $lang->story->legendAttatch = 'Files'; -$lang->story->legendProjectAndTask = $lang->projectCommon . 'Task'; +$lang->story->legendProjectAndTask = $lang->projectCommon . ' Task'; $lang->story->legendBugs = 'Linked Bug'; $lang->story->legendFromBug = 'From Bug'; $lang->story->legendCases = 'Linked Case'; @@ -214,22 +214,22 @@ $lang->story->action->unlinkchildstory = array('main' => '$date, unlinked by /* 统计报表。*/ $lang->story->report = new stdclass(); $lang->story->report->common = 'Report'; -$lang->story->report->select = 'Select the type of Story Report'; +$lang->story->report->select = 'Group Stories by'; $lang->story->report->create = 'Generate'; $lang->story->report->value = 'Story Count'; -$lang->story->report->charts['storysPerProduct'] = 'per ' . $lang->productCommon; -$lang->story->report->charts['storysPerModule'] = 'per Module'; -$lang->story->report->charts['storysPerSource'] = 'per Source'; -$lang->story->report->charts['storysPerPlan'] = 'per Plan'; -$lang->story->report->charts['storysPerStatus'] = 'per Status'; -$lang->story->report->charts['storysPerStage'] = 'per Stage'; -$lang->story->report->charts['storysPerPri'] = 'per Priority'; -$lang->story->report->charts['storysPerEstimate'] = 'per Hour'; -$lang->story->report->charts['storysPerOpenedBy'] = 'per CreatedBy'; -$lang->story->report->charts['storysPerAssignedTo'] = 'per Assignee'; -$lang->story->report->charts['storysPerClosedReason'] = 'per Closed Reason'; -$lang->story->report->charts['storysPerChange'] = 'per Change'; +$lang->story->report->charts['storysPerProduct'] = 'by ' . $lang->productCommon; +$lang->story->report->charts['storysPerModule'] = 'by Module'; +$lang->story->report->charts['storysPerSource'] = 'by Source'; +$lang->story->report->charts['storysPerPlan'] = 'by Plan'; +$lang->story->report->charts['storysPerStatus'] = 'by Status'; +$lang->story->report->charts['storysPerStage'] = 'by Stage'; +$lang->story->report->charts['storysPerPri'] = 'by Priority'; +$lang->story->report->charts['storysPerEstimate'] = 'by Hour'; +$lang->story->report->charts['storysPerOpenedBy'] = 'by CreatedBy'; +$lang->story->report->charts['storysPerAssignedTo'] = 'by Assignee'; +$lang->story->report->charts['storysPerClosedReason'] = 'by Closed Reason'; +$lang->story->report->charts['storysPerChange'] = 'by Change times'; $lang->story->report->options = new stdclass(); $lang->story->report->options->graph = new stdclass(); diff --git a/module/task/config.php b/module/task/config.php index a2ae9c915c..93bc0664bd 100644 --- a/module/task/config.php +++ b/module/task/config.php @@ -84,7 +84,7 @@ $config->task->datatable->fieldList['status']['required'] = 'no'; $config->task->datatable->fieldList['estimate']['title'] = 'estimateAB'; $config->task->datatable->fieldList['estimate']['fixed'] = 'no'; -$config->task->datatable->fieldList['estimate']['width'] = '40'; +$config->task->datatable->fieldList['estimate']['width'] = '57'; $config->task->datatable->fieldList['estimate']['required'] = 'no'; $config->task->datatable->fieldList['consumed']['title'] = 'consumedAB'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 235291e98d..4916b0e58a 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -10,17 +10,17 @@ * @link http://www.zentao.net */ $lang->task->index = "Index"; -$lang->task->create = "Task"; +$lang->task->create = "Create Task"; $lang->task->batchCreate = "Batch Create Task"; $lang->task->batchEdit = "Batch Edit"; $lang->task->batchChangeModule = "Batch Change Module"; $lang->task->batchClose = "Batch Close"; $lang->task->batchCancel = "Batch Cancel"; -$lang->task->edit = "Update"; +$lang->task->edit = "Edit"; $lang->task->delete = "Delete"; $lang->task->deleted = "Deleted"; $lang->task->delayed = 'Delayed'; -$lang->task->view = "Info"; +$lang->task->view = "Overview"; $lang->task->logEfforts = "Hour"; $lang->task->record = "Est."; $lang->task->start = "Start"; @@ -36,7 +36,7 @@ $lang->task->fromBug = 'From Bug'; $lang->task->case = 'Related Case'; $lang->task->confirmStoryChange = "Confirm Story Change"; $lang->task->progress = 'Progress'; -$lang->task->progressTips = 'Consumed/(Consumed+Remained)'; +$lang->task->progressTips = 'Cost/(Cost+Left)'; $lang->task->copy = 'Duplicate a Task'; $lang->task->common = 'Task'; @@ -47,25 +47,25 @@ $lang->task->moduleAB = 'Module'; $lang->task->story = 'Story'; $lang->task->storyAB = 'Story'; $lang->task->storySpec = 'Story Description'; -$lang->task->storyVerify = 'Acceptance'; +$lang->task->storyVerify = 'Acceptance Criteria'; $lang->task->name = 'Name'; $lang->task->type = 'Type'; $lang->task->pri = 'Priority'; -$lang->task->mailto = 'Mailto'; -$lang->task->estimate = 'Hour'; -$lang->task->estimateAB = 'Hour'; -$lang->task->left = 'Remained'; -$lang->task->leftAB = 'Remained'; -$lang->task->consumed = 'Consumed'; -$lang->task->consumedAB = 'Consume'; +$lang->task->mailto = 'Mail to'; +$lang->task->estimate = 'Est.(h)'; +$lang->task->estimateAB = 'Est.(h)'; +$lang->task->left = 'Left'; +$lang->task->leftAB = 'Left'; +$lang->task->consumed = 'Cost'; +$lang->task->consumedAB = 'Cost'; $lang->task->hour = 'Hour'; $lang->task->consumedThisTime = 'Hour'; -$lang->task->leftThisTime = 'Remained'; +$lang->task->leftThisTime = 'Left'; $lang->task->datePlan = 'Plan'; $lang->task->estStarted = 'Estimate Start'; $lang->task->realStarted = 'Actual Start'; $lang->task->date = 'Date'; -$lang->task->deadline = 'Finish Date'; +$lang->task->deadline = 'Deadline'; $lang->task->deadlineAB = 'Deadline'; $lang->task->status = 'Status'; $lang->task->desc = 'Description'; @@ -75,33 +75,33 @@ $lang->task->batchAssignTo = 'Batch Assign'; $lang->task->assignedTo = 'Assignee'; $lang->task->assignedToAB = 'Assignee'; $lang->task->assignedDate = 'Assign on'; -$lang->task->openedBy = 'Created By'; +$lang->task->openedBy = 'Created by'; $lang->task->openedDate = 'Created on'; $lang->task->openedDateAB = 'Add'; -$lang->task->finishedBy = 'Finished By'; -$lang->task->finishedByAB = 'Finish'; +$lang->task->finishedBy = 'Finished'; +$lang->task->finishedByAB = 'Finished'; $lang->task->finishedDate = 'Finished on'; $lang->task->finishedDateAB = 'Date'; -$lang->task->canceledBy = 'Cancelled By'; +$lang->task->canceledBy = 'Cancelled by'; $lang->task->canceledDate = 'Cancelled on'; -$lang->task->closedBy = 'Closed By'; +$lang->task->closedBy = 'Closed by'; $lang->task->closedDate = 'Close Date'; $lang->task->closedReason = 'Cancel Reason'; -$lang->task->lastEditedBy = 'Last Edited By'; -$lang->task->lastEditedDate = 'Last Edited on'; +$lang->task->lastEditedBy = 'Edited by'; +$lang->task->lastEditedDate = 'Edited on'; $lang->task->lastEdited = 'Last Edited'; -$lang->task->recordEstimate = 'Hour'; -$lang->task->editEstimate = 'Edit'; -$lang->task->deleteEstimate = 'Delete'; +$lang->task->recordEstimate = 'Make Progress'; +$lang->task->editEstimate = 'Edit Est.'; +$lang->task->deleteEstimate = 'Delete Est.'; $lang->task->colorTag = 'Color Tag'; $lang->task->files = 'Files'; -$lang->task->hasConsumed = 'Consumed'; +$lang->task->hasConsumed = 'Cost'; $lang->task->multiple = 'Multiple Tasks'; -$lang->task->multipleAB = 'M'; -$lang->task->team = 'Team'; +$lang->task->multipleAB = ' Multiple'; +$lang->task->team = 'Select'; $lang->task->transfer = 'Transfer'; $lang->task->transferTo = 'Transfer To'; -$lang->task->children = 'Child'; +$lang->task->children = 'Child Task'; $lang->task->childrenAB = 'Child'; $lang->task->parent = 'Parent Task'; $lang->task->parentAB = 'Parent Task'; @@ -156,14 +156,14 @@ $lang->task->legendDesc = 'Task Description'; $lang->task->confirmDelete = "Do you want to delete this Task?"; $lang->task->confirmDeleteEstimate = "Do you want to delete it?"; -$lang->task->copyStoryTitle = "Same Story"; +$lang->task->copyStoryTitle = "Copy Story"; $lang->task->afterSubmit = "After Created,"; $lang->task->successSaved = "Created!"; $lang->task->delayWarning = " Delay %s days "; $lang->task->remindBug = "This Task is converted from a Bug. Do you want to update te Bug:%s?"; $lang->task->confirmChangeProject = "If you change {$lang->projectCommon}, the related Module, Story and Assignor will be changed. Do you want to do it?"; -$lang->task->confirmFinish = '"Remianed Hour" is 0. Do you want to change the Status to "Done"?'; -$lang->task->confirmRecord = '"Remained Hour" is 0. Do you want to set Task as "Done"?'; +$lang->task->confirmFinish = '"Left Hour" is 0. Do you want to change the Status to "Done"?'; +$lang->task->confirmRecord = '"Left Hour" is 0. Do you want to set Task as "Done"?'; $lang->task->noticeLinkStory = "No story has been linked. You can %s for this project, then %s."; $lang->task->noticeSaveRecord = 'Your Hour is not saved. Please save it first.'; $lang->task->commentActions = '%s. %s, commented by %s.'; @@ -173,7 +173,7 @@ $lang->task->error->consumedNumber = '"Consumed" must be numbers.'; $lang->task->error->estimateNumber = '"Hour" must be numbers.'; $lang->task->error->consumedSmall = '"Consumed" must larger than before.'; $lang->task->error->consumedThisTime = 'Please enter "Hour"'; -$lang->task->error->left = 'Please enter "Remained Hour"'; +$lang->task->error->left = 'Please enter "Left Hour"'; $lang->task->error->work = '"Remark" must be less than %d characteres.'; $lang->task->error->skipClose = 'Task: %s is not “Done” or “Cancelled”. Do you want to close it?'; $lang->task->error->consumed = 'Task: %s Hour must be more than 0. Ignore changes to this Task.'; @@ -181,23 +181,23 @@ $lang->task->error->consumed = 'Task: %s Hour must be more than 0. Ignor /* Report. */ $lang->task->report = new stdclass(); $lang->task->report->common = 'Report'; -$lang->task->report->select = 'Select the type of Task Report'; +$lang->task->report->select = 'Group Tasks by'; $lang->task->report->create = 'Create'; $lang->task->report->value = 'Task Count'; -$lang->task->report->charts['tasksPerProject'] = 'per ' . $lang->projectCommon; -$lang->task->report->charts['tasksPerModule'] = 'per Module'; -$lang->task->report->charts['tasksPerAssignedTo'] = 'per Assignee'; -$lang->task->report->charts['tasksPerType'] = 'per Category'; -$lang->task->report->charts['tasksPerPri'] = 'per Priority'; -$lang->task->report->charts['tasksPerStatus'] = 'per Status'; -$lang->task->report->charts['tasksPerDeadline'] = 'per Deadline'; -$lang->task->report->charts['tasksPerEstimate'] = 'per Hour'; -$lang->task->report->charts['tasksPerLeft'] = 'per Remained Hour'; -$lang->task->report->charts['tasksPerConsumed'] = 'per Consumed Hour'; -$lang->task->report->charts['tasksPerFinishedBy'] = 'per FinishedBy'; -$lang->task->report->charts['tasksPerClosedReason'] = 'per Close Reason'; -$lang->task->report->charts['finishedTasksPerDay'] = 'per Finished/Day'; +$lang->task->report->charts['tasksPerProject'] = 'by ' . $lang->projectCommon; +$lang->task->report->charts['tasksPerModule'] = 'by Module'; +$lang->task->report->charts['tasksPerAssignedTo'] = 'by Assignee'; +$lang->task->report->charts['tasksPerType'] = 'by Category'; +$lang->task->report->charts['tasksPerPri'] = 'by Priority'; +$lang->task->report->charts['tasksPerStatus'] = 'by Status'; +$lang->task->report->charts['tasksPerDeadline'] = 'by Deadline'; +$lang->task->report->charts['tasksPerEstimate'] = 'by Hour'; +$lang->task->report->charts['tasksPerLeft'] = 'by Left Hour'; +$lang->task->report->charts['tasksPerConsumed'] = 'by Cost Hour'; +$lang->task->report->charts['tasksPerFinishedBy'] = 'by FinishedBy'; +$lang->task->report->charts['tasksPerClosedReason'] = 'by Close Reason'; +$lang->task->report->charts['finishedTasksPerDay'] = 'by Finished/Day'; $lang->task->report->options = new stdclass(); $lang->task->report->options->graph = new stdclass(); @@ -227,8 +227,8 @@ $lang->task->report->tasksPerPri->item = 'Priority'; $lang->task->report->tasksPerStatus->item = 'Status'; $lang->task->report->tasksPerDeadline->item = 'Date'; $lang->task->report->tasksPerEstimate->item = 'Hour'; -$lang->task->report->tasksPerLeft->item = 'Remain'; -$lang->task->report->tasksPerConsumed->item = 'Consume'; +$lang->task->report->tasksPerLeft->item = 'Left'; +$lang->task->report->tasksPerConsumed->item = 'Cost'; $lang->task->report->tasksPerFinishedBy->item = 'User'; $lang->task->report->tasksPerClosedReason->item = 'Reason'; $lang->task->report->finishedTasksPerDay->item = 'Date'; @@ -255,8 +255,8 @@ $lang->task->report->tasksPerPri->graph->xAxisName = 'Priority'; $lang->task->report->tasksPerStatus->graph->xAxisName = 'Status'; $lang->task->report->tasksPerDeadline->graph->xAxisName = 'Date'; $lang->task->report->tasksPerEstimate->graph->xAxisName = 'Hour'; -$lang->task->report->tasksPerLeft->graph->xAxisName = 'Remained'; -$lang->task->report->tasksPerConsumed->graph->xAxisName = 'Consumed'; +$lang->task->report->tasksPerLeft->graph->xAxisName = 'Left'; +$lang->task->report->tasksPerConsumed->graph->xAxisName = 'Cost'; $lang->task->report->tasksPerFinishedBy->graph->xAxisName = 'User'; $lang->task->report->tasksPerClosedReason->graph->xAxisName = 'Close Reason'; diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index 931e92ba6d..fc40f8c1d3 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -22,28 +22,31 @@ $lang->testcase->pri = 'Priority'; $lang->testcase->type = 'Type'; $lang->testcase->status = 'Status'; $lang->testcase->steps = 'Steps'; -$lang->testcase->openedBy = 'Open By'; -$lang->testcase->openedDate = 'Open on'; -$lang->testcase->lastEditedBy = 'Last Edited by'; +$lang->testcase->openedBy = 'Creator'; +$lang->testcase->openedDate = 'Create on'; +$lang->testcase->lastEditedBy = 'Edited by'; $lang->testcase->result = 'Result'; -$lang->testcase->real = 'Real'; +$lang->testcase->real = 'Details'; $lang->testcase->keywords = 'Keywords'; $lang->testcase->files = 'Files'; $lang->testcase->linkCase = 'Linked Cases'; -$lang->testcase->linkCases = 'Linked Cases'; -$lang->testcase->unlinkCase = 'Unlinked'; +$lang->testcase->linkCases = 'Link Cases'; +$lang->testcase->unlinkCase = 'Unlink Cases'; $lang->testcase->stage = 'Stage'; $lang->testcase->reviewedBy = 'Reviewed By'; -$lang->testcase->reviewedDate = 'Reviewed Date'; +$lang->testcase->reviewedDate = 'Reviewed on'; $lang->testcase->reviewResult = 'Review Result'; +$lang->testcase->reviewedByAB = 'By'; +$lang->testcase->reviewedDateAB = 'Date'; +$lang->testcase->reviewResultAB = 'Result'; $lang->testcase->forceNotReview = 'No Review'; -$lang->testcase->lastEditedByAB = 'Last Edited By'; -$lang->testcase->lastEditedDateAB = 'Last Edited on'; -$lang->testcase->lastEditedDate = 'Last Edited on'; +$lang->testcase->lastEditedByAB = 'Edited By'; +$lang->testcase->lastEditedDateAB = 'Edited on'; +$lang->testcase->lastEditedDate = 'Edited on'; $lang->testcase->version = 'Case Version'; -$lang->testcase->lastRunner = 'Last Run By'; -$lang->testcase->lastRunDate = 'Run Date'; -$lang->testcase->assignedTo = 'Assigned To'; +$lang->testcase->lastRunner = 'LastRun'; +$lang->testcase->lastRunDate = 'Time'; +$lang->testcase->assignedTo = 'To'; $lang->testcase->colorTag = 'Color Tag'; $lang->testcase->lastRunResult = 'Result'; $lang->testcase->desc = 'Step'; @@ -69,10 +72,10 @@ $lang->testcase->stepVersion = 'Version'; $lang->testcase->common = 'Case'; $lang->testcase->index = "Home"; -$lang->testcase->create = "Case"; +$lang->testcase->create = "Create Case"; $lang->testcase->batchCreate = "Batch Create Case"; $lang->testcase->delete = "Delete"; -$lang->testcase->view = "Info"; +$lang->testcase->view = "Overview"; $lang->testcase->review = "Review"; $lang->testcase->batchReview = "Batch Review"; $lang->testcase->edit = "Edit"; @@ -84,7 +87,7 @@ $lang->testcase->batchDelete = "Batch Delete "; $lang->testcase->batchConfirmStoryChange = "Batch Confirm Story Change"; $lang->testcase->batchCaseTypeChange = "Batch Change type"; $lang->testcase->browse = "Cases"; -$lang->testcase->groupCase = "View By"; +$lang->testcase->groupCase = "View By Group"; $lang->testcase->import = "Import"; $lang->testcase->importFile = "Import CSV"; $lang->testcase->importFromLib = "Import From Library"; @@ -108,10 +111,10 @@ $lang->testcase->deleteStep = 'Delete'; $lang->testcase->insertBefore = 'Inserted Before'; $lang->testcase->insertAfter = 'Inserted After'; -$lang->testcase->assignToMe = 'Assigned to Me'; -$lang->testcase->openedByMe = 'Created by Me'; +$lang->testcase->assignToMe = 'AssignedToMe'; +$lang->testcase->openedByMe = 'CreatedByMe'; $lang->testcase->allCases = 'All'; -$lang->testcase->needConfirm = 'Story Change'; +$lang->testcase->needConfirm = 'StoryChanged'; $lang->testcase->bySearch = 'Search'; $lang->testcase->lblStory = 'Story'; @@ -141,7 +144,7 @@ $lang->testcase->priList[4] = 4; /* Define the types. */ $lang->testcase->typeList[''] = ''; -$lang->testcase->typeList['feature'] = 'Feature'; +$lang->testcase->typeList['feature'] = 'Function'; $lang->testcase->typeList['performance'] = 'Performance'; $lang->testcase->typeList['config'] = 'Config'; $lang->testcase->typeList['install'] = 'Install'; @@ -151,7 +154,7 @@ $lang->testcase->typeList['other'] = 'Other'; $lang->testcase->stageList[''] = ''; $lang->testcase->stageList['unittest'] = 'Unit Test'; -$lang->testcase->stageList['feature'] = 'Feature Test'; +$lang->testcase->stageList['feature'] = 'Function Test'; $lang->testcase->stageList['intergrate'] = 'Integration Test'; $lang->testcase->stageList['system'] = 'System Test'; $lang->testcase->stageList['smoke'] = 'Smoking Test'; @@ -165,7 +168,7 @@ $lang->testcase->groups[''] = 'Group '; $lang->testcase->groups['story'] = 'Story Group'; $lang->testcase->statusList[''] = ''; -$lang->testcase->statusList['wait'] = 'Wait'; +$lang->testcase->statusList['wait'] = 'toReview'; $lang->testcase->statusList['normal'] = 'Normal'; $lang->testcase->statusList['blocked'] = 'Blocked'; $lang->testcase->statusList['investigate'] = 'Investigating'; diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index 8015cf76d4..a04e899b98 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -36,6 +36,9 @@ $lang->testcase->stage = '适用阶段'; $lang->testcase->reviewedBy = '由谁评审'; $lang->testcase->reviewedDate = '评审时间'; $lang->testcase->reviewResult = '评审结果'; +$lang->testcase->reviewedByAB = '评审人'; +$lang->testcase->reviewedDateAB = '日期'; +$lang->testcase->reviewResultAB = '结果'; $lang->testcase->forceNotReview = '不需要评审'; $lang->testcase->lastEditedByAB = '修改者'; $lang->testcase->lastEditedDateAB = '修改日期'; diff --git a/module/testcase/lang/zh-tw.php b/module/testcase/lang/zh-tw.php index 7cd2c075b3..229b8828a1 100644 --- a/module/testcase/lang/zh-tw.php +++ b/module/testcase/lang/zh-tw.php @@ -36,6 +36,9 @@ $lang->testcase->stage = '適用階段'; $lang->testcase->reviewedBy = '由誰評審'; $lang->testcase->reviewedDate = '評審時間'; $lang->testcase->reviewResult = '評審結果'; +$lang->testcase->reviewedByAB = '評審者'; +$lang->testcase->reviewedDateAB = '時間'; +$lang->testcase->reviewResultAB = '結果'; $lang->testcase->forceNotReview = '不需要評審'; $lang->testcase->lastEditedByAB = '修改者'; $lang->testcase->lastEditedDateAB = '修改日期'; diff --git a/module/testcase/view/review.html.php b/module/testcase/view/review.html.php index 17f9045d05..ffa16445f9 100644 --- a/module/testcase/view/review.html.php +++ b/module/testcase/view/review.html.php @@ -24,15 +24,15 @@
      + " . $lang->task->$groupBy, '', "class='expandAll' data-action='expand'")?> " . $lang->task->$groupBy, '', "class='collapseAll hidden' data-action='collapse'")?> task->id;?> priAB;?> task->name;?>task->status;?>task->status;?> task->deadlineAB;?> task->assignedTo;?> task->finishedBy;?> task->estimateAB;?> task->consumedAB;?> task->leftAB;?>task->progress;?>task->progress;?> typeAB;?> actions;?>
      - + - + - + diff --git a/module/testreport/lang/en.php b/module/testreport/lang/en.php index 223eccbe9f..ddb4dd9254 100644 --- a/module/testreport/lang/en.php +++ b/module/testreport/lang/en.php @@ -1,18 +1,20 @@ testreport->common = 'Test Report'; -$lang->testreport->browse = 'Reports'; -$lang->testreport->create = 'Create'; -$lang->testreport->edit = 'Edit'; +$lang->testreport->browse = 'Browser Reports'; +$lang->testreport->create = 'Create Report'; +$lang->testreport->edit = 'Edit Report'; $lang->testreport->delete = 'Delete'; $lang->testreport->export = 'Export'; -$lang->testreport->view = 'View'; +$lang->testreport->view = 'Report Details'; $lang->testreport->recreate = 'Re-Create'; $lang->testreport->title = 'Title'; +$lang->testreport->bugTitle = 'Bug Title'; +$lang->testreport->storyTitle = 'Story Title'; $lang->testreport->project = 'Project'; $lang->testreport->testtask = 'Test Build'; $lang->testreport->tasks = $lang->testreport->testtask; -$lang->testreport->startEnd = 'Start and end'; +$lang->testreport->startEnd = 'Start&End'; $lang->testreport->owner = 'Owner'; $lang->testreport->members = 'Members'; $lang->testreport->begin = 'Begin'; @@ -20,12 +22,12 @@ $lang->testreport->end = 'End'; $lang->testreport->stories = 'Stories of Test'; $lang->testreport->bugs = 'Bugs'; $lang->testreport->builds = 'Build Info'; -$lang->testreport->goal = 'Product Goal'; +$lang->testreport->goal = 'Project Goal'; $lang->testreport->cases = 'Cases'; $lang->testreport->bugInfo = 'Bug Distribution'; -$lang->testreport->report = 'Report'; +$lang->testreport->report = 'Summary'; $lang->testreport->legacyBugs = 'Legacy Bugs'; -$lang->testreport->createdDate = 'Created Date'; +$lang->testreport->createdDate = 'Date'; $lang->testreport->objectID = 'Object'; $lang->testreport->profile = 'Profile'; $lang->testreport->value = 'Value'; @@ -33,9 +35,9 @@ $lang->testreport->none = 'None'; $lang->testreport->all = 'All Report'; $lang->testreport->legendBasic = 'Basic Info'; -$lang->testreport->legendStoryAndBug = 'Stories and Bug of Test'; +$lang->testreport->legendStoryAndBug = 'Stories and Bugs of Test'; $lang->testreport->legendBuild = 'Build Info'; -$lang->testreport->legendCase = 'Information for executing cases'; +$lang->testreport->legendCase = 'Case executed'; $lang->testreport->legendLegacyBugs = 'Legacy Bugs'; $lang->testreport->legendReport = 'Report'; $lang->testreport->legendComment = 'Sum up'; @@ -52,20 +54,20 @@ $lang->testreport->legacyBugs = 'Legacy Bugs'; $lang->testreport->bugConfirmedRate = 'Confirmed Bug Rate (Solution is fixed or postponed / status is resolved or closed)'; $lang->testreport->bugCreateByCaseRate = 'Bug Created in Case Rate (Bugs created in cases / Newly added bugs)'; -$lang->testreport->caseSummary = ' %s cases in total, %s cases performed, %s results generated, %s cases failed.'; +$lang->testreport->caseSummary = ' %s cases in Total : %s performed, %s results, %s failed.'; $lang->testreport->buildSummary = 'Tested %s build.'; $lang->testreport->confirmDelete = 'Do you want tot delete this report?'; $lang->testreport->moreNotice = 'More features can be extended with reference to the ZenTao extension mechanism, or you can contact us for customization.'; $lang->testreport->exportNotice = "Export By ZenTaoPMS"; $lang->testreport->noReport = "The report has not yet been generated. Please check it later."; -$lang->testreport->foundBugTip = "OpenBuild in builds and create time in test time within the range of Bug number."; -$lang->testreport->legacyBugTip = "The Bug state is activated, or the settling time of Bug is at the end of the test."; -$lang->testreport->fromCaseBugTip = "Bug created after failure of use case in test time range."; +$lang->testreport->foundBugTip = "Bugs created in this build and created in the test period."; +$lang->testreport->legacyBugTip = "Active Bugs, or the resolved beyond the test period."; +$lang->testreport->fromCaseBugTip = "Bugs created after case-failure in the test period."; $lang->testreport->errorTrunk = "The trunk version cannot create a test report. Please modify the associated version!"; $lang->testreport->bugSummary = <<%s Bug(s) generated in total , %s Bug(s) remained unresolve , -%s Bug(s) failure of case %s Bug(s) failure of case . +Bug Effective Rate : %s,Bugs created from case Rate: %s EOD; diff --git a/module/testreport/lang/zh-cn.php b/module/testreport/lang/zh-cn.php index 3ffbebfd30..6fd615055a 100644 --- a/module/testreport/lang/zh-cn.php +++ b/module/testreport/lang/zh-cn.php @@ -9,6 +9,8 @@ $lang->testreport->view = '报告详情'; $lang->testreport->recreate = '重新生成报告'; $lang->testreport->title = '标题'; +$lang->testreport->bugTitle = 'Bug 标题'; +$lang->testreport->storyTitle = '需求标题'; $lang->testreport->project = '所属项目'; $lang->testreport->testtask = '测试版本'; $lang->testreport->tasks = $lang->testreport->testtask; diff --git a/module/testreport/lang/zh-tw.php b/module/testreport/lang/zh-tw.php index 1797cee618..c37410ff14 100644 --- a/module/testreport/lang/zh-tw.php +++ b/module/testreport/lang/zh-tw.php @@ -9,6 +9,8 @@ $lang->testreport->view = '報告詳情'; $lang->testreport->recreate = '重新生成報告'; $lang->testreport->title = '標題'; +$lang->testreport->bugTitle = 'Bug 標題'; +$lang->testreport->storyTitle = '需求標題'; $lang->testreport->project = '所屬項目'; $lang->testreport->testtask = '測試版本'; $lang->testreport->tasks = $lang->testreport->testtask; diff --git a/module/testreport/view/blockbugs.html.php b/module/testreport/view/blockbugs.html.php index 499ffd9a81..6cc987ac49 100644 --- a/module/testreport/view/blockbugs.html.php +++ b/module/testreport/view/blockbugs.html.php @@ -4,7 +4,7 @@ - + diff --git a/module/testreport/view/blockstories.html.php b/module/testreport/view/blockstories.html.php index 531b207fe6..b153dd8b92 100644 --- a/module/testreport/view/blockstories.html.php +++ b/module/testreport/view/blockstories.html.php @@ -4,7 +4,7 @@ - + diff --git a/module/testsuite/lang/en.php b/module/testsuite/lang/en.php index e86adb5ea8..8e2f19a5ac 100644 --- a/module/testsuite/lang/en.php +++ b/module/testsuite/lang/en.php @@ -9,10 +9,10 @@ * @version $Id: zh-cn.php 4490 2013-02-27 03:27:05Z wyd621@gmail.com $ * @link http://www.zentao.net */ -$lang->testsuite->index = "Index"; -$lang->testsuite->create = "Create"; +$lang->testsuite->index = "Home"; +$lang->testsuite->create = "Create Suite"; $lang->testsuite->delete = "Delete"; -$lang->testsuite->view = "Info"; +$lang->testsuite->view = "Overview"; $lang->testsuite->edit = "Edit"; $lang->testsuite->browse = "Suite List"; $lang->testsuite->linkCase = "Link Cases"; @@ -29,9 +29,9 @@ $lang->testsuite->common = 'Test Suite'; $lang->testsuite->product = $lang->productCommon; $lang->testsuite->name = 'Name'; $lang->testsuite->desc = 'Description'; -$lang->testsuite->author = 'Author'; -$lang->testsuite->addedBy = 'Added By'; -$lang->testsuite->addedDate = 'Added Date'; +$lang->testsuite->author = 'Access Control'; +$lang->testsuite->addedBy = 'Creator'; +$lang->testsuite->addedDate = 'Date'; $lang->testsuite->legendDesc = 'Description'; $lang->testsuite->legendBasicInfo = 'Base Info'; @@ -49,11 +49,11 @@ $lang->testsuite->lblUnlinkCase = 'Unlink Case'; $lang->testsuite->authorList['private'] = 'Private'; $lang->testsuite->authorList['public'] = 'Public'; -$lang->caselib->common = 'Test Library'; +$lang->caselib->common = 'Case Library'; $lang->caselib->all = 'All'; -$lang->testsuite->createLib = 'Create'; +$lang->testsuite->createLib = 'Create Library'; $lang->testsuite->editLib = 'Edit'; -$lang->testsuite->library = 'Browse case'; -$lang->testsuite->createCase = 'Create case'; -$lang->testsuite->libView = 'View'; +$lang->testsuite->library = 'Browse cases in Library'; +$lang->testsuite->createCase = 'Create Case'; +$lang->testsuite->libView = 'Overview'; diff --git a/module/testtask/lang/en.php b/module/testtask/lang/en.php index 370d7364ce..98bf9b3730 100644 --- a/module/testtask/lang/en.php +++ b/module/testtask/lang/en.php @@ -9,11 +9,11 @@ * @version $Id: en.php 4490 2013-02-27 03:27:05Z wyd621@gmail.com $ * @link http://www.zentao.net */ -$lang->testtask->index = "Index"; -$lang->testtask->create = "Submit"; +$lang->testtask->index = "Home"; +$lang->testtask->create = "Submit for Test"; $lang->testtask->reportChart = 'Report'; $lang->testtask->delete = "Delete"; -$lang->testtask->view = "Info"; +$lang->testtask->view = "Overview"; $lang->testtask->edit = "Edit"; $lang->testtask->browse = "Test Tasks"; $lang->testtask->linkCase = "Link Cases"; @@ -27,17 +27,17 @@ $lang->testtask->results = "Result"; $lang->testtask->createBug = "Bug(+)"; $lang->testtask->assign = 'Assign'; $lang->testtask->cases = 'Cases'; -$lang->testtask->groupCase = "View By"; +$lang->testtask->groupCase = "View By Group"; $lang->testtask->pre = 'Previous'; $lang->testtask->next = 'Next'; $lang->testtask->start = "Start"; $lang->testtask->close = "Close"; -$lang->testtask->wait = "Build to be Tested"; +$lang->testtask->wait = "Wait"; $lang->testtask->block = "Block"; -$lang->testtask->activate = "Activation"; -$lang->testtask->testing = "Testing Build"; -$lang->testtask->blocked = "Blocked Build"; -$lang->testtask->done = "Tested Build"; +$lang->testtask->activate = "Activate"; +$lang->testtask->testing = "Testing"; +$lang->testtask->blocked = "Blocked"; +$lang->testtask->done = "Tested"; $lang->testtask->totalStatus = "All"; $lang->testtask->all = "All " . $lang->productCommon; @@ -54,10 +54,10 @@ $lang->testtask->end = 'End'; $lang->testtask->desc = 'Description'; $lang->testtask->mailto = 'Mailto'; $lang->testtask->status = 'Status'; -$lang->testtask->assignedTo = 'Assign'; +$lang->testtask->assignedTo = 'Assigned'; $lang->testtask->linkVersion = 'Version'; -$lang->testtask->lastRunAccount = "Run"; -$lang->testtask->lastRunTime = 'Time'; +$lang->testtask->lastRunAccount = 'Runner'; +$lang->testtask->lastRunTime = 'Last Run'; $lang->testtask->lastRunResult = 'Result'; $lang->testtask->reportField = 'Report'; $lang->testtask->files = 'Upload'; @@ -88,10 +88,10 @@ $lang->testtask->priList[2] = '2'; $lang->testtask->priList[4] = '4'; $lang->testtask->unlinkedCases = 'Unlinked Cases'; -$lang->testtask->linkByBuild = 'Copy by build'; -$lang->testtask->linkByStory = 'Linked by Story'; +$lang->testtask->linkByBuild = 'Copy from build'; +$lang->testtask->linkByStory = 'Link by Story'; $lang->testtask->linkByBug = 'Linked by Bug'; -$lang->testtask->linkBySuite = 'Linked by Suite'; +$lang->testtask->linkBySuite = 'Link by Suite'; $lang->testtask->passAll = 'All Pass'; $lang->testtask->pass = 'Pass'; $lang->testtask->fail = 'Failed'; @@ -102,8 +102,8 @@ $lang->testtask->confirmDelete = 'Do you want to delete this test build?'; $lang->testtask->confirmUnlinkCase = 'Do you want to unlink this Case?'; $lang->testtask->noticeNoOther = 'There are no other test task for this product'; -$lang->testtask->assignedToMe = 'Assigned to Me'; -$lang->testtask->allCases = 'All Cases'; +$lang->testtask->assignedToMe = 'My'; +$lang->testtask->allCases = 'AllCases'; $lang->testtask->lblCases = 'Cases'; $lang->testtask->lblUnlinkCase = 'Unlink Case'; diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index 563dee71c2..ba73c3c830 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -9,13 +9,13 @@ * @version $Id: en.php 4676 2013-04-26 06:08:23Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->todo->common = 'To-Do'; +$lang->todo->common = 'Todo'; $lang->todo->index = "Home"; -$lang->todo->create = "Create"; +$lang->todo->create = "Create Todo"; $lang->todo->batchCreate = "Batch Create"; $lang->todo->edit = "Edit"; $lang->todo->batchEdit = "Batch Edit"; -$lang->todo->view = "Info"; +$lang->todo->view = "Overview"; $lang->todo->finish = "Finish"; $lang->todo->batchFinish = "Batch Finish"; $lang->todo->export = "Export"; @@ -55,9 +55,9 @@ $lang->todo->every = 'Every'; $lang->todo->beforeDays = "%searly in advance to be done"; $lang->todo->dayNames = array(1 => 'Monday', 2 => 'Tuesday', 3 => 'Wednesday', 4 => 'Thursday', 5 => 'Friday', 6 => 'Saturday', 0 => 'Sunday'); -$lang->todo->confirmBug = 'This To-Do is related to Bug #%s. Do you want to edit it?'; -$lang->todo->confirmTask = 'This To-Do is related to Task #%s,Do you want to edit it?'; -$lang->todo->confirmStory = 'This To-Do is related to Story #%s,Do you want to edit it?'; +$lang->todo->confirmBug = 'This Todo is related to Bug #%s. Do you want to edit it?'; +$lang->todo->confirmTask = 'This Todo is related to Task #%s,Do you want to edit it?'; +$lang->todo->confirmStory = 'This Todo is related to Story #%s,Do you want to edit it?'; $lang->todo->statusList['wait'] = 'Wait'; $lang->todo->statusList['doing'] = 'Doing'; @@ -81,22 +81,22 @@ global $config; if($config->global->flow == 'onlyTest' or $config->global->flow == 'onlyStory') unset($lang->todo->typeList['task']); if($config->global->flow == 'onlyTask' or $config->global->flow == 'onlyStory') unset($lang->todo->typeList['bug']); -$lang->todo->confirmDelete = "Are you sure to delete this To-Do?"; -$lang->todo->thisIsPrivate = 'This is a private To-Do:)'; +$lang->todo->confirmDelete = "Are you sure to delete this Todo?"; +$lang->todo->thisIsPrivate = 'This is a private Todo'; $lang->todo->lblDisableDate = 'Set later.'; $lang->todo->lblBeforeDays = "%s early in advance to be done"; -$lang->todo->noTodo = 'No this type of to-dos.'; +$lang->todo->noTodo = 'No this type of Todo.'; $lang->todo->periods['today'] = 'Today'; $lang->todo->periods['yesterday'] = 'Yesterday'; -$lang->todo->periods['thisWeek'] = 'This Week'; -$lang->todo->periods['lastWeek'] = 'Last Week'; -$lang->todo->periods['thisMonth'] = 'This Month'; -$lang->todo->periods['lastmonth'] = 'Last Month'; -$lang->todo->periods['thisSeason'] = 'This Season'; -$lang->todo->periods['thisYear'] = 'This Year'; +$lang->todo->periods['thisWeek'] = 'ThisWeek'; +$lang->todo->periods['lastWeek'] = 'LastWeek'; +$lang->todo->periods['thisMonth'] = 'ThisMonth'; +$lang->todo->periods['lastmonth'] = 'LastMonth'; +$lang->todo->periods['thisSeason'] = 'ThisSeason'; +$lang->todo->periods['thisYear'] = 'ThisYear'; $lang->todo->periods['future'] = 'Pending'; -$lang->todo->periods['before'] = 'Undone'; +$lang->todo->periods['before'] = 'Unfinished'; $lang->todo->periods['all'] = 'All'; $lang->todo->periods['cycle'] = 'Cycle'; diff --git a/module/tree/lang/en.php b/module/tree/lang/en.php index 260c70104a..ea236ec550 100644 --- a/module/tree/lang/en.php +++ b/module/tree/lang/en.php @@ -13,21 +13,21 @@ $lang->tree = new stdclass(); $lang->tree->common = 'Module'; $lang->tree->edit = 'Edit'; $lang->tree->delete = 'Delete'; -$lang->tree->browse = 'General Module'; -$lang->tree->browseTask = 'Task Module'; -$lang->tree->manage = 'Manage Module'; +$lang->tree->browse = 'Manage General Module'; +$lang->tree->browseTask = 'Manage Task Module'; +$lang->tree->manage = 'Manage module'; $lang->tree->fix = 'Fix'; $lang->tree->manageProduct = "Manage {$lang->productCommon}"; $lang->tree->manageProject = "Manage {$lang->projectCommon}"; -$lang->tree->manageLine = 'Manage Product Line'; +$lang->tree->manageLine = 'Manage product line'; $lang->tree->manageBug = 'Manage Bug'; $lang->tree->manageCase = 'Manage Case'; $lang->tree->manageCaseLib = 'Manage Library'; $lang->tree->manageCustomDoc = 'Manage DocLib'; -$lang->tree->updateOrder = 'Update Order'; +$lang->tree->updateOrder = 'Sort'; $lang->tree->manageChild = 'Manage Child Module'; -$lang->tree->manageStoryChild = 'Manage Child Story'; -$lang->tree->manageLineChild = 'Manage Product Line'; +$lang->tree->manageStoryChild = 'Manage Child Module'; +$lang->tree->manageLineChild = 'Manage product line'; $lang->tree->manageBugChild = 'Manage Child Bug'; $lang->tree->manageCaseChild = 'Manage Child Case'; $lang->tree->manageCaselibChild = 'Manage Child Library'; diff --git a/module/user/lang/en.php b/module/user/lang/en.php index 060fbaadea..75b8896ea3 100644 --- a/module/user/lang/en.php +++ b/module/user/lang/en.php @@ -20,13 +20,13 @@ $lang->user->role = 'Role'; $lang->user->group = 'Group'; $lang->user->realname = 'Name'; $lang->user->nickname = 'Nickname'; -$lang->user->commiter = 'Commiter'; +$lang->user->commiter = 'SCM Account'; $lang->user->birthyear = 'Birth Year'; $lang->user->gender = 'Gender'; $lang->user->email = 'Email'; $lang->user->basicInfo = 'Basic Info'; $lang->user->accountInfo = 'Account'; -$lang->user->verify = 'Acceptance'; +$lang->user->verify = 'Safety Verification'; $lang->user->contactInfo = 'Contact'; $lang->user->skype = 'Skype'; $lang->user->qq = 'QQ'; @@ -48,8 +48,8 @@ $lang->user->verifyPassword = 'Enter your password'; $lang->user->resetPassword = 'Forgot Password?'; $lang->user->index = "Home"; -$lang->user->view = "Info"; -$lang->user->create = "Add"; +$lang->user->view = "Overview"; +$lang->user->create = "Add User"; $lang->user->batchCreate = "Batch Add User"; $lang->user->edit = "Edit"; $lang->user->batchEdit = "Batch Edit"; @@ -75,7 +75,7 @@ $lang->user->bug = 'Bug'; $lang->user->test = 'Test'; $lang->user->testTask = 'Test Task'; $lang->user->testCase = 'Test Case'; -$lang->user->todo = 'To-Do'; +$lang->user->todo = 'Todo'; $lang->user->story = 'Story'; $lang->user->dynamic = 'Dynamic'; @@ -102,9 +102,9 @@ $lang->user->roleList['dev'] = 'Developer'; $lang->user->roleList['qa'] = 'Tester'; $lang->user->roleList['pm'] = 'Project Manager'; $lang->user->roleList['po'] = 'Product Owner'; -$lang->user->roleList['td'] = 'Technical Director'; -$lang->user->roleList['pd'] = 'Product Director'; -$lang->user->roleList['qd'] = 'QA Director'; +$lang->user->roleList['td'] = 'Technical Manager'; +$lang->user->roleList['pd'] = 'Product Manager'; +$lang->user->roleList['qd'] = 'QA Manager'; $lang->user->roleList['top'] = 'Senior Manager'; $lang->user->roleList['others'] = 'Other'; @@ -128,15 +128,15 @@ $lang->user->tpl->content = 'Content'; $lang->user->tpl->public = 'Public'; $lang->user->placeholder = new stdclass(); -$lang->user->placeholder->account = 'letters, underline, and numbers,at lease three characters'; +$lang->user->placeholder->account = 'Letters, Underline and Numbers, at least 3 characters'; $lang->user->placeholder->password1 = 'six characters at lease '; $lang->user->placeholder->role = "Role affects content and user order."; $lang->user->placeholder->group = "Group decides user privilege."; -$lang->user->placeholder->commiter = 'Subversion Account'; +$lang->user->placeholder->commiter = 'Svn or Git like'; $lang->user->placeholder->verify = 'Password is required.'; -$lang->user->placeholder->passwordStrength[1] = 'letters and numbers, at lease six characters'; -$lang->user->placeholder->passwordStrength[2] = 'letters, numbers and special characters, at lease 10 characters'; +$lang->user->placeholder->passwordStrength[1] = 'Letters and Numbers, at least 6 characters'; +$lang->user->placeholder->passwordStrength[2] = 'Letters, Numbers and special characters, at lease 10 characters'; $lang->user->error = new stdclass(); $lang->user->error->account = "ID %s,must be contain letters, underline, and numbers,at lease three characters"; @@ -157,7 +157,7 @@ $lang->user->contacts->userList = 'User List'; $lang->user->contacts->manage = 'Manage'; $lang->user->contacts->contactsList = 'Contacts'; -$lang->user->contacts->selectedUsers = 'User'; +$lang->user->contacts->selectedUsers = 'Select User'; $lang->user->contacts->selectList = 'List'; $lang->user->contacts->createList = 'Create a List'; $lang->user->contacts->noListYet = 'No contact list exists. Please create a list first.'; From 884d9a85ed7ab3e050937e903bcfc58f03c84982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 11 Jan 2018 09:35:18 +0800 Subject: [PATCH 077/206] * Format code. --- module/productplan/lang/en.php | 14 +++++++------- module/project/lang/en.php | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/module/productplan/lang/en.php b/module/productplan/lang/en.php index 58aed5bbd8..1db1ccba00 100644 --- a/module/productplan/lang/en.php +++ b/module/productplan/lang/en.php @@ -52,13 +52,13 @@ $lang->productplan->bugs = 'Bugs'; $lang->productplan->hour = 'Hour'; $lang->productplan->project = $lang->projectCommon; -$lang->productplan->endList[7] = '1 Week'; -$lang->productplan->endList[14] = '2 Weeks'; -$lang->productplan->endList[31] = '1 Month'; -$lang->productplan->endList[62] = '2 Months'; -$lang->productplan->endList[93] = '3 Months'; -$lang->productplan->endList[186] = '6 Months'; -$lang->productplan->endList[365] = '1 Year'; +$lang->productplan->endList[7] = '1 Week'; +$lang->productplan->endList[14] = '2 Weeks'; +$lang->productplan->endList[31] = '1 Month'; +$lang->productplan->endList[62] = '2 Months'; +$lang->productplan->endList[93] = '3 Months'; +$lang->productplan->endList[186] = '6 Months'; +$lang->productplan->endList[365] = '1 Year'; $lang->productplan->endList[9999] = 'Future'; $lang->productplan->errorNoTitle = 'ID %s title should not be empty.'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 4712206b75..4abd754a74 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -170,7 +170,7 @@ $lang->project->groupFilter['pri']['noset'] = 'Not set'; $lang->project->groupFilter['assignedTo']['undone'] = 'Pending'; $lang->project->groupFilter['assignedTo']['all'] = $lang->project->all; -$lang->project->byQuery = 'Search'; +$lang->project->byQuery = 'Search'; /* 查询条件列表。*/ $lang->project->allProject = "All {$lang->projectCommon}"; @@ -286,10 +286,10 @@ $lang->project->featureBar['task']['needconfirm'] = 'StoryChanged'; $lang->project->featureBar['task']['status'] = $lang->project->statusSelects['']; $lang->project->treeLevel = array(); -$lang->project->treeLevel['root'] = 'Collapse All'; -$lang->project->treeLevel['story'] = 'Show Story'; -$lang->project->treeLevel['task'] = 'Show Task'; -$lang->project->treeLevel['all'] = 'Expand All'; +$lang->project->treeLevel['root'] = 'Collapse All'; +$lang->project->treeLevel['story'] = 'Show Story'; +$lang->project->treeLevel['task'] = 'Show Task'; +$lang->project->treeLevel['all'] = 'Expand All'; global $config; if($config->global->flow == 'onlyTask') From 9dc01a4ba2122a951f4562038ee5e9aa8008ea98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 11 Jan 2018 09:41:49 +0800 Subject: [PATCH 078/206] * Format code. --- module/testcase/lang/en.php | 36 +++++++++++++++++----------------- module/testcase/lang/zh-cn.php | 30 ++++++++++++++-------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index fc40f8c1d3..848ea11f67 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -105,23 +105,23 @@ $lang->testcase->stepChild = 'Child'; $lang->testcase->new = 'New'; -$lang->testcase->num = 'Cases:'; +$lang->testcase->num = 'Cases:'; $lang->testcase->deleteStep = 'Delete'; $lang->testcase->insertBefore = 'Inserted Before'; $lang->testcase->insertAfter = 'Inserted After'; -$lang->testcase->assignToMe = 'AssignedToMe'; -$lang->testcase->openedByMe = 'CreatedByMe'; -$lang->testcase->allCases = 'All'; -$lang->testcase->needConfirm = 'StoryChanged'; -$lang->testcase->bySearch = 'Search'; +$lang->testcase->assignToMe = 'AssignedToMe'; +$lang->testcase->openedByMe = 'CreatedByMe'; +$lang->testcase->allCases = 'All'; +$lang->testcase->needConfirm = 'StoryChanged'; +$lang->testcase->bySearch = 'Search'; -$lang->testcase->lblStory = 'Story'; -$lang->testcase->lblLastEdited = 'Last Edit'; -$lang->testcase->lblTypeValue = 'Type List'; -$lang->testcase->lblStageValue = 'Stage List'; -$lang->testcase->lblStatusValue = 'Status List'; +$lang->testcase->lblStory = 'Story'; +$lang->testcase->lblLastEdited = 'Last Edit'; +$lang->testcase->lblTypeValue = 'Type List'; +$lang->testcase->lblStageValue = 'Stage List'; +$lang->testcase->lblStatusValue = 'Status List'; $lang->testcase->legendBasicInfo = 'Basic Info'; $lang->testcase->legendAttatch = 'File'; @@ -152,13 +152,13 @@ $lang->testcase->typeList['security'] = 'Security'; $lang->testcase->typeList['interface'] = 'Interface'; $lang->testcase->typeList['other'] = 'Other'; -$lang->testcase->stageList[''] = ''; -$lang->testcase->stageList['unittest'] = 'Unit Test'; -$lang->testcase->stageList['feature'] = 'Function Test'; -$lang->testcase->stageList['intergrate'] = 'Integration Test'; -$lang->testcase->stageList['system'] = 'System Test'; -$lang->testcase->stageList['smoke'] = 'Smoking Test'; -$lang->testcase->stageList['bvt'] = 'BVT Test'; +$lang->testcase->stageList[''] = ''; +$lang->testcase->stageList['unittest'] = 'Unit Test'; +$lang->testcase->stageList['feature'] = 'Function Test'; +$lang->testcase->stageList['intergrate'] = 'Integration Test'; +$lang->testcase->stageList['system'] = 'System Test'; +$lang->testcase->stageList['smoke'] = 'Smoking Test'; +$lang->testcase->stageList['bvt'] = 'BVT Test'; $lang->testcase->reviewResultList[''] = ''; $lang->testcase->reviewResultList['pass'] = 'Pass'; diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index a04e899b98..7faacd6e49 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -111,23 +111,23 @@ $lang->testcase->deleteStep = '删除'; $lang->testcase->insertBefore = '之前添加'; $lang->testcase->insertAfter = '之后添加'; -$lang->testcase->assignToMe = '给我的用例'; -$lang->testcase->openedByMe = '我建的用例'; -$lang->testcase->allCases = '所有'; -$lang->testcase->needConfirm = '需求变动'; -$lang->testcase->bySearch = '搜索'; +$lang->testcase->assignToMe = '给我的用例'; +$lang->testcase->openedByMe = '我建的用例'; +$lang->testcase->allCases = '所有'; +$lang->testcase->needConfirm = '需求变动'; +$lang->testcase->bySearch = '搜索'; -$lang->testcase->lblStory = '相关需求'; -$lang->testcase->lblLastEdited = '最后编辑'; -$lang->testcase->lblTypeValue = '类型可选值列表'; -$lang->testcase->lblStageValue = '阶段可选值列表'; -$lang->testcase->lblStatusValue = '状态可选值列表'; +$lang->testcase->lblStory = '相关需求'; +$lang->testcase->lblLastEdited = '最后编辑'; +$lang->testcase->lblTypeValue = '类型可选值列表'; +$lang->testcase->lblStageValue = '阶段可选值列表'; +$lang->testcase->lblStatusValue = '状态可选值列表'; -$lang->testcase->legendBasicInfo = '基本信息'; -$lang->testcase->legendAttatch = '附件'; -$lang->testcase->legendLinkBugs = '相关Bug'; -$lang->testcase->legendOpenAndEdit = '创建编辑'; -$lang->testcase->legendComment = '备注'; +$lang->testcase->legendBasicInfo = '基本信息'; +$lang->testcase->legendAttatch = '附件'; +$lang->testcase->legendLinkBugs = '相关Bug'; +$lang->testcase->legendOpenAndEdit = '创建编辑'; +$lang->testcase->legendComment = '备注'; $lang->testcase->confirmDelete = '您确认要删除该测试用例吗?'; $lang->testcase->confirmBatchDelete = '您确认要批量删除这些测试用例吗?'; From bd1ea46a9c631d3a34f18d2e6158b82f4cc23c08 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 11 Jan 2018 11:05:50 +0800 Subject: [PATCH 079/206] * finish task #3560. --- db/zentao.sql | 2 + module/action/control.php | 3 - module/action/model.php | 2 +- module/admin/control.php | 3 + module/admin/view/log.html.php | 9 +-- module/bug/control.php | 37 ++--------- module/bug/model.php | 43 ++++++++++--- module/common/lang/menuOrder.php | 1 + module/common/lang/zh-cn.php | 6 +- module/mail/control.php | 1 + module/mail/js/common.js | 1 + module/mail/lang/en.php | 4 +- module/mail/lang/zh-cn.php | 4 +- module/mail/view/browse.html.php | 2 +- module/mail/view/detect.html.php | 2 +- module/mail/view/edit.html.php | 2 +- module/mail/view/index.html.php | 2 +- module/mail/view/save.html.php | 2 +- module/mail/view/sendcloud.html.php | 2 +- module/mail/view/sendclouduser.html.php | 2 +- module/mail/view/test.html.php | 2 +- module/mail/view/ztcloud.html.php | 2 +- module/message/config.php | 26 ++++++++ module/message/control.php | 56 +++++++++++++++++ module/message/css/setting.css | 2 + module/message/js/setting.js | 33 ++++++++++ module/message/lang/en.php | 7 +++ module/message/lang/zh-cn.php | 7 +++ module/message/model.php | 84 +++++++++++++++++++++++++ module/message/view/header.html.php | 12 ++++ module/message/view/setting.html.php | 74 ++++++++++++++++++++++ module/project/control.php | 3 - module/story/control.php | 21 +------ module/story/model.php | 48 +++++++++++--- module/task/control.php | 18 +----- module/task/model.php | 43 ++++++++++--- module/testtask/control.php | 7 +-- module/testtask/model.php | 66 +++++++++++++------ module/webhook/config.php | 9 --- module/webhook/control.php | 10 +-- module/webhook/model.php | 40 ------------ module/webhook/view/create.html.php | 29 +-------- module/webhook/view/edit.html.php | 30 +-------- module/webhook/view/header.html.php | 9 ++- module/webhook/view/log.html.php | 2 +- 45 files changed, 511 insertions(+), 259 deletions(-) create mode 100644 module/mail/js/common.js create mode 100644 module/message/config.php create mode 100644 module/message/control.php create mode 100644 module/message/css/setting.css create mode 100644 module/message/js/setting.js create mode 100644 module/message/lang/en.php create mode 100644 module/message/lang/zh-cn.php create mode 100644 module/message/model.php create mode 100644 module/message/view/header.html.php create mode 100644 module/message/view/setting.html.php diff --git a/db/zentao.sql b/db/zentao.sql index a97519813c..6e0ae54339 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -747,12 +747,14 @@ CREATE TABLE IF NOT EXISTS `zt_todo` ( `begin` smallint(4) unsigned zerofill NOT NULL, `end` smallint(4) unsigned zerofill NOT NULL, `type` char(10) NOT NULL, + `cycle` tinyint(3) unsigned NOT NULL DEFAULT '0', `idvalue` mediumint(8) unsigned NOT NULL default '0', `pri` tinyint(3) unsigned NOT NULL, `name` char(150) NOT NULL, `desc` text NOT NULL, `status` enum('wait','doing','done') NOT NULL DEFAULT 'wait', `private` tinyint(1) NOT NULL, + `config` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `todo` (`account`,`date`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/module/action/control.php b/module/action/control.php index 5916f33db9..be3f932140 100755 --- a/module/action/control.php +++ b/module/action/control.php @@ -115,9 +115,6 @@ class action extends control public function comment($objectType, $objectID) { $actionID = $this->action->create($objectType, $objectID, 'Commented', $this->post->comment); - - $moduleName = $objectType == 'case' ? 'testcase' : $objectType; - $this->loadModel($moduleName)->sendmail($objectID, $actionID); die(js::reload('parent')); } diff --git a/module/action/model.php b/module/action/model.php index 52b1243bc6..6460b69445 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -61,7 +61,7 @@ class actionModel extends model $this->file->updateObjectID($this->post->uid, $objectID, $objectType); - $this->loadModel('webhook')->send($objectType, $objectID, $actionType, $actionID); + $this->loadModel('message')->send($objectType, $objectID, $actionType, $actionID); return $actionID; } diff --git a/module/admin/control.php b/module/admin/control.php index c4a23b65ec..db0f309c6a 100644 --- a/module/admin/control.php +++ b/module/admin/control.php @@ -331,6 +331,9 @@ class admin extends control $this->send(array('result' => 'success', 'message' => $this->lang->admin->saveSuccess, 'locate' => 'reload')); } + $this->loadModel('message'); + $this->loadModel('webhook'); + $this->view->title = $this->lang->admin->log; $this->view->position[] = html::a($this->createLink('webhook', 'browse'), $this->lang->admin->api); $this->view->position[] = $this->lang->admin->log; diff --git a/module/admin/view/log.html.php b/module/admin/view/log.html.php index 0e14808819..58573316b4 100644 --- a/module/admin/view/log.html.php +++ b/module/admin/view/log.html.php @@ -10,16 +10,9 @@ * @link http://www.zentao.net */ ?> - +app->getModuleRoot() . 'webhook/view/header.html.php';?>
      -
      -
      - createLink('webhook', 'browse'), $lang->admin->api);?> - admin->log;?> - admin->setting;?> -
      -
      testcase->reviewedDate;?>testcase->reviewedDateAB;?>
      testcase->reviewResult;?>testcase->reviewResultAB;?> testcase->reviewResultList, '', 'class=form-control');?>
      testcase->reviewedBy;?>testcase->reviewedByAB;?> user->account, "class='form-control chosen' multiple");?>
      idAB;?> priAB;?> bug->title;?> testreport->bugTitle;?> openedByAB;?> bug->resolvedBy;?> bug->resolvedDate;?>
      idAB;?> priAB;?> story->title;?> testreport->storyTitle;?> openedByAB;?> assignedToAB;?> story->estimateAB;?>
      diff --git a/module/bug/control.php b/module/bug/control.php index bab86e6424..aecb04362d 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -248,7 +248,6 @@ class bug extends control } $actionID = $this->action->create('bug', $bugID, 'Opened'); - $this->bug->sendmail($bugID, $actionID); $extras = str_replace(array(',', ' '), array('&', ''), $extras); parse_str($extras, $output); @@ -406,7 +405,6 @@ class bug extends control if(!empty($_POST)) { $actions = $this->bug->batchCreate($productID, $branch); - foreach($actions as $bugID => $actionID) $this->bug->sendmail($bugID, $actionID); die(js::locate($this->session->bugList, 'parent')); } @@ -548,7 +546,6 @@ class bug extends control if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ; $actionID = $this->action->create('bug', $bugID, $action, $fileAction . $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); } $bug = $this->bug->getById($bugID); @@ -643,7 +640,6 @@ class bug extends control $actionID = $this->action->create('bug', $bugID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); $bug = $this->bug->getById($bugID); if($bug->toTask != 0) @@ -768,7 +764,6 @@ class bug extends control if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('bug', $bugID, 'Assigned', $this->post->comment, $this->post->assignedTo); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); if(isonlybody()) die(js::closeModal('parent.parent')); die(js::locate($this->createLink('bug', 'view', "bugID=$bugID"), 'parent')); @@ -805,7 +800,6 @@ class bug extends control $this->loadModel('action'); $actionID = $this->action->create('bug', $bugID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); } } $this->loadModel('score')->create('ajax', 'batchOther'); @@ -833,7 +827,6 @@ class bug extends control $this->loadModel('action'); $actionID = $this->action->create('bug', $bugID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); } } $this->loadModel('score')->create('ajax', 'batchOther'); @@ -861,7 +854,6 @@ class bug extends control if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('bug', $bugID, 'Assigned', $this->post->comment, $this->post->assignedTo); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); } $this->loadModel('score')->create('ajax', 'batchOther'); } @@ -885,7 +877,6 @@ class bug extends control if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('bug', $bugID, 'bugConfirmed', $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->bug->sendmail($bugID, $actionID); if(isonlybody()) die(js::closeModal('parent.parent')); die(js::locate($this->createLink('bug', 'view', "bugID=$bugID"), 'parent')); } @@ -916,11 +907,7 @@ class bug extends control $bugIDList = array_unique($bugIDList); $this->bug->batchConfirm($bugIDList); if(dao::isError()) die(js::error(dao::getError())); - foreach($bugIDList as $bugID) - { - $actionID = $this->action->create('bug', $bugID, 'bugConfirmed'); - $this->bug->sendmail($bugID, $actionID); - } + foreach($bugIDList as $bugID) $this->action->create('bug', $bugID, 'bugConfirmed'); $this->loadModel('score')->create('ajax', 'batchOther'); die(js::locate($this->session->bugList, 'parent')); } @@ -942,7 +929,6 @@ class bug extends control $fileAction = !empty($files) ? $this->lang->addFiles . join(',', $files) . "\n" : ''; $actionID = $this->action->create('bug', $bugID, 'Resolved', $fileAction . $this->post->comment, $this->post->resolution . ($this->post->duplicateBug ? ':' . (int)$this->post->duplicateBug : '')); - $this->bug->sendmail($bugID, $actionID); $bug = $this->bug->getById($bugID); if($bug->toTask != 0) @@ -997,11 +983,7 @@ class bug extends control $bugIDList = array_unique($bugIDList); $bugIDList = $this->bug->batchResolve($bugIDList, $resolution, $resolvedBuild); if(dao::isError()) die(js::error(dao::getError())); - foreach($bugIDList as $bugID) - { - $actionID = $this->action->create('bug', $bugID, 'Resolved', '', $resolution); - $this->bug->sendmail($bugID, $actionID); - } + foreach($bugIDList as $bugID) $this->action->create('bug', $bugID, 'Resolved', '', $resolution); $this->loadModel('score')->create('ajax', 'batchOther'); die(js::locate($this->session->bugList, 'parent')); } @@ -1020,8 +1002,7 @@ class bug extends control $this->bug->activate($bugID); if(dao::isError()) die(js::error(dao::getError())); $files = $this->loadModel('file')->saveUpload('bug', $bugID); - $actionID = $this->action->create('bug', $bugID, 'Activated', $this->post->comment); - $this->bug->sendmail($bugID, $actionID); + $this->action->create('bug', $bugID, 'Activated', $this->post->comment); if(isonlybody()) die(js::closeModal('parent.parent')); die(js::locate($this->createLink('bug', 'view', "bugID=$bugID"), 'parent')); } @@ -1055,8 +1036,7 @@ class bug extends control { $this->bug->close($bugID); if(dao::isError()) die(js::error(dao::getError())); - $actionID = $this->action->create('bug', $bugID, 'Closed', $this->post->comment); - $this->bug->sendmail($bugID, $actionID); + $this->action->create('bug', $bugID, 'Closed', $this->post->comment); if(isonlybody()) die(js::closeModal('parent.parent')); die(js::locate($this->createLink('bug', 'view', "bugID=$bugID"), 'parent')); } @@ -1188,8 +1168,7 @@ class bug extends control $this->bug->close($bugID); - $actionID = $this->action->create('bug', $bugID, 'Closed'); - $this->bug->sendmail($bugID, $actionID); + $this->action->create('bug', $bugID, 'Closed'); } $this->loadModel('score')->create('ajax', 'batchOther'); if(isset($skipBugs)) echo js::alert(sprintf($this->lang->bug->skipClose, join(',', $skipBugs))); @@ -1208,11 +1187,7 @@ class bug extends control if($this->post->statusList) { $activateBugs = $this->bug->batchActivate(); - foreach($activateBugs as $bugID => $bug) - { - $actionID = $this->action->create('bug', $bugID, 'Activated', $bug['comment']); - $this->bug->sendmail($bugID, $actionID); - } + foreach($activateBugs as $bugID => $bug) $this->action->create('bug', $bugID, 'Activated', $bug['comment']); $this->loadModel('score')->create('ajax', 'batchOther'); die(js::locate($this->session->bugList, 'parent')); } diff --git a/module/bug/model.php b/module/bug/model.php index 0f3d11b426..f630fe47bc 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -2543,9 +2543,8 @@ class bugModel extends model public function sendmail($bugID, $actionID) { $this->loadModel('mail'); - $bug = $this->getByID($bugID); - $productName = $this->loadModel('product')->getById($bug->product)->name; - $users = $this->loadModel('user')->getPairs('noletter'); + $bug = $this->getByID($bugID); + $users = $this->loadModel('user')->getPairs('noletter'); /* Get action info. */ $action = $this->loadModel('action')->getById($actionID); @@ -2580,12 +2579,44 @@ class bugModel extends model ob_end_clean(); chdir($oldcwd); + $sendUsers = $this->getToAndCcList($bug); + if(!$sendUsers) return; + list($toList, $ccList) = $sendUsers; + $subject = $this->getSubject($bug); + + /* Send it. */ + $this->mail->send($toList, $subject, $mailContent, $ccList); + if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + } + + /** + * Get subject. + * + * @param object $bug + * @access public + * @return string + */ + public function getSubject($bug) + { + $productName = $this->loadModel('product')->getById($bug->product)->name; + return 'BUG #'. $bug->id . ' ' . $bug->title . ' - ' . $productName; + } + + /** + * Get toList and ccList. + * + * @param object $bug + * @access public + * @return bool|array + */ + public function getToAndCcList($bug) + { /* Set toList and ccList. */ $toList = $bug->assignedTo; $ccList = trim($bug->mailto, ','); if(empty($toList)) { - if(empty($ccList)) return; + if(empty($ccList)) return false; if(strpos($ccList, ',') === false) { $toList = $ccList; @@ -2603,8 +2634,6 @@ class bugModel extends model $toList = $bug->resolvedBy; } - /* Send it. */ - $this->mail->send($toList, 'BUG #'. $bug->id . ' ' . $bug->title . ' - ' . $productName, $mailContent, $ccList); - if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + return array($toList, $ccList); } } diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php index 482565d152..a2561ca4c8 100644 --- a/module/common/lang/menuOrder.php +++ b/module/common/lang/menuOrder.php @@ -112,6 +112,7 @@ $lang->user->menuOrder = $lang->company->menuOrder; $lang->admin->menuOrder[5] = 'index'; $lang->admin->menuOrder[10] = 'extension'; $lang->admin->menuOrder[15] = 'custom'; +$lang->admin->menuOrder[19] = 'message'; $lang->admin->menuOrder[20] = 'mail'; $lang->admin->menuOrder[25] = 'custom'; $lang->admin->menuOrder[30] = 'convert'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index b6433b8b48..50bb493075 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -339,13 +339,12 @@ $lang->admin->menu = new stdclass(); $lang->admin->menu->index = array('link' => '首页|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); $lang->admin->menu->extension = array('link' => '插件|extension|browse', 'subModule' => 'extension'); $lang->admin->menu->custom = array('link' => '自定义|custom|set', 'subModule' => 'custom'); -$lang->admin->menu->mail = array('link' => '发信|mail|index', 'subModule' => 'mail'); +$lang->admin->menu->message = array('link' => '消息|message|index', 'subModule' => 'message,mail,webhook'); $lang->admin->menu->backup = array('link' => '备份|backup|index', 'subModule' => 'backup'); $lang->admin->menu->safe = array('link' => '安全|admin|safe', 'alias' => 'checkweak'); $lang->admin->menu->cron = array('link' => '计划任务|cron|index', 'subModule' => 'cron'); $lang->admin->menu->trashes = array('link' => '回收站|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => '二次开发|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); -$lang->admin->menu->api = array('link' => '接口|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); $lang->admin->menu->sso = '然之集成|admin|sso'; $lang->convert = new stdclass(); @@ -360,6 +359,7 @@ $lang->cron = new stdclass(); $lang->dev = new stdclass(); $lang->entry = new stdclass(); $lang->webhook = new stdclass(); +$lang->message = new stdclass(); $lang->search = new stdclass(); $lang->convert->menu = $lang->admin->menu; @@ -374,6 +374,7 @@ $lang->mail->menu = $lang->admin->menu; $lang->dev->menu = $lang->admin->menu; $lang->entry->menu = $lang->admin->menu; $lang->webhook->menu = $lang->admin->menu; +$lang->message->menu = $lang->admin->menu; /* 菜单分组。*/ $lang->menugroup = new stdclass(); @@ -407,6 +408,7 @@ $lang->menugroup->mail = 'admin'; $lang->menugroup->dev = 'admin'; $lang->menugroup->entry = 'admin'; $lang->menugroup->webhook = 'admin'; +$lang->menugroup->message = 'admin'; /* 错误提示信息。*/ $lang->error = new stdclass(); diff --git a/module/mail/control.php b/module/mail/control.php index 63e4d80490..a43cb603a1 100755 --- a/module/mail/control.php +++ b/module/mail/control.php @@ -20,6 +20,7 @@ class mail extends control public function __construct($moduleName = '', $methodName = '') { parent::__construct($moduleName, $methodName); + $this->loadModel('message'); /* Task #1967. check the function of fsocket. */ if(isset($this->config->mail->mta) and $this->config->mail->mta != 'sendcloud' and !function_exists('fsockopen')) diff --git a/module/mail/js/common.js b/module/mail/js/common.js new file mode 100644 index 0000000000..51e62bed8c --- /dev/null +++ b/module/mail/js/common.js @@ -0,0 +1 @@ +$(function(){$('#featurebar .nav #mailTab').addClass('active');}) diff --git a/module/mail/lang/en.php b/module/mail/lang/en.php index 08def3969e..084390bae1 100755 --- a/module/mail/lang/en.php +++ b/module/mail/lang/en.php @@ -51,8 +51,8 @@ $lang->mail->sendTime = 'Send Date'; $lang->mail->status = 'Status'; $lang->mail->failReason = 'Fail Reason'; -$lang->mail->statusList['send'] = 'Sent'; -$lang->mail->statusList['fail'] = 'Failed'; +$lang->mail->statusList['sended'] = 'Sent'; +$lang->mail->statusList['fail'] = 'Failed'; $lang->mail->turnonList[1] = 'On'; $lang->mail->turnonList[0] = 'Off'; diff --git a/module/mail/lang/zh-cn.php b/module/mail/lang/zh-cn.php index 0f44839a0a..8a3942fa18 100755 --- a/module/mail/lang/zh-cn.php +++ b/module/mail/lang/zh-cn.php @@ -51,8 +51,8 @@ $lang->mail->sendTime = '发送时间'; $lang->mail->status = '状态'; $lang->mail->failReason = '失败原因'; -$lang->mail->statusList['send'] = '成功'; -$lang->mail->statusList['fail'] = '失败'; +$lang->mail->statusList['sended'] = '成功'; +$lang->mail->statusList['fail'] = '失败'; $lang->mail->turnonList[1] = '打开'; $lang->mail->turnonList[0] = '关闭'; diff --git a/module/mail/view/browse.html.php b/module/mail/view/browse.html.php index 92eb39e186..b74c40dfc6 100644 --- a/module/mail/view/browse.html.php +++ b/module/mail/view/browse.html.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ ?> - +app->getModuleRoot() . 'message/view/header.html.php';?>
      mail->browse?>
      diff --git a/module/mail/view/detect.html.php b/module/mail/view/detect.html.php index 8264335c10..fd5fc1c619 100755 --- a/module/mail/view/detect.html.php +++ b/module/mail/view/detect.html.php @@ -9,8 +9,8 @@ * @version $Id$ * @link http://www.zentao.net */ -include '../../common/view/header.html.php'; ?> +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/mail/view/edit.html.php b/module/mail/view/edit.html.php index 7e5b43e58c..d52fd44c00 100755 --- a/module/mail/view/edit.html.php +++ b/module/mail/view/edit.html.php @@ -9,8 +9,8 @@ * @version $Id$ * @link http://www.zentao.net */ -include '../../common/view/header.html.php'; ?> +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/mail/view/index.html.php b/module/mail/view/index.html.php index 2dbfb9e2eb..dc68624ab7 100755 --- a/module/mail/view/index.html.php +++ b/module/mail/view/index.html.php @@ -9,8 +9,8 @@ * @version $Id$ * @link http://www.zentao.net */ -include '../../common/view/header.html.php'; ?> +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/mail/view/save.html.php b/module/mail/view/save.html.php index a5fa5d1cb7..b3e122d42e 100755 --- a/module/mail/view/save.html.php +++ b/module/mail/view/save.html.php @@ -9,8 +9,8 @@ * @version $Id$ * @link http://www.zentao.net */ -include '../../common/view/header.html.php'; ?> +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/mail/view/sendcloud.html.php b/module/mail/view/sendcloud.html.php index 1979620c6b..0b3a3896c2 100755 --- a/module/mail/view/sendcloud.html.php +++ b/module/mail/view/sendcloud.html.php @@ -9,8 +9,8 @@ * @version $Id$ * @link http://www.zentao.net */ -include '../../common/view/header.html.php'; ?> +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/mail/view/sendclouduser.html.php b/module/mail/view/sendclouduser.html.php index 5011b01424..754a088fd7 100644 --- a/module/mail/view/sendclouduser.html.php +++ b/module/mail/view/sendclouduser.html.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ ?> - +app->getModuleRoot() . 'message/view/header.html.php';?>
      mail->sendcloudUser?>
      diff --git a/module/mail/view/test.html.php b/module/mail/view/test.html.php index a8f14ba5f0..a5841c071e 100755 --- a/module/mail/view/test.html.php +++ b/module/mail/view/test.html.php @@ -15,7 +15,7 @@
      - +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/mail/view/ztcloud.html.php b/module/mail/view/ztcloud.html.php index 26f6aff640..2cddeb04a8 100644 --- a/module/mail/view/ztcloud.html.php +++ b/module/mail/view/ztcloud.html.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ ?> - +app->getModuleRoot() . 'message/view/header.html.php';?>
      diff --git a/module/message/config.php b/module/message/config.php new file mode 100644 index 0000000000..c2c247eb93 --- /dev/null +++ b/module/message/config.php @@ -0,0 +1,26 @@ +message->objectTypes = array(); +$config->message->objectTypes['product'] = array('opened', 'edited', 'closed', 'undeleted'); +$config->message->objectTypes['story'] = array('opened', 'edited', 'commented', 'frombug', 'changed', 'reviewed', 'closed', 'activated'); +$config->message->objectTypes['productplan'] = array('opened', 'edited'); +$config->message->objectTypes['project'] = array('opened', 'edited', 'started', 'delayed', 'suspended', 'closed', 'activated', 'undeleted'); +$config->message->objectTypes['task'] = array('opened', 'edited', 'commented', 'assigned', 'confirmed', 'started', 'finished', 'paused', 'canceled', 'restarted', 'closed', 'activated'); +$config->message->objectTypes['bug'] = array('opened', 'edited', 'commented', 'assigned', 'confirmed', 'bugconfirmed', 'resolved', 'closed', 'activated'); +$config->message->objectTypes['case'] = array('opened', 'edited', 'commented', 'reviewed', 'confirmed'); +$config->message->objectTypes['testtask'] = array('opened', 'edited', 'started', 'blocked', 'closed', 'activated'); +$config->message->objectTypes['todo'] = array('opened', 'edited'); + +$config->message->available['mail']['story'] = $config->message->objectTypes['story']; +$config->message->available['mail']['task'] = $config->message->objectTypes['task']; +$config->message->available['mail']['bug'] = $config->message->objectTypes['bug']; +$config->message->available['mail']['testtask'] = array('opened', 'edited', 'closed'); + +$config->message->available['webhook'] = $config->message->objectTypes; +$config->message->available['message'] = $config->message->objectTypes; + +$config->message->typeLink['mail'] = 'mail|index'; +$config->message->typeLink['webhook'] = 'webhook|browse'; + +$config->message->setting['message']['setting'] = $config->message->available['message']; +$config->message->setting['webhook']['setting'] = $config->message->available['webhook']; +$config->message->setting['mail']['setting'] = $config->message->available['mail']; diff --git a/module/message/control.php b/module/message/control.php new file mode 100644 index 0000000000..4d97205b76 --- /dev/null +++ b/module/message/control.php @@ -0,0 +1,56 @@ + + * @package message + * @version $Id$ + * @link http://www.zentao.net + */ +class message extends control +{ + /** + * Index + * + * @access public + * @return void + */ + public function index() + { + $this->locate($this->createLink('mail', 'index')); + } + + /** + * Setting + * + * @access public + * @return void + */ + public function setting() + { + if($_POST) + { + $data = fixer::input('post')->get(); + $data->messageSetting = json_encode($data->messageSetting); + $this->loadModel('setting')->setItem('system.message.setting', $data->messageSetting); + die(js::reload('parent')); + } + + $this->loadModel('webhook'); + $this->loadModel('action'); + + $this->view->title = $this->lang->message->setting; + $this->view->position[] = $this->lang->message->common; + $this->view->position[] = $this->lang->message->setting; + + $users = $this->loadModel('user')->getPairs('noletter'); + unset($users['']); + + $this->view->users = $users; + $this->view->objectTypes = $this->message->getObjectTypes(); + $this->view->objectActions = $this->message->getObjectActions(); + $this->display(); + } +} diff --git a/module/message/css/setting.css b/module/message/css/setting.css new file mode 100644 index 0000000000..2541bc777f --- /dev/null +++ b/module/message/css/setting.css @@ -0,0 +1,2 @@ +.checkbox-inline + .checkbox-inline {margin:0px;} +.checkbox-inline {margin:0px; margin-right:10px !important; width:70px;} diff --git a/module/message/js/setting.js b/module/message/js/setting.js new file mode 100644 index 0000000000..25772dcf17 --- /dev/null +++ b/module/message/js/setting.js @@ -0,0 +1,33 @@ +$(function() +{ + $('.objectType').click(function() + { + if($(this).prop('checked')) + { + $(this).closest('tr').find(':checkbox').prop('checked', true); + } + else + { + $(this).closest('tr').find(':checkbox').prop('checked', false); + } + }); + + $('.messageType').click(function() + { + var index = $(this).closest('th').index(); + if($(this).prop('checked')) + { + $(this).closest('table').find('tbody').find('tr').each(function() + { + $(this).find('td').eq(index).find(':checkbox').prop('checked', true); + }) + } + else + { + $(this).closest('table').find('tbody').find('tr').each(function() + { + $(this).find('td').eq(index).find(':checkbox').prop('checked', false); + }) + } + }); +}); diff --git a/module/message/lang/en.php b/module/message/lang/en.php new file mode 100644 index 0000000000..824ab306a5 --- /dev/null +++ b/module/message/lang/en.php @@ -0,0 +1,7 @@ +message->common = 'Message'; +$lang->message->setting = 'Setting'; + +$lang->message->typeList['mail'] = 'Mail'; +$lang->message->typeList['message'] = 'Message'; +$lang->message->typeList['webhook'] = 'Webhook'; diff --git a/module/message/lang/zh-cn.php b/module/message/lang/zh-cn.php new file mode 100644 index 0000000000..bfce451eb9 --- /dev/null +++ b/module/message/lang/zh-cn.php @@ -0,0 +1,7 @@ +message->common = '消息'; +$lang->message->setting = '设置'; + +$lang->message->typeList['mail'] = '邮件'; +$lang->message->typeList['message'] = '消息'; +$lang->message->typeList['webhook'] = 'Webhook'; diff --git a/module/message/model.php b/module/message/model.php new file mode 100644 index 0000000000..185ff0652c --- /dev/null +++ b/module/message/model.php @@ -0,0 +1,84 @@ + + * @package message + * @version $Id$ + * @link http://www.zentao.net + */ +class messageModel extends model +{ + /** + * Get objectTypes + * + * @access public + * @return array + */ + public function getObjectTypes() + { + $objectTypes = array(); + foreach($this->config->message->objectTypes as $objectType => $actions) + { + $objectTypes[$objectType] = $this->lang->action->objectTypes[$objectType]; + } + return $objectTypes; + } + + /** + * Get object actions. + * + * @access public + * @return array + */ + public function getObjectActions() + { + $objectActions = array(); + foreach($this->config->message->objectTypes as $objectType => $actions) + { + foreach($actions as $action) + { + $objectActions[$objectType][$action] = str_replace($this->lang->webhook->trimWords, '', $this->lang->action->label->$action); + } + } + return $objectActions; + } + + /** + * Check send. + * + * @param string $objectType + * @param int $objectID + * @param string $actionType + * @param int $actionID + * @access public + * @return void + */ + public function send($objectType, $objectID, $actionType, $actionID) + { + $messageSetting = $this->config->message->setting; + if(is_string($messageSetting)) $messageSetting = json_decode($messageSetting, true); + + if(isset($messageSetting['mail'])) + { + $actions = $messageSetting['mail']['setting']; + if(isset($actions[$objectType]) and in_array($actionType, $actions[$objectType])) + { + $moduleName = $objectType == 'case' ? 'testcase' : $objectType; + $this->loadModel($moduleName); + if(method_exists($this->$moduleName, 'sendmail')) $this->$moduleName->sendmail($objectID, $actionID); + } + } + + if(isset($messageSetting['webhook'])) + { + $actions = $messageSetting['webhook']['setting']; + if(isset($actions[$objectType]) and in_array($actionType, $actions[$objectType])) + { + $this->loadModel('webhook')->send($objectType, $objectID, $actionType, $actionID); + } + } + } +} diff --git a/module/message/view/header.html.php b/module/message/view/header.html.php new file mode 100644 index 0000000000..5d0ff360d2 --- /dev/null +++ b/module/message/view/header.html.php @@ -0,0 +1,12 @@ + +
      + +
      diff --git a/module/message/view/setting.html.php b/module/message/view/setting.html.php new file mode 100644 index 0000000000..0cd44f0bae --- /dev/null +++ b/module/message/view/setting.html.php @@ -0,0 +1,74 @@ + + * @package message + * @version $Id$ + * @link http://www.zentao.net + */ +?> + + +
      + + + message->typeList as $type => $typeName):?> + + + + + message->objectTypes as $objectType => $actions):?> + + + message->setting) ? json_decode($config->message->setting, true) : $config->message->setting;?> + message->typeList as $type => $typeName):?> + message->available[$type][$objectType])):?> + message->available[$type][$objectType] as $action) + { + if(!isset($objectActions[$objectType][$action])) continue; + $availableActions[$action] = $objectActions[$objectType][$action]; + } + ?> + + + + + + + + + + + + + +
      + + + message->condition[$type][$objectType])) + { + $moduleName = $objectType == 'case' ? 'testcase' : $objectType; + $this->app->loadLang($moduleName); + foreach(explode(',', $config->message->condition[$type][$objectType]) as $condition) + { + $listKey = $condition . 'List'; + $list = isset($this->lang->$moduleName->$listKey) ? $this->lang->$moduleName->$listKey : $users; + echo html::select("messageSetting[$type][condition][$objectType][$condition][]", $list, isset($messageSetting[$type]['condition'][$objectType][$condition]) ? join(',', $messageSetting[$type]['condition'][$objectType][$condition]) : '', "class='form-control chosen' multiple data-placeholder='{$this->lang->$moduleName->$condition}'"); + } + } + ?> +
      + + + diff --git a/module/project/control.php b/module/project/control.php index 0b891b5eaf..3f4e378f26 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -400,9 +400,6 @@ class project extends control $mails = $this->project->importBug($projectID); if(dao::isError()) die(js::error(dao::getError())); - $this->loadModel('task'); - foreach($mails as $mail) $this->task->sendmail($mail->taskID, $mail->actionID); - die(js::locate($this->createLink('project', 'importBug', "projectID=$projectID"), 'parent')); } diff --git a/module/story/control.php b/module/story/control.php index a02ee50f97..3939f1a7ad 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -74,7 +74,6 @@ class story extends control $action = $bugID == 0 ? 'Opened' : 'Frombug'; $extra = $bugID == 0 ? '' : $bugID; $actionID = $this->action->create('story', $storyID, $action, '', $extra); - $this->story->sendmail($storyID, $actionID); if($todoID > 0) { @@ -227,11 +226,7 @@ class story extends control if(dao::isError()) die(js::error(dao::getError())); $stories = array(); - foreach($mails as $mail) - { - $stories[] = $mail->storyID; - if($mail->actionID) $this->story->sendmail($mail->storyID, $mail->actionID); - } + foreach($mails as $mail) $stories[] = $mail->storyID; if($project) $this->loadModel('project')->linkStory($project, $stories); /* If storyID not equal zero, subdivide this story to child stories and close it. */ @@ -241,7 +236,6 @@ class story extends control $actionID = $this->story->subdivide($storyID, $mails); if(dao::isError()) die(js::error(dao::getError())); - $this->story->sendmail($storyID, $actionID); if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate(inlink('view', "storyID=$storyID"), 'parent')); @@ -375,7 +369,6 @@ class story extends control $action = !empty($changes) ? 'Edited' : 'Commented'; $actionID = $this->action->create('story', $storyID, $action, $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); } @@ -419,7 +412,6 @@ class story extends control $actionID = $this->action->create('story', $storyID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } } die(js::locate($this->session->storyList, 'parent')); @@ -553,7 +545,6 @@ class story extends control if(!empty($files)) $fileAction = $this->lang->addFiles . join(',', $files) . "\n" ; $actionID = $this->action->create('story', $storyID, $action, $fileAction . $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); } @@ -587,7 +578,6 @@ class story extends control $this->story->activate($storyID); if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('story', $storyID, 'Activated', $this->post->comment); - $this->story->sendmail($storyID, $actionID); if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate($this->createLink('story', 'view', "storyID=$storyID"), 'parent')); @@ -697,7 +687,6 @@ class story extends control $result = $this->post->result; if($this->post->closedReason != '' and strpos('done,postponed,subdivided,willnotdo', $this->post->closedReason) === false) $result = 'pass'; $actionID = $this->action->create('story', $storyID, 'Reviewed', $this->post->comment, ucfirst($result)); - $this->story->sendmail($storyID, $actionID); if($this->post->result == 'reject') { $this->action->create('story', $storyID, 'Closed', '', ucfirst($this->post->closedReason)); @@ -751,7 +740,6 @@ class story extends control $actions = $this->story->batchReview($storyIDList, $result, $reason); if(dao::isError()) die(js::error(dao::getError())); - foreach($actions as $storyID => $actionID) $this->story->sendmail($storyID, $actionID); if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); die(js::locate($this->session->storyList, 'parent')); } @@ -771,7 +759,6 @@ class story extends control if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('story', $storyID, 'Closed', $this->post->comment, ucfirst($this->post->closedReason) . ($this->post->duplicateStory ? ':' . (int)$this->post->duplicateStory : '')); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate(inlink('view', "storyID=$storyID"), 'parent')); } @@ -818,7 +805,6 @@ class story extends control { $actionID = $this->action->create('story', $storyID, 'Closed', htmlspecialchars($this->post->comments[$storyID]), ucfirst($this->post->closedReasons[$storyID]) . ($this->post->duplicateStoryIDList[$storyID] ? ':' . (int)$this->post->duplicateStoryIDList[$storyID] : '')); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); @@ -899,7 +885,6 @@ class story extends control { $actionID = $this->action->create('story', $storyID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); die(js::reload('parent')); @@ -922,7 +907,6 @@ class story extends control { $actionID = $this->action->create('story', $storyID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); die(js::reload('parent')); @@ -945,7 +929,6 @@ class story extends control { $actionID = $this->action->create('story', $storyID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); die(js::reload('parent')); @@ -970,7 +953,6 @@ class story extends control { $actionID = $this->action->create('story', $storyID, $action); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); die(js::locate($this->session->storyList, 'parent')); @@ -992,7 +974,6 @@ class story extends control { $actionID = $this->action->create('story', $storyID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->story->sendmail($storyID, $actionID); } } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); diff --git a/module/story/model.php b/module/story/model.php index 265f8beee9..58f9135102 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2508,9 +2508,8 @@ class storyModel extends model public function sendmail($storyID, $actionID) { $this->loadModel('mail'); - $story = $this->getById($storyID); - $productName = $this->loadModel('product')->getById($story->product)->name; - $users = $this->loadModel('user')->getPairs('noletter'); + $story = $this->getById($storyID); + $users = $this->loadModel('user')->getPairs('noletter'); /* Get actions. */ $action = $this->loadModel('action')->getById($actionID); @@ -2545,14 +2544,47 @@ class storyModel extends model ob_end_clean(); chdir($oldcwd); + $sendUsers = $this->getToAndCcList($story, $action->action); + if(!$sendUsers) return; + list($toList, $ccList) = $sendUsers; + $subject = $this->getSubject($story); + + /* Send it. */ + $this->mail->send($toList, $subject, $mailContent, $ccList); + if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + } + + /** + * Get mail subject. + * + * @param object $story + * @access public + * @return string + */ + public function getSubject($story) + { + $productName = $this->loadModel('product')->getById($story->product)->name; + return 'STORY #' . $story->id . ' ' . $story->title . ' - ' . $productName; + } + + /** + * Get toList and ccList. + * + * @param object $story + * @param string $actionType + * @access public + * @return bool|array + */ + public function getToAndCcList($story, $actionType) + { /* Set toList and ccList. */ $toList = $story->assignedTo; $ccList = str_replace(' ', '', trim($story->mailto, ',')); /* If the action is changed or reviewed, mail to the project team. */ - if(strtolower($action->action) == 'changed' or strtolower($action->action) == 'reviewed') + if(strtolower($actionType) == 'changed' or strtolower($actionType) == 'reviewed') { - $prjMembers = $this->getProjectMembers($storyID); + $prjMembers = $this->getProjectMembers($story->id); if($prjMembers) { $ccList .= ',' . join(',', $prjMembers); @@ -2562,7 +2594,7 @@ class storyModel extends model if(empty($toList)) { - if(empty($ccList)) return; + if(empty($ccList)) return false; if(strpos($ccList, ',') === false) { $toList = $ccList; @@ -2580,8 +2612,6 @@ class storyModel extends model $toList = $story->openedBy; } - /* Send it. */ - $this->mail->send($toList, 'STORY #' . $story->id . ' ' . $story->title . ' - ' . $productName, $mailContent, $ccList); - if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + return array($toList, $ccList); } } diff --git a/module/task/control.php b/module/task/control.php index f7c37f1cf1..f64f0f141e 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -112,8 +112,7 @@ class task extends control if($taskID['status'] == 'exists') continue; $taskID = $taskID['id']; - $actionID = $this->action->create('task', $taskID, 'Opened', ''); - $this->task->sendmail($taskID, $actionID); + $this->action->create('task', $taskID, 'Opened', ''); } /* If link from no head then reload*/ @@ -208,8 +207,6 @@ class task extends control $mails = $this->task->batchCreate($projectID); if(dao::isError()) die(js::error(dao::getError())); - foreach($mails as $mail) $this->task->sendmail($mail->taskID, $mail->actionID); - /* Locate the browser. */ if($iframe) die(js::reload('parent.parent')); die(js::locate($storyLink, 'parent')); @@ -290,7 +287,6 @@ class task extends control $fileAction = !empty($files) ? $this->lang->addFiles . join(',', $files) . "\n" : ''; $actionID = $this->action->create('task', $taskID, $action, $fileAction . $this->post->comment); if(!empty($changes)) $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if($task->fromBug != 0) @@ -343,7 +339,6 @@ class task extends control $actionID = $this->loadModel('action')->create('task', $taskID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); $task = $this->task->getById($taskID); if($task->fromBug != 0) @@ -443,7 +438,6 @@ class task extends control if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('task', $taskID, 'Assigned', $this->post->comment, $this->post->assignedTo); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); @@ -489,7 +483,6 @@ class task extends control $this->loadModel('action'); $actionID = $this->action->create('task', $taskID, 'Edited'); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); } @@ -519,7 +512,6 @@ class task extends control if(dao::isError()) die(js::error(dao::getError())); $actionID = $this->action->create('task', $taskID, 'Assigned', $this->post->comment, $this->post->assignedTo); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther'); die(js::reload('parent')); @@ -620,7 +612,6 @@ class task extends control $act = $this->post->left == 0 ? 'Finished' : 'Started'; $actionID = $this->action->create('task', $taskID, $act, $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } /* Remind whether to update status of the bug, if task which from that bug has been finished. */ @@ -773,7 +764,6 @@ class task extends control $fileAction = !empty($files) ? $this->lang->addFiles . join(',', $files) . "\n" : ''; $actionID = $this->action->create('task', $taskID, 'Finished', $fileAction . $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if($this->task->needUpdateBugStatus($task)) @@ -882,7 +872,6 @@ class task extends control $act = $this->post->left == 0 ? 'Finished' : 'Restarted'; $actionID = $this->action->create('task', $taskID, $act, $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); @@ -915,7 +904,6 @@ class task extends control { $actionID = $this->action->create('task', $taskID, 'Closed', $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); @@ -956,7 +944,6 @@ class task extends control { $actionID = $this->action->create('task', $taskID, 'Canceled', ''); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } } } @@ -997,7 +984,6 @@ class task extends control { $actionID = $this->action->create('task', $taskID, 'Closed', ''); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } } if(isset($skipTasks) and empty($skipTaskIdList)) @@ -1033,7 +1019,6 @@ class task extends control { $actionID = $this->action->create('task', $taskID, 'Canceled', $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); @@ -1067,7 +1052,6 @@ class task extends control { $actionID = $this->action->create('task', $taskID, 'Activated', $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->task->sendmail($taskID, $actionID); } if(isonlybody()) die(js::closeModal('parent.parent', 'this')); die(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent')); diff --git a/module/task/model.php b/module/task/model.php index 57fe71c99a..de9498b0ea 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -2224,9 +2224,8 @@ class taskModel extends model public function sendmail($taskID, $actionID) { $this->loadModel('mail'); - $task = $this->getById($taskID); - $users = $this->loadModel('user')->getPairs('noletter'); - $projectName = $this->loadModel('project')->getById($task->project)->name; + $task = $this->getById($taskID); + $users = $this->loadModel('user')->getPairs('noletter'); /* Get action info. */ $action = $this->loadModel('action')->getById($actionID); @@ -2253,13 +2252,45 @@ class taskModel extends model chdir($oldcwd); + $sendUsers = $this->getToAndCcList($task); + if(!$sendUsers) return; + list($toList, $ccList) = $sendUsers; + $subject = $this->getSubject($task); + + /* Send emails. */ + $this->mail->send($toList, $subject, $mailContent, $ccList); + if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + } + + /** + * Get mail subject. + * + * @param object $task + * @access public + * @return string + */ + public function getSubject($task) + { + $projectName = $this->loadModel('project')->getById($task->project)->name; + return 'TASK#' . $task->id . ' ' . $task->name . ' - ' . $projectName; + } + + /** + * Get toList and ccList. + * + * @param object $task + * @access public + * @return bool|array + */ + public function getToAndCcList($task) + { /* Set toList and ccList. */ $toList = $task->assignedTo; $ccList = trim($task->mailto, ','); if(empty($toList)) { - if(empty($ccList)) return; + if(empty($ccList)) return false; if(strpos($ccList, ',') === false) { $toList = $ccList; @@ -2277,9 +2308,7 @@ class taskModel extends model $toList = $task->finishedBy; } - /* Send emails. */ - $this->mail->send($toList, 'TASK#' . $task->id . ' ' . $task->name . ' - ' . $projectName, $mailContent, $ccList); - if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + return array($toList, $ccList); } /** diff --git a/module/testtask/control.php b/module/testtask/control.php index 16aed09ef7..88dc8e5056 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -103,8 +103,7 @@ class testtask extends control { $taskID = $this->testtask->create(); if(dao::isError()) die(js::error(dao::getError())); - $actionID = $this->loadModel('action')->create('testtask', $taskID, 'opened'); - $this->testtask->sendmail($taskID, $actionID); + $this->loadModel('action')->create('testtask', $taskID, 'opened'); die(js::locate($this->createLink('testtask', 'browse', "productID=$productID"), 'parent')); } @@ -423,9 +422,6 @@ class testtask extends control { $actionID = $this->loadModel('action')->create('testtask', $taskID, 'edited'); $this->action->logHistory($actionID, $changes); - - /* send mail.*/ - $this->testtask->sendmail($taskID, $actionID); } die(js::locate(inlink('view', "taskID=$taskID"), 'parent')); } @@ -553,7 +549,6 @@ class testtask extends control { $actionID = $this->action->create('testtask', $taskID, 'Closed', $this->post->comment); $this->action->logHistory($actionID, $changes); - $this->testtask->sendmail($taskID, $actionID); } if(isonlybody()) die(js::reload('parent.parent')); diff --git a/module/testtask/model.php b/module/testtask/model.php index 937143b1ee..2ffe5b4410 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -1255,12 +1255,57 @@ class testtaskModel extends model ob_end_clean(); chdir($oldcwd); + $sendUsers = $this->getToAndCcList($testtask); + if(!$sendUsers) return; + list($toList, $ccList) = $sendUsers; + $subject = $this->getSubject($testtask, $action->action); + + /* Send mail. */ + $this->mail->send($toList, $subject, $mailContent, $ccList); + if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + } + + /** + * Get mail subject. + * + * @param object $testtask + * @param string $actionType + * @access public + * @return string + */ + public function getSubject($testtask, $actionType) + { + /* Set email title. */ + if($actionType == 'opened') + { + return sprintf($this->lang->testtask->mail->create->title, $this->app->user->realname, $testtask->id, $tasktask->name); + } + elseif($actionType == 'closed') + { + return sprintf($this->lang->testtask->mail->close->title, $this->app->user->realname, $testtask->id, $testtask->name); + } + else + { + return sprintf($this->lang->testtask->mail->edit->title, $this->app->user->realname, $testtask->id, $testtask->name); + } + } + + /** + * Get toList and ccList. + * + * @param object $testtask + * @access public + * @return bool|array + */ + public function getToAndCcList($testtask) + { /* Set toList and ccList. */ $toList = $testtask->owner; $ccList = str_replace(' ', '', trim($testtask->mailto, ',')); + if(empty($toList)) { - if(empty($ccList)) return; + if(empty($ccList)) return false; if(strpos($ccList, ',') === false) { $toList = $ccList; @@ -1273,23 +1318,6 @@ class testtaskModel extends model $ccList = substr($ccList, $commaPos + 1); } } - - /* Set email title. */ - if($action->action == 'opened') - { - $mailTitle = sprintf($this->lang->testtask->mail->create->title, $this->app->user->realname, $testtaskID, $this->post->name); - } - elseif($action->action == 'closed') - { - $mailTitle = sprintf($this->lang->testtask->mail->close->title, $this->app->user->realname, $testtaskID, $testtask->name); - } - else - { - $mailTitle = sprintf($this->lang->testtask->mail->edit->title, $this->app->user->realname, $testtaskID, $this->post->name); - } - - /* Send mail. */ - $this->mail->send($toList, $mailTitle, $mailContent, $ccList); - if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); + return array($toList, $ccList); } } diff --git a/module/webhook/config.php b/module/webhook/config.php index a559e38e6b..df7384e81f 100644 --- a/module/webhook/config.php +++ b/module/webhook/config.php @@ -5,15 +5,6 @@ $config->webhook->create->requiredFields = 'name, url'; $config->webhook->edit = new stdclass(); $config->webhook->edit->requiredFields = 'name, url'; -$config->webhook->objectTypes['release'] = array('opened', 'edited', 'changestatus'); -$config->webhook->objectTypes['build'] = array('opened', 'edited'); -$config->webhook->objectTypes['testsuite'] = array('opened', 'edited'); -$config->webhook->objectTypes['caselib'] = array('opened', 'edited'); -$config->webhook->objectTypes['testreport'] = array('opened', 'edited'); -$config->webhook->objectTypes['doc'] = array('created', 'edited', 'commented'); -$config->webhook->objectTypes['doclib'] = array('created', 'edited'); -$config->webhook->objectTypes['user'] = array('login', 'logout'); - /* Unset entry to hide actions. */ $config->webhook->objectTypes = array(); $config->webhook->objectTypes['product'] = array('opened', 'edited', 'closed', 'undeleted'); diff --git a/module/webhook/control.php b/module/webhook/control.php index c700a8ce01..86382877bd 100644 --- a/module/webhook/control.php +++ b/module/webhook/control.php @@ -11,6 +11,12 @@ */ class webhook extends control { + public function __construct($moduleName = '', $methodName = '') + { + parent::__construct($moduleName, $methodName); + $this->loadModel('message'); + } + /** * Browse webhooks. * @@ -54,8 +60,6 @@ class webhook extends control $this->view->title = $this->lang->webhook->api . $this->lang->colon . $this->lang->webhook->create; $this->view->products = $this->loadModel('product')->getPairs(); $this->view->projects = $this->loadModel('project')->getPairs(); - $this->view->objectTypes = $this->webhook->getObjectTypes(); - $this->view->objectActions = $this->webhook->getObjectActions(); $this->view->position[] = html::a(inlink('browse'), $this->lang->webhook->api); $this->view->position[] = html::a(inlink('browse'), $this->lang->webhook->common); $this->view->position[] = $this->lang->webhook->create; @@ -83,8 +87,6 @@ class webhook extends control $this->view->title = $this->lang->webhook->edit . $this->lang->colon . $webhook->name; $this->view->products = $this->loadModel('product')->getPairs(); $this->view->projects = $this->loadModel('project')->getPairs(); - $this->view->objectTypes = $this->webhook->getObjectTypes(); - $this->view->objectActions = $this->webhook->getObjectActions(); $this->view->position[] = html::a(inlink('browse'), $this->lang->webhook->api); $this->view->position[] = html::a(inlink('browse'), $this->lang->webhook->common); $this->view->position[] = $this->lang->webhook->edit; diff --git a/module/webhook/model.php b/module/webhook/model.php index b3d7a1032c..81a5e6a6a2 100644 --- a/module/webhook/model.php +++ b/module/webhook/model.php @@ -21,7 +21,6 @@ class webhookModel extends model public function getByID($id) { $webhook = $this->dao->select('*')->from(TABLE_WEBHOOK)->where('id')->eq($id)->fetch(); - $webhook->actions = json_decode($webhook->actions); return $webhook; } @@ -41,7 +40,6 @@ class webhookModel extends model ->orderBy($orderBy) ->page($pager) ->fetchAll('id'); - if($decode) foreach($webhooks as $webhook) $webhook->actions = json_decode($webhook->actions); return $webhooks; } @@ -99,41 +97,6 @@ class webhookModel extends model return $this->dao->select('*')->from(TABLE_NOTIFY)->where('status')->eq('wait')->andWhere('objectType')->eq('webhook')->orderBy('id')->fetchAll('id'); } - /** - * Get object types. - * - * @access public - * @return array - */ - public function getObjectTypes() - { - $objectTypes = array(); - foreach($this->config->webhook->objectTypes as $objectType => $actions) - { - $objectTypes[$objectType] = $this->lang->action->objectTypes[$objectType]; - } - return $objectTypes; - } - - /** - * Get object actions. - * - * @access public - * @return array - */ - public function getObjectActions() - { - $objectActions = array(); - foreach($this->config->webhook->objectTypes as $objectType => $actions) - { - foreach($actions as $action) - { - $objectActions[$objectType][$action] = str_replace($this->lang->webhook->trimWords, '', $this->lang->action->label->$action); - } - } - return $objectActions; - } - /** * Create a webhook. * @@ -151,7 +114,6 @@ class webhookModel extends model ->remove('allParams, allActions') ->get(); $webhook->params = $this->post->params ? implode(',', $this->post->params) . ',text' : 'text'; - $webhook->actions = $this->post->actions ? json_encode($this->post->actions) : '[]'; $this->dao->insert(TABLE_WEBHOOK)->data($webhook) ->batchCheck($this->config->webhook->create->requiredFields, 'notempty') @@ -180,7 +142,6 @@ class webhookModel extends model ->remove('allParams, allActions') ->get(); $webhook->params = $this->post->params ? implode(',', $this->post->params) . ',text' : 'text'; - $webhook->actions = $this->post->actions ? json_encode($this->post->actions) : '[]'; $this->dao->update(TABLE_WEBHOOK)->data($webhook) ->batchCheck($this->config->webhook->edit->requiredFields, 'notempty') @@ -208,7 +169,6 @@ class webhookModel extends model foreach($webhooks as $id => $webhook) { - if(!isset($webhook->actions->$objectType) or !in_array($actionType, $webhook->actions->$objectType)) continue; $postData = $this->buildData($objectType, $objectID, $actionType, $actionID, $webhook); if(!$postData) continue; diff --git a/module/webhook/view/create.html.php b/module/webhook/view/create.html.php index 0ac100cbf2..8e201e6f7d 100644 --- a/module/webhook/view/create.html.php +++ b/module/webhook/view/create.html.php @@ -10,16 +10,10 @@ * @link http://www.zentao.net */ ?> - + webhook->note->typeList);?>
      -
      -
      - webhook->api;?> - webhook->create;?> -
      -
      @@ -60,27 +54,6 @@ - - - - diff --git a/module/webhook/view/edit.html.php b/module/webhook/view/edit.html.php index cb45e9f8ed..4bf7adfdd7 100644 --- a/module/webhook/view/edit.html.php +++ b/module/webhook/view/edit.html.php @@ -10,15 +10,9 @@ * @link http://www.zentao.net */ ?> - +
      -
      -
      - webhook->api;?> - webhook->edit;?> -
      -
      webhook->paramsList, 'text');?>
      - - - - webhook->objectTypes as $objectType => $actions):?> - - - - - -
      - -
      -
      webhook->desc;?>
      @@ -63,28 +57,6 @@ - - - - diff --git a/module/webhook/view/header.html.php b/module/webhook/view/header.html.php index 3458d7405e..89e41eab12 100644 --- a/module/webhook/view/header.html.php +++ b/module/webhook/view/header.html.php @@ -13,8 +13,13 @@
      diff --git a/module/webhook/view/log.html.php b/module/webhook/view/log.html.php index 5ef11c07b1..24498abe57 100644 --- a/module/webhook/view/log.html.php +++ b/module/webhook/view/log.html.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ ?> - +
      webhook->common);?> From 87807110d59184c20611ab464e7ea61930aeaaea Mon Sep 17 00:00:00 2001 From: dajiao007 Date: Thu, 11 Jan 2018 16:46:08 +0800 Subject: [PATCH 080/206] modify tranlate and adjust column width --- module/bug/lang/en.php | 6 +++--- module/bug/view/resolve.html.php | 2 +- module/custom/lang/en.php | 2 +- module/custom/view/set.html.php | 8 ++++---- module/doc/view/create.html.php | 2 +- module/group/lang/en.php | 2 +- module/group/view/manageview.html.php | 2 +- module/project/view/view.html.php | 2 +- module/report/lang/en.php | 6 +++--- module/report/view/bugcreate.html.php | 2 +- module/report/view/workload.html.php | 6 +++--- module/story/lang/en.php | 2 +- module/task/lang/en.php | 2 +- module/testcase/config.php | 6 +++--- module/testcase/lang/en.php | 6 +++--- module/testreport/lang/en.php | 10 +++++----- module/testreport/view/browse.html.php | 2 +- module/testsuite/lang/en.php | 2 +- module/testsuite/view/linkcase.html.php | 2 +- module/testtask/lang/en.php | 8 ++++---- module/todo/lang/en.php | 10 +++++----- module/user/lang/en.php | 2 +- module/user/view/create.html.php | 2 +- 23 files changed, 47 insertions(+), 47 deletions(-) diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 2473e677c2..a9801ec046 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -220,7 +220,7 @@ $lang->bug->browserList['other'] = 'Other'; $lang->bug->typeList[''] = ''; $lang->bug->typeList['codeerror'] = 'Code Error'; -$lang->bug->typeList['interface'] = 'Interface Optimization'; +$lang->bug->typeList['interface'] = 'UI Optimization'; $lang->bug->typeList['config'] = 'Configuration'; $lang->bug->typeList['install'] = 'Install/Deploy'; $lang->bug->typeList['security'] = 'Security'; @@ -255,9 +255,9 @@ $lang->bug->resolutionList['tostory'] = 'Converted to Story'; $lang->bug->report = new stdclass(); $lang->bug->report->common = 'Report'; $lang->bug->report->select = 'Select Report Type '; -$lang->bug->report->create = 'Generate a Report'; +$lang->bug->report->create = 'Generate Report'; -$lang->bug->report->charts['bugsPerProject'] = $lang->projectCommon . 'Bugs'; +$lang->bug->report->charts['bugsPerProject'] = $lang->projectCommon . ' Bugs'; $lang->bug->report->charts['bugsPerBuild'] = 'Bugs Per Build'; $lang->bug->report->charts['bugsPerModule'] = 'Bugs Per Module'; $lang->bug->report->charts['openedBugsPerDay'] = 'Reported Bugs Per Day'; diff --git a/module/bug/view/resolve.html.php b/module/bug/view/resolve.html.php index 8b4bde42fc..f2efd953d5 100644 --- a/module/bug/view/resolve.html.php +++ b/module/bug/view/resolve.html.php @@ -28,7 +28,7 @@ js::set('productID' , $bug->product);
      webhook->paramsList, $webhook->params);?>
      - - - - webhook->objectTypes as $objectType => $actions):?> - - - - - -
      - - actions->$objectType) ? $webhook->actions->$objectType : '');?>
      -
      webhook->desc;?> desc, "rows='3' class='form-control'");?>
      - + diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index 1f830c8b6e..7bea454f8b 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -45,7 +45,7 @@ $lang->custom->task->fields['hours'] = 'Man-hours'; $lang->custom->bug = new stdClass(); $lang->custom->bug->fields['priList'] = 'Priority'; -$lang->custom->bug->fields['severityList'] = 'Priority'; +$lang->custom->bug->fields['severityList'] = 'Severity'; $lang->custom->bug->fields['osList'] = 'OS'; $lang->custom->bug->fields['browserList'] = 'Browser'; $lang->custom->bug->fields['typeList'] = 'Type'; diff --git a/module/custom/view/set.html.php b/module/custom/view/set.html.php index 49458f5d5d..6176e3fa87 100644 --- a/module/custom/view/set.html.php +++ b/module/custom/view/set.html.php @@ -50,20 +50,20 @@ EOT;
      bug->resolution;?>bug->resolution;?> bug->resolutionList, '', 'class=form-control onchange=setDuplicate(this.value)');?>
      - + - + > - + > - + diff --git a/module/doc/view/create.html.php b/module/doc/view/create.html.php index 69974b50ad..34ae349d3c 100644 --- a/module/doc/view/create.html.php +++ b/module/doc/view/create.html.php @@ -24,7 +24,7 @@
      custom->storyReview;?>custom->storyReview;?> custom->reviewList, $needReview);?>
      custom->forceReview;?> custom->notice->forceReview, $lang->$module->common);?>custom->notice->forceReview, $lang->$module->common);?>
      custom->forceNotReview;?> custom->notice->forceNotReview, $lang->$module->common);?>custom->notice->forceNotReview, $lang->$module->common);?>
      - +
      doc->module;?>doc->module;?> diff --git a/module/group/lang/en.php b/module/group/lang/en.php index fb4dbf69aa..fb81a6a1b5 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -11,7 +11,7 @@ */ $lang->group->common = 'Groups'; $lang->group->browse = 'Browse Groups'; -$lang->group->create = 'Create Group'; +$lang->group->create = 'Add Group'; $lang->group->edit = 'Edit'; $lang->group->copy = 'Copy'; $lang->group->delete = 'Delete'; diff --git a/module/group/view/manageview.html.php b/module/group/view/manageview.html.php index 2659d5dc6e..4c7a31b15e 100644 --- a/module/group/view/manageview.html.php +++ b/module/group/view/manageview.html.php @@ -21,7 +21,7 @@ -
      + group->viewList;?> diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php index 8fb16ea929..e092b0fbd5 100644 --- a/module/project/view/view.html.php +++ b/module/project/view/view.html.php @@ -74,7 +74,7 @@ project->basicInfo?> - + diff --git a/module/report/lang/en.php b/module/report/lang/en.php index ac2da1bd5c..67b02162f2 100644 --- a/module/report/lang/en.php +++ b/module/report/lang/en.php @@ -48,9 +48,9 @@ $lang->report->beginAndEnd = ' From'; $lang->report->dept = 'Dept'; $lang->report->deviationChart = $lang->projectCommon . ' Deviation Chart'; -$lang->reportList->project->lists[10] = $lang->projectCommon . ' deviation|report|projectdeviation'; -$lang->reportList->product->lists[10] = $lang->productCommon . ' summary|report|productsummary'; -$lang->reportList->test->lists[10] = 'Bugs|report|bugcreate'; +$lang->reportList->project->lists[10] = $lang->projectCommon . ' Deviation|report|projectdeviation'; +$lang->reportList->product->lists[10] = $lang->productCommon . ' Summary|report|productsummary'; +$lang->reportList->test->lists[10] = 'Bugs Creation|report|bugcreate'; $lang->reportList->test->lists[13] = 'Bug Assignment|report|bugassign'; $lang->reportList->staff->lists[10] = 'Workload|report|workload'; diff --git a/module/report/view/bugcreate.html.php b/module/report/view/bugcreate.html.php index d2e206329d..70acfa6bb5 100644 --- a/module/report/view/bugcreate.html.php +++ b/module/report/view/bugcreate.html.php @@ -45,7 +45,7 @@ - + diff --git a/module/report/view/workload.html.php b/module/report/view/workload.html.php index 7092ce9c3e..2d19d9e141 100644 --- a/module/report/view/workload.html.php +++ b/module/report/view/workload.html.php @@ -26,9 +26,9 @@
      report->taskAssignedDate;?> -
      +
      report->to;?> -
      +
      @@ -44,7 +44,7 @@
      - report->isAssign, $assign, "class='form-control' onchange='changeParams(this)'");?> + report->isAssign, $assign, "class='form-control' onchange='changeParams(this)' style='width:90px'");?>
      report->query);?>
      diff --git a/module/story/lang/en.php b/module/story/lang/en.php index fa895ba551..3cc8b6a497 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -142,7 +142,7 @@ $lang->story->sourceList['po'] = $lang->productCommon . ' Owner'; $lang->story->sourceList['market'] = 'Marketing'; $lang->story->sourceList['service'] = 'Customer Service'; $lang->story->sourceList['operation'] = 'Operations'; -$lang->story->sourceList['support'] = 'Technical support'; +$lang->story->sourceList['support'] = 'Technical Support'; $lang->story->sourceList['competitor'] = 'Competitor'; $lang->story->sourceList['partner'] = 'Partner'; $lang->story->sourceList['dev'] = 'Dev Team'; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index 4916b0e58a..4e066a24ce 100644 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -11,7 +11,7 @@ */ $lang->task->index = "Index"; $lang->task->create = "Create Task"; -$lang->task->batchCreate = "Batch Create Task"; +$lang->task->batchCreate = "Batch Create Tasks"; $lang->task->batchEdit = "Batch Edit"; $lang->task->batchChangeModule = "Batch Change Module"; $lang->task->batchClose = "Batch Close"; diff --git a/module/testcase/config.php b/module/testcase/config.php index d246cfc859..e65a2a5e24 100644 --- a/module/testcase/config.php +++ b/module/testcase/config.php @@ -148,7 +148,7 @@ $config->testcase->datatable->fieldList['lastRunner']['required'] = 'no'; $config->testcase->datatable->fieldList['lastRunDate']['title'] = 'lastRunDate'; $config->testcase->datatable->fieldList['lastRunDate']['fixed'] = 'no'; -$config->testcase->datatable->fieldList['lastRunDate']['width'] = '120'; +$config->testcase->datatable->fieldList['lastRunDate']['width'] = '100'; $config->testcase->datatable->fieldList['lastRunDate']['required'] = 'no'; $config->testcase->datatable->fieldList['lastRunResult']['title'] = 'lastRunResult'; @@ -158,7 +158,7 @@ $config->testcase->datatable->fieldList['lastRunResult']['required'] = 'no'; $config->testcase->datatable->fieldList['status']['title'] = 'statusAB'; $config->testcase->datatable->fieldList['status']['fixed'] = 'no'; -$config->testcase->datatable->fieldList['status']['width'] = '100'; +$config->testcase->datatable->fieldList['status']['width'] = '80'; $config->testcase->datatable->fieldList['status']['required'] = 'no'; $config->testcase->datatable->fieldList['lastEditedBy']['title'] = 'lastEditedBy'; @@ -204,6 +204,6 @@ $config->testcase->datatable->fieldList['stepNumber']['name'] = $lang->testc $config->testcase->datatable->fieldList['actions']['title'] = 'actions'; $config->testcase->datatable->fieldList['actions']['fixed'] = 'right'; -$config->testcase->datatable->fieldList['actions']['width'] = '140'; +$config->testcase->datatable->fieldList['actions']['width'] = '150'; $config->testcase->datatable->fieldList['actions']['required'] = 'yes'; $config->testcase->datatable->fieldList['actions']['sort'] = 'no'; diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index 848ea11f67..6a7b773a0d 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -73,7 +73,7 @@ $lang->testcase->stepVersion = 'Version'; $lang->testcase->common = 'Case'; $lang->testcase->index = "Home"; $lang->testcase->create = "Create Case"; -$lang->testcase->batchCreate = "Batch Create Case"; +$lang->testcase->batchCreate = "Batch Create Cases"; $lang->testcase->delete = "Delete"; $lang->testcase->view = "Overview"; $lang->testcase->review = "Review"; @@ -168,7 +168,7 @@ $lang->testcase->groups[''] = 'Group '; $lang->testcase->groups['story'] = 'Story Group'; $lang->testcase->statusList[''] = ''; -$lang->testcase->statusList['wait'] = 'toReview'; +$lang->testcase->statusList['wait'] = 'ToReview'; $lang->testcase->statusList['normal'] = 'Normal'; $lang->testcase->statusList['blocked'] = 'Blocked'; $lang->testcase->statusList['investigate'] = 'Investigating'; @@ -183,7 +183,7 @@ $lang->testcase->buttonToList = 'Back'; $lang->testcase->errorEncode = 'No Data. Please select right encoding and upload again!'; $lang->testcase->noFunction = 'Iconv and mb_convert_encoding is not found. You cannot convert the data into the desired one!'; $lang->testcase->noRequire = "Row %s has“%s”which is a required field and it should not be blank."; -$lang->testcase->noLibrary = "No library exists. Create one first!"; +$lang->testcase->noLibrary = "No library exists. Please create one first."; $lang->testcase->mustChooseResult = 'Review result is required.'; $lang->testcase->searchStories = 'Enter to searcu Story'; diff --git a/module/testreport/lang/en.php b/module/testreport/lang/en.php index ddb4dd9254..9a6bf65343 100644 --- a/module/testreport/lang/en.php +++ b/module/testreport/lang/en.php @@ -1,7 +1,7 @@ testreport->common = 'Test Report'; -$lang->testreport->browse = 'Browser Reports'; -$lang->testreport->create = 'Create Report'; +$lang->testreport->browse = 'Test Statements'; +$lang->testreport->create = 'Create Statements'; $lang->testreport->edit = 'Edit Report'; $lang->testreport->delete = 'Delete'; $lang->testreport->export = 'Export'; @@ -46,8 +46,8 @@ $lang->testreport->legendMore = 'More'; $lang->testreport->bugSeverityGroups = 'Bug Severity Distribution'; $lang->testreport->bugTypeGroups = 'Bug Type Distribution'; $lang->testreport->bugStatusGroups = 'Bug Status Distribution'; -$lang->testreport->bugOpenedByGroups = 'Bug CreatedBy Distribution'; -$lang->testreport->bugResolvedByGroups = 'Bug ResolvedBy Distribution'; +$lang->testreport->bugOpenedByGroups = 'Bug Creator Distribution'; +$lang->testreport->bugResolvedByGroups = 'Bug Solver Distribution'; $lang->testreport->bugResolutionGroups = 'Bug Resolution Distribution'; $lang->testreport->bugModuleGroups = 'Bug Module Distribution'; $lang->testreport->legacyBugs = 'Legacy Bugs'; @@ -59,7 +59,7 @@ $lang->testreport->buildSummary = 'Tested %s build.'; $lang->testreport->confirmDelete = 'Do you want tot delete this report?'; $lang->testreport->moreNotice = 'More features can be extended with reference to the ZenTao extension mechanism, or you can contact us for customization.'; $lang->testreport->exportNotice = "Export By ZenTaoPMS"; -$lang->testreport->noReport = "The report has not yet been generated. Please check it later."; +$lang->testreport->noReport = "No statements has been generated. Please check it later."; $lang->testreport->foundBugTip = "Bugs created in this build and created in the test period."; $lang->testreport->legacyBugTip = "Active Bugs, or the resolved beyond the test period."; $lang->testreport->fromCaseBugTip = "Bugs created after case-failure in the test period."; diff --git a/module/testreport/view/browse.html.php b/module/testreport/view/browse.html.php index e3c167ac77..606cc01237 100644 --- a/module/testreport/view/browse.html.php +++ b/module/testreport/view/browse.html.php @@ -26,7 +26,7 @@
      - + diff --git a/module/testsuite/lang/en.php b/module/testsuite/lang/en.php index 8e2f19a5ac..b7918e8114 100644 --- a/module/testsuite/lang/en.php +++ b/module/testsuite/lang/en.php @@ -21,7 +21,7 @@ $lang->testsuite->unlinkCase = "Unlink"; $lang->testsuite->batchUnlinkCases = "Batch unlink cases"; $lang->testsuite->deleted = 'deleted'; $lang->testsuite->exportTemplet = 'Export template'; -$lang->testsuite->batchCreateCase = 'Batch create case'; +$lang->testsuite->batchCreateCase = 'Batch create cases'; $lang->testsuite->import = 'Import'; $lang->testsuite->showImport = 'Show import data'; diff --git a/module/testsuite/view/linkcase.html.php b/module/testsuite/view/linkcase.html.php index 4f916fe927..7f0da4d661 100644 --- a/module/testsuite/view/linkcase.html.php +++ b/module/testsuite/view/linkcase.html.php @@ -32,7 +32,7 @@ - + diff --git a/module/testtask/lang/en.php b/module/testtask/lang/en.php index 98bf9b3730..a6a549b7e9 100644 --- a/module/testtask/lang/en.php +++ b/module/testtask/lang/en.php @@ -42,7 +42,7 @@ $lang->testtask->totalStatus = "All"; $lang->testtask->all = "All " . $lang->productCommon; $lang->testtask->id = 'ID'; -$lang->testtask->common = 'Test build'; +$lang->testtask->common = 'Test Task'; $lang->testtask->product = $lang->productCommon; $lang->testtask->project = $lang->projectCommon; $lang->testtask->build = 'Build'; @@ -59,7 +59,7 @@ $lang->testtask->linkVersion = 'Version'; $lang->testtask->lastRunAccount = 'Runner'; $lang->testtask->lastRunTime = 'Last Run'; $lang->testtask->lastRunResult = 'Result'; -$lang->testtask->reportField = 'Report'; +$lang->testtask->reportField = 'Statements'; $lang->testtask->files = 'Upload'; $lang->testtask->case = 'Case'; $lang->testtask->version = 'Version'; @@ -141,8 +141,8 @@ $lang->testtask->report->charts['testTaskPerModule'] = 'Module Report'; $lang->testtask->report->charts['testTaskPerRunner'] = 'Runner Report'; $lang->testtask->report->charts['bugSeverityGroups'] = 'Bug Severity Distribution'; $lang->testtask->report->charts['bugStatusGroups'] = 'Bug Status Distribution'; -$lang->testtask->report->charts['bugOpenedByGroups'] = 'Bug CreatedBy Distribution'; -$lang->testtask->report->charts['bugResolvedByGroups'] = 'Bug ResolvedBy Distribution'; +$lang->testtask->report->charts['bugOpenedByGroups'] = 'Bug Creator Distribution'; +$lang->testtask->report->charts['bugResolvedByGroups'] = 'Bug Solver Distribution'; $lang->testtask->report->charts['bugResolutionGroups'] = 'Bug Resolution Distribution'; $lang->testtask->report->charts['bugModuleGroups'] = 'Bug Module Distribution'; diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index ba73c3c830..e179adef6b 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -65,14 +65,14 @@ $lang->todo->statusList['done'] = 'Done'; //$lang->todo->statusList['cancel'] = 'Cancelled'; //$lang->todo->statusList['postpone'] = 'Delayed'; -$lang->todo->priList[3] = '3'; -$lang->todo->priList[1] = '1'; -$lang->todo->priList[2] = '2'; -$lang->todo->priList[4] = '4'; +$lang->todo->priList[3] = 'Normal'; +$lang->todo->priList[1] = 'Highest'; +$lang->todo->priList[2] = 'High'; +$lang->todo->priList[4] = 'Low'; $lang->todo->priList[0] = ''; $lang->todo->typeList['custom'] = 'Custom'; -$lang->todo->typeList['cycle'] = 'Cycle'; +$lang->todo->typeList['cycle'] = 'Periodic'; $lang->todo->typeList['bug'] = 'Bug'; $lang->todo->typeList['task'] = $lang->projectCommon . 'Task'; $lang->todo->typeList['story'] = $lang->projectCommon . 'Story'; diff --git a/module/user/lang/en.php b/module/user/lang/en.php index 75b8896ea3..b7b3d8e557 100644 --- a/module/user/lang/en.php +++ b/module/user/lang/en.php @@ -95,7 +95,7 @@ $lang->user->errorDeny = "Sorry, your access to %s Module %s Fe $lang->user->loginFailed = "Login failed. Please check your account and password."; $lang->user->lockWarning = "You can try %s times."; $lang->user->loginLocked = "Please contact the administrator to unlock your account or try %s mins later."; -$lang->user->weakPassword = "Your password does meet the setting requirements."; +$lang->user->weakPassword = "Your password does not meet the setting requirements."; $lang->user->roleList[''] = ''; $lang->user->roleList['dev'] = 'Developer'; diff --git a/module/user/view/create.html.php b/module/user/view/create.html.php index a2e2d8c86e..d9a0a506ab 100644 --- a/module/user/view/create.html.php +++ b/module/user/view/create.html.php @@ -26,7 +26,7 @@
      project->name;?>project->name;?> name;?>
      bug->resolutionList['notrepro'];?> bug->resolutionList['postponed'];?> bug->resolutionList['willnotfix'];?>bug->resolutionList['tostory'];?>bug->resolutionList['tostory'];?> report->validRate;?> report->total;?>
      testreport->createdDate);?> testreport->project);?> testreport->testtask;?> actions;?> actions;?>
      idAB;?>testsuite->linkVersion;?>testsuite->linkVersion;?> priAB;?> testcase->title;?> testcase->type;?>
      - + From 4cc371b7575257b922812a7f699b6c50959a2e9a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 11 Jan 2018 16:59:27 +0800 Subject: [PATCH 081/206] * finish task #3583. --- module/common/lang/en.php | 6 +- module/common/view/footer.html.php | 13 ++++ module/message/config.php | 7 +- module/message/control.php | 33 +++++++++ module/message/model.php | 115 +++++++++++++++++++++++++++++ www/js/my.full.js | 11 +++ 6 files changed, 182 insertions(+), 3 deletions(-) diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 113a6244f9..723699acd6 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -339,13 +339,12 @@ $lang->admin->menu = new stdclass(); $lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); $lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); -$lang->admin->menu->mail = array('link' => 'Email|mail|index', 'subModule' => 'mail'); +$lang->admin->menu->message = array('link' => 'Mssage|message|index', 'subModule' => 'message,mail,webhook'); $lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); $lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak'); $lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); $lang->admin->menu->trashes = array('link' => 'Recycle|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => 'Develop|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); -$lang->admin->menu->api = array('link' => 'API|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); $lang->admin->menu->sso = 'RangerTeam|admin|sso'; $lang->convert = new stdclass(); @@ -360,6 +359,7 @@ $lang->cron = new stdclass(); $lang->dev = new stdclass(); $lang->entry = new stdclass(); $lang->webhook = new stdclass(); +$lang->message = new stdclass(); $lang->search = new stdclass(); $lang->convert->menu = $lang->admin->menu; @@ -374,6 +374,7 @@ $lang->mail->menu = $lang->admin->menu; $lang->dev->menu = $lang->admin->menu; $lang->entry->menu = $lang->admin->menu; $lang->webhook->menu = $lang->admin->menu; +$lang->message->menu = $lang->admin->menu; /* 菜单分组。*/ $lang->menugroup = new stdclass(); @@ -407,6 +408,7 @@ $lang->menugroup->mail = 'admin'; $lang->menugroup->dev = 'admin'; $lang->menugroup->entry = 'admin'; $lang->menugroup->webhook = 'admin'; +$lang->menugroup->message = 'admin'; /* 错误提示信息。*/ $lang->error = new stdclass(); diff --git a/module/common/view/footer.html.php b/module/common/view/footer.html.php index c344e96652..ea2f421361 100755 --- a/module/common/view/footer.html.php +++ b/module/common/view/footer.html.php @@ -25,6 +25,19 @@ function ajaxIgnoreBrowser(){$.get(createLink('misc', 'ajaxIgnoreBrowser'));} $(function(){showBrowserNotice()}); +/* Alert get message. */ +$(function() +{ + setInterval(function() + { + $.get('createLink('message', 'ajaxGetMessage')?>', function(data) + { + $('#noticeBox').append(data); + adjustNoticePosition(); + }); + }, 60 * 1000); +}) + global->novice) and $this->loadModel('tutorial')->checkNovice() and $config->global->flow == 'full'):?> novice = confirm('tutorial->novice?>'); $.get(createLink('tutorial', 'ajaxSaveNovice', 'novice=' + (novice ? 'true' : 'false')), function() diff --git a/module/message/config.php b/module/message/config.php index c2c247eb93..ab23da3c9f 100644 --- a/module/message/config.php +++ b/module/message/config.php @@ -16,7 +16,12 @@ $config->message->available['mail']['bug'] = $config->message->objectTypes[ $config->message->available['mail']['testtask'] = array('opened', 'edited', 'closed'); $config->message->available['webhook'] = $config->message->objectTypes; -$config->message->available['message'] = $config->message->objectTypes; + +$config->message->available['message']['bug'] = $config->message->objectTypes['bug']; +$config->message->available['message']['story'] = $config->message->objectTypes['story']; +$config->message->available['message']['task'] = $config->message->objectTypes['task']; +$config->message->available['message']['testtask'] = $config->message->objectTypes['testtask']; +$config->message->available['message']['todo'] = $config->message->objectTypes['todo']; $config->message->typeLink['mail'] = 'mail|index'; $config->message->typeLink['webhook'] = 'webhook|browse'; diff --git a/module/message/control.php b/module/message/control.php index 4d97205b76..e13f1264de 100644 --- a/module/message/control.php +++ b/module/message/control.php @@ -53,4 +53,37 @@ class message extends control $this->view->objectActions = $this->message->getObjectActions(); $this->display(); } + + /** + * Ajax get message. + * + * @access public + * @return void + */ + public function ajaxGetMessage() + { + $waitMessages = $this->message->getMessages('wait'); + $todos = $this->message->getNoticeTodos(); + if(empty($waitMessages) and empty($todos)) die(); + + $messages = ''; + $idList = array(); + foreach($waitMessages as $message) + { + $messages .= $message->data . '
      '; + $idList[] = $message->id; + } + $this->dao->update(TABLE_NOTIFY)->set('status')->eq('sended')->andWhere('sendTime')->eq(helper::now())->where('id')->in($idList)->exec(); + + foreach($todos as $todo) $messages .= $todo->data . '
      '; + + echo << + +
      {$messages}
      + + +EOT; + $this->dao->delete('*')->from(TABLE_NOTIFY)->where('objectType')->eq('message')->andWhere('status')->eq('sended')->exec(); + } } diff --git a/module/message/model.php b/module/message/model.php index 185ff0652c..ed8611d133 100644 --- a/module/message/model.php +++ b/module/message/model.php @@ -11,6 +11,15 @@ */ class messageModel extends model { + public function getMessages($status = '') + { + return $this->dao->select('*')->from(TABLE_NOTIFY) + ->where('objectType')->eq('message') + ->andWhere('toList')->eq($this->app->user->account) + ->beginIF($status)->andWhere('status')->eq($status)->fi() + ->fetchAll('id'); + } + /** * Get objectTypes * @@ -80,5 +89,111 @@ class messageModel extends model $this->loadModel('webhook')->send($objectType, $objectID, $actionType, $actionID); } } + + if(isset($messageSetting['message'])) + { + $actions = $messageSetting['message']['setting']; + if(isset($actions[$objectType]) and in_array($actionType, $actions[$objectType])) + { + $this->loadModel('message')->saveNotice($objectType, $objectID, $actionType, $actionID); + } + } + } + + /** + * Save notice. + * + * @param string $objectType + * @param int $objectID + * @param string $actionType + * @param int $actionID + * @access public + * @return void + */ + public function saveNotice($objectType, $objectID, $actionType, $actionID) + { + $this->loadModel('action'); + $table = $this->config->objectTables[$objectType]; + $field = $this->config->action->objectNameFields[$objectType]; + $object = $this->dao->select('*')->from($table)->where('id')->eq($objectID)->fetch(); + $toList = $this->getToList($object, $objectType); + if(empty($toList)) return false; + + $moduleName = $objectType == 'case' ? 'testcase' : $objectType; + $data = $this->app->user->realname . $this->lang->action->label->$actionType . $this->lang->action->objectTypes[$objectType]; + $data .= ' ' . html::a(helper::createLink($moduleName, 'view', "id=$objectID"), "[#{$objectID}::{$object->$field}]"); + + $notify = new stdclass(); + $notify->objectType = 'message'; + $notify->action = $actionID; + $notify->toList = $toList; + $notify->data = $data; + $notify->status = 'wait'; + $notify->createdBy = $this->app->user->account; + $notify->createdDate = helper::now(); + + $this->dao->insert(TABLE_NOTIFY)->data($notify)->exec(); + } + + /** + * Get toList. + * + * @param object $object + * @param string $objectType + * @access public + * @return string + */ + public function getToList($object, $objectType) + { + $toList = ''; + if(!empty($object->assignedTo)) $toList = $object->assignedTo; + if(empty($toList) and $objectType == 'todo') $toList = $object->account; + if(empty($toList) and $objectType == 'testtask') $toList = $object->owner; + + if($toList == 'closed') $toList = ''; + return $toList; + } + + /** + * Get notice todos. + * + * @access public + * @return array + */ + public function getNoticeTodos() + { + $todos = $this->loadModel('todo')->getList('today', $this->app->user->account, 'wait'); + $notices = array(); + $now = helper::now(); + $interval = 60; + if($todos) + { + $begins[1] = date('Hi', strtotime($now)); + $ends[1] = date('Hi', strtotime("+$interval seconds $now")); + $begins[10] = date('Hi', strtotime("+10 minute $now")); + $ends[10] = date('Hi', strtotime("+10 minute $interval seconds $now")); + $begins[30] = date('Hi', strtotime("+30 minute $now")); + $ends[30] = date('Hi', strtotime("+30 minute $interval seconds $now")); + foreach($todos as $todo) + { + if(empty($todo->begin)) continue; + $time = str_replace(':', '', $todo->begin); + + $lastTime = 0; + if((int)$time > (int)$begins[1] and (int)$time <= (int)$ends[1]) $lastTime = 1; + if((int)$time > (int)$begins[10] and (int)$time <= (int)$ends[10]) $lastTime = 10; + if((int)$time > (int)$begins[30] and (int)$time <= (int)$ends[30]) $lastTime = 30; + if($lastTime) + { + $notice = new stdclass(); + $notice->id = 'todo' . $todo->id; + $notice->data = $this->lang->todo->common . ' ' . html::a(helper::createLink('todo', 'view', "id={$todo->id}"), "{$todo->begin} {$todo->name}"); + + $notices[$notice->id] = $notice; + } + } + } + + return $notices; } } diff --git a/www/js/my.full.js b/www/js/my.full.js index 5ab6d30827..b962987086 100644 --- a/www/js/my.full.js +++ b/www/js/my.full.js @@ -1986,6 +1986,17 @@ function selectFocusJump(type) } } +function adjustNoticePosition() +{ + var bottom = 25; + $('#noticeBox').find('.alert').each(function() + { + $(this).css('bottom', bottom + 'px'); + bottom += $(this).outerHeight(true) - 10; + }); +} + + /* Ping the server every some minutes to keep the session. */ needPing = true; From 736c265302a657ea77ac27f9ab3ce9d1bc3c5917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 11 Jan 2018 21:53:28 +0800 Subject: [PATCH 082/206] * Task#3586. --- db/update9.7.sql | 9 ++ db/zentao.sql | 21 +++-- module/my/control.php | 3 + module/my/view/todo.html.php | 22 +++-- module/todo/control.php | 129 ++++++++++++++++++++--------- module/todo/lang/en.php | 11 ++- module/todo/lang/zh-cn.php | 15 ++-- module/todo/model.php | 114 ++++++++++++++++++------- module/todo/view/assignto.html.php | 88 ++++++++++++++++++++ module/todo/view/view.html.php | 22 +++-- 10 files changed, 334 insertions(+), 100 deletions(-) create mode 100755 module/todo/view/assignto.html.php diff --git a/db/update9.7.sql b/db/update9.7.sql index db02057a12..0757cd8f41 100644 --- a/db/update9.7.sql +++ b/db/update9.7.sql @@ -1,6 +1,15 @@ ALTER TABLE `zt_story` CHANGE `stage` `stage` ENUM('','wait','planned','projected','developing','developed','testing','tested','verified','released','closed') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'wait'; ALTER TABLE `zt_todo` ADD `config` varchar(255) NOT NULL; ALTER TABLE `zt_todo` ADD `cycle` tinyint unsigned NOT NULL DEFAULT '0' AFTER `type`; +ALTER TABLE `zt_todo` ADD `assignedTo` VARCHAR(30) NOT NULL DEFAULT '' AFTER `config`; +ALTER TABLE `zt_todo` ADD `assignedBy` VARCHAR(30) NOT NULL DEFAULT '' AFTER `assignedTo`; +ALTER TABLE `zt_todo` ADD `assignedDate` DATETIME NOT NULL AFTER `assignedBy`; +ALTER TABLE `zt_todo` ADD `finishedBy` VARCHAR(30) NOT NULL DEFAULT '' AFTER `assignedDate`; +ALTER TABLE `zt_todo` ADD `finishedDate` DATETIME NOT NULL AFTER `finishedBy`; +ALTER TABLE `zt_todo` ADD `closedBy` VARCHAR(30) NOT NULL DEFAULT '' AFTER `finishedDate`; +ALTER TABLE `zt_todo` ADD `closedDate` DATETIME NOT NULL AFTER `closedBy`; +ALTER TABLE `zt_todo` CHANGE `status` `status` ENUM('wait','doing','done','closed') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'wait'; + INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('1', '1', '*', '*', '*', 'moduleName=todo&methodName=createCycle', '生成周期性待办', 'zentao', 1, 'normal', '0000-00-00 00:00:00'); diff --git a/db/zentao.sql b/db/zentao.sql index 21ffbc01b6..8c858e49cc 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -742,21 +742,30 @@ CREATE TABLE IF NOT EXISTS `zt_testtask` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_todo`; CREATE TABLE IF NOT EXISTS `zt_todo` ( - `id` mediumint(8) unsigned NOT NULL auto_increment, + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `account` char(30) NOT NULL, `date` date NOT NULL, `begin` smallint(4) unsigned zerofill NOT NULL, `end` smallint(4) unsigned zerofill NOT NULL, `type` char(10) NOT NULL, - `idvalue` mediumint(8) unsigned NOT NULL default '0', + `cycle` tinyint(3) unsigned NOT NULL DEFAULT '0', + `idvalue` mediumint(8) unsigned NOT NULL DEFAULT '0', `pri` tinyint(3) unsigned NOT NULL, `name` char(150) NOT NULL, `desc` text NOT NULL, - `status` enum('wait','doing','done') NOT NULL DEFAULT 'wait', + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', `private` tinyint(1) NOT NULL, - PRIMARY KEY (`id`), + `config` varchar(255) NOT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime NOT NULL, + `finishedBy` varchar(30) NOT NULL DEFAULT '', + `finishedDate` datetime NOT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime NOT NULL, + PRIMARY KEY (`id`), KEY `todo` (`account`,`date`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; +) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_user`; CREATE TABLE IF NOT EXISTS `zt_user` ( `id` mediumint(8) unsigned NOT NULL auto_increment, @@ -787,7 +796,7 @@ CREATE TABLE IF NOT EXISTS `zt_user` ( `fails` tinyint(5) NOT NULL default '0', `locked` datetime NOT NULL default '0000-00-00 00:00:00', `ranzhi` char(30) NOT NULL default '', - `score` INT(12) NOT NULL DEFAULT '0', + `score` INT(11) NOT NULL DEFAULT '0', `scoreLevel` INT(11) NOT NULL DEFAULT '0', `deleted` enum('0','1') NOT NULL default '0', PRIMARY KEY (`id`), diff --git a/module/my/control.php b/module/my/control.php index 64edbca388..5eff4c7b4b 100644 --- a/module/my/control.php +++ b/module/my/control.php @@ -108,6 +108,9 @@ class my extends control $this->view->account = $this->app->user->account; $this->view->orderBy = $orderBy == 'date_desc,status,begin,id_desc' ? '' : $orderBy; $this->view->pager = $pager; + $this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta); + $this->view->time = date::now(); + $this->view->members = $this->loadModel('user')->getPairs(); $this->view->importFuture = ($type != 'today'); $this->display(); diff --git a/module/my/view/todo.html.php b/module/my/view/todo.html.php index 4c593ec68b..0c8a7e3727 100644 --- a/module/my/view/todo.html.php +++ b/module/my/view/todo.html.php @@ -15,7 +15,7 @@ todo->confirmDelete)?>
      +
      " . $lang->todo->export, '', "class='btn export'") ?> " . $lang->todo->batchCreate, '', "class='btn'") ?> @@ -57,7 +57,7 @@
      - + @@ -77,8 +77,11 @@
      user->dept;?>user->dept;?>
      todo->beginAB);?> todo->endAB);?> todo->status);?>actions;?>actions;?>
      end;?> todo->statusList[$todo->status];?> - id", $todo, 'list', 'ok-sign', 'hiddenwin'); + status != 'done') echo html::a(helper::createLink('todo', 'assignto', "todoID=$todo->id"), '', '', "data-toggle='assigntoModal' class='btn-icon'"); + if($todo->status == 'done') common::printIcon('todo', 'activate', "id=$todo->id", $todo, 'list', 'magic', 'hiddenwin'); + if($todo->status != 'done') common::printIcon('todo', 'finish', "id=$todo->id", $todo, 'list', 'ok-sign', 'hiddenwin'); + if($todo->status == 'done') common::printIcon('todo', 'close', "id=$todo->id", $todo, 'list', 'off', 'hiddenwin'); common::printIcon('todo', 'edit', "id=$todo->id", '', 'list', 'pencil', '', 'iframe', true); if(common::hasPriv('todo', 'delete')) @@ -97,7 +100,7 @@
      -
      + diff --git a/module/todo/control.php b/module/todo/control.php index 65b888a473..cbcf79e152 100644 --- a/module/todo/control.php +++ b/module/todo/control.php @@ -13,7 +13,7 @@ class todo extends control { /** * Construct function, load model of task, bug, my. - * + * * @access public * @return void */ @@ -28,9 +28,9 @@ class todo extends control /** * Create a todo. - * - * @param string|date $date - * @param string $account + * + * @param string|date $date + * @param string $account * @access public * @return void */ @@ -46,11 +46,11 @@ class todo extends control $date = str_replace('-', '', $this->post->date); if($date == '') { - $date = 'future'; + $date = 'future'; } elseif($date == date('Ymd')) { - $date = 'today'; + $date = 'today'; } if(!empty($_POST['idvalue'])) $this->send(array('result' => 'success')); @@ -64,14 +64,14 @@ class todo extends control $this->view->date = date("Y-m-d", strtotime($date)); $this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta); $this->view->time = date::now(); - $this->display(); + $this->display(); } /** * Batch create todo - * - * @param string $date - * @param string $account + * + * @param string $date + * @param string $account * @access public * @return void */ @@ -87,11 +87,11 @@ class todo extends control $date = str_replace('-', '', $this->post->date); if($date == '') { - $date = 'future'; + $date = 'future'; } else if($date == date('Ymd')) { - $date= 'today'; + $date= 'today'; } die(js::locate($this->createLink('my', 'todo', "type=$date"), 'parent')); } @@ -114,8 +114,8 @@ class todo extends control /** * Edit a todo. - * - * @param int $todoID + * + * @param int $todoID * @access public * @return void */ @@ -137,7 +137,7 @@ class todo extends control /* Judge a private todo or not, If private, die. */ $todo = $this->todo->getById($todoID); if($todo->private and $this->app->user->account != $todo->account) die('private'); - + $todo->date = date("Y-m-d", strtotime($todo->date)); $this->view->title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->edit; $this->view->position[] = $this->lang->todo->common; @@ -149,11 +149,11 @@ class todo extends control /** * Batch edit todo. - * + * * @param string $from example:myTodo, todoBatchEdit. - * @param string $type - * @param string $account - * @param string $status + * @param string $type + * @param string $account + * @param string $status * @access public * @return void */ @@ -174,14 +174,14 @@ class todo extends control if($this->post->todoIDList) $todoIDList = $this->post->todoIDList; /* Initialize todos whose need to edited. */ - foreach($allTodos as $todo) + foreach($allTodos as $todo) { if(in_array($todo->id, $todoIDList)) { $editedTodos[$todo->id] = $todo; } } - foreach($editedTodos as $todo) + foreach($editedTodos as $todo) { if($todo->type == 'story') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_STORY)->fetch('title'); if($todo->type == 'task') $todo->name = $this->dao->findById($todo->idvalue)->from(TABLE_TASK)->fetch('name'); @@ -233,10 +233,61 @@ class todo extends control } /** - * View a todo. - * - * @param int $todoID - * @param string $from my|company + * Activated todo. + * + * @param $todoID + * @access public + * @return void + */ + public function activate($todoID) + { + $todo = $this->todo->getById($todoID); + if($todo->status == 'done') $this->todo->activate($todoID); + if(isonlybody()) die(js::reload('parent.parent')); + die(js::reload('parent')); + } + + /** + * Closed todo. + * + * @param $todoID + * + * @access public + * @return void + */ + public function close($todoID) + { + $todo = $this->todo->getById($todoID); + if($todo->status == 'done') $this->todo->close($todoID); + if(isonlybody()) die(js::reload('parent.parent')); + die(js::reload('parent')); + } + + /** + * Assign. + * + * @param $todoID + * + * @access public + * @return void + */ + public function assignTo($todoID) + { + if(!empty($_POST)) + { + if(empty($_POST['assignedTo'])) die(js::error($this->lang->todo->noAssignedTo)); + $this->todo->assignTo($todoID); + if(dao::isError()) die(js::error(dao::getError())); + die(js::reload('parent')); + } + } + + /** + * View a todo. + * + * @param int $todoID + * @param string $from my|company + * * @access public * @return void */ @@ -288,8 +339,8 @@ class todo extends control /** * Delete a todo. - * - * @param int $todoID + * + * @param int $todoID * @param string $confirm yes|no * @access public * @return void @@ -327,8 +378,8 @@ class todo extends control /** * Finish a todo. - * - * @param int $todoID + * + * @param int $todoID * @access public * @return void */ @@ -349,7 +400,7 @@ class todo extends control /** * Batch finish todos. - * + * * @access public * @return void */ @@ -357,7 +408,7 @@ class todo extends control { if(!empty($_POST['todoIDList'])) { - foreach($_POST['todoIDList'] as $todoID) + foreach($_POST['todoIDList'] as $todoID) { $todo = $this->todo->getById($todoID); if($todo->status != 'done') $this->todo->finish($todoID); @@ -368,7 +419,7 @@ class todo extends control /** * Import selected todoes to today. - * + * * @access public * @return void */ @@ -381,10 +432,10 @@ class todo extends control } /** - * Get data to export - * - * @param string $productID - * @param string $orderBy + * Get data to export + * + * @param string $productID + * @param string $orderBy * @access public * @return void */ @@ -446,8 +497,8 @@ class todo extends control /** * AJAX: get actions of a todo. for web app. - * - * @param int $todoID + * + * @param int $todoID * @access public * @return void */ @@ -459,7 +510,7 @@ class todo extends control /** * Create cycle. - * + * * @access public * @return void */ diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index ba73c3c830..9fd8bfcfdd 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -12,8 +12,11 @@ $lang->todo->common = 'Todo'; $lang->todo->index = "Home"; $lang->todo->create = "Create Todo"; +$lang->todo->assignTo = "Assign"; +$lang->todo->activate = "Activate"; $lang->todo->batchCreate = "Batch Create"; $lang->todo->edit = "Edit"; +$lang->todo->close = "Close"; $lang->todo->batchEdit = "Batch Edit"; $lang->todo->view = "Overview"; $lang->todo->finish = "Finish"; @@ -59,9 +62,10 @@ $lang->todo->confirmBug = 'This Todo is related to Bug #%s. Do you want to edi $lang->todo->confirmTask = 'This Todo is related to Task #%s,Do you want to edit it?'; $lang->todo->confirmStory = 'This Todo is related to Story #%s,Do you want to edit it?'; -$lang->todo->statusList['wait'] = 'Wait'; -$lang->todo->statusList['doing'] = 'Doing'; -$lang->todo->statusList['done'] = 'Done'; +$lang->todo->statusList['wait'] = 'Wait'; +$lang->todo->statusList['doing'] = 'Doing'; +$lang->todo->statusList['done'] = 'Done'; +$lang->todo->statusList['closed'] = 'Closed'; //$lang->todo->statusList['cancel'] = 'Cancelled'; //$lang->todo->statusList['postpone'] = 'Delayed'; @@ -86,6 +90,7 @@ $lang->todo->thisIsPrivate = 'This is a private Todo'; $lang->todo->lblDisableDate = 'Set later.'; $lang->todo->lblBeforeDays = "%s early in advance to be done"; $lang->todo->noTodo = 'No this type of Todo.'; +$lang->todo->noAssignedTo = "The AssignedTo user can't be empty."; $lang->todo->periods['today'] = 'Today'; $lang->todo->periods['yesterday'] = 'Yesterday'; diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index 5202990c6c..0fbda0b2a2 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -12,14 +12,17 @@ $lang->todo->common = '待办'; $lang->todo->index = "待办一览"; $lang->todo->create = "新增"; +$lang->todo->assignTo = "指派"; +$lang->todo->activate = "激活"; $lang->todo->batchCreate = "批量添加"; -$lang->todo->edit = "更新待办"; +$lang->todo->edit = "编辑"; +$lang->todo->close = "关闭"; $lang->todo->batchEdit = "批量编辑"; $lang->todo->view = "待办详情"; $lang->todo->finish = "完成"; $lang->todo->batchFinish = "批量完成"; $lang->todo->export = "导出"; -$lang->todo->delete = "删除待办"; +$lang->todo->delete = "删除"; $lang->todo->import2Today = "导入到今天"; $lang->todo->import = "导入"; $lang->todo->legendBasic = "基本信息"; @@ -59,9 +62,10 @@ $lang->todo->confirmBug = '该Todo关联的是Bug #%s,需要修改它吗?' $lang->todo->confirmTask = '该Todo关联的是Task #%s,需要修改它吗?'; $lang->todo->confirmStory = '该Todo关联的是Story #%s,需要修改它吗?'; -$lang->todo->statusList['wait'] = '未开始'; -$lang->todo->statusList['doing'] = '进行中'; -$lang->todo->statusList['done'] = '已完成'; +$lang->todo->statusList['wait'] = '未开始'; +$lang->todo->statusList['doing'] = '进行中'; +$lang->todo->statusList['done'] = '已完成'; +$lang->todo->statusList['closed'] = '已关闭'; //$lang->todo->statusList['cancel'] = '已取消'; //$lang->todo->statusList['postpone'] = '已延期'; @@ -86,6 +90,7 @@ $lang->todo->thisIsPrivate = '这是一条私人事务。:)'; $lang->todo->lblDisableDate = '暂时不设定时间'; $lang->todo->lblBeforeDays = "提前%s天生成待办"; $lang->todo->noTodo = '该类型没有待办事务'; +$lang->todo->noAssignedTo = '被指派人不能为空'; $lang->todo->periods['today'] = '今日'; $lang->todo->periods['yesterday'] = '昨日'; diff --git a/module/todo/model.php b/module/todo/model.php index 080d476e36..96fb105c64 100644 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -15,9 +15,9 @@ class todoModel extends model { /** * Create a todo. - * - * @param date $date - * @param string $account + * + * @param date $date + * @param string $account * @access public * @return void */ @@ -81,7 +81,7 @@ class todoModel extends model /** * Create batch todo - * + * * @access public * @return void */ @@ -116,7 +116,7 @@ class todoModel extends model if($todo->type == 'story') $todo->idvalue = isset($todos->storys[$i + 1]) ? $todos->storys[$i + 1] : 0; $this->dao->insert(TABLE_TODO)->data($todo)->autoCheck()->exec(); - if(dao::isError()) + if(dao::isError()) { echo js::error(dao::getError()); die(js::reload('parent')); @@ -139,8 +139,8 @@ class todoModel extends model /** * update a todo. - * - * @param int $todoID + * + * @param int $todoID * @access public * @return void */ @@ -198,7 +198,7 @@ class todoModel extends model /** * Batch update todos. - * + * * @access public * @return array */ @@ -235,7 +235,7 @@ class todoModel extends model if($oldTodo->type == 'bug' or $oldTodo->type == 'task') $oldTodo->name = ''; $this->dao->update(TABLE_TODO)->data($todo) ->autoCheck() - ->checkIF($todo->type == 'custom', $this->config->todo->edit->requiredFields, 'notempty') + ->checkIF($todo->type == 'custom', $this->config->todo->edit->requiredFields, 'notempty') ->checkIF($todo->type == 'bug', 'idvalue', 'notempty') ->checkIF($todo->type == 'task', 'idvalue', 'notempty') ->where('id')->eq($todoID) @@ -243,7 +243,7 @@ class todoModel extends model if($oldTodo->status != 'done' and $todo->status == 'done') $this->loadModel('action')->create('todo', $todoID, 'finished', '', 'done'); - if(!dao::isError()) + if(!dao::isError()) { $allChanges[$todoID] = common::createChanges($oldTodo, $todo); } @@ -259,23 +259,28 @@ class todoModel extends model /** * Change the status of a todo. - * - * @param string $todoID - * @param string $status + * + * @param string $todoID + * @param string $status * @access public * @return void */ public function finish($todoID) { - $this->dao->update(TABLE_TODO)->set('status')->eq('done')->where('id')->eq((int)$todoID)->exec(); + $this->dao->update(TABLE_TODO) + ->set('status')->eq('done') + ->set('finishedBy')->eq($this->app->user->account) + ->set('finishedDate')->eq(helper::now()) + ->where('id')->eq((int)$todoID) + ->exec(); $this->loadModel('action')->create('todo', $todoID, 'finished', '', 'done'); return; } /** * Get info of a todo. - * - * @param int $todoID + * + * @param int $todoID * @param bool $setImgSize * @access public * @return object|bool @@ -295,11 +300,11 @@ class todoModel extends model /** * Get todo list of a user. - * - * @param date $date - * @param string $account + * + * @param date $date + * @param string $account * @param string $status all|today|thisweek|lastweek|before, or a date. - * @param int $limit + * @param int $limit * @access public * @return void */ @@ -309,12 +314,12 @@ class todoModel extends model $todos = array(); $date = strtolower($date); - if($date == 'today') + if($date == 'today') { $begin = date::today(); $end = $begin; } - elseif($date == 'yesterday') + elseif($date == 'yesterday') { $begin = date::yesterday(); $end = $begin; @@ -381,7 +386,7 @@ class todoModel extends model ->beginIF($limit > 0)->limit($limit)->fi() ->page($pager) ->query(); - + /* Set session. */ $sql = explode('WHERE', $this->dao->get()); $sql = explode('ORDER', $sql[1]); @@ -409,9 +414,9 @@ class todoModel extends model /** * Judge an action is clickable or not. - * - * @param object $todo - * @param string $action + * + * @param object $todo + * @param string $action * @access public * @return bool */ @@ -429,9 +434,9 @@ class todoModel extends model } /** - * CreateByCycle - * - * @param int $todoList + * CreateByCycle + * + * @param int $todoList * @access public * @return void */ @@ -495,4 +500,55 @@ class todoModel extends model } } } + + /** + * Activate todo. + * + * @param $todoID + * + * @access public + * @return bool + */ + public function activate($todoID) + { + $this->dao->update(TABLE_TODO)->set('status')->eq('wait')->where('id')->eq((int)$todoID)->exec(); + $this->loadModel('action')->create('todo', $todoID, 'activated', '', 'wait'); + return !dao::isError(); + } + + /** + * Closed todo. + * + * @param $todoID + * + * @access public + * @return bool + */ + public function close($todoID) + { + $this->dao->update(TABLE_TODO) + ->set('status')->eq('closed') + ->set('closedBy')->eq($this->app->user->account) + ->set('closedDate')->eq(helper::now()) + ->where('id')->eq((int)$todoID) + ->exec(); + $this->loadModel('action')->create('todo', $todoID, 'closed', '', 'closed'); + return !dao::isError(); + } + + public function assignTo($todoID) + { + $todo = fixer::input('post') + ->add('assignedBy', $this->app->user->account) + ->add('assignedDate', helper::now()) + ->setIF(isset($_POST['future']), 'date', '2030-01-01') + ->setIF(isset($_POST['lblDisableDate']), 'begin', '2400') + ->setIF(isset($_POST['lblDisableDate']), 'end', '2400') + ->remove('future,lblDisableDate') + ->get(); + + $this->dao->update(TABLE_TODO)->data($todo)->where('id')->eq((int)$todoID)->exec(); + $this->loadModel('action')->create('todo', $todoID, 'assigned', '', 'assigned'); + return !dao::isError(); + } } diff --git a/module/todo/view/assignto.html.php b/module/todo/view/assignto.html.php new file mode 100755 index 0000000000..fa9710cfd4 --- /dev/null +++ b/module/todo/view/assignto.html.php @@ -0,0 +1,88 @@ + + * @package todo + * @version $Id: create.html.php 2741 2012-04-07 07:24:21 $ + * @link http://www.zentao.net + */ +?> + + + \ No newline at end of file diff --git a/module/todo/view/view.html.php b/module/todo/view/view.html.php index 8269a3486f..1b72750642 100644 --- a/module/todo/view/view.html.php +++ b/module/todo/view/view.html.php @@ -24,7 +24,7 @@
      - todo->desc; if($todo->type == 'bug') echo html::a($this->createLink('bug', 'view', "id={$todo->idvalue}"), ' BUG#' . $todo->idvalue); if($todo->type == 'task') echo html::a($this->createLink('task', 'view', "id={$todo->idvalue}"), ' TASK#' . $todo->idvalue); @@ -40,7 +40,7 @@
      todo->legendBasic;?> - +
      @@ -71,7 +71,7 @@ config = json_decode($todo->config);?>
      todo->cycle;?> -
      todo->pri;?> todo->priList[$todo->pri];?>
      +
      @@ -105,6 +105,15 @@ From a63770647a3f3eae453ff08d8398f6e8b8a5d010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 11 Jan 2018 21:58:37 +0800 Subject: [PATCH 083/206] * Fix sql. --- db/zentao.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/zentao.sql b/db/zentao.sql index 8c858e49cc..a3a98f5372 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -765,7 +765,7 @@ CREATE TABLE IF NOT EXISTS `zt_todo` ( `closedDate` datetime NOT NULL, PRIMARY KEY (`id`), KEY `todo` (`account`,`date`) -) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; +) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- DROP TABLE IF EXISTS `zt_user`; CREATE TABLE IF NOT EXISTS `zt_user` ( `id` mediumint(8) unsigned NOT NULL auto_increment, From 0a5264547c25b63a995c6aba6a47b9b75c3daeb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Thu, 11 Jan 2018 23:13:27 +0800 Subject: [PATCH 084/206] * Finish Task#3586. --- module/todo/model.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/todo/model.php b/module/todo/model.php index 96fb105c64..1c95418afa 100644 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -375,7 +375,11 @@ class todoModel extends model if($account == '') $account = $this->app->user->account; $stmt = $this->dao->select('*')->from(TABLE_TODO) - ->where('account')->eq($account) + ->where('1') + ->andWhere('account', true)->eq($account) + ->orWhere('assignedTo')->eq($account) + ->orWhere('finishedBy')->eq($account) + ->markRight(1) ->beginIF($begin)->andWhere('date')->ge($begin)->fi() ->beginIF($end)->andWhere('date')->le($end)->fi() ->beginIF($status != 'all' and $status != 'undone')->andWhere('status')->in($status)->fi() From 1c828004b13277d04131e452179d347f377405cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 12 Jan 2018 09:30:19 +0800 Subject: [PATCH 085/206] * Format code. --- module/task/view/view.html.php | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php index 50b935fa13..7aa2f8a765 100644 --- a/module/task/view/view.html.php +++ b/module/task/view/view.html.php @@ -110,13 +110,13 @@ lang->task->children;?>
      todo->beginAndEnd?> config->begin . " ~ " . $todo->config->end;?>
      - - - - - - - + + + + + + + @@ -167,11 +167,11 @@
      task->legendBasic;?> -
      task->id;?> task->lblPri;?> task->name;?>task->deadline;?> task->assignedTo;?> task->status;?> task->consumedAB . $lang->task->lblHour;?> task->id;?> task->lblPri;?> task->name;?>task->deadline;?> task->assignedTo;?> task->status;?>task->consumedAB . $lang->task->lblHour;?> task->leftAB . $lang->task->lblHour;?> actions;?>
      +
      - + - + - + @@ -272,7 +272,7 @@
      task->legendEffort;?> -
      task->project;?> project", $project->name)) echo $project->name;?>
      task->module;?>
      task->story;?> - storyTitle and !common::printLink('story', 'view', "storyID=$task->story", $task->storyTitle, '', "class='iframe' data-width='80%'", true, true)) echo $task->storyTitle; if($task->needConfirm) { @@ -222,7 +222,7 @@ fromBug):?>
      task->fromBug;?>createLink('bug', 'view', "bugID=$task->fromBug"), "#$task->fromBug " . $fromBug->title, '_blank');?>createLink('bug', 'view', "bugID=$task->fromBug"), "#$task->fromBug " . $fromBug->title, '_blank');?>
      +
      @@ -280,7 +280,7 @@ - + - + - + - + @@ -306,7 +306,7 @@
      task->legendLife;?> -
      task->estStarted;?> estStarted;?>
      task->realStarted;?> realStarted; ?>
      task->deadline;?> @@ -289,15 +289,15 @@ if(isset($task->delay)) printf($lang->task->delayWarning, $task->delay); ?>
      task->estimate;?> estimate . $lang->workingHour;?>
      task->consumed;?> consumed, 2) . $lang->workingHour;?>
      task->left;?> left . $lang->workingHour;?>
      +
      From b4446d53fc6c1058f076c8025d560ae02326d30c Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 12 Jan 2018 10:02:00 +0800 Subject: [PATCH 086/206] * finish task #3568. --- module/common/view/footer.html.php | 19 ++++++++++++++++--- module/message/control.php | 18 ++++++++++++++---- www/js/my.full.js | 17 +++++++++++++++++ 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/module/common/view/footer.html.php b/module/common/view/footer.html.php index ea2f421361..4cc1eb2c11 100755 --- a/module/common/view/footer.html.php +++ b/module/common/view/footer.html.php @@ -28,12 +28,25 @@ $(function(){showBrowserNotice()}); /* Alert get message. */ $(function() { + var windowBlur = false; + if(window.Notification) + { + window.onblur = function(){windowBlur = true;} + window.onfocus = function(){windowBlur = false;} + } setInterval(function() { - $.get('createLink('message', 'ajaxGetMessage')?>', function(data) + $.get(createLink('message', 'ajaxGetMessage', "windowBlur=" + (windowBlur ? '1' : '0')), function(data) { - $('#noticeBox').append(data); - adjustNoticePosition(); + if(!windowBlur) + { + $('#noticeBox').append(data); + adjustNoticePosition(); + } + else + { + if(data) notifyMessage(data); + } }); }, 60 * 1000); }) diff --git a/module/message/control.php b/module/message/control.php index e13f1264de..24c65b6e94 100644 --- a/module/message/control.php +++ b/module/message/control.php @@ -60,30 +60,40 @@ class message extends control * @access public * @return void */ - public function ajaxGetMessage() + public function ajaxGetMessage($windowBlur = false) { $waitMessages = $this->message->getMessages('wait'); $todos = $this->message->getNoticeTodos(); if(empty($waitMessages) and empty($todos)) die(); $messages = ''; + $newline = $windowBlur ? "\n" : '
      '; $idList = array(); foreach($waitMessages as $message) { - $messages .= $message->data . '
      '; + $messages .= $message->data . $newline; $idList[] = $message->id; } $this->dao->update(TABLE_NOTIFY)->set('status')->eq('sended')->andWhere('sendTime')->eq(helper::now())->where('id')->in($idList)->exec(); - foreach($todos as $todo) $messages .= $todo->data . '
      '; + foreach($todos as $todo) $messages .= $todo->data . $newline; + if($windowBlur) $messages = strip_tags($messages); - echo <<
      {$messages}
      EOT; + } + $this->dao->delete('*')->from(TABLE_NOTIFY)->where('objectType')->eq('message')->andWhere('status')->eq('sended')->exec(); } } diff --git a/www/js/my.full.js b/www/js/my.full.js index b962987086..682a12765e 100644 --- a/www/js/my.full.js +++ b/www/js/my.full.js @@ -1996,6 +1996,23 @@ function adjustNoticePosition() }); } +function notifyMessage(data) +{ + if(window.Notification) + { + if(Notification.permission == "granted") + { + new Notification("", {body:data}); + } + else if(Notification.permission != "denied") + { + Notification.requestPermission(function(permission) + { + new Notification("", {body:data}); + }); + } + } +} /* Ping the server every some minutes to keep the session. */ needPing = true; From dd0d97a437b5a16e46f2e58bf92598c894eed5cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 12 Jan 2018 10:38:11 +0800 Subject: [PATCH 087/206] * Finish Task#3587. --- db/zentao.sql | 24 ++++++++++++++++++++++++ module/group/lang/resource.php | 7 +++++-- module/todo/config.php | 3 ++- module/todo/view/view.html.php | 10 ++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/db/zentao.sql b/db/zentao.sql index a3a98f5372..f1f705b2a0 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -1518,6 +1518,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (2, 'todo', 'finish'), (2, 'todo', 'import2Today'), (2, 'todo', 'view'), +(2, 'todo', 'assignTo'), +(2, 'todo', 'activate'), +(2, 'todo', 'close'), (2, 'user', 'bug'), (2, 'user', 'deleteContacts'), (2, 'user', 'dynamic'), @@ -1957,6 +1960,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (4, 'todo', 'finish'), (4, 'todo', 'import2Today'), (4, 'todo', 'view'), +(4, 'todo', 'assignTo'), +(4, 'todo', 'activate'), +(4, 'todo', 'close'), (4, 'tree', 'browse'), (4, 'tree', 'browseTask'), (4, 'tree', 'delete'), @@ -2214,6 +2220,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (5, 'todo', 'finish'), (5, 'todo', 'import2Today'), (5, 'todo', 'view'), +(5, 'todo', 'assignTo'), +(5, 'todo', 'activate'), +(5, 'todo', 'close'), (5, 'tree', 'browse'), (5, 'tree', 'browseTask'), (5, 'tree', 'delete'), @@ -2443,6 +2452,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (6, 'todo', 'finish'), (6, 'todo', 'import2Today'), (6, 'todo', 'view'), +(6, 'todo', 'assignTo'), +(6, 'todo', 'activate'), +(6, 'todo', 'close'), (6, 'tree', 'browse'), (6, 'tree', 'browseTask'), (6, 'tree', 'delete'), @@ -2684,6 +2696,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (7, 'todo', 'finish'), (7, 'todo', 'import2Today'), (7, 'todo', 'view'), +(7, 'todo', 'assignTo'), +(7, 'todo', 'activate'), +(7, 'todo', 'close'), (7, 'tree', 'browse'), (7, 'tree', 'browseTask'), (7, 'tree', 'delete'), @@ -2937,6 +2952,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (8, 'todo', 'finish'), (8, 'todo', 'import2Today'), (8, 'todo', 'view'), +(8, 'todo', 'assignTo'), +(8, 'todo', 'activate'), +(8, 'todo', 'close'), (8, 'tree', 'browse'), (8, 'tree', 'browseTask'), (8, 'tree', 'delete'), @@ -3103,6 +3121,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (9, 'todo', 'finish'), (9, 'todo', 'import2Today'), (9, 'todo', 'view'), +(9, 'todo', 'assignTo'), +(9, 'todo', 'activate'), +(9, 'todo', 'close'), (9, 'user', 'batchCreate'), (9, 'user', 'batchEdit'), (9, 'user', 'bug'), @@ -3217,6 +3238,9 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (10, 'todo', 'finish'), (10, 'todo', 'import2Today'), (10, 'todo', 'view'), +(10, 'todo', 'assignTo'), +(10, 'todo', 'activate'), +(10, 'todo', 'close'), (10, 'user', 'bug'), (10, 'user', 'dynamic'), (10, 'user', 'profile'), diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 763705c285..7a6cd501ee 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -115,6 +115,9 @@ $lang->resource->todo->export = 'export'; $lang->resource->todo->finish = 'finish'; $lang->resource->todo->batchFinish = 'batchFinish'; $lang->resource->todo->import2Today = 'import2Today'; +$lang->resource->todo->assignTo = 'assignTo'; +$lang->resource->todo->activate = 'activate'; +$lang->resource->todo->close = 'close'; $lang->todo->methodOrder[5] = 'create'; $lang->todo->methodOrder[10] = 'batchCreate'; @@ -953,7 +956,7 @@ $lang->editor->methodOrder[30] = 'delete'; /* Convert. */ $lang->resource->convert = new stdclass(); $lang->resource->convert->index = 'index'; -$lang->resource->convert->selectSource = 'selectSource'; +$lang->resource->convert->selectSource = 'selectSource'; $lang->resource->convert->setConfig = 'setConfig'; $lang->resource->convert->setBugfree = 'setBugfree'; $lang->resource->convert->setRedmine = 'setRedmine'; @@ -1417,7 +1420,7 @@ if($config->global->flow == 'onlyStory') unset($lang->moduleOrder[150]); unset($lang->resource->git); unset($lang->moduleOrder[155]); - + unset($lang->resource->story->tasks); } diff --git a/module/todo/config.php b/module/todo/config.php index af20d428df..34f3f814b8 100644 --- a/module/todo/config.php +++ b/module/todo/config.php @@ -16,9 +16,10 @@ $config->todo->times->delta = 10; $config->todo->editor = new stdclass(); $config->todo->editor->create = array('id' => 'desc', 'tools' => 'simpleTools'); $config->todo->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools'); +$config->todo->editor->view = array('id' => 'comment,lastComment', 'tools' => 'simpleTools'); $config->todo->list = new stdclass(); -$config->todo->list->exportFields = 'id, account, date, begin, end, type, idvalue, pri, name, desc, status, private'; +$config->todo->list->exportFields = 'id, account, date, begin, end, type, idvalue, pri, name, desc, status, private'; $config->todo->list->customBatchCreateFields = 'type,pri,desc,beginAndEnd'; $config->todo->list->customBatchEditFields = 'pri,desc,beginAndEnd,status'; diff --git a/module/todo/view/view.html.php b/module/todo/view/view.html.php index 1b72750642..bccd6a4b64 100644 --- a/module/todo/view/view.html.php +++ b/module/todo/view/view.html.php @@ -11,6 +11,7 @@ */ ?> + private or ($todo->private and $todo->account == $app->user->account)):?>
      @@ -112,6 +113,8 @@ if($todo->status == 'done' || $todo->status == 'closed') echo html::a($this->createLink('todo', 'activate', "todoID=$todo->id"), " " . $lang->todo->activate, 'hiddenwin', "class='btn showinonlybody'"); if($todo->status == 'done') echo html::a($this->createLink('todo', 'close', "todoID=$todo->id"), " " . $lang->todo->close, 'hiddenwin', "class='btn showinonlybody'"); echo html::a($this->createLink('todo', 'delete', "todoID=$todo->id"), " " . $lang->todo->delete, 'hiddenwin', "class='btn showinonlybody'"); + + echo html::a('#commentBox', '', '', "title='$lang->comment' onclick='setComment()' class='btn'"); } if($this->session->todoList) @@ -153,6 +156,13 @@ ?>
      +
      + comment;?> +
      id")?>' target='hiddenwin'> +
      + + +
      task->openedBy;?> openedBy) echo zget($users, $task->openedBy, $task->openedBy) . $lang->at . $task->openedDate;?>
      - + session->currentProductType != 'normal'):?> @@ -239,7 +239,7 @@
      bug->product;?>bug->product;?> product", $productName)) echo $productName;?>
      - + @@ -288,7 +288,7 @@
      bug->openedBy;?>bug->openedBy;?> openedBy) . $lang->at . $bug->openedDate;?>
      - + > - + diff --git a/module/project/view/grouptask.html.php b/module/project/view/grouptask.html.php index bb798c8d78..2233c58111 100644 --- a/module/project/view/grouptask.html.php +++ b/module/project/view/grouptask.html.php @@ -55,7 +55,7 @@ $groupWait = 0; $groupDone = 0; $groupDoing = 0; - $groupClosed = 0; + $groupClosed = 0; $groupEstimate = 0.0; $groupConsumed = 0.0; $groupLeft = 0.0; @@ -113,7 +113,7 @@ - + - + From 691df86cce87786237f2e2345af00b85c122d982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 15 Jan 2018 17:26:26 +0800 Subject: [PATCH 101/206] * Finish Task#3557 --- module/search/view/buildform.html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/search/view/buildform.html.php b/module/search/view/buildform.html.php index 0934964a27..1a436d400a 100644 --- a/module/search/view/buildform.html.php +++ b/module/search/view/buildform.html.php @@ -376,7 +376,7 @@ foreach($fieldParams as $fieldName => $param) echo ''; /* Print field. */ - echo "'; + echo "'; /* Print operator. */ echo "'; @@ -435,7 +435,7 @@ foreach($fieldParams as $fieldName => $param) echo ''; /* Print field. */ - echo "'; + echo "'; /* Print operator. */ echo "'; From 5dddac711bfaf72ec62c51fdc34e89bbca75c87d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 10:25:51 +0800 Subject: [PATCH 102/206] * adjus for todo to story and bug. --- module/bug/lang/zh-cn.php | 4 ++-- module/bug/lang/zh-tw.php | 4 ++-- module/dev/model.php | 2 +- module/todo/control.php | 1 + module/todo/js/view.js | 35 ++++++++++++++++++++++++++++++++++ module/todo/view/view.html.php | 25 ++++++++++++++++++++---- www/js/my.full.js | 11 ++++++++++- 7 files changed, 72 insertions(+), 10 deletions(-) diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 583f2f8694..7312dd55f6 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -157,8 +157,8 @@ $lang->bug->confirmDeleteTemplate = '您确认要删除该模板吗?'; /* 模板。*/ $lang->bug->tplStep = "

      [步骤]

      "; -$lang->bug->tplResult = "

      [结果]

      "; -$lang->bug->tplExpect = "

      [期望]

      "; +$lang->bug->tplResult = "

      [结果]

      "; +$lang->bug->tplExpect = "

      [期望]

      "; /* 各个字段取值列表。*/ $lang->bug->severityList[3] = '3'; diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php index 9a5246988a..321d7c26d1 100644 --- a/module/bug/lang/zh-tw.php +++ b/module/bug/lang/zh-tw.php @@ -157,8 +157,8 @@ $lang->bug->confirmDeleteTemplate = '您確認要刪除該模板嗎?'; /* 模板。*/ $lang->bug->tplStep = "

      [步驟]

      "; -$lang->bug->tplResult = "

      [結果]

      "; -$lang->bug->tplExpect = "

      [期望]

      "; +$lang->bug->tplResult = "

      [結果]

      "; +$lang->bug->tplExpect = "

      [期望]

      "; /* 各個欄位取值列表。*/ $lang->bug->severityList[3] = '3'; diff --git a/module/dev/model.php b/module/dev/model.php index 7bbdd1ab47..f4049a8f0a 100644 --- a/module/dev/model.php +++ b/module/dev/model.php @@ -16,7 +16,7 @@ class devModel extends model foreach($datatables as $table) { $table = current($table); - if(strpos($table, $this->config->db->prefix) !== false) + if(empty($this->config->db->prefix) or strpos($table, $this->config->db->prefix) !== false) { $subTable = substr($table, strpos($table, '_') + 1); $group = zget($this->config->dev->group, $subTable, 'other'); diff --git a/module/todo/control.php b/module/todo/control.php index cbcf79e152..0bfcf8527f 100644 --- a/module/todo/control.php +++ b/module/todo/control.php @@ -333,6 +333,7 @@ class todo extends control $this->view->actions = $this->loadModel('action')->getList('todo', $todoID); $this->view->from = $from; $this->view->projects = $this->loadModel('project')->getPairs(); + $this->view->products = $this->loadModel('product')->getPairs(); $this->display(); } diff --git a/module/todo/js/view.js b/module/todo/js/view.js index d770f94475..a51ea6e595 100644 --- a/module/todo/js/view.js +++ b/module/todo/js/view.js @@ -1,5 +1,17 @@ $(function() { + $('#toStoryLink').click(function() + { + $('#productModal .modal-body .input-group .input-group-btn').addClass('hidden'); + $('#productModal #toStoryButton').closest('.input-group-btn').removeClass('hidden'); + }) + + $('#toBugLink').click(function() + { + $('#productModal .modal-body .input-group .input-group-btn').addClass('hidden'); + $('#productModal #toBugButton').closest('.input-group-btn').removeClass('hidden'); + }) + $('#toTaskButton').click(function() { var onlybody = config.onlybody; @@ -10,6 +22,29 @@ $(function() config.onlybody = onlybody; parent.location.href = link; + }) + $('#toStoryButton').click(function() + { + var onlybody = config.onlybody; + config.onlybody = 'no'; + + var productID = $(this).closest('.input-group').find('#product').val(); + var link = createLink('story', 'create', 'productID=' + productID + '&branch=0&moduleID=0&storyID=0&projectID=0&bugID=0&planID=0&todoID=' + todoID); + + config.onlybody = onlybody; + parent.location.href = link; + }) + + $('#toBugButton').click(function() + { + var onlybody = config.onlybody; + config.onlybody = 'no'; + + var productID = $(this).closest('.input-group').find('#product').val(); + var link = createLink('bug', 'create', 'productID=' + productID + '&branch=0&extras=todoID=' + todoID); + + config.onlybody = onlybody; + parent.location.href = link; }) }); diff --git a/module/todo/view/view.html.php b/module/todo/view/view.html.php index bccd6a4b64..019111ad7d 100644 --- a/module/todo/view/view.html.php +++ b/module/todo/view/view.html.php @@ -56,7 +56,7 @@
      - + @@ -143,9 +143,9 @@ unset($_GET['onlybody']); echo ""; echo ""; if($isonlybody) $_GET['onlybody'] = 'yes'; } @@ -179,6 +179,23 @@ +id);?> todo->thisIsPrivate;?> diff --git a/www/js/my.full.js b/www/js/my.full.js index 7ae9a15e65..dff96be3c1 100644 --- a/www/js/my.full.js +++ b/www/js/my.full.js @@ -15,7 +15,16 @@ function createLink(moduleName, methodName, vars, viewType, isOnlyBody) if(vars) { vars = vars.split('&'); - for(i = 0; i < vars.length; i ++) vars[i] = vars[i].split('='); + for(i = 0; i < vars.length; i ++) + { + splited = vars[i].split('='); + + var newvars = new Array() + newvars[0] = splited.shift(); + newvars[1] = splited.join('='); + + vars[i] = newvars; + } } if(config.requestType != 'GET') { From e55e97d7ffb155cf63fd31d1795f1829949d945d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 10:28:39 +0800 Subject: [PATCH 103/206] * Fix Bug#1373,1374. --- module/task/control.php | 26 +++++++++++++------------- module/task/model.php | 4 ++-- module/task/view/edit.html.php | 6 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/module/task/control.php b/module/task/control.php index f64f0f141e..9ceb312589 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -46,18 +46,18 @@ class task extends control public function create($projectID = 0, $storyID = 0, $moduleID = 0, $taskID = 0, $todoID = 0) { $task = new stdClass(); - $task->module = $moduleID; - $task->assignedTo = ''; - $task->name = ''; - $task->story = $storyID; - $task->type = ''; - $task->pri = ''; - $task->estimate = ''; - $task->desc = ''; - $task->estStarted = ''; - $task->deadline = ''; - $task->mailto = ''; - $task->color = ''; + $task->module = $moduleID; + $task->assignedTo = ''; + $task->name = ''; + $task->story = $storyID; + $task->type = ''; + $task->pri = ''; + $task->estimate = ''; + $task->desc = ''; + $task->estStarted = ''; + $task->deadline = ''; + $task->mailto = ''; + $task->color = ''; if($taskID > 0) { $task = $this->task->getByID($taskID); @@ -784,7 +784,7 @@ class task extends control } $task = $this->view->task; - $members = $this->loadModel('user')->getPairs('noletter'); + $members = $this->loadModel('project')->getTeamMemberPairs($task->project, 'nodeleted'); $task->nextBy = $task->assignedTo; $this->view->users = $members; diff --git a/module/task/model.php b/module/task/model.php index 4b4ff3bd74..e7db886ad2 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -2356,11 +2356,11 @@ class taskModel extends model */ public function getMemberPairs($task) { - $users = $this->loadModel('user')->getPairs('noletter'); + $users = $this->loadModel('project')->getTeamMemberPairs($task->project, 'nodeleted'); $members = array(''); foreach($task->team as $member) { - $members[$member->account] = $users[$member->account]; + if(isset($users[$member->account])) $members[$member->account] = $users[$member->account]; } return $members; } diff --git a/module/task/view/edit.html.php b/module/task/view/edit.html.php index 0fe0e0ae8e..c85d672960 100644 --- a/module/task/view/edit.html.php +++ b/module/task/view/edit.html.php @@ -88,7 +88,7 @@ - + ' id='teamTr'> @@ -198,7 +198,7 @@
      bug->linkBug;?>bug->linkBug;?> linkBugTitles)) diff --git a/module/mail/lang/en.php b/module/mail/lang/en.php index d218073cf7..5124c8cc5b 100755 --- a/module/mail/lang/en.php +++ b/module/mail/lang/en.php @@ -1,14 +1,15 @@ mail->common = 'Email Settings'; -$lang->mail->index = 'Home'; -$lang->mail->detect = 'Testing'; -$lang->mail->edit = 'Edit Settings'; -$lang->mail->save = 'Saved'; -$lang->mail->test = 'Email Sending Test'; -$lang->mail->reset = 'Reset'; -$lang->mail->resend = 'Resend'; -$lang->mail->browse = 'Email List'; -$lang->mail->delete = 'Delete Email'; +$lang->mail->common = 'Email Settings'; +$lang->mail->index = 'Home'; +$lang->mail->detect = 'Testing'; +$lang->mail->edit = 'Edit Settings'; +$lang->mail->save = 'Save'; +$lang->mail->saveSuccess = 'Saved Successfully'; +$lang->mail->test = 'Email Sending Test'; +$lang->mail->reset = 'Reset'; +$lang->mail->resend = 'Resend'; +$lang->mail->browse = 'Email List'; +$lang->mail->delete = 'Delete Email'; $lang->mail->ztCloud = 'ZenTao CloudMail'; $lang->mail->gmail = 'GMAIL'; $lang->mail->sendCloud = 'Notice SendCloud'; diff --git a/module/mail/lang/zh-cn.php b/module/mail/lang/zh-cn.php index 8a3942fa18..2cce024cad 100755 --- a/module/mail/lang/zh-cn.php +++ b/module/mail/lang/zh-cn.php @@ -1,14 +1,15 @@ mail->common = '发信配置'; -$lang->mail->index = '首页'; -$lang->mail->detect = '检测'; -$lang->mail->edit = '编辑配置'; -$lang->mail->save = '成功保存'; -$lang->mail->test = '测试发信'; -$lang->mail->reset = '重置'; -$lang->mail->resend = '重发'; -$lang->mail->browse = '邮件列表'; -$lang->mail->delete = '删除邮件'; +$lang->mail->common = '发信配置'; +$lang->mail->index = '首页'; +$lang->mail->detect = '检测'; +$lang->mail->edit = '编辑配置'; +$lang->mail->save = '保存'; +$lang->mail->saveSuccess = '保存成功'; +$lang->mail->test = '测试发信'; +$lang->mail->reset = '重置'; +$lang->mail->resend = '重发'; +$lang->mail->browse = '邮件列表'; +$lang->mail->delete = '删除邮件'; $lang->mail->ztCloud = '禅道云发信'; $lang->mail->gmail = 'GMAIL发信'; $lang->mail->sendCloud = 'Notice发信'; diff --git a/module/mail/lang/zh-tw.php b/module/mail/lang/zh-tw.php index e050d419ce..5ff7ebbc9d 100644 --- a/module/mail/lang/zh-tw.php +++ b/module/mail/lang/zh-tw.php @@ -1,14 +1,15 @@ mail->common = '發信配置'; -$lang->mail->index = '首頁'; -$lang->mail->detect = '檢測'; -$lang->mail->edit = '編輯配置'; -$lang->mail->save = '成功保存'; -$lang->mail->test = '測試發信'; -$lang->mail->reset = '重置'; -$lang->mail->resend = '重發'; -$lang->mail->browse = '郵件列表'; -$lang->mail->delete = '刪除郵件'; +$lang->mail->common = '發信配置'; +$lang->mail->index = '首頁'; +$lang->mail->detect = '檢測'; +$lang->mail->edit = '編輯配置'; +$lang->mail->save = '保存'; +$lang->mail->saveSuccess = '成功保存'; +$lang->mail->test = '測試發信'; +$lang->mail->reset = '重置'; +$lang->mail->resend = '重發'; +$lang->mail->browse = '郵件列表'; +$lang->mail->delete = '刪除郵件'; $lang->mail->ztCloud = '禪道雲發信'; $lang->mail->gmail = 'GMAIL發信'; $lang->mail->sendCloud = 'Notice發信'; diff --git a/module/mail/view/save.html.php b/module/mail/view/save.html.php index b3e122d42e..2b1b0005d6 100755 --- a/module/mail/view/save.html.php +++ b/module/mail/view/save.html.php @@ -16,7 +16,7 @@
      icons['mail']);?> mail->common;?> - mail->save;?> + mail->saveSuccess;?>
      diff --git a/module/testcase/view/view.html.php b/module/testcase/view/view.html.php index a0736b8f2b..286ab6cbeb 100644 --- a/module/testcase/view/view.html.php +++ b/module/testcase/view/view.html.php @@ -134,12 +134,12 @@ - + - + session->currentProductType != 'normal'):?> diff --git a/module/todo/view/batchcreate.html.php b/module/todo/view/batchcreate.html.php index 12f4634d41..f9c86082cd 100755 --- a/module/todo/view/batchcreate.html.php +++ b/module/todo/view/batchcreate.html.php @@ -19,7 +19,7 @@ icons['batchCreate']);?> todo->batchCreate;?>
      todo->date;?> - + todo->periods['future'];?>
      From 4a174dee69822751da2e1898bfbe561f94d059d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 12 Jan 2018 11:07:45 +0800 Subject: [PATCH 089/206] * Format code. --- module/testcase/control.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index 543777b6be..45d9c88c64 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -194,11 +194,12 @@ class testcase extends control /** * Create a test case. - * - * @param int $productID - * @param int $moduleID - * @param string $from - * @param int $param + * @param $productID + * @param string $branch + * @param int $moduleID + * @param string $from + * @param int $param + * @param int $storyID * @access public * @return void */ @@ -846,8 +847,8 @@ class testcase extends control /** * Batch change branch. - * - * @param int $branchID + * + * @param int $branchID * @access public * @return void */ From 7fed01e4671c3f2a2b9d41780d2013b86f9d4197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Fri, 12 Jan 2018 15:36:12 +0800 Subject: [PATCH 090/206] * Finish Task#3575. --- module/testtask/control.php | 101 +++++----- module/testtask/js/cases.js | 13 ++ module/testtask/model.php | 242 ++++++++++++----------- module/testtask/view/caseheader.html.php | 1 + module/testtask/view/cases.html.php | 2 +- 5 files changed, 190 insertions(+), 169 deletions(-) diff --git a/module/testtask/control.php b/module/testtask/control.php index 88dc8e5056..f31feed99a 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -15,7 +15,7 @@ class testtask extends control /** * Construct function, load product module, assign products to view auto. - * + * * @access public * @return void */ @@ -29,7 +29,7 @@ class testtask extends control /** * Index page, header to browse. - * + * * @access public * @return void */ @@ -92,8 +92,8 @@ class testtask extends control /** * Create a test task. - * - * @param int $productID + * + * @param int $productID * @access public * @return void */ @@ -151,7 +151,7 @@ class testtask extends control $this->view->position[] = $this->lang->testtask->common; $this->view->position[] = $this->lang->testtask->create; - if($projectID != 0) + if($projectID != 0) { $this->view->products = $products; $this->view->projectID = $projectID; @@ -167,8 +167,8 @@ class testtask extends control /** * View a test task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -213,13 +213,13 @@ class testtask extends control /** * Browse cases of a test task. - * - * @param string $taskID + * + * @param string $taskID * @param string $browseType bymodule|all|assignedtome - * @param int $param - * @param int $recTotal - * @param int $recPerPage - * @param int $pageID + * @param int $param + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID * @access public * @return void */ @@ -251,9 +251,11 @@ class testtask extends control } if($browseType == 'bymodule') setcookie('taskCaseModule', (int)$param, $this->config->cookieLife, $this->config->webRoot); if($browseType != 'bymodule') $this->session->set('taskCaseBrowseType', $browseType); + if($browseType == 'account') $this->session->set('taskCaseAccount', $param); - $moduleID = ($browseType == 'bymodule') ? (int)$param : ($browseType == 'bysearch' ? 0 : ($this->cookie->taskCaseModule ? $this->cookie->taskCaseModule : 0)); - $queryID = ($browseType == 'bysearch') ? (int)$param : 0; + $moduleID = ($browseType == 'bymodule') ? (int)$param : ($browseType == 'bysearch' ? 0 : ($this->cookie->taskCaseModule ? $this->cookie->taskCaseModule : 0)); + $queryID = ($browseType == 'bysearch') ? (int)$param : 0; + $account = ($browseType == 'account') ? $param : 'all'; /* Append id for secend sort. */ $sort = $this->loadModel('common')->appendOrder($orderBy, 't2.id'); @@ -300,6 +302,7 @@ class testtask extends control $this->view->moduleName = $moduleID ? $this->tree->getById($moduleID)->name : $this->lang->tree->all; $this->view->treeClass = $browseType == 'bymodule' ? '' : 'hidden'; $this->view->pager = $pager; + $this->view->account = $account; $this->view->branches = $this->loadModel('branch')->getPairs($productID); $this->view->setShowModule = false; @@ -308,11 +311,11 @@ class testtask extends control /** * The report page. - * - * @param int $productID - * @param string $browseType + * + * @param int $productID + * @param string $browseType * @param int $branchID - * @param int $moduleID + * @param int $moduleID * @access public * @return void */ @@ -449,8 +452,8 @@ class testtask extends control /** * Start testtask. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -490,8 +493,8 @@ class testtask extends control /** * activate testtask. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -531,8 +534,8 @@ class testtask extends control /** * Close testtask. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -574,8 +577,8 @@ class testtask extends control /** * block testtask. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -615,8 +618,8 @@ class testtask extends control /** * Delete a test task. - * - * @param int $taskID + * + * @param int $taskID * @param string $confirm yes|no * @access public * @return void @@ -653,8 +656,8 @@ class testtask extends control /** * Link cases to a test task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -725,8 +728,8 @@ class testtask extends control /** * Remove a case from test task. - * - * @param int $rowID + * + * @param int $rowID * @access public * @return void */ @@ -798,17 +801,17 @@ class testtask extends control $caseResult = $this->testtask->createResult($runID); if(dao::isError()) die(js::error(dao::getError())); - if('fail' == $caseResult) { + if('fail' == $caseResult) { $response['result'] = 'success'; $response['locate'] = $this->createLink('testtask', 'results',"runID=$runID&caseID=$caseID&version=$version"); die($this->send($response)); - } - else + } + else { /* set cookie for ajax load caselist when close colorbox. */ setcookie('selfClose', 1); - + if($preAndNext->next) { $nextRunID = $runID ? $preAndNext->next->id : 0; @@ -827,7 +830,7 @@ class testtask extends control $response['target'] = 'parent'; die($this->send($response)); } - } + } } $preCase = array(); @@ -844,7 +847,7 @@ class testtask extends control $nextCase['caseID'] = $runID ? $preAndNext->next->case : $preAndNext->next->id; $nextCase['version'] = $preAndNext->next->version; } - + $this->view->run = $run; $this->view->preCase = $preCase; $this->view->nextCase = $nextCase; @@ -858,10 +861,10 @@ class testtask extends control /** * Batch run case. - * - * @param int $productID - * @param string $orderBy - * @param string $from + * + * @param int $productID + * @param string $orderBy + * @param string $from * @access public * @return void */ @@ -899,7 +902,7 @@ class testtask extends control ->where('t2.id')->in($caseIDList) ->andWhere('t1.version=t2.version') ->fetchGroup('case', 'id'); - + $this->view->caseIDList = $caseIDList; $this->view->productID = $productID; $this->view->title = $this->lang->testtask->batchRun; @@ -910,9 +913,9 @@ class testtask extends control /** * View test results of a test run. - * - * @param int $runID - * @param int $caseID + * + * @param int $runID + * @param int $caseID * @access public * @return void */ @@ -945,8 +948,8 @@ class testtask extends control /** * Batch assign cases. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ diff --git a/module/testtask/js/cases.js b/module/testtask/js/cases.js index 8f8a14db11..ef979ec08b 100644 --- a/module/testtask/js/cases.js +++ b/module/testtask/js/cases.js @@ -6,3 +6,16 @@ $(document).ready(function() setTimeout(function(){fixedTheadOfList('#caseList')}, 100); if($('#caseList thead th.w-title').width() < 150) $('#caseList thead th.w-title').width(150); }); + +function changeUser(account, taskID) +{ + if(account == '') + { + link = createLink('testtask', 'cases', 'taskID=' + taskID + '&browseType=all'); + } + else + { + link = createLink('testtask', 'cases', 'taskID=' + taskID + '&browseType=account¶m=' + account); + } + location.href = link; +} diff --git a/module/testtask/model.php b/module/testtask/model.php index 2ffe5b4410..a7b3e7d983 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -14,10 +14,10 @@ class testtaskModel extends model { /** - * Set the menu. - * - * @param array $products - * @param int $productID + * Set the menu. + * + * @param array $products + * @param int $productID * @access public * @return void */ @@ -33,7 +33,7 @@ class testtaskModel extends model } else { - if($key == 'product') + if($key == 'product') { $replace = $selectHtml; } @@ -64,8 +64,8 @@ class testtaskModel extends model /** * Create a test task. - * - * @param int $productID + * + * @param int $productID * @access public * @return void */ @@ -147,7 +147,7 @@ class testtaskModel extends model * * @param int $projectID * @param string $orderBy - * @param object $pager + * @param object $pager * @access public * @return array */ @@ -165,8 +165,8 @@ class testtaskModel extends model /** * Get task by idList. - * - * @param array $idList + * + * @param array $idList * @access public * @return array */ @@ -177,8 +177,8 @@ class testtaskModel extends model /** * Get test task info by id. - * - * @param int $taskID + * + * @param int $taskID * @param bool $setImgSize * @access public * @return void @@ -214,8 +214,8 @@ class testtaskModel extends model /** * Get test tasks by user. - * - * @param string $account + * + * @param string $account * @access public * @return array */ @@ -238,9 +238,9 @@ class testtaskModel extends model /** * Get taskrun by case id. - * - * @param int $taskID - * @param int $caseID + * + * @param int $taskID + * @param int $caseID * @access public * @return void */ @@ -251,13 +251,13 @@ class testtaskModel extends model /** * Get linkable casses. - * - * @param int $productID + * + * @param int $productID * @param object $task - * @param int $taskID + * @param int $taskID * @param string $type * @param string $param - * @param object $pager + * @param object $pager * @access public * @return array */ @@ -282,9 +282,9 @@ class testtaskModel extends model /** * Get all linkable cases. - * + * * @param object $task - * @param string $query + * @param string $query * @param array $linkedCases * @param object $pager * @access public @@ -304,12 +304,12 @@ class testtaskModel extends model /** * Get linkable cases by story. - * - * @param int $productID + * + * @param int $productID * @param object $task * @param string $query * @param array $linkedCases - * @param object $pager + * @param object $pager * @access public * @return array */ @@ -336,12 +336,12 @@ class testtaskModel extends model /** * Get linkable cases by bug. - * - * @param int $productID + * + * @param int $productID * @param object $task * @param string $query * @param array $linkedCases - * @param object $pager + * @param object $pager * @access public * @return array */ @@ -368,13 +368,13 @@ class testtaskModel extends model /** * Get linkable cases by suite. - * - * @param int $productID + * + * @param int $productID * @param object $task * @param string $query * @param string $suite * @param array $linkedCases - * @param object $pager + * @param object $pager * @access public * @return array */ @@ -396,25 +396,25 @@ class testtaskModel extends model /** * Get linkeable cases by test task. - * + * * @param string $testTask * @param array $linkedCases - * @param object $pager + * @param object $pager * @access public * @return array */ public function getLinkableCasesByTestTask($testTask, $linkedCases, $pager) { $caseList = $this->dao->select("`case`")->from(TABLE_TESTRUN)->where('task')->eq($testTask)->andWhere('`case`')->notin($linkedCases)->fetchPairs('case'); - + return $this->dao->select("*")->from(TABLE_CASE)->where('id')->in($caseList)->andWhere('status')->ne('wait')->page($pager)->fetchAll(); } /** * Get related test tasks. - * - * @param int $productID - * @param int $testtaskID + * + * @param int $productID + * @param int $testtaskID * @access public * @return array */ @@ -431,32 +431,32 @@ class testtaskModel extends model ->fetchPairs('id', 'name'); } - /** + /** * Get report data of test task per run result. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return array */ public function getDataOfTestTaskPerRunResult($taskID) - { + { $datas = $this->dao->select('lastRunResult AS name, COUNT(*) AS value')->from(TABLE_TESTRUN)->where('task')->eq($taskID)->groupBy('name')->orderBy('value DESC')->fetchAll('name'); if(!$datas) return array(); foreach($datas as $result => $data) $data->name = isset($this->lang->testcase->resultList[$result])? $this->lang->testcase->resultList[$result] : $this->lang->testtask->unexecuted; return $datas; - } + } - /** + /** * Get report data of test task per Type. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return array */ public function getDataOfTestTaskPerType($taskID) - { + { $datas = $this->dao->select('t2.type as name,count(*) as value')->from(TABLE_TESTRUN)->alias('t1') ->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id') ->where('t1.task')->eq($taskID) @@ -471,15 +471,15 @@ class testtaskModel extends model return $datas; } - /** - * Get report data of test task per module - * - * @param int $taskID + /** + * Get report data of test task per module + * + * @param int $taskID * @access public * @return array */ public function getDataOfTestTaskPerModule($taskID) - { + { $datas = $this->dao->select('t2.module as name,count(*) as value')->from(TABLE_TESTRUN)->alias('t1') ->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id') ->where('t1.task')->eq($taskID) @@ -490,20 +490,20 @@ class testtaskModel extends model if(!$datas) return array(); $modules = $this->loadModel('tree')->getModulesName(array_keys($datas)); - foreach($datas as $moduleID => $data) $data->name = isset($modules[$moduleID]) ? $modules[$moduleID] : '/'; + foreach($datas as $moduleID => $data) $data->name = isset($modules[$moduleID]) ? $modules[$moduleID] : '/'; return $datas; - } + } - /** + /** * Get report data of test task per runner - * - * @param int $taskID + * + * @param int $taskID * @access public * @return array */ public function getDataOfTestTaskPerRunner($taskID) - { + { $datas = $this->dao->select('lastRunner AS name, COUNT(*) AS value')->from(TABLE_TESTRUN)->where('task')->eq($taskID)->groupBy('name')->orderBy('value DESC')->fetchAll('name'); if(!$datas) return array(); @@ -514,8 +514,8 @@ class testtaskModel extends model /** * Merge the default chart settings and the settings of current chart. - * - * @param string $chartType + * + * @param string $chartType * @access public * @return void */ @@ -537,8 +537,8 @@ class testtaskModel extends model /** * Update a test task. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -562,8 +562,8 @@ class testtaskModel extends model /** * Start testtask. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -584,7 +584,7 @@ class testtaskModel extends model /** * Close testtask. - * + * * @access public * @return void */ @@ -613,9 +613,9 @@ class testtaskModel extends model /** * update block testtask. - * - * @param int $taskID - * @access public + * + * @param int $taskID + * @access public * @return void */ public function block($taskID) @@ -635,8 +635,8 @@ class testtaskModel extends model /** * update activate testtask. - * - * @param int $taskID + * + * @param int $taskID * @access public * @return void */ @@ -657,8 +657,8 @@ class testtaskModel extends model /** * Link cases. - * - * @param int $taskID + * + * @param int $taskID * @param string $type * @access public * @return void @@ -685,10 +685,10 @@ class testtaskModel extends model /** * Get test runs of a test task. - * - * @param int $taskID - * @param int $moduleID - * @param object $pager + * + * @param int $taskID + * @param int $moduleID + * @param object $pager * @access public * @return array */ @@ -709,10 +709,10 @@ class testtaskModel extends model /** * Get test runs of a user. - * - * @param int $taskID - * @param int $user - * @param obejct $pager + * + * @param int $taskID + * @param int $user + * @param obejct $pager * @access public * @return array */ @@ -732,15 +732,15 @@ class testtaskModel extends model } /** - * Get testtask linked cases. - * - * @param int $productID - * @param string $browseType - * @param int $queryID - * @param int $moduleID - * @param string $sort - * @param object $pager - * @param object $task + * Get testtask linked cases. + * + * @param int $productID + * @param string $browseType + * @param int $queryID + * @param int $moduleID + * @param string $sort + * @param object $pager + * @param object $task * @access public * @return array */ @@ -758,6 +758,10 @@ class testtaskModel extends model { $runs = $this->getUserRuns($task->id, $this->session->user->account, $modules, $sort, $pager); } + elseif($browseType == 'account') + { + $runs = $this->getUserRuns($task->id, $this->session->taskCaseAccount, $modules, $sort, $pager); + } /* By search. */ elseif($browseType == 'bysearch') { @@ -802,8 +806,8 @@ class testtaskModel extends model /** * Get info of a test run. - * - * @param int $runID + * + * @param int $runID * @access public * @return void */ @@ -815,20 +819,20 @@ class testtaskModel extends model } /** - * Create test result - * - * @param int $runID + * Create test result + * + * @param int $runID * @access public * @return void */ public function createResult($runID = 0) { - /* Compute the test result. + /* Compute the test result. * * 1. if there result in the post, use it. * 2. if no result, set default is pass. * 3. then check the steps to compute result. - * + * * */ $postData = fixer::input('post')->get(); $caseResult = isset($postData->result) ? $postData->result : 'pass'; @@ -903,8 +907,8 @@ class testtaskModel extends model /** * Batch run case - * - * @param string $runCaseType + * + * @param string $runCaseType * @access public * @return void */ @@ -986,9 +990,9 @@ class testtaskModel extends model /** * Get results by runID or caseID - * - * @param int $runID - * @param int $caseID + * + * @param int $runID + * @param int $caseID * @access public * @return array */ @@ -1076,9 +1080,9 @@ class testtaskModel extends model /** * Judge an action is clickable or not. - * - * @param object $product - * @param string $action + * + * @param object $product + * @param string $action * @access public * @return void */ @@ -1096,12 +1100,12 @@ class testtaskModel extends model /** * Print cell data. - * - * @param object $col - * @param object $run - * @param array $users - * @param object $task - * @param array $branches + * + * @param object $col + * @param object $run + * @param array $users + * @param object $task + * @param array $branches * @access public * @return void */ @@ -1221,9 +1225,9 @@ class testtaskModel extends model /** * Send mail. - * - * @param int $testtaskID - * @param int $actionID + * + * @param int $testtaskID + * @param int $actionID * @access public * @return void */ @@ -1261,15 +1265,15 @@ class testtaskModel extends model $subject = $this->getSubject($testtask, $action->action); /* Send mail. */ - $this->mail->send($toList, $subject, $mailContent, $ccList); + $this->mail->send($toList, $subject, $mailContent, $ccList); if($this->mail->isError()) trigger_error(join("\n", $this->mail->getError())); } /** * Get mail subject. - * - * @param object $testtask - * @param string $actionType + * + * @param object $testtask + * @param string $actionType * @access public * @return string */ @@ -1292,8 +1296,8 @@ class testtaskModel extends model /** * Get toList and ccList. - * - * @param object $testtask + * + * @param object $testtask * @access public * @return bool|array */ diff --git a/module/testtask/view/caseheader.html.php b/module/testtask/view/caseheader.html.php index b2c6c5a946..972cbae239 100644 --- a/module/testtask/view/caseheader.html.php +++ b/module/testtask/view/caseheader.html.php @@ -39,6 +39,7 @@ echo html::a($this->inlink('groupCase', "taskID=$taskID&groupBy=$key"), $value); } echo ''; + echo "
    • " . html::select('account', $users, $account, "onchange='changeUser(this.value, $taskID)' class='form-control chosen'") . '
    • '; } if($this->methodName == 'cases') echo "
    •  {$lang->testcase->bySearch}
    • "; diff --git a/module/testtask/view/cases.html.php b/module/testtask/view/cases.html.php index e80785bfb0..382bd408ed 100644 --- a/module/testtask/view/cases.html.php +++ b/module/testtask/view/cases.html.php @@ -122,7 +122,7 @@ var moduleID = '';
      diff --git a/module/project/view/testtask.html.php b/module/project/view/testtask.html.php index d565654f6e..45613cf33c 100644 --- a/module/project/view/testtask.html.php +++ b/module/project/view/testtask.html.php @@ -53,7 +53,7 @@ common::printIcon('testtask', 'cases', "taskID=$task->id", $task, 'list', 'sitemap'); common::printIcon('testtask', 'linkCase', "taskID=$task->id", $task, 'list', 'link'); common::printIcon('testtask', 'edit', "taskID=$task->id", $task, 'list'); - common::printIcon('testreport', 'create', "objectID=$task->id&objectType=testtask", $task, 'list','flag'); + common::printIcon('testreport', 'browse', "objectID=$task->product&objectType=product&extra=$task->id", $task, 'list','flag'); if(common::hasPriv('testtask', 'delete', $task)) { diff --git a/module/tree/model.php b/module/tree/model.php index 3154bb34ad..135d36b7bc 100644 --- a/module/tree/model.php +++ b/module/tree/model.php @@ -372,7 +372,7 @@ class treeModel extends model } if(!$firstBranch) $lastMenu .= ''; - $lastMenu = "
        $lastMenu
      \n"; + $lastMenu = "
        $lastMenu
      \n"; return $lastMenu; } @@ -402,7 +402,7 @@ class treeModel extends model } /* createdVersion > 4.1. */ - $menu = "
        "; + $menu = "
          "; /* Set the start module. */ $startModulePath = ''; @@ -566,7 +566,7 @@ class treeModel extends model public function getProjectStoryTreeMenu($rootID, $startModule = 0, $userFunc) { $extra['projectID'] = $rootID; - $menu = "
            "; + $menu = "
              "; $startModulePath = ''; if($startModule > 0) { diff --git a/module/tree/view/browse.html.php b/module/tree/view/browse.html.php index 64118b6abc..c11daffb87 100644 --- a/module/tree/view/browse.html.php +++ b/module/tree/view/browse.html.php @@ -23,7 +23,7 @@
              -
                +
                  @@ -138,7 +138,6 @@ $(function() { var data = $.parseJSON(''); var options = { - name: 'tree--edit', initialState: 'preserve', data: data, sortable: { diff --git a/module/tree/view/browsetask.html.php b/module/tree/view/browsetask.html.php index fccf7fc470..538160f73a 100644 --- a/module/tree/view/browsetask.html.php +++ b/module/tree/view/browsetask.html.php @@ -19,7 +19,7 @@
                  -
                    +
                      @@ -121,14 +121,11 @@ $(function() { var data = $.parseJSON(''); var options = { - name: 'tree-project-edit', initialState: 'preserve', data: data, itemCreator: function($li, item) { - var $toggle = $('' + link + ''); - var title = (item.type === 'product' ? ' ' : '') + item.name; var link = item.id !== undefined ? ('' + title + '') : ('' + title + ''); diff --git a/module/user/control.php b/module/user/control.php index 0dbe8e1df5..7a46a73d3f 100644 --- a/module/user/control.php +++ b/module/user/control.php @@ -711,9 +711,6 @@ class user extends control /* Keep login. */ if($this->post->keepLogin) $this->user->keepLogin($user); - /* Check password. */ - if(isset($this->config->safe->mode) and $this->user->computePasswordStrength($password) < $this->config->safe->mode) echo js::alert($this->lang->user->weakPassword); - /* Go to the referer. */ if($this->post->referer and strpos($this->post->referer, $loginLink) === false and strpos($this->post->referer, $denyLink) === false) { diff --git a/www/js/my.full.js b/www/js/my.full.js index 682a12765e..7ae9a15e65 100644 --- a/www/js/my.full.js +++ b/www/js/my.full.js @@ -2041,7 +2041,7 @@ $(document).ready(function() fixStyle(); // Init tree menu - $('.tree').tree({name: config.currentModule + '-' + config.currentMethod, initialState: 'preserve'}); + $('.tree').tree({initialState: 'preserve'}); $(window).resize(saveWindowSize); // When window resized, call it again. diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 6c1fd8992e..c1b680ae66 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -808,3 +808,16 @@ body {color:#141414; padding-bottom: 40px;} .icon-file-text:before{content:'\e6d4'} body.body-modal .ke-container .ke-toolbar .ke-outline[data-name=fullscreen]{display:none;} + +.nav-tabs.nav-stacked{border-bottom:0px;} +.nav-tabs.nav-stacked > li{ float: none; margin-right: -1px; margin-bottom: 0;} +.nav-tabs.nav-stacked > li.active > a{ + border: 1px solid #ddd; + border-right-color: rgb(221, 221, 221); + border-right-color: transparent; +} + +.nav-tabs.nav-stacked > li > a { + margin-right: 0; + border-radius: 4px 0 0 4px; +} From bb156560a9e548cdee9b46bdcbeda5185e77150f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 15 Jan 2018 11:26:52 +0800 Subject: [PATCH 095/206] * Fix Bug#1343. --- module/testcase/control.php | 2 +- module/testcase/model.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index 45d9c88c64..bbd357a86b 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -722,7 +722,7 @@ class testcase extends control } } - if(!$this->testcase->forceNotReview()) unset($this->lang->testcase->statusList['wait']); + // if(!$this->testcase->forceNotReview()) unset($this->lang->testcase->statusList['wait']); /* Bug#1343 */ /* Judge whether the editedTasks is too large and set session. */ $countInputVars = count($cases) * (count(explode(',', $this->config->testcase->custom->batchEditFields)) + 3); diff --git a/module/testcase/model.php b/module/testcase/model.php index f882088460..765e0683bb 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -1457,7 +1457,7 @@ class testcaseModel extends model } /** - * Check whether force not review + * Check whether force not review. * * @access public * @return bool From be5f8e78763ad3c75a4af6d60f3479f4ec77970c Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 15 Jan 2018 11:28:00 +0800 Subject: [PATCH 096/206] * finish task #3569. --- module/project/control.php | 1 + module/project/view/testtask.html.php | 26 ++++++++++++++++++++- module/testreport/control.php | 33 ++++++++++++++++++++++++--- module/testreport/lang/en.php | 1 + module/testreport/lang/zh-cn.php | 1 + 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/module/project/control.php b/module/project/control.php index 38529bf5f3..bb8cbca34d 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -770,6 +770,7 @@ class project extends control $this->view->orderBy = $orderBy; $this->view->tasks = $this->testtask->getProjectTasks($projectID); $this->view->users = $this->loadModel('user')->getPairs('noclosed|noletter'); + $this->view->products = $this->loadModel('product')->getPairs(); $this->display(); } diff --git a/module/project/view/testtask.html.php b/module/project/view/testtask.html.php index 45613cf33c..1b55220d42 100644 --- a/module/project/view/testtask.html.php +++ b/module/project/view/testtask.html.php @@ -25,10 +25,12 @@ +
              testcase->lib;?>testcase->lib;?> lib", $libName)) echo $libName;?>
              testcase->product;?>testcase->product;?> product", $productName)) echo $productName;?>
              + @@ -41,7 +43,13 @@ - + + @@ -65,5 +73,21 @@ + + + + +
              idAB;?>testtask->product;?> testtask->name;?> testtask->build;?> testtask->owner;?>
              createLink('testtask', 'view', "taskID=$task->id"), sprintf('%03d', $task->id));?> + id}' /> "; + echo html::a($this->createLink('testtask', 'view', "taskID=$task->id"), sprintf('%03d', $task->id)); + ?> + product, '');?> createLink('testtask', 'view', "taskID=$task->id"), $task->name);?> build == 'trunk' ? print($lang->trunk) : print(html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName));?> owner];?>
              +
              + createLink('testreport', 'browse', "objectID=$projectID&objctType=project"); + $misc = common::hasPriv('testreport', 'browse') ? "onclick=\"setFormAction('$actionLink', '', '#testtaskForm')\"" : "disabled='disabled'"; + echo html::commonButton($lang->testreport->common, $misc); + ?> +
              +
              + diff --git a/module/testreport/control.php b/module/testreport/control.php index a5826ec78f..44f7aab989 100644 --- a/module/testreport/control.php +++ b/module/testreport/control.php @@ -63,11 +63,25 @@ class testreport extends control $pager = pager::init($recTotal, $recPerPage, $pageID); $reports = $this->testreport->getList($objectID, $objectType, $extra, $orderBy, $pager); + if($objectType == 'project' and isset($_POST['taskIdList'])) + { + $taskIdList = $_POST['taskIdList']; + foreach($reports as $reportID => $report) + { + $tasks = explode(',', $report->tasks); + if(count($tasks) != count($taskIdList) or array_diff($tasks, $taskIdList)) unset($reports[$reportID]); + } + } + if(empty($reports) and common::hasPriv('testreport', 'create')) { $param = ''; if($objectType == 'product' and $extra) $param = "objectID=$extra&objectType=testtask"; - if($objectType == 'project') $param = "objectID=$objectID&objectType=project"; + if($objectType == 'project') + { + $param = "objectID=$objectID&objectType=project"; + if(isset($_POST['taskIdList'])) $param .= '&extra=' . join(',', $_POST['taskIdList']); + } if($param) $this->locate($this->createLink('testreport', 'create', $param)); } @@ -102,10 +116,11 @@ class testreport extends control * * @param int $objectID * @param string $objectType + * @param string $extra * @access public * @return void */ - public function create($objectID, $objectType = 'testtask') + public function create($objectID, $objectType = 'testtask', $extra = '') { if($_POST) { @@ -157,11 +172,23 @@ class testreport extends control $tasks = $this->testtask->getProjectTasks($projectID); $owners = array(); $productIdList = array(); - foreach($tasks as $task) + foreach($tasks as $i => $task) { + if(!empty($extra) and strpos(",{$extra},", "{$task->id}") === false) + { + unset($tasks[$i]); + continue; + } + $owners[$task->owner] = $task->owner; $productIdList[$task->product] = $task->product; } + if(count($productIdList) > 1) + { + echo(js::alert($this->lang->testreport->moreProduct)); + die(js::locate('back')); + } + $stories = $this->story->getProjectStories($project->id); $builds = $this->build->getProjectBuilds($project->id); diff --git a/module/testreport/lang/en.php b/module/testreport/lang/en.php index 9a6bf65343..2311328f35 100644 --- a/module/testreport/lang/en.php +++ b/module/testreport/lang/en.php @@ -64,6 +64,7 @@ $lang->testreport->foundBugTip = "Bugs created in this build and created in t $lang->testreport->legacyBugTip = "Active Bugs, or the resolved beyond the test period."; $lang->testreport->fromCaseBugTip = "Bugs created after case-failure in the test period."; $lang->testreport->errorTrunk = "The trunk version cannot create a test report. Please modify the associated version!"; +$lang->testreport->moreProduct = "A test report can only be generated for the same product."; $lang->testreport->bugSummary = <<%s Bug(s) generated in total , diff --git a/module/testreport/lang/zh-cn.php b/module/testreport/lang/zh-cn.php index 6fd615055a..bc91e1a668 100644 --- a/module/testreport/lang/zh-cn.php +++ b/module/testreport/lang/zh-cn.php @@ -64,6 +64,7 @@ $lang->testreport->foundBugTip = "影响版本在测试轮次内,并且创 $lang->testreport->legacyBugTip = "Bug状态是激活,或Bug的解决时间在测试结束时间之后。"; $lang->testreport->fromCaseBugTip = "测试时间范围内,用例执行失败后创建的Bug"; $lang->testreport->errorTrunk = "主干版本不能创建测试报告,请修改关联版本!"; +$lang->testreport->moreProduct = "只能对同一个产品生成测试报告。"; $lang->testreport->bugSummary = <<%s个Bug , From d49cc7d23ff083a0530022de968642367b6d4fa5 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 15 Jan 2018 14:12:00 +0800 Subject: [PATCH 097/206] * finish task #3559. --- doc/CHANGELOG | 2 +- module/misc/lang/zh-cn.php | 14 ++++++++++++++ module/testsuite/model.php | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 0e333cf5b7..595bd42df0 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -101,7 +101,7 @@ 1349 测试-用例列表,用例选择多个适用阶段,列表显示错行 1350 项目任务列表,高级表格,延期任务,选中,鼠标放置上去,显示异常。 -2017-11-06 9.6 +2017-11-06 9.6.stable 完成的需求 1988 需求,任务,bug,用例,待办都可以选择看板模式。 2004 运维性的项目支持多人任务和子任务功能 diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index 23e21d26ce..f63f66e16f 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -74,6 +74,20 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = '最新版本'; $lang->misc->feature->detailed = '详情'; +$lang->misc->feature->all['9.7.stable'][] = array('title'=>'调整国际版,增加英文Demo数据。', 'desc' => ''); + +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'新增了webhook功能', 'desc' => '实现与倍冾、钉钉的消息通知接口'); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'新增禅道操作获取积分的功能', 'desc' => ''); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'项目任务新增了多人任务和子任务功能', 'desc' => ''); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'产品视图新增了产品线功能', 'desc' => ''); + +$lang->misc->feature->all['9.5.1'][] = array('title'=>'新增受限操作', 'desc' => ''); + +$lang->misc->feature->all['9.3.beta'][] = array('title'=>'升级框架,增强程序安全', 'desc' => ''); + +$lang->misc->feature->all['9.1.stable'][] = array('title'=>'完善测试视图', 'desc' => '

              增加测试套件、公共测试库和测试总结功能

              '); +$lang->misc->feature->all['9.1.stable'][] = array('title'=>'支持测试步骤分组', 'desc' => ''); + $lang->misc->feature->all['9.0.beta'][] = array('title'=>'增加禅道云发信功能', 'desc' => '

              禅道云发信是禅道联合SendCloud推出的一项免费发信服务,只有用户绑定禅道,并通过验证即可使用。

              '); $lang->misc->feature->all['9.0.beta'][] = array('title'=>'优化富文本编辑器和markdown编辑器', 'desc' => ''); diff --git a/module/testsuite/model.php b/module/testsuite/model.php index 8b564537e9..93a3f8434d 100644 --- a/module/testsuite/model.php +++ b/module/testsuite/model.php @@ -682,7 +682,7 @@ class testsuiteModel extends model $stepData->case = $caseID; $stepData->version = $version; $stepData->desc = $step['desc']; - $stepData->expect = htmlspecialchars($step['expect']); + $stepData->expect = $step['expect']; $this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec(); if($stepData->type == 'group') $parentStepID = $this->dao->lastInsertID(); if($stepData->type == 'step') $parentStepID = 0; @@ -717,7 +717,7 @@ class testsuiteModel extends model $stepData->case = $caseID; $stepData->version = 1; $stepData->desc = $desc; - $stepData->expect = htmlspecialchars($data->expect[$key][$id]); + $stepData->expect = $data->expect[$key][$id]; $this->dao->insert(TABLE_CASESTEP)->data($stepData)->autoCheck()->exec(); if($stepData->type == 'group') $parentStepID = $this->dao->lastInsertID(); if($stepData->type == 'step') $parentStepID = 0; From 53ed09473eea589b5b6f2ed39f5d91ec6ff4b869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 15 Jan 2018 14:58:11 +0800 Subject: [PATCH 098/206] * Fix Bug#1386 --- module/block/view/taskblock.html.php | 2 +- module/project/view/grouptask.html.php | 4 ++-- module/task/model.php | 11 ++++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index e5e611d872..60c6eafb32 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -31,7 +31,7 @@ td.delayed{background: #e84e0f!important; color: white;} ?>
              id;?>task->priList), $task->pri, $task->pri)?>task->priList, $task->pri, $task->pri)?> name?> estimate?> '>deadline, 0, 4) > 0) echo $task->deadline;?> id;?>task->priList), $task->pri, $task->pri)?>'>task->priList), $task->pri, $task->pri);?>task->priList, $task->pri, $task->pri)?>'>task->priList, $task->pri, $task->pri);?> team)) echo '' . $lang->task->multipleAB . ' '; diff --git a/module/task/model.php b/module/task/model.php index de9498b0ea..4b4ff3bd74 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -672,6 +672,7 @@ class taskModel extends model $task->status = 'done'; $task->finishedBy = $oldTask->openedBy; // Fix bug#1341 $task->finishedDate = helper::now(); + $task->assignedTo = $oldTask->openedBy; // Fix bug#1341 } else { @@ -741,7 +742,7 @@ class taskModel extends model * * @param int $taskID * @access public - * @return void + * @return array */ public function recordEstimate($taskID) { @@ -2264,8 +2265,8 @@ class taskModel extends model /** * Get mail subject. - * - * @param object $task + * + * @param object $task * @access public * @return string */ @@ -2277,8 +2278,8 @@ class taskModel extends model /** * Get toList and ccList. - * - * @param object $task + * + * @param object $task * @access public * @return bool|array */ From 954d89fb0de2bfe533b6f8c7149bca98943ad55b Mon Sep 17 00:00:00 2001 From: dajiao007 Date: Mon, 15 Jan 2018 15:20:30 +0800 Subject: [PATCH 099/206] translate version log --- module/misc/lang/en.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 853072653f..5db659c69c 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -74,6 +74,20 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Latest Version'; $lang->misc->feature->detailed = 'Details'; +$lang->misc->feature->all['9.7.stable'][] = array('title'=>'optimize International package,Added Demo data。', 'desc' => ''); + +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'added Webhook Interface feature', 'desc' => 'support communication with BearyChat,dingding'); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'added Score feature', 'desc' => 'More skilled Use, More score'); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'added Multiplayer task and subTask to project tasks', 'desc' => ''); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'added Product line management to Product View', 'desc' => ''); + +$lang->misc->feature->all['9.5.1'][] = array('title'=>'added Restricted Operatio', 'desc' => ''); + +$lang->misc->feature->all['9.3.beta'][] = array('title'=>'upgraded framework,Enhanced security', 'desc' => ''); + +$lang->misc->feature->all['9.1.stable'][] = array('title'=>'optimize Test View', 'desc' => '

              added TestSuite,CaseLib and Test Statements

              '); +$lang->misc->feature->all['9.1.stable'][] = array('title'=>'support Group steps of TestCase', 'desc' => ''); + $lang->misc->feature->all['9.0.beta'][] = array('title'=>'ZenTao CloudMail has been added.', 'desc' => '

              ZenTao CloudMail is a free Email service launched jointly with SendCloud. Once binded with ZenTao and passed verification, users can use this service.

              '); $lang->misc->feature->all['9.0.beta'][] = array('title'=>'Optimized Rich Text Editor and Markdown Editor.', 'desc' => ''); From d33804ab3deae26201dc9ca363bff99a56038e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Mon, 15 Jan 2018 15:47:06 +0800 Subject: [PATCH 100/206] * Fix bug. --- module/my/view/task.html.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/my/view/task.html.php b/module/my/view/task.html.php index 3ec7d32495..3774d106f3 100644 --- a/module/my/view/task.html.php +++ b/module/my/view/task.html.php @@ -54,7 +54,11 @@
              pri;?>'>pri;?> createLink('project', 'browse', "projectid=$task->projectID"), $task->projectName);?>createLink('task', 'view', "taskID=$task->id"), $task->name, null, "style='color: $task->color'");?> + team)) echo '' . $this->lang->task->multipleAB . ' ';?> + parent)) echo '' . $this->lang->task->childrenAB . ' ';?> + createLink('task', 'view', "taskID=$task->id"), $task->name, null, "style='color: $task->color'");?> + openedBy);?> assignedTo);?> finishedBy);?>" . html::select("field$fieldNO", $searchFields, $formSession["field$fieldNO"], "onchange='setField(this, $fieldNO, {$module}params)' class='form-control'") . '" . html::select("field$fieldNO", $searchFields, $formSession["field$fieldNO"], "onchange='setField(this, $fieldNO, {$module}params)' class='form-control chosen'") . '" . html::select("operator$fieldNO", $lang->search->operators, $formSession["operator$fieldNO"], "class='form-control'") . '" . html::select("field$fieldNO", $searchFields, $formSession["field$fieldNO"], "onchange='setField(this, $fieldNO, {$module}params)' class='form-control'") . '" . html::select("field$fieldNO", $searchFields, $formSession["field$fieldNO"], "onchange='setField(this, $fieldNO, {$module}params)' class='form-control chosen'") . '" . html::select("operator$fieldNO", $lang->search->operators, $formSession["operator$fieldNO"], "class='form-control'") . '
              todo->account;?>account;?>account);?>
              todo->date;?>
              task->assignedTo;?>assignedTo, "class='form-control chosen'");?>assignedTo, "class='form-control chosen'");?>
              task->team;?>
              team as $member):?> - + - + - - @@ -124,7 +122,7 @@ - + diff --git a/module/story/model.php b/module/story/model.php index 58f9135102..8a6620f60d 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -2356,15 +2356,15 @@ class storyModel extends model echo ""; break; case 'title': - if($story->branch) echo "{$branches[$story->branch]} "; - if($modulePairs and $story->module) echo "{$modulePairs[$story->module]} "; + if($story->branch and isset($branches[$story->branch])) echo "{$branches[$story->branch]} "; + if($story->module and isset($modulePairs[$story->module])) echo "{$modulePairs[$story->module]} "; echo $canView ? html::a($storyLink, $story->title, '', "style='color: $story->color'") : "{$story->title}"; break; case 'plan': echo $story->planTitle; break; case 'branch': - echo $branches[$story->branch]; + echo zget($branches, $story->branch, ''); break; case 'keywords': echo $story->keywords; From a4d4683a93223c52ea62f4ac06ad633e856cd47d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Jan 2018 10:43:13 +0800 Subject: [PATCH 125/206] * fix bug #1347. --- lib/base/dao/dao.class.php | 4 ++++ lib/base/filter/filter.class.php | 18 ++++++++++++++++++ module/common/lang/en.php | 1 + module/common/lang/zh-cn.php | 1 + 4 files changed, 24 insertions(+) diff --git a/lib/base/dao/dao.class.php b/lib/base/dao/dao.class.php index de4318b9f7..f7b0039625 100644 --- a/lib/base/dao/dao.class.php +++ b/lib/base/dao/dao.class.php @@ -1356,6 +1356,10 @@ class baseDAO { $field['rule'] = 'date'; } + elseif($type == 'datetime') + { + $field['rule'] = 'datetime'; + } else { $field['rule'] = 'skip'; diff --git a/lib/base/filter/filter.class.php b/lib/base/filter/filter.class.php index a4491fc604..c454e69f55 100644 --- a/lib/base/filter/filter.class.php +++ b/lib/base/filter/filter.class.php @@ -262,12 +262,30 @@ class baseValidater */ public static function checkDate($date) { + if(empty($date)) return true; if($date == '0000-00-00') return true; $stamp = strtotime($date); if(!is_numeric($stamp)) return false; return checkdate(date('m', $stamp), date('d', $stamp), date('Y', $stamp)); } + /** + * Check datetime. + * + * @param string $datetime + * @static + * @access public + * @return bool + */ + public static function checkDatetime($datetime) + { + if(empty($datetime)) return true; + if($datetime == '0000-00-00 00:00:00') return true; + $stamp = strtotime($datetime); + if(!is_numeric($stamp)) return false; + return checkdate(date('m', $stamp), date('d', $stamp), date('Y', $stamp)); + } + /** * 检查正则表达式。 * REG checking. diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 723699acd6..9fdc6dfd93 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -425,6 +425,7 @@ $lang->error->int = array("『%s』should be numbers", "『%s』shou $lang->error->float = "『%s』should be numbers, decimals included."; $lang->error->email = "『%s』should be valid Email."; $lang->error->date = "『%s』should be valid date."; +$lang->error->datetime = "『%s』should be valid date."; $lang->error->code = "『%s』should be letters or numbers."; $lang->error->account = "『%s』should be valid account."; $lang->error->passwordsame = "Two passwords should be consistent."; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 50bb493075..acf66b64cc 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -425,6 +425,7 @@ $lang->error->int = array("『%s』应当是数字。", "『%s』应 $lang->error->float = "『%s』应当是数字,可以是小数。"; $lang->error->email = "『%s』应当为合法的EMAIL。"; $lang->error->date = "『%s』应当为合法的日期。"; +$lang->error->datetime = "『%s』应当为合法的日期。"; $lang->error->code = "『%s』应当为字母或数字的组合。"; $lang->error->account = "『%s』应当为合法的用户名。"; $lang->error->passwordsame = "两次密码应当相等。"; From 9aa48ff9f3dc4ceb8a4f5b6a8c77728be825403a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Jan 2018 10:58:03 +0800 Subject: [PATCH 126/206] * add for changelog. --- doc/CHANGELOG | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/doc/CHANGELOG b/doc/CHANGELOG index 595bd42df0..1bfeea193e 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,3 +1,65 @@ +2017-01-17 9.8.stable +完成的需求 +683 todo增加转需求,bug或者任务的功能 +1678 todo增加评论功能。 +1680 todo增加处理流程 +1681 待办实现周期性待办功能 +1923 报表可以选择显示的方式 +1952 移植然之里面的消息通知功能 +2001 调整导出页面的格式 +2037 测试用例关联需求时候关闭需求也列出 +2103 禅道中所有创建编辑页面的下拉框都增加搜索定位功能 +2120 需求任务bug编辑页面抄送给字段可以选择联系人 +2151 加强计划和项目之间的关系 +2243 测试版本的用例列表增加按照指派给分组。 +2245 统计-组织-员工负载表显示未安排任务的人员信息 +2339 增加指派给我的区块 +2369 处理下目标服务器积极拒绝链接的错误提示 +2380 生成测试报告时可以选择多个测试单 +2401 利用浏览器的消息提醒机制实现消息提醒 +2409 每日提醒邮件增加任务和bug的超时提醒内容 +2426 优化文档详情页面的排版 +2428 邮件中需求任务bug用例标题显示设置的颜色 +2460 Bug导入模版中增加截止日期字段的导入 +2479 zt_mailqueue 和 zt_webhookdatas 合并成zt_notify +2484 zt_team增加type和root字段,project和task 改成 root +2499 实现集中的消息处理机制 +2523 补充最近的修改记录 +2566 config下面的配置文件,应该最后加载my.php +2568 搜索表单的字段也可以支持搜索 +2572 通过编辑修改需求plan的时候,计算需求的stage字段。 +2573 计划的日期可以设置为待定 +2574 需求关闭之后,stage也都改成closed。 +2575 丰富计划列表页面的信息 +2591 help/changeLog的页面中,显示最新的changeLog +2592 修改‘个人档案’中的翻译 + +修复的Bug +1331 项目需求下,如果需求排序权限处于未开启的情况;在选择多个复选框是会出问题 +1341 点击任务开始剩余工时选择0点击确定完成任务的时候没有把指派人更换成创建人 +1343 待评审状态用例,批量编辑后,状态会更新为空 +1347 bug编辑日期可以输入汉字且被保存 +1355 zentaopms/module/dev/model.php 代码优化 +1359 看板,未开始的任务,不能拖拽到进行中。 +1360 未完全修改#2518需求中的所有项目 +1362 创建子任务使用粘贴文本,保存超过10条时,10条以上的数据不保存 +1363 后台自定义日期必填项无效 +1365 后台-安全,设置密码安全为强时,满足安全强度,登录时也会提示密码强度小 +1367 我的地盘-任务,子任务在任务列表中不显示标签 +1369 备注权限(action comment),取消视图维护,后台权限验证。 +1371 文件格式附件预览的时候报错 +1373 编辑多人任务,可以选择出了项目团队成员之外的其他成员。 +1374 多人任务,完成,转交,指派人,可以选择非项目团队成员 +1377 用例内容包含特殊字符时,导出内容不正确 +1378 编辑用户信息,填写邮箱有空格会提示email不合法 +1379 任务列表,任务条数大于每页显示条数时,新建子任务会显示在最后一页 +1382 php7 打开项目中的树状图报错 字符串转数组问题 +1384 项目-测试 操作栏中的测试报告按钮点击后跳转到创建报告页面 +1385 测试-用例 从用例库导入用例的搜索中所属模块显示的不是用例库中的模块 +1386 项目任务列表的优先级显示错误 +1387 后台-自定义-需求-评审流程,设置强制评审人员,保存不上 +1388 修改父子任务的所属项目无法整体移动 + 2017-12-22 9.7.stable 完成的需求 2475 批量操作时增加列中切换快捷键支持 From 402975b444d94cb40460fff6d84a5364d87463f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 17 Jan 2018 11:07:13 +0800 Subject: [PATCH 127/206] * Fix bug#1368. --- module/task/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/task/control.php b/module/task/control.php index 9ceb312589..6fec8e0d13 100644 --- a/module/task/control.php +++ b/module/task/control.php @@ -208,7 +208,7 @@ class task extends control if(dao::isError()) die(js::error(dao::getError())); /* Locate the browser. */ - if($iframe) die(js::reload('parent.parent')); + if(!empty($iframe)) die(js::reload('parent.parent')); die(js::locate($storyLink, 'parent')); } From 4e8b9f23d446441ce8e1d864c2a123f332a198bc Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Jan 2018 11:10:58 +0800 Subject: [PATCH 128/206] * change for misc changelog. --- module/misc/lang/zh-cn.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index f63f66e16f..04b9e12f11 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -74,6 +74,11 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = '最新版本'; $lang->misc->feature->detailed = '详情'; +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'实现集中的消息处理机制', 'desc' => '

              邮件,短信,webhook都放统一的消息发送

              移植然之里面的消息通知功能

              '); +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'实现周期性待办功能', 'desc' => ''); +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'增加指派给我的区块', 'desc' => ''); +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'项目可以选择多个测试单生成报告', 'desc' => ''); + $lang->misc->feature->all['9.7.stable'][] = array('title'=>'调整国际版,增加英文Demo数据。', 'desc' => ''); $lang->misc->feature->all['9.6.stable'][] = array('title'=>'新增了webhook功能', 'desc' => '实现与倍冾、钉钉的消息通知接口'); From a57e30ced710347ded01dcad37b6fba8f4086428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 17 Jan 2018 12:23:58 +0800 Subject: [PATCH 129/206] * Fix bug. --- module/testcase/lang/en.php | 5 +++-- module/testcase/lang/zh-cn.php | 5 +++-- module/testtask/control.php | 8 +++++--- module/testtask/js/cases.js | 13 ------------- module/testtask/model.php | 4 ---- module/testtask/view/caseheader.html.php | 1 - module/testtask/view/groupcase.html.php | 6 +++--- 7 files changed, 14 insertions(+), 28 deletions(-) diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index 6a7b773a0d..a9e5ee5fd6 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -164,8 +164,9 @@ $lang->testcase->reviewResultList[''] = ''; $lang->testcase->reviewResultList['pass'] = 'Pass'; $lang->testcase->reviewResultList['clarify'] = 'Clarify'; -$lang->testcase->groups[''] = 'Group '; -$lang->testcase->groups['story'] = 'Story Group'; +$lang->testcase->groups[''] = 'Group '; +$lang->testcase->groups['story'] = 'Story Group'; +$lang->testcase->groups['assignedTo'] = 'Assign Group'; $lang->testcase->statusList[''] = ''; $lang->testcase->statusList['wait'] = 'ToReview'; diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index 7faacd6e49..5973c6d1fe 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -164,8 +164,9 @@ $lang->testcase->reviewResultList[''] = ''; $lang->testcase->reviewResultList['pass'] = '确认通过'; $lang->testcase->reviewResultList['clarify'] = '继续完善'; -$lang->testcase->groups[''] = '分组查看'; -$lang->testcase->groups['story'] = '需求分组'; +$lang->testcase->groups[''] = '分组查看'; +$lang->testcase->groups['story'] = '需求分组'; +$lang->testcase->groups['assignedTo'] = '指派分组'; $lang->testcase->statusList[''] = ''; $lang->testcase->statusList['wait'] = '待评审'; diff --git a/module/testtask/control.php b/module/testtask/control.php index 03e2e57660..fb9b4167a8 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -251,11 +251,9 @@ class testtask extends control } if($browseType == 'bymodule') setcookie('taskCaseModule', (int)$param, $this->config->cookieLife, $this->config->webRoot); if($browseType != 'bymodule') $this->session->set('taskCaseBrowseType', $browseType); - if($browseType == 'account') $this->session->set('taskCaseAccount', $param); $moduleID = ($browseType == 'bymodule') ? (int)$param : ($browseType == 'bysearch' ? 0 : ($this->cookie->taskCaseModule ? $this->cookie->taskCaseModule : 0)); $queryID = ($browseType == 'bysearch') ? (int)$param : 0; - $account = ($browseType == 'account') ? $param : 'all'; /* Append id for secend sort. */ $sort = $this->loadModel('common')->appendOrder($orderBy, 't2.id'); @@ -302,7 +300,6 @@ class testtask extends control $this->view->moduleName = $moduleID ? $this->tree->getById($moduleID)->name : $this->lang->tree->all; $this->view->treeClass = $browseType == 'bymodule' ? '' : 'hidden'; $this->view->pager = $pager; - $this->view->account = $account; $this->view->branches = $this->loadModel('branch')->getPairs($productID); $this->view->setShowModule = false; @@ -390,6 +387,11 @@ class testtask extends control $groupCases[$run->story][] = $run; $groupByList[$run->story] = $run->storyTitle; } + elseif($groupBy == 'assignedTo') + { + if(empty($run->assignedTo)) continue; + $groupCases[$run->assignedTo][] = $run; + } } $this->view->title = $this->products[$productID] . $this->lang->colon . $this->lang->testtask->cases; diff --git a/module/testtask/js/cases.js b/module/testtask/js/cases.js index ef979ec08b..8f8a14db11 100644 --- a/module/testtask/js/cases.js +++ b/module/testtask/js/cases.js @@ -6,16 +6,3 @@ $(document).ready(function() setTimeout(function(){fixedTheadOfList('#caseList')}, 100); if($('#caseList thead th.w-title').width() < 150) $('#caseList thead th.w-title').width(150); }); - -function changeUser(account, taskID) -{ - if(account == '') - { - link = createLink('testtask', 'cases', 'taskID=' + taskID + '&browseType=all'); - } - else - { - link = createLink('testtask', 'cases', 'taskID=' + taskID + '&browseType=account¶m=' + account); - } - location.href = link; -} diff --git a/module/testtask/model.php b/module/testtask/model.php index a7b3e7d983..6a31949453 100644 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -758,10 +758,6 @@ class testtaskModel extends model { $runs = $this->getUserRuns($task->id, $this->session->user->account, $modules, $sort, $pager); } - elseif($browseType == 'account') - { - $runs = $this->getUserRuns($task->id, $this->session->taskCaseAccount, $modules, $sort, $pager); - } /* By search. */ elseif($browseType == 'bysearch') { diff --git a/module/testtask/view/caseheader.html.php b/module/testtask/view/caseheader.html.php index 972cbae239..b2c6c5a946 100644 --- a/module/testtask/view/caseheader.html.php +++ b/module/testtask/view/caseheader.html.php @@ -39,7 +39,6 @@ echo html::a($this->inlink('groupCase', "taskID=$taskID&groupBy=$key"), $value); } echo ''; - echo "
            • " . html::select('account', $users, $account, "onchange='changeUser(this.value, $taskID)' class='form-control chosen'") . '
            • '; } if($this->methodName == 'cases') echo "
            •  {$lang->testcase->bySearch}
            • "; diff --git a/module/testtask/view/groupcase.html.php b/module/testtask/view/groupcase.html.php index 3349b3ecd6..0672e1ae41 100644 --- a/module/testtask/view/groupcase.html.php +++ b/module/testtask/view/groupcase.html.php @@ -17,7 +17,7 @@
              account, "class='form-control chosen'")?>account, "class='form-control chosen'")?>
              task->estimate?> @@ -217,7 +217,7 @@
              task->estimate?> From 1a00522c1350114aad18ad904f7302ff3b58ea48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 10:39:59 +0800 Subject: [PATCH 104/206] * Fix Bug#1388. --- module/task/view/edit.html.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/module/task/view/edit.html.php b/module/task/view/edit.html.php index c85d672960..528f946e1d 100644 --- a/module/task/view/edit.html.php +++ b/module/task/view/edit.html.php @@ -72,12 +72,14 @@
              task->legendBasic;?> + parent)):?> + - + global->flow != 'onlyTask' and $project->type != 'ops'):?> From 80ed7e727fcc5642b44186bc9203333288f80c4d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 10:47:33 +0800 Subject: [PATCH 105/206] * fix bug. --- module/project/model.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 29bbb52f03..f106221fd5 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1449,10 +1449,13 @@ class projectModel extends model if(empty($products)) $products = $this->post->products; $this->loadModel('action'); - $versions = $this->loadModel('story')->getVersions($stories); - $lastOrder = (int)$this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->orderBy('order_desc')->limit(1)->fetch('order'); + $versions = $this->loadModel('story')->getVersions($stories); + $linkedStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->orderBy('order_desc')->fetchPairs('story', 'order'); + $lastOrder = reset($linkedStories); foreach($stories as $key => $storyID) { + if(isset($linkedStories[$storyID])) continue; + $productID = (int)$products[$storyID]; $data = new stdclass(); $data->project = $projectID; From 2d13064e7e9c9cc5f8c8d6ad3729414ac7b9ce22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 11:09:39 +0800 Subject: [PATCH 106/206] * Fix Bug#1388. --- module/project/model.php | 13 +++++++------ module/task/model.php | 6 ++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/module/project/model.php b/module/project/model.php index 29bbb52f03..f16a848974 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1219,6 +1219,7 @@ class projectModel extends model ->leftJoin(TABLE_USER)->alias('t3')->on('t1.assignedTo = t3.account') ->where('t1.status')->in('wait, doing, pause, cancel') ->andWhere('t1.deleted')->eq(0) + ->andWhere('t1.parent')->eq(0) ->andWhere('t1.project')->in(array_keys($projects)) ->andWhere("(t1.story = 0 OR (t2.branch in ('0','" . join("','", $branches) . "') and t2.product " . helper::dbIN(array_keys($branches)) . "))") ->fetchGroup('project', 'id'); @@ -1241,20 +1242,20 @@ class projectModel extends model foreach($tasks as $task) { /* Save the assignedToes and stories, should linked to project. */ - $assignedToes[$task->assignedTo] = $task->project; - $stories[$task->story] = $task->story; + $assignedToes[$task->assignedTo] = $task->project; + $stories[$task->story] = $task->story; $data = new stdclass(); $data->project = $projectID; if($task->status == 'cancel') { - $data->canceledBy = ''; - $data->canceledDate = NULL; + $data->canceledBy = ''; + $data->canceledDate = null; } - $data->status = $task->consumed > 0 ? 'doing' : 'wait'; - $this->dao->update(TABLE_TASK)->data($data)->where('id')->in($this->post->tasks)->exec(); + $data->status = $task->consumed > 0 ? 'doing' : 'wait'; + $this->dao->update(TABLE_TASK)->data($data)->where('id')->in($this->post->tasks)->orWhere('parent')->in($this->post->tasks)->exec(); $this->loadModel('action')->create('task', $task->id, 'moved', '', $task->project); } diff --git a/module/task/model.php b/module/task/model.php index e7db886ad2..278a6cfdcc 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -380,6 +380,12 @@ class taskModel extends model if($task->consumed < $oldTask->consumed) die(js::error($this->lang->task->error->consumedSmall)); + /* Fix bug#1388, Check children task projectID and moduleID. */ + if($task->project != $oldTask->project) + { + $this->dao->update(TABLE_TASK)->set('project')->eq($task->project)->set('module')->eq($task->module)->where('parent')->eq($taskID)->exec(); + } + $task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $this->post->uid); $this->dao->update(TABLE_TASK)->data($task) ->autoCheck() From 9fc6cd34579926295d9e4df70f577b8a34d0ff07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 11:22:45 +0800 Subject: [PATCH 107/206] * Fix bug#1371. --- module/file/control.php | 102 ++++++++++++++--------------- module/file/view/download.html.php | 4 +- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/module/file/control.php b/module/file/control.php index 6ba97d5fd7..3dbdaf656b 100644 --- a/module/file/control.php +++ b/module/file/control.php @@ -13,9 +13,9 @@ class file extends control { /** * Build the upload form. - * - * @param int $fileCount - * @param float $percent + * + * @param int $fileCount + * @param float $percent * @param string $filesName * @param string $labelsName * @access public @@ -23,7 +23,7 @@ class file extends control */ public function buildForm($fileCount = 1, $percent = 0.9, $filesName = 'files', $labelsName = 'labels') { - if(!file_exists($this->file->savePath)) + if(!file_exists($this->file->savePath)) { printf($this->lang->file->errorNotExists, $this->file->savePath); return false; @@ -43,7 +43,7 @@ class file extends control /** * AJAX: get upload request from the web editor. - * + * * @access public * @return void */ @@ -79,7 +79,7 @@ class file extends control /** * AJAX: get upload request from the web editor. - * + * * @access public * @return void */ @@ -120,9 +120,9 @@ class file extends control /** * Down a file. - * - * @param int $fileID - * @param string $mouse + * + * @param int $fileID + * @param string $mouse * @access public * @return void */ @@ -142,7 +142,7 @@ class file extends control /* Judge the mode, down or open. */ $mode = 'down'; $fileTypes = 'txt|jpg|jpeg|gif|png|bmp|xml|html'; - if(stripos($fileTypes, $file->extension) !== false and $mouse == 'left') $mode = 'open'; + if(stripos($fileTypes, $file->extension) !== false && $mouse == 'left') $mode = 'open'; if(file_exists($file->realPath)) { @@ -177,7 +177,7 @@ class file extends control /** * Export as csv format. - * + * * @access public * @return void */ @@ -193,28 +193,28 @@ class file extends control /** * export as xml format - * + * * @access public * @return void */ - public function export2XML() - { + public function export2XML() + { $this->view->fields = $this->post->fields; $this->view->rows = $this->post->rows; - + $output = $this->parse('file', 'export2XML'); $this->sendDownHeader($this->post->fileName, 'xml', $output); - } + } /** * export as html format - * + * * @access public * @return void */ - public function export2HTML() - { + public function export2HTML() + { $this->view->fields = $this->post->fields; $this->view->rows = $this->post->rows; $this->host = common::getSysURL(); @@ -224,25 +224,25 @@ class file extends control case 'task': foreach($this->view->rows as $row) { - $row->name = html::a($this->host . $this->createLink('task', 'view', "taskID=$row->id"), $row->name); + $row->name = html::a($this->host . $this->createLink('task', 'view', "taskID=$row->id"), $row->name); } break; case 'story': foreach($this->view->rows as $row) { - $row->title= html::a($this->host . $this->createLink('story', 'view', "storyID=$row->id"), $row->title); + $row->title= html::a($this->host . $this->createLink('story', 'view', "storyID=$row->id"), $row->title); } break; case 'bug': foreach($this->view->rows as $row) { - $row->title= html::a($this->host . $this->createLink('bug', 'view', "bugID=$row->id"), $row->title); + $row->title= html::a($this->host . $this->createLink('bug', 'view', "bugID=$row->id"), $row->title); } break; case 'testcase': foreach($this->view->rows as $row) { - $row->title= html::a($this->host . $this->createLink('testcase', 'view', "caseID=$row->id"), $row->title); + $row->title= html::a($this->host . $this->createLink('testcase', 'view', "caseID=$row->id"), $row->title); } break; } @@ -250,13 +250,13 @@ class file extends control $output = $this->parse('file', 'export2Html'); $this->sendDownHeader($this->post->fileName, 'html', $output); - } + } /** * Send the download header to the client. - * - * @param string $fileName - * @param string $extension + * + * @param string $fileName + * @param string $extension * @access public * @return void */ @@ -289,8 +289,8 @@ class file extends control /** * Delete a file. - * - * @param int $fileID + * + * @param int $fileID * @param string $confirm yes|no * @access public * @return void @@ -312,10 +312,10 @@ class file extends control } /** - * Print files. - * - * @param array $files - * @param string $fieldset + * Print files. + * + * @param array $files + * @param string $fieldset * @access public * @return void */ @@ -327,9 +327,9 @@ class file extends control } /** - * Edit file's name. - * - * @param int $fileID + * Edit file's name. + * + * @param int $fileID * @access public * @return void */ @@ -355,8 +355,8 @@ class file extends control } /** - * Paste image in kindeditor at firefox and chrome. - * + * Paste image in kindeditor at firefox and chrome. + * * @access public * @return void */ @@ -370,9 +370,9 @@ class file extends control /** * Upload Images. - * - * @param string $module - * @param string $params + * + * @param string $module + * @param string $params * @access public * @return void */ @@ -424,9 +424,9 @@ class file extends control /** * Build export tpl. - * - * @param string $module - * @param int $templateID + * + * @param string $module + * @param int $templateID * @access public * @return void */ @@ -444,8 +444,8 @@ class file extends control /** * Ajax save template. - * - * @param string $module + * + * @param string $module * @access public * @return void */ @@ -462,8 +462,8 @@ class file extends control /** * Ajax delete template. - * - * @param int $templateID + * + * @param int $templateID * @access public * @return void */ @@ -474,9 +474,9 @@ class file extends control } /** - * Read file. - * - * @param int $fileID + * Read file. + * + * @param int $fileID * @access public * @return void */ diff --git a/module/file/view/download.html.php b/module/file/view/download.html.php index 551102445e..6a7f742e8c 100644 --- a/module/file/view/download.html.php +++ b/module/file/view/download.html.php @@ -29,9 +29,9 @@ } else { - if(!extension_loaded('mbstring')) + if(extension_loaded('mbstring')) { - $encoding = mb_detect_encoding($fileContent, array('ASCII','UTF-8','GB2312','GBK','BIG5')); + $encoding = mb_detect_encoding($fileContent, array('ASCII', 'UTF-8', 'GB2312', 'GBK', 'BIG5')); if($encoding != 'UTF-8') $fileContent = helper::convertEncoding($fileContent, $encoding, $config->charset); } else From ecf24ad52ac26c607ff115a4b2fa1bad4e51c886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 11:39:03 +0800 Subject: [PATCH 108/206] * Fix bug#1378. --- module/user/model.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/module/user/model.php b/module/user/model.php index 7407be94cf..42335a2b0d 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -213,6 +213,7 @@ class userModel extends model ->setDefault('join', '0000-00-00') ->setIF($this->post->password1 != false, 'password', md5($this->post->password1)) ->setIF($this->post->password1 == false, 'password', '') + ->setIF($this->post->email != false, 'email', trim($this->post->email)) ->remove('group, password1, password2, verifyPassword') ->get(); @@ -233,7 +234,6 @@ class userModel extends model ->batchCheck($this->config->user->create->requiredFields, 'notempty') ->check('account', 'unique') ->check('account', 'account') - ->checkIF($this->post->email != false, 'email', 'email') ->exec(); if($this->post->group) { @@ -289,7 +289,7 @@ class userModel extends model $data[$i]->gender = $users->gender[$i]; $data[$i]->password = md5($users->password[$i]); $data[$i]->commiter = $users->commiter[$i]; - $data[$i]->join = empty($users->join[$i]) ? '0000-00-00' : ($user->join[$i]); + $data[$i]->join = empty($users->join[$i]) ? '0000-00-00' : ($users->join[$i]); $data[$i]->skype = $users->skype[$i]; $data[$i]->qq = $users->qq[$i]; $data[$i]->yahoo = $users->yahoo[$i]; @@ -362,6 +362,7 @@ class userModel extends model $user = fixer::input('post') ->setDefault('join', '0000-00-00') ->setIF($this->post->password1 != false, 'password', md5($this->post->password1)) + ->setIF($this->post->email != false, 'email', trim($this->post->email)) ->remove('password1, password2, groups,verifyPassword') ->get(); @@ -382,7 +383,6 @@ class userModel extends model ->batchCheck($this->config->user->edit->requiredFields, 'notempty') ->check('account', 'unique', "id != '$userID'") ->check('account', 'account') - ->checkIF($this->post->email != false, 'email', 'email') ->where('id')->eq((int)$userID) ->exec(); From 277dc2c2ec7bed922029c7f750ff19c0232b7fe7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 14:06:16 +0800 Subject: [PATCH 109/206] * change for upgrade. --- VERSION | 2 +- config/config.php | 2 +- db/zentao.sql | 19 +++- module/block/lang/en.php | 35 +++--- module/block/lang/zh-tw.php | 41 ++++--- module/bug/lang/en.php | 1 - module/common/lang/zh-tw.php | 163 ++++++++++++++-------------- module/dev/lang/zh-tw.php | 2 + module/group/lang/en.php | 1 + module/group/lang/resource.php | 137 +++++++++++++---------- module/group/lang/zh-cn.php | 1 + module/group/lang/zh-tw.php | 1 + module/install/lang/zh-tw.php | 1 + module/mail/lang/en.php | 4 +- module/mail/lang/zh-tw.php | 10 +- module/message/control.php | 11 +- module/message/lang/en.php | 1 + module/message/lang/zh-cn.php | 1 + module/message/lang/zh-tw.php | 8 ++ module/message/view/header.html.php | 2 +- module/misc/lang/zh-tw.php | 19 +++- module/productplan/lang/zh-tw.php | 22 ++-- module/project/lang/en.php | 81 +++++++------- module/project/lang/zh-cn.php | 81 +++++++------- module/project/lang/zh-tw.php | 100 +++++++++-------- module/project/view/story.html.php | 15 ++- module/report/lang/zh-tw.php | 8 ++ module/story/lang/zh-tw.php | 1 + module/testcase/lang/zh-tw.php | 34 +++--- module/testreport/lang/zh-tw.php | 1 + module/todo/lang/en.php | 1 + module/todo/lang/zh-cn.php | 1 + module/todo/lang/zh-tw.php | 36 +++++- module/upgrade/lang/en.php | 1 + module/upgrade/lang/zh-cn.php | 1 + module/upgrade/lang/zh-tw.php | 1 + module/upgrade/model.php | 63 ++++++++++- 37 files changed, 554 insertions(+), 355 deletions(-) create mode 100644 module/message/lang/zh-tw.php diff --git a/VERSION b/VERSION index c05b5267dc..31cd979036 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.7.stable +9.8.stable diff --git a/config/config.php b/config/config.php index 5cb5e74efa..60ff25b5be 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '9.7'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '9.8'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. $config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php. diff --git a/db/zentao.sql b/db/zentao.sql index f1f705b2a0..c3180eb72f 100644 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -545,7 +545,7 @@ CREATE TABLE IF NOT EXISTS `zt_story` ( `estimate` float unsigned NOT NULL, `status` enum('','changed','active','draft','closed') NOT NULL default '', `color` char(7) NOT NULL, - `stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released') NOT NULL DEFAULT 'wait', + `stage` enum('','wait','planned','projected','developing','developed','testing','tested','verified','released', 'closed') NOT NULL DEFAULT 'wait', `mailto` text, `openedBy` varchar(30) NOT NULL default '', `openedDate` datetime NOT NULL, @@ -1088,6 +1088,8 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (1, 'mail', 'reset'), (1, 'mail', 'save'), (1, 'mail', 'test'), +(1, 'message', 'index'), +(1, 'message', 'setting'), (1, 'misc', 'ping'), (1, 'my', 'bug'), (1, 'my', 'changePassword'), @@ -1155,6 +1157,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (1, 'project', 'index'), (1, 'project', 'all'), (1, 'project', 'linkStory'), +(1, 'project', 'importPlanStories'), (1, 'project', 'manageMembers'), (1, 'project', 'manageProducts'), (1, 'project', 'order'), @@ -1318,6 +1321,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (1, 'todo', 'batchEdit'), (1, 'todo', 'batchFinish'), (1, 'todo', 'create'), +(1, 'todo', 'createCycle'), (1, 'todo', 'delete'), (1, 'todo', 'edit'), (1, 'todo', 'export'), @@ -1512,6 +1516,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (2, 'todo', 'batchEdit'), (2, 'todo', 'batchFinish'), (2, 'todo', 'create'), +(2, 'todo', 'createCycle'), (2, 'todo', 'delete'), (2, 'todo', 'edit'), (2, 'todo', 'export'), @@ -1730,6 +1735,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (3, 'todo', 'batchEdit'), (3, 'todo', 'batchFinish'), (3, 'todo', 'create'), +(3, 'todo', 'createCycle'), (3, 'todo', 'delete'), (3, 'todo', 'edit'), (3, 'todo', 'export'), @@ -1867,6 +1873,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (4, 'project', 'index'), (4, 'project', 'all'), (4, 'project', 'linkStory'), +(4, 'project', 'importPlanStories'), (4, 'project', 'manageMembers'), (4, 'project', 'manageProducts'), (4, 'project', 'order'), @@ -1954,6 +1961,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (4, 'todo', 'batchEdit'), (4, 'todo', 'batchFinish'), (4, 'todo', 'create'), +(4, 'todo', 'createCycle'), (4, 'todo', 'delete'), (4, 'todo', 'edit'), (4, 'todo', 'export'), @@ -2110,6 +2118,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (5, 'project', 'index'), (5, 'project', 'all'), (5, 'project', 'linkStory'), +(5, 'project', 'importPlanStories'), (5, 'project', 'manageMembers'), (5, 'project', 'manageProducts'), (5, 'project', 'order'), @@ -2214,6 +2223,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (5, 'todo', 'batchEdit'), (5, 'todo', 'batchFinish'), (5, 'todo', 'create'), +(5, 'todo', 'createCycle'), (5, 'todo', 'delete'), (5, 'todo', 'edit'), (5, 'todo', 'export'), @@ -2361,6 +2371,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (6, 'project', 'index'), (6, 'project', 'all'), (6, 'project', 'linkStory'), +(6, 'project', 'importPlanStories'), (6, 'project', 'manageMembers'), (6, 'project', 'manageProducts'), (6, 'project', 'order'), @@ -2446,6 +2457,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (6, 'todo', 'batchEdit'), (6, 'todo', 'batchFinish'), (6, 'todo', 'create'), +(6, 'todo', 'createCycle'), (6, 'todo', 'delete'), (6, 'todo', 'edit'), (6, 'todo', 'export'), @@ -2592,6 +2604,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (7, 'project', 'index'), (7, 'project', 'all'), (7, 'project', 'linkStory'), +(7, 'project', 'importPlanStories'), (7, 'project', 'manageProducts'), (7, 'project', 'story'), (7, 'project', 'task'), @@ -2690,6 +2703,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (7, 'todo', 'batchEdit'), (7, 'todo', 'batchFinish'), (7, 'todo', 'create'), +(7, 'todo', 'createCycle'), (7, 'todo', 'delete'), (7, 'todo', 'edit'), (7, 'todo', 'export'), @@ -2946,6 +2960,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (8, 'todo', 'batchEdit'), (8, 'todo', 'batchFinish'), (8, 'todo', 'create'), +(8, 'todo', 'createCycle'), (8, 'todo', 'delete'), (8, 'todo', 'edit'), (8, 'todo', 'export'), @@ -3115,6 +3130,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (9, 'todo', 'batchEdit'), (9, 'todo', 'batchFinish'), (9, 'todo', 'create'), +(9, 'todo', 'createCycle'), (9, 'todo', 'delete'), (9, 'todo', 'edit'), (9, 'todo', 'export'), @@ -3232,6 +3248,7 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES (10, 'todo', 'batchEdit'), (10, 'todo', 'batchFinish'), (10, 'todo', 'create'), +(10, 'todo', 'createCycle'), (10, 'todo', 'delete'), (10, 'todo', 'edit'), (10, 'todo', 'export'), diff --git a/module/block/lang/en.php b/module/block/lang/en.php index a88800e0f7..95d9eef98a 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -29,6 +29,7 @@ $lang->block->lblBlock = 'Block'; $lang->block->lblNum = 'Number'; $lang->block->lblHtml = 'HTML'; $lang->block->dynamic = 'Dynamic'; +$lang->block->assignToMe = 'Assign To Me'; $lang->block->lblFlowchart = 'Workflow'; $lang->block->assignToMeList['todo'] = 'Todo'; @@ -117,21 +118,25 @@ $lang->block->default['full']['my']['2']['grid'] = 4; $lang->block->default['full']['my']['2']['source'] = ''; $lang->block->default['full']['my']['3'] = $lang->block->default['project']['1']; $lang->block->default['full']['my']['3']['source'] = 'project'; -$lang->block->default['full']['my']['4']['title'] = 'My Todo'; -$lang->block->default['full']['my']['4']['block'] = 'list'; -$lang->block->default['full']['my']['4']['grid'] = 4; -$lang->block->default['full']['my']['4']['source'] = 'todo'; -$lang->block->default['full']['my']['4']['params']['num'] = '20'; -$lang->block->default['full']['my']['5'] = $lang->block->default['product']['1']; -$lang->block->default['full']['my']['5']['source'] = 'product'; -$lang->block->default['full']['my']['6'] = $lang->block->default['project']['2']; -$lang->block->default['full']['my']['6']['source'] = 'project'; -$lang->block->default['full']['my']['7'] = $lang->block->default['qa']['1']; -$lang->block->default['full']['my']['7']['source'] = 'qa'; -$lang->block->default['full']['my']['8'] = $lang->block->default['product']['2']; -$lang->block->default['full']['my']['8']['source'] = 'product'; -$lang->block->default['full']['my']['9'] = $lang->block->default['qa']['2']; -$lang->block->default['full']['my']['9']['source'] = 'qa'; +$lang->block->default['full']['my']['4']['title'] = '指派给我'; +$lang->block->default['full']['my']['4']['block'] = 'assigntome'; +$lang->block->default['full']['my']['4']['grid'] = 8; +$lang->block->default['full']['my']['4']['source'] = ''; +$lang->block->default['full']['my']['5']['title'] = 'My Todo'; +$lang->block->default['full']['my']['5']['block'] = 'list'; +$lang->block->default['full']['my']['5']['grid'] = 4; +$lang->block->default['full']['my']['5']['source'] = 'todo'; +$lang->block->default['full']['my']['5']['params']['num'] = '20'; +$lang->block->default['full']['my']['6'] = $lang->block->default['product']['1']; +$lang->block->default['full']['my']['6']['source'] = 'product'; +$lang->block->default['full']['my']['7'] = $lang->block->default['project']['2']; +$lang->block->default['full']['my']['7']['source'] = 'project'; +$lang->block->default['full']['my']['8'] = $lang->block->default['qa']['1']; +$lang->block->default['full']['my']['8']['source'] = 'qa'; +$lang->block->default['full']['my']['9'] = $lang->block->default['product']['2']; +$lang->block->default['full']['my']['9']['source'] = 'product'; +$lang->block->default['full']['my']['10'] = $lang->block->default['qa']['2']; +$lang->block->default['full']['my']['10']['source'] = 'qa'; $lang->block->default['onlyTest']['my']['1'] = $lang->block->default['qa']['1']; $lang->block->default['onlyTest']['my']['1']['source'] = 'qa'; diff --git a/module/block/lang/zh-tw.php b/module/block/lang/zh-tw.php index c0a91c9444..aa8de6c400 100644 --- a/module/block/lang/zh-tw.php +++ b/module/block/lang/zh-tw.php @@ -29,8 +29,15 @@ $lang->block->lblBlock = '區塊'; $lang->block->lblNum = '條數'; $lang->block->lblHtml = 'HTML內容'; $lang->block->dynamic = '最新動態'; +$lang->block->assignToMe = '指派給我'; $lang->block->lblFlowchart = '流程圖'; +$lang->block->assignToMeList['todo'] = '待辦'; +$lang->block->assignToMeList['story'] = '需求'; +$lang->block->assignToMeList['task'] = '任務'; +$lang->block->assignToMeList['bug'] = 'Bug'; +$lang->block->assignToMeList['case'] = '用例'; + $lang->block->params = new stdclass(); $lang->block->params->name = '參數名稱'; $lang->block->params->value = '參數值'; @@ -111,21 +118,25 @@ $lang->block->default['full']['my']['2']['grid'] = 4; $lang->block->default['full']['my']['2']['source'] = ''; $lang->block->default['full']['my']['3'] = $lang->block->default['project']['1']; $lang->block->default['full']['my']['3']['source'] = 'project'; -$lang->block->default['full']['my']['4']['title'] = '我的待辦'; -$lang->block->default['full']['my']['4']['block'] = 'list'; -$lang->block->default['full']['my']['4']['grid'] = 4; -$lang->block->default['full']['my']['4']['source'] = 'todo'; -$lang->block->default['full']['my']['4']['params']['num'] = '20'; -$lang->block->default['full']['my']['5'] = $lang->block->default['product']['1']; -$lang->block->default['full']['my']['5']['source'] = 'product'; -$lang->block->default['full']['my']['6'] = $lang->block->default['project']['2']; -$lang->block->default['full']['my']['6']['source'] = 'project'; -$lang->block->default['full']['my']['7'] = $lang->block->default['qa']['1']; -$lang->block->default['full']['my']['7']['source'] = 'qa'; -$lang->block->default['full']['my']['8'] = $lang->block->default['product']['2']; -$lang->block->default['full']['my']['8']['source'] = 'product'; -$lang->block->default['full']['my']['9'] = $lang->block->default['qa']['2']; -$lang->block->default['full']['my']['9']['source'] = 'qa'; +$lang->block->default['full']['my']['4']['title'] = '指派給我'; +$lang->block->default['full']['my']['4']['block'] = 'assigntome'; +$lang->block->default['full']['my']['4']['grid'] = 8; +$lang->block->default['full']['my']['4']['source'] = ''; +$lang->block->default['full']['my']['5']['title'] = '我的待辦'; +$lang->block->default['full']['my']['5']['block'] = 'list'; +$lang->block->default['full']['my']['5']['grid'] = 4; +$lang->block->default['full']['my']['5']['source'] = 'todo'; +$lang->block->default['full']['my']['5']['params']['num'] = '20'; +$lang->block->default['full']['my']['6'] = $lang->block->default['product']['1']; +$lang->block->default['full']['my']['6']['source'] = 'product'; +$lang->block->default['full']['my']['7'] = $lang->block->default['project']['2']; +$lang->block->default['full']['my']['7']['source'] = 'project'; +$lang->block->default['full']['my']['8'] = $lang->block->default['qa']['1']; +$lang->block->default['full']['my']['8']['source'] = 'qa'; +$lang->block->default['full']['my']['9'] = $lang->block->default['product']['2']; +$lang->block->default['full']['my']['9']['source'] = 'product'; +$lang->block->default['full']['my']['10'] = $lang->block->default['qa']['2']; +$lang->block->default['full']['my']['10']['source'] = 'qa'; $lang->block->default['onlyTest']['my']['1'] = $lang->block->default['qa']['1']; $lang->block->default['onlyTest']['my']['1']['source'] = 'qa'; diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index f45a513a51..badf5a348d 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -107,7 +107,6 @@ $lang->bug->openedByMe = 'Created By Me'; $lang->bug->resolvedByMe = 'Resolved By Me'; $lang->bug->closedByMe = 'Closed By Me'; $lang->bug->assignToNull = 'Unassigned'; -$lang->bug->unConfirmed = 'Unconfirmed'; $lang->bug->unResolved = 'Unresolved'; $lang->bug->toClosed = 'WaitForClose'; $lang->bug->unclosed = 'Active'; diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php index 3c1df43da5..84cdcf7ab9 100644 --- a/module/common/lang/zh-tw.php +++ b/module/common/lang/zh-tw.php @@ -86,9 +86,9 @@ $lang->loading = '稍候...'; $lang->notFound = '抱歉,您訪問的對象並不存在!'; $lang->showAll = '[[全部顯示]]'; -$lang->future = '未來'; -$lang->year = '年'; -$lang->workingHour = '工時'; +$lang->future = '未來'; +$lang->year = '年'; +$lang->workingHour = '工時'; $lang->idAB = 'ID'; $lang->priAB = 'P'; @@ -102,14 +102,14 @@ $lang->common->common = '公有模組'; /* 主導航菜單。*/ $lang->menu = new stdclass(); -$lang->menu->my = ' 我的地盤|my|index'; -$lang->menu->product = $lang->productCommon . '|product|index'; -$lang->menu->project = $lang->projectCommon . '|project|index'; -$lang->menu->qa = '測試|qa|index'; -$lang->menu->doc = '文檔|doc|index'; -$lang->menu->report = '統計|report|index'; -$lang->menu->company = '組織|company|index'; -$lang->menu->admin = '後台|admin|index'; +$lang->menu->my = ' 我的地盤|my|index'; +$lang->menu->product = $lang->productCommon . '|product|index'; +$lang->menu->project = $lang->projectCommon . '|project|index'; +$lang->menu->qa = '測試|qa|index'; +$lang->menu->doc = '文檔|doc|index'; +$lang->menu->report = '統計|report|index'; +$lang->menu->company = '組織|company|index'; +$lang->menu->admin = '後台|admin|index'; /* 查詢條中可以選擇的對象列表。*/ $lang->searchObjects['bug'] = 'Bug'; @@ -145,12 +145,12 @@ $lang->exportTypeList['selected'] = '選中記錄'; $lang->lang = 'Language'; /* 風格列表。*/ -$lang->theme = '主題'; -$lang->themes['default'] = '預設'; -$lang->themes['green'] = '綠色'; -$lang->themes['red'] = '紅色'; -$lang->themes['lightblue'] = '亮藍'; -$lang->themes['blackberry'] = '黑莓'; +$lang->theme = '主題'; +$lang->themes['default'] = '預設'; +$lang->themes['green'] = '綠色'; +$lang->themes['red'] = '紅色'; +$lang->themes['lightblue'] = '亮藍'; +$lang->themes['blackberry'] = '黑莓'; /* 首頁菜單設置。*/ $lang->index = new stdclass(); @@ -187,20 +187,20 @@ $lang->score->menu = $lang->my->menu; $lang->product = new stdclass(); $lang->product->menu = new stdclass(); -$lang->product->menu->list = array('link' => '%s', 'fixed' => true); -$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); -$lang->product->menu->dynamic = '動態|product|dynamic|productID=%s'; -$lang->product->menu->plan = array('link' => '計劃|productplan|browse|productID=%s', 'subModule' => 'productplan'); -$lang->product->menu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release'); -$lang->product->menu->roadmap = '路線圖|product|roadmap|productID=%s'; -$lang->product->menu->doc = array('link' => '文檔|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); -$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; -$lang->product->menu->module = '模組|tree|browse|productID=%s&view=story'; -$lang->product->menu->view = array('link' => '概況|product|view|productID=%s', 'alias' => 'edit'); -$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; -$lang->product->menu->create = array('link' => " 添加{$lang->productCommon}|product|create", 'float' => 'right'); -$lang->product->menu->all = array('link' => " 所有{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); -$lang->product->menu->index = array('link' => "{$lang->productCommon}主頁|product|index|locate=no", 'float' => 'right'); +$lang->product->menu->list = array('link' => '%s', 'fixed' => true); +$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story'); +$lang->product->menu->dynamic = '動態|product|dynamic|productID=%s'; +$lang->product->menu->plan = array('link' => '計劃|productplan|browse|productID=%s', 'subModule' => 'productplan'); +$lang->product->menu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release'); +$lang->product->menu->roadmap = '路線圖|product|roadmap|productID=%s'; +$lang->product->menu->doc = array('link' => '文檔|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc'); +$lang->product->menu->branch = '@branch@|branch|manage|productID=%s'; +$lang->product->menu->module = '模組|tree|browse|productID=%s&view=story'; +$lang->product->menu->view = array('link' => '概況|product|view|productID=%s', 'alias' => 'edit'); +$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s"; +$lang->product->menu->create = array('link' => " 添加{$lang->productCommon}|product|create", 'float' => 'right'); +$lang->product->menu->all = array('link' => " 所有{$lang->productCommon}|product|all|productID=%s", 'float' => 'right'); +$lang->product->menu->index = array('link' => "{$lang->productCommon}主頁|product|index|locate=no", 'float' => 'right'); $lang->story = new stdclass(); $lang->productplan = new stdclass(); @@ -216,20 +216,20 @@ $lang->release->menu = $lang->product->menu; $lang->project = new stdclass(); $lang->project->menu = new stdclass(); -$lang->project->menu->list = array('link' => '%s', 'fixed' => true); -$lang->project->menu->task = array('link' => '任務|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); -$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); -$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; -$lang->project->menu->dynamic = '動態|project|dynamic|projectID=%s'; -$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build'); -$lang->project->menu->testtask = array('link' => '測試單|project|testtask|projectID=%s'); -$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers'); -$lang->project->menu->doc = array('link' => '文檔|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); -$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; -$lang->project->menu->view = array('link' => '概況|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); -$lang->project->menu->create = array('link' => " 添加{$lang->projectCommon}|project|create", 'float' => 'right'); -$lang->project->menu->all = array('link' => " 所有{$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); -$lang->project->menu->index = array('link' => "{$lang->projectCommon}主頁|project|index|locate=no", 'float' => 'right'); +$lang->project->menu->list = array('link' => '%s', 'fixed' => true); +$lang->project->menu->task = array('link' => '任務|project|task|projectID=%s', 'subModule' => 'task,tree', 'alias' => 'grouptask,importtask,burn,importbug,kanban,printkanban,tree'); +$lang->project->menu->story = array('link' => '需求|project|story|projectID=%s', 'subModule' => 'story', 'alias' => 'linkstory,storykanban'); +$lang->project->menu->bug = 'Bug|project|bug|projectID=%s'; +$lang->project->menu->dynamic = '動態|project|dynamic|projectID=%s'; +$lang->project->menu->build = array('link' => '版本|project|build|projectID=%s', 'subModule' => 'build'); +$lang->project->menu->testtask = array('link' => '測試單|project|testtask|projectID=%s'); +$lang->project->menu->team = array('link' => '團隊|project|team|projectID=%s', 'alias' => 'managemembers'); +$lang->project->menu->doc = array('link' => '文檔|doc|objectLibs|type=project&objectID=%s&from=project', 'subModule' => 'doc'); +$lang->project->menu->product = $lang->productCommon . '|project|manageproducts|projectID=%s'; +$lang->project->menu->view = array('link' => '概況|project|view|projectID=%s', 'alias' => 'edit,start,suspend,putoff,close'); +$lang->project->menu->create = array('link' => " 添加{$lang->projectCommon}|project|create", 'float' => 'right'); +$lang->project->menu->all = array('link' => " 所有{$lang->projectCommon}|project|all|status=undone&projectID=%s", 'float' => 'right'); +$lang->project->menu->index = array('link' => "{$lang->projectCommon}主頁|project|index|locate=no", 'float' => 'right'); $lang->task = new stdclass(); $lang->build = new stdclass(); @@ -296,9 +296,9 @@ $lang->caselib->menu->index = array('link' => "測 $lang->doc = new stdclass(); $lang->doc->menu = new stdclass(); -$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); -$lang->doc->menu->create = array('link' => ' 添加文檔庫|doc|createLib', 'float' => 'right'); +$lang->doc->menu->list = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->crumb = array('link' => '%s', 'fixed' => true); +$lang->doc->menu->create = array('link' => ' 添加文檔庫|doc|createLib', 'float' => 'right'); /* 統計視圖菜單設置。*/ $lang->report = new stdclass(); @@ -339,13 +339,12 @@ $lang->admin->menu = new stdclass(); $lang->admin->menu->index = array('link' => '首頁|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); $lang->admin->menu->extension = array('link' => '插件|extension|browse', 'subModule' => 'extension'); $lang->admin->menu->custom = array('link' => '自定義|custom|set', 'subModule' => 'custom'); -$lang->admin->menu->mail = array('link' => '發信|mail|index', 'subModule' => 'mail'); +$lang->admin->menu->message = array('link' => '消息|message|index', 'subModule' => 'message,mail,webhook'); $lang->admin->menu->backup = array('link' => '備份|backup|index', 'subModule' => 'backup'); $lang->admin->menu->safe = array('link' => '安全|admin|safe', 'alias' => 'checkweak'); $lang->admin->menu->cron = array('link' => '計劃任務|cron|index', 'subModule' => 'cron'); $lang->admin->menu->trashes = array('link' => '資源回收筒|action|trash', 'subModule' => 'action'); $lang->admin->menu->dev = array('link' => '二次開發|dev|api', 'alias' => 'db', 'subModule' => 'dev,editor'); -$lang->admin->menu->api = array('link' => '介面|webhook|browse', 'alias' => 'create,edit', 'subModule' => 'entry,webhook'); $lang->admin->menu->sso = '然之整合|admin|sso'; $lang->convert = new stdclass(); @@ -360,6 +359,7 @@ $lang->cron = new stdclass(); $lang->dev = new stdclass(); $lang->entry = new stdclass(); $lang->webhook = new stdclass(); +$lang->message = new stdclass(); $lang->search = new stdclass(); $lang->convert->menu = $lang->admin->menu; @@ -374,6 +374,7 @@ $lang->mail->menu = $lang->admin->menu; $lang->dev->menu = $lang->admin->menu; $lang->entry->menu = $lang->admin->menu; $lang->webhook->menu = $lang->admin->menu; +$lang->message->menu = $lang->admin->menu; /* 菜單分組。*/ $lang->menugroup = new stdclass(); @@ -407,6 +408,7 @@ $lang->menugroup->mail = 'admin'; $lang->menugroup->dev = 'admin'; $lang->menugroup->entry = 'admin'; $lang->menugroup->webhook = 'admin'; +$lang->menugroup->message = 'admin'; /* 錯誤提示信息。*/ $lang->error = new stdclass(); @@ -466,31 +468,32 @@ $lang->pager->previousPage = "上一頁"; $lang->pager->nextPage = "下一頁"; $lang->pager->summery = "第 %s-%s 項,共 %s 項"; -$lang->proVersion = "專業版   "; -$lang->downNotify = "下載桌面提醒"; +$lang->proVersion = "專業版   "; +$lang->downNotify = "下載桌面提醒"; +$lang->website = "http://www.zentao.net"; $lang->suhosinInfo = "警告:數據太多,請在php.ini中修改sohusin.post.max_vars和sohusin.request.max_vars(大於%s的數)。 保存並重新啟動apache或php-fpm,否則會造成部分數據無法保存。"; $lang->maxVarsInfo = "警告:數據太多,請在php.ini中修改max_input_vars(大於%s的數)。 保存並重新啟動apache或php-fpm,否則會造成部分數據無法保存。"; $lang->pasteTextInfo = "粘貼文本到文本域中,每行文字作為一條數據的標題。"; $lang->noticeImport = "

              導入數據中,含有已經存在系統的數據,請確認這些數據要覆蓋或者全新插入

              覆蓋 全新插入

              "; -$lang->noResultsMatch = "沒有匹配結果"; -$lang->searchMore = "搜索此關鍵字的更多結果:"; -$lang->chooseUsersToMail = "選擇要發信通知的用戶..."; -$lang->browserNotice = '你目前使用的瀏覽器可能無法得到最佳瀏覽效果,建議使用Chrome、火狐、IE9+、Opera、Safari瀏覽器。'; -$lang->noticePasteImg = "可以在編輯器直接貼圖。"; +$lang->noResultsMatch = "沒有匹配結果"; +$lang->searchMore = "搜索此關鍵字的更多結果:"; +$lang->chooseUsersToMail = "選擇要發信通知的用戶..."; +$lang->browserNotice = '你目前使用的瀏覽器可能無法得到最佳瀏覽效果,建議使用Chrome、火狐、IE9+、Opera、Safari瀏覽器。'; +$lang->noticePasteImg = "可以在編輯器直接貼圖。"; /* 時間格式設置。*/ -if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); -if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); -if(!defined('DT_MONTHTIME1'))define('DT_MONTHTIME1', 'n/d H:i'); -if(!defined('DT_MONTHTIME2'))define('DT_MONTHTIME2', 'n月d日 H:i'); -if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); -if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); -if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日'); -if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日'); -if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); -if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); +if(!defined('DT_DATETIME1')) define('DT_DATETIME1', 'Y-m-d H:i:s'); +if(!defined('DT_DATETIME2')) define('DT_DATETIME2', 'y-m-d H:i'); +if(!defined('DT_MONTHTIME1')) define('DT_MONTHTIME1', 'n/d H:i'); +if(!defined('DT_MONTHTIME2')) define('DT_MONTHTIME2', 'n月d日 H:i'); +if(!defined('DT_DATE1')) define('DT_DATE1', 'Y-m-d'); +if(!defined('DT_DATE2')) define('DT_DATE2', 'Ymd'); +if(!defined('DT_DATE3')) define('DT_DATE3', 'Y年m月d日'); +if(!defined('DT_DATE4')) define('DT_DATE4', 'n月j日'); +if(!defined('DT_TIME1')) define('DT_TIME1', 'H:i:s'); +if(!defined('DT_TIME2')) define('DT_TIME2', 'H:i'); /* datepicker 時間*/ $lang->datepicker = new stdclass(); @@ -608,7 +611,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyStory') /* Adjust sub menu of product module. */ unset($lang->product->menu->project); unset($lang->product->menu->doc); - + /* Rename product module. */ $lang->menu->product = "{$lang->productCommon}|product|index"; @@ -761,15 +764,15 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->testtask->menu->report = array('link' => '報告|testreport|browse', 'alias' => 'view,create,edit'); $lang->testtask->menu->create = array('link' => " 提交測試|testtask|create|productID=%s", 'float' => 'right'); - $lang->testtask->menuOrder[5] = 'product'; - $lang->testtask->menuOrder[10] = 'scope'; - $lang->testtask->menuOrder[15] = 'wait'; - $lang->testtask->menuOrder[20] = 'doing'; - $lang->testtask->menuOrder[25] = 'blocked'; - $lang->testtask->menuOrder[30] = 'done'; - $lang->testtask->menuOrder[35] = 'totalStatus'; - $lang->testtask->menuOrder[40] = 'report'; - $lang->testtask->menuOrder[45] = 'create'; + $lang->testtask->menuOrder[5] = 'product'; + $lang->testtask->menuOrder[10] = 'scope'; + $lang->testtask->menuOrder[15] = 'wait'; + $lang->testtask->menuOrder[20] = 'doing'; + $lang->testtask->menuOrder[25] = 'blocked'; + $lang->testtask->menuOrder[30] = 'done'; + $lang->testtask->menuOrder[35] = 'totalStatus'; + $lang->testtask->menuOrder[40] = 'report'; + $lang->testtask->menuOrder[45] = 'create'; $lang->testreport->menu = $lang->testtask->menu; $lang->testreport->menuOrder = $lang->testtask->menuOrder; @@ -806,7 +809,7 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->build->menu = $lang->product->menu; $lang->build->menuOrder = $lang->product->menuOrder; - + /* Adjust menu group. */ $lang->menugroup->bug = 'bug'; $lang->menugroup->testcase = 'testcase'; @@ -814,8 +817,8 @@ if(isset($config->global->flow) and $config->global->flow == 'onlyTest') $lang->menugroup->testsuite = 'testsuite'; $lang->menugroup->testreport = 'testtask'; $lang->menugroup->build = 'product'; - - /* Adjust search objects. */ + + /* Adjust search objects. */ unset($lang->searchObjects['story']); unset($lang->searchObjects['task']); unset($lang->searchObjects['release']); diff --git a/module/dev/lang/zh-tw.php b/module/dev/lang/zh-tw.php index 03d134b0c4..a0d2f6394c 100644 --- a/module/dev/lang/zh-tw.php +++ b/module/dev/lang/zh-tw.php @@ -93,6 +93,8 @@ $lang->dev->tableList['suitecase'] = '套件用例'; $lang->dev->tableList['score'] = '積分'; $lang->dev->tableList['entry'] = '應用'; $lang->dev->tableList['webhook'] = 'WebHook'; +$lang->dev->tableList['webhookdatas'] = 'WebHook數據'; +$lang->dev->tableList['log'] = '介面日誌'; $lang->dev->groupList['my'] = '我的地盤'; $lang->dev->groupList['product'] = $lang->productCommon; diff --git a/module/group/lang/en.php b/module/group/lang/en.php index fb81a6a1b5..4fd8a8744b 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -48,6 +48,7 @@ $lang->group->copyOptions['copyPriv'] = 'Copy Privilege'; $lang->group->copyOptions['copyUser'] = 'Copy User'; $lang->group->versions[''] = 'History'; +$lang->group->versions['9_8'] = 'ZenTao9.8'; $lang->group->versions['9_6'] = 'ZenTao9.6'; $lang->group->versions['9_5'] = 'ZenTao9.5'; $lang->group->versions['9_2'] = 'ZenTao9.2'; diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index 7a6cd501ee..3fe33652bb 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -58,6 +58,7 @@ $lang->moduleOrder[180] = 'misc'; $lang->moduleOrder[185] = 'backup'; $lang->moduleOrder[190] = 'cron'; $lang->moduleOrder[195] = 'dev'; +$lang->moduleOrder[200] = 'message'; $lang->resource = new stdclass(); @@ -106,6 +107,7 @@ $lang->my->methodOrder[80] = 'score'; /* Todo. */ $lang->resource->todo = new stdclass(); $lang->resource->todo->create = 'create'; +$lang->resource->todo->createcycle = 'createCycle'; $lang->resource->todo->batchCreate = 'batchCreate'; $lang->resource->todo->edit = 'edit'; $lang->resource->todo->batchEdit = 'batchEdit'; @@ -120,13 +122,14 @@ $lang->resource->todo->activate = 'activate'; $lang->resource->todo->close = 'close'; $lang->todo->methodOrder[5] = 'create'; -$lang->todo->methodOrder[10] = 'batchCreate'; -$lang->todo->methodOrder[15] = 'edit'; -$lang->todo->methodOrder[20] = 'view'; -$lang->todo->methodOrder[25] = 'delete'; -$lang->todo->methodOrder[30] = 'export'; -$lang->todo->methodOrder[35] = 'finish'; -$lang->todo->methodOrder[40] = 'import2Today'; +$lang->todo->methodOrder[10] = 'createCycle'; +$lang->todo->methodOrder[15] = 'batchCreate'; +$lang->todo->methodOrder[20] = 'edit'; +$lang->todo->methodOrder[25] = 'view'; +$lang->todo->methodOrder[30] = 'delete'; +$lang->todo->methodOrder[35] = 'export'; +$lang->todo->methodOrder[40] = 'finish'; +$lang->todo->methodOrder[45] = 'import2Today'; /* Product. */ $lang->resource->product = new stdclass(); @@ -287,50 +290,51 @@ $lang->release->methodOrder[70] = 'changeStatus'; /* Project. */ $lang->resource->project = new stdclass(); -$lang->resource->project->index = 'index'; -$lang->resource->project->view = 'view'; -$lang->resource->project->browse = 'browse'; -$lang->resource->project->create = 'create'; -$lang->resource->project->edit = 'edit'; -$lang->resource->project->batchedit = 'batchEdit'; -$lang->resource->project->start = 'start'; -$lang->resource->project->activate = 'activate'; -$lang->resource->project->putoff = 'putoff'; -$lang->resource->project->suspend = 'suspend'; -$lang->resource->project->close = 'close'; -$lang->resource->project->delete = 'delete'; -$lang->resource->project->task = 'task'; -$lang->resource->project->grouptask = 'groupTask'; -$lang->resource->project->importtask = 'importTask'; -$lang->resource->project->importBug = 'importBug'; -$lang->resource->project->story = 'story'; -$lang->resource->project->build = 'build'; -$lang->resource->project->testtask = 'testtask'; -$lang->resource->project->bug = 'bug'; -$lang->resource->project->burn = 'burn'; -$lang->resource->project->computeBurn = 'computeBurn'; -$lang->resource->project->fixFirst = 'fixFirst'; -$lang->resource->project->burnData = 'burnData'; -$lang->resource->project->team = 'team'; -$lang->resource->project->doc = 'doc'; -$lang->resource->project->dynamic = 'dynamic'; -$lang->resource->project->manageProducts = 'manageProducts'; +$lang->resource->project->index = 'index'; +$lang->resource->project->view = 'view'; +$lang->resource->project->browse = 'browse'; +$lang->resource->project->create = 'create'; +$lang->resource->project->edit = 'edit'; +$lang->resource->project->batchedit = 'batchEdit'; +$lang->resource->project->start = 'start'; +$lang->resource->project->activate = 'activate'; +$lang->resource->project->putoff = 'putoff'; +$lang->resource->project->suspend = 'suspend'; +$lang->resource->project->close = 'close'; +$lang->resource->project->delete = 'delete'; +$lang->resource->project->task = 'task'; +$lang->resource->project->grouptask = 'groupTask'; +$lang->resource->project->importtask = 'importTask'; +$lang->resource->project->importplanstories = 'importPlanStories'; +$lang->resource->project->importBug = 'importBug'; +$lang->resource->project->story = 'story'; +$lang->resource->project->build = 'build'; +$lang->resource->project->testtask = 'testtask'; +$lang->resource->project->bug = 'bug'; +$lang->resource->project->burn = 'burn'; +$lang->resource->project->computeBurn = 'computeBurn'; +$lang->resource->project->fixFirst = 'fixFirst'; +$lang->resource->project->burnData = 'burnData'; +$lang->resource->project->team = 'team'; +$lang->resource->project->doc = 'doc'; +$lang->resource->project->dynamic = 'dynamic'; +$lang->resource->project->manageProducts = 'manageProducts'; //$lang->resource->project->manageChilds = 'manageChilds'; -$lang->resource->project->manageMembers = 'manageMembers'; -$lang->resource->project->unlinkMember = 'unlinkMember'; -$lang->resource->project->linkStory = 'linkStory'; -$lang->resource->project->unlinkStory = 'unlinkStory'; -$lang->resource->project->batchUnlinkStory = 'batchUnlinkStory'; -$lang->resource->project->updateOrder = 'updateOrder'; -$lang->resource->project->kanban = 'kanban'; -$lang->resource->project->printKanban = 'printKanban'; -$lang->resource->project->tree = 'tree'; -$lang->resource->project->all = 'all'; -$lang->resource->project->kanbanHideCols = 'kanbanHideCols'; -$lang->resource->project->kanbanColsColor = 'kanbanColsColor'; -$lang->resource->project->export = 'export'; -$lang->resource->project->storyKanban = 'storyKanban'; -$lang->resource->project->storySort = 'storySort'; +$lang->resource->project->manageMembers = 'manageMembers'; +$lang->resource->project->unlinkMember = 'unlinkMember'; +$lang->resource->project->linkStory = 'linkStory'; +$lang->resource->project->unlinkStory = 'unlinkStory'; +$lang->resource->project->batchUnlinkStory = 'batchUnlinkStory'; +$lang->resource->project->updateOrder = 'updateOrder'; +$lang->resource->project->kanban = 'kanban'; +$lang->resource->project->printKanban = 'printKanban'; +$lang->resource->project->tree = 'tree'; +$lang->resource->project->all = 'all'; +$lang->resource->project->kanbanHideCols = 'kanbanHideCols'; +$lang->resource->project->kanbanColsColor = 'kanbanColsColor'; +$lang->resource->project->export = 'export'; +$lang->resource->project->storyKanban = 'storyKanban'; +$lang->resource->project->storySort = 'storySort'; $lang->project->methodOrder[0] = 'index'; $lang->project->methodOrder[5] = 'view'; @@ -347,16 +351,17 @@ $lang->project->methodOrder[60] = 'delete'; $lang->project->methodOrder[65] = 'task'; $lang->project->methodOrder[70] = 'grouptask'; $lang->project->methodOrder[75] = 'importtask'; -$lang->project->methodOrder[80] = 'importBug'; -$lang->project->methodOrder[85] = 'story'; -$lang->project->methodOrder[90] = 'build'; -$lang->project->methodOrder[95] = 'testtask'; -$lang->project->methodOrder[100] = 'bug'; -$lang->project->methodOrder[105] = 'burn'; -$lang->project->methodOrder[110] = 'computeBurn'; -$lang->project->methodOrder[115] = 'fixFirst'; -$lang->project->methodOrder[120] = 'burnData'; -$lang->project->methodOrder[125] = 'team'; +$lang->project->methodOrder[80] = 'importplanstories'; +$lang->project->methodOrder[85] = 'importBug'; +$lang->project->methodOrder[90] = 'story'; +$lang->project->methodOrder[95] = 'build'; +$lang->project->methodOrder[100] = 'testtask'; +$lang->project->methodOrder[105] = 'bug'; +$lang->project->methodOrder[110] = 'burn'; +$lang->project->methodOrder[115] = 'computeBurn'; +$lang->project->methodOrder[120] = 'fixFirst'; +$lang->project->methodOrder[125] = 'burnData'; +$lang->project->methodOrder[130] = 'team'; //$lang->project->methodOrder[130] = 'doc'; $lang->project->methodOrder[135] = 'dynamic'; $lang->project->methodOrder[140] = 'manageProducts'; @@ -1007,6 +1012,13 @@ $lang->resource->misc->ping = 'ping'; $lang->misc->methodOrder[5] = 'ping'; +$lang->resource->message = new stdclass(); +$lang->resource->message->index = 'index'; +$lang->resource->message->setting = 'setting'; + +$lang->message->methodOrder[5] = 'index'; +$lang->message->methodOrder[10] = 'setting'; + $lang->resource->action = new stdclass(); $lang->resource->action->trash = 'trash'; $lang->resource->action->undelete = 'undelete'; @@ -1363,6 +1375,11 @@ $lang->changelog['9.6'][] = 'project-export'; $lang->changelog['9.6'][] = 'project-storyKanban'; $lang->changelog['9.6'][] = 'project-storySort'; +$lang->changelog['9.8'][] = 'message-index'; +$lang->changelog['9.8'][] = 'message-setting'; +$lang->changelog['9.8'][] = 'todo-createCycle'; +$lang->changelog['9.8'][] = 'project-importPlanStories'; + global $config; if($config->global->flow != 'full') { diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index b1c41032b6..4def5cd7af 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -48,6 +48,7 @@ $lang->group->copyOptions['copyPriv'] = '复制权限'; $lang->group->copyOptions['copyUser'] = '复制用户'; $lang->group->versions[''] = '修改历史'; +$lang->group->versions['9_8'] = '禅道9.8'; $lang->group->versions['9_6'] = '禅道9.6'; $lang->group->versions['9_5'] = '禅道9.5'; $lang->group->versions['9_2'] = '禅道9.2'; diff --git a/module/group/lang/zh-tw.php b/module/group/lang/zh-tw.php index aa2950d899..ee60c28529 100644 --- a/module/group/lang/zh-tw.php +++ b/module/group/lang/zh-tw.php @@ -48,6 +48,7 @@ $lang->group->copyOptions['copyPriv'] = '複製權限'; $lang->group->copyOptions['copyUser'] = '複製用戶'; $lang->group->versions[''] = '修改歷史'; +$lang->group->versions['9_8'] = '禪道9.8'; $lang->group->versions['9_6'] = '禪道9.6'; $lang->group->versions['9_5'] = '禪道9.5'; $lang->group->versions['9_2'] = '禪道9.2'; diff --git a/module/install/lang/zh-tw.php b/module/install/lang/zh-tw.php index 48d8205a9e..1e6c5ac64a 100644 --- a/module/install/lang/zh-tw.php +++ b/module/install/lang/zh-tw.php @@ -158,6 +158,7 @@ $lang->install->cronList['moduleName=backup&methodName=backup'] = '備份 $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = '非同步發信'; $lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = '非同步發送Webhook'; $lang->install->cronList['moduleName=admin&methodName=deleteLog'] = '刪除過期日誌'; +$lang->install->cronList['moduleName=todo&methodName=createCycle'] = '生成周期性待辦'; $lang->install->success = "安裝成功"; $lang->install->login = '登錄禪道管理系統'; diff --git a/module/mail/lang/en.php b/module/mail/lang/en.php index 5124c8cc5b..1995ef3aec 100755 --- a/module/mail/lang/en.php +++ b/module/mail/lang/en.php @@ -46,8 +46,8 @@ $lang->mail->remove = 'Remove'; $lang->mail->toList = 'Addressee'; $lang->mail->ccList = 'Copy to'; $lang->mail->subject = 'Subject'; -$lang->mail->addedBy = 'Sender'; -$lang->mail->addedDate = 'Added Date'; +$lang->mail->createdBy = 'Sender'; +$lang->mail->createdDate = 'Added Date'; $lang->mail->sendTime = 'Send Date'; $lang->mail->status = 'Status'; $lang->mail->failReason = 'Fail Reason'; diff --git a/module/mail/lang/zh-tw.php b/module/mail/lang/zh-tw.php index 5ff7ebbc9d..1c50f650b4 100644 --- a/module/mail/lang/zh-tw.php +++ b/module/mail/lang/zh-tw.php @@ -4,7 +4,7 @@ $lang->mail->index = '首頁'; $lang->mail->detect = '檢測'; $lang->mail->edit = '編輯配置'; $lang->mail->save = '保存'; -$lang->mail->saveSuccess = '成功保存'; +$lang->mail->saveSuccess = '保存成功'; $lang->mail->test = '測試發信'; $lang->mail->reset = '重置'; $lang->mail->resend = '重發'; @@ -46,14 +46,14 @@ $lang->mail->remove = '移除'; $lang->mail->toList = '收信人'; $lang->mail->ccList = '抄送給'; $lang->mail->subject = '主題'; -$lang->mail->addedBy = '發送者'; -$lang->mail->addedDate = '創建時間'; +$lang->mail->createdBy = '發送者'; +$lang->mail->createdDate = '創建時間'; $lang->mail->sendTime = '發送時間'; $lang->mail->status = '狀態'; $lang->mail->failReason = '失敗原因'; -$lang->mail->statusList['send'] = '成功'; -$lang->mail->statusList['fail'] = '失敗'; +$lang->mail->statusList['sended'] = '成功'; +$lang->mail->statusList['fail'] = '失敗'; $lang->mail->turnonList[1] = '打開'; $lang->mail->turnonList[0] = '關閉'; diff --git a/module/message/control.php b/module/message/control.php index 24c65b6e94..9207c37021 100644 --- a/module/message/control.php +++ b/module/message/control.php @@ -19,7 +19,16 @@ class message extends control */ public function index() { - $this->locate($this->createLink('mail', 'index')); + foreach($this->lang->message->typeList as $type => $typeName) + { + if(isset($config->message->typeLink[$type])) + { + list($moduleName, $methodName) = explode('|', $this->config->message->typeLink[$type]); + $this->locate($this->createLink($moduleName, $methodName)); + } + } + + $this->locate($this->createLink('message', 'setting')); } /** diff --git a/module/message/lang/en.php b/module/message/lang/en.php index 824ab306a5..a0f0595391 100644 --- a/module/message/lang/en.php +++ b/module/message/lang/en.php @@ -1,5 +1,6 @@ message->common = 'Message'; +$lang->message->index = 'Index'; $lang->message->setting = 'Setting'; $lang->message->typeList['mail'] = 'Mail'; diff --git a/module/message/lang/zh-cn.php b/module/message/lang/zh-cn.php index bfce451eb9..4fd3124468 100644 --- a/module/message/lang/zh-cn.php +++ b/module/message/lang/zh-cn.php @@ -1,5 +1,6 @@ message->common = '消息'; +$lang->message->index = '首页'; $lang->message->setting = '设置'; $lang->message->typeList['mail'] = '邮件'; diff --git a/module/message/lang/zh-tw.php b/module/message/lang/zh-tw.php new file mode 100644 index 0000000000..0ebe5179a9 --- /dev/null +++ b/module/message/lang/zh-tw.php @@ -0,0 +1,8 @@ +message->common = '消息'; +$lang->message->index = '首頁'; +$lang->message->setting = '設置'; + +$lang->message->typeList['mail'] = '郵件'; +$lang->message->typeList['message'] = '消息'; +$lang->message->typeList['webhook'] = 'Webhook'; diff --git a/module/message/view/header.html.php b/module/message/view/header.html.php index 5d0ff360d2..12a92c046c 100644 --- a/module/message/view/header.html.php +++ b/module/message/view/header.html.php @@ -7,6 +7,6 @@
            • createLink($moduleName, $methodName), $typeName)?>
            • -
            • createLink('message', 'setting'), $lang->message->setting)?>
            • +
            • createLink('message', 'setting'), $lang->message->setting)?>
            • diff --git a/module/misc/lang/zh-tw.php b/module/misc/lang/zh-tw.php index f90bd986ec..33ef2cda44 100644 --- a/module/misc/lang/zh-tw.php +++ b/module/misc/lang/zh-tw.php @@ -12,6 +12,7 @@ $lang->misc = new stdclass(); $lang->misc->common = '雜項'; $lang->misc->ping = '防超時'; +$lang->misc->api = 'http://api.zentao.net'; $lang->misc->zentao = new stdclass(); $lang->misc->zentao->version = '版本%s'; @@ -52,7 +53,7 @@ $lang->misc->zentao->service['servicemore']= '更多服務...'; $lang->misc->mobile = "手機訪問"; $lang->misc->noGDLib = "請用手機瀏覽器訪問:%s"; -$lang->misc->copyright = "© 2009 - 2016 青島易軟天創網絡科技有限公司 電話:4006-8899-23 Email:co@zentao.net QQ:1492153927"; +$lang->misc->copyright = "© 2009 - 2018 青島易軟天創網絡科技有限公司 電話:4006-8899-23 Email:co@zentao.net QQ:1492153927"; $lang->misc->checkTable = "檢查修復數據表"; $lang->misc->needRepair = "修復表"; $lang->misc->repairTable = "資料庫表可能因為斷電原因損壞,需要檢查修復!!"; @@ -67,12 +68,26 @@ $lang->misc->noticeRepair = "
              普通用戶請聯繫管理員進行修復
              1. 檔案內容為空。
              2. 如果之前檔案存在,刪除之後重新創建。
              3. -
              "; + "; $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = '最新版本'; $lang->misc->feature->detailed = '詳情'; +$lang->misc->feature->all['9.7.stable'][] = array('title'=>'調整國際版,增加英文Demo數據。', 'desc' => ''); + +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'新增了webhook功能', 'desc' => '實現與倍冾、釘釘的消息通知介面'); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'新增禪道操作獲取積分的功能', 'desc' => ''); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'項目任務新增了多人任務和子任務功能', 'desc' => ''); +$lang->misc->feature->all['9.6.stable'][] = array('title'=>'產品視圖新增了產品綫功能', 'desc' => ''); + +$lang->misc->feature->all['9.5.1'][] = array('title'=>'新增受限操作', 'desc' => ''); + +$lang->misc->feature->all['9.3.beta'][] = array('title'=>'升級框架,增強程序安全', 'desc' => ''); + +$lang->misc->feature->all['9.1.stable'][] = array('title'=>'完善測試視圖', 'desc' => '

              增加測試套件、公共測試庫和測試總結功能

              '); +$lang->misc->feature->all['9.1.stable'][] = array('title'=>'支持測試步驟分組', 'desc' => ''); + $lang->misc->feature->all['9.0.beta'][] = array('title'=>'增加禪道雲發信功能', 'desc' => '

              禪道雲發信是禪道聯合SendCloud推出的一項免費發信服務,只有用戶綁定禪道,並通過驗證即可使用。

              '); $lang->misc->feature->all['9.0.beta'][] = array('title'=>'優化富文本編輯器和markdown編輯器', 'desc' => ''); diff --git a/module/productplan/lang/zh-tw.php b/module/productplan/lang/zh-tw.php index 4d1edc9b12..71511ea2d0 100644 --- a/module/productplan/lang/zh-tw.php +++ b/module/productplan/lang/zh-tw.php @@ -17,7 +17,7 @@ $lang->productplan->edit = "編輯計劃"; $lang->productplan->delete = "刪除計劃"; $lang->productplan->view = "計劃詳情"; $lang->productplan->bugSummary = "本頁共 %s 個Bug"; -$lang->productplan->info = '信息'; +$lang->productplan->info = '信息'; $lang->productplan->batchEdit = '批量編輯'; $lang->productplan->batchUnlink = "批量移除"; @@ -46,14 +46,20 @@ $lang->productplan->desc = '描述'; $lang->productplan->begin = '開始日期'; $lang->productplan->end = '結束日期'; $lang->productplan->last = '上次計劃'; +$lang->productplan->future = '待定'; +$lang->productplan->stories = '需求數'; +$lang->productplan->bugs = 'Bug數'; +$lang->productplan->hour = '工時'; +$lang->productplan->project = $lang->projectCommon; -$lang->productplan->endList[7] = '一星期'; -$lang->productplan->endList[14] = '兩星期'; -$lang->productplan->endList[31] = '一個月'; -$lang->productplan->endList[62] = '兩個月'; -$lang->productplan->endList[93] = '三個月'; -$lang->productplan->endList[186] = '半年'; -$lang->productplan->endList[365] = '一年'; +$lang->productplan->endList[7] = '一星期'; +$lang->productplan->endList[14] = '兩星期'; +$lang->productplan->endList[31] = '一個月'; +$lang->productplan->endList[62] = '兩個月'; +$lang->productplan->endList[93] = '三個月'; +$lang->productplan->endList[186] = '半年'; +$lang->productplan->endList[365] = '一年'; +$lang->productplan->endList[9999] = '待定'; $lang->productplan->errorNoTitle = 'ID %s 標題不能為空'; $lang->productplan->errorNoBegin = 'ID %s 開始時間不能為空'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 4abd754a74..7d732b3095 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -100,46 +100,47 @@ $lang->project->aclList['private'] = 'Private (Only team members can access.)'; $lang->project->aclList['custom'] = 'Whitelist (Team members and the whitelist members can access.)'; /* 方法列表。*/ -$lang->project->index = "Home"; -$lang->project->task = 'Tasks'; -$lang->project->groupTask = 'View by Group'; -$lang->project->story = 'Stories'; -$lang->project->bug = 'Bugs'; -$lang->project->dynamic = 'Dynamic'; -$lang->project->build = 'Builds'; -$lang->project->testtask = 'Test Tasks'; -$lang->project->burn = 'Burndown'; -$lang->project->baseline = 'Base Line'; -$lang->project->computeBurn = 'Update'; -$lang->project->burnData = 'Burndown Data'; -$lang->project->fixFirst = 'Edit 1st Day Man-hour'; -$lang->project->team = 'Team Member'; -$lang->project->doc = 'Doc'; -$lang->project->manageProducts = 'Link ' . $lang->productCommon; -$lang->project->linkStory = 'Linked Story'; -$lang->project->linkPlan = 'Linked Plan'; -$lang->project->linkStoryByPlan = 'Linked Story From Plan'; -$lang->project->unlinkStoryTasks = 'Unlinked'; -$lang->project->linkedProducts = 'Linked Products'; -$lang->project->unlinkedProducts = 'Unlinked Products'; -$lang->project->view = "Overview"; -$lang->project->create = "Create Project"; -$lang->project->copy = "Copy {$lang->projectCommon}"; -$lang->project->delete = "Delete"; -$lang->project->browse = "Browse"; -$lang->project->edit = "Edit"; -$lang->project->batchEdit = "Batch Edit"; -$lang->project->manageMembers = 'Manange Team'; -$lang->project->unlinkMember = 'Unlink Member'; -$lang->project->unlinkStory = 'Unlink Story'; -$lang->project->batchUnlinkStory = 'Batch Unlink Story'; -$lang->project->importTask = 'Import Task'; -$lang->project->importBug = 'Import Bug'; -$lang->project->updateOrder = 'Order'; -$lang->project->tree = 'Tree'; -$lang->project->storyKanban = 'Story Kanban'; -$lang->project->storySort = 'Sort Story'; -$lang->project->importPlanStory = 'Import the stories with the plan?'; +$lang->project->index = "Home"; +$lang->project->task = 'Tasks'; +$lang->project->groupTask = 'View by Group'; +$lang->project->story = 'Stories'; +$lang->project->bug = 'Bugs'; +$lang->project->dynamic = 'Dynamic'; +$lang->project->build = 'Builds'; +$lang->project->testtask = 'Test Tasks'; +$lang->project->burn = 'Burndown'; +$lang->project->baseline = 'Base Line'; +$lang->project->computeBurn = 'Update'; +$lang->project->burnData = 'Burndown Data'; +$lang->project->fixFirst = 'Edit 1st Day Man-hour'; +$lang->project->team = 'Team Member'; +$lang->project->doc = 'Doc'; +$lang->project->manageProducts = 'Link ' . $lang->productCommon; +$lang->project->linkStory = 'Linked Story'; +$lang->project->linkStoryByPlan = 'Linked Story From Plan'; +$lang->project->linkPlan = 'Linked Plan'; +$lang->project->unlinkStoryTasks = 'Unlinked'; +$lang->project->linkedProducts = 'Linked Products'; +$lang->project->unlinkedProducts = 'Unlinked Products'; +$lang->project->view = "Overview"; +$lang->project->create = "Create Project"; +$lang->project->copy = "Copy {$lang->projectCommon}"; +$lang->project->delete = "Delete"; +$lang->project->browse = "Browse"; +$lang->project->edit = "Edit"; +$lang->project->batchEdit = "Batch Edit"; +$lang->project->manageMembers = 'Manange Team'; +$lang->project->unlinkMember = 'Unlink Member'; +$lang->project->unlinkStory = 'Unlink Story'; +$lang->project->batchUnlinkStory = 'Batch Unlink Story'; +$lang->project->importTask = 'Import Task'; +$lang->project->importPlanStories = 'Link Story By Plan'; +$lang->project->importBug = 'Import Bug'; +$lang->project->updateOrder = 'Order'; +$lang->project->tree = 'Tree'; +$lang->project->storyKanban = 'Story Kanban'; +$lang->project->storySort = 'Sort Story'; +$lang->project->importPlanStory = 'Import the stories with the plan?'; /* 分组浏览。*/ $lang->project->allTasks = 'All'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index fd5fb6cc5f..10ba99e938 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -100,46 +100,47 @@ $lang->project->aclList['private'] = "私有{$lang->projectCommon}(只有{$lang- $lang->project->aclList['custom'] = "自定义白名单(团队成员和白名单的成员可以访问)"; /* 方法列表。*/ -$lang->project->index = "{$lang->projectCommon}首页"; -$lang->project->task = '任务列表'; -$lang->project->groupTask = '分组浏览任务'; -$lang->project->story = '需求列表'; -$lang->project->bug = 'Bug列表'; -$lang->project->dynamic = '动态'; -$lang->project->build = '版本列表'; -$lang->project->testtask = '测试任务'; -$lang->project->burn = '燃尽图'; -$lang->project->baseline = '基准线'; -$lang->project->computeBurn = '更新'; -$lang->project->burnData = '燃尽图数据'; -$lang->project->fixFirst = '修改首天工时'; -$lang->project->team = '团队成员'; -$lang->project->doc = '文档列表'; -$lang->project->manageProducts = '关联' . $lang->productCommon; -$lang->project->linkStory = '关联需求'; -$lang->project->linkStoryByPlan = '按照计划关联'; -$lang->project->linkPlan = '关联计划'; -$lang->project->unlinkStoryTasks = '未关联需求任务'; -$lang->project->linkedProducts = '已关联'; -$lang->project->unlinkedProducts = '未关联'; -$lang->project->view = "{$lang->projectCommon}概况"; -$lang->project->create = "添加{$lang->projectCommon}"; -$lang->project->copy = "复制{$lang->projectCommon}"; -$lang->project->delete = "删除{$lang->projectCommon}"; -$lang->project->browse = "浏览{$lang->projectCommon}"; -$lang->project->edit = "编辑{$lang->projectCommon}"; -$lang->project->batchEdit = "批量编辑"; -$lang->project->manageMembers = '团队管理'; -$lang->project->unlinkMember = '移除成员'; -$lang->project->unlinkStory = '移除需求'; -$lang->project->batchUnlinkStory = '批量移除需求'; -$lang->project->importTask = '转入任务'; -$lang->project->importBug = '导入Bug'; -$lang->project->updateOrder = '排序'; -$lang->project->tree = '树状图'; -$lang->project->storyKanban = '需求看板'; -$lang->project->storySort = '需求排序'; -$lang->project->importPlanStory = '是否导入计划关联的相关需求?'; +$lang->project->index = "{$lang->projectCommon}首页"; +$lang->project->task = '任务列表'; +$lang->project->groupTask = '分组浏览任务'; +$lang->project->story = '需求列表'; +$lang->project->bug = 'Bug列表'; +$lang->project->dynamic = '动态'; +$lang->project->build = '版本列表'; +$lang->project->testtask = '测试任务'; +$lang->project->burn = '燃尽图'; +$lang->project->baseline = '基准线'; +$lang->project->computeBurn = '更新'; +$lang->project->burnData = '燃尽图数据'; +$lang->project->fixFirst = '修改首天工时'; +$lang->project->team = '团队成员'; +$lang->project->doc = '文档列表'; +$lang->project->manageProducts = '关联' . $lang->productCommon; +$lang->project->linkStory = '关联需求'; +$lang->project->linkStoryByPlan = '按照计划关联'; +$lang->project->linkPlan = '关联计划'; +$lang->project->unlinkStoryTasks = '未关联需求任务'; +$lang->project->linkedProducts = '已关联'; +$lang->project->unlinkedProducts = '未关联'; +$lang->project->view = "{$lang->projectCommon}概况"; +$lang->project->create = "添加{$lang->projectCommon}"; +$lang->project->copy = "复制{$lang->projectCommon}"; +$lang->project->delete = "删除{$lang->projectCommon}"; +$lang->project->browse = "浏览{$lang->projectCommon}"; +$lang->project->edit = "编辑{$lang->projectCommon}"; +$lang->project->batchEdit = "批量编辑"; +$lang->project->manageMembers = '团队管理'; +$lang->project->unlinkMember = '移除成员'; +$lang->project->unlinkStory = '移除需求'; +$lang->project->batchUnlinkStory = '批量移除需求'; +$lang->project->importTask = '转入任务'; +$lang->project->importPlanStories = '按计划关联需求'; +$lang->project->importBug = '导入Bug'; +$lang->project->updateOrder = '排序'; +$lang->project->tree = '树状图'; +$lang->project->storyKanban = '需求看板'; +$lang->project->storySort = '需求排序'; +$lang->project->importPlanStory = '是否导入计划关联的相关需求?'; /* 分组浏览。*/ $lang->project->allTasks = '所有'; diff --git a/module/project/lang/zh-tw.php b/module/project/lang/zh-tw.php index 22d5f90aa0..aff825b31c 100644 --- a/module/project/lang/zh-tw.php +++ b/module/project/lang/zh-tw.php @@ -66,13 +66,13 @@ $lang->project->typeList['sprint'] = "短期$lang->projectCommon"; $lang->project->typeList['waterfall'] = "長期$lang->projectCommon"; $lang->project->typeList['ops'] = "運維$lang->projectCommon"; -$lang->project->endList[7] = '一星期'; -$lang->project->endList[14] = '兩星期'; -$lang->project->endList[31] = '一個月'; -$lang->project->endList[62] = '兩個月'; -$lang->project->endList[93] = '三個月'; -$lang->project->endList[186] = '半年'; -$lang->project->endList[365] = '一年'; +$lang->project->endList[7] = '一星期'; +$lang->project->endList[14] = '兩星期'; +$lang->project->endList[31] = '一個月'; +$lang->project->endList[62] = '兩個月'; +$lang->project->endList[93] = '三個月'; +$lang->project->endList[186] = '半年'; +$lang->project->endList[365] = '一年'; $lang->team = new stdclass(); $lang->team->account = '用戶'; @@ -100,43 +100,47 @@ $lang->project->aclList['private'] = "私有{$lang->projectCommon}(只有{$lang- $lang->project->aclList['custom'] = "自定義白名單(團隊成員和白名單的成員可以訪問)"; /* 方法列表。*/ -$lang->project->index = "{$lang->projectCommon}首頁"; -$lang->project->task = '任務列表'; -$lang->project->groupTask = '分組瀏覽任務'; -$lang->project->story = '需求列表'; -$lang->project->bug = 'Bug列表'; -$lang->project->dynamic = '動態'; -$lang->project->build = '版本列表'; -$lang->project->testtask = '測試任務'; -$lang->project->burn = '燃盡圖'; -$lang->project->baseline = '基準綫'; -$lang->project->computeBurn = '更新'; -$lang->project->burnData = '燃盡圖數據'; -$lang->project->fixFirst = '修改首天工時'; -$lang->project->team = '團隊成員'; -$lang->project->doc = '文檔列表'; -$lang->project->manageProducts = '關聯' . $lang->productCommon; -$lang->project->linkStory = '關聯需求'; -$lang->project->unlinkStoryTasks = '未關聯需求任務'; -$lang->project->linkedProducts = '已關聯'; -$lang->project->unlinkedProducts = '未關聯'; -$lang->project->view = "{$lang->projectCommon}概況"; -$lang->project->create = "添加{$lang->projectCommon}"; -$lang->project->copy = "複製{$lang->projectCommon}"; -$lang->project->delete = "刪除{$lang->projectCommon}"; -$lang->project->browse = "瀏覽{$lang->projectCommon}"; -$lang->project->edit = "編輯{$lang->projectCommon}"; -$lang->project->batchEdit = "批量編輯"; -$lang->project->manageMembers = '團隊管理'; -$lang->project->unlinkMember = '移除成員'; -$lang->project->unlinkStory = '移除需求'; -$lang->project->batchUnlinkStory = '批量移除需求'; -$lang->project->importTask = '轉入任務'; -$lang->project->importBug = '導入Bug'; -$lang->project->updateOrder = '排序'; -$lang->project->tree = '樹狀圖'; -$lang->project->storyKanban = '需求看板'; -$lang->project->storySort = '需求排序'; +$lang->project->index = "{$lang->projectCommon}首頁"; +$lang->project->task = '任務列表'; +$lang->project->groupTask = '分組瀏覽任務'; +$lang->project->story = '需求列表'; +$lang->project->bug = 'Bug列表'; +$lang->project->dynamic = '動態'; +$lang->project->build = '版本列表'; +$lang->project->testtask = '測試任務'; +$lang->project->burn = '燃盡圖'; +$lang->project->baseline = '基準綫'; +$lang->project->computeBurn = '更新'; +$lang->project->burnData = '燃盡圖數據'; +$lang->project->fixFirst = '修改首天工時'; +$lang->project->team = '團隊成員'; +$lang->project->doc = '文檔列表'; +$lang->project->manageProducts = '關聯' . $lang->productCommon; +$lang->project->linkStory = '關聯需求'; +$lang->project->linkStoryByPlan = '按照計劃關聯'; +$lang->project->linkPlan = '關聯計劃'; +$lang->project->unlinkStoryTasks = '未關聯需求任務'; +$lang->project->linkedProducts = '已關聯'; +$lang->project->unlinkedProducts = '未關聯'; +$lang->project->view = "{$lang->projectCommon}概況"; +$lang->project->create = "添加{$lang->projectCommon}"; +$lang->project->copy = "複製{$lang->projectCommon}"; +$lang->project->delete = "刪除{$lang->projectCommon}"; +$lang->project->browse = "瀏覽{$lang->projectCommon}"; +$lang->project->edit = "編輯{$lang->projectCommon}"; +$lang->project->batchEdit = "批量編輯"; +$lang->project->manageMembers = '團隊管理'; +$lang->project->unlinkMember = '移除成員'; +$lang->project->unlinkStory = '移除需求'; +$lang->project->batchUnlinkStory = '批量移除需求'; +$lang->project->importTask = '轉入任務'; +$lang->project->importPlanStories = '按計劃關聯需求'; +$lang->project->importBug = '導入Bug'; +$lang->project->updateOrder = '排序'; +$lang->project->tree = '樹狀圖'; +$lang->project->storyKanban = '需求看板'; +$lang->project->storySort = '需求排序'; +$lang->project->importPlanStory = '是否導入計劃關聯的相關需求?'; /* 分組瀏覽。*/ $lang->project->allTasks = '所有'; @@ -283,10 +287,10 @@ $lang->project->featureBar['task']['needconfirm'] = '需求變動'; $lang->project->featureBar['task']['status'] = $lang->project->statusSelects['']; $lang->project->treeLevel = array(); -$lang->project->treeLevel['root'] = '全部摺疊'; -$lang->project->treeLevel['story'] = '顯示需求'; -$lang->project->treeLevel['task'] = '顯示任務'; -$lang->project->treeLevel['all'] = '全部展開'; +$lang->project->treeLevel['root'] = '全部摺疊'; +$lang->project->treeLevel['story'] = '顯示需求'; +$lang->project->treeLevel['task'] = '顯示任務'; +$lang->project->treeLevel['all'] = '全部展開'; global $config; if($config->global->flow == 'onlyTask') diff --git a/module/project/view/story.html.php b/module/project/view/story.html.php index 87e47d2962..7b775d56c6 100644 --- a/module/project/view/story.html.php +++ b/module/project/view/story.html.php @@ -54,12 +54,15 @@ { echo "
              "; common::printIcon('project', 'linkStory', "project=$project->id", '', 'button', 'link', '', 'link-story-btn'); - echo "'; - echo "'; + if(common::hasPriv('project', 'importPlanStories')) + { + echo "'; + echo "'; + } echo '
              '; } ?> diff --git a/module/report/lang/zh-tw.php b/module/report/lang/zh-tw.php index 051651dfd8..fa45a85bed 100644 --- a/module/report/lang/zh-tw.php +++ b/module/report/lang/zh-tw.php @@ -31,6 +31,9 @@ $lang->report->colors[] = '008ED6'; $lang->report->colors[] = '9D080D'; $lang->report->colors[] = 'A186BE'; +$lang->report->isAssign[0] = '未指派'; +$lang->report->isAssign[1] = '已指派'; + $lang->report->singleColor[] = 'F6BD0F'; $lang->report->projectDeviation = $lang->projectCommon . '偏差報表'; @@ -72,6 +75,11 @@ $lang->report->unplanned = '未計劃'; $lang->report->workday = '每天工時'; $lang->report->diffDays = '工作日天數'; +$lang->report->typeList[''] = '預設'; +$lang->report->typeList['pie'] = '餅圖'; +$lang->report->typeList['bar'] = '柱狀圖'; +$lang->report->typeList['line'] = '折線圖'; + $lang->report->conditions = '篩選條件:'; $lang->report->closedProduct = '關閉' . $lang->productCommon; $lang->report->overduePlan = '過期計劃'; diff --git a/module/story/lang/zh-tw.php b/module/story/lang/zh-tw.php index a9a957de78..f42730ab48 100644 --- a/module/story/lang/zh-tw.php +++ b/module/story/lang/zh-tw.php @@ -114,6 +114,7 @@ $lang->story->stageList['testing'] = '測試中'; $lang->story->stageList['tested'] = '測試完畢'; $lang->story->stageList['verified'] = '已驗收'; $lang->story->stageList['released'] = '已發佈'; +$lang->story->stageList['closed'] = '已關閉'; $lang->story->reasonList[''] = ''; $lang->story->reasonList['done'] = '已完成'; diff --git a/module/testcase/lang/zh-tw.php b/module/testcase/lang/zh-tw.php index 229b8828a1..21fc21325f 100644 --- a/module/testcase/lang/zh-tw.php +++ b/module/testcase/lang/zh-tw.php @@ -36,8 +36,8 @@ $lang->testcase->stage = '適用階段'; $lang->testcase->reviewedBy = '由誰評審'; $lang->testcase->reviewedDate = '評審時間'; $lang->testcase->reviewResult = '評審結果'; -$lang->testcase->reviewedByAB = '評審者'; -$lang->testcase->reviewedDateAB = '時間'; +$lang->testcase->reviewedByAB = '評審人'; +$lang->testcase->reviewedDateAB = '日期'; $lang->testcase->reviewResultAB = '結果'; $lang->testcase->forceNotReview = '不需要評審'; $lang->testcase->lastEditedByAB = '修改者'; @@ -111,23 +111,23 @@ $lang->testcase->deleteStep = '刪除'; $lang->testcase->insertBefore = '之前添加'; $lang->testcase->insertAfter = '之後添加'; -$lang->testcase->assignToMe = '給我的用例'; -$lang->testcase->openedByMe = '我建的用例'; -$lang->testcase->allCases = '所有'; -$lang->testcase->needConfirm = '需求變動'; -$lang->testcase->bySearch = '搜索'; +$lang->testcase->assignToMe = '給我的用例'; +$lang->testcase->openedByMe = '我建的用例'; +$lang->testcase->allCases = '所有'; +$lang->testcase->needConfirm = '需求變動'; +$lang->testcase->bySearch = '搜索'; -$lang->testcase->lblStory = '相關需求'; -$lang->testcase->lblLastEdited = '最後編輯'; -$lang->testcase->lblTypeValue = '類型可選值列表'; -$lang->testcase->lblStageValue = '階段可選值列表'; -$lang->testcase->lblStatusValue = '狀態可選值列表'; +$lang->testcase->lblStory = '相關需求'; +$lang->testcase->lblLastEdited = '最後編輯'; +$lang->testcase->lblTypeValue = '類型可選值列表'; +$lang->testcase->lblStageValue = '階段可選值列表'; +$lang->testcase->lblStatusValue = '狀態可選值列表'; -$lang->testcase->legendBasicInfo = '基本信息'; -$lang->testcase->legendAttatch = '附件'; -$lang->testcase->legendLinkBugs = '相關Bug'; -$lang->testcase->legendOpenAndEdit = '創建編輯'; -$lang->testcase->legendComment = '備註'; +$lang->testcase->legendBasicInfo = '基本信息'; +$lang->testcase->legendAttatch = '附件'; +$lang->testcase->legendLinkBugs = '相關Bug'; +$lang->testcase->legendOpenAndEdit = '創建編輯'; +$lang->testcase->legendComment = '備註'; $lang->testcase->confirmDelete = '您確認要刪除該測試用例嗎?'; $lang->testcase->confirmBatchDelete = '您確認要批量刪除這些測試用例嗎?'; diff --git a/module/testreport/lang/zh-tw.php b/module/testreport/lang/zh-tw.php index c37410ff14..87c54d9493 100644 --- a/module/testreport/lang/zh-tw.php +++ b/module/testreport/lang/zh-tw.php @@ -64,6 +64,7 @@ $lang->testreport->foundBugTip = "影響版本在測試輪次內,並且創 $lang->testreport->legacyBugTip = "Bug狀態是激活,或Bug的解決時間在測試結束時間之後。"; $lang->testreport->fromCaseBugTip = "測試時間範圍內,用例執行失敗後創建的Bug"; $lang->testreport->errorTrunk = "主幹版本不能創建測試報告,請修改關聯版本!"; +$lang->testreport->moreProduct = "只能對同一個產品生成測試報告。"; $lang->testreport->bugSummary = <<%s個Bug , diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index 99bd2884a4..08001d4a0b 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -12,6 +12,7 @@ $lang->todo->common = 'Todo'; $lang->todo->index = "Home"; $lang->todo->create = "Create Todo"; +$lang->todo->createCycle = "Create Cycle Todo"; $lang->todo->assignTo = "Assign"; $lang->todo->activate = "Activate"; $lang->todo->batchCreate = "Batch Create"; diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index 0fbda0b2a2..57ba214bed 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -12,6 +12,7 @@ $lang->todo->common = '待办'; $lang->todo->index = "待办一览"; $lang->todo->create = "新增"; +$lang->todo->createCycle = "创建周期待办"; $lang->todo->assignTo = "指派"; $lang->todo->activate = "激活"; $lang->todo->batchCreate = "批量添加"; diff --git a/module/todo/lang/zh-tw.php b/module/todo/lang/zh-tw.php index 870ce07b48..ef24037cc2 100644 --- a/module/todo/lang/zh-tw.php +++ b/module/todo/lang/zh-tw.php @@ -12,17 +12,28 @@ $lang->todo->common = '待辦'; $lang->todo->index = "待辦一覽"; $lang->todo->create = "新增"; +$lang->todo->createCycle = "創建周期待辦"; +$lang->todo->assignTo = "指派"; +$lang->todo->activate = "激活"; $lang->todo->batchCreate = "批量添加"; -$lang->todo->edit = "更新待辦"; +$lang->todo->edit = "編輯"; +$lang->todo->close = "關閉"; $lang->todo->batchEdit = "批量編輯"; $lang->todo->view = "待辦詳情"; $lang->todo->finish = "完成"; $lang->todo->batchFinish = "批量完成"; $lang->todo->export = "導出"; -$lang->todo->delete = "刪除待辦"; +$lang->todo->delete = "刪除"; $lang->todo->import2Today = "導入到今天"; $lang->todo->import = "導入"; $lang->todo->legendBasic = "基本信息"; +$lang->todo->cycle = "周期"; +$lang->todo->cycleConfig = "周期設置"; + +$lang->todo->reasonList['story'] = "轉需求"; +$lang->todo->reasonList['task'] = "轉任務"; +$lang->todo->reasonList['bug'] = "轉Bug"; +$lang->todo->reasonList['done'] = "完成"; $lang->todo->id = '編號'; $lang->todo->account = '所有者'; @@ -39,14 +50,23 @@ $lang->todo->name = '名稱'; $lang->todo->status = '狀態'; $lang->todo->desc = '描述'; $lang->todo->private = '私人事務'; +$lang->todo->cycleDay = '天'; +$lang->todo->cycleWeek = '周'; +$lang->todo->cycleMonth = '月'; +$lang->todo->deadline = '過期時間'; + +$lang->todo->every = '間隔'; +$lang->todo->beforeDays = "提前%s天生成待辦"; +$lang->todo->dayNames = array(1 => '星期一', 2 => '星期二', 3 => '星期三', 4 => '星期四', 5 => '星期五', 6 => '星期六', 0 => '星期日'); $lang->todo->confirmBug = '該Todo關聯的是Bug #%s,需要修改它嗎?'; $lang->todo->confirmTask = '該Todo關聯的是Task #%s,需要修改它嗎?'; $lang->todo->confirmStory = '該Todo關聯的是Story #%s,需要修改它嗎?'; -$lang->todo->statusList['wait'] = '未開始'; -$lang->todo->statusList['doing'] = '進行中'; -$lang->todo->statusList['done'] = '已完成'; +$lang->todo->statusList['wait'] = '未開始'; +$lang->todo->statusList['doing'] = '進行中'; +$lang->todo->statusList['done'] = '已完成'; +$lang->todo->statusList['closed'] = '已關閉'; //$lang->todo->statusList['cancel'] = '已取消'; //$lang->todo->statusList['postpone'] = '已延期'; @@ -57,6 +77,7 @@ $lang->todo->priList[4] = '最低'; $lang->todo->priList[0] = ''; $lang->todo->typeList['custom'] = '自定義'; +$lang->todo->typeList['cycle'] = '周期'; $lang->todo->typeList['bug'] = 'Bug'; $lang->todo->typeList['task'] = $lang->projectCommon . '任務'; $lang->todo->typeList['story'] = $lang->projectCommon . '需求'; @@ -68,7 +89,9 @@ if($config->global->flow == 'onlyTask' or $config->global->flow == 'onlyStory') $lang->todo->confirmDelete = "您確定要刪除這條待辦嗎?"; $lang->todo->thisIsPrivate = '這是一條私人事務。:)'; $lang->todo->lblDisableDate = '暫時不設定時間'; +$lang->todo->lblBeforeDays = "提前%s天生成待辦"; $lang->todo->noTodo = '該類型沒有待辦事務'; +$lang->todo->noAssignedTo = '被指派人不能為空'; $lang->todo->periods['today'] = '今日'; $lang->todo->periods['yesterday'] = '昨日'; @@ -81,7 +104,8 @@ $lang->todo->periods['thisYear'] = '本年'; $lang->todo->periods['future'] = '待定'; $lang->todo->periods['before'] = '未完'; $lang->todo->periods['all'] = '所有'; +$lang->todo->periods['cycle'] = '周期'; $lang->todo->action = new stdclass(); -$lang->todo->action->finished = array('main' => '$date, 由 $actor完成'); +$lang->todo->action->finished = array('main' => '$date, 由 $actor $extra。$appendLink', 'extra' => 'reasonList'); $lang->todo->action->marked = array('main' => '$date, 由 $actor 標記為$extra。', 'extra' => 'statusList'); diff --git a/module/upgrade/lang/en.php b/module/upgrade/lang/en.php index e135153752..6c4773c866 100644 --- a/module/upgrade/lang/en.php +++ b/module/upgrade/lang/en.php @@ -130,3 +130,4 @@ $lang->upgrade->fromVersions['9_6'] = '9.6'; $lang->upgrade->fromVersions['9_6_1'] = '9.6.1'; $lang->upgrade->fromVersions['9_6_2'] = '9.6.2'; $lang->upgrade->fromVersions['9_6_3'] = '9.6.3'; +$lang->upgrade->fromVersions['9_7'] = '9.7'; diff --git a/module/upgrade/lang/zh-cn.php b/module/upgrade/lang/zh-cn.php index 871050c61a..4a68a78112 100644 --- a/module/upgrade/lang/zh-cn.php +++ b/module/upgrade/lang/zh-cn.php @@ -130,3 +130,4 @@ $lang->upgrade->fromVersions['9_6'] = '9.6'; $lang->upgrade->fromVersions['9_6_1'] = '9.6.1'; $lang->upgrade->fromVersions['9_6_2'] = '9.6.2'; $lang->upgrade->fromVersions['9_6_3'] = '9.6.3'; +$lang->upgrade->fromVersions['9_7'] = '9.7'; diff --git a/module/upgrade/lang/zh-tw.php b/module/upgrade/lang/zh-tw.php index 3bac753691..15e4aaaee4 100644 --- a/module/upgrade/lang/zh-tw.php +++ b/module/upgrade/lang/zh-tw.php @@ -130,3 +130,4 @@ $lang->upgrade->fromVersions['9_6'] = '9.6'; $lang->upgrade->fromVersions['9_6_1'] = '9.6.1'; $lang->upgrade->fromVersions['9_6_2'] = '9.6.2'; $lang->upgrade->fromVersions['9_6_3'] = '9.6.3'; +$lang->upgrade->fromVersions['9_7'] = '9.7'; diff --git a/module/upgrade/model.php b/module/upgrade/model.php index b2e8434ff3..f7e49a8394 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -202,7 +202,9 @@ class upgradeModel extends model $this->adjustPriv9_7(); $this->changeStoryWidth(); case '9_7': + $this->execSQL($this->getUpgradeFile('9.7')); $this->changeTeamFields(); + $this->moveData2Notify(); } $this->deletePatch(); @@ -305,6 +307,7 @@ class upgradeModel extends model case '9_6_1': case '9_6_2': case '9_6_3': $confirmContent .= file_get_contents($this->getUpgradeFile('9.6.3')); + case '9_7': $confirmContent .= file_get_contents($this->getUpgradeFile('9.7')); } return str_replace('zt_', $this->config->db->prefix, $confirmContent); } @@ -1741,6 +1744,7 @@ class upgradeModel extends model $data->group = $groupID; $data->module = 'bug'; $data->method = 'batchActivate'; + $this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec(); } return true; } @@ -1979,11 +1983,20 @@ class upgradeModel extends model */ public function changeTeamFields() { - $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` DROP PRIMARY KEY"); - $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'"); - $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`"); - $this->dao->exec("UPDATE `" . TABLE_TEAM . "` SET `root` = `task`, `type` = 'task' WHERE `task` > '0'"); - $this->dao->exec("ALTER TABLE `" . TABLE_TEAM . "` DROP `task`"); + $desc = $this->dao->query('DESC ' . TABLE_TEAM)->fetchAll(); + $fields = array(); + foreach($desc as $field) + { + $fieldName = $field->Field; + $fields[$fieldName] = $fieldName; + } + if(isset($fields['root'])) return true; + + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " CHANGE `project` `root` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0'"); + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " ADD `type` ENUM('project', 'task') NOT NULL DEFAULT 'project' AFTER `root`"); + $this->dao->exec("UPDATE " . TABLE_TEAM . " SET `root` = `task`, `type` = 'task' WHERE `task` > '0'"); + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " DROP PRIMARY KEY"); + $this->dao->exec("ALTER TABLE " . TABLE_TEAM . " DROP `task`"); return true; } @@ -2030,4 +2043,44 @@ class upgradeModel extends model } return true; } + + /** + * Adjust priv 9.8. + * + * @access public + * @return bool + */ + public function adjustPriv9_8() + { + $groups = $this->dao->select('id')->from(TABLE_GROUP)->fetchPairs('id', 'id'); + foreach($groups as $group) + { + $groupPriv = new stdclass(); + $groupPriv->group = $groupID; + $groupPriv->module = 'todo'; + $groupPriv->method = 'createcycle'; + $this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec(); + } + + $groups = $this->dao->select('*')->from(TABLE_GROUPPRIV)->where('module')->eq('mail')->orWhere('module')->eq('webhook')->fetchPairs('group', 'group'); + foreach($groups as $group) + { + $groupPriv = new stdclass(); + $groupPriv->group = $groupID; + $groupPriv->module = 'message'; + $groupPriv->method = 'index'; + $this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec(); + } + + $groups = $this->dao->select('*')->from(TABLE_GROUPPRIV)->where('module')->eq('project')->andWhere('method')->eq('linkStory')->fetchPairs('group', 'group'); + foreach($groups as $group) + { + $groupPriv = new stdclass(); + $groupPriv->group = $groupID; + $groupPriv->module = 'project'; + $groupPriv->method = 'importPlanStories'; + $this->dao->replace(TABLE_GROUPPRIV)->data($data)->exec(); + } + return true; + } } From 037213761d101cd5e697c2a46f45669d46dc42d2 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 14:26:38 +0800 Subject: [PATCH 110/206] * adjust for print assigntome block. --- module/block/view/printassigntomeblock.html.php | 6 +++--- module/bug/lang/en.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/module/block/view/printassigntomeblock.html.php b/module/block/view/printassigntomeblock.html.php index 33753341c6..4f96000351 100644 --- a/module/block/view/printassigntomeblock.html.php +++ b/module/block/view/printassigntomeblock.html.php @@ -10,16 +10,16 @@ * @link http://www.zentao.net */ ?> -
              +
              -
              + -
              +
              $bool):?>
              " id=""> diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index badf5a348d..ee5abe5e14 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -374,7 +374,7 @@ $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; $lang->bug->featureBar['browse']['my'] = $lang->bug->my; -$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->unConfirmed; +$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; $lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed; From e83360f474c7e20004e1f37c6e3a04a64864f406 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 14:52:57 +0800 Subject: [PATCH 111/206] * adjust for print assigntome block. --- module/block/view/printassigntomeblock.html.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/module/block/view/printassigntomeblock.html.php b/module/block/view/printassigntomeblock.html.php index 4f96000351..ceb9463d00 100644 --- a/module/block/view/printassigntomeblock.html.php +++ b/module/block/view/printassigntomeblock.html.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ ?> -
              +
              From d7a829325c909e49c60110f2bf623bb49a4ea561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 14:59:22 +0800 Subject: [PATCH 112/206] * Fix Bug. --- module/bug/view/sendmail.html.php | 5 +++-- module/project/model.php | 2 +- module/report/control.php | 3 +-- module/report/js/workload.js | 4 ++-- module/report/lang/en.php | 4 ++-- module/report/lang/zh-cn.php | 4 ++-- module/report/model.php | 30 ++++++++++++++++++++------ module/report/view/workload.html.php | 2 +- module/story/view/sendmail.html.php | 5 +++-- module/task/view/sendmail.html.php | 5 +++-- module/testtask/control.php | 1 + module/testtask/view/sendmail.html.php | 3 ++- module/todo/model.php | 2 +- 13 files changed, 45 insertions(+), 25 deletions(-) diff --git a/module/bug/view/sendmail.html.php b/module/bug/view/sendmail.html.php index cb7e4f2f30..f949c6399e 100644 --- a/module/bug/view/sendmail.html.php +++ b/module/bug/view/sendmail.html.php @@ -16,8 +16,9 @@
              - + diff --git a/module/testtask/view/browse.html.php b/module/testtask/view/browse.html.php index 62e42d5ea6..dc05595f0d 100644 --- a/module/testtask/view/browse.html.php +++ b/module/testtask/view/browse.html.php @@ -79,7 +79,7 @@ $status = $this->session->testTaskVersionStatus; config->global->flow != 'onlyTest'):?> - + From fb5796b4c8a9fdacfa6d933a98cc612c7871d264 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 17:18:54 +0800 Subject: [PATCH 119/206] * adjust for message notice. --- module/common/view/footer.html.php | 2 +- module/message/control.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/common/view/footer.html.php b/module/common/view/footer.html.php index 4cc1eb2c11..fb25cee84b 100755 --- a/module/common/view/footer.html.php +++ b/module/common/view/footer.html.php @@ -45,7 +45,7 @@ $(function() } else { - if(data) notifyMessage(data); + if(data && typeof data.message == 'string') notifyMessage(data.message); } }); }, 60 * 1000); diff --git a/module/message/control.php b/module/message/control.php index 9207c37021..2494c7d068 100644 --- a/module/message/control.php +++ b/module/message/control.php @@ -90,7 +90,7 @@ class message extends control if($windowBlur) { - echo $messages; + echo json_encode(array('message' => $messages)); } else { From 406d80e7cf68a51386f1e34abfcf164ad3da9077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 21:24:21 +0800 Subject: [PATCH 120/206] * Fix bug. --- module/report/model.php | 42 ++++++++++++++-------------- module/report/view/workload.html.php | 9 ------ 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/module/report/model.php b/module/report/model.php index 5ae74e5d12..e687d750e1 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -251,36 +251,36 @@ class reportModel extends model if($assign == 'noassign') { - $project = $this->dao->select('id')->from(TABLE_PROJECT) - ->where('deleted')->eq(0) - ->andWhere('status')->notin('cancel, closed, done, suspended') - ->fetchPairs('id'); - $members = $this->dao->select('t1.account')->from(TABLE_TEAM)->alias('t1') - ->leftJoin(TABLE_USER)->alias('t2')->on('t2.account = t1.account') - ->where('t1.type')->eq('project') - ->beginIF($dept)->andWhere('t2.dept')->in($depts)->fi() - ->andWhere('t1.root')->in(array_keys($project)) - ->fetchPairs('account'); - $taskAccounts = $this->dao->select('assignedTo')->from(TABLE_TASK) - ->where('deleted')->eq(0) - ->andWhere('project')->in(array_keys($project)) - ->andWhere('status')->notin('cancel, closed, done, pause') - ->fetchPairs('assignedTo'); + $members = $this->dao->select('t1.account,t2.name,t1.root')->from(TABLE_TEAM)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t2.id = t1.root') + ->leftJoin(TABLE_USER)->alias('t3')->on('t3.account = t1.account') + ->where('t2.status')->notin('cancel, closed, done, suspended') + ->beginIF($dept)->andWhere('t3.dept')->in($depts)->fi() + ->andWhere('t1.type')->eq('project') + ->andWhere("t1.account NOT IN(SELECT `assignedTo` FROM " . TABLE_TASK . " WHERE `project` = t1.`root` AND `status` NOT IN('cancel, closed, done, pause') AND assignedTo != '' GROUP BY assignedTo)") + ->fetchGroup('account', 'name'); - if(!empty($taskAccounts) && !empty($members)) + $workload = array(); + if(!empty($members)) { - foreach($members as $member) + foreach($members as $member => $projects) { - if(!empty($member) && in_array($member, $taskAccounts)) + if(!empty($projects)) { - unset($members[$member]); + foreach($projects as $name => $project) + { + $workload[$member]['task'][$name]['count'] = 0; + $workload[$member]['task'][$name]['manhour'] = 0; + $workload[$member]['task'][$name]['projectID'] = $project->root; + $workload[$member]['total']['count'] = 0; + $workload[$member]['total']['manhour'] = 0; + } } } } - - return $members; + return $workload; } $tasks = $this->dao->select('t1.*, t2.name as projectName')->from(TABLE_TASK)->alias('t1') diff --git a/module/report/view/workload.html.php b/module/report/view/workload.html.php index 2b2bd0fd88..d5247d417b 100644 --- a/module/report/view/workload.html.php +++ b/module/report/view/workload.html.php @@ -70,7 +70,6 @@ - $info):?> ';?> @@ -91,14 +90,6 @@ '; $id ++;?> - - - - - - - - From 08e2522c1aa45cedd2352e6b22820d34b335a4bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 21:27:42 +0800 Subject: [PATCH 121/206] * Format code. --- module/report/model.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/module/report/model.php b/module/report/model.php index e687d750e1..fb77ada853 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -251,8 +251,6 @@ class reportModel extends model if($assign == 'noassign') { - - $members = $this->dao->select('t1.account,t2.name,t1.root')->from(TABLE_TEAM)->alias('t1') ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t2.id = t1.root') ->leftJoin(TABLE_USER)->alias('t3')->on('t3.account = t1.account') From 660ac1f62be27508e6940aae034eab3f554a6cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 21:30:31 +0800 Subject: [PATCH 122/206] * Format code. --- module/report/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/report/model.php b/module/report/model.php index fb77ada853..8c6436b731 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -293,6 +293,7 @@ class reportModel extends model if(empty($tasks)) return array(); + /* Fix bug for children. */ $parents = array(); foreach($tasks as $user => $userTasks) { From 8f30956519fe28d07503e8ddf5bb0462a6079b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 17 Jan 2018 09:16:25 +0800 Subject: [PATCH 123/206] * Fix bug. --- module/my/view/todo.html.php | 2 +- module/todo/lang/zh-cn.php | 2 +- module/todo/view/view.html.php | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/module/my/view/todo.html.php b/module/my/view/todo.html.php index 0c8a7e3727..9da580c8fd 100644 --- a/module/my/view/todo.html.php +++ b/module/my/view/todo.html.php @@ -78,7 +78,7 @@ + assignedTo)):?> + + + + + + + + +
              task->project;?> project, 'class="form-control chosen" onchange="loadAll(this.value)"');?>
              task->module;?>task->module;?> module, 'class="form-control chosen" onchange="loadModuleRelated()"');?>
              -
              color;?>'> - config->mail, 'domain', common::getSysURL()) . helper::createLink('bug', 'view', "bugID=$bug->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> + + color) ? '#333' : $bug->color;?> + config->mail, 'domain', common::getSysURL()) . helper::createLink('bug', 'view', "bugID=$bug->id"), $mailTitle, '', "style='color: {$color}; text-decoration: underline;'");?>
              diff --git a/module/project/model.php b/module/project/model.php index b5c7f261b1..995250acfb 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -1487,7 +1487,7 @@ class projectModel extends model { foreach($plans as $planID => $productID) { - $planStory = $this->loadModel('story')->getPlanStories($planID); + $planStory = $this->loadModel('story')->getPlanStories($planID, 'active'); if(!empty($planStory)) { $planStories = array_merge($planStories, array_keys($planStory)); diff --git a/module/report/control.php b/module/report/control.php index eeabacfdcb..b3c45f224f 100644 --- a/module/report/control.php +++ b/module/report/control.php @@ -120,7 +120,7 @@ class report extends control * @access public * @return void */ - public function workload($begin = '', $end = '', $days = 0, $workday = 0, $dept = 0, $assign = 1) + public function workload($begin = '', $end = '', $days = 0, $workday = 0, $dept = 0, $assign = 'assign') { if($_POST) { @@ -140,7 +140,6 @@ class report extends control $beginWeekDay = date('w', $begin); $begin = date('Y-m-d', $begin); $end = date('Y-m-d', $end); - $assign = empty($assign) ? 0 : 1; if(empty($workday))$workday = $this->config->project->defaultWorkhours; $diffDays = helper::diffDate($end, $begin); diff --git a/module/report/js/workload.js b/module/report/js/workload.js index 2fda97f533..469da28ebe 100644 --- a/module/report/js/workload.js +++ b/module/report/js/workload.js @@ -18,7 +18,7 @@ function changeParams(obj) { var beginarray = begin.split("-"); var begin = ''; - for(i=0 ; i < beginarray.length ; i++) begin = begin + beginarray[i]; + for(i = 0; i < beginarray.length; i++) begin = begin + beginarray[i]; } if(end.indexOf('-') != -1) { @@ -27,7 +27,7 @@ function changeParams(obj) for(i=0 ; i < endarray.length ; i++) end = end + endarray[i]; } - link = createLink('report', 'workload', 'begin=' + begin + '&end=' + end + '&days=' + days + '&workday=' + workday + '&dept=' + dept + '&assign=' + assign); + var link = createLink('report', 'workload', 'begin=' + begin + '&end=' + end + '&days=' + days + '&workday=' + workday + '&dept=' + dept + '&assign=' + assign); location.href=link; } diff --git a/module/report/lang/en.php b/module/report/lang/en.php index 67b02162f2..d7a56b7a91 100644 --- a/module/report/lang/en.php +++ b/module/report/lang/en.php @@ -31,8 +31,8 @@ $lang->report->colors[] = '008ED6'; $lang->report->colors[] = '9D080D'; $lang->report->colors[] = 'A186BE'; -$lang->report->isAssign[0] = 'Not assigned'; -$lang->report->isAssign[1] = 'Assigned'; +$lang->report->assign['noassign'] = 'Not assigned'; +$lang->report->assign['assign'] = 'Assigned'; $lang->report->singleColor[] = 'F6BD0F'; diff --git a/module/report/lang/zh-cn.php b/module/report/lang/zh-cn.php index 985f243a1d..e638c08276 100644 --- a/module/report/lang/zh-cn.php +++ b/module/report/lang/zh-cn.php @@ -31,8 +31,8 @@ $lang->report->colors[] = '008ED6'; $lang->report->colors[] = '9D080D'; $lang->report->colors[] = 'A186BE'; -$lang->report->isAssign[0] = '未指派'; -$lang->report->isAssign[1] = '已指派'; +$lang->report->assign['noassign'] = '未指派'; +$lang->report->assign['assign'] = '已指派'; $lang->report->singleColor[] = 'F6BD0F'; diff --git a/module/report/model.php b/module/report/model.php index 99230d8fb3..5ae74e5d12 100644 --- a/module/report/model.php +++ b/module/report/model.php @@ -238,18 +238,18 @@ class reportModel extends model /** * Get workload. * - * @param int $dept - * @param int $assign + * @param int $dept + * @param string $assign * * @access public * @return array */ - public function getWorkload($dept = 0, $assign = 1) + public function getWorkload($dept = 0, $assign = 'assign') { $depts = array(); if($dept) $depts = $this->loadModel('dept')->getAllChildId($dept); - if($assign == 0) + if($assign == 'noassign') { $project = $this->dao->select('id')->from(TABLE_PROJECT) ->where('deleted')->eq(0) @@ -291,7 +291,22 @@ class reportModel extends model ->andWhere('t2.deleted')->eq(0) ->andWhere('t2.status')->notin('cancel, closed, done, suspended') ->beginIF($dept)->andWhere('t3.dept')->in($depts)->fi() - ->fetchGroup('assignedTo'); + ->fetchGroup('assignedTo', 'id'); + + if(empty($tasks)) return array(); + + $parents = array(); + foreach($tasks as $user => $userTasks) + { + if($user) + { + foreach($userTasks as $task) + { + if(!empty($task->parent)) $parents[$task->parent] = $task->parent; + } + } + } + $workload = array(); foreach($tasks as $user => $userTasks) { @@ -299,11 +314,12 @@ class reportModel extends model { foreach($userTasks as $task) { + if(!empty($parents) && in_array($task->id, $parents)) continue; $workload[$user]['task'][$task->projectName]['count'] = isset($workload[$user]['task'][$task->projectName]['count']) ? $workload[$user]['task'][$task->projectName]['count'] + 1 : 1; $workload[$user]['task'][$task->projectName]['manhour'] = isset($workload[$user]['task'][$task->projectName]['manhour']) ? $workload[$user]['task'][$task->projectName]['manhour'] + $task->left : $task->left; $workload[$user]['task'][$task->projectName]['projectID'] = $task->project; - $workload[$user]['total']['count'] = isset($workload[$user]['total']['count']) ? $workload[$user]['total']['count'] + 1 : 1; - if($task->parent == 0) $workload[$user]['total']['manhour'] = isset($workload[$user]['total']['manhour']) ? $workload[$user]['total']['manhour'] + $task->left : $task->left; + $workload[$user]['total']['count'] = isset($workload[$user]['total']['count']) ? $workload[$user]['total']['count'] + 1 : 1; + $workload[$user]['total']['manhour'] = isset($workload[$user]['total']['manhour']) ? $workload[$user]['total']['manhour'] + $task->left : $task->left; } } } diff --git a/module/report/view/workload.html.php b/module/report/view/workload.html.php index 2d19d9e141..2b2bd0fd88 100644 --- a/module/report/view/workload.html.php +++ b/module/report/view/workload.html.php @@ -44,7 +44,7 @@
              - report->isAssign, $assign, "class='form-control' onchange='changeParams(this)' style='width:90px'");?> + report->assign, $assign, "class='form-control' onchange='changeParams(this)' style='width:90px'");?>
              report->query);?>
              diff --git a/module/story/view/sendmail.html.php b/module/story/view/sendmail.html.php index a89fb3e0f3..eaf864d652 100644 --- a/module/story/view/sendmail.html.php +++ b/module/story/view/sendmail.html.php @@ -16,8 +16,9 @@
              -
              color;?>'> - config->mail, 'domain', common::getSysURL()) . helper::createLink('story', 'view', "storyID=$story->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> + + color) ? '#333' : $story->color;?> + config->mail, 'domain', common::getSysURL()) . helper::createLink('story', 'view', "storyID=$story->id"), $mailTitle, '', "style='color: {$color}; text-decoration: underline;'");?>
              diff --git a/module/task/view/sendmail.html.php b/module/task/view/sendmail.html.php index 4c29d4bbf5..acdb53ed49 100644 --- a/module/task/view/sendmail.html.php +++ b/module/task/view/sendmail.html.php @@ -16,8 +16,9 @@
              -
              color;?>'> - config->mail, 'domain', common::getSysURL()) . helper::createLink('task', 'view', "taskID=$task->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> + + color) ? '#333' : $task->color;?> + config->mail, 'domain', common::getSysURL()) . helper::createLink('task', 'view', "taskID=$task->id"), $mailTitle, '', "style='color: {$color}; text-decoration: underline;'");?>
              diff --git a/module/testtask/control.php b/module/testtask/control.php index f31feed99a..03e2e57660 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -405,6 +405,7 @@ class testtask extends control $this->view->groupBy = $groupBy; $this->view->groupByList = $groupByList; $this->view->cases = $groupCases; + $this->view->account = 'all'; $this->display(); } diff --git a/module/testtask/view/sendmail.html.php b/module/testtask/view/sendmail.html.php index 437cb4dcbc..d688899982 100644 --- a/module/testtask/view/sendmail.html.php +++ b/module/testtask/view/sendmail.html.php @@ -17,7 +17,8 @@
              - config->mail, 'domain', common::getSysURL()) . helper::createLink('testtask', 'view', "testtaskID=$testtask->id"), $mailTitle, '', "style='color: #333; text-decoration: underline;'");?> + color) ? '#333' : $testtask->color;?> + config->mail, 'domain', common::getSysURL()) . helper::createLink('testtask', 'view', "testtaskID=$testtask->id"), $mailTitle, '', "style='color: {$color}; text-decoration: underline;'");?>
              diff --git a/module/todo/model.php b/module/todo/model.php index 1c95418afa..37fc1ec092 100644 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -552,7 +552,7 @@ class todoModel extends model ->get(); $this->dao->update(TABLE_TODO)->data($todo)->where('id')->eq((int)$todoID)->exec(); - $this->loadModel('action')->create('todo', $todoID, 'assigned', '', 'assigned'); + $this->loadModel('action')->create('todo', $todoID, 'assigned', '', $todo->assignedTo); return !dao::isError(); } } From 9af7afb162897f7a3113fee0bd852d6e3598e633 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 15:08:09 +0800 Subject: [PATCH 113/206] * adjust for send notice to self. --- module/message/model.php | 1 + 1 file changed, 1 insertion(+) diff --git a/module/message/model.php b/module/message/model.php index ed8611d133..5106883d2f 100644 --- a/module/message/model.php +++ b/module/message/model.php @@ -118,6 +118,7 @@ class messageModel extends model $object = $this->dao->select('*')->from($table)->where('id')->eq($objectID)->fetch(); $toList = $this->getToList($object, $objectType); if(empty($toList)) return false; + if($toList == $this->app->user->account) return false; $moduleName = $objectType == 'case' ? 'testcase' : $objectType; $data = $this->app->user->realname . $this->lang->action->label->$actionType . $this->lang->action->objectTypes[$objectType]; From 1a593e062f9d0ba883098f138734482376c4253d Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 15:13:32 +0800 Subject: [PATCH 114/206] * adjust for story report page. --- module/story/control.php | 2 +- module/story/view/report.html.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/module/story/control.php b/module/story/control.php index 3939f1a7ad..cd47d513af 100644 --- a/module/story/control.php +++ b/module/story/control.php @@ -1311,7 +1311,7 @@ class story extends control * @access public * @return void */ - public function report($productID, $browseType, $branchID, $moduleID, $chartType = '') + public function report($productID, $browseType, $branchID, $moduleID, $chartType = 'pie') { $this->loadModel('report'); $this->view->charts = array(); diff --git a/module/story/view/report.html.php b/module/story/view/report.html.php index 9125e58479..40905eb8ae 100644 --- a/module/story/view/report.html.php +++ b/module/story/view/report.html.php @@ -42,6 +42,7 @@ story->report->common;?>
              + report->typeList['']);?> report->typeList as $type => $typeName):?> From e92a36c94764c56516defc30386f5cf01047721a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 16:01:43 +0800 Subject: [PATCH 115/206] * fix bug #1363. --- module/task/model.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module/task/model.php b/module/task/model.php index 278a6cfdcc..0b3acb423b 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -224,6 +224,8 @@ class taskModel extends model $data[$i]->parent = $tasks->parent[$i]; if($story) $data[$i]->storyVersion = $this->loadModel('story')->getVersion($data[$i]->story); if($assignedTo) $data[$i]->assignedDate = $now; + if(strpos($this->config->task->create->requiredFields, 'estStarted') !== false and empty($tasks->estStarted[$i])) $data[$i]->estStarted = ''; + if(strpos($this->config->task->create->requiredFields, 'deadline') !== false and empty($tasks->deadline[$i])) $data[$i]->deadline = ''; $this->dao->insert(TABLE_TASK)->data($data[$i]) ->autoCheck() From 2c545e7ef19be5359d608ec8d385f29ebabeb5d7 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 16:28:19 +0800 Subject: [PATCH 116/206] * fix bug #1382. --- module/tree/model.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module/tree/model.php b/module/tree/model.php index 135d36b7bc..accd40cb20 100644 --- a/module/tree/model.php +++ b/module/tree/model.php @@ -511,8 +511,8 @@ class treeModel extends model { $productInfo = $this->product->getById($id); /* tree menu. */ - $productTree = ''; - $branchTrees = ''; + $productTree = array(); + $branchTrees = array(); if(empty($branchGroups[$id])) $branchGroups[$id]['0'] = ''; foreach($branchGroups[$id] as $branch => $branchName) { From 68f13738ea2549366c411dad77f77e368a5594bf Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 16 Jan 2018 16:36:18 +0800 Subject: [PATCH 117/206] * fix bug #1385. --- module/testcase/control.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/testcase/control.php b/module/testcase/control.php index bbd357a86b..2cf55a9c4b 100644 --- a/module/testcase/control.php +++ b/module/testcase/control.php @@ -1407,7 +1407,7 @@ class testcase extends control $this->config->testcase->search['queryID'] = $queryID; $this->config->testcase->search['fields']['lib'] = $this->lang->testcase->lib; $this->config->testcase->search['params']['lib'] = array('operator' => '=', 'control' => 'select', 'values' => array('' => '', $libID => $libraries[$libID], 'all' => $this->lang->caselib->all)); - $this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, $viewType = 'case'); + $this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($libID, $viewType = 'caselib'); if(!$this->config->testcase->needReview) unset($this->config->testcase->search['params']['status']['values']['wait']); unset($this->config->testcase->search['fields']['product']); unset($this->config->testcase->search['fields']['branch']); From d0b19ffb50b94f775b30448313f07ed415f4a2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Tue, 16 Jan 2018 17:03:24 +0800 Subject: [PATCH 118/206] * Fix bug. --- module/project/view/testtask.html.php | 2 +- module/testtask/view/browse.html.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/project/view/testtask.html.php b/module/project/view/testtask.html.php index 1b55220d42..a6879f610d 100644 --- a/module/project/view/testtask.html.php +++ b/module/project/view/testtask.html.php @@ -51,7 +51,7 @@
              product, '');?> createLink('testtask', 'view', "taskID=$task->id"), $task->name);?>build == 'trunk' ? print($lang->trunk) : print(html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName));?>build == 'trunk' || empty($task->buildName)) ? $lang->trunk : html::a($this->createLink('build', 'view', "buildID=$task->build"), $task->buildName);?> owner];?> begin?> end?>projectName?> build == 'trunk' ? print($lang->trunk) : print(html::a($this->createLink('build', 'view', "buildID=$task->build",'',true), $task->buildName, '','class="iframe"'));?>build == 'trunk' || empty($task->buildName)) ? $lang->trunk : html::a($this->createLink('build', 'view', "buildID=$task->build",'',true), $task->buildName, '','class="iframe"');?> owner);?> begin?> end?>
              00000
              todo->statusList[$todo->status];?> status != 'done') echo html::a(helper::createLink('todo', 'assignto', "todoID=$todo->id"), '', '', "data-toggle='assigntoModal' class='btn-icon'"); + if($todo->status != 'done') common::printIcon('todo', 'assignto', "todoID=$todo->id", $todo, 'list', 'hand-right', '', "btn-icon", '', "data-toggle='assigntoModal'", $lang->todo->assignTo); if($todo->status == 'done') common::printIcon('todo', 'activate', "id=$todo->id", $todo, 'list', 'magic', 'hiddenwin'); if($todo->status != 'done') common::printIcon('todo', 'finish', "id=$todo->id", $todo, 'list', 'ok-sign', 'hiddenwin'); if($todo->status == 'done') common::printIcon('todo', 'close', "id=$todo->id", $todo, 'list', 'off', 'hiddenwin'); diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index 57ba214bed..15ac996e08 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -13,7 +13,7 @@ $lang->todo->common = '待办'; $lang->todo->index = "待办一览"; $lang->todo->create = "新增"; $lang->todo->createCycle = "创建周期待办"; -$lang->todo->assignTo = "指派"; +$lang->todo->assignTo = "指派给"; $lang->todo->activate = "激活"; $lang->todo->batchCreate = "批量添加"; $lang->todo->edit = "编辑"; diff --git a/module/todo/view/view.html.php b/module/todo/view/view.html.php index 019111ad7d..4ff5808fc0 100644 --- a/module/todo/view/view.html.php +++ b/module/todo/view/view.html.php @@ -66,6 +66,16 @@ todo->beginAndEnd;?> begin])) echo $times[$todo->begin]; if(isset($times[$todo->end])) echo ' ~ ' . $times[$todo->end];?>
              todo->assignTo;?>assignedTo;?>
              todo->assignTo . $lang->todo->date;?>assignedDate;?>
              cycle):?> @@ -108,7 +118,6 @@ account == $app->user->account) { - //if($todo->status != 'done') echo html::a($this->createLink('todo', 'assignTo', "todoID=$todo->id"), " " . $lang->todo->assignTo, '', "class='btn showinonlybody'"); if($todo->status != 'closed') echo html::a($this->createLink('todo', 'edit', "todoID=$todo->id"), " " . $lang->todo->edit, '', "class='btn showinonlybody'"); if($todo->status == 'done' || $todo->status == 'closed') echo html::a($this->createLink('todo', 'activate', "todoID=$todo->id"), " " . $lang->todo->activate, 'hiddenwin', "class='btn showinonlybody'"); if($todo->status == 'done') echo html::a($this->createLink('todo', 'close', "todoID=$todo->id"), " " . $lang->todo->close, 'hiddenwin', "class='btn showinonlybody'"); From e3317e23178adaf58b9b7c08f989c3ec70f1a99c Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Jan 2018 10:10:02 +0800 Subject: [PATCH 124/206] * fix bug #1377. --- module/bug/model.php | 6 +++--- module/file/view/export2csv.html.php | 2 +- module/productplan/view/view.html.php | 4 +--- module/story/model.php | 6 +++--- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/module/bug/model.php b/module/bug/model.php index f630fe47bc..d812de7b2d 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -2400,12 +2400,12 @@ class bugModel extends model case 'title': $class = 'confirm' . $bug->confirmed; echo "[{$this->lang->bug->confirmedList[$bug->confirmed]}] "; - if($bug->branch)echo "{$branches[$bug->branch]} "; - if($modulePairs and $bug->module)echo "{$modulePairs[$bug->module]} "; + if($bug->branch and isset($branches[$bug->branch])) echo "{$branches[$bug->branch]} "; + if($bug->module and isset($modulePairs[$bug->module])) echo "{$modulePairs[$bug->module]} "; echo $canView ? html::a($bugLink, $bug->title, null, "style='color: $bug->color'") : "{$bug->title}"; break; case 'branch': - echo $branches[$bug->branch]; + echo zget($branches, $bug->branch, ''); break; case 'project': echo zget($projects, $bug->project, ''); diff --git a/module/file/view/export2csv.html.php b/module/file/view/export2csv.html.php index b883ce5b43..8a201192ef 100644 --- a/module/file/view/export2csv.html.php +++ b/module/file/view/export2csv.html.php @@ -17,7 +17,7 @@ foreach($rows as $row) echo '"'; foreach($fields as $fieldName => $fieldLabel) { - isset($row->$fieldName) ? print(str_replace('",', '",', htmlspecialchars_decode(strip_tags($row->$fieldName, '')))) : print(''); + isset($row->$fieldName) ? print(str_replace('"', '“', htmlspecialchars_decode(strip_tags($row->$fieldName, '')))) : print(''); echo '","'; } echo '"' . "\n"; diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php index 7b018fa00c..94cc775017 100644 --- a/module/productplan/view/view.html.php +++ b/module/productplan/view/view.html.php @@ -92,9 +92,7 @@
              productplan->updateOrder);?> priAB);?> story->module);?> story->title);?> openedByAB);?> assignedToAB);?> story->priList, $story->pri, $story->pri)?>'>story->priList, $story->pri, $story->pri);?>module)) echo $modulePairs[$story->module];?>module, '');?> title);?> openedBy);?> assignedTo);?>
              - + @@ -34,9 +34,9 @@ $groupCases):?> - + - + From 1d47fe73792b9f77236c4a5d8e8d129c7d1f9381 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Jan 2018 13:03:26 +0800 Subject: [PATCH 130/206] * fix for changelog. --- module/misc/view/changelog.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/misc/view/changelog.html.php b/module/misc/view/changelog.html.php index b0237d761a..5126af6224 100644 --- a/module/misc/view/changelog.html.php +++ b/module/misc/view/changelog.html.php @@ -24,7 +24,7 @@ - + app->getClientLang() != 'en'):?>
              From 577e5fbbbdd3dedb90391a4df2f08b60cc9e31a3 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Wed, 17 Jan 2018 13:19:19 +0800 Subject: [PATCH 131/206] * fix for group case. --- module/testtask/control.php | 4 ++-- module/testtask/view/groupcase.html.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/testtask/control.php b/module/testtask/control.php index fb9b4167a8..86a3e147b0 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -374,7 +374,8 @@ class testtask extends control $productID = $task->product; $this->testtask->setMenu($this->products, $productID, $task->branch); - $runs = $this->testtask->getRuns($taskID, 0, $groupBy); + $runs = $this->testtask->getRuns($taskID, 0, $groupBy); + $users = $this->loadModel('user')->getPairs('noletter'); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'testcase', false); $runs = $this->testcase->appendData($runs, 'run'); @@ -389,7 +390,6 @@ class testtask extends control } elseif($groupBy == 'assignedTo') { - if(empty($run->assignedTo)) continue; $groupCases[$run->assignedTo][] = $run; } } diff --git a/module/testtask/view/groupcase.html.php b/module/testtask/view/groupcase.html.php index 0672e1ae41..6af6dc8078 100644 --- a/module/testtask/view/groupcase.html.php +++ b/module/testtask/view/groupcase.html.php @@ -40,7 +40,7 @@
              - + From a9dde0e3b43aab8621b84054e3bc2f4cec51f4e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BB=94=E5=93=A5?= Date: Wed, 17 Jan 2018 13:50:06 +0800 Subject: [PATCH 132/206] * Format code. --- module/testtask/control.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/module/testtask/control.php b/module/testtask/control.php index 86a3e147b0..aff804d571 100644 --- a/module/testtask/control.php +++ b/module/testtask/control.php @@ -374,8 +374,7 @@ class testtask extends control $productID = $task->product; $this->testtask->setMenu($this->products, $productID, $task->branch); - $runs = $this->testtask->getRuns($taskID, 0, $groupBy); - $users = $this->loadModel('user')->getPairs('noletter'); + $runs = $this->testtask->getRuns($taskID, 0, $groupBy); $this->loadModel('common')->saveQueryCondition($this->dao->get(), 'testcase', false); $runs = $this->testcase->appendData($runs, 'run'); From 2a8146f6fb86a36022c497960bb9fdf34d32aa77 Mon Sep 17 00:00:00 2001 From: dajiao007 Date: Wed, 17 Jan 2018 16:01:59 +0800 Subject: [PATCH 133/206] modify translations of admin module --- module/action/lang/en.php | 2 +- module/action/view/trash.html.php | 2 +- module/admin/lang/en.php | 18 +++++++++--------- module/backup/lang/en.php | 10 +++++----- module/backup/view/index.html.php | 2 +- module/bug/lang/en.php | 18 +++++++++++------- module/bug/lang/zh-cn.php | 4 ++++ module/bug/lang/zh-tw.php | 4 ++++ module/common/lang/en.php | 2 +- module/cron/lang/en.php | 12 ++++++------ module/cron/view/index.html.php | 12 ++++++------ module/install/lang/en.php | 10 +++++----- module/misc/lang/en.php | 5 +++++ module/product/lang/en.php | 6 +++--- module/project/lang/en.php | 2 +- module/project/view/view.html.php | 2 +- module/user/view/edit.html.php | 2 +- 17 files changed, 65 insertions(+), 48 deletions(-) diff --git a/module/action/lang/en.php b/module/action/lang/en.php index 922bce1f49..fddf69a611 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -27,7 +27,7 @@ $lang->action->hideAll = 'Hide All'; $lang->action->editComment = 'Edit'; $lang->action->comment = 'Comment'; -$lang->action->trashTips = 'Note: Delete in ZenTao is logic.'; +$lang->action->trashTips = 'Note: All Deletion in ZenTao are logical.'; $lang->action->textDiff = 'Text Format'; $lang->action->original = 'Original Format'; $lang->action->confirmHideAll = 'Do you want to hide all the records?'; diff --git a/module/action/view/trash.html.php b/module/action/view/trash.html.php index a4f9a569c5..b09a3818d8 100755 --- a/module/action/view/trash.html.php +++ b/module/action/view/trash.html.php @@ -23,7 +23,7 @@ recTotal}&recPerPage={$pager->recPerPage}"; ?> - + diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index 2d7b427ca2..643e542eff 100644 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -54,20 +54,20 @@ $lang->admin->bind->success = "Account has been linked!"; $lang->admin->safe = new stdclass(); $lang->admin->safe->common = 'Security Policy'; -$lang->admin->safe->set = 'Password Security Settings'; -$lang->admin->safe->password = 'Password Security'; -$lang->admin->safe->weak = 'Weak Password'; +$lang->admin->safe->set = 'PasswordStrength'; +$lang->admin->safe->password = 'Password Strength'; +$lang->admin->safe->weak = 'Weak Passwords'; $lang->admin->safe->reason = 'Type'; -$lang->admin->safe->checkWeak = 'Weak Password Check'; -$lang->admin->safe->changeWeak = 'Change weak password'; +$lang->admin->safe->checkWeak = 'WeakPasswords'; +$lang->admin->safe->changeWeak = 'Weak password must be strengthen'; $lang->admin->safe->modifyPasswordFirstLogin = 'Change password when first login'; $lang->admin->safe->modeList[0] = 'N/A'; $lang->admin->safe->modeList[1] = 'Medium'; $lang->admin->safe->modeList[2] = 'Strong'; -$lang->admin->safe->modeRuleList[1] = 'must contain letters and numbers, at least six characters.'; -$lang->admin->safe->modeRuleList[2] = 'must contain letters, numbers and special characters, at least 10 characters.'; +$lang->admin->safe->modeRuleList[1] = 'Contains upper and lower case, numbers. Length >= 6'; +$lang->admin->safe->modeRuleList[2] = 'Contains upper and lower case, numbers and special characters. Length >= 10.'; $lang->admin->safe->reasonList['weak'] = 'Common Weak Password'; $lang->admin->safe->reasonList['account'] = 'Same as your account'; @@ -78,5 +78,5 @@ $lang->admin->safe->reasonList['birthday'] = 'Same as your DOB'; $lang->admin->safe->modifyPasswordList[1] = 'Yes'; $lang->admin->safe->modifyPasswordList[0] = 'No'; -$lang->admin->safe->noticeMode = 'User password will be checked when login, add/edit user password.'; -$lang->admin->safe->noticeStrong = 'The more uppercase letters and numbers a password has, the more secure it is!'; +$lang->admin->safe->noticeMode = 'Password will be checked when login, add/edit user.'; +$lang->admin->safe->noticeStrong = ''; diff --git a/module/backup/lang/en.php b/module/backup/lang/en.php index f197def427..d3df0e55ca 100644 --- a/module/backup/lang/en.php +++ b/module/backup/lang/en.php @@ -5,18 +5,18 @@ $lang->backup->history = 'History'; $lang->backup->delete = 'Delete'; $lang->backup->backup = 'Backup'; $lang->backup->restore = 'Restore'; -$lang->backup->change = 'Save Interval'; +$lang->backup->change = 'Modify days'; $lang->backup->changeAB = 'Modify'; -$lang->backup->time = 'Time'; +$lang->backup->time = 'Backup Time'; $lang->backup->files = 'Files'; $lang->backup->size = 'Size'; -$lang->backup->waitting = 'In Progree. Please wait...'; +$lang->backup->waitting = ' In Progress. Please wait...'; $lang->backup->confirmDelete = 'Do you want to delete the backup?'; $lang->backup->confirmRestore = 'Do you want to restore the backup?'; -$lang->backup->holdDays = 'Backup the latest %s days.'; -$lang->backup->restoreTip = 'Only files and databases will be restored when you click Restore. If you want to restore the code, restore it manually.'; +$lang->backup->holdDays = 'Reserve latest %s days of backups'; +$lang->backup->restoreTip = 'Only files and databases can be restored when you click Restore. Code can be restored manually.'; $lang->backup->success = new stdclass(); $lang->backup->success->backup = 'Done!'; diff --git a/module/backup/view/index.html.php b/module/backup/view/index.html.php index 14b9f79c9e..6ab73fe450 100644 --- a/module/backup/view/index.html.php +++ b/module/backup/view/index.html.php @@ -33,7 +33,7 @@ - + diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index ee5abe5e14..dd89517a59 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -102,10 +102,10 @@ $lang->bug->confirmStoryChange = 'Confirm Story Change'; $lang->bug->copy = 'Copy'; /* 查询条件列表。*/ -$lang->bug->assignToMe = 'Assigned To Me'; -$lang->bug->openedByMe = 'Created By Me'; -$lang->bug->resolvedByMe = 'Resolved By Me'; -$lang->bug->closedByMe = 'Closed By Me'; +$lang->bug->assignToMe = 'AssignedToMe'; +$lang->bug->openedByMe = 'CreatedByMe'; +$lang->bug->resolvedByMe = 'ResolvedByMe'; +$lang->bug->closedByMe = 'ClosedByMe'; $lang->bug->assignToNull = 'Unassigned'; $lang->bug->unResolved = 'Unresolved'; $lang->bug->toClosed = 'WaitForClose'; @@ -119,6 +119,10 @@ $lang->bug->needConfirm = 'StoryChanged'; $lang->bug->allProduct = 'All' . $lang->productCommon; $lang->bug->my = 'My'; +$lang->bug->assignToMeAB = 'Assigned To Me'; +$lang->bug->openedByMeAB = 'Created By Me'; +$lang->bug->resolvedByMeAB = 'Resolved By Me'; + $lang->bug->ditto = 'Ditto'; $lang->bug->dittoNotice = 'This bug is not linked to the same product as the last one!'; @@ -364,9 +368,9 @@ $lang->bug->placeholder = new stdclass(); $lang->bug->placeholder->chooseBuilds = 'Choose Build...'; $lang->bug->placeholder->newBuildName = 'The name of new build'; -$lang->bug->mySelects['assigntome'] = $lang->bug->assignToMe; -$lang->bug->mySelects['openedbyme'] = $lang->bug->openedByMe; -$lang->bug->mySelects['resolvedbyme'] = $lang->bug->resolvedByMe; +$lang->bug->mySelects['assigntome'] = $lang->bug->assignToMeAB; +$lang->bug->mySelects['openedbyme'] = $lang->bug->openedByMeAB; +$lang->bug->mySelects['resolvedbyme'] = $lang->bug->resolvedByMeAB; $lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed; $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 7312dd55f6..5d083fde46 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -118,6 +118,10 @@ $lang->bug->byQuery = '搜索'; $lang->bug->needConfirm = '需求变动'; $lang->bug->allProduct = '所有' . $lang->productCommon; +$lang->bug->assignToMeAB = '指派给我'; +$lang->bug->openedByMeAB = '由我创建'; +$lang->bug->resolvedByMeAB = '由我解决'; + $lang->bug->ditto = '同上'; $lang->bug->dittoNotice = '该bug与上一bug不属于同一产品!'; diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php index 321d7c26d1..09cf315aa3 100644 --- a/module/bug/lang/zh-tw.php +++ b/module/bug/lang/zh-tw.php @@ -118,6 +118,10 @@ $lang->bug->byQuery = '搜索'; $lang->bug->needConfirm = '需求變動'; $lang->bug->allProduct = '所有' . $lang->productCommon; +$lang->bug->assignToMeAB = '指派給我'; +$lang->bug->openedByMeAB = '由我創建'; +$lang->bug->resolvedByMeAB = '由我解決'; + $lang->bug->ditto = '同上'; $lang->bug->dittoNotice = '該bug與上一bug不屬於同一產品!'; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index 9fdc6dfd93..90984425de 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -339,7 +339,7 @@ $lang->admin->menu = new stdclass(); $lang->admin->menu->index = array('link' => 'Home|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany'); $lang->admin->menu->custom = array('link' => 'Custom|custom|set', 'subModule' => 'custom'); -$lang->admin->menu->message = array('link' => 'Mssage|message|index', 'subModule' => 'message,mail,webhook'); +$lang->admin->menu->message = array('link' => 'Message|message|index', 'subModule' => 'message,mail,webhook'); $lang->admin->menu->backup = array('link' => 'Backup|backup|index', 'subModule' => 'backup'); $lang->admin->menu->safe = array('link' => 'Security|admin|safe', 'alias' => 'checkweak'); $lang->admin->menu->cron = array('link' => 'Cron|cron|index', 'subModule' => 'cron'); diff --git a/module/cron/lang/en.php b/module/cron/lang/en.php index 9e60f3d542..23dd843cb6 100644 --- a/module/cron/lang/en.php +++ b/module/cron/lang/en.php @@ -1,5 +1,5 @@ cron->common = 'Cron'; +$lang->cron->common = 'Scheduled Task'; $lang->cron->index = 'Home'; $lang->cron->list = 'Tasks'; $lang->cron->create = 'Add'; @@ -21,7 +21,7 @@ $lang->cron->remark = 'Remark'; $lang->cron->lastTime = 'Last Executed'; $lang->cron->turnonList['1'] = 'On'; -$lang->cron->turnonList['0'] = 'Off'; +$lang->cron->turnonList['0'] = 'Shutdown'; $lang->cron->statusList['normal'] = 'Normal'; $lang->cron->statusList['running'] = 'Running'; @@ -33,14 +33,14 @@ $lang->cron->typeList['system'] = 'System Command'; $lang->cron->toggleList['start'] = 'Activate'; $lang->cron->toggleList['stop'] = 'Deactivate'; -$lang->cron->confirmDelete = 'Do you want to delete the Planned Task?'; +$lang->cron->confirmDelete = 'Do you want to delete the Scheduled Task?'; $lang->cron->confirmTurnon = 'Do you want to truncoff the Cron?'; $lang->cron->introduction = <<Planned Task can do scheduled execution, such as update burndown chart, backup, etc.

              +

              Scheduled Task can do scheduled execution, such as update burndown chart, backup, etc.

              This function need to be improved, so it is turned off by default.

              EOD; $lang->cron->confirmOpen = <<Do you want to turn it on?Turn On Planned Task

              +

              Do you want to turn it on?Turn On Scheduled Task

              EOD; $lang->cron->notice = new stdclass(); @@ -49,5 +49,5 @@ $lang->cron->notice->h = 'Range:0-23'; $lang->cron->notice->dom = 'Range:1-31'; $lang->cron->notice->mon = 'Range:1-12'; $lang->cron->notice->dow = 'Range:0-6'; -$lang->cron->notice->help = 'Note:If the server is restarted, or Planned Task is not working, it means Planned Task has stopped working. You have to click 【Create】 or refresh the page to start the Planned Task. If the last execution time in Task List has changed, it means the Task is started.'; +$lang->cron->notice->help = 'Note:If server restarted, or Scheduled Task is not working, it means Scheduled Task has stopped. You can restart it by clicking 【Restart】 or reload this page. If the last execution time in changed, it means the Task is running.'; $lang->cron->notice->errorRule = '"%s" is not valid'; diff --git a/module/cron/view/index.html.php b/module/cron/view/index.html.php index 901c8a0f45..88fd9a75a6 100644 --- a/module/cron/view/index.html.php +++ b/module/cron/view/index.html.php @@ -30,13 +30,13 @@
              px'> testcase->title;?> priAB;?> typeAB;?>
               case . $lang->colon; if(!common::printLink('testcase', 'view', "case=$run->case", $run->title)) echo $run->title;?> testcase->priList, $run->pri, $run->pri)?>'>testcase->priList, $run->pri, $run->pri);?>
              action->objectType);?>action->objectType);?> idAB);?> action->objectName;?> action->actor);?>backup->time?> backup->files?> backup->size?>actions?>actions?>
              - - - - - + + + + + - + diff --git a/module/install/lang/en.php b/module/install/lang/en.php index c95bab54a1..af3bc742f9 100644 --- a/module/install/lang/en.php +++ b/module/install/lang/en.php @@ -147,18 +147,18 @@ $lang->install->groupList['TOP']['desc'] = 'for Senior Manager'; $lang->install->groupList['OTHERS']['name'] = 'Other'; $lang->install->groupList['OTHERS']['desc'] = 'for Other'; $lang->install->groupList['LIMITED']['name'] = 'Limited User'; -$lang->install->groupList['LIMITED']['desc'] = 'for Limited user (editing only content related to itself)'; +$lang->install->groupList['LIMITED']['desc'] = 'Only edit contents related to themselves'; $lang->install->cronList[''] = 'Monitor cron'; $lang->install->cronList['moduleName=project&methodName=computeburn'] = 'Update Burndown Chart'; $lang->install->cronList['moduleName=report&methodName=remind'] = 'Daily task reminder'; $lang->install->cronList['moduleName=svn&methodName=run'] = 'Synchronize SVN'; $lang->install->cronList['moduleName=git&methodName=run'] = 'Synchronize GIT'; -$lang->install->cronList['moduleName=backup&methodName=backup'] = 'Backup'; -$lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Asynchronous sending'; -$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Asynchronous seding Webhook'; +$lang->install->cronList['moduleName=backup&methodName=backup'] = 'Backup data&file'; +$lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Async sending Message'; +$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Async sending Webhook'; $lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Delete overdue log'; -$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Create cycle todos.'; +$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Create periodic todos'; $lang->install->success = "Installed!"; $lang->install->login = 'Login ZenTao'; diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 5db659c69c..e91b42e044 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -74,6 +74,11 @@ $lang->misc->feature = new stdclass(); $lang->misc->feature->lastest = 'Latest Version'; $lang->misc->feature->detailed = 'Details'; +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'Message centralized management', 'desc' => '

              Centring Mail,SMS,webhook into Message

              '); +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'Add Periodic Todo function', 'desc' => ''); +$lang->misc->feature->all['9.8.stable'][] = array('title'=>"Add Block of 'Assigned to Me'", 'desc' => ''); +$lang->misc->feature->all['9.8.stable'][] = array('title'=>'Support Generating TestStatements of TestBuilds', 'desc' => ''); + $lang->misc->feature->all['9.7.stable'][] = array('title'=>'optimize International package,Added Demo data。', 'desc' => ''); $lang->misc->feature->all['9.6.stable'][] = array('title'=>'added Webhook Interface feature', 'desc' => 'support communication with BearyChat,dingding'); diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 9e88ab4704..a9307e0581 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -71,9 +71,9 @@ $lang->product->whitelist = 'Whitelist'; $lang->product->branch = '%s'; $lang->product->searchStory = 'Search'; -$lang->product->assignedToMe = 'AssignedToMe'; -$lang->product->openedByMe = 'CreatedByMe'; -$lang->product->reviewedByMe = 'ReviewedByMe'; +$lang->product->assignedToMe = 'Assigned To Me'; +$lang->product->openedByMe = 'Created By Me'; +$lang->product->reviewedByMe = 'Reviewed By Me'; $lang->product->closedByMe = 'ClosedByMe'; $lang->product->draftStory = 'Draft'; $lang->product->activeStory = 'Activated'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 7d732b3095..0a6061e952 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -184,7 +184,7 @@ $lang->project->beginAndEnd = 'Duration'; $lang->project->lblStats = 'Man-Hour Summary(h) : '; $lang->project->stats = '%s Available, %s Total Estimated, %s Cost, %s Left.'; $lang->project->taskSummary = "Tasks on this page : %s Total, %s Wait, %s Doing;     Hours : %s Est., %s Cost, %s Left."; -$lang->project->checkedSummary = " %total% Checked, %wait% Wait, %doing% Doing, %estimate% Hour(s) Estimated, %consumed% Hour(s) Cost, %left% Hour(s) Left."; +$lang->project->checkedSummary = " %total% Checked, %wait% Wait, %doing% Doing; Hours: %estimate% Est., %consumed% Cost, %left% Left."; $lang->project->memberHours = "%s has %s Hour(s) available "; $lang->project->groupSummary = "%s Tasks in this group, Wait %s, Doing %s. %s Hour(s) Estimated , %s Hour(s) Cost, %s Hour(s) Left."; $lang->project->groupSummaryAB = "Tasks:%s Total,%s Wait, %s Doing.
              Hours: %s Est., %s Cost,%s Left."; diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php index e092b0fbd5..bf9b78efa8 100644 --- a/module/project/view/view.html.php +++ b/module/project/view/view.html.php @@ -74,7 +74,7 @@ project->basicInfo?>
              cron->m?>cron->h?>cron->dom?>cron->mon?>cron->dow?>cron->m?>cron->h?>cron->dom?>cron->mon?>cron->dow?> cron->command?>cron->remark?>cron->remark?> cron->lastTime?> cron->status?> actions;?>
              - + diff --git a/module/user/view/edit.html.php b/module/user/view/edit.html.php index f1d93fe75b..80a5c33c43 100644 --- a/module/user/view/edit.html.php +++ b/module/user/view/edit.html.php @@ -105,7 +105,7 @@
              project->name;?>project->name;?> name;?>
              - +
              user->verify;?>
              user->verifyPassword;?>user->verifyPassword;?>
              user->placeholder->verify}'");?> From 18b6e57e84c55ded2aa0b5f6c34e428e2e2e5728 Mon Sep 17 00:00:00 2001 From: dajiao007 Date: Wed, 17 Jan 2018 16:09:19 +0800 Subject: [PATCH 134/206] modify translations of 'unconfirmed bug' --- module/bug/lang/en.php | 3 ++- module/bug/lang/zh-cn.php | 3 ++- module/bug/lang/zh-tw.php | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index dd89517a59..d11e141768 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -110,6 +110,7 @@ $lang->bug->assignToNull = 'Unassigned'; $lang->bug->unResolved = 'Unresolved'; $lang->bug->toClosed = 'WaitForClose'; $lang->bug->unclosed = 'Active'; +$lang->bug->unconfirmed = 'UnConfirmed'; $lang->bug->longLifeBugs = 'Pending'; $lang->bug->postponedBugs = 'Postponed'; $lang->bug->overdueBugs = 'Overdue'; @@ -378,7 +379,7 @@ $lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs; $lang->bug->featureBar['browse']['my'] = $lang->bug->my; -$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; +$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->unconfirmed; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; $lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 5d083fde46..f447a8f288 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -110,6 +110,7 @@ $lang->bug->assignToNull = '未指派'; $lang->bug->unResolved = '未解决'; $lang->bug->toClosed = '待关闭'; $lang->bug->unclosed = '未关闭'; +$lang->bug->unconfirmed = '未确认'; $lang->bug->longLifeBugs = '久未处理'; $lang->bug->postponedBugs = '被延期'; $lang->bug->overdueBugs = '过期Bug'; @@ -378,7 +379,7 @@ $lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe; $lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe; $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe; -$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; +$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->unconfirmed; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; $lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed; diff --git a/module/bug/lang/zh-tw.php b/module/bug/lang/zh-tw.php index 09cf315aa3..e4b4e702e4 100644 --- a/module/bug/lang/zh-tw.php +++ b/module/bug/lang/zh-tw.php @@ -110,6 +110,7 @@ $lang->bug->assignToNull = '未指派'; $lang->bug->unResolved = '未解決'; $lang->bug->toClosed = '待關閉'; $lang->bug->unclosed = '未關閉'; +$lang->bug->unconfirmed = '未確認'; $lang->bug->longLifeBugs = '久未處理'; $lang->bug->postponedBugs = '被延期'; $lang->bug->overdueBugs = '過期Bug'; @@ -378,7 +379,7 @@ $lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe; $lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe; $lang->bug->featureBar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe; -$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; +$lang->bug->featureBar['browse']['unconfirmed'] = $lang->bug->unconfirmed; $lang->bug->featureBar['browse']['assigntonull'] = $lang->bug->assignToNull; $lang->bug->featureBar['browse']['unresolved'] = $lang->bug->unResolved; $lang->bug->featureBar['browse']['toclosed'] = $lang->bug->toClosed; From 95ce4d6f70017673a0f260c95911457a87a1f27c Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 18 Jan 2018 10:16:46 +0800 Subject: [PATCH 135/206] * change for demo. --- db/demo.sql | 30 +++++++++---------- db/endemo.sql | 20 ++++++------- module/block/control.php | 21 ++++++++++--- .../block/view/printassigntomeblock.html.php | 22 ++++---------- module/bug/lang/zh-cn.php | 2 +- module/bug/lang/zh-tw.php | 2 +- module/common/lang/zh-tw.php | 1 + module/message/control.php | 6 ++-- module/message/css/setting.css | 2 +- module/misc/lang/zh-tw.php | 5 ++++ module/project/js/kanban.js | 4 +++ module/report/lang/zh-tw.php | 4 +-- module/testcase/lang/zh-tw.php | 5 ++-- module/todo/lang/en.php | 2 +- module/todo/lang/zh-cn.php | 2 +- module/todo/lang/zh-tw.php | 4 +-- 16 files changed, 72 insertions(+), 60 deletions(-) diff --git a/db/demo.sql b/db/demo.sql index 76fd161119..6c1f840f20 100644 --- a/db/demo.sql +++ b/db/demo.sql @@ -267,21 +267,21 @@ INSERT INTO `zt_task` (`id`, `project`, `story`, `storyVersion`, `fromBug`, `nam INSERT INTO `zt_task` (`id`, `project`, `story`, `storyVersion`, `fromBug`, `name`, `type`, `pri`, `estimate`, `consumed`, `left`, `deadline`, `status`, `mailto`, `desc`, `openedBy`, `openedDate`, `assignedTo`, `assignedDate`, `finishedBy`, `finishedDate`, `canceledBy`, `canceledDate`, `closedBy`, `closedDate`, `closedReason`, `lastEditedBy`, `lastEditedDate`, `deleted`) VALUES(8, 1, 4, 1, 0, '售后服务的开发', 'devel', 1, 8, 6, 0, '0000-00-00', 'cancel', '', '售后服务的开发
              ', 'projectManager', '2012-06-05 10:34:45', 'projectManager', '2012-06-05 10:41:20', 'dev1', '0000-00-00 00:00:00', 'dev1', '2012-06-05 10:41:20', '', '0000-00-00 00:00:00', '', 'dev1', '2012-06-05 10:41:20', '0'); INSERT INTO `zt_task` (`id`, `project`, `story`, `storyVersion`, `fromBug`, `name`, `type`, `pri`, `estimate`, `consumed`, `left`, `deadline`, `status`, `mailto`, `desc`, `openedBy`, `openedDate`, `assignedTo`, `assignedDate`, `finishedBy`, `finishedDate`, `canceledBy`, `canceledDate`, `closedBy`, `closedDate`, `closedReason`, `lastEditedBy`, `lastEditedDate`, `deleted`) VALUES(9, 1, 4, 1, 0, '售后服务的开发', 'devel', 1, 8, 0, 8, '0000-00-00', 'cancel', '', '售后服务的开发
              ', 'projectManager', '2012-06-05 10:35:01', 'projectManager', '2012-06-05 10:41:20', '', '0000-00-00 00:00:00', 'dev1', '2012-06-05 10:41:20', '', '0000-00-00 00:00:00', '', 'dev1', '2012-06-05 10:41:20', '0'); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'dev3', '研发', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'productManager', '产品经理', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'tester2', '测试', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'tester1', '测试', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'projectManager', '项目经理', '2013-02-20', 365, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'tester2', '测试', '2013-02-20', 365, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'tester1', '测试', '2013-02-20', 365, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'dev3', '研发', '2013-02-20', 365, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'dev2', '研发', '2013-02-20', 365, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'dev1', '研发', '2013-02-20', 365, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'dev1', '研发', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'dev2', '研发', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'projectManager', '项目经理', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'testManager', '测试主管', '2013-02-20', 184, 7); -INSERT INTO `zt_team` (`project`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'productManager', '产品经理', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'dev3', '研发', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'productManager', '产品经理', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'tester2', '测试', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'tester1', '测试', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'projectManager', '项目经理', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'tester2', '测试', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'tester1', '测试', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'dev3', '研发', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'dev2', '研发', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'dev1', '研发', '2013-02-20', 365, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'dev1', '研发', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'dev2', '研发', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'projectManager', '项目经理', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(1, 'project', 'testManager', '测试主管', '2013-02-20', 184, 7); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `join`, `days`, `hours`) VALUES(2, 'project', 'productManager', '产品经理', '2013-02-20', 365, 7); INSERT INTO `zt_testresult` (`id`, `run`, `case`, `version`, `caseResult`, `stepResults`, `lastRunner`, `date`) VALUES(1, 4, 1, 1, 'pass', 'a:1:{i:1;a:2:{s:6:"result";s:4:"pass";s:4:"real";s:0:"";}}', 'testManager', '2012-06-05 11:11:00'); INSERT INTO `zt_testresult` (`id`, `run`, `case`, `version`, `caseResult`, `stepResults`, `lastRunner`, `date`) VALUES(2, 3, 2, 1, 'pass', 'a:1:{i:2;a:2:{s:6:"result";s:4:"pass";s:4:"real";s:0:"";}}', 'testManager', '2012-06-05 11:11:05'); diff --git a/db/endemo.sql b/db/endemo.sql index 236a16b9a6..fcee2c8d39 100644 --- a/db/endemo.sql +++ b/db/endemo.sql @@ -306,16 +306,16 @@ INSERT INTO `zt_taskestimate` (`id`, `task`, `date`, `left`, `consumed`, `accoun (10, 5, '2017-12-12', 0, 30, 'pg1', NULL), (11, 9, '2017-12-13', 50, 8, 'pg3', 'Finish page design'); -INSERT INTO `zt_team` (`project`, `task`, `account`, `role`, `limited`, `join`, `days`, `hours`, `estimate`, `consumed`, `left`, `order`) VALUES -(1, 0, 'thePO', 'Product Owner', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(1, 0, 'pm1', 'Project Manager', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(1, 0, 'pg2', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(1, 0, 'pg3', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(1, 0, 'qa1', 'Tester', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(2, 0, 'pm1', 'Project Manager', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(2, 0, 'pg1', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(2, 0, 'pg2', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), -(2, 0, 'pg3', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0); +INSERT INTO `zt_team` (`root`, `type`, `account`, `role`, `limited`, `join`, `days`, `hours`, `estimate`, `consumed`, `left`, `order`) VALUES +(1, 'project', 'thePO', 'Product Owner', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(1, 'project', 'pm1', 'Project Manager', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(1, 'project', 'pg2', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(1, 'project', 'pg3', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(1, 'project', 'qa1', 'Tester', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(2, 'project', 'pm1', 'Project Manager', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(2, 'project', 'pg1', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(2, 'project', 'pg2', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0), +(2, 'project', 'pg3', 'Developer', 'no', '2017-12-12', 10, 7.0, 0.00, 0.00, 0.00, 0); INSERT INTO `zt_testresult` (`id`, `run`, `case`, `version`, `caseResult`, `stepResults`, `lastRunner`, `date`) VALUES (1, 1, 2, 1, 'fail', 'a:3:{i:3;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}i:4;a:2:{s:6:\"result\";s:4:\"fail\";s:4:\"real\";s:24:\"Not all 400 page is displayed.\";}i:5;a:2:{s:6:\"result\";s:4:\"pass\";s:4:\"real\";s:0:\"\";}}', 'qa1', '2017-12-13 00:08:52'), diff --git a/module/block/control.php b/module/block/control.php index 21e01c131b..d880121b34 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -664,28 +664,38 @@ class block extends control $todo->begin = date::formatTime($todo->begin); $todo->end = date::formatTime($todo->end); } + if(empty($todos)) unset($hasViewPriv['todo']); $this->view->todos = $todos; } if(isset($hasViewPriv['story'])) { $this->app->loadLang('story'); - $this->view->stories = $this->dao->select('*')->from(TABLE_STORY)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->orderBy('id_desc')->fetchAll(); + $stories = $this->dao->select('*')->from(TABLE_STORY)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->orderBy('id_desc')->fetchAll(); + + if(empty($stories)) unset($hasViewPriv['story']); + $this->view->stories = $stories; } if(isset($hasViewPriv['task'])) { $this->app->loadLang('task'); - $this->view->tasks = $this->dao->select('*')->from(TABLE_TASK)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->orderBy('id_desc')->fetchAll(); + $tasks = $this->dao->select('*')->from(TABLE_TASK)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->orderBy('id_desc')->fetchAll(); + + if(empty($tasks)) unset($hasViewPriv['task']); + $this->view->tasks = $tasks; } if(isset($hasViewPriv['bug'])) { $this->app->loadLang('bug'); - $this->view->bugs = $this->dao->select('*')->from(TABLE_BUG)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->orderBy('id_desc')->fetchAll(); + $bugs = $this->dao->select('*')->from(TABLE_BUG)->where('assignedTo')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->orderBy('id_desc')->fetchAll(); + + if(empty($bugs)) unset($hasViewPriv['bug']); + $this->view->bugs = $bugs; } if(isset($hasViewPriv['case'])) { $this->app->loadLang('testcase'); $this->app->loadLang('testtask'); - $this->view->cases = $this->dao->select('t1.assignedTo AS assignedTo, t2.*')->from(TABLE_TESTRUN)->alias('t1') + $cases = $this->dao->select('t1.assignedTo AS assignedTo, t2.*')->from(TABLE_TESTRUN)->alias('t1') ->leftJoin(TABLE_CASE)->alias('t2')->on('t1.case = t2.id') ->leftJoin(TABLE_TESTTASK)->alias('t3')->on('t1.task = t3.id') ->Where('t1.assignedTo')->eq($this->app->user->account) @@ -695,6 +705,9 @@ class block extends control ->andWhere('t2.deleted')->eq(0) ->orderBy('id_desc') ->fetchAll(); + + if(empty($cases)) unset($hasViewPriv['case']); + $this->view->cases = $cases; } $this->view->hasViewPriv = $hasViewPriv; diff --git a/module/block/view/printassigntomeblock.html.php b/module/block/view/printassigntomeblock.html.php index ceb9463d00..b04474aeb9 100644 --- a/module/block/view/printassigntomeblock.html.php +++ b/module/block/view/printassigntomeblock.html.php @@ -10,24 +10,12 @@ * @link http://www.zentao.net */ ?> -
              - -
              - -
              -
              -
              - $bool):?> -
              " id=""> - -
              - -
              +
              + $bool):?> +
              " id=""> +
              +
              getExtViewFile(__FILE__)){include $extView; return helper::cd();}?> - \ No newline at end of file + diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index acf66b64cc..0e9ef50327 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -109,7 +109,10 @@ $lang->menu->qa = '测试|qa|index'; $lang->menu->doc = '文档|doc|index'; $lang->menu->report = '统计|report|index'; $lang->menu->company = '组织|company|index'; -$lang->menu->admin = '后台|admin|index'; + +$lang->adminMenu = '后台|admin|index'; + +$lang->dividerMenu = ',qa,'; /* 查询条中可以选择的对象列表。*/ $lang->searchObjects['bug'] = 'Bug'; @@ -163,7 +166,6 @@ $lang->index->menu->project = "浏览{$lang->projectCommon}|project|browse"; $lang->my = new stdclass(); $lang->my->menu = new stdclass(); -$lang->my->menu->account = array('link' => ' %s' . $lang->arrow . '', 'fixed' => true); $lang->my->menu->index = '首页|my|index'; $lang->my->menu->todo = array('link' => '待办|my|todo|', 'subModule' => 'todo'); $lang->my->menu->task = array('link' => '任务|my|task|', 'subModule' => 'task'); diff --git a/module/common/model.php b/module/common/model.php index 51533490bd..68a1a373c0 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -236,7 +236,7 @@ class commonModel extends model { $isGuest = $app->user->account == 'guest'; - echo "
              - diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php index b19e9cf3b2..895a73e019 100644 --- a/module/block/view/caseblock.html.php +++ b/module/block/view/caseblock.html.php @@ -36,6 +36,3 @@
              - diff --git a/module/block/view/planblock.html.php b/module/block/view/planblock.html.php index 5d5a56c8b4..c6ccb9c230 100644 --- a/module/block/view/planblock.html.php +++ b/module/block/view/planblock.html.php @@ -34,6 +34,3 @@
              - diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php index 309018596d..826431eaef 100644 --- a/module/block/view/productblock.html.php +++ b/module/block/view/productblock.html.php @@ -42,6 +42,3 @@ - diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php index ac4b9fd2e3..b3e89fc5d3 100644 --- a/module/block/view/projectblock.html.php +++ b/module/block/view/projectblock.html.php @@ -13,18 +13,23 @@ config->webRoot . 'js/';?> +grid >= 6;?>
              - +
              - - + + + + + + @@ -35,21 +40,28 @@ $viewLink = $this->createLink('project', 'task', 'project=' . $project->id); ?> > - + + delay)):?> - + - + - - + + + @@ -60,32 +72,6 @@ $(function() { var $projectbox = $('#'); var $sparks = $projectbox.find('.spark'); - $sparks.filter(':lt(6)').addClass('sparked').projectLine(); - $sparks = $sparks.not('.sparked'); - var rowHeight = $sparks.first().closest('tr').outerHeight() - ($.zui.browser.ie === 8 ? 0.3 : 0); - - var scrollFn = false, scrollStart = 6, i, id, $spark; - $projectbox.parent().on('scroll.spark', function(e) - { - if(!$sparks.length) - { - $projectbox.off('scroll.spark'); - return; - } - if(scrollFn) clearTimeout(scrollFn); - - scrollFn = setTimeout(function() - { - for(i = scrollStart; i <= scrollStart + 10; i++) - { - id = '#spark-' + i; - $spark = $(id); - if($spark.hasClass('sparked')) continue; - $spark.addClass('sparked').projectLine(); - $sparks = $sparks.not(id); - } - scrollStart += 10; - },100); - }); + $sparks.addClass('sparked').projectLine(); }); diff --git a/module/block/view/releaseblock.html.php b/module/block/view/releaseblock.html.php index d26e1e478d..d72cf68e89 100644 --- a/module/block/view/releaseblock.html.php +++ b/module/block/view/releaseblock.html.php @@ -36,6 +36,3 @@
              project->name;?>project->end;?>statusAB;?>project->end;?>statusAB;?> project->totalEstimate;?> project->totalConsumed;?> project->totalLeft;?> project->progress;?> project->burn;?>
              createLink('project', 'task', 'project=' . $project->id), $project->name, '', "title='$project->name'");?>createLink('project', 'task', 'project=' . $project->id), $project->name, '', "title='$project->name'");?> end;?> project->delayed;?> project->delayed;?> project->statusList[$project->status];?> project->statusList[$project->status];?> hours->totalEstimate;?> hours->totalConsumed;?> hours->totalLeft;?> - - hours->progress;?>% + + +
              +
              + hours->progress;?>% +
              +
              burns);?>'>burns);?>'>
              - diff --git a/module/block/view/storyblock.html.php b/module/block/view/storyblock.html.php index f6c1602b24..2dc0142b69 100644 --- a/module/block/view/storyblock.html.php +++ b/module/block/view/storyblock.html.php @@ -36,6 +36,3 @@ - diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index 60c6eafb32..806210a534 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -39,6 +39,3 @@ td.delayed{background: #e84e0f!important; color: white;} - diff --git a/module/block/view/testtaskblock.html.php b/module/block/view/testtaskblock.html.php index b4dc0d55fd..80c1e243c8 100644 --- a/module/block/view/testtaskblock.html.php +++ b/module/block/view/testtaskblock.html.php @@ -36,6 +36,3 @@ - diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php index 868393caae..d6871fc080 100644 --- a/module/block/view/todoblock.html.php +++ b/module/block/view/todoblock.html.php @@ -34,6 +34,3 @@ - From 6a85480785687bcbd354517e3a7289cadbcf1c36 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 25 Jan 2018 14:22:57 +0800 Subject: [PATCH 150/206] * adjust for block. --- module/block/config.php | 7 ------- module/block/js/dashboard.js | 23 +++++++++++++++-------- module/block/lang/en.php | 5 ++++- module/block/lang/zh-cn.php | 7 +++++-- module/block/view/bugblock.html.php | 2 +- module/block/view/buildblock.html.php | 2 +- module/block/view/caseblock.html.php | 2 +- module/block/view/dashboard.html.php | 6 ++---- module/block/view/planblock.html.php | 2 +- module/block/view/productblock.html.php | 2 +- module/block/view/projectblock.html.php | 2 +- module/block/view/publicform.html.php | 2 +- module/block/view/releaseblock.html.php | 2 +- module/block/view/storyblock.html.php | 2 +- module/block/view/taskblock.html.php | 2 +- module/block/view/testtaskblock.html.php | 2 +- module/block/view/todoblock.html.php | 2 +- module/common/model.php | 3 ++- www/js/my.full.js | 2 +- 19 files changed, 41 insertions(+), 36 deletions(-) diff --git a/module/block/config.php b/module/block/config.php index 16b7ffefad..4d42c10ddc 100644 --- a/module/block/config.php +++ b/module/block/config.php @@ -12,10 +12,3 @@ $config->block = new stdclass(); $config->block->editor = new stdclass(); $config->block->editor->set = array('id' => 'html', 'tools' => 'simple'); - -$config->block->gridOptions[6] = '1/2'; -$config->block->gridOptions[4] = '1/3'; -$config->block->gridOptions[8] = '2/3'; -$config->block->gridOptions[3] = '1/4'; -$config->block->gridOptions[9] = '3/4'; -$config->block->gridOptions[12] = '100%'; diff --git a/module/block/js/dashboard.js b/module/block/js/dashboard.js index a2cc707832..cad8d173c9 100644 --- a/module/block/js/dashboard.js +++ b/module/block/js/dashboard.js @@ -7,14 +7,21 @@ */ function deleteBlock(index) { - $.getJSON(createLink('block', 'delete', 'index=' + index + '&module=' + module), function(data) - { - if(data.result != 'success') - { - alert(data.message); - return false; - } - }) + if(confirm(config.confirmRemoveBlock)) + { + $.getJSON(createLink('block', 'delete', 'index=' + index + '&module=' + module), function(data) + { + if(data.result != 'success') + { + alert(data.message); + return false; + } + else + { + $('#block' + index).remove(); + } + }); + } } /** diff --git a/module/block/lang/en.php b/module/block/lang/en.php index c875e1fa03..8f86bb1002 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -46,7 +46,7 @@ $lang->block->params->value = 'Value'; $lang->block->createBlock = 'Add'; $lang->block->editBlock = 'Edit'; $lang->block->ordersSaved = 'Order is saved.'; -$lang->block->confirmRemoveBlock = 'Do you want to remove Block【{0}】?'; +$lang->block->confirmRemoveBlock = 'Do you want to remove Block?'; $lang->block->closeForever = 'Permanent Close'; $lang->block->confirmClose = 'Do you want to permanently close this block? Once done, it is not available to anyone. It can be activiated at Admin->Custom.'; $lang->block->remove = 'Remove'; @@ -324,6 +324,9 @@ $lang->block->welcomeList['11:30'] = 'Good noon, %s'; $lang->block->welcomeList['13:30'] = 'Good afternoon, %s'; $lang->block->welcomeList['19:00'] = 'Good evening, %s'; +$lang->block->gridOptions[8] = 'Left'; +$lang->block->gridOptions[4] = 'Right'; + $lang->block->flowchart = array(); $lang->block->flowchart[] = array('Administration', 'Manage a Company', 'Add Users', 'Maintain Privileges'); $lang->block->flowchart[] = array($lang->productCommon . ' Manager', 'Add ' . $lang->productCommon, 'Maintain Modules', 'Maintain Plans', 'Maintain Stories', 'Create Release'); diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index 50cb2916ac..86233e5c59 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -13,7 +13,7 @@ $lang->block = new stdclass(); $lang->block->common = '区块'; $lang->block->name = '区块名称'; $lang->block->style = '外观'; -$lang->block->grid = '宽度'; +$lang->block->grid = '位置'; $lang->block->color = '颜色'; $lang->block->account = '所属用户'; @@ -48,7 +48,7 @@ $lang->block->params->value = '参数值'; $lang->block->createBlock = '添加区块'; $lang->block->editBlock = '编辑区块'; $lang->block->ordersSaved = '排序已保存'; -$lang->block->confirmRemoveBlock = '确定移除区块【{0}】吗?'; +$lang->block->confirmRemoveBlock = '确定移除区块吗?'; $lang->block->closeForever = '永久关闭'; $lang->block->confirmClose = '确定永久关闭该区块吗?闭后所有人都将无法使用该区块,可以在后台自定义中打开'; $lang->block->remove = '移除'; @@ -326,6 +326,9 @@ $lang->block->welcomeList['11:30'] = '%s,中文好!'; $lang->block->welcomeList['13:30'] = '%s,下午好!'; $lang->block->welcomeList['19:00'] = '%s,晚上好!'; +$lang->block->gridOptions[8] = '左侧'; +$lang->block->gridOptions[4] = '右侧'; + $lang->block->flowchart = array(); $lang->block->flowchart[] = array('管理员', '维护公司', '添加用户', '维护权限'); $lang->block->flowchart[] = array($lang->productCommon . '经理', '创建' . $lang->productCommon, '维护模块', '维护计划', '维护需求', '创建发布'); diff --git a/module/block/view/bugblock.html.php b/module/block/view/bugblock.html.php index 2ddc84a9b7..74474d859d 100644 --- a/module/block/view/bugblock.html.php +++ b/module/block/view/bugblock.html.php @@ -10,7 +10,7 @@ * @link http://www.ranzhi.org */ ?> - +
              diff --git a/module/block/view/buildblock.html.php b/module/block/view/buildblock.html.php index e563cc2050..69fde24086 100644 --- a/module/block/view/buildblock.html.php +++ b/module/block/view/buildblock.html.php @@ -10,7 +10,7 @@ * @link http://www.ranzhi.org */ ?> -
              idAB?>
              +
              diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php index 895a73e019..38c23838c3 100644 --- a/module/block/view/caseblock.html.php +++ b/module/block/view/caseblock.html.php @@ -10,7 +10,7 @@ * @link http://www.ranzhi.org */ ?> -
              idAB?>
              +
              diff --git a/module/block/view/dashboard.html.php b/module/block/view/dashboard.html.php index 240d73754b..ac6bd21cb8 100644 --- a/module/block/view/dashboard.html.php +++ b/module/block/view/dashboard.html.php @@ -37,13 +37,12 @@ $useGuest = $this->app->user->account == 'guest';
              idAB?>
              +
              diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php index 826431eaef..0ac1f2f434 100644 --- a/module/block/view/productblock.html.php +++ b/module/block/view/productblock.html.php @@ -10,7 +10,7 @@ * @link http://www.zentao.net */ ?> -
              idAB?>
              +
              diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php index b3e89fc5d3..50747e0e48 100644 --- a/module/block/view/projectblock.html.php +++ b/module/block/view/projectblock.html.php @@ -15,7 +15,7 @@ grid >= 6;?>
              -
              product->name;?>
              +
              diff --git a/module/block/view/publicform.html.php b/module/block/view/publicform.html.php index 1750271339..012526a78c 100644 --- a/module/block/view/publicform.html.php +++ b/module/block/view/publicform.html.php @@ -20,7 +20,7 @@
              block->grid;?> - block->gridOptions, $block ? $block->grid : 4, "class='form-control'")?> + block->gridOptions, $block ? $block->grid : 8, "class='form-control'")?>
              params->color) ? 'btn-' . $block->params->color : 'btn-default'?>
              project->name;?>
              +
              diff --git a/module/block/view/storyblock.html.php b/module/block/view/storyblock.html.php index 2dc0142b69..6bc9f9a126 100644 --- a/module/block/view/storyblock.html.php +++ b/module/block/view/storyblock.html.php @@ -10,7 +10,7 @@ * @link http://www.ranzhi.org */ ?> -
              idAB?>
              +
              diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index 806210a534..61b3e88b56 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -13,7 +13,7 @@ -
              idAB?>
              +
              diff --git a/module/block/view/testtaskblock.html.php b/module/block/view/testtaskblock.html.php index 80c1e243c8..834bca030b 100644 --- a/module/block/view/testtaskblock.html.php +++ b/module/block/view/testtaskblock.html.php @@ -10,7 +10,7 @@ * @link http://www.ranzhi.org */ ?> -
              idAB?>
              +
              diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php index d6871fc080..7bc263fd74 100644 --- a/module/block/view/todoblock.html.php +++ b/module/block/view/todoblock.html.php @@ -10,7 +10,7 @@ * @link http://www.ranzhi.org */ ?> -
              idAB?>
              +
              diff --git a/module/common/model.php b/module/common/model.php index 68a1a373c0..2f1ce3e5c8 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -500,7 +500,8 @@ class commonModel extends model if($moduleName != 'index') { if(!isset($lang->menu->$mainMenu)) return; - list($menuLabel, $module, $method) = explode('|', $lang->menu->$mainMenu); + $menuLink = $mainMenu == 'admin' ? $lang->adminMenu : $lang->menu->$mainMenu; + list($menuLabel, $module, $method) = explode('|', $menuLink); echo '
            • ' . html::a(helper::createLink($module, $method), $menuLabel) . '
            • '; } else diff --git a/www/js/my.full.js b/www/js/my.full.js index dff96be3c1..0250693b64 100644 --- a/www/js/my.full.js +++ b/www/js/my.full.js @@ -76,7 +76,7 @@ function setSearchBox() function shortcut() { objectType = $('#searchType').attr('value'); - objectValue = $('#searchQuery').attr('value'); + objectValue = $("input[name='searchQuery']").attr('value'); if(objectType && objectValue) { method = objectType == 'testsuite' ? 'library' : 'view'; From baa2e063ea023375d7820895a6e7a30e9a9acc25 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Thu, 25 Jan 2018 15:12:12 +0800 Subject: [PATCH 151/206] * adjust for edit story. --- module/story/model.php | 1 - 1 file changed, 1 deletion(-) diff --git a/module/story/model.php b/module/story/model.php index 8a6620f60d..d7dea79d69 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -494,7 +494,6 @@ class storyModel extends model if(!dao::isError()) { - $this->setStage($storyID); if($story->product != $oldStory->product) { $this->dao->update(TABLE_PROJECTSTORY)->set('product')->eq($story->product)->where('story')->eq($storyID)->exec(); From 5d23ea8e88553fe0228504d838f1b328e1f970b2 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 26 Jan 2018 09:37:00 +0800 Subject: [PATCH 152/206] * change for task #3602. --- module/block/control.php | 13 ++++++++++- module/block/view/bugblock.html.php | 26 ++++++++++++++------- module/block/view/caseblock.html.php | 16 ++++++++++++- module/block/view/productblock.html.php | 31 +++++++++++++++++++------ module/block/view/storyblock.html.php | 20 +++++++++++++--- module/block/view/taskblock.html.php | 16 ++++++++++++- module/product/lang/en.php | 1 + module/product/lang/zh-cn.php | 1 + 8 files changed, 103 insertions(+), 21 deletions(-) diff --git a/module/block/control.php b/module/block/control.php index 37398b8471..fdcedf54f7 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -656,7 +656,18 @@ class block extends control $num = isset($this->params->num) ? (int)$this->params->num : 0; $type = isset($this->params->type) ? $this->params->type : ''; $pager = pager::init(0, $num , 1); - $this->view->productStats = $this->loadModel('product')->getStats('order_desc', $this->viewType != 'json' ? $pager : '', $type); + + $productStats = $this->loadModel('product')->getStats('order_desc', $this->viewType != 'json' ? $pager : '', $type); + $productIdList = array(); + foreach($productStats as $product) $productIdList[] = $product->id; + + $this->view->projects = $this->dao->select('t1.product,t2.name')->from(TABLE_PROJECTPRODUCT)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.project=t2.id') + ->where('t1.product')->in($productIdList) + ->andWhere('t2.deleted')->eq(0) + ->orderBy('t1.project') + ->fetchPairs('product', 'name'); + $this->view->productStats = $productStats; } /** diff --git a/module/block/view/bugblock.html.php b/module/block/view/bugblock.html.php index 74474d859d..bd0db068a6 100644 --- a/module/block/view/bugblock.html.php +++ b/module/block/view/bugblock.html.php @@ -10,15 +10,18 @@ * @link http://www.ranzhi.org */ ?> +grid >= 6;?>
              todo->date?>
              - - - - - - - + + + + + + + + + createLink('bug', 'view', "bugID={$bug->id}"); ?> > + + - +
              idAB?>priAB?> bug->title;?>bug->severityAB?>bug->statusAB;?>
              idAB?>priAB?> bug->title;?>bug->severityAB?>'>bug->statusAB;?>
              id;?> bug->priList, $bug->pri, $bug->pri)?> title?> bug->severityList, $bug->severity, $bug->severity)?>bug->statusList, $bug->status, $bug->status)?> + + + bug->statusList, $bug->status);?> + +
              diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php index 38c23838c3..14277b1e01 100644 --- a/module/block/view/caseblock.html.php +++ b/module/block/view/caseblock.html.php @@ -10,14 +10,19 @@ * @link http://www.ranzhi.org */ ?> +grid >= 6;?> + + + + @@ -27,12 +32,21 @@ $viewLink = $this->createLink('testcase', 'view', "caseID={$case->id}"); ?> > + + + - + +
              idAB?> priAB?> case->title;?> testtask->lastRunTime;?> testtask->lastRunResult;?> statusAB;?>
              id;?> case->priList, $case->pri, $case->pri)?> title?> lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?> lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?>testcase->statusList[$case->status];?> + + + testcase->statusList, $case->status);?> + +
              diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php index 0ac1f2f434..e89dd6f743 100644 --- a/module/block/view/productblock.html.php +++ b/module/block/view/productblock.html.php @@ -10,17 +10,26 @@ * @link http://www.zentao.net */ ?> +grid >= 6;?> - + - + + - - - + + + + + + + + + + @@ -31,12 +40,20 @@ ?> > - + - + + + + + + + + + diff --git a/module/block/view/storyblock.html.php b/module/block/view/storyblock.html.php index 6bc9f9a126..8c253262fb 100644 --- a/module/block/view/storyblock.html.php +++ b/module/block/view/storyblock.html.php @@ -10,15 +10,20 @@ * @link http://www.ranzhi.org */ ?> +grid >= 6;?>
              product->name;?>story->statusList['active'];?> story->statusList['changed'];?>story->statusList['draft'];?> product->plans;?>product->releases;?>product->bugs;?>bug->unResolved;?>product->releases;?>product->currentProject;?>story->statusList['active'];?>product->bugs;?>bug->unResolved;?>
              name?>stories['active']?> stories['changed']?>stories['draft']?> plans?> releases?>id, '');?>stories['active']?> bugs?> unResolved?>
              + + + - + + @@ -27,12 +32,21 @@ $viewLink = $this->createLink('story', 'view', "storyID={$story->id}"); ?> > + + + - + +
              idAB?> priAB?> story->title;?> story->estimateAB;?> statusAB;?>story->stageAB;?>story->stageAB;?>
              id;?> story->priList, $story->pri, $story->pri)?> title?> estimate?>story->statusList, $story->status, $story->status);?> - story->stageList, $story->stage, $story->stage);?> + + + + story->statusList, $story->status);?> + + story->stageList, $story->stage, $story->stage);?>
              diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index 61b3e88b56..98e9741dbe 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -13,14 +13,19 @@ +grid >= 6;?> + + + + @@ -30,12 +35,21 @@ td.delayed{background: #e84e0f!important; color: white;} $viewLink = $this->createLink('task', 'view', "taskID={$task->id}"); ?> > + + + -
              idAB?> priAB?> task->name;?> task->estimateAB;?> task->deadline;?> statusAB;?>
              id;?> task->priList, $task->pri, $task->pri)?> name?> estimate?> '>deadline, 0, 4) > 0) echo $task->deadline;?>task->statusList, $task->status, $task->status);?> + + + + + task->statusList, $task->status);?> + +
              diff --git a/module/product/lang/en.php b/module/product/lang/en.php index a9307e0581..77e950a488 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -43,6 +43,7 @@ $lang->product->doc = 'Doc'; $lang->product->project = $lang->projectCommon . 'List'; $lang->product->build = 'Build'; +$lang->product->currentProject = 'Current Project'; $lang->product->activeStories = 'Activated Story'; $lang->product->changedStories = 'Changed Story'; $lang->product->draftStories = 'Draft Story'; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index c47a0f512c..086cea20db 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -43,6 +43,7 @@ $lang->product->doc = '文档列表'; $lang->product->project = $lang->projectCommon . '列表'; $lang->product->build = '版本列表'; +$lang->product->currentProject = '当前项目'; $lang->product->activeStories = '激活需求'; $lang->product->changedStories = '已变更需求'; $lang->product->draftStories = '草稿需求'; From b241e07d7853397c4fe4cd29b260c046f38b4a74 Mon Sep 17 00:00:00 2001 From: dajiao007 Date: Fri, 26 Jan 2018 09:54:45 +0800 Subject: [PATCH 153/206] change translation of adding user --- module/user/lang/en.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/user/lang/en.php b/module/user/lang/en.php index b7b3d8e557..e8442a91ce 100644 --- a/module/user/lang/en.php +++ b/module/user/lang/en.php @@ -44,7 +44,7 @@ $lang->user->last = 'Last Login'; $lang->user->ranzhi = 'Zdoo Account'; $lang->user->ditto = 'Ditto'; $lang->user->originalPassword = 'Old Password'; -$lang->user->verifyPassword = 'Enter your password'; +$lang->user->verifyPassword = 'Admin password'; $lang->user->resetPassword = 'Forgot Password?'; $lang->user->index = "Home"; From b4ecfb6c697f9d13f77214d0e370eb7e6f47abae Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 26 Jan 2018 10:51:32 +0800 Subject: [PATCH 154/206] * change for welcome block. --- module/block/view/welcome.html.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/module/block/view/welcome.html.php b/module/block/view/welcome.html.php index 6e5136a20e..73333c6b8e 100644 --- a/module/block/view/welcome.html.php +++ b/module/block/view/welcome.html.php @@ -16,10 +16,13 @@

              block->welcomeList[$welcomeType], $app->user->realname)?>

                tutorial->tasks as $taskKey => $task) { + if($i > 3) break; $class = strpos(",$tutorialed,", ",$taskKey,") !== false ? "class='active'" : ''; - echo "
              • " . html::a($this->createLink('tutorial', 'index', "referer=&task=$taskKey"), $task['title']) . "
              • "; + echo "
              • " . html::a($this->createLink('tutorial', 'index', "referer=&task=$taskKey"), $i . '. ' . $task['title']) . "
              • "; + $i++; } ?>
              From f90925b51e4c48abbe5ccf0d5275c4675ec04ded Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 26 Jan 2018 13:07:48 +0800 Subject: [PATCH 155/206] * change for add ext for package. --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 0d3d8eaa7b..b959bce756 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,8 @@ pms: chmod 777 zentaopms/module chmod 777 zentaopms/www chmod a+rx zentaopms/bin/* + mkdir zentaopms/config/ext + for module in `ls zentaopms/module/`; do mkdir zentaopms/module/$$module/ext; done find zentaopms/ -name ext |xargs chmod -R 777 zip -r -9 ZenTaoPMS.$(VERSION).zip zentaopms rm -fr zentaopms From eb11984ef8e7e45fd2333e97b346d75fc7f74ec8 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 26 Jan 2018 15:11:14 +0800 Subject: [PATCH 156/206] * code for new style. --- module/block/view/projectblock.html.php | 4 ++-- module/common/model.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php index 50747e0e48..60e56385b7 100644 --- a/module/block/view/projectblock.html.php +++ b/module/block/view/projectblock.html.php @@ -15,7 +15,7 @@ grid >= 6;?>
              - +
              @@ -53,7 +53,7 @@
              project->name;?>hours->totalLeft;?> -
              +
              hours->progress;?>%
              diff --git a/module/common/model.php b/module/common/model.php index 2f1ce3e5c8..ae81a18f3c 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -515,7 +515,7 @@ class commonModel extends model } foreach($position as $key => $link) { - echo '
            • ' . $link . '
            • '; + echo "
            • " . $link . '
            • '; } echo ''; } From e2dc1c80d9ee9d598d9d7ec34f3e1b5bdea86a6a Mon Sep 17 00:00:00 2001 From: wangyidong Date: Fri, 26 Jan 2018 15:38:28 +0800 Subject: [PATCH 157/206] * add title for company name. --- module/common/view/header.html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/common/view/header.html.php b/module/common/view/header.html.php index 6e230c8abd..32e5d52afb 100755 --- a/module/common/view/header.html.php +++ b/module/common/view/header.html.php @@ -19,7 +19,7 @@ if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile;
              config->sso->redirect)):?> -

              welcome, $app->company->name);?>

              +

              welcome, $app->company->name);?>

              From 4e53c6ef1449f9b6d52452456c23a389382821aa Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Jan 2018 14:08:42 +0800 Subject: [PATCH 158/206] * adjust for block and change for todo block. --- module/action/model.php | 2 +- module/block/control.php | 15 +- module/block/model.php | 12 + module/block/view/bugblock.html.php | 63 +- module/block/view/caseblock.html.php | 81 +- module/block/view/dashboard.html.php | 4 +- module/block/view/productblock.html.php | 99 +- module/block/view/projectblock.html.php | 56 +- module/block/view/storyblock.html.php | 79 +- module/block/view/taskblock.html.php | 84 +- module/block/view/todoblock.html.php | 66 +- module/todo/lang/en.php | 1 + module/todo/lang/zh-cn.php | 1 + www/js/zui/min.js | 3333 ++++++++++++++++++++++- www/theme/default/style.css | 1 - www/theme/zui/css/min.css | 163 +- 16 files changed, 3780 insertions(+), 280 deletions(-) diff --git a/module/action/model.php b/module/action/model.php index 6460b69445..4aff2f30df 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -707,7 +707,7 @@ class actionModel extends model $objectIds = array_unique($objectIds); $table = $this->config->objectTables[$objectType]; $field = $this->config->action->objectNameFields[$objectType]; - if($table != '`zt_todo`') + if($table != TABLE_TODO) { $objectNames[$objectType] = $this->dao->select("id, $field AS name")->from($table)->where('id')->in($objectIds)->fetchPairs(); } diff --git a/module/block/control.php b/module/block/control.php index fdcedf54f7..04298fd39c 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -233,8 +233,15 @@ class block extends control { $block->moreLink = $this->createLink('company', 'dynamic'); } - if($block->grid >= 6) $longBlocks[$key] = $block; - if($block->grid < 6) $shortBlocks[$key] = $block; + + if($this->block->isLongBlock($block)) + { + $longBlocks[$key] = $block; + } + else + { + $shortBlocks[$key] = $block; + } } $this->view->longBlocks = $longBlocks; @@ -402,11 +409,13 @@ class block extends control $this->view->sign = strpos($sso, '?') === false ? '?' : '&'; } + $block = $this->block->getByID($id); + $this->view->longBlock = $this->block->isLongBlock($block); + $this->viewType = (isset($params->viewType) and $params->viewType == 'json') ? 'json' : 'html'; $this->params = $params; $this->view->code = $this->get->blockid; $this->view->title = $this->get->blockTitle; - $this->view->block = $this->block->getByID($id); $func = 'print' . ucfirst($code) . 'Block'; if(method_exists('block', $func)) diff --git a/module/block/model.php b/module/block/model.php index b05b516e77..c14690725a 100644 --- a/module/block/model.php +++ b/module/block/model.php @@ -457,4 +457,16 @@ class blockModel extends model $params->num['control'] = 'input'; return $params; } + + /** + * Check whether long block. + * + * @param object $block + * @access public + * @return book + */ + public function isLongBlock($block) + { + return $block->grid >= 6; + } } diff --git a/module/block/view/bugblock.html.php b/module/block/view/bugblock.html.php index bd0db068a6..f26d5859bc 100644 --- a/module/block/view/bugblock.html.php +++ b/module/block/view/bugblock.html.php @@ -10,37 +10,38 @@ * @link http://www.ranzhi.org */ ?> -grid >= 6;?> - - - +
              +
              + + + + + + + + + + + + + get->entry}'" : ''; + $viewLink = $this->createLink('bug', 'view', "bugID={$bug->id}"); + ?> + > - + - - - - + + + + - - - get->entry}'" : ''; - $viewLink = $this->createLink('bug', 'view', "bugID={$bug->id}"); - ?> - > - - - - - - - - - -
              idAB?>priAB?> bug->title;?>bug->severityAB?>'>bug->statusAB;?>
              idAB?>id;?> priAB?> bug->title;?>bug->severityAB?>'>bug->statusAB;?>bug->priList, $bug->pri, $bug->pri)?>title?>bug->severityList, $bug->severity, $bug->severity)?> + + + bug->statusList, $bug->status);?> + +
              id;?>bug->priList, $bug->pri, $bug->pri)?>title?>bug->severityList, $bug->severity, $bug->severity)?> - - - bug->statusList, $bug->status);?> - -
              + +
              +
              diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php index 14277b1e01..91d08dd9a2 100644 --- a/module/block/view/caseblock.html.php +++ b/module/block/view/caseblock.html.php @@ -10,43 +10,44 @@ * @link http://www.ranzhi.org */ ?> -grid >= 6;?> - - - - - - - - - - - - - - - - - get->entry}'" : ''; - $viewLink = $this->createLink('testcase', 'view', "caseID={$case->id}"); - ?> - > - - - - - - - - - - - - -
              idAB?>priAB?> case->title;?> testtask->lastRunTime;?> testtask->lastRunResult;?>statusAB;?>
              id;?>case->priList, $case->pri, $case->pri)?>title?>lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?>lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?> - - - testcase->statusList, $case->status);?> - -
              +
              + + + + + + + + + + + + + + + + + get->entry}'" : ''; + $viewLink = $this->createLink('testcase', 'view', "caseID={$case->id}"); + ?> + > + + + + + + + + + + + + +
              idAB?>priAB?> case->title;?> testtask->lastRunTime;?> testtask->lastRunResult;?>statusAB;?>
              id;?>case->priList, $case->pri, $case->pri)?>title?>lastRunDate)) echo date(DT_MONTHTIME1, strtotime($case->lastRunDate));?>lastRunResult) echo $lang->testcase->resultList[$case->lastRunResult];?> + + + testcase->statusList, $case->status);?> + +
              +
              diff --git a/module/block/view/dashboard.html.php b/module/block/view/dashboard.html.php index ac6bd21cb8..8344b7416e 100644 --- a/module/block/view/dashboard.html.php +++ b/module/block/view/dashboard.html.php @@ -24,7 +24,7 @@ $useGuest = $this->app->user->account == 'guest'; block->closed) and strpos(",{$config->block->closed},", ",{$block->source}|{$block->block},") !== false) continue;?>
              -
              params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>'> +
              block == 'list') ? 'todoes' : $block->block;?> params->color)) echo 'panel-' . $block->params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>'> block != 'welcome' and $block->block != 'flowchart');?>
              @@ -64,7 +64,7 @@ $useGuest = $this->app->user->account == 'guest'; block->closed) and strpos(",{$config->block->closed},", ",{$block->source}|{$block->block},") !== false) continue;?>
              -
              params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>'> +
              block == 'list') ? 'todoes' : $block->block;?> params->color)) echo 'panel-' . $block->params->color;?>' id='blockid?>' data-id='id?>' data-name='title?>'> block != 'welcome' and $block->block != 'flowchart');?>
              diff --git a/module/block/view/productblock.html.php b/module/block/view/productblock.html.php index e89dd6f743..b2eb2e59a9 100644 --- a/module/block/view/productblock.html.php +++ b/module/block/view/productblock.html.php @@ -10,52 +10,53 @@ * @link http://www.zentao.net */ ?> -grid >= 6;?> - - - - - - - - - - - - - - - - - - - - - - - - get->entry}'" : "class='text-center'"; - $viewLink = $this->createLink('product', 'browse', 'productID=' . $product->id); - ?> - > - - - - - - - - - - - - - - - - - - - -
              product->name;?>story->statusList['changed'];?>product->plans;?>product->releases;?>product->currentProject;?>story->statusList['active'];?>product->bugs;?>bug->unResolved;?>
              name?>stories['changed']?>plans?>releases?>id, '');?>stories['active']?>bugs?>unResolved?>
              +
              + + + + + + + + + + + + + + + + + + + + + + + + get->entry}'" : "class='text-center'"; + $viewLink = $this->createLink('product', 'browse', 'productID=' . $product->id); + ?> + > + + + + + + + + + + + + + + + + + + + +
              product->name;?>story->statusList['changed'];?>product->plans;?>product->releases;?>product->currentProject;?>story->statusList['active'];?>product->bugs;?>bug->unResolved;?>
              name?>stories['changed']?>plans?>releases?>id, '');?>stories['active']?>bugs?>unResolved?>
              +
              diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php index 60e56385b7..1a4d52a6ef 100644 --- a/module/block/view/projectblock.html.php +++ b/module/block/view/projectblock.html.php @@ -10,25 +10,21 @@ * @link http://www.zentao.net */ ?> -config->webRoot . 'js/';?> - - -grid >= 6;?> -
              +
              - - + + - - - - + + + + - + - + @@ -40,19 +36,21 @@ $viewLink = $this->createLink('project', 'task', 'project=' . $project->id); ?> > - - + + - delay)):?> - - - + + + + - - - - - - +
              project->name;?>project->end;?>project->name;?>project->end;?> statusAB;?>project->totalEstimate;?>project->totalConsumed;?>project->totalLeft;?>statusAB;?>project->totalEstimate;?>project->totalConsumed;?>project->totalLeft;?> project->progress;?>project->progress;?> project->burn;?>project->burn;?>
              createLink('project', 'task', 'project=' . $project->id), $project->name, '', "title='$project->name'");?>end;?>createLink('project', 'task', 'project=' . $project->id), $project->name, '', "title='$project->name'");?>end;?> project->delayed;?> project->statusList[$project->status];?> + delay)):?> + project->delayed;?> + + project->statusList[$project->status];?> + + hours->totalEstimate;?>hours->totalConsumed;?>hours->totalLeft;?> hours->totalEstimate;?>hours->totalConsumed;?>hours->totalLeft;?> +
              hours->progress;?>% @@ -60,18 +58,10 @@
              burns);?>'>burns);?>'>
              - diff --git a/module/block/view/storyblock.html.php b/module/block/view/storyblock.html.php index 8c253262fb..06c7a580eb 100644 --- a/module/block/view/storyblock.html.php +++ b/module/block/view/storyblock.html.php @@ -10,43 +10,42 @@ * @link http://www.ranzhi.org */ ?> -grid >= 6;?> - - - - - - - - - - - - - - - - - get->entry}'" : ''; - $viewLink = $this->createLink('story', 'view', "storyID={$story->id}"); - ?> - > - - - - - - - - - - - - -
              idAB?>priAB?> story->title;?>story->estimateAB;?>statusAB;?>story->stageAB;?>
              id;?>story->priList, $story->pri, $story->pri)?>title?>estimate?> - - - story->statusList, $story->status);?> - - story->stageList, $story->stage, $story->stage);?>
              +
              + + + + + + + + + + + + + + + + + get->entry}'" : ''; + $viewLink = $this->createLink('story', 'view', "storyID={$story->id}"); + ?> + > + + story->priList, $story->pri, $story->pri);?> + + + + + + + + + + + +
              idAB?>priAB?>story->title;?>story->estimateAB;?>statusAB;?>story->stageAB;?>
              id;?>title?>estimate?> + story->statusList, $story->status);?> + story->stageList, $story->stage, $story->stage);?>
              +
              diff --git a/module/block/view/taskblock.html.php b/module/block/view/taskblock.html.php index 98e9741dbe..0392fa15a2 100644 --- a/module/block/view/taskblock.html.php +++ b/module/block/view/taskblock.html.php @@ -10,46 +10,44 @@ * @link http://www.ranzhi.org */ ?> - -grid >= 6;?> - - - - - - - - - - - - - - - - - get->entry}'" : ''; - $viewLink = $this->createLink('task', 'view', "taskID={$task->id}"); - ?> - > - - - - - - - - - - - - -
              idAB?>priAB?> task->name;?>task->estimateAB;?>task->deadline;?>statusAB;?>
              id;?>task->priList, $task->pri, $task->pri)?>name?>estimate?>'>deadline, 0, 4) > 0) echo $task->deadline;?> - - - task->statusList, $task->status);?> - -
              +
              + + + + + + + + + + + + + + + + + get->entry}'" : ''; + $viewLink = $this->createLink('task', 'view', "taskID={$task->id}"); + ?> + > + + + + + + + + + + + + +
              idAB?>priAB?> task->name;?>task->estimateAB;?>task->deadline;?>statusAB;?>
              id;?>task->priList, $task->pri, $task->pri)?>name?>estimate?>'>deadline, 0, 4) > 0) echo $task->deadline;?> + + + task->statusList, $task->status);?> + +
              +
              diff --git a/module/block/view/todoblock.html.php b/module/block/view/todoblock.html.php index 7bc263fd74..7badbae89e 100644 --- a/module/block/view/todoblock.html.php +++ b/module/block/view/todoblock.html.php @@ -10,27 +10,45 @@ * @link http://www.ranzhi.org */ ?> - - - - - - - - - - - $todo):?> - get->entry}'" : ''; - $viewLink = $this->createLink('todo', 'view', "todoID={$todo->id}&from=my"); - ?> - > - - - - - - - -
              todo->date?>priAB?> todo->name;?>todo->beginAB;?>todo->endAB;?>
              date == '2030-01-01' ? $lang->todo->periods['future'] : $todo->date;?>todo->priList, $todo->pri, $todo->pri)?>name?>begin?>end?>
              +
              + + +
              + diff --git a/module/todo/lang/en.php b/module/todo/lang/en.php index f3ccb81fca..05a5586136 100644 --- a/module/todo/lang/en.php +++ b/module/todo/lang/en.php @@ -90,6 +90,7 @@ $lang->todo->confirmDelete = "Are you sure to delete this Todo?"; $lang->todo->thisIsPrivate = 'This is a private Todo'; $lang->todo->lblDisableDate = 'Set later.'; $lang->todo->lblBeforeDays = "%s early in advance to be done"; +$lang->todo->lblClickCreate = "Clict to add todo"; $lang->todo->noTodo = 'No this type of Todo.'; $lang->todo->noAssignedTo = "The AssignedTo user can't be empty."; diff --git a/module/todo/lang/zh-cn.php b/module/todo/lang/zh-cn.php index 08846727eb..581e306383 100644 --- a/module/todo/lang/zh-cn.php +++ b/module/todo/lang/zh-cn.php @@ -90,6 +90,7 @@ $lang->todo->confirmDelete = "您确定要删除这条待办吗?"; $lang->todo->thisIsPrivate = '这是一条私人事务。:)'; $lang->todo->lblDisableDate = '暂时不设定时间'; $lang->todo->lblBeforeDays = "提前%s天生成待办"; +$lang->todo->lblClickCreate = "点击添加待办"; $lang->todo->noTodo = '该类型没有待办事务'; $lang->todo->noAssignedTo = '被指派人不能为空'; diff --git a/www/js/zui/min.js b/www/js/zui/min.js index 1c38c272ba..ece6c25b85 100644 --- a/www/js/zui/min.js +++ b/www/js/zui/min.js @@ -1,5 +1,5 @@ /*! - * ZUI: Zentao template - v1.8.1 - 2018-01-21 + * ZUI: Zentao template - v1.8.1 - 2018-01-22 * http://zui.sexy * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2018 cnezsoft.com; Licensed MIT @@ -5752,3 +5752,3334 @@ }(jQuery)); +/* ======================================================================== + * Chart.js: Chart.Core.js [Version: 1.0.2] + * http://chartjs.org/ + * + * ZUI: The file has been changed in ZUI. It will not keep update with the + * official version in the future. + * http://zui.sexy + * ======================================================================== + * Copyright 2015 Nick Downie, Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + * ======================================================================== */ + + +/*! + * Chart.js 1.0.2 + * Copyright 2015 Nick Downie + * Released under the MIT license + * http://chartjs.org/ + */ + +/// ----- ZUI change begin ----- +/// Add jquery object to namespace + +/// (function(){ // Old code +(function($) { + + /// ----- ZUI change end ----- + + + "use strict"; + + //Declare root variable - window in the browser, global on the server + /// ----- ZUI change begin ----- + /// Change root to zui shared object + /// + /// var root = this, // old code + var root = $ && $.zui ? $.zui : this, + /// ----- ZUI change end ----- + previous = root.Chart; + + //Occupy the global variable of Chart, and create a simple base class + var Chart = function(context) { + var chart = this; + this.canvas = context.canvas; + + this.ctx = context; + + //Variables global to the chart + var computeDimension = function(element, dimension) { + if(element['offset' + dimension]) { + return element['offset' + dimension]; + } else { + return document.defaultView.getComputedStyle(element).getPropertyValue(dimension); + } + } + + var width = this.width = computeDimension(context.canvas, 'Width'); + var height = this.height = computeDimension(context.canvas, 'Height'); + + // Firefox requires this to work correctly + context.canvas.width = width; + context.canvas.height = height; + + var width = this.width = context.canvas.width; + var height = this.height = context.canvas.height; + this.aspectRatio = this.width / this.height; + //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. + helpers.retinaScale(this); + + return this; + }; + + //Globally expose the defaults to allow for user updating/changing + Chart.defaults = { + global: { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + // Possible effects are: + // [easeInOutQuart, linear, easeOutBounce, easeInBack, easeInOutQuad, + // easeOutQuart, easeOutQuad, easeInOutBounce, easeOutSine, easeInOutCubic, + // easeInExpo, easeInOutBack, easeInCirc, easeInOutElastic, easeOutBack, + // easeInQuad, easeInOutExpo, easeInQuart, easeOutQuint, easeInOutCirc, + // easeInSine, easeOutExpo, easeOutCirc, easeOutCubic, easeInQuint, + // easeInElastic, easeInOutSine, easeInOutQuint, easeInBounce, + // easeOutElastic, easeInCubic] + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove + showTooltips: true, + + // Boolean - Determines whether to draw built-in tooltip or call custom tooltip function + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + + // String - Template string for single tooltips + multiTooltipTemplate: "<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= value %>", + + // String - Colour behind the legend colour block + multiTooltipKeyBackground: '#fff', + + // Function - Will fire on animation progression. + onAnimationProgress: function() {}, + + // Function - Will fire on animation completion. + onAnimationComplete: function() {} + + } + }; + + //Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + //Global Chart helpers object for utility methods and classes + var helpers = Chart.helpers = {}; + + //-- Basic js utility methods + var each = helpers.each = function(loopable, callback, self) { + var additionalArgs = Array.prototype.slice.call(arguments, 3); + // Check to see if null or undefined firstly. + if(loopable) { + if(loopable.length === +loopable.length) { + var i; + for(i = 0; i < loopable.length; i++) { + callback.apply(self, [loopable[i], i].concat(additionalArgs)); + } + } else { + for(var item in loopable) { + callback.apply(self, [loopable[item], item].concat(additionalArgs)); + } + } + } + }, + clone = helpers.clone = function(obj) { + var objClone = {}; + each(obj, function(value, key) { + if(obj.hasOwnProperty(key)) objClone[key] = value; + }); + return objClone; + }, + extend = helpers.extend = function(base) { + each(Array.prototype.slice.call(arguments, 1), function(extensionObject) { + each(extensionObject, function(value, key) { + if(extensionObject.hasOwnProperty(key)) base[key] = value; + }); + }); + return base; + }, + merge = helpers.merge = function(base, master) { + //Merge properties in left object over to a shallow clone of object right. + var args = Array.prototype.slice.call(arguments, 0); + args.unshift({}); + return extend.apply(null, args); + }, + indexOf = helpers.indexOf = function(arrayToSearch, item) { + if(Array.prototype.indexOf) { + return arrayToSearch.indexOf(item); + } else { + for(var i = 0; i < arrayToSearch.length; i++) { + if(arrayToSearch[i] === item) return i; + } + return -1; + } + }, + where = helpers.where = function(collection, filterCallback) { + var filtered = []; + + helpers.each(collection, function(item) { + if(filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }, + findNextWhere = helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if(!startIndex) { + startIndex = -1; + } + for(var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if(filterCallback(currentItem)) { + return currentItem; + } + } + }, + findPreviousWhere = helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if(!startIndex) { + startIndex = arrayToSearch.length; + } + for(var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if(filterCallback(currentItem)) { + return currentItem; + } + } + }, + inherits = helpers.inherits = function(extensions) { + //Basic javascript inheritance based on the model created in Backbone.js + var parent = this; + var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function() { + return parent.apply(this, arguments); + }; + + var Surrogate = function() { + this.constructor = ChartElement; + }; + Surrogate.prototype = parent.prototype; + ChartElement.prototype = new Surrogate(); + + ChartElement.extend = inherits; + + if(extensions) extend(ChartElement.prototype, extensions); + + ChartElement.__super__ = parent.prototype; + + return ChartElement; + }, + noop = helpers.noop = function() {}, + uid = helpers.uid = (function() { + var id = 0; + return function() { + return "chart-" + id++; + }; + })(), + warn = helpers.warn = function(str) { + //Method for warning of errors + if(window.console && typeof window.console.warn == "function") console.warn(str); + }, + amd = helpers.amd = (typeof define == 'function' && define.amd), + //-- Math methods + isNumber = helpers.isNumber = function(n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }, + max = helpers.max = function(array) { + return Math.max.apply(Math, array); + }, + min = helpers.min = function(array) { + return Math.min.apply(Math, array); + }, + cap = helpers.cap = function(valueToCap, maxValue, minValue) { + if(isNumber(maxValue)) { + if(valueToCap > maxValue) { + return maxValue; + } + } else if(isNumber(minValue)) { + if(valueToCap < minValue) { + return minValue; + } + } + return valueToCap; + }, + getDecimalPlaces = helpers.getDecimalPlaces = function(num) { + if(num % 1 !== 0 && isNumber(num)) { + return num.toString().split(".")[1].length; + } else { + return 0; + } + }, + toRadians = helpers.radians = function(degrees) { + return degrees * (Math.PI / 180); + }, + // Gets the angle from vertical upright to the point about a centre. + getAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x, + distanceFromYCenter = anglePoint.y - centrePoint.y, + radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + + var angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter); + + //If the segment is in the top left quadrant, we need to add another rotation to the angle + if(distanceFromXCenter < 0 && distanceFromYCenter < 0) { + angle += Math.PI * 2; + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }, + aliasPixel = helpers.aliasPixel = function(pixelWidth) { + return(pixelWidth % 2 === 0) ? 0 : 0.5; + }, + splineCurve = helpers.splineCurve = function(FirstPoint, MiddlePoint, AfterPoint, t) { + //Props to Rob Spencer at scaled innovation for his post on splining between points + //http://scaledinnovation.com/analytics/splines/aboutSplines.html + var d01 = Math.sqrt(Math.pow(MiddlePoint.x - FirstPoint.x, 2) + Math.pow(MiddlePoint.y - FirstPoint.y, 2)), + d12 = Math.sqrt(Math.pow(AfterPoint.x - MiddlePoint.x, 2) + Math.pow(AfterPoint.y - MiddlePoint.y, 2)), + fa = t * d01 / (d01 + d12), // scaling factor for triangle Ta + fb = t * d12 / (d01 + d12); + return { + inner: { + x: MiddlePoint.x - fa * (AfterPoint.x - FirstPoint.x), + y: MiddlePoint.y - fa * (AfterPoint.y - FirstPoint.y) + }, + outer: { + x: MiddlePoint.x + fb * (AfterPoint.x - FirstPoint.x), + y: MiddlePoint.y + fb * (AfterPoint.y - FirstPoint.y) + } + }; + }, + calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val) { + return Math.floor(Math.log(val) / Math.LN10); + }, + calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly) { + + //Set a minimum step of two - a point at the top of the graph, and a point at the base + var minSteps = 2, + maxSteps = Math.floor(drawingSize / (textSize * 1.5)), + skipFitting = (minSteps >= maxSteps); + + var maxValue = max(valuesArray), + minValue = min(valuesArray); + + // We need some degree of seperation here to calculate the scales if all the values are the same + // Adding/minusing 0.5 will give us a range of 1. + if(maxValue === minValue) { + maxValue += 0.5; + // So we don't end up with a graph with a negative start value if we've said always start from zero + if(minValue >= 0.5 && !startFromZero) { + minValue -= 0.5; + } else { + // Make up a whole number above the values + maxValue += 0.5; + } + } + + var valueRange = Math.abs(maxValue - minValue), + rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange), + graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphRange = graphMax - graphMin, + stepValue = Math.pow(10, rangeOrderOfMagnitude), + numberOfSteps = Math.round(graphRange / stepValue); + + //If we have more space on the graph we'll use it to give more definition to the data + while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) { + if(numberOfSteps > maxSteps) { + stepValue *= 2; + numberOfSteps = Math.round(graphRange / stepValue); + // Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps. + if(numberOfSteps % 1 !== 0) { + skipFitting = true; + } + } + //We can fit in double the amount of scale points on the scale + else { + //If user has declared ints only, and the step value isn't a decimal + if(integersOnly && rangeOrderOfMagnitude >= 0) { + //If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float + if(stepValue / 2 % 1 === 0) { + stepValue /= 2; + numberOfSteps = Math.round(graphRange / stepValue); + } + //If it would make it a float break out of the loop + else { + break; + } + } + //If the scale doesn't have to be an int, make the scale more granular anyway. + else { + stepValue /= 2; + numberOfSteps = Math.round(graphRange / stepValue); + } + + } + } + + if(skipFitting) { + numberOfSteps = minSteps; + stepValue = graphRange / numberOfSteps; + } + + return { + steps: numberOfSteps, + stepValue: stepValue, + min: graphMin, + max: graphMin + (numberOfSteps * stepValue) + }; + + }, + /* jshint ignore:start */ + // Blows up jshint errors based on the new Function constructor + //Templating methods + //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ + template = helpers.template = function(templateString, valuesObject) { + + // If templateString is function rather than string-template - call the function for valuesObject + + if(templateString instanceof Function) { + return templateString(valuesObject); + } + + var cache = {}; + + function tmpl(str, data) { + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? + cache[str] = cache[str] : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", + "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("<%").join("\t") + .replace(/((^|%>)[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)%>/g, "',$1,'") + .split("\t").join("');") + .split("%>").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');" + ); + + // Provide some basic currying to the user + return data ? fn(data) : fn; + } + return tmpl(templateString, valuesObject); + }, + /* jshint ignore:end */ + generateLabels = helpers.generateLabels = function(templateString, numberOfSteps, graphMin, stepValue) { + var labelsArray = new Array(numberOfSteps); + if(labelTemplateString) { + each(labelsArray, function(val, index) { + labelsArray[index] = template(templateString, { + value: (graphMin + (stepValue * (index + 1))) + }); + }); + } + return labelsArray; + }, + //--Animation methods + //Easing functions adapted from Robert Penner's easing equations + //http://www.robertpenner.com/easing/ + easingEffects = helpers.easingEffects = { + linear: function(t) { + return t; + }, + easeInQuad: function(t) { + return t * t; + }, + easeOutQuad: function(t) { + return -1 * t * (t - 2); + }, + easeInOutQuad: function(t) { + if((t /= 1 / 2) < 1) return 1 / 2 * t * t; + return -1 / 2 * ((--t) * (t - 2) - 1); + }, + easeInCubic: function(t) { + return t * t * t; + }, + easeOutCubic: function(t) { + return 1 * ((t = t / 1 - 1) * t * t + 1); + }, + easeInOutCubic: function(t) { + if((t /= 1 / 2) < 1) return 1 / 2 * t * t * t; + return 1 / 2 * ((t -= 2) * t * t + 2); + }, + easeInQuart: function(t) { + return t * t * t * t; + }, + easeOutQuart: function(t) { + return -1 * ((t = t / 1 - 1) * t * t * t - 1); + }, + easeInOutQuart: function(t) { + if((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t; + return -1 / 2 * ((t -= 2) * t * t * t - 2); + }, + easeInQuint: function(t) { + return 1 * (t /= 1) * t * t * t * t; + }, + easeOutQuint: function(t) { + return 1 * ((t = t / 1 - 1) * t * t * t * t + 1); + }, + easeInOutQuint: function(t) { + if((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t; + return 1 / 2 * ((t -= 2) * t * t * t * t + 2); + }, + easeInSine: function(t) { + return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1; + }, + easeOutSine: function(t) { + return 1 * Math.sin(t / 1 * (Math.PI / 2)); + }, + easeInOutSine: function(t) { + return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1); + }, + easeInExpo: function(t) { + return(t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1)); + }, + easeOutExpo: function(t) { + return(t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1); + }, + easeInOutExpo: function(t) { + if(t === 0) return 0; + if(t === 1) return 1; + if((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1)); + return 1 / 2 * (-Math.pow(2, -10 * --t) + 2); + }, + easeInCirc: function(t) { + if(t >= 1) return t; + return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1); + }, + easeOutCirc: function(t) { + return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t); + }, + easeInOutCirc: function(t) { + if((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1); + return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + easeInElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if(t === 0) return 0; + if((t /= 1) == 1) return 1; + if(!p) p = 1 * 0.3; + if(a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + }, + easeOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if(t === 0) return 0; + if((t /= 1) == 1) return 1; + if(!p) p = 1 * 0.3; + if(a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1; + }, + easeInOutElastic: function(t) { + var s = 1.70158; + var p = 0; + var a = 1; + if(t === 0) return 0; + if((t /= 1 / 2) == 2) return 1; + if(!p) p = 1 * (0.3 * 1.5); + if(a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + if(t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function(t) { + var s = 1.70158; + return 1 * (t /= 1) * t * ((s + 1) * t - s); + }, + easeOutBack: function(t) { + var s = 1.70158; + return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1); + }, + easeInOutBack: function(t) { + var s = 1.70158; + if((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)); + return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + easeInBounce: function(t) { + return 1 - easingEffects.easeOutBounce(1 - t); + }, + easeOutBounce: function(t) { + if((t /= 1) < (1 / 2.75)) { + return 1 * (7.5625 * t * t); + } else if(t < (2 / 2.75)) { + return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75); + } else if(t < (2.5 / 2.75)) { + return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375); + } else { + return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375); + } + }, + easeInOutBounce: function(t) { + if(t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5; + return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5; + } + }, + //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + requestAnimFrame = helpers.requestAnimFrame = (function() { + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(), + cancelAnimFrame = helpers.cancelAnimFrame = (function() { + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(callback) { + return window.clearTimeout(callback, 1000 / 60); + }; + })(), + animationLoop = helpers.animationLoop = function(callback, totalSteps, easingString, onProgress, onComplete, chartInstance) { + + var currentStep = 0, + easingFunction = easingEffects[easingString] || easingEffects.linear; + + var animationFrame = function() { + currentStep++; + var stepDecimal = currentStep / totalSteps; + var easeDecimal = easingFunction(stepDecimal); + + callback.call(chartInstance, easeDecimal, stepDecimal, currentStep); + onProgress.call(chartInstance, easeDecimal, stepDecimal); + if(currentStep < totalSteps) { + chartInstance.animationFrame = requestAnimFrame(animationFrame); + } else { + onComplete.apply(chartInstance); + } + }; + requestAnimFrame(animationFrame); + }, + //-- DOM methods + getRelativePosition = helpers.getRelativePosition = function(evt) { + var mouseX, mouseY; + var e = evt.originalEvent || evt, + canvas = evt.currentTarget || evt.srcElement, + boundingRect = canvas.getBoundingClientRect(); + + if(e.touches) { + mouseX = e.touches[0].clientX - boundingRect.left; + mouseY = e.touches[0].clientY - boundingRect.top; + + } else { + mouseX = e.clientX - boundingRect.left; + mouseY = e.clientY - boundingRect.top; + } + + return { + x: mouseX, + y: mouseY + }; + + }, + addEvent = helpers.addEvent = function(node, eventType, method) { + if(node.addEventListener) { + node.addEventListener(eventType, method); + } else if(node.attachEvent) { + node.attachEvent("on" + eventType, method); + } else { + node["on" + eventType] = method; + } + }, + removeEvent = helpers.removeEvent = function(node, eventType, handler) { + if(node.removeEventListener) { + node.removeEventListener(eventType, handler, false); + } else if(node.detachEvent) { + node.detachEvent("on" + eventType, handler); + } else { + node["on" + eventType] = noop; + } + }, + bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler) { + // Create the events object if it's not already present + if(!chartInstance.events) chartInstance.events = {}; + + each(arrayOfEvents, function(eventName) { + chartInstance.events[eventName] = function() { + handler.apply(chartInstance, arguments); + }; + addEvent(chartInstance.chart.canvas, eventName, chartInstance.events[eventName]); + }); + }, + unbindEvents = helpers.unbindEvents = function(chartInstance, arrayOfEvents) { + each(arrayOfEvents, function(handler, eventName) { + removeEvent(chartInstance.chart.canvas, eventName, handler); + }); + }, + getMaximumWidth = helpers.getMaximumWidth = function(domNode) { + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientWidth; + }, + getMaximumHeight = helpers.getMaximumHeight = function(domNode) { + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientHeight; + }, + getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support + retinaScale = helpers.retinaScale = function(chart) { + var ctx = chart.ctx, + width = chart.canvas.width, + height = chart.canvas.height; + + if(window.devicePixelRatio) { + ctx.canvas.style.width = width + "px"; + ctx.canvas.style.height = height + "px"; + ctx.canvas.height = height * window.devicePixelRatio; + ctx.canvas.width = width * window.devicePixelRatio; + ctx.scale(window.devicePixelRatio, window.devicePixelRatio); + } + }, + //-- Canvas methods + clear = helpers.clear = function(chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + fontString = helpers.fontString = function(pixelSize, fontStyle, fontFamily) { + return fontStyle + " " + pixelSize + "px " + fontFamily; + }, + longestText = helpers.longestText = function(ctx, font, arrayOfStrings) { + ctx.font = font; + var longest = 0; + each(arrayOfStrings, function(string) { + var textWidth = ctx.measureText(string).width; + longest = (textWidth > longest) ? textWidth : longest; + }); + return longest; + }, + drawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) { + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + }; + + + + //Store a reference to each instance - allowing us to globally resize chart instances on window resize. + //Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + Chart.Type = function(data, options, chart) { + this.options = options; + this.chart = chart; + this.id = uid(); + //Add the chart instance to the global namespace + Chart.instances[this.id] = this; + + // Initialize is always called when a chart type is created + // By default it is a no op, but it should be extended + if(options.responsive) { + this.resize(); + } + this.initialize.call(this, data); + }; + + //Core methods that'll be a part of every chart type + extend(Chart.Type.prototype, { + initialize: function() { + return this; + }, + clear: function() { + clear(this.chart); + return this; + }, + stop: function() { + // Stops any current animation loop occuring + cancelAnimFrame(this.animationFrame); + return this; + }, + resize: function(callback) { + this.stop(); + var canvas = this.chart.canvas, + newWidth = getMaximumWidth(this.chart.canvas), + newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas); + + canvas.width = this.chart.width = newWidth; + canvas.height = this.chart.height = newHeight; + + retinaScale(this.chart); + + if(typeof callback === "function") { + callback.apply(this, Array.prototype.slice.call(arguments, 1)); + } + return this; + }, + reflow: noop, + render: function(reflow) { + if(reflow) { + this.reflow(); + } + if(this.options.animation && !reflow) { + helpers.animationLoop( + this.draw, + this.options.animationSteps, + this.options.animationEasing, + this.options.onAnimationProgress, + this.options.onAnimationComplete, + this + ); + } else { + this.draw(); + this.options.onAnimationComplete.call(this); + } + return this; + }, + generateLegend: function() { + return template(this.options.legendTemplate, this); + }, + destroy: function() { + this.clear(); + unbindEvents(this, this.events); + var canvas = this.chart.canvas; + + // Reset canvas height/width attributes starts a fresh with the canvas context + canvas.width = this.chart.width; + canvas.height = this.chart.height; + + // < IE9 doesn't support removeProperty + if(canvas.style.removeProperty) { + canvas.style.removeProperty('width'); + canvas.style.removeProperty('height'); + } else { + canvas.style.removeAttribute('width'); + canvas.style.removeAttribute('height'); + } + + delete Chart.instances[this.id]; + }, + showTooltip: function(ChartElements, forceRedraw) { + // Only redraw the chart if we've actually changed what we're hovering on. + if(typeof this.activeElements === 'undefined') this.activeElements = []; + + var isChanged = (function(Elements) { + var changed = false; + + if(Elements.length !== this.activeElements.length) { + changed = true; + return changed; + } + + each(Elements, function(element, index) { + if(element !== this.activeElements[index]) { + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if(!isChanged && !forceRedraw) { + return; + } else { + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips) { + this.options.customTooltips(false); + } + if(ChartElements.length > 0) { + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if(this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for(var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = indexOf(dataArray, ChartElements[0]); + if(dataIndex !== -1) { + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset) { + /// ZUI change begin + if(dataset.showTooltips === false) return; + /// ZUI change end + dataCollection = dataset.points || dataset.bars || dataset.segments; + if(dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()) { + Elements.push(dataCollection[dataIndex]); + } + }); + + helpers.each(Elements, function(element) { + xPositions.push(element.x); + yPositions.push(element.y); + + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + yMin = min(yPositions); + yMax = max(yPositions); + + xMin = min(xPositions); + xMax = max(xPositions); + + return { + x: (xMin > this.chart.width / 2) ? xMin : xMax, + y: (yMin + yMax) / 2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground: this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + toBase64Image: function() { + return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments); + } + }); + + Chart.Type.extend = function(extensions) { + + var parent = this; + + var ChartType = function() { + return parent.apply(this, arguments); + }; + + //Copy the prototype object of the this class + ChartType.prototype = clone(parent.prototype); + //Now overwrite some of the properties in the base class with the new extensions + extend(ChartType.prototype, extensions); + + ChartType.extend = Chart.Type.extend; + + if(extensions.name || parent.prototype.name) { + + var chartName = extensions.name || parent.prototype.name; + //Assign any potential default values of the new chart type + + //If none are defined, we'll use a clone of the chart type this is being extended from. + //I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart + //doesn't define some defaults of their own. + + var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {}; + + Chart.defaults[chartName] = extend(baseDefaults, extensions.defaults); + + Chart.types[chartName] = ChartType; + + //Register this new chart type in the Chart prototype + Chart.prototype[chartName] = function(data, options) { + var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {}); + return new ChartType(data, config, this); + }; + } else { + warn("Name not provided for this chart, so it hasn't been registered"); + } + return parent; + }; + + Chart.Element = function(configuration) { + extend(this, configuration); + this.initialize.apply(this, arguments); + this.save(); + }; + extend(Chart.Element.prototype, { + initialize: function() {}, + restore: function(props) { + if(!props) { + extend(this, this._saved); + } else { + each(props, function(key) { + this[key] = this._saved[key]; + }, this); + } + return this; + }, + save: function() { + this._saved = clone(this); + delete this._saved._saved; + return this; + }, + update: function(newProps) { + each(newProps, function(value, key) { + this._saved[key] = this[key]; + this[key] = value; + }, this); + return this; + }, + transition: function(props, ease) { + each(props, function(value, key) { + this[key] = ((value - this._saved[key]) * ease) + this._saved[key]; + }, this); + return this; + }, + tooltipPosition: function() { + return { + x: this.x, + y: this.y + }; + }, + hasValue: function() { + return isNumber(this.value); + } + }); + + Chart.Element.extend = inherits; + + + Chart.Point = Chart.Element.extend({ + display: true, + inRange: function(chartX, chartY) { + var hitDetectionRange = this.hitDetectionRadius + this.radius; + return((Math.pow(chartX - this.x, 2) + Math.pow(chartY - this.y, 2)) < Math.pow(hitDetectionRange, 2)); + }, + draw: function() { + if(this.display) { + var ctx = this.ctx; + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2); + ctx.closePath(); + + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.stroke(); + } + + + //Quick debug for bezier curve splining + //Highlights control points and the line between them. + //Handy for dev - stripped in the min version. + + // ctx.save(); + // ctx.fillStyle = "black"; + // ctx.strokeStyle = "black" + // ctx.beginPath(); + // ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.beginPath(); + // ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y); + // ctx.lineTo(this.x, this.y); + // ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y); + // ctx.stroke(); + + // ctx.restore(); + + + + } + }); + + Chart.Arc = Chart.Element.extend({ + inRange: function(chartX, chartY) { + + var pointRelativePosition = helpers.getAngleFromPoint(this, { + x: chartX, + y: chartY + }); + + //Check if within the range of the open/close angle + var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle), + withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius); + + return(betweenAngles && withinRadius); + //Ensure within the outside of the arc centre, but inside arc outer + }, + tooltipPosition: function() { + var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2), + rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius; + return { + x: this.x + (Math.cos(centreAngle) * rangeFromCentre), + y: this.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + draw: function(animationPercent) { + + var easingDecimal = animationPercent || 1; + + var ctx = this.ctx; + + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle); + + ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true); + + ctx.closePath(); + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if(this.showStroke) { + ctx.stroke(); + } + } + }); + + Chart.Rectangle = Chart.Element.extend({ + draw: function() { + var ctx = this.ctx, + halfWidth = this.width / 2, + leftX = this.x - halfWidth, + rightX = this.x + halfWidth, + top = this.base - (this.base - this.y), + halfStroke = this.strokeWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if(this.showStroke) { + leftX += halfStroke; + rightX -= halfStroke; + top += halfStroke; + } + + ctx.beginPath(); + + ctx.fillStyle = this.fillColor; + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + // It'd be nice to keep this class totally generic to any rectangle + // and simply specify which border to miss out. + ctx.moveTo(leftX, this.base); + ctx.lineTo(leftX, top); + ctx.lineTo(rightX, top); + ctx.lineTo(rightX, this.base); + ctx.fill(); + if(this.showStroke) { + ctx.stroke(); + } + }, + height: function() { + return this.base - this.y; + }, + inRange: function(chartX, chartY) { + return(chartX >= this.x - this.width / 2 && chartX <= this.x + this.width / 2) && (chartY >= this.y && chartY <= this.base); + } + }); + + Chart.Tooltip = Chart.Element.extend({ + draw: function() { + + var ctx = this.chart.ctx; + + ctx.font = fontString(this.fontSize, this.fontStyle, this.fontFamily); + + this.xAlign = "center"; + this.yAlign = "above"; + + //Distance between the actual element.y position and the start of the tooltip caret + var caretPadding = this.caretPadding = 2; + + var tooltipWidth = ctx.measureText(this.text).width + 2 * this.xPadding, + tooltipRectHeight = this.fontSize + 2 * this.yPadding, + tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding; + + if(this.x + tooltipWidth / 2 > this.chart.width) { + this.xAlign = "left"; + } else if(this.x - tooltipWidth / 2 < 0) { + this.xAlign = "right"; + } + + if(this.y - tooltipHeight < 0) { + this.yAlign = "below"; + } + + + var tooltipX = this.x - tooltipWidth / 2, + tooltipY = this.y - tooltipHeight; + + ctx.fillStyle = this.fillColor; + + // Custom Tooltips + if(this.custom) { + this.custom(this); + } else { + switch(this.yAlign) { + case "above": + //Draw a caret above the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y - caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.closePath(); + ctx.fill(); + break; + case "below": + tooltipY = this.y + caretPadding + this.caretHeight; + //Draw a caret below the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y + caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.closePath(); + ctx.fill(); + break; + } + + switch(this.xAlign) { + case "left": + tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight); + break; + case "right": + tooltipX = this.x - (this.cornerRadius + this.caretHeight); + break; + } + + drawRoundedRectangle(ctx, tooltipX, tooltipY, tooltipWidth, tooltipRectHeight, this.cornerRadius); + + ctx.fill(); + + ctx.fillStyle = this.textColor; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.text, tooltipX + tooltipWidth / 2, tooltipY + tooltipRectHeight / 2); + } + } + }); + + Chart.MultiTooltip = Chart.Element.extend({ + initialize: function() { + this.font = fontString(this.fontSize, this.fontStyle, this.fontFamily); + + this.titleFont = fontString(this.titleFontSize, this.titleFontStyle, this.titleFontFamily); + + this.height = (this.labels.length * this.fontSize) + ((this.labels.length - 1) * (this.fontSize / 2)) + (this.yPadding * 2) + this.titleFontSize * 1.5; + + this.ctx.font = this.titleFont; + + var titleWidth = this.ctx.measureText(this.title).width, + //Label has a legend square as well so account for this. + labelWidth = longestText(this.ctx, this.font, this.labels) + this.fontSize + 3, + longestTextWidth = max([labelWidth, titleWidth]); + + this.width = longestTextWidth + (this.xPadding * 2); + + + var halfHeight = this.height / 2; + + //Check to ensure the height will fit on the canvas + if(this.y - halfHeight < 0) { + this.y = halfHeight; + } else if(this.y + halfHeight > this.chart.height) { + this.y = this.chart.height - halfHeight; + } + + //Decide whether to align left or right based on position on canvas + if(this.x > this.chart.width / 2) { + this.x -= this.xOffset + this.width; + } else { + this.x += this.xOffset; + } + + + }, + getLineHeight: function(index) { + var baseLineHeight = this.y - (this.height / 2) + this.yPadding, + afterTitleIndex = index - 1; + + //If the index is zero, we're getting the title + if(index === 0) { + return baseLineHeight + this.titleFontSize / 2; + } else { + return baseLineHeight + ((this.fontSize * 1.5 * afterTitleIndex) + this.fontSize / 2) + this.titleFontSize * 1.5; + } + + }, + draw: function() { + // Custom Tooltips + if(this.custom) { + this.custom(this); + } else { + drawRoundedRectangle(this.ctx, this.x, this.y - this.height / 2, this.width, this.height, this.cornerRadius); + var ctx = this.ctx; + ctx.fillStyle = this.fillColor; + ctx.fill(); + ctx.closePath(); + + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.titleTextColor; + ctx.font = this.titleFont; + + ctx.fillText(this.title, this.x + this.xPadding, this.getLineHeight(0)); + + ctx.font = this.font; + helpers.each(this.labels, function(label, index) { + ctx.fillStyle = this.textColor; + ctx.fillText(label, this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1)); + + //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas) + //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + //Instead we'll make a white filled block to put the legendColour palette over. + + ctx.fillStyle = this.legendColorBackground; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize / 2, this.fontSize, this.fontSize); + + ctx.fillStyle = this.legendColors[index].fill; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize / 2, this.fontSize, this.fontSize); + + + }, this); + } + } + }); + + Chart.Scale = Chart.Element.extend({ + initialize: function() { + this.fit(); + }, + buildYLabels: function() { + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for(var i = 0; i <= this.steps; i++) { + this.yLabels.push(template(this.templateString, { + value: (this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces) + })); + } + this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx, this.font, this.yLabels) : 0; + }, + addXLabel: function(label) { + this.xLabels.push(label); + this.valuesCount++; + this.fit(); + }, + removeXLabel: function() { + this.xLabels.shift(); + this.valuesCount--; + this.fit(); + }, + // Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use + fit: function() { + // First we need the width of the yLabels, assuming the xLabels aren't rotated + + // To do that we need the base line at the top and base of the chart, assuming there is no x label rotation + this.startPoint = (this.display) ? this.fontSize : 0; + this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels + + // Apply padding settings to the start and end point. + this.startPoint += this.padding; + this.endPoint -= this.padding; + + // Cache the starting height, so can determine if we need to recalculate the scale yAxis + var cachedHeight = this.endPoint - this.startPoint, + cachedYLabelWidth; + + // Build the current yLabels so we have an idea of what size they'll be to start + /* + * This sets what is returned from calculateScaleRange as static properties of this class: + * + this.steps; + this.stepValue; + this.min; + this.max; + * + */ + this.calculateYRange(cachedHeight); + + // With these properties set we can now build the array of yLabels + // and also the width of the largest yLabel + this.buildYLabels(); + + this.calculateXLabelRotation(); + + while((cachedHeight > this.endPoint - this.startPoint)) { + cachedHeight = this.endPoint - this.startPoint; + cachedYLabelWidth = this.yLabelWidth; + + this.calculateYRange(cachedHeight); + this.buildYLabels(); + + // Only go through the xLabel loop again if the yLabel width has changed + if(cachedYLabelWidth < this.yLabelWidth) { + this.calculateXLabelRotation(); + } + } + + }, + calculateXLabelRotation: function() { + //Get the width of each grid by calculating the difference + //between x offsets between 0 and 1. + + this.ctx.font = this.font; + + var firstWidth = this.ctx.measureText(this.xLabels[0]).width, + lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width, + firstRotated, + lastRotated; + + + this.xScalePaddingRight = lastWidth / 2 + 3; + this.xScalePaddingLeft = (firstWidth / 2 > this.yLabelWidth + 10) ? firstWidth / 2 : this.yLabelWidth + 10; + + this.xLabelRotation = 0; + if(this.display) { + var originalLabelWidth = longestText(this.ctx, this.font, this.xLabels), + cosRotation, + firstRotatedWidth; + this.xLabelWidth = originalLabelWidth; + //Allow 3 pixels x2 padding either side for label readability + var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6; + + //Max label rotate should be 90 - also act as a loop counter + while((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)) { + cosRotation = Math.cos(toRadians(this.xLabelRotation)); + + firstRotated = cosRotation * firstWidth; + lastRotated = cosRotation * lastWidth; + + // We're right aligning the text now. + if(firstRotated + this.fontSize / 2 > this.yLabelWidth + 8) { + this.xScalePaddingLeft = firstRotated + this.fontSize / 2; + } + this.xScalePaddingRight = this.fontSize / 2; + + + this.xLabelRotation++; + this.xLabelWidth = cosRotation * originalLabelWidth; + + } + if(this.xLabelRotation > 0) { + this.endPoint -= Math.sin(toRadians(this.xLabelRotation)) * originalLabelWidth + 3; + } + } else { + this.xLabelWidth = 0; + this.xScalePaddingRight = this.padding; + this.xScalePaddingLeft = this.padding; + } + + }, + // Needs to be overidden in each Chart type + // Otherwise we need to pass all the data into the scale class + calculateYRange: noop, + drawingArea: function() { + return this.startPoint - this.endPoint; + }, + calculateY: function(value) { + var scalingFactor = this.drawingArea() / (this.min - this.max); + return this.endPoint - (scalingFactor * (value - this.min)); + }, + calculateX: function(index) { + var isRotated = (this.xLabelRotation > 0), + // innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding, + innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight), + valueWidth = innerWidth / Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1), + valueOffset = (valueWidth * index) + this.xScalePaddingLeft; + + if(this.offsetGridLines) { + valueOffset += (valueWidth / 2); + } + + return Math.round(valueOffset); + }, + update: function(newProps) { + helpers.extend(this, newProps); + this.fit(); + }, + draw: function() { + var ctx = this.ctx, + yLabelGap = (this.endPoint - this.startPoint) / this.steps, + xStart = Math.round(this.xScalePaddingLeft); + if(this.display) { + ctx.fillStyle = this.textColor; + ctx.font = this.font; + var beyondLineLength = this.showBeyondLine ? 5 : 0; + each(this.yLabels, function(labelString, index) { + var yLabelCenter = this.endPoint - (yLabelGap * index), + linePositionY = Math.round(yLabelCenter), + drawHorizontalLine = this.showHorizontalLines; + + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + if(this.showLabels) { + ctx.fillText(labelString, xStart - 10, yLabelCenter); + } + + // This is X axis, so draw it + if(index === 0 && !drawHorizontalLine) { + drawHorizontalLine = true; + } + + if(drawHorizontalLine) { + ctx.beginPath(); + } + + if(index > 0) { + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + linePositionY += helpers.aliasPixel(ctx.lineWidth); + + if(drawHorizontalLine) { + ctx.moveTo(xStart, linePositionY); + ctx.lineTo(this.width, linePositionY); + ctx.stroke(); + ctx.closePath(); + } + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + ctx.beginPath(); + ctx.moveTo(xStart - beyondLineLength, linePositionY); + ctx.lineTo(xStart, linePositionY); + ctx.stroke(); + ctx.closePath(); + + }, this); + + each(this.xLabels, function(label, index) { + var xPos = this.calculateX(index) + aliasPixel(this.lineWidth), + // Check to see if line/bar here and decide where to place the line + linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth), + isRotated = (this.xLabelRotation > 0), + drawVerticalLine = this.showVerticalLines; + + // This is Y axis, so draw it + if(index === 0 && !drawVerticalLine) { + drawVerticalLine = true; + } + + if(drawVerticalLine) { + ctx.beginPath(); + } + + if(index > 0) { + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + if(drawVerticalLine) { + ctx.moveTo(linePos, this.endPoint); + ctx.lineTo(linePos, this.startPoint - 3); + ctx.stroke(); + ctx.closePath(); + } + + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + + + // Small lines at the bottom of the base grid line + ctx.beginPath(); + ctx.moveTo(linePos, this.endPoint); + ctx.lineTo(linePos, this.endPoint + beyondLineLength); + ctx.stroke(); + ctx.closePath(); + + ctx.save(); + ctx.translate(xPos, (isRotated) ? this.endPoint + 12 : this.endPoint + 8); + ctx.rotate(toRadians(this.xLabelRotation) * -1); + ctx.font = this.font; + ctx.textAlign = (isRotated) ? "right" : "center"; + ctx.textBaseline = (isRotated) ? "middle" : "top"; + ctx.fillText(label, 0, 0); + ctx.restore(); + }, this); + + } + } + + }); + + Chart.RadialScale = Chart.Element.extend({ + initialize: function() { + this.size = min([this.height, this.width]); + this.drawingArea = (this.display) ? (this.size / 2) - (this.fontSize / 2 + this.backdropPaddingY) : (this.size / 2); + }, + calculateCenterOffset: function(value) { + // Take into account half font size + the yPadding of the top value + var scalingFactor = this.drawingArea / (this.max - this.min); + + return(value - this.min) * scalingFactor; + }, + update: function() { + if(!this.lineArc) { + this.setScaleSize(); + } else { + this.drawingArea = (this.display) ? (this.size / 2) - (this.fontSize / 2 + this.backdropPaddingY) : (this.size / 2); + } + this.buildYLabels(); + }, + buildYLabels: function() { + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for(var i = 0; i <= this.steps; i++) { + this.yLabels.push(template(this.templateString, { + value: (this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces) + })); + } + }, + getCircumference: function() { + return((Math.PI * 2) / this.valuesCount); + }, + setScaleSize: function() { + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = min([(this.height / 2 - this.pointLabelFontSize - 5), this.width / 2]), + pointPosition, + i, + textWidth, + halfTextWidth, + furthestRight = this.width, + furthestRightIndex, + furthestRightAngle, + furthestLeft = 0, + furthestLeftIndex, + furthestLeftAngle, + xProtrusionLeft, + xProtrusionRight, + radiusReductionRight, + radiusReductionLeft, + maxWidthRadius; + this.ctx.font = fontString(this.pointLabelFontSize, this.pointLabelFontStyle, this.pointLabelFontFamily); + for(i = 0; i < this.valuesCount; i++) { + // 5px to space the text slightly out - similar to what we do in the draw function. + pointPosition = this.getPointPosition(i, largestPossibleRadius); + textWidth = this.ctx.measureText(template(this.templateString, { + value: this.labels[i] + })).width + 5; + if(i === 0 || i === this.valuesCount / 2) { + // If we're at index zero, or exactly the middle, we're at exactly the top/bottom + // of the radar chart, so text will be aligned centrally, so we'll half it and compare + // w/left and right text sizes + halfTextWidth = textWidth / 2; + if(pointPosition.x + halfTextWidth > furthestRight) { + furthestRight = pointPosition.x + halfTextWidth; + furthestRightIndex = i; + } + if(pointPosition.x - halfTextWidth < furthestLeft) { + furthestLeft = pointPosition.x - halfTextWidth; + furthestLeftIndex = i; + } + } else if(i < this.valuesCount / 2) { + // Less than half the values means we'll left align the text + if(pointPosition.x + textWidth > furthestRight) { + furthestRight = pointPosition.x + textWidth; + furthestRightIndex = i; + } + } else if(i > this.valuesCount / 2) { + // More than half the values means we'll right align the text + if(pointPosition.x - textWidth < furthestLeft) { + furthestLeft = pointPosition.x - textWidth; + furthestLeftIndex = i; + } + } + } + + xProtrusionLeft = furthestLeft; + + xProtrusionRight = Math.ceil(furthestRight - this.width); + + furthestRightAngle = this.getIndexAngle(furthestRightIndex); + + furthestLeftAngle = this.getIndexAngle(furthestLeftIndex); + + radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI / 2); + + radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI / 2); + + // Ensure we actually need to reduce the size of the chart + radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0; + radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0; + + this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2; + + //this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2]) + this.setCenterPoint(radiusReductionLeft, radiusReductionRight); + + }, + setCenterPoint: function(leftMovement, rightMovement) { + + var maxRight = this.width - rightMovement - this.drawingArea, + maxLeft = leftMovement + this.drawingArea; + + this.xCenter = (maxLeft + maxRight) / 2; + // Always vertically in the centre as the text height doesn't change + this.yCenter = (this.height / 2); + }, + + getIndexAngle: function(index) { + var angleMultiplier = (Math.PI * 2) / this.valuesCount; + // Start from the top instead of right, so remove a quarter of the circle + + return index * angleMultiplier - (Math.PI / 2); + }, + getPointPosition: function(index, distanceFromCenter) { + var thisAngle = this.getIndexAngle(index); + return { + x: (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter, + y: (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter + }; + }, + draw: function() { + if(this.display) { + var ctx = this.ctx; + each(this.yLabels, function(label, index) { + // Don't draw a centre value + if(index > 0) { + var yCenterOffset = index * (this.drawingArea / this.steps), + yHeight = this.yCenter - yCenterOffset, + pointPosition; + + // Draw circular lines around the scale + if(this.lineWidth > 0) { + ctx.strokeStyle = this.lineColor; + ctx.lineWidth = this.lineWidth; + + if(this.lineArc) { + ctx.beginPath(); + ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI * 2); + ctx.closePath(); + ctx.stroke(); + } else { + ctx.beginPath(); + for(var i = 0; i < this.valuesCount; i++) { + pointPosition = this.getPointPosition(i, this.calculateCenterOffset(this.min + (index * this.stepValue))); + if(i === 0) { + ctx.moveTo(pointPosition.x, pointPosition.y); + } else { + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + } + } + if(this.showLabels) { + ctx.font = fontString(this.fontSize, this.fontStyle, this.fontFamily); + if(this.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = this.backdropColor; + ctx.fillRect( + this.xCenter - labelWidth / 2 - this.backdropPaddingX, + yHeight - this.fontSize / 2 - this.backdropPaddingY, + labelWidth + this.backdropPaddingX * 2, + this.fontSize + this.backdropPaddingY * 2 + ); + } + ctx.textAlign = 'center'; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.fontColor; + ctx.fillText(label, this.xCenter, yHeight); + } + } + }, this); + + if(!this.lineArc) { + ctx.lineWidth = this.angleLineWidth; + ctx.strokeStyle = this.angleLineColor; + for(var i = this.valuesCount - 1; i >= 0; i--) { + if(this.angleLineWidth > 0) { + var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max)); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + // Extra 3px out for some label spacing + var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5); + ctx.font = fontString(this.pointLabelFontSize, this.pointLabelFontStyle, this.pointLabelFontFamily); + ctx.fillStyle = this.pointLabelFontColor; + + var labelsCount = this.labels.length, + halfLabelsCount = this.labels.length / 2, + quarterLabelsCount = halfLabelsCount / 2, + upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount), + exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount); + if(i === 0) { + ctx.textAlign = 'center'; + } else if(i === halfLabelsCount) { + ctx.textAlign = 'center'; + } else if(i < halfLabelsCount) { + ctx.textAlign = 'left'; + } else { + ctx.textAlign = 'right'; + } + + // Set the correct text baseline based on outer positioning + if(exactQuarter) { + ctx.textBaseline = 'middle'; + } else if(upperHalf) { + ctx.textBaseline = 'bottom'; + } else { + ctx.textBaseline = 'top'; + } + + ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y); + } + } + } + } + }); + + // Attach global event to resize each chart instance when the browser resizes + helpers.addEvent(window, "resize", (function() { + // Basic debounce of resize function so it doesn't hurt performance when resizing browser. + var timeout; + return function() { + clearTimeout(timeout); + timeout = setTimeout(function() { + each(Chart.instances, function(instance) { + // If the responsive flag is set in the chart instance config + // Cascade the resize event down to the chart. + if(instance.options.responsive) { + instance.resize(instance.render, true); + } + }); + }, 50); + }; + })()); + + + if(amd) { + define(function() { + return Chart; + }); + } else if(typeof module === 'object' && module.exports) { + module.exports = Chart; + } + + root.Chart = Chart; + + /// ----- ZUI change begin ----- + /// Use jquery object to create Chart object + $.fn.chart = function() { + var charts = []; + this.each(function() { + charts.push(new Chart(this.getContext("2d"))); + }); + return charts.length === 1 ? charts[0] : charts; + } + + /// ----- ZUI change end ----- + + /// ----- ZUI change begin ----- + /// Remove unused code + // Chart.noConflict = function() // old code begin + // { + // root.Chart = previous; + // return Chart; + // }; // old code end + /// ----- ZUI change end ----- + + /// ----- ZUI change begin ----- + /// Add jquery object to namespace + + /// }).call(this); // Old code +}).call(this, jQuery); + +/// ----- ZUI change end ----- + + +/* ======================================================================== + * Chart.js: Chart.line.js [Version: 1.0.2] + * http://chartjs.org/ + * + * ZUI: The file has been changed in ZUI. It will not keep update with the + * official version in the future. + * http://zui.sexy + * ======================================================================== + * Copyright 2015 Nick Downie, Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + * ======================================================================== */ + + +/// ----- ZUI change begin ----- +/// Add jquery object to namespace + +/// (function(){ // Old code +(function($) { + + /// ----- ZUI change end ----- + "use strict"; + + /// ----- ZUI change begin ----- + /// Change root to zui shared object + /// + /// var root = this, // old code + var root = $ && $.zui ? $.zui : this, + /// ----- ZUI change end ----- + Chart = root.Chart, + helpers = Chart.helpers; + + var defaultConfig = { + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: true, + + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth: 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + /// ZUI change end + //Boolean - Whether to show beyond lines + scaleShowBeyondLine: true, + /// ZUI change end + /// + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve: true, + + //Number - Tension of the bezier curve between points + bezierCurveTension: 0.4, + + //Boolean - Whether to show a dot for each point + pointDot: true, + + //Number - Radius of each point dot in pixels + pointDotRadius: 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth: 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius: 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke: true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth: 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill: true, + + //String - A legend template + legendTemplate: "
                -legend\"><% for (var i=0; i
              • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
              • <%}%>
              " + + }; + + + Chart.Type.extend({ + name: "Line", + defaults: defaultConfig, + + initialize: function(data) { + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.PointClass = Chart.Point.extend({ + strokeWidth: this.options.pointDotStrokeWidth, + radius: this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius: this.options.pointHitDetectionRadius, + ctx: this.chart.ctx, + inRange: function(mouseX) { + return(Math.pow(mouseX - this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius, 2)); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if(this.options.showTooltips) { + helpers.bindEvents(this, this.options.tooltipEvents, function(evt) { + var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + this.eachPoints(function(point) { + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePoints, function(activePoint) { + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + this.showTooltip(activePoints); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets, function(dataset) { + /// ----- ZUI change begin ----- + // add color theme + if($.zui && $.zui.Color && $.zui.Color.get) { + var accentColor = $.zui.Color.get(dataset.color); + var accentColorValue = accentColor.toCssStr(); + + if(!dataset.fillColor) dataset.fillColor = accentColor.clone().fade(20).toCssStr(); + if(!dataset.strokeColor) dataset.strokeColor = accentColorValue; + if(!dataset.pointColor) dataset.pointColor = accentColorValue; + if(!dataset.pointStrokeColor) dataset.pointStrokeColor = '#fff'; + if(!dataset.pointHighlightFill) dataset.pointHighlightFill = '#fff'; + if(!dataset.pointHighlightStroke) dataset.pointHighlightStroke = accentColorValue; + } + /// ----- ZUI change begin ----- + + var datasetObject = { + label: dataset.label || null, + fillColor: dataset.fillColor, + strokeColor: dataset.strokeColor, + pointColor: dataset.pointColor, + pointStrokeColor: dataset.pointStrokeColor, + /// ZUI change begin + showTooltips: dataset.showTooltips !== false, + /// ZUI change end + points: [] + }; + + this.datasets.push(datasetObject); + + + helpers.each(dataset.data, function(dataPoint, index) { + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.points.push(new this.PointClass({ + value: dataPoint, + label: data.labels[index], + datasetLabel: dataset.label, + strokeColor: dataset.pointStrokeColor, + fillColor: dataset.pointColor, + highlightFill: dataset.pointHighlightFill || dataset.pointColor, + highlightStroke: dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + }, this); + + this.buildScale(data.labels); + + + this.eachPoints(function(point, index) { + helpers.extend(point, { + x: this.scale.calculateX(index), + y: this.scale.endPoint + }); + point.save(); + }, this); + + }, this); + + + this.render(); + }, + update: function() { + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement) { + activeElement.restore(['fillColor', 'strokeColor']); + }); + this.eachPoints(function(point) { + point.save(); + }); + this.render(); + }, + eachPoints: function(callback) { + helpers.each(this.datasets, function(dataset) { + helpers.each(dataset.points, callback, this); + }, this); + }, + getPointsAtEvent: function(e) { + var pointsArray = [], + eventPosition = helpers.getRelativePosition(e); + helpers.each(this.datasets, function(dataset) { + helpers.each(dataset.points, function(point) { + if(point.inRange(eventPosition.x, eventPosition.y)) pointsArray.push(point); + }); + }, this); + return pointsArray; + }, + buildScale: function(labels) { + var self = this; + + var dataTotal = function() { + var values = []; + self.eachPoints(function(point) { + values.push(point.value); + }); + + return values; + }; + + var scaleOptions = { + templateString: this.options.scaleLabel, + height: this.chart.height, + width: this.chart.width, + ctx: this.chart.ctx, + textColor: this.options.scaleFontColor, + fontSize: this.options.scaleFontSize, + fontStyle: this.options.scaleFontStyle, + fontFamily: this.options.scaleFontFamily, + valuesCount: labels.length, + beginAtZero: this.options.scaleBeginAtZero, + integersOnly: this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight) { + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels: labels, + font: helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth: this.options.scaleLineWidth, + lineColor: this.options.scaleLineColor, + showHorizontalLines: this.options.scaleShowHorizontalLines, + showVerticalLines: this.options.scaleShowVerticalLines, + /// ZUI change begin + showBeyondLine: this.options.scaleShowBeyondLine, + /// ZUI change end + gridLineWidth: (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor: (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth, + showLabels: this.options.scaleShowLabels, + display: this.options.showScale + }; + + if(this.options.scaleOverride) { + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + + this.scale = new Chart.Scale(scaleOptions); + }, + addData: function(valuesArray, label) { + //Map the values array for each of the datasets + + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + datasetLabel: this.datasets[datasetIndex].label, + x: this.scale.calculateX(this.scale.valuesCount+1), + y: this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData: function() { + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets, function(dataset) { + dataset.points.shift(); + }, this); + this.update(); + }, + reflow: function() { + var newScaleProps = helpers.extend({ + height: this.chart.height, + width: this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw: function(ease) { + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + // Some helper methods for getting the next/prev points + var hasValue = function(item) { + return item.value !== null; + }, + nextPoint = function(point, collection, index) { + return helpers.findNextWhere(collection, hasValue, index) || point; + }, + previousPoint = function(point, collection, index) { + return helpers.findPreviousWhere(collection, hasValue, index) || point; + }; + + this.scale.draw(easingDecimal); + + + helpers.each(this.datasets, function(dataset) { + var pointsWithValues = helpers.where(dataset.points, hasValue); + + //Transition each point first so that the line and point drawing isn't out of sync + //We can use this extra loop to calculate the control points of this dataset also in this loop + + helpers.each(dataset.points, function(point, index) { + if(point.hasValue()) { + point.transition({ + y: this.scale.calculateY(point.value), + x: this.scale.calculateX(index) + }, easingDecimal); + } + }, this); + + + // Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point + // This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed + if(this.options.bezierCurve) { + helpers.each(pointsWithValues, function(point, index) { + var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0; + point.controlPoints = helpers.splineCurve( + previousPoint(point, pointsWithValues, index), + point, + nextPoint(point, pointsWithValues, index), + tension + ); + + // Prevent the bezier going outside of the bounds of the graph + + // Cap puter bezier handles to the upper/lower scale bounds + if(point.controlPoints.outer.y > this.scale.endPoint) { + point.controlPoints.outer.y = this.scale.endPoint; + } else if(point.controlPoints.outer.y < this.scale.startPoint) { + point.controlPoints.outer.y = this.scale.startPoint; + } + + // Cap inner bezier handles to the upper/lower scale bounds + if(point.controlPoints.inner.y > this.scale.endPoint) { + point.controlPoints.inner.y = this.scale.endPoint; + } else if(point.controlPoints.inner.y < this.scale.startPoint) { + point.controlPoints.inner.y = this.scale.startPoint; + } + }, this); + } + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + + helpers.each(pointsWithValues, function(point, index) { + if(index === 0) { + ctx.moveTo(point.x, point.y); + } else { + if(this.options.bezierCurve) { + var previous = previousPoint(point, pointsWithValues, index); + + ctx.bezierCurveTo( + previous.controlPoints.outer.x, + previous.controlPoints.outer.y, + point.controlPoints.inner.x, + point.controlPoints.inner.y, + point.x, + point.y + ); + } else { + ctx.lineTo(point.x, point.y); + } + } + }, this); + + ctx.stroke(); + + if(this.options.datasetFill && pointsWithValues.length > 0) { + //Round off the line by going to the base of the chart, back to the start, then fill. + ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint); + ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint); + ctx.fillStyle = dataset.fillColor; + ctx.closePath(); + ctx.fill(); + } + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(pointsWithValues, function(point) { + point.draw(); + }); + }, this); + } + }); + + /// ----- ZUI change begin ----- + /// Use jquery object to create Chart object + $.fn.lineChart = function(data, options) { + var lineCharts = []; + this.each(function() { + var $this = $(this); + lineCharts.push(new Chart(this.getContext("2d")).Line(data, $.extend($this.data(), options))); + }); + return lineCharts.length === 1 ? lineCharts[0] : lineCharts; + } + + /// ----- ZUI change end ----- + + /// ----- ZUI change begin ----- + /// Add jquery object to namespace + + /// }).call(this); // Old code +}).call(this, jQuery); + +/// ----- ZUI change end ----- + + +/* ======================================================================== + * Chart.js: Chart.Doughnut.js [Version: 1.0.2] + * http://chartjs.org/ + * + * ZUI: The file has been changed in ZUI. It will not keep update with the + * official version in the future. + * http://zui.sexy + * ======================================================================== + * Copyright 2015 Nick Downie, Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + * ======================================================================== */ + +/// ----- ZUI change begin ----- +/// Add jquery object to namespace + +/// (function(){ // Old code +(function($) { + + /// ----- ZUI change end ----- + "use strict"; + + /// ----- ZUI change begin ----- + /// Change root to zui shared object + /// + /// var root = this, // old code + var root = $ && $.zui ? $.zui : this, + /// ----- ZUI change end ----- + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke: true, + + //String - The colour of each segment stroke + segmentStrokeColor: "#fff", + + //Number - The width of each segment stroke + /// ZUI change begin + /// segmentStrokeWidth: 2, // old code + segmentStrokeWidth: 1, + /// ZUI change end + + //The percentage of the chart that we cut out of the middle. + percentageInnerCutout: 50, + + /// ZUI change begin + // Boolean - Whether to show labels on the scale + scaleShowLabels: false, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // String - Scale label position + scaleLabelPlacement: 'auto', + + /// Number - Amount of animation steps // old code + /// animationSteps: 100, // old code + animationSteps: 60, + /// ZUI change end + + //String - Animation easing effect + animationEasing: "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false, + + //String - A legend template + legendTemplate: "
                -legend\"><% for (var i=0; i
              • \"><%if(segments[i].label){%><%=segments[i].label%><%}%>
              • <%}%>
              " + + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "Doughnut", + //Providing a defaults will also register the deafults in the chart namespace + defaults: defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data) { + + //Declare segments as a static property to prevent inheriting across the Chart type prototype + this.segments = []; + this.outerRadius = (helpers.min([this.chart.width, this.chart.height]) - this.options.segmentStrokeWidth / 2) / 2; + + this.SegmentArc = Chart.Arc.extend({ + ctx: this.chart.ctx, + x: this.chart.width / 2, + y: this.chart.height / 2 + }); + + //Set up tooltip events on the chart + if(this.options.showTooltips) { + helpers.bindEvents(this, this.options.tooltipEvents, function(evt) { + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + + helpers.each(this.segments, function(segment) { + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments, function(activeSegment) { + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + this.calculateTotal(data); + + helpers.each(data, function(datapoint, index) { + this.addData(datapoint, index, true); + }, this); + + this.render(); + }, + getSegmentsAtEvent: function(e) { + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments, function(segment) { + if(segment.inRange(location.x, location.y)) segmentsArray.push(segment); + }, this); + return segmentsArray; + }, + addData: function(segment, atIndex, silent) { + /// ----- ZUI change begin ----- + /// Init segment color + if($.zui && $.zui.Color && $.zui.Color.get) { + var color = new $.zui.Color.get(segment.color); + segment.color = color.toCssStr(); + if(!segment.highlight) segment.highlight = color.lighten(5).toCssStr(); + } + /// ----- ZUI change end ----- + var index = atIndex || this.segments.length; + this.segments.splice(index, 0, new this.SegmentArc({ + id: typeof segment.id === 'undefined' ? index : segment.id, + value: segment.value, + outerRadius: (this.options.animateScale) ? 0 : this.outerRadius, + innerRadius: (this.options.animateScale) ? 0 : (this.outerRadius / 100) * this.options.percentageInnerCutout, + fillColor: segment.color, + highlightColor: segment.highlight || segment.color, + showStroke: this.options.segmentShowStroke, + strokeWidth: this.options.segmentStrokeWidth, + strokeColor: this.options.segmentStrokeColor, + startAngle: Math.PI * 1.5, + circumference: (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value), + /// ----- ZUI change begin ----- + showLabel: segment.showLabel !== false, + /// ----- ZUI change end ----- + label: segment.label + })); + if(!silent) { + this.reflow(); + this.update(); + } + }, + calculateCircumference: function(value) { + return(Math.PI * 2) * (Math.abs(value) / this.total); + }, + calculateTotal: function(data) { + this.total = 0; + helpers.each(data, function(segment) { + this.total += Math.abs(segment.value); + }, this); + }, + update: function() { + this.calculateTotal(this.segments); + + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement) { + activeElement.restore(['fillColor']); + }); + + helpers.each(this.segments, function(segment) { + segment.save(); + }); + this.render(); + }, + + removeData: function(atIndex) { + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length - 1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + + reflow: function() { + helpers.extend(this.SegmentArc.prototype, { + x: this.chart.width / 2, + y: this.chart.height / 2 + }); + this.outerRadius = (helpers.min([this.chart.width, this.chart.height]) - this.options.segmentStrokeWidth / 2) / 2; + helpers.each(this.segments, function(segment) { + segment.update({ + outerRadius: this.outerRadius, + innerRadius: (this.outerRadius / 100) * this.options.percentageInnerCutout + }); + }, this); + }, + /// ZUI change begin + drawLabel: function(segment, easeDecimal, labelPosMap) { + var options = this.options; + var middleAngle = (segment.endAngle + segment.startAngle) / 2; + var placement = options.scaleLabelPlacement; + if(placement !== 'inside' && placement !== 'outside') { + if((this.chart.width - this.chart.height) > 50) { + if(segment.circumference < (Math.PI / 18)) { + placement = 'outside'; + } + } + } + + var x = Math.cos(middleAngle) * segment.outerRadius, + y = Math.sin(middleAngle) * segment.outerRadius, + text = helpers.template(options.scaleLabel, { + value: typeof easeDecimal === 'undefined' ? segment.value : Math.round(easeDecimal * segment.value), + label: segment.label + }); + + var ctx = this.chart.ctx; + ctx.font = helpers.fontString(options.scaleFontSize, options.scaleFontStyle, options.scaleFontFamily); + ctx.textBaseline = "middle"; + ctx.textAlign = "center"; + + var textWidth = ctx.measureText(text).width; + var chartWidthHalf = this.chart.width / 2; + var chartHeightHalf = this.chart.height / 2; + + if(placement === 'outside') { // outside + var isRight = x >= 0; + var lineX = x + chartWidthHalf; + var lineY = y + chartHeightHalf; + ctx.textAlign = isRight ? 'left' : 'right'; + ctx.measureText(text).width; + if(isRight) { + x = Math.max(chartWidthHalf + segment.outerRadius + 10, x + 30 + chartWidthHalf); + } else { + x = Math.min(chartWidthHalf - segment.outerRadius - 10, x - 30 + chartWidthHalf); + } + + var textHeight = options.scaleFontSize * (options.scaleLineHeight || 1); + var labelPos = Math.round((y * 0.8 + chartHeightHalf) / textHeight) + 1; + var maxPos = Math.floor(this.chart.width / textHeight) + 1; + var labelPosDirection = isRight ? 1 : (-1); + if(labelPosMap[labelPos*labelPosDirection]) { + if(labelPos > 1) labelPos--; + else labelPos++; + } + // while(labelPosMap[labelPos*labelPosDirection] && labelPos < maxPos) labelPos++; + + if(labelPosMap[labelPos*labelPosDirection]) return; + y = (labelPos - 1) * textHeight + options.scaleFontSize / 2; + labelPosMap[labelPos*labelPosDirection] = true; + + ctx.beginPath(); + ctx.moveTo(lineX, lineY); + ctx.lineTo(x, y); + x = isRight ? (x + 5) : (x - 5); + ctx.lineTo(x, y); + ctx.strokeStyle = ($.zui && $.zui.Color) ? (new $.zui.Color(segment.fillColor).fade(40).toCssStr()) : segment.fillColor; + ctx.strokeWidth = options.scaleLineWidth; + ctx.stroke(); + ctx.fillStyle = segment.fillColor; + } else { // inside + x = x * 0.7 + chartWidthHalf; + y = y * 0.7 + chartHeightHalf; + ctx.fillStyle = ($.zui && $.zui.Color) ? (new $.zui.Color(segment.fillColor).contrast().toCssStr()) : '#fff'; + } + ctx.fillText(text, x, y); + }, + // ZUI change end + draw: function(easeDecimal) { + var animDecimal = (easeDecimal) ? easeDecimal : 1; + this.clear(); + // ZUI change begin + var labelPositionMap; + // ZUI change end + helpers.each(this.segments, function(segment, index) { + segment.transition({ + circumference: this.calculateCircumference(segment.value), + outerRadius: this.outerRadius, + innerRadius: (this.outerRadius / 100) * this.options.percentageInnerCutout + }, animDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + segment.draw(); + if(index === 0) { + segment.startAngle = Math.PI * 1.5; + } + //Check to see if it's the last segment, if not get the next and update the start angle + if(index < this.segments.length - 1) { + this.segments[index + 1].startAngle = segment.endAngle; + } + }, this); + + /// ZUI change begin + if(this.options.scaleShowLabels) { + var segmentsArray = this.segments.slice().sort(function(a,b){return b.value - a.value;}); + var labelPositionMap = {}; + helpers.each(segmentsArray, function(segment, index) { + if(segment.showLabel) this.drawLabel(segment, easeDecimal, labelPositionMap); + }, this); + } + /// ZUI change end + } + }); + + Chart.types.Doughnut.extend({ + name: "Pie", + defaults: helpers.merge(defaultConfig, { + percentageInnerCutout: 0 + }) + }); + + /// ----- ZUI change begin ----- + /// Use jquery object to create Chart object + $.fn.pieChart = function(data, options) { + var pieCharts = []; + this.each(function() { + var $this = $(this); + pieCharts.push(new Chart(this.getContext("2d")).Pie(data, $.extend($this.data(), options))); + }); + return pieCharts.length === 1 ? pieCharts[0] : pieCharts; + } + + $.fn.doughnutChart = function(data, options) { + var doughnutCharts = []; + this.each(function() { + var $this = $(this); + doughnutCharts.push(new Chart(this.getContext("2d")).Doughnut(data, $.extend($this.data(), options))); + }); + return doughnutCharts.length === 1 ? doughnutCharts[0] : doughnutCharts; + } + + /// ----- ZUI change end ----- + + /// ----- ZUI change begin ----- + /// Add jquery object to namespace + + /// }).call(this); // Old code +}).call(this, jQuery); + +/// ----- ZUI change end ----- + + +/* ======================================================================== + * Chart.js: Chart.Bar.js [Version: 1.0.2] + * http://chartjs.org/ + * + * ZUI: The file has been changed in ZUI. It will not keep update with the + * official version in the future. + * http://zui.sexy + * ======================================================================== + * Copyright 2015 Nick Downie, Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + * ======================================================================== */ + + +/// ----- ZUI change begin ----- +/// Add jquery object to namespace + +/// (function(){ // Old code +(function($) { + + /// ----- ZUI change end ----- + "use strict"; + + /// ----- ZUI change begin ----- + /// Change root to zui shared object + /// + /// var root = this, // old code + var root = $ && $.zui ? $.zui : this, + /// ----- ZUI change end ----- + Chart = root.Chart, + helpers = Chart.helpers; + + + var defaultConfig = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: true, + + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth: 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + /// ZUI change begin + //Boolean - Whether to show beyond lines + scaleShowBeyondLine: true, + /// ZUI change end + /// + //Boolean - If there is a stroke on each bar + barShowStroke: true, + + //Number - Pixel width of the bar stroke + /// ZUI change begin + /// barStrokeWidth: 2, + barStrokeWidth: 1, + + // String - Sacle value labels placement + scaleValuePlacement: 'auto', // none, auto, outside, inside-top, inside-middle, inside-bottom + /// ZUI change end + + //Number - Spacing between each of the X value sets + barValueSpacing: 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing: 1, + + //String - A legend template + legendTemplate: "
                -legend\"><% for (var i=0; i
              • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
              • <%}%>
              " + }; + + + Chart.Type.extend({ + name: "Bar", + defaults: defaultConfig, + initialize: function(data) { + + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines: true, + calculateBarX: function(datasetCount, datasetIndex, barIndex) { + //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar + var xWidth = this.calculateBaseWidth(), + xAbsolute = this.calculateX(barIndex) - (xWidth / 2), + barWidth = this.calculateBarWidth(datasetCount); + + return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth / 2; + }, + calculateBaseWidth: function() { + return(this.calculateX(1) - this.calculateX(0)) - (2 * options.barValueSpacing); + }, + calculateBarWidth: function(datasetCount) { + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing); + + return(baseWidth / datasetCount); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if(this.options.showTooltips) { + helpers.bindEvents(this, this.options.tooltipEvents, function(evt) { + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar) { + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar) { + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth: this.options.barStrokeWidth, + showStroke: this.options.barShowStroke, + ctx: this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets, function(dataset, datasetIndex) { + /// ----- ZUI change begin ----- + // add color theme + if($.zui && $.zui.Color && $.zui.Color.get) { + var accentColor = $.zui.Color.get(dataset.color); + var accentColorValue = accentColor.toCssStr(); + + if(!dataset.fillColor) dataset.fillColor = accentColor.clone().fade(50).toCssStr(); + if(!dataset.strokeColor) dataset.strokeColor = accentColorValue; + } + /// ----- ZUI change begin ----- + + var datasetObject = { + label: dataset.label || null, + fillColor: dataset.fillColor, + strokeColor: dataset.strokeColor, + bars: [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data, function(dataPoint, index) { + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.bars.push(new this.BarClass({ + value: dataPoint, + label: data.labels[index], + datasetLabel: dataset.label, + strokeColor: dataset.strokeColor, + fillColor: dataset.fillColor, + highlightFill: dataset.highlightFill || dataset.fillColor, + highlightStroke: dataset.highlightStroke || dataset.strokeColor + })); + }, this); + + }, this); + + this.buildScale(data.labels); + + this.BarClass.prototype.base = this.scale.endPoint; + + this.eachBars(function(bar, index, datasetIndex) { + helpers.extend(bar, { + width: this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + update: function() { + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement) { + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar) { + bar.save(); + }); + this.render(); + }, + eachBars: function(callback) { + helpers.each(this.datasets, function(dataset, datasetIndex) { + helpers.each(dataset.bars, callback, this, datasetIndex); + }, this); + }, + getBarsAtEvent: function(e) { + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset) { + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for(var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for(barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if(this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x, eventPosition.y)) { + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale: function(labels) { + var self = this; + + var dataTotal = function() { + var values = []; + self.eachBars(function(bar) { + values.push(bar.value); + }); + return values; + }; + + var scaleOptions = { + templateString: this.options.scaleLabel, + height: this.chart.height, + width: this.chart.width, + ctx: this.chart.ctx, + textColor: this.options.scaleFontColor, + fontSize: this.options.scaleFontSize, + fontStyle: this.options.scaleFontStyle, + fontFamily: this.options.scaleFontFamily, + valuesCount: labels.length, + beginAtZero: this.options.scaleBeginAtZero, + integersOnly: this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight) { + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels: labels, + font: helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth: this.options.scaleLineWidth, + lineColor: this.options.scaleLineColor, + showHorizontalLines: this.options.scaleShowHorizontalLines, + showVerticalLines: this.options.scaleShowVerticalLines, + /// ZUI change begin + showBeyondLine: this.options.scaleShowBeyondLine, + /// ZUI change end + gridLineWidth: (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor: (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels: this.options.scaleShowLabels, + display: this.options.showScale + }; + + if(this.options.scaleOverride) { + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData: function(valuesArray, label) { + //Map the values array for each of the datasets + helpers.each(valuesArray, function(value, datasetIndex) { + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value: value, + label: label, + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount + 1), + y: this.scale.endPoint, + width: this.scale.calculateBarWidth(this.datasets.length), + base: this.scale.endPoint, + strokeColor: this.datasets[datasetIndex].strokeColor, + fillColor: this.datasets[datasetIndex].fillColor + })); + }, this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData: function() { + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets, function(dataset) { + dataset.bars.shift(); + }, this); + this.update(); + }, + reflow: function() { + helpers.extend(this.BarClass.prototype, { + y: this.scale.endPoint, + base: this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height: this.chart.height, + width: this.chart.width + }); + this.scale.update(newScaleProps); + }, + /// ZUI change begin + drawLabel: function(bar, placement) { + var options = this.options; + placement = placement || options.scaleValuePlacement; + placement = placement ? placement.toLowerCase() : 'auto'; + if(placement === 'auto') { + placement = bar.y < 15 ? 'insdie' : 'outside'; + } + + var y = placement === 'insdie' ? (bar.y + 10) : (bar.y - 10); + var ctx = this.chart.ctx; + ctx.font = helpers.fontString(options.scaleFontSize, options.scaleFontStyle, options.scaleFontFamily); + ctx.textBaseline = "middle"; + ctx.textAlign = "center"; + ctx.fillStyle = options.scaleFontColor; + ctx.fillText(bar.value, bar.x, y); + }, + /// ZUI change end + draw: function(ease) { + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + /// ZUI change begin + var showScaleValue = this.options.scaleShowLabels && this.options.scaleValuePlacement; + /// ZUI change end + //Draw all the bars for each dataset + helpers.each(this.datasets, function(dataset, datasetIndex) { + helpers.each(dataset.bars, function(bar, index) { + if(bar.hasValue()) { + bar.base = this.scale.endPoint; + //Transition then draw + bar.transition({ + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.calculateY(bar.value), + width: this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + /// ZUI change begin + if(showScaleValue) { + this.drawLabel(bar); + } + /// ZUI change end + }, this); + + }, this); + } + }); + + /// ----- ZUI change begin ----- + /// Use jquery object to create Chart object + $.fn.barChart = function(data, options) { + var barCharts = []; + this.each(function() { + var $this = $(this); + barCharts.push(new Chart(this.getContext("2d")).Bar(data, $.extend($this.data(), options))); + }); + return barCharts.length === 1 ? barCharts[0] : barCharts; + } + + /// ----- ZUI change end ----- + + /// ----- ZUI change begin ----- + /// Add jquery object to namespace + + /// }).call(this); // Old code +}).call(this, jQuery); + +/// ----- ZUI change end ----- + + +(function($) { + jQuery.fn.sparkline = function(setting) + { + $(this).each(function() + { + var $e = $(this); + var options = $.extend({ + values: $e.attr('values'), + width: $e.width() - 4, + height: $e.height() - 4 + }, $e.data(), setting); + var height = options.height, + values = [], + maxWidth = options.width; + + var strValues = options.values.split(','), maxValue = 0; + for(var i in strValues) + { + var v = parseFloat(strValues[i]); + if(v != NaN) + { + values.push(v); + maxValue = Math.max(v, maxValue); + } + } + + var scaleSteps = Math.min(maxValue, 30); + var scaleStepWidth = Math.ceil(maxValue/scaleSteps); + + var width = Math.min(maxWidth, Math.max(10, values.length*maxWidth/30)); + var canvas = $e.children('canvas'); + if(!canvas.length) + { + $e.append(''); + canvas = $e.children('canvas'); + } + canvas.attr('width', width).attr('height',height); + var data = { + labels : values, + datasets: + [{ + fillColor : "rgba(0,0,255,0.05)", + strokeColor : "#0054EC", + pointColor : "rgba(255,136,0,1)", + pointStrokeColor : "#fff", + data : values + }] + }; + var chartOtions = { + animation: true, + scaleOverride: true, + scaleStepWidth: Math.ceil(maxValue/10), + scaleSteps: 10, + scaleStartValue: 0, + showScale: false, + showTooltips: false, + pointDot: false, + scaleShowGridLines: false, + datasetStrokeWidth: 1 + }; + var lineChart = $(canvas).lineChart(data, chartOtions); + $e.data('sparklineChart', lineChart); + }); + } + + $(function(){ + $('.sparkline').sparkline(); + }); +}(jQuery)); + diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 2f481637f5..9689552a82 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -378,7 +378,6 @@ div.form-control[contenteditable='true'] {height: auto; text-align: left; outlin /* Background */ /* Header */ -.container-fixed{width:100%;} #extraNav .dropdown .dropdown-menu li {text-align:center;} #extraNav .dropdown .dropdown-menu li a{width:100%;color:rgb(60, 67, 83);} #extraNav .dropdown .dropdown-menu li a:hover{color:#fff;} diff --git a/www/theme/zui/css/min.css b/www/theme/zui/css/min.css index b4e3dfc20b..8c5f6bacc1 100644 --- a/www/theme/zui/css/min.css +++ b/www/theme/zui/css/min.css @@ -1,5 +1,5 @@ /*! - * ZUI: Zentao template - v1.8.1 - 2018-01-22 + * ZUI: Zentao template - v1.8.1 - 2018-01-27 * http://zui.sexy * GitHub: https://github.com/easysoft/zui.git * Copyright (c) 2018 cnezsoft.com; Licensed MIT @@ -2565,11 +2565,11 @@ input[type="button"].btn-block { } } .progress { - height: 20px; + height: 6px; margin-bottom: 20px; overflow: hidden; - background-color: #eee; - border-radius: 4px; + background-color: #f2f3f6; + border-radius: 3px; } .progress-bar { float: left; @@ -2579,6 +2579,7 @@ input[type="button"].btn-block { color: #fff; text-align: center; background-color: #006af1; + border-radius: 3px; -webkit-transition: width .6s ease; -o-transition: width .6s ease; transition: width .6s ease; @@ -2926,7 +2927,7 @@ input[type="number"]::-webkit-inner-spin-button { color: #3c4353; vertical-align: middle; background-color: #fff; - border: 1px solid #ccc; + border: 1px solid #e8e9ee; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); @@ -3977,7 +3978,7 @@ input:placeholder-shown + .search-icon + .search-clear-btn { color: #3c4353; text-align: center; background-color: #eee; - border: 1px solid #ccc; + border: 1px solid #e8e9ee; border-radius: 4px; } .input-group-addon input[type="radio"], @@ -6999,6 +7000,32 @@ a .icon-spin { .project-status-suspended > .label-dot { background-color: #fdc137; } +.label-pri { + display: inline-block; + min-width: 20px; + height: 20px; + line-height: 20px; + color: #a6aab8; + text-align: center; + background-color: #f0f2f5; + border-radius: 10px; + } +.label-pri-1 { + color: #fff; + background: #51a1ff; + } +.label-pri-2 { + color: #fff; + background: #72b3ff; + } +.label-pri-3 { + color: #fff; + background: #98c8ff; + } +.label-pri-4 { + color: #fff; + background: #c4dfff; + } .panel { position: relative; margin-bottom: 20px; @@ -7011,6 +7038,12 @@ a .icon-spin { .panel-body { padding: 20px; } +.panel-body.has-table { + padding: 10px; + } +.panel-body.has-table .table { + margin-bottom: 0; + } .panel-heading { padding: 18px 20px; border-bottom: 1px solid transparent; @@ -7043,8 +7076,23 @@ a .icon-spin { text-decoration: initial; background-color: #f1f1f1; } -.panel > .table-borderless { - margin: 0 10px 10px; +.progress-text-left { + position: relative; + margin: 7px 0; + margin-left: 35px; + overflow: visible; + } +.progress-text-left .progress-text { + position: absolute; + top: -7px; + left: -35px; + display: block; + width: 35px; + height: 20px; + padding-right: 5px; + line-height: 20px; + color: #a6aab8; + text-align: right; } .tile { text-align: center; @@ -7395,6 +7443,9 @@ a .icon-spin { font-size: 12px; font-weight: normal; } +.block-dynamic .timeline { + margin: 0; + } .block-flowchart { padding: 10px; } @@ -7479,19 +7530,107 @@ a .icon-spin { text-align: right; } .block-projects .c-progress { - width: 140px; + width: 155px; } .block-projects .c-spark { - width: 100px; + width: 120px; + padding: 0; } -.block-projects .progress { - margin: 0; +.block-stories .c-id { + color: #a6aab8; + } +.block-stories .c-pri { + text-align: center; + } +.block-stories .c-status { + color: #a6aab8; + } +.block-todoes { + margin-top: 10px; + } +.block-todoes .panel-body { + position: relative; + padding-top: 42px; + } +.block-todoes .todoes-input { + position: absolute; + top: 0; + right: 20px; + left: 20px; + } +.block-todoes .todoes-input .form-control::-webkit-input-placeholder { + font-size: 12px; + line-height: 20px; + color: #a4a8b6; + } +.block-todoes .todoes-input .form-control::-moz-placeholder { + font-size: 12px; + line-height: 20px; + color: #a4a8b6; + } +.block-todoes .todoes-input .form-control:-ms-input-placeholder { + font-size: 12px; + line-height: 20px; + color: #a4a8b6; + } +.block-todoes .todoes-input .form-control::placeholder { + font-size: 12px; + line-height: 20px; + color: #a4a8b6; + } +.block-todoes .todoes { + padding-left: 0; + } +.block-todoes .todoes > li { + position: relative; + padding: 5px 0 5px 25px; + list-style: none; + } +.block-todoes .todo-title { + display: block; + padding: 5px; + } +.block-todoes .todo-pri { + display: inline-block; + padding: 0 5px; + font-size: 12px; + color: #838a9d; + } +.block-todoes .todo-pri-1 { + color: #ff5d5d; + } +.block-todoes .todo-time { + display: inline-block; + padding: 0 5px; + font-size: 12px; + color: #a6aab8; + } +.block-todoes .todo-check { + position: absolute; + top: 10px; + left: 0; + display: block; + width: 20px; + height: 20px; + font-size: 20px; + color: transparent; + cursor: pointer; + border: 2px solid #eee; + border-radius: 50%; + } +.block-todoes .todo-check:hover { + border-color: #a6aab8; + } +.block-todoes .active > .todo-check { + color: #00da88; + border: none; } #footer { position: fixed; right: 0; bottom: 0; left: 0; + z-index: 1100; height: 40px; background: #fff; border-top: 1px solid #eff1f7; From b557f3896deef96e7ee516b5d1dcac8798108c05 Mon Sep 17 00:00:00 2001 From: wangyidong Date: Mon, 29 Jan 2018 15:07:26 +0800 Subject: [PATCH 159/206] * adjust for action and header. --- module/action/lang/zh-cn.php | 4 ++-- module/common/model.php | 1 + module/common/view/header.html.php | 9 +++++++++ www/theme/default/style.css | 3 +-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 7021b27d0d..0982cb1fee 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -191,13 +191,13 @@ $lang->action->label->release = '发布|release|view|productID=%s'; $lang->action->label->story = '需求|story|view|storyID=%s'; $lang->action->label->project = "{$lang->projectCommon}|project|view|projectID=%s"; $lang->action->label->task = '任务|task|view|taskID=%s'; -$lang->action->label->build = 'Build|build|view|buildID=%s'; +$lang->action->label->build = '版本|build|view|buildID=%s'; $lang->action->label->bug = 'Bug|bug|view|bugID=%s'; $lang->action->label->case = '用例|testcase|view|caseID=%s'; $lang->action->label->testtask = '测试单|testtask|view|caseID=%s'; $lang->action->label->testsuite = '测试套件|testsuite|view|suiteID=%s'; $lang->action->label->caselib = '测试库|testsuite|libview|libID=%s'; -$lang->action->label->todo = 'todo|todo|view|todoID=%s'; +$lang->action->label->todo = '待办|todo|view|todoID=%s'; $lang->action->label->doclib = '文档库|doc|browse|libID=%s'; $lang->action->label->doc = '文档|doc|view|docID=%s'; $lang->action->label->user = '用户|user|view|account=%s'; diff --git a/module/common/model.php b/module/common/model.php index ae81a18f3c..33b97885e3 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -293,6 +293,7 @@ class commonModel extends model public static function printAboutBar() { global $app, $lang; + echo html::a(helper::createLink('misc', 'changeLog'), $lang->changeLog, '', "class='iframe' data-width='800' data-headerless='true' data-backdrop='true' data-keyboard='true'"); if(!commonModel::isTutorialMode() and $app->user->account != 'guest') echo html::a(helper::createLink('tutorial', 'start'), $lang->tutorial, '', "class='iframe' data-width='800' data-headerless='true' data-backdrop='true' data-keyboard='true'"); echo html::a(helper::createLink('misc', 'about'), $lang->aboutZenTao . $lang->zentaoPMS, '', "class='about iframe' data-width='900' data-headerless='true' data-backdrop='true' data-keyboard='true' data-class='modal-about'"); } diff --git a/module/common/view/header.html.php b/module/common/view/header.html.php index 32e5d52afb..01049c702f 100755 --- a/module/common/view/header.html.php +++ b/module/common/view/header.html.php @@ -50,6 +50,15 @@ if($extHookFiles) foreach($extHookFiles as $extHookFile) include $extHookFile; echo '
            • ' . html::a($this->createLink($storyModule, $storyMethod), $storyName) . '
            • '; list($taskName, $taskModule, $taskMethod) = explode('|', $lang->my->menu->testtask['link']); echo '
            • ' . html::a($this->createLink($taskModule, $taskMethod), $taskName) . '
            • '; + echo "
            • "; + echo '
            • ' . html::a($this->createLink('user', 'logout'), $lang->logout) . '
            • '; + echo "'; ?>
          • diff --git a/www/theme/default/style.css b/www/theme/default/style.css index 9689552a82..e2b8a0fd47 100644 --- a/www/theme/default/style.css +++ b/www/theme/default/style.css @@ -75,12 +75,11 @@ a,a:focus,a:active {text-decoration: none; outline:none;} /* dropdown */ .dropdown-menu {min-width: 80px; padding: 4px 0; z-index:1020;} .dropdown-menu > li > a, .dropdown-header {font-size: 12px; padding: 5px 25px 5px 15px} -.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:active {background: #f1f1f1; font-weight: bold;} .dropdown-menu > .active {position: relative;} .dropdown-menu > .active > a:before {content: '\e60d'; font-family: ZentaoIcon; font-size: 14px; position: absolute; right: 8px; top: 4px; display: block; color: #808080; font-weight: normal;} .dropdown-submenu > a {min-width: 80px;} .dropdown-menu .divider {margin: 4px 0;} -.dropdown-submenu.left > .dropdown-menu{left: -110px;} +.dropdown-submenu.left > .dropdown-menu{left: -82px;} /* hr */ hr.small {margin: 10px 0} From 95db27aa7b4807a12f36788b7a2492e06ba40abb Mon Sep 17 00:00:00 2001 From: wangyidong Date: Tue, 30 Jan 2018 09:57:56 +0800 Subject: [PATCH 160/206] * adjust for check custom pri. --- module/bug/view/create.html.php | 4 ++-- module/story/view/create.html.php | 4 ++-- module/task/view/create.html.php | 2 +- module/testcase/view/create.html.php | 2 +- module/testsuite/view/createcase.html.php | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/module/bug/view/create.html.php b/module/bug/view/create.html.php index 947148fefd..6936c712b5 100644 --- a/module/bug/view/create.html.php +++ b/module/bug/view/create.html.php @@ -165,7 +165,7 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate); $hasCustomSeverity = false; foreach($lang->bug->severityList as $severityKey => $severityValue) { - if($severityKey != $severityValue) + if($severityKey != $severityValue or strlen($severityKey) != strlen($severityValue)) { $hasCustomSeverity = true; break; @@ -190,7 +190,7 @@ js::set('confirmDeleteTemplate', $lang->bug->confirmDeleteTemplate); $hasCustomPri = false; foreach($lang->bug->priList as $priKey => $priValue) { - if($priKey != $priValue) + if($priKey != $priValue or strlen($priKey) != strlen($priValue)) { $hasCustomPri = true; break; diff --git a/module/story/view/create.html.php b/module/story/view/create.html.php index 0303cb03b6..eb9e3f3a9e 100644 --- a/module/story/view/create.html.php +++ b/module/story/view/create.html.php @@ -113,14 +113,14 @@ $hasCustomPri = false; foreach($lang->story->priList as $priKey => $priValue) { - if($priKey != $priValue) + if($priKey != $priValue or strlen($priKey) != strlen($priValue)) { $hasCustomPri = true; break; } } ?> - + story->priList, $pri, "class='form-control minw-80px chosen'");?>