diff --git a/module/block/view/ticketblock.html.php b/module/block/view/ticketblock.html.php
new file mode 100644
index 0000000000..2adf8a7a39
--- /dev/null
+++ b/module/block/view/ticketblock.html.php
@@ -0,0 +1,36 @@
+
+
+
diff --git a/module/bug/config.php b/module/bug/config.php
index 5ac6e7d586..a2dc0c6292 100644
--- a/module/bug/config.php
+++ b/module/bug/config.php
@@ -24,7 +24,7 @@ $config->bug->list->allFields = 'id, module, execution, story, task,
lastEditedBy,
lastEditedDate';
-$config->bug->list->defaultFields = 'id,severity,pri,title,openedBy,assignedTo,resolvedBy,resolution';
+$config->bug->list->defaultFields = 'id,title,severity,pri,openedBy,assignedTo,resolvedBy,resolution';
$config->bug->exportFields = 'id, product, branch, module, project, execution, story, task,
title, keywords, severity, pri, type, os, browser,
@@ -159,7 +159,7 @@ $config->bug->search['params']['deadline'] = array('operator' => '=',
$config->bug->search['params']['activatedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->bug->datatable = new stdclass();
-$config->bug->datatable->defaultField = array('id', 'severity', 'pri', 'confirmed', 'title', 'status', 'openedBy', 'openedDate', 'assignedTo', 'resolution', 'actions');
+$config->bug->datatable->defaultField = array('id', 'title', 'severity', 'pri', 'status', 'openedBy', 'openedDate', 'confirmed', 'assignedTo', 'resolution', 'actions');
$config->bug->datatable->fieldList['id']['title'] = 'idAB';
$config->bug->datatable->fieldList['id']['fixed'] = 'left';
@@ -174,6 +174,12 @@ $config->bug->datatable->fieldList['module']['control'] = 'select';
$config->bug->datatable->fieldList['module']['title'] = 'module';
$config->bug->datatable->fieldList['module']['dataSource'] = array('module' => 'tree', 'method' => 'getOptionMenu', 'params' => '$productID&bug');
+$config->bug->datatable->fieldList['title']['title'] = 'title';
+$config->bug->datatable->fieldList['title']['fixed'] = 'left';
+$config->bug->datatable->fieldList['title']['width'] = 'auto';
+$config->bug->datatable->fieldList['title']['required'] = 'yes';
+$config->bug->datatable->fieldList['title']['minWidth'] = '200';
+
$config->bug->datatable->fieldList['severity']['title'] = 'severityAB';
$config->bug->datatable->fieldList['severity']['fixed'] = 'left';
$config->bug->datatable->fieldList['severity']['width'] = '50';
@@ -186,16 +192,10 @@ $config->bug->datatable->fieldList['pri']['width'] = '50';
$config->bug->datatable->fieldList['pri']['required'] = 'no';
$config->bug->datatable->fieldList['pri']['name'] = $lang->bug->pri;
-$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
-$config->bug->datatable->fieldList['confirmed']['fixed'] = 'left';
-$config->bug->datatable->fieldList['confirmed']['width'] = '100';
-$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
-
-$config->bug->datatable->fieldList['title']['title'] = 'title';
-$config->bug->datatable->fieldList['title']['fixed'] = 'left';
-$config->bug->datatable->fieldList['title']['width'] = 'auto';
-$config->bug->datatable->fieldList['title']['required'] = 'yes';
-$config->bug->datatable->fieldList['title']['minWidth'] = '200';
+$config->bug->datatable->fieldList['status']['title'] = 'statusAB';
+$config->bug->datatable->fieldList['status']['fixed'] = 'left';
+$config->bug->datatable->fieldList['status']['width'] = '80';
+$config->bug->datatable->fieldList['status']['required'] = 'no';
$config->bug->datatable->fieldList['branch']['title'] = 'branch';
$config->bug->datatable->fieldList['branch']['fixed'] = 'left';
@@ -230,10 +230,66 @@ $config->bug->datatable->fieldList['plan']['fixed'] = 'no';
$config->bug->datatable->fieldList['plan']['width'] = '120';
$config->bug->datatable->fieldList['plan']['required'] = 'no';
-$config->bug->datatable->fieldList['status']['title'] = 'statusAB';
-$config->bug->datatable->fieldList['status']['fixed'] = 'no';
-$config->bug->datatable->fieldList['status']['width'] = '80';
-$config->bug->datatable->fieldList['status']['required'] = 'no';
+$config->bug->datatable->fieldList['openedBy']['title'] = 'openedByAB';
+$config->bug->datatable->fieldList['openedBy']['fixed'] = 'no';
+$config->bug->datatable->fieldList['openedBy']['width'] = '80';
+$config->bug->datatable->fieldList['openedBy']['required'] = 'no';
+
+$config->bug->datatable->fieldList['openedDate']['title'] = 'openedDateAB';
+$config->bug->datatable->fieldList['openedDate']['fixed'] = 'no';
+$config->bug->datatable->fieldList['openedDate']['width'] = '90';
+$config->bug->datatable->fieldList['openedDate']['required'] = 'no';
+
+$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
+$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['openedBuild']['control'] = 'multiple';
+$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
+
+$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
+$config->bug->datatable->fieldList['confirmed']['fixed'] = 'no';
+$config->bug->datatable->fieldList['confirmed']['width'] = '100';
+$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
+
+$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
+$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
+$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
+$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
+$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' =>'getPairs', 'params' => 'noclosed|noletter');
+
+$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
+$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
+$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
+$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
+
+$config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
+$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
+$config->bug->datatable->fieldList['deadline']['width'] = '90';
+$config->bug->datatable->fieldList['deadline']['required'] = 'no';
+$config->bug->datatable->fieldList['deadline']['control'] = 'date';
+
+$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedBy';
+$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
+$config->bug->datatable->fieldList['resolvedBy']['width'] = '100';
+$config->bug->datatable->fieldList['resolvedBy']['required'] = 'no';
+
+$config->bug->datatable->fieldList['resolution']['title'] = 'resolutionAB';
+$config->bug->datatable->fieldList['resolution']['fixed'] = 'no';
+$config->bug->datatable->fieldList['resolution']['width'] = '110';
+$config->bug->datatable->fieldList['resolution']['required'] = 'no';
+
+$config->bug->datatable->fieldList['resolvedDate']['title'] = 'resolvedDateAB';
+$config->bug->datatable->fieldList['resolvedDate']['fixed'] = 'no';
+$config->bug->datatable->fieldList['resolvedDate']['width'] = '120';
+$config->bug->datatable->fieldList['resolvedDate']['required'] = 'no';
+
+$config->bug->datatable->fieldList['resolvedBuild']['title'] = 'resolvedBuild';
+$config->bug->datatable->fieldList['resolvedBuild']['fixed'] = 'no';
+$config->bug->datatable->fieldList['resolvedBuild']['width'] = '120';
+$config->bug->datatable->fieldList['resolvedBuild']['required'] = 'no';
+$config->bug->datatable->fieldList['resolvedBuild']['control'] = 'select';
+$config->bug->datatable->fieldList['resolvedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'resolvedBuild&id,name');
$config->bug->datatable->fieldList['activatedCount']['title'] = 'activatedCountAB';
$config->bug->datatable->fieldList['activatedCount']['fixed'] = 'no';
@@ -283,62 +339,6 @@ $config->bug->datatable->fieldList['mailto']['fixed'] = 'no';
$config->bug->datatable->fieldList['mailto']['width'] = '100';
$config->bug->datatable->fieldList['mailto']['required'] = 'no';
-$config->bug->datatable->fieldList['openedBy']['title'] = 'openedByAB';
-$config->bug->datatable->fieldList['openedBy']['fixed'] = 'no';
-$config->bug->datatable->fieldList['openedBy']['width'] = '80';
-$config->bug->datatable->fieldList['openedBy']['required'] = 'no';
-
-$config->bug->datatable->fieldList['openedDate']['title'] = 'openedDateAB';
-$config->bug->datatable->fieldList['openedDate']['fixed'] = 'no';
-$config->bug->datatable->fieldList['openedDate']['width'] = '90';
-$config->bug->datatable->fieldList['openedDate']['required'] = 'no';
-
-$config->bug->datatable->fieldList['openedBuild']['title'] = 'openedBuild';
-$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['openedBuild']['control'] = 'multiple';
-$config->bug->datatable->fieldList['openedBuild']['dataSource'] = array('module' => 'build', 'method' =>'getBuildPairs', 'params' => '$productID&$branch&noempty,noterminate,nodone,withbranch');
-
-$config->bug->datatable->fieldList['assignedTo']['title'] = 'assignedToAB';
-$config->bug->datatable->fieldList['assignedTo']['fixed'] = 'no';
-$config->bug->datatable->fieldList['assignedTo']['width'] = '120';
-$config->bug->datatable->fieldList['assignedTo']['required'] = 'no';
-$config->bug->datatable->fieldList['assignedTo']['dataSource'] = array('module' => 'user', 'method' =>'getPairs', 'params' => 'noclosed|noletter');
-
-$config->bug->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
-$config->bug->datatable->fieldList['assignedDate']['fixed'] = 'no';
-$config->bug->datatable->fieldList['assignedDate']['width'] = '90';
-$config->bug->datatable->fieldList['assignedDate']['required'] = 'no';
-
-$config->bug->datatable->fieldList['deadline']['title'] = 'deadline';
-$config->bug->datatable->fieldList['deadline']['fixed'] = 'no';
-$config->bug->datatable->fieldList['deadline']['width'] = '90';
-$config->bug->datatable->fieldList['deadline']['required'] = 'no';
-$config->bug->datatable->fieldList['deadline']['control'] = 'date';
-
-$config->bug->datatable->fieldList['resolvedBy']['title'] = 'resolvedByAB';
-$config->bug->datatable->fieldList['resolvedBy']['fixed'] = 'no';
-$config->bug->datatable->fieldList['resolvedBy']['width'] = '100';
-$config->bug->datatable->fieldList['resolvedBy']['required'] = 'no';
-
-$config->bug->datatable->fieldList['resolution']['title'] = 'resolutionAB';
-$config->bug->datatable->fieldList['resolution']['fixed'] = 'no';
-$config->bug->datatable->fieldList['resolution']['width'] = '110';
-$config->bug->datatable->fieldList['resolution']['required'] = 'no';
-
-$config->bug->datatable->fieldList['resolvedDate']['title'] = 'resolvedDateAB';
-$config->bug->datatable->fieldList['resolvedDate']['fixed'] = 'no';
-$config->bug->datatable->fieldList['resolvedDate']['width'] = '120';
-$config->bug->datatable->fieldList['resolvedDate']['required'] = 'no';
-
-$config->bug->datatable->fieldList['resolvedBuild']['title'] = 'resolvedBuild';
-$config->bug->datatable->fieldList['resolvedBuild']['fixed'] = 'no';
-$config->bug->datatable->fieldList['resolvedBuild']['width'] = '120';
-$config->bug->datatable->fieldList['resolvedBuild']['required'] = 'no';
-$config->bug->datatable->fieldList['resolvedBuild']['control'] = 'select';
-$config->bug->datatable->fieldList['resolvedBuild']['dataSource'] = array('module' => 'bug', 'method' =>'getRelatedObjects', 'params' => 'resolvedBuild&id,name');
-
$config->bug->datatable->fieldList['closedBy']['title'] = 'closedBy';
$config->bug->datatable->fieldList['closedBy']['fixed'] = 'no';
$config->bug->datatable->fieldList['closedBy']['width'] = '80';
diff --git a/module/bug/control.php b/module/bug/control.php
index 294d191642..d131fe34e4 100755
--- a/module/bug/control.php
+++ b/module/bug/control.php
@@ -967,14 +967,8 @@ class bug extends control
$changes = $this->bug->update($bugID);
if(dao::isError())
{
- if(defined('RUN_MODE') && RUN_MODE == 'api')
- {
- return $this->send(array('status' => 'error', 'message' => dao::getError()));
- }
- else
- {
- return print(js::error(dao::getError()));
- }
+ if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'error', 'message' => dao::getError()));
+ return print(js::error(dao::getError()));
}
}
@@ -1155,6 +1149,12 @@ class bug extends control
$assignedToList = array_filter($assignedToList);
if(empty($assignedToList)) $assignedToList = $this->user->getPairs('devfirst|noclosed');
}
+ if($bug->assignedTo and !isset($assignedToList[$bug->assignedTo]))
+ {
+ /* Fix bug #28378. */
+ $assignedTo = $this->user->getById($bug->assignedTo);
+ $assignedToList[$bug->assignedTo] = $assignedTo->realname;
+ }
if($bug->status == 'closed') $assignedToList['closed'] = 'Closed';
$branch = $product->type == 'branch' ? ($bug->branch > 0 ? $bug->branch . ',0' : '0') : '';
@@ -1826,7 +1826,7 @@ class bug extends control
$this->view->users = $users;
$this->view->assignedTo = $assignedTo;
$this->view->productBugs = $productBugs;
- $this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID);
+ $this->view->executions = $this->loadModel('product')->getExecutionPairsByProduct($productID, $bug->branch ? "0,{$bug->branch}" : 0, 'id_desc', $projectID, 'stagefilter');
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, $bug->branch, 'withbranch');
$this->view->actions = $this->action->getList('bug', $bugID);
$this->view->execution = isset($execution) ? $execution : '';
diff --git a/module/bug/css/browse.css b/module/bug/css/browse.css
index 55068d74be..8d9aac8543 100644
--- a/module/bug/css/browse.css
+++ b/module/bug/css/browse.css
@@ -2,7 +2,6 @@
.closed, .closed a {color: gray; text-decoration:line-through;}
.resolved, .resolved a {color: #8EC21F; text-decoration: none;}
.tree .closed, .tree .closed a {color: #003366; text-decoration: none;}
-td.delayed {color: #fff; background: #e84e0f !important;}
#bugForm .setting {height: 25px;}
.datatable-wrapper .table-datatable .datatable-row td {height: 37px;}
diff --git a/module/bug/model.php b/module/bug/model.php
index 70f4ae486c..55ba5696d3 100644
--- a/module/bug/model.php
+++ b/module/bug/model.php
@@ -78,7 +78,7 @@ class bugModel extends model
->join('mailto', ',')
->join('os', ',')
->join('browser', ',')
- ->remove('files,labels,uid,oldTaskID,contactListMenu,region,lane')
+ ->remove('files,labels,uid,oldTaskID,contactListMenu,region,lane,ticket')
->get();
if($bug->execution != 0) $bug->project = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($bug->execution)->fetch('project');
@@ -754,7 +754,7 @@ class bugModel extends model
/* Link bug to build and release. */
if($bug->resolution == 'fixed' and !empty($bug->resolvedBuild) and $oldBug->resolvedBuild != $bug->resolvedBuild)
{
- if(!empty($oldBug->resolvedBuild)) $this->loadModel('build')->unlinkBug((int)$oldBug->resolvedBuild, (int)$bugID);
+ if(!empty($oldBug->resolvedBuild)) $this->loadModel('build')->unlinkBug($oldBug->resolvedBuild, (int)$bugID);
$this->linkBugToBuild($bugID, $bug->resolvedBuild);
}
@@ -2214,6 +2214,7 @@ class bugModel extends model
if(!empty($run->task)) $testtask = $this->loadModel('testtask')->getById($run->task);
$executionID = isset($testtask->execution) ? $testtask->execution : 0;
+ if(!$executionID and $caseID > 0) $executionID = isset($run->case->execution) ? $run->case->execution : 0; // Fix feedback #1043.
if(!$executionID and $this->app->tab == 'execution') $executionID = $this->session->execution;
return array('title' => $title, 'steps' => $bugSteps, 'storyID' => $run->case->story, 'moduleID' => $run->case->module, 'version' => $run->case->version, 'executionID' => $executionID);
@@ -3297,6 +3298,9 @@ class bugModel extends model
$class .= ' text-ellipsis';
$title = "title='" . $browser . "'";
break;
+ case 'deadline':
+ $class .= ' text-center';
+ break;
}
if($id == 'deadline' && isset($bug->delay) && $bug->status == 'active') $class .= ' delayed';
@@ -3440,7 +3444,7 @@ class bugModel extends model
echo helper::isZeroDate($bug->assignedDate) ? '' : substr($bug->assignedDate, 5, 11);
break;
case 'deadline':
- echo helper::isZeroDate($bug->deadline) ? '' : substr($bug->deadline, 5, 11);
+ echo helper::isZeroDate($bug->deadline) ? '' : '
';
break;
case 'resolvedBy':
echo zget($users, $bug->resolvedBy, $bug->resolvedBy);
diff --git a/module/bug/view/create.html.php b/module/bug/view/create.html.php
index 3e93fb4a9c..815aea4dbf 100644
--- a/module/bug/view/create.html.php
+++ b/module/bug/view/create.html.php
@@ -160,11 +160,11 @@ if($this->app->tab == 'project') js::set('objectID', $projectID);
diff --git a/module/caselib/view/browse.html.php b/module/caselib/view/browse.html.php
index eed4bc7943..f987b8d54e 100644
--- a/module/caselib/view/browse.html.php
+++ b/module/caselib/view/browse.html.php
@@ -126,11 +126,11 @@ js::set('flow', $config->global->flow);
idAB);?>
-
caselib->getFlowExtendFields();
foreach($extendFields as $extendField) echo "
";
@@ -148,15 +148,15 @@ js::set('flow', $config->global->flow);
id);?>
-
" . $this->loadModel('flow')->getFieldValue($extendField, $case) . "";?>
| id);?> |
- design->typeList, $design->type);?> |
createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?> |
+ design->typeList, $design->type);?> |
+ design->printAssignedHtml($design, $users);?> |
createdBy);?> |
createdDate, 0, 11);?> |
- design->printAssignedHtml($design, $users);?> |
id}";
diff --git a/module/dev/model.php b/module/dev/model.php
index 207f1e893a..42a52c5914 100644
--- a/module/dev/model.php
+++ b/module/dev/model.php
@@ -69,7 +69,7 @@ class devModel extends model
$type = substr($rawField->type, 0, $firstPOS > 0 ? $firstPOS : strlen($rawField->type));
$type = str_replace(array('big', 'small', 'medium', 'tiny'), '', $type);
$field = array();
- $field['name'] = isset($this->lang->$module->{$rawField->field}) ? sprintf($this->lang->$module->{$rawField->field}, $this->lang->dev->tableList[$module]) : '';
+ $field['name'] = (isset($this->lang->$module->{$rawField->field}) and is_string($this->lang->$module->{$rawField->field})) ? sprintf($this->lang->$module->{$rawField->field}, $this->lang->dev->tableList[$module]) : '';
if((empty($field['name']) or !is_string($field['name'])) and $aliasModule) $field['name'] = isset($this->lang->$aliasModule->{$rawField->field}) ? $this->lang->$aliasModule->{$rawField->field} : '';
if($subLang) $field['name'] = isset($this->lang->$aliasModule->$subLang->{$rawField->field}) ? $this->lang->$aliasModule->$subLang->{$rawField->field} : $field['name'];
if(!is_string($field['name'])) $field['name'] = '';
diff --git a/module/doc/lang/de.php b/module/doc/lang/de.php
index 285060e931..6a42fea1f2 100644
--- a/module/doc/lang/de.php
+++ b/module/doc/lang/de.php
@@ -61,9 +61,11 @@ $lang->doc->keywords = 'Tags';
$lang->doc->url = 'URL';
$lang->doc->files = 'Datei';
$lang->doc->addedBy = 'Angelegt von';
+$lang->doc->addedByAB = 'Added';
$lang->doc->addedDate = 'Angelegt am';
$lang->doc->editedBy = 'Bearbeitet von';
$lang->doc->editedDate = 'Bearbeitet am';
+$lang->doc->lastEditedBy = 'Last Editor';
$lang->doc->version = 'Version';
$lang->doc->basicInfo = 'Basis Info';
$lang->doc->deleted = 'Gelöscht';
diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php
index db444b059f..5cd7cc5654 100644
--- a/module/doc/lang/en.php
+++ b/module/doc/lang/en.php
@@ -61,9 +61,11 @@ $lang->doc->keywords = 'Tags';
$lang->doc->url = 'URL';
$lang->doc->files = 'Files';
$lang->doc->addedBy = 'Author';
+$lang->doc->addedByAB = 'Added';
$lang->doc->addedDate = 'Added';
$lang->doc->editedBy = 'UpdatedBy';
$lang->doc->editedDate = 'Updated';
+$lang->doc->lastEditedBy = 'Last Editor';
$lang->doc->version = 'Version';
$lang->doc->basicInfo = 'Basic Information';
$lang->doc->deleted = 'Deleted';
diff --git a/module/doc/lang/fr.php b/module/doc/lang/fr.php
index cb11214407..54651a1c76 100644
--- a/module/doc/lang/fr.php
+++ b/module/doc/lang/fr.php
@@ -61,9 +61,11 @@ $lang->doc->keywords = 'Tags';
$lang->doc->url = 'URL';
$lang->doc->files = 'Fichiers';
$lang->doc->addedBy = 'Auteur';
+$lang->doc->addedByAB = 'Added';
$lang->doc->addedDate = 'Ajouté le';
$lang->doc->editedBy = 'Màj par';
$lang->doc->editedDate = 'Màj le';
+$lang->doc->lastEditedBy = 'Last Editor';
$lang->doc->version = 'Version';
$lang->doc->basicInfo = 'Infos de Base';
$lang->doc->deleted = 'Supprimé';
diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php
index 35f81e9190..4aaa6f37e2 100644
--- a/module/doc/lang/zh-cn.php
+++ b/module/doc/lang/zh-cn.php
@@ -61,9 +61,11 @@ $lang->doc->keywords = '关键字';
$lang->doc->url = '文档URL';
$lang->doc->files = '附件';
$lang->doc->addedBy = '由谁添加';
+$lang->doc->addedByAB = '创建者';
$lang->doc->addedDate = '添加时间';
$lang->doc->editedBy = '由谁更新';
$lang->doc->editedDate = '更新时间';
+$lang->doc->lastEditedBy = '最后更新者';
$lang->doc->version = '版本号';
$lang->doc->basicInfo = '基本信息';
$lang->doc->deleted = '已删除';
diff --git a/module/execution/config.php b/module/execution/config.php
index e3faacb40e..8a3c915336 100644
--- a/module/execution/config.php
+++ b/module/execution/config.php
@@ -8,7 +8,7 @@ $config->execution->ownerFields = array('PO', 'PM', 'QD', 'RD');
$config->execution->defaultBurnPeriod = 30;
$config->execution->list = new stdclass();
-$config->execution->list->exportFields = 'id,name,projectName,code,PM,begin,end,status,totalEstimate,totalConsumed,totalLeft,progress';
+$config->execution->list->exportFields = 'id,name,projectName,PM,begin,end,status,totalEstimate,totalConsumed,totalLeft,progress';
$config->execution->modelList['scrum'] = 'sprint';
$config->execution->modelList['waterfall'] = 'stage';
@@ -135,6 +135,7 @@ $config->execution->all->search['fields']['realEnd'] = $lang->execution->
$config->execution->all->search['fields']['closedBy'] = $lang->execution->closedBy;
$config->execution->all->search['fields']['lastEditedDate'] = $lang->execution->lastEditedDate;
$config->execution->all->search['fields']['closedDate'] = $lang->execution->closedDate;
+$config->execution->all->search['fields']['teamCount'] = $lang->execution->teamCount;
$config->execution->all->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
$config->execution->all->search['params']['id'] = array('operator' => '=', 'control' => 'input', 'values' => '');
@@ -150,6 +151,7 @@ $config->execution->all->search['params']['realEnd'] = array('operator' =
$config->execution->all->search['params']['closedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
$config->execution->all->search['params']['lastEditedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
$config->execution->all->search['params']['closedDate'] = array('operator' => '=', 'control' => 'input', 'values' => '', 'class' => 'date');
+$config->execution->all->search['params']['teamCount'] = array('operator' => '=', 'control' => 'input', 'values' => '');
$config->printKanban = new stdClass();
$config->printKanban->col['story'] = 1;
@@ -173,17 +175,13 @@ $config->execution->gantt->linkType['end']['end'] = 2;
$config->execution->gantt->linkType['begin']['end'] = 3;
$config->execution->datatable = new stdclass();
-if((!isset($config->setCode) or $config->setCode == 1) and $config->systemMode == 'new')
+if($config->systemMode == 'new')
{
- $config->execution->datatable->defaultField = array('id', 'name', 'code', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
-}
-elseif($config->systemMode == 'new')
-{
- $config->execution->datatable->defaultField = array('id', 'name', 'project', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
+ $config->execution->datatable->defaultField = array('id', 'name', 'project', 'status', 'PM', 'begin', 'end', 'estimate', 'consumed', 'left', 'progress', 'burn');
}
else
{
- $config->execution->datatable->defaultField = array('id', 'name', 'PM', 'status', 'progress', 'begin', 'end', 'estimate', 'consumed', 'left', 'burn');
+ $config->execution->datatable->defaultField = array('id', 'name', 'status', 'PM', 'begin', 'end', 'estimate', 'consumed', 'left', 'progress', 'burn');
}
$config->execution->datatable->fieldList['id']['title'] = 'idAB';
@@ -196,6 +194,15 @@ $config->execution->datatable->fieldList['name']['fixed'] = 'left';
$config->execution->datatable->fieldList['name']['width'] = 'auto';
$config->execution->datatable->fieldList['name']['required'] = 'yes';
+
+if($config->systemMode == 'new')
+{
+ $config->execution->datatable->fieldList['project']['title'] = 'project';
+ $config->execution->datatable->fieldList['project']['fixed'] = 'no';
+ $config->execution->datatable->fieldList['project']['width'] = '128';
+ $config->execution->datatable->fieldList['project']['required'] = 'no';
+}
+
if(!isset($config->setCode) or $config->setCode == 1)
{
$config->execution->datatable->fieldList['code']['title'] = 'execCode';
@@ -204,29 +211,15 @@ if(!isset($config->setCode) or $config->setCode == 1)
$config->execution->datatable->fieldList['code']['required'] = 'no';
}
-if($config->systemMode == 'new')
-{
- $config->execution->datatable->fieldList['project']['title'] = 'project';
- $config->execution->datatable->fieldList['project']['fixed'] = 'no';
- $config->execution->datatable->fieldList['project']['width'] = '100';
- $config->execution->datatable->fieldList['project']['required'] = 'no';
-}
-
-$config->execution->datatable->fieldList['PM']['title'] = 'owner';
-$config->execution->datatable->fieldList['PM']['fixed'] = 'no';
-$config->execution->datatable->fieldList['PM']['width'] = '70';
-$config->execution->datatable->fieldList['PM']['required'] = 'no';
-
$config->execution->datatable->fieldList['status']['title'] = 'execStatus';
$config->execution->datatable->fieldList['status']['fixed'] = 'no';
$config->execution->datatable->fieldList['status']['width'] = '100';
$config->execution->datatable->fieldList['status']['required'] = 'no';
-$config->execution->datatable->fieldList['progress']['title'] = 'progress';
-$config->execution->datatable->fieldList['progress']['fixed'] = 'no';
-$config->execution->datatable->fieldList['progress']['width'] = '70';
-$config->execution->datatable->fieldList['progress']['required'] = 'no';
-$config->execution->datatable->fieldList['progress']['sort'] = 'no';
+$config->execution->datatable->fieldList['PM']['title'] = 'owner';
+$config->execution->datatable->fieldList['PM']['fixed'] = 'no';
+$config->execution->datatable->fieldList['PM']['width'] = '70';
+$config->execution->datatable->fieldList['PM']['required'] = 'no';
$config->execution->datatable->fieldList['openedDate']['title'] = 'openedDate';
$config->execution->datatable->fieldList['openedDate']['fixed'] = 'no';
@@ -273,6 +266,12 @@ $config->execution->datatable->fieldList['left']['width'] = '70';
$config->execution->datatable->fieldList['left']['required'] = 'no';
$config->execution->datatable->fieldList['left']['sort'] = 'no';
+$config->execution->datatable->fieldList['progress']['title'] = 'progress';
+$config->execution->datatable->fieldList['progress']['fixed'] = 'no';
+$config->execution->datatable->fieldList['progress']['width'] = '70';
+$config->execution->datatable->fieldList['progress']['required'] = 'no';
+$config->execution->datatable->fieldList['progress']['sort'] = 'no';
+
$config->execution->datatable->fieldList['burn']['title'] = 'burn';
$config->execution->datatable->fieldList['burn']['fixed'] = 'no';
$config->execution->datatable->fieldList['burn']['width'] = '80';
diff --git a/module/execution/control.php b/module/execution/control.php
index efc0e4a767..dc766565f8 100644
--- a/module/execution/control.php
+++ b/module/execution/control.php
@@ -516,7 +516,10 @@ class execution extends control
$this->app->loadClass('pager', $static = true);
$recTotal = count($tasks2Imported);
$pager = new pager($recTotal, $recPerPage, $pageID);
+
$tasks2ImportedList = array_chunk($tasks2Imported, $pager->recPerPage, true);
+ $tasks2ImportedList = empty($tasks2ImportedList) ? $tasks2ImportedList : $tasks2ImportedList[$pageID - 1];
+ $tasks2ImportedList = $this->loadModel('task')->processTasks($tasks2ImportedList);
/* Save session. */
$this->app->session->set('taskList', $this->app->getURI(true), 'execution');
@@ -525,7 +528,7 @@ class execution extends control
$this->view->pager = $pager;
$this->view->position[] = html::a(inlink('browse', "executionID=$toExecution"), $execution->name);
$this->view->position[] = $this->lang->execution->importTask;
- $this->view->tasks2Imported = empty($tasks2ImportedList) ? $tasks2ImportedList : $tasks2ImportedList[$pageID - 1];
+ $this->view->tasks2Imported = $tasks2ImportedList;
$this->view->executions = $executions;
$this->view->executionID = $execution->id;
$this->view->fromExecution = $fromExecution;
@@ -3760,6 +3763,7 @@ class execution extends control
$this->view->from = $from;
$this->view->param = $param;
$this->view->isStage = (isset($project->model) and $project->model == 'waterfall') ? true : false;
+ $this->view->showBatchEdit = $this->cookie->showExecutionBatchEdit;
$this->display();
}
diff --git a/module/execution/css/all.css b/module/execution/css/all.css
index 872a6e1219..1c672bb874 100644
--- a/module/execution/css/all.css
+++ b/module/execution/css/all.css
@@ -27,7 +27,7 @@ td.flex span.project-type-label {min-width: 40px;}
.c-name > a, .table-children .text-left > a {padding-left: 5px;}
.has-child > span {margin-right: 5px;}
.c-name > .text-ellipsis {text-overflow: clip;}
-.c-code, .c-project {overflow: hidden; white-space: nowrap;}
+.c-code, .c-project {overflow: hidden; white-space: nowrap; padding: 0 8px;}
th.c-status, .c-begin, .c-end, .c-realBegan, .c-realEnd {text-align: center;}
.c-project{text-overflow: unset !important;}
@@ -38,3 +38,7 @@ canvas {height: 28px;}
#datatable-executionList .table-child-bottom.table-child-top > .c-name.flex {border-bottom: 2px solid #cbd0db !important;}
#datatable-executionList .parent.has-child.c-name.flex {border-bottom: 1px solid #cbd0db !important;}
#datatable-executionList tr:last-child .c-name.flex {margin-top: 1px !important;}
+
+.table thead .c-estimate.text-right,
+.table thead .c-consumed.text-right,
+.table thead .c-left.text-right {padding-right: 8px;}
diff --git a/module/execution/css/bug.css b/module/execution/css/bug.css
index 095e852326..0bb7c60563 100644
--- a/module/execution/css/bug.css
+++ b/module/execution/css/bug.css
@@ -6,7 +6,8 @@
.dropdown-list > li > a {display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.53846154; color: #141414; white-space: nowrap;}
.dropdown-list > li > a:hover,
.dropdown-list > li > a:focus {color: #1a4f85; text-decoration: none; background-color: #ddd;}
-td.delayed {color: #fff; background: #e84e0f !important;}
.c-severity {width: 80px;}
.c-confirmed {overflow: hidden;}
+.c-deadline {text-align: center;}
+#main {padding-bottom: 40px;}
diff --git a/module/execution/css/grouptask.css b/module/execution/css/grouptask.css
index ff7b32c085..2e54857cc4 100644
--- a/module/execution/css/grouptask.css
+++ b/module/execution/css/grouptask.css
@@ -27,4 +27,3 @@
.c-hours {white-space: nowrap; overflow: hidden; text-overflow: ellipsis; text-align: right;}
.c-user, .c-type {width: 70px;}
.c-progress {width: 60px;}
-.delayed {background: #e84e0f !important; color: white;}
diff --git a/module/execution/css/manageproducts.css b/module/execution/css/manageproducts.css
index f7304b36c3..3be7a6cec0 100644
--- a/module/execution/css/manageproducts.css
+++ b/module/execution/css/manageproducts.css
@@ -4,6 +4,6 @@
#productsBox .product.checked:hover {background: #E5FFE6; border: 1px solid #229F24;}
#productsBox .product .checkbox-primary {padding: 9px; cursor: pointer;}
#productsBox .product.has-branch {padding-right: 40%;}
-#productsBox .product.has-branch > .chosen-container {position: absolute; width: 40% !important; right: 3px; top: 3px;}
-#productsBox .product.has-branch > .chosen-container > .chosen-single {background: rgba(0,0,0,.05);}
-#productsBox .product.has-branch > .chosen-container > .chosen-single:hover {background: #fff;}
+#productsBox .product.has-branch > .picker {position: absolute; width: 40% !important; right: 3px; top: 3px; background-color: unset;}
+#productsBox .product.has-branch > .picker > .picker-selections {background: rgba(0,0,0,.05);}
+#productsBox .product.has-branch > .picker > .picker-selections:hover {background: #fff;}
diff --git a/module/execution/css/task.css b/module/execution/css/task.css
index 20d6b20df0..e077d455af 100644
--- a/module/execution/css/task.css
+++ b/module/execution/css/task.css
@@ -1,4 +1,3 @@
-td.delayed {background: #e84e0f !important; color: white;}
#int-dropdown {margin-left: -8px; border-radius: 4px; border: 1px solid #0c64eb;}
#projectTaskForm table tbody tr td {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
.table td.c-estimate, .table td.c-consumed, .table td.c-left {padding-right: 12px;}
@@ -11,4 +10,4 @@ td.delayed {background: #e84e0f !important; color: white;}
#taskList .c-progress{padding-right: 8px; text-align: right;}
#datatable-taskList .c-progress{padding-right: 8px; text-align: right;}
.c-finishedBy, .c-lastEditedBy {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
-#executionTaskForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #F4F5F7; margin: 0 4px 0 0;}
+#executionTaskForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #F4F5F7; margin: 0 4px 0 0;}
\ No newline at end of file
diff --git a/module/execution/js/all.js b/module/execution/js/all.js
index 7d52829c0b..3f7384f54a 100644
--- a/module/execution/js/all.js
+++ b/module/execution/js/all.js
@@ -1,5 +1,17 @@
$(function()
{
+ $("#" + status + "Tab").addClass('btn-active-text');
+ $(document).on('click', '.plan-toggle', function(e)
+ {
+ var id = $(this).data('id');
+ var $toggle = $(this);
+ var isCollapsed = $toggle.toggleClass('collapsed').hasClass('collapsed');
+ $toggle.closest('#executionsForm').find('tr.parent-' + id).toggle(!isCollapsed);
+
+ e.stopPropagation();
+ e.preventDefault();
+ });
+
$('#executionTableList').on('sort.sortable', function(e, data)
{
var list = '';
@@ -60,6 +72,7 @@ $(function()
}
});
+ /* Update table summary text. */
$('#executionsForm').table(
{
statisticCreator: function(table)
@@ -67,21 +80,67 @@ $(function()
var $table = table.getTable();
var $checkedRows = $table.find(table.isDataTable ? '.datatable-row-left.checked' : 'tbody>tr.checked');
var $originTable = table.isDataTable ? table.$.find('.datatable-origin') : null;
- var $rows = $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
+ var checkedTotal = $checkedRows.length;
+ var $rows = checkedTotal ? $checkedRows : $table.find(table.isDataTable ? '.datatable-rows .datatable-row-left' : 'tbody>tr');
- var taskIdList = [];
+ var checkedWait = 0;
+ var checkedDoing = 0;
+ var executionIDList = [];
$rows.each(function()
{
var $row = $(this);
if($originTable) $row = $originTable.find('tbody>tr[data-id="' + $row.data('id') + '"]');
+
var data = $row.data();
- taskIdList.push(data.id);
+ executionIDList.push(data.id);
+
+ if(data.status === 'wait') checkedWait++;
+ if(data.status === 'doing') checkedDoing++;
});
+
+ if(status != 'all') return (checkedTotal ? checkedExecutions : executionSummary).replace('%s', $rows.length);
+ return (checkedTotal ? checkedSummary : pageSummary).replace('%total%', $rows.length).replace('%wait%', checkedWait).replace('%doing%', checkedDoing);
}
})
+
+ $('input[name^="showEdit"]').click(function()
+ {
+ $.cookie('showExecutionBatchEdit', $(this).is(':checked') ? 1 : 0, {expires: config.cookieLife, path: config.webRoot});
+ setCheckbox();
+ });
+ setCheckbox();
+
+ $('#executionTableList tr').on('click', function(e)
+ {
+ if($.cookie('showExecutionBatchEdit') != 1) e.stopPropagation();
+ });
});
+/**
+ * Location to product list.
+ *
+ * @param int productID
+ * @param int projectID
+ * @param string status
+ * @access public
+ * @return void
+ */
function byProduct(productID, projectID, status)
{
location.href = createLink('project', 'all', "status=" + status + "&project=" + projectID + "&orderBy=" + orderBy + '&productID=' + productID);
}
+
+/**
+ * Set batch edit checkbox.
+ *
+ * @access public
+ * @return void
+ */
+function setCheckbox()
+{
+ $('#executionsForm .checkbox-primary').hide();
+ $('.check-all, .sortable tr').removeClass('checked');
+ $(":checkbox[name^='executionIDList']").prop('checked', false);
+ $('#executionsForm').removeClass('has-row-checked');
+ if($.cookie('showExecutionBatchEdit') == 1) $('#executionsForm .checkbox-primary').show();
+}
diff --git a/module/execution/js/task.js b/module/execution/js/task.js
index d66daf4a2f..ec899288f9 100644
--- a/module/execution/js/task.js
+++ b/module/execution/js/task.js
@@ -13,7 +13,7 @@ $(function()
adjustTableFooter();
$('body').on('click', '#toggleFold', adjustTableFooter);
- $('body').on('click', '.icon.icon-angle-double-right', adjustTableFooter);
+ $('body').on('click', '.icon.icon-angle-right', adjustTableFooter);
/* The display of the adjusting sidebarHeader is synchronized with the sidebar. */
$(".sidebar-toggle").click(function()
diff --git a/module/execution/js/testtask.js b/module/execution/js/testtask.js
new file mode 100644
index 0000000000..7b904e5b23
--- /dev/null
+++ b/module/execution/js/testtask.js
@@ -0,0 +1,24 @@
+$(function()
+{
+ $('#testtaskForm').table(
+ {
+ replaceId: 'taskIdList',
+ statisticCreator: function(table)
+ {
+ var $table = table.getTable();
+ var $checkedRows = $table.find('tbody>tr.checked');
+ var checkedTotal = $checkedRows.length;
+ var checkedWait = $checkedRows.filter("[data-status=wait]").length;
+ var checkedTesting = $checkedRows.filter("[data-status=doing]").length;
+ var checkedBlocked = $checkedRows.filter("[data-status=blocked]").length;
+ var checkedDone = $checkedRows.filter("[data-status=done]").length;
+ var checkedStatistics = checkedAllSummary.replace('%total%', checkedTotal)
+ .replace('%wait%', checkedWait)
+ .replace('%testing%', checkedTesting)
+ .replace('%blocked%', checkedBlocked)
+ .replace('%done%', checkedDone);
+
+ return checkedTotal ? checkedStatistics : pageSummary;
+ }
+ });
+});
diff --git a/module/execution/lang/de.php b/module/execution/lang/de.php
index 9c88536042..7dd60f3ce2 100644
--- a/module/execution/lang/de.php
+++ b/module/execution/lang/de.php
@@ -54,6 +54,7 @@ $lang->execution->end = 'Ende';
$lang->execution->dateRange = 'Dauer';
$lang->execution->realBeganAB = 'Actual Begin';
$lang->execution->realEndAB = 'Actual End';
+$lang->execution->teamCount = 'Anzahl der Personen';
$lang->execution->realBegan = 'Tatsächlicher Start';
$lang->execution->realEnd = 'Tatsächliches Ende';
$lang->execution->to = 'An';
@@ -341,6 +342,9 @@ $lang->execution->stats = '%s Verfügbar, execution->taskSummary = "Aufgaben auf dieser Seite: %s Total, %s Wartend, %s In Arbeit; Stunden : %s geplant., %s genutzt, %s Rest.";
$lang->execution->pageSummary = "Aufgaben auf dieser Seite: %total%, %wait% Wartend, %doing% In Arbeit; Stunden: %estimate% geplant, %consumed% genutzt, %left% Rest.";
$lang->execution->checkedSummary = " %total% Geprüft, %wait% Wartend, %doing% In Arbeit; Stunden: %estimate% geplant, %consumed% genutzt, %left% Rest.";
+$lang->execution->executionSummary = "Total executions: %s.";
+$lang->execution->pageExecSummary = "Total executions: %total%. Waiting: %wait%. Doing: %doing%.";
+$lang->execution->checkedExecSummary = "Selected: %total%. Waiting: %wait%. Doing: %doing%.";
$lang->execution->memberHoursAB = "%s hat %s Stunden";
$lang->execution->memberHours = '';
$lang->execution->countSummary = '';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
$lang->execution->countTip = ' (%s member)';
$lang->execution->pleaseInput = "Enter";
$lang->execution->week = 'week';
-$lang->execution->checkedExecutions = 'Seleted %s items';
+$lang->execution->checkedExecutions = "Seleted %s {$lang->executionCommon}.";
/* Statistics. */
$lang->execution->charts = new stdclass();
diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php
index e5cfcf3eeb..8befda23c8 100644
--- a/module/execution/lang/en.php
+++ b/module/execution/lang/en.php
@@ -54,6 +54,7 @@ $lang->execution->end = 'Planned End';
$lang->execution->dateRange = 'Plan Duration';
$lang->execution->realBeganAB = 'Actual Begin';
$lang->execution->realEndAB = 'Actual End';
+$lang->execution->teamCount = 'number of people';
$lang->execution->realBegan = 'Actual Begin';
$lang->execution->realEnd = 'Actual End';
$lang->execution->to = 'To';
@@ -341,6 +342,9 @@ $lang->execution->stats = 'Available: %s(h). Est
$lang->execution->taskSummary = "Total tasks on this page:%s. Waiting: %s. Doing: %s. Estimates: %s(h). Cost: %s(h). Left: %s(h).";
$lang->execution->pageSummary = "Total tasks: %total%. Waiting: %wait%. Doing: %doing%. Estimates: %estimate%(h). Cost: %consumed%(h). Left: %left%(h).";
$lang->execution->checkedSummary = "Selected: %total%. Waiting: %wait%. Doing: %doing%. Estimates: %estimate%(h). Cost: %consumed%(h). Left: %left%(h).";
+$lang->execution->executionSummary = "Total {$lang->executionCommon}: %s.";
+$lang->execution->pageExecSummary = "Total {$lang->executionCommon}: %total%. Waiting: %wait%. Doing: %doing%.";
+$lang->execution->checkedExecSummary = "Selected: %total%. Waiting: %wait%. Doing: %doing%.";
$lang->execution->memberHoursAB = "%s has %s strong> hours.";
$lang->execution->memberHours = '';
$lang->execution->countSummary = '';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
$lang->execution->countTip = ' (%s member)';
$lang->execution->pleaseInput = "Enter";
$lang->execution->week = 'week';
-$lang->execution->checkedExecutions = 'Seleted %s items';
+$lang->execution->checkedExecutions = "Seleted %s {$lang->executionCommon}.";
/* Statistics. */
$lang->execution->charts = new stdclass();
diff --git a/module/execution/lang/fr.php b/module/execution/lang/fr.php
index 6764593377..6c3bcc38e3 100644
--- a/module/execution/lang/fr.php
+++ b/module/execution/lang/fr.php
@@ -54,6 +54,7 @@ $lang->execution->end = 'Fin';
$lang->execution->dateRange = 'Durée';
$lang->execution->realBeganAB = 'Actual Begin';
$lang->execution->realEndAB = 'Actual End';
+$lang->execution->teamCount = 'nombre de personnes';
$lang->execution->realBegan = 'Début effectif';
$lang->execution->realEnd = 'Clôture effective';
$lang->execution->to = 'à';
@@ -341,6 +342,9 @@ $lang->execution->stats = 'Disponible: %s(h). Es
$lang->execution->taskSummary = "Total des tâches de cette page :%s. A Faire: %s. En cours: %s. Estimé: %s(h). Coût: %s(h). Reste: %s(h).";
$lang->execution->pageSummary = "Total des tâches de cette page: %total%. A Faire: %wait%. En cours: %doing%. Estimé: %estimate%(h). Coût: %consumed%(h). Reste: %left%(h).";
$lang->execution->checkedSummary = "Sélectionné: %total%. A Faire: %wait%. En cours: %doing%. Estimé: %estimate%(h). Coût: %consumed%(h). Reste: %left%(h).";
+$lang->execution->executionSummary = "Total executions: %s.";
+$lang->execution->pageExecSummary = "Total executions: %total%. Waiting: %wait%. Doing: %doing%.";
+$lang->execution->checkedExecSummary = "Selected: %total%. Waiting: %wait%. Doing: %doing%.";
$lang->execution->memberHoursAB = "%s a %s strong> heures.";
$lang->execution->memberHours = '';
$lang->execution->countSummary = '';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "The {$lang->SRCommon} is not ac
$lang->execution->countTip = ' (%s member)';
$lang->execution->pleaseInput = "Enter";
$lang->execution->week = 'week';
-$lang->execution->checkedExecutions = "Pour s électionner l'élément%s";
+$lang->execution->checkedExecutions = "Pour s électionner l'élément%s.";
/* Statistics. */
$lang->execution->charts = new stdclass();
diff --git a/module/execution/lang/vi.php b/module/execution/lang/vi.php
index 5031004d73..e13b1a4eca 100644
--- a/module/execution/lang/vi.php
+++ b/module/execution/lang/vi.php
@@ -54,6 +54,7 @@ $lang->execution->RD = 'Quản lý phát hành';
$lang->execution->release = 'Phát hành';
$lang->execution->acl = 'Quyền truy cập';
$lang->execution->teamname = 'Tên đội nhóm';
+$lang->execution->teamCount = 'số người';
$lang->execution->order = "Đánh giá {$lang->executionCommon}";
$lang->execution->orderAB = "Đánh giá";
$lang->execution->products = "Liên kết {$lang->productCommon}";
diff --git a/module/execution/lang/zh-cn.php b/module/execution/lang/zh-cn.php
index 5d3bd56de2..12a9d17a87 100644
--- a/module/execution/lang/zh-cn.php
+++ b/module/execution/lang/zh-cn.php
@@ -54,6 +54,7 @@ $lang->execution->end = '计划完成';
$lang->execution->dateRange = '计划起止日期';
$lang->execution->realBeganAB = '实际开始';
$lang->execution->realEndAB = '实际完成';
+$lang->execution->teamCount = '人数';
$lang->execution->realBegan = '实际开始日期';
$lang->execution->realEnd = '实际完成日期';
$lang->execution->to = '至';
@@ -341,6 +342,9 @@ $lang->execution->stats = '可用工时 %s 工
$lang->execution->taskSummary = "本页共 %s 个任务,未开始 %s,进行中 %s,总预计 %s 工时,已消耗 %s 工时,剩余 %s 工时。";
$lang->execution->pageSummary = "本页共 %total% 个任务,未开始 %wait%,进行中 %doing%,总预计 %estimate% 工时,已消耗 %consumed% 工时,剩余 %left% 工时。";
$lang->execution->checkedSummary = "选中 %total% 个任务,未开始 %wait%,进行中 %doing%,总预计 %estimate% 工时,已消耗 %consumed% 工时,剩余 %left% 工时。";
+$lang->execution->executionSummary = "本页共 %s 个{$lang->executionCommon}。";
+$lang->execution->pageExecSummary = "本页共 %total% 个{$lang->executionCommon},未开始 %wait%,进行中 %doing%。";
+$lang->execution->checkedExecSummary = "选中 %total% 个{$lang->executionCommon},未开始 %wait%,进行中 %doing%。";
$lang->execution->memberHoursAB = " %s有 %s 工时 ";
$lang->execution->memberHours = '';
$lang->execution->countSummary = '';
@@ -415,7 +419,7 @@ $lang->execution->storyDragError = "该{$lang->SRCommon}不是激
$lang->execution->countTip = '(%s人)';
$lang->execution->pleaseInput = "请输入";
$lang->execution->week = '周';
-$lang->execution->checkedExecutions = '已选择%s项';
+$lang->execution->checkedExecutions = "共选中%s个{$lang->executionCommon}。";
/* 统计。*/
$lang->execution->charts = new stdclass();
diff --git a/module/execution/lang/zh-tw.php b/module/execution/lang/zh-tw.php
index 1c06be7dd3..2eb28b233b 100644
--- a/module/execution/lang/zh-tw.php
+++ b/module/execution/lang/zh-tw.php
@@ -54,6 +54,7 @@ $lang->execution->execPM = "{$lang->execution->common}負責人";
$lang->execution->QD = '測試負責人';
$lang->execution->RD = '發佈負責人';
$lang->execution->release = '發佈';
+$lang->execution->teamCount = '人數';
$lang->execution->acl = '訪問控制';
$lang->execution->teamname = '團隊名稱';
$lang->execution->updateOrder = '排序';
diff --git a/module/execution/model.php b/module/execution/model.php
index c8eb61f0ed..40f754c853 100644
--- a/module/execution/model.php
+++ b/module/execution/model.php
@@ -109,6 +109,13 @@ class executionModel extends model
unset($this->lang->execution->menu->build);
}
+ $stageFilter = array('request', 'design', 'review');
+ if($this->config->edition == 'open' and in_array($execution->attribute, $stageFilter))
+ {
+ unset($this->lang->execution->menu->qa);
+ unset($this->lang->execution->menu->build);
+ }
+
if($executions and (!isset($executions[$executionID]) or !$this->checkPriv($executionID))) $this->accessDenied();
$moduleName = $this->app->getModuleName();
@@ -362,7 +369,7 @@ class executionModel extends model
}
/* Check the workload format and total. */
- if(!empty($sprint->percent)) $this->checkWorkload('create', $sprint->percent);
+ if(!empty($sprint->percent)) $this->checkWorkload('create', $sprint->percent, $sprint->project);
/* Set planDuration and realDuration. */
if($this->config->edition == 'max')
@@ -1147,9 +1154,9 @@ class executionModel extends model
/**
* Check the workload format and total.
*
- * @param string $type create|update
- * @param int $percent
- * @param object $oldExecution
+ * @param string $type create|update
+ * @param int $percent
+ * @param object|int $oldExecution
* @access public
* @return bool
*/
@@ -1170,7 +1177,7 @@ class executionModel extends model
->andWhere('t2.type')->eq('stage')
->andWhere('t2.grade')->eq(1)
->andWhere('t2.deleted')->eq(0)
- ->andWhere('t2.parent')->eq($oldExecution->parent)
+ ->andWhere('t2.parent')->eq($oldExecution)
->fetch('total');
if($type == 'create') $percentTotal = $percent + $oldPercentTotal;
@@ -1531,6 +1538,15 @@ class executionModel extends model
$hours = $this->loadModel('project')->computerProgress($executions);
$burns = $this->getBurnData($executions);
+ /* Get the number of execution teams. */
+ $teams = $this->dao->select('t1.root,count(t1.id) as teams')->from(TABLE_TEAM)->alias('t1')
+ ->leftJoin(TABLE_USER)->alias('t2')->on('t1.account=t2.account')
+ ->where('t1.root')->in(array_keys($executions))
+ ->andWhere('t1.type')->ne('project')
+ ->andWhere('t2.deleted')->eq(0)
+ ->groupBy('t1.root')
+ ->fetchAll('root');
+
if($withTasks) $executionTasks = $this->getTaskGroupByExecution(array_keys($executions));
/* Process executions. */
@@ -1557,6 +1573,7 @@ class executionModel extends model
/* Process the hours. */
$execution->hours = isset($hours[$execution->id]) ? $hours[$execution->id] : (object)$emptyHour;
+ $execution->teamCount = isset($teams[$execution->id]) ? $teams[$execution->id]->teams : 0;
if(isset($executionTasks) and isset($executionTasks[$execution->id]))
{
@@ -4582,18 +4599,19 @@ class executionModel extends model
if(!$isChild)
{
$trClass = 'is-top-level table-nest-child-hide';
- $trAttrs = "data-id='$execution->id' data-order='$execution->order' data-nested='true'";
+ $trAttrs = "data-id='$execution->id' data-order='$execution->order' data-nested='true' data-status={$execution->status}";
}
else
{
$trClass = 'table-nest-hide';
- $trAttrs = "data-id={$execution->id} data-parent={$execution->parent}";
+ $trAttrs = "data-id={$execution->id} data-parent={$execution->parent} data-status={$execution->status}";
$trAttrs .= " data-nest-parent='$execution->parent' data-order='$execution->order' data-nest-path=',$execution->parent,$execution->id,'";
}
$burns = join(',', $execution->burns);
echo "";
- echo "| id class='table-nest-icon icon table-nest-toggle'>";
+ echo " | ";
+ if(common::hasPriv('execution', 'batchEdit')) echo "id class='table-nest-icon icon table-nest-toggle'>";
if($this->config->systemMode == 'new')
{
$spanClass = $execution->type == 'stage' ? 'label-warning' : 'label-info';
@@ -4601,7 +4619,7 @@ class executionModel extends model
}
if(empty($execution->children))
{
- echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name);
+ echo html::a(helper::createLink('execution', 'view', "executionID=$execution->id"), $execution->name, '', 'class="text-ellipsis"');
if(!helper::isZeroDate($execution->end))
{
if($execution->status != 'closed')
@@ -4612,7 +4630,7 @@ class executionModel extends model
}
else
{
- echo $execution->name;
+ echo "" . $execution->name . '';
if(!helper::isZeroDate($execution->end))
{
if($execution->status != 'closed')
@@ -4621,14 +4639,14 @@ class executionModel extends model
}
}
}
- echo ' | ' . zget($users, $execution->PM) . ' | ';
echo "" . zget($this->lang->project->statusList, $execution->status) . ' | ';
- echo '' . html::ring($execution->hours->progress) . ' | ';
+ echo '' . zget($users, $execution->PM) . ' | ';
echo helper::isZeroDate($execution->begin) ? ' | ' : '' . $execution->begin . ' | ';
echo helper::isZeroDate($execution->end) ? ' | ' : '' . $execution->end . ' | ';
- echo "" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . ' | ';
- echo "" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . ' | ';
- echo "" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . ' | ';
+ echo "" . $execution->hours->totalEstimate . $this->lang->execution->workHourUnit . ' | ';
+ echo "" . $execution->hours->totalConsumed . $this->lang->execution->workHourUnit . ' | ';
+ echo "" . $execution->hours->totalLeft . $this->lang->execution->workHourUnit . ' | ';
+ echo '' . html::ring($execution->hours->progress) . ' | ';
echo " | ";
echo '';
common::printIcon('execution', 'start', "executionID={$execution->id}", $execution, 'list', '', '', 'iframe', true);
@@ -4841,6 +4859,12 @@ class executionModel extends model
if(!empty($execution->children)) $class .= ' has-child';
}
+ if($id == 'teamCount')
+ {
+ $title = " title='{$execution->teamCount}'";
+ $class .= ' text-right';
+ }
+
if($id == 'project') $title = " title='{$execution->projectName}'";
if($id == 'code') $title = " title='{$execution->code}'";
@@ -4882,7 +4906,7 @@ class executionModel extends model
if(isset($execution->delay)) echo "{$this->lang->execution->delayed} ";
if(!empty($execution->children))
{
- echo "";
+ echo "";
}
break;
case 'code':
@@ -4909,6 +4933,9 @@ class executionModel extends model
case 'begin':
echo helper::isZeroDate($execution->begin) ? '' : $execution->begin;
break;
+ case 'teamCount':
+ echo $execution->teamCount;
+ break;
case 'end':
echo helper::isZeroDate($execution->end) ? '' : $execution->end;
break;
diff --git a/module/execution/view/all.html.php b/module/execution/view/all.html.php
index 715cf14aae..0e1283510f 100644
--- a/module/execution/view/all.html.php
+++ b/module/execution/view/all.html.php
@@ -16,17 +16,26 @@
$datatableId = $this->moduleName . ucfirst($this->methodName);
$useDatatable = (isset($config->datatable->$datatableId->mode) and $config->datatable->$datatableId->mode == 'datatable');
?>
-
-
-
+executionCommon, $lang->execution->common, $lang->execution->checkedExecSummary));
+js::set('pageSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->pageExecSummary));
+js::set('executionSummary', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->executionSummary));
+js::set('checkedExecutions', str_replace($lang->executionCommon, $lang->execution->common, $lang->execution->checkedExecutions));
+?>
execution->treeLevel['all']);
js::set('foldAll', $lang->execution->treeLevel['root']);
js::set('isCNLang', !$this->loadModel('common')->checkNotCN())
?>
+
| |