This commit is contained in:
tianshujie98
2021-01-27 16:09:10 +08:00
19 changed files with 59 additions and 82 deletions
+5 -5
View File
@@ -141,13 +141,13 @@ package:
rm -rf zentaopms/tools
pms:
make common
#make zentaoxx
#unzip zentaoxx.*.zip
#cp zentaoxx/* zentaopms/ -r
#cat zentaoxx/db/xuanxuan.sql >> zentaopms/db/zentao.sql
make zentaoxx
unzip zentaoxx.*.zip
cp zentaoxx/* zentaopms/ -r
cat zentaoxx/db/xuanxuan.sql >> zentaopms/db/zentao.sql
make package
zip -rq -9 ZenTaoPMS.$(VERSION).zip zentaopms
rm -fr zentaopms #zentaoxx zentaoxx.*.zip
rm -fr zentaopms #entaoxx zentaoxx.*.zip
deb:
mkdir buildroot
cp -r build/debian/DEBIAN buildroot
+2 -2
View File
@@ -48,8 +48,8 @@ $lang->block->delayed = '已延期';
$lang->block->noData = '当前统计类型下暂无数据';
$lang->block->emptyTip = '暂无信息';
$lang->block->createdTodos = '创建的待办数';
$lang->block->createdRequirements = '创建的' . $lang->generalUR . '数';
$lang->block->createdStories = '创建的' . $lang->generalSR . '数';
$lang->block->createdRequirements = '创建的' . $lang->URCommon . '数';
$lang->block->createdStories = '创建的' . $lang->SRCommon . '数';
$lang->block->finishedTasks = '完成的任务数';
$lang->block->createdBugs = '提交的Bug数';
$lang->block->resolvedBugs = '解决的Bug数';
+8 -8
View File
@@ -8,31 +8,31 @@
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdRequirements;?></div>
<div class="tile-amount"><?php echo empty($data['createdRequirements']) ? 0 : html::a($this->createLink('my', 'story', 'type=openedBy&storyType=requirement'), (int)$data['createdRequirements']);?></div>
<div class="tile-amount"><?php echo empty($data['createdRequirements']) ? 0 : (int)$data['createdRequirements'];?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdStories;?></div>
<div class="tile-amount"><?php echo empty($data['createdStories']) ? 0 : html::a($this->createLink('my', 'story', 'type=openedBy'), (int)$data['createdStories']);?></div>
<div class="tile-amount"><?php echo empty($data['createdStories']) ? 0 : (int)$data['createdStories'];?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->finishedTasks;?></div>
<div class="tile-amount"><?php echo empty($data['finishedTasks']) ? 0 : html::a($this->createLink('my', 'task', 'type=finishedBy'), (int)$data['finishedTasks']);?></div>
<div class="tile-amount"><?php echo empty($data['finishedTasks']) ? 0 : html::a($this->createLink('my', 'contribute', 'mode=task&type=finishedBy'), (int)$data['finishedTasks']);?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdBugs;?></div>
<div class="tile-amount"><?php echo empty($data['createdBugs']) ? 0 : html::a($this->createLink('my', 'bug', 'type=openedBy'), (int)$data['createdBugs']);?></div>
<div class="tile-amount"><?php echo empty($data['createdBugs']) ? 0 : (int)$data['createdBugs'];?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->resolvedBugs;?></div>
<div class="tile-amount"><?php echo empty($data['resolvedBugs']) ? 0 : html::a($this->createLink('my', 'bug', 'type=resolvedBy'), (int)$data['resolvedBugs']);?></div>
<div class="tile-amount"><?php echo empty($data['resolvedBugs']) ? 0 : html::a($this->createLink('my', 'contribute', 'mode=bug&type=resolvedBy'), (int)$data['resolvedBugs']);?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdCases;?></div>
<div class="tile-amount"><?php echo empty($data['createdCases']) ? 0 : html::a($this->createLink('my', 'testcase', 'type=openedbyme'), (int)$data['createdCases']);?></div>
<div class="tile-amount"><?php echo empty($data['createdCases']) ? 0 : (int)$data['createdCases'];?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdRisks;?></div>
<div class="tile-amount"><?php echo $data['createdRisks'];?></div>
<div class="tile-amount"><?php echo empty($data['createdRisks']) ? 0 : html::a($this->createLink('my', 'contribute', 'mode=risk'), (int)$data['createdRisks']);?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->resolvedRisks;?></div>
@@ -40,7 +40,7 @@
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->createdIssues;?></div>
<div class="tile-amount"><?php echo $data['createdIssues'];?></div>
<div class="tile-amount"><?php echo empty($data['createdIssues']) ? 0 : html::a($this->createLink('my', 'contribute', 'mode=issue'), (int)$data['createdIssues']);?></div>
</div>
<div class="col-xs-4 tile">
<div class="tile-title"><?php echo $lang->block->resolvedIssues;?></div>
@@ -46,10 +46,10 @@
</div>
<div class="col-4 tile">
<div class="overview-title"><i class="icon icon-cost"></i> <?php echo $lang->block->spent;?></div>
<?php $budget = $totalData[$projectID]->budget != 0 ? zget($lang->program->currencySymbol, $totalData[$projectID]->budgetUnit) . number_format($totalData[$projectID]->budget, 2) : $lang->program->future;?>
<div class="tile-amount"><?php echo $budget;?></div>
<div class="tile-amount">¥0</div>
<div class="tile-info">
<span class="extra-tips"><?php echo $lang->block->budget . ' ' . $budget;?></span>
<?php $budget = $totalData[$projectID]->budget != 0 ? zget($lang->program->currencySymbol, $totalData[$projectID]->budgetUnit) . number_format($totalData[$projectID]->budget, 2) : $lang->program->future;?>
<span class="extra-tips"><?php echo $lang->block->budget . ' ' . $budget;?></span>
</div>
</div>
</div>
+1 -1
View File
@@ -45,7 +45,7 @@
<?php $libLink = inlink('browse', "libID=$libID&browseType=all&param=0&orderBy=id_desc&from=$from");?>
<?php if($libID == 'project') $libLink = inlink('allLibs', "type=project&product=$object->id");?>
<?php if($libID == 'files') $libLink = inlink('showFiles', "type=$type&objectID=$object->id");?>
<?php if($libID == 'files') $libLink = inlink('showFiles', "type=$type&objectID=$object->id&from=$from");?>
<?php $icon = 'icon-folder text-yellow';?>
<?php if($libID == 'files') $icon = 'icon-paper-clip text-brown';?>
+1 -1
View File
@@ -27,7 +27,7 @@
<?php $libLink = inlink('browse', "libID=$libID&browseType=all&param=0&orderBy=id_desc&from=$from");?>
<?php if($libID == 'project') $libLink = inlink('allLibs', "type=project&product=$object->id");?>
<?php if($libID == 'files') $libLink = inlink('showFiles', "type=$type&objectID=$object->id");?>
<?php if($libID == 'files') $libLink = inlink('showFiles', "type=$type&objectID=$object->id&from=$from");?>
<tr>
<td class="c-name"><?php echo html::a($libLink, $lib->name, '', "data-group=$from");?></td>
<td class="c-num"><?php echo $lib->allCount . $lang->doc->item;?></td>
+1 -1
View File
@@ -70,7 +70,7 @@
if(link.prj) return 'project';
if(methodLowerCase === 'objectlibs' && (link.params.type || link.params.$3) == 'product') return 'product';
if(methodLowerCase === 'showfiles' && (link.params.type || link.params.$1) == 'product') return 'product';
if(methodLowerCase === 'showfiles' && (link.params.from || link.params.$3) == 'product') return 'product';
if(methodLowerCase === 'browse' && (link.params.from || link.params.$5) == 'product') return 'product';
if(methodLowerCase === 'view' && (link.params.from || link.params.$3) == 'product') return 'product';
if(methodLowerCase === 'edit' && (link.params.from || link.params.$3) == 'product') return 'product';
+1 -1
View File
@@ -20,7 +20,7 @@ js::set('menuItems', commonModel::getMainNavList($app->rawModule));
js::set('defaultOpen', $open);
?>
<?php if(isset($this->config->bizVersion)):?>
<style>#searchbox .dropdown-menu.show-quick-go.with-active {top: -465px; max-height: 462px;}</style>
<style>#searchbox .dropdown-menu.show-quick-go.with-active {top: -468px; max-height: 465px;}</style>
<?php endif;?>
<div id='menu'>
<nav id='menuNav' data-group='<?php echo $app->rawModule; ?>'>
+2 -3
View File
@@ -6,8 +6,7 @@ table+table{border-top: 1px solid #eee;}
.row td{width: 33%; text-align: left; font-weight: 700;}
.main-actions{margin: 20px 0 20px 0; text-align: center;}
.user-title{margin: 10px 10px -10px 10px; font-size: 14px; font-weight: bold; padding-left: 10px;}
.avatar { display: inline-block; width: 50px; height: 50px; line-height: 50px;}
.avatar{display: inline-block; width: 50px; height: 50px; line-height: 50px;}
.avatar .btn{padding: 0;vertical-align: revert; border: 0;}
.user-name{margin-left: 15px}
.user-name, .user-role{font-size: 16px; vertical-align: top;}
#avatarUploadBtn{padding: 4px 12px; position: relative; left: 32px; bottom: 30px;}
#avatarForm{height: 10px}
+5 -16
View File
@@ -15,25 +15,14 @@
<div class='cell'>
<div class='main-header text-center'>
<span class="avatar avatar bg-secondary avatar-circle">
<?php
if($user->avatar)
{
echo html::image($user->avatar);
}
else
{
echo strtoupper($user->account[0]);
}
?>
<form method='post' class='form-ajax' action=<?php echo inlink('uploadAvatar');?> id='avatarForm' enctype='multipart/form-data'>
<input type="file" name="files" id="files" class="form-control hidden">
<?php $avatar = $user->avatar ? html::image($user->avatar) : strtoupper($user->account[0]);?>
<?php echo html::a('javascript:void(0);', $avatar, '', "class='btn btn-avatar' id='avatarUploadBtn' data-placement='right'");?>
</form>
</span>
<?php if(!isset($fromModule)):?>
<span class='user-name'><strong><?php echo $user->realname;?></strong></span>
<span class='user-role'><?php echo zget($lang->user->roleList, $user->role);?></span>
<form method='post' class='form-ajax' action=<?php echo inlink('uploadAvatar');?> id='avatarForm' enctype='multipart/form-data'>
<input type="file" name="files" id="files" class="form-control hidden">
<?php echo html::a('javascript:void(0);', $lang->my->uploadAvatar, '', "class='btn btn-avatar' id='avatarUploadBtn' data-placement='right'");?>
</form>
<?php endif;?>
</div>
<div class='row'>
<table>
+3 -3
View File
@@ -61,9 +61,9 @@
<td class='c-status' title='<?php echo $status;?>'>
<span class="status-project status-<?php echo $project->status?>"><?php echo $status;?></span>
</td>
<td><?php echo $project->budget != 0 ? $project->budget . zget($this->lang->program->unitList, $project->budgetUnit) : $this->lang->program->future;?></td>
<td class="text-center"><?php echo $project->hours->totalEstimate;?></td>
<td class="text-center"><?php echo $project->hours->totalConsumed;?></td>
<td><?php echo $project->budget != 0 ? zget($lang->program->currencySymbol, $project->budgetUnit) . number_format($project->budget, 2) : $this->lang->program->future;?></td>
<td class="text-center" title="<?php echo $project->hours->totalEstimate . ' ' . $lang->project->workHour;?>"><?php echo $project->hours->totalEstimate . ' ' . $lang->project->workHourUnit;?></td>
<td class="text-center" title="<?php echo $project->hours->totalConsumed . ' ' . $lang->project->workHour;?>"><?php echo $project->hours->totalConsumed . ' ' . $lang->project->workHourUnit;?></td>
<td>
<div class='progress-pie' data-doughnut-size='80' data-color='#00da88' data-value='<?php echo $project->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
<div class='progress-info'><?php echo $project->hours->progress;?>%</div>
+8 -15
View File
@@ -1001,16 +1001,12 @@ class program extends control
$linkedProducts = $programID != $project->parent ? array() : $this->project->getProducts($projectID);
$parentProgram = $this->program->getPGMByID($programID);
/* If the story of the product which linked the execution under the project, you don't allow to remove the product. */
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->fetchAll('story');
$projectStoryIdList = array_keys($projectStories);
/* If the story of the product which linked the project, you don't allow to remove the product. */
$notRemoveProducts = array();
foreach($linkedProducts as $productID => $linkedProduct)
{
$productStories = $this->loadModel('story')->getProductStories($productID);
$productStoryIdList = array_keys($productStories);
$storyIntersect = array_intersect($projectStoryIdList, $productStoryIdList);
if(!empty($storyIntersect)) array_push($notRemoveProducts, $productID);
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->andWhere('product')->eq($productID)->fetchAll('story');
if(!empty($projectStories)) array_push($notRemoveProducts, $productID);
}
foreach($linkedProducts as $product)
@@ -1735,19 +1731,16 @@ class program extends control
$this->loadModel('product');
$project = $this->project->getById($projectID);
/* If the story of the product which linked the execution under the project, you don't allow to remove the product. */
$allProducts = $this->program->getPGMProductPairs($project->parent, 'assign', 'noclosed');
$linkedProducts = $this->project->getProducts($project->id);
$linkedBranches = array();
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->fetchAll('story');
$projectStoryIdList = array_keys($projectStories);
$notRemoveProducts = array();
/* If the story of the product which linked the project, you don't allow to remove the product. */
$notRemoveProducts = array();
foreach($linkedProducts as $productID => $linkedProduct)
{
$productStories = $this->loadModel('story')->getProductStories($productID);
$productStoryIdList = array_keys($productStories);
$storyIntersect = array_intersect($projectStoryIdList, $productStoryIdList);
if(!empty($storyIntersect)) array_push($notRemoveProducts, $productID);
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->andWhere('product')->eq($productID)->fetchAll('story');
if(!empty($projectStories)) array_push($notRemoveProducts, $productID);
}
/* Merge allProducts and linkedProducts for closed product. */
+1 -1
View File
@@ -74,7 +74,7 @@
?>
</div>
</td>
<?php $endValue = $program->end == LONG_TIME ? 999 : '';?>
<?php $endValue = $program->end == LONG_TIME ? 999 : (strtotime($program->end) - strtotime($program->begin)) / 3600 / 24 + 1;?>
<td colspan='2'><?php echo html::radio('delta', $lang->program->endList , $endValue, "onclick='computeEndDate(this.value)'");?></td>
</tr>
<tr>
+1 -1
View File
@@ -79,7 +79,7 @@
?>
</div>
</td>
<?php $deltaValue = $project->end == LONG_TIME ? 999 : '';?>
<?php $deltaValue = $project->end == LONG_TIME ? 999 : (strtotime($project->end) - strtotime($project->begin)) / 3600 / 24 + 1;?>
<td colspan='2'><?php echo html::radio('delta', $lang->program->endList , $deltaValue, "onclick='computeEndDate(this.value)'");?></td>
</tr>
<?php if($project->model == 'scrum'):?>
+6 -14
View File
@@ -1290,15 +1290,11 @@ class project extends control
$linkedBranches = array();
/* If the story of the product which linked the execution, you don't allow to remove the product. */
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->fetchAll('story');
$projectStoryIdList = array_keys($projectStories);
$notRemoveProducts = array();
$notRemoveProducts = array();
foreach($linkedProducts as $productID => $linkedProduct)
{
$productStories = $this->loadModel('story')->getProductStories($productID);
$productStoryIdList = array_keys($productStories);
$storyIntersect = array_intersect($projectStoryIdList, $productStoryIdList);
if(!empty($storyIntersect)) array_push($notRemoveProducts, $productID);
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->andWhere('product')->eq($productID)->fetchAll('story');
if(!empty($projectStories)) array_push($notRemoveProducts, $productID);
}
foreach($linkedProducts as $product)
@@ -2010,15 +2006,11 @@ class project extends control
$linkedBranches = array();
/* If the story of the product which linked the execution, you don't allow to remove the product. */
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->fetchAll('story');
$projectStoryIdList = array_keys($projectStories);
$notRemoveProducts = array();
$notRemoveProducts = array();
foreach($linkedProducts as $productID => $linkedProduct)
{
$productStories = $this->loadModel('story')->getProductStories($productID);
$productStoryIdList = array_keys($productStories);
$storyIntersect = array_intersect($projectStoryIdList, $productStoryIdList);
if(!empty($storyIntersect)) array_push($notRemoveProducts, $productID);
$projectStories = $this->dao->select('*')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->andWhere('product')->eq($productID)->fetchAll('story');
if(!empty($projectStories)) array_push($notRemoveProducts, $productID);
}
// Merge allProducts and linkedProducts for closed product.
+3 -5
View File
@@ -2176,11 +2176,9 @@ class projectModel extends model
$project = $this->dao->findById($projectID)->from(TABLE_PROJECT)->fetch();
if($project->type == 'project')
{
$executions = $this->dao->select('*')->from(TABLE_PROJECT)->where('parent')->eq($projectID)->fetchAll('id');
$projectStoryList = $this->dao->select('story')->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->fetchAll('story');
$executionStoryList = $this->dao->select('story')->from(TABLE_PROJECTSTORY)->where('project')->in(array_keys($executions))->fetchAll('story');
$storyIntersect = array_intersect(array_keys($projectStoryList), array_keys($executionStoryList));
if(in_array($storyID, $storyIntersect)) die(js::alert($this->lang->project->notAllowedUnlinkStory));
$executions = $this->dao->select('*')->from(TABLE_PROJECT)->where('parent')->eq($projectID)->fetchAll('id');
$executionStories = $this->dao->select('project,story')->from(TABLE_PROJECTSTORY)->where('story')->eq($storyID)->andWhere('project')->in(array_keys($executions))->fetchAll();
if(!empty($executionStories)) die(js::alert($this->lang->project->notAllowedUnlinkStory));
}
$this->dao->delete()->from(TABLE_PROJECTSTORY)->where('project')->eq($projectID)->andWhere('story')->eq($storyID)->limit(1)->exec();
+1 -1
View File
@@ -57,7 +57,7 @@
<td><span class='label-pri label-pri-<?php echo $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri, $task->pri);?>'><?php echo $task->pri == '0' ? '' : zget($lang->task->priList, $task->pri, $task->pri);?></span></td>
<td class='text-left nobr'><?php if(!common::printLink('task', 'view', "task=$task->id", $task->name)) echo $task->name;?></td>
<td <?php echo $class;?>><?php echo $task->assignedToRealName;?></td>
<td><?php echo $task->left;?></td>
<td title="<?php echo $task->left . ' ' . $lang->project->workHour;?>"><?php echo $task->left . ' ' . $lang->project->workHourUnit;?></td>
<td class=<?php if(isset($task->delay)) echo 'delayed';?>><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
<td><span class='status-task status-<?php echo $task->status;?>'><?php echo $this->processStatus('task', $task);?></span></td>
<td class='text-left nobr'>
+3
View File
@@ -1543,6 +1543,9 @@ class task extends control
$task->canceledDate = substr($task->canceledDate, 0, 10);
$task->closedDate = substr($task->closedDate, 0, 10);
$task->lastEditedDate = substr($task->lastEditedDate, 0, 10);
$task->estimate = $task->estimate . $this->lang->project->workHourUnit;
$task->consumed = $task->consumed . $this->lang->project->workHourUnit;
$task->left = $task->left . $this->lang->project->workHourUnit;
/* Set related files. */
$task->files = '';
+4 -1
View File
@@ -23,7 +23,10 @@ class upgrade extends control
$upgradeFile = $this->app->wwwRoot . 'upgrade.php';
if(!file_exists($upgradeFile)) $this->locate($this->createLink('my', 'index'));
if(version_compare($this->config->installedVersion, '20', '<'))
if((version_compare($this->config->installedVersion, '20', '<')
|| strpos($config->version, 'biz') !== false
|| strpos($config->version, 'pro') !== false)
&& strpos($config->version, 'max') === false)
{
/* Judge upgrade step. */
$upgradeStep = $this->loadModel('setting')->getItem('owner=system&module=common&section=global&key=upgradeStep');