Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms
This commit is contained in:
+5
-33
@@ -759,46 +759,18 @@ class doc extends control
|
||||
*/
|
||||
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, '', false, true);
|
||||
|
||||
$objects = $this->doc->getOrderedObjects($type);
|
||||
if($type == 'product')
|
||||
{
|
||||
$objectID = $this->product->saveState($objectID, $objects);
|
||||
$table = TABLE_PRODUCT;
|
||||
|
||||
$libs = $this->doc->getLibsByObject('product', $objectID);
|
||||
|
||||
$this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs);
|
||||
}
|
||||
else if($type == 'project')
|
||||
{
|
||||
$objectID = $this->project->saveState($objectID, $objects);
|
||||
$table = TABLE_PROJECT;
|
||||
|
||||
$libs = $this->doc->getLibsByObject('project', $objectID);
|
||||
|
||||
$this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs);
|
||||
}
|
||||
else if($type == 'execution')
|
||||
{
|
||||
$objectID = $this->execution->saveState($objectID, $objects);
|
||||
$table = TABLE_EXECUTION;
|
||||
$libs = $this->doc->getLibsByObject('execution', $objectID);
|
||||
|
||||
$this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs);
|
||||
}
|
||||
$objects = $this->doc->getOrderedObjects($type);
|
||||
$objectID = $this->{$type}->saveState($objectID, $objects);
|
||||
$libs = $this->doc->getLibsByObject($type, $objectID);
|
||||
$this->lang->modulePageNav = $this->doc->select($type, $objects, $objectID, $libs);
|
||||
|
||||
$openApp = strpos('doc,product,project,execution', $this->app->openApp) !== false ? $this->app->openApp : 'doc';
|
||||
if($openApp != 'doc') $this->loadModel($openApp)->setMenu($objectID);
|
||||
|
||||
$table = $type == 'product' ? TABLE_PRODUCT : TABLE_PROJECT;
|
||||
$table = $this->config->objectTables[$type];
|
||||
$object = $this->dao->select('id,name,status')->from($table)->where('id')->eq($objectID)->fetch();
|
||||
|
||||
$this->lang->TRActions = $this->doc->buildCollectButton4Doc();
|
||||
|
||||
@@ -81,11 +81,11 @@ td.c-name a:visited {color: #082999;}
|
||||
#pageNav .dropdown-menu {max-height: 350px; overflow-y: auto;}
|
||||
|
||||
ol, ul {margin-bottom: 0}
|
||||
#dropMenu .table-col .list-group {padding-top: 5px;}
|
||||
#subHeader #dropMenu .table-col .list-group {padding-top: 5px;}
|
||||
#createDropdown ul.dropdown-menu {text-align: left;}
|
||||
#collection-menu {max-width: 300px;}
|
||||
#collection-menu li a {overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
|
||||
#project, #product, #custom, #book {min-height: 160px;}
|
||||
#project, #product, #custom, #book, #execution {min-height: 160px;}
|
||||
#title .menu-title {font-size: 15px; font-weight: 600; position: relative; padding: 2px 0 2px 15px; list-style: none;}
|
||||
#title .dropdown-menu {top: 38px;}
|
||||
.tree li > a {white-space: nowrap; text-overflow: ellipsis; overflow: hidden;}
|
||||
|
||||
+6
-33
@@ -2288,41 +2288,14 @@ EOT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if($type == 'product')
|
||||
{
|
||||
$objectID = $this->product->saveState($objectID, $objects);
|
||||
$table = TABLE_PRODUCT;
|
||||
$objectID = $this->loadModel($type)->saveState($objectID, $objects);
|
||||
$table = $this->config->objectTables[$type];
|
||||
$libs = $this->getLibsByObject($type, $objectID);
|
||||
|
||||
$libs = $this->getLibsByObject('product', $objectID);
|
||||
if($libID == 0) $libID = key($libs);
|
||||
$this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID);
|
||||
|
||||
if($libID == 0) $libID = key($libs);
|
||||
$this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID);
|
||||
|
||||
$this->app->rawMethod = 'product';
|
||||
}
|
||||
else if($type == 'project')
|
||||
{
|
||||
$objectID = $this->loadModel('project')->saveState($objectID, $objects);
|
||||
$table = TABLE_PROJECT;
|
||||
|
||||
$libs = $this->getLibsByObject('project', $objectID);
|
||||
|
||||
if($libID == 0) $libID = key($libs);
|
||||
$this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID);
|
||||
|
||||
$this->app->rawMethod = 'project';
|
||||
}
|
||||
else if($type == 'execution')
|
||||
{
|
||||
$objectID = $this->loadModel('execution')->saveState($objectID, $objects);
|
||||
$table = TABLE_EXECUTION;
|
||||
$libs = $this->getLibsByObject('execution', $objectID);
|
||||
|
||||
if($libID == 0) $libID = key($libs);
|
||||
$this->lang->modulePageNav = $this->select($type, $objects, $objectID, $libs, $libID);
|
||||
|
||||
$this->app->rawMethod = 'execution';
|
||||
}
|
||||
$this->app->rawMethod = $type;
|
||||
|
||||
$object = $this->dao->select('id,name,status')->from($table)->where('id')->eq($objectID)->fetch();
|
||||
if(empty($object)) die(js::locate(helper::createLink($type, 'create')));
|
||||
|
||||
@@ -10,9 +10,6 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php if($app->openApp == 'execution'): ?>
|
||||
<style>#heading {padding: 8px 0;}</style>
|
||||
<?php endif;?>
|
||||
<?php if(isset($tips)):?>
|
||||
<?php $defaultURL = $config->systemMode == 'new' ? $this->createLink('project', 'execution', "status=all&projectID=$projectID") : $this->createLink('execution', 'task', 'executionID=' . $executionID);?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
|
||||
@@ -300,7 +300,6 @@ class gitlab extends control
|
||||
|
||||
/* 'not[iids]' option in gitlab API has a issue when iids is too long. */
|
||||
$gitlabIssues = $this->gitlab->apiGetIssues($gitlabID, $projectID, '&state=opened');
|
||||
if(empty($gitlabIssues)) return $this->send(array('result' => 'fail', 'message' => $this->lang->gitlab->serverFail, 'locate' => $this->server->http_referer));
|
||||
foreach($gitlabIssues as $index => $issue)
|
||||
{
|
||||
foreach($savedIssueIDList as $savedIssueID)
|
||||
|
||||
@@ -108,3 +108,10 @@ $config->product->report->projectLabels[] = '';
|
||||
|
||||
$config->product->report->planLabels = array();
|
||||
$config->product->report->planLabels[] = '';
|
||||
|
||||
$config->product->statisticFields = array();
|
||||
$config->product->statisticFields['requirements'] = array('draftRequirements', 'activeRequirements', 'changedRequirements', 'closedRequirements');
|
||||
$config->product->statisticFields['stories'] = array('draftStories', 'activeStories', 'changedStories', 'closedStories');
|
||||
$config->product->statisticFields['bugs'] = array('unResolvedBugs', 'closedBugs', 'fixedBugs');
|
||||
$config->product->statisticFields['plans'] = array('plans');
|
||||
$config->product->statisticFields['releases'] = array('releases');
|
||||
|
||||
+60
-85
@@ -1611,105 +1611,80 @@ class productModel extends model
|
||||
$productStructure[$product->program][$product->line]['products'][$product->id] = $product;
|
||||
if($product->line)
|
||||
{
|
||||
/* Init vars. */
|
||||
if(!isset($productStructure[$product->program][$product->line]['totalRequirements'])) $productStructure[$product->program][$product->line]['totalRequirements'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['draftRequirments'])) $productStructure[$product->program][$product->line]['draftRequirments'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['activeRequirments'])) $productStructure[$product->program][$product->line]['activeRequirments'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['changedRequirments'])) $productStructure[$product->program][$product->line]['changedRequirments'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['closedRequirements'])) $productStructure[$product->program][$product->line]['closedRequirements'] = 0;
|
||||
|
||||
if(!isset($productStructure[$product->program][$product->line]['totalStories'])) $productStructure[$product->program][$product->line]['totalStories'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['draftStories'])) $productStructure[$product->program][$product->line]['draftStories'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['activeStories'])) $productStructure[$product->program][$product->line]['activeStories'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['changedStories'])) $productStructure[$product->program][$product->line]['changedStories'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['closedStories'])) $productStructure[$product->program][$product->line]['closedStories'] = 0;
|
||||
|
||||
if(!isset($productStructure[$product->program][$product->line]['unResolvedBugs'])) $productStructure[$product->program][$product->line]['unResolvedBugs'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['closedBugs'])) $productStructure[$product->program][$product->line]['closedBugs'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['fixedBugs'])) $productStructure[$product->program][$product->line]['fixedBugs'] = 0;
|
||||
|
||||
if(!isset($productStructure[$product->program][$product->line]['plans'])) $productStructure[$product->program][$product->line]['plans'] = 0;
|
||||
if(!isset($productStructure[$product->program][$product->line]['releases'])) $productStructure[$product->program][$product->line]['releases'] = 0;
|
||||
|
||||
/* Line name. */
|
||||
$productStructure[$product->program][$product->line]['lineName'] = $product->lineName;
|
||||
|
||||
/* Requirements. */
|
||||
$productStructure[$product->program][$product->line]['totalRequirements'] += $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed'];
|
||||
$productStructure[$product->program][$product->line]['draftRequirments'] += $product->requirements['draft'];
|
||||
$productStructure[$product->program][$product->line]['activeRequirments'] += $product->requirements['active'];
|
||||
$productStructure[$product->program][$product->line]['changedRequirments'] += $product->requirements['changed'];
|
||||
$productStructure[$product->program][$product->line]['closedRequirements'] += $product->requirements['closed'];
|
||||
|
||||
/* Stories. */
|
||||
$productStructure[$product->program][$product->line]['totalStories'] += $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed'];
|
||||
$productStructure[$product->program][$product->line]['draftStories'] += $product->stories['draft'];
|
||||
$productStructure[$product->program][$product->line]['activeStories'] += $product->stories['active'];
|
||||
$productStructure[$product->program][$product->line]['changedStories'] += $product->stories['changed'];
|
||||
$productStructure[$product->program][$product->line]['closedStories'] += $product->stories['closed'];
|
||||
|
||||
/* Bugs. */
|
||||
$productStructure[$product->program][$product->line]['unResolvedBugs'] += $product->unResolved;
|
||||
$productStructure[$product->program][$product->line]['closedBugs'] += $product->closedBugs;
|
||||
$productStructure[$product->program][$product->line]['fixedBugs'] += $product->fixedBugs;
|
||||
|
||||
/* Plans and releases. */
|
||||
$productStructure[$product->program][$product->line]['plans'] += $product->plans;
|
||||
$productStructure[$product->program][$product->line]['releases'] += $product->releases;
|
||||
$productStructure[$product->program][$product->line] = $this->statisticData('line', $productStructure, $product);
|
||||
}
|
||||
|
||||
if($product->program)
|
||||
{
|
||||
/* Init vars. */
|
||||
if(!isset($productStructure[$product->program]['totalRequirements'])) $productStructure[$product->program]['totalRequirements'] = 0;
|
||||
if(!isset($productStructure[$product->program]['draftRequirments'])) $productStructure[$product->program]['draftRequirments'] = 0;
|
||||
if(!isset($productStructure[$product->program]['activeRequirments'])) $productStructure[$product->program]['activeRequirments'] = 0;
|
||||
if(!isset($productStructure[$product->program]['changedRequirments'])) $productStructure[$product->program]['changedRequirments'] = 0;
|
||||
if(!isset($productStructure[$product->program]['closedRequirements'])) $productStructure[$product->program]['closedRequirements'] = 0;
|
||||
|
||||
if(!isset($productStructure[$product->program]['totalStories'])) $productStructure[$product->program]['totalStories'] = 0;
|
||||
if(!isset($productStructure[$product->program]['draftStories'])) $productStructure[$product->program]['draftStories'] = 0;
|
||||
if(!isset($productStructure[$product->program]['activeStories'])) $productStructure[$product->program]['activeStories'] = 0;
|
||||
if(!isset($productStructure[$product->program]['changedStories'])) $productStructure[$product->program]['changedStories'] = 0;
|
||||
if(!isset($productStructure[$product->program]['closedStories'])) $productStructure[$product->program]['closedStories'] = 0;
|
||||
|
||||
if(!isset($productStructure[$product->program]['unResolvedBugs'])) $productStructure[$product->program]['unResolvedBugs'] = 0;
|
||||
if(!isset($productStructure[$product->program]['closedBugs'])) $productStructure[$product->program]['closedBugs'] = 0;
|
||||
if(!isset($productStructure[$product->program]['fixedBugs'])) $productStructure[$product->program]['fixedBugs'] = 0;
|
||||
|
||||
if(!isset($productStructure[$product->program]['plans'])) $productStructure[$product->program]['plans'] = 0;
|
||||
if(!isset($productStructure[$product->program]['releases'])) $productStructure[$product->program]['releases'] = 0;
|
||||
|
||||
/* Program name. */
|
||||
$productStructure[$product->program]['programName'] = $product->programName;
|
||||
|
||||
/* Requirements. */
|
||||
$productStructure[$product->program]['totalRequirements'] += $product->requirements['active'] + $product->requirements['closed'] + $product->requirements['draft'] + $product->requirements['changed'];
|
||||
$productStructure[$product->program]['draftRequirments'] += $product->requirements['draft'];
|
||||
$productStructure[$product->program]['activeRequirments'] += $product->requirements['active'];
|
||||
$productStructure[$product->program]['changedRequirments'] += $product->requirements['changed'];
|
||||
$productStructure[$product->program]['closedRequirements'] += $product->requirements['closed'];
|
||||
|
||||
/* Stories. */
|
||||
$productStructure[$product->program]['totalStories'] += $product->stories['active'] + $product->stories['closed'] + $product->stories['draft'] + $product->stories['changed'];
|
||||
$productStructure[$product->program]['draftStories'] += $product->stories['draft'];
|
||||
$productStructure[$product->program]['activeStories'] += $product->stories['active'];
|
||||
$productStructure[$product->program]['changedStories'] += $product->stories['changed'];
|
||||
$productStructure[$product->program]['closedStories'] += $product->stories['closed'];
|
||||
|
||||
/* Bugs. */
|
||||
$productStructure[$product->program]['unResolvedBugs'] += $product->unResolved;
|
||||
$productStructure[$product->program]['closedBugs'] += $product->closedBugs;
|
||||
$productStructure[$product->program]['fixedBugs'] += $product->fixedBugs;
|
||||
|
||||
/* Plans and releases. */
|
||||
$productStructure[$product->program]['plans'] += $product->plans;
|
||||
$productStructure[$product->program]['releases'] += $product->releases;
|
||||
$productStructure[$product->program] = $this->statisticData('program', $productStructure, $product);
|
||||
}
|
||||
}
|
||||
return $productStructure;
|
||||
}
|
||||
|
||||
/**
|
||||
* Statistic product data.
|
||||
*
|
||||
* @param string $type
|
||||
* @param array $productStructure
|
||||
* @param object $product
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function statisticData($type = 'program', $productStructure = array(), $product = null)
|
||||
{
|
||||
/* Init vars. */
|
||||
$data = $type == 'program' ? $productStructure[$product->program] : $productStructure[$product->program][$product->line];
|
||||
foreach($this->config->product->statisticFields as $key => $fields)
|
||||
{
|
||||
/* Get the total number of requirements and stories. */
|
||||
if(strpos('stories|requirements', $key) !== false)
|
||||
{
|
||||
$totalObjects = 0;
|
||||
foreach($product->$key as $status => $number)
|
||||
{
|
||||
if(isset($this->lang->story->statusList[$status])) $totalObjects += $number;
|
||||
}
|
||||
|
||||
$fieldType = $key == 'stories' ? 'Stories' : 'Requirements';
|
||||
if(!isset($data['total' . $fieldType])) $data['total' . $fieldType] = 0;
|
||||
$data['total' . $fieldType] += $totalObjects;
|
||||
}
|
||||
elseif($key == 'bugs')
|
||||
{
|
||||
$fieldType = 'Bugs';
|
||||
}
|
||||
|
||||
foreach($fields as $field)
|
||||
{
|
||||
if(!isset($data[$field])) $data[$field] = 0;
|
||||
|
||||
$status = $field;
|
||||
if(strpos($field, 'Requirements') !== false or strpos($field, 'Stories') !== false or $field == 'unResolvedBugs')
|
||||
{
|
||||
$length = strpos($field, $fieldType);
|
||||
$status = substr($field, 0, $length);
|
||||
}
|
||||
|
||||
if(strpos('requirements|stories', $key) !== false)
|
||||
{
|
||||
$objects = $product->$key;
|
||||
$data[$field] += $objects[$status];
|
||||
}
|
||||
else
|
||||
{
|
||||
$data[$field] += $product->$status;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Judge an action is clickable or not.
|
||||
*
|
||||
|
||||
@@ -85,9 +85,9 @@
|
||||
<?php echo $program['programName']?>
|
||||
</td>
|
||||
<?php if($this->config->URAndSR):?>
|
||||
<td><?php echo $program['draftRequirments'];?></td>
|
||||
<td><?php echo $program['activeRequirments'];?></td>
|
||||
<td><?php echo $program['changedRequirments'];?></td>
|
||||
<td><?php echo $program['draftRequirements'];?></td>
|
||||
<td><?php echo $program['activeRequirements'];?></td>
|
||||
<td><?php echo $program['changedRequirements'];?></td>
|
||||
<td><?php echo $program['totalRequirements'] == 0 ? 0 : round($program['closedRequirements'] / $program['totalRequirements'], 3) * 100;?>%</td>
|
||||
<?php endif;?>
|
||||
<td><?php echo $program['draftStories'];?></td>
|
||||
@@ -111,8 +111,7 @@
|
||||
if($this->config->systemMode == 'new' and $programID)
|
||||
{
|
||||
$trAttrs = "data-id='line.$lineID' data-parent='program.$programID'";
|
||||
$trClass .= ' is-nest-child table-nest text-center';
|
||||
$trAttrs .= " data-nest-parent='program.$programID' data-nest-path='program.$programID,$lineID'";
|
||||
$trAttrs .= " data-nest-parent='program.$programID' data-nest-path='program.$programID,$lineID'" . "class='text-center'";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -127,9 +126,9 @@
|
||||
<?php echo $line['lineName']?>
|
||||
</td>
|
||||
<?php if($this->config->URAndSR):?>
|
||||
<td><?php echo $line['draftRequirments'];?></td>
|
||||
<td><?php echo $line['activeRequirments'];?></td>
|
||||
<td><?php echo $line['changedRequirments'];?></td>
|
||||
<td><?php echo $line['draftRequirements'];?></td>
|
||||
<td><?php echo $line['activeRequirements'];?></td>
|
||||
<td><?php echo $line['changedRequirements'];?></td>
|
||||
<td><?php echo $line['totalRequirements'] == 0 ? 0 : round($line['closedRequirements'] / $line['totalRequirements'], 3) * 100;?>%</td>
|
||||
<?php endif;?>
|
||||
<td><?php echo $line['draftStories'];?></td>
|
||||
|
||||
@@ -15,13 +15,14 @@ $(function()
|
||||
{
|
||||
changed = confirm(data.message);
|
||||
if(changed)
|
||||
{
|
||||
{
|
||||
/* Select change to the new program products. */
|
||||
var lastProductSelect = $('#productsBox .input-group:last select:first');
|
||||
if($(lastProductSelect).val() == 0) {
|
||||
if($(lastProductSelect).val() == 0)
|
||||
{
|
||||
var lastProductSelectID = $(lastProductSelect).attr("id");
|
||||
var lastProductSelectName = $(lastProductSelect).attr("name");
|
||||
$('#'+lastProductSelectID+'_chosen').remove();
|
||||
$('#' + lastProductSelectID + '_chosen').remove();
|
||||
$(lastProductSelect).replaceWith(data.newProducts);
|
||||
$('#productsBox .input-group:last select:first').attr('name', lastProductSelectName).attr('id', lastProductSelectID).chosen();
|
||||
}
|
||||
|
||||
@@ -405,6 +405,12 @@ class treeModel extends model
|
||||
if($type == 'story' or $type == 'bug')
|
||||
{
|
||||
$branchLink = helper::createLink($this->app->rawModule, $this->app->rawMethod, "productID=$rootID&branch=$branchID&browseType=bybranch" . $extraParams);
|
||||
|
||||
if($type == 'story' and $this->app->rawModule == 'projectstory')
|
||||
{
|
||||
$projectID = zget($extra, 'projectID', 0);
|
||||
$branchLink = helper::createLink($this->app->rawModule, $this->app->rawMethod, "projectID=$projectID&productID=$rootID&branch=$branchID&browseType=bybranch" . $extraParams);
|
||||
}
|
||||
$linkHtml = html::a($branchLink, $branch, "", "id=branch" . $branchID);
|
||||
}
|
||||
if($firstBranch and $product->type != 'normal')
|
||||
|
||||
Reference in New Issue
Block a user