This commit is contained in:
Yagami
2020-08-21 15:39:55 +08:00
20 changed files with 475 additions and 131 deletions
+24 -2
View File
@@ -1449,14 +1449,34 @@ class block extends control
$this->display();
}
/**
* Print contribute block.
*
* @access public
* @return void
*/
public function printContributeBlock()
{
$this->view->data = $this->block->getContributeBlockData();
}
/**
* Print recent program block.
*
* @access public
* @return void
*/
public function printRecentprogramBlock()
{
$programs = $this->block->getRecentProject();
$this->loadModel('project');
foreach($programs as $programID => $program)
{
$program->teamCount = count($this->project->getTeamMembers($program->id));
}
$this->view->programs = $programs;
}
public function printProgramteamBlock()
@@ -1607,7 +1627,9 @@ class block extends control
*/
public function printScrumprojectBlock()
{
$this->view->program = $this->loadModel('project')->getByID($this->session->program);
$this->view->projectOverview = $this->dao->select('count(*) total, count(if(status="doing", id, null)) as doing, count(if(status="closed", id, null)) as finish')->from(TABLE_PROJECT)
->where('program')->eq($this->session->program)
->fetch();
}
/**
+21
View File
@@ -26,3 +26,24 @@ body {padding-bottom: 20px;}
#dashboard .block-sm .hide-in-sm {display: none;}
#dashboard .block-dynamic .panel-body{overflow-x:hidden;}
.modal-body{padding: 10px 20px 20px 20px;}
#cards {margin: 0 10px;}
#cards > .col {width: 33.33%;}
#cards .panel {margin: 10px 0; border: 1px solid #DCDCDC; border-radius: 2px; box-shadow: none; height: 146px; cursor: pointer;}
#cards .panel:hover {border-color: #006AF1; box-shadow: 0 0 10px 0 rgba(0,0,100,.25);}
#cards .panel-heading {padding: 12px 24px 10px 16px;}
#cards .panel-body {padding: 0 16px 16px;}
#cards .panel-actions {padding: 7px 0;}
#cards .panel-actions .dropdown-menu > li > a {padding-left: 5px; text-align: left;}
#cards .panel-actions .dropdown-menu > li > a > i {opacity: .5; display: inline-block; margin-right: 4px; width: 18px; text-align: center;}
#cards .panel-actions .dropdown-menu > li > a:hover > i {opacity: 1;}
#cards .project-type-label {padding: 1px 2px;}
#cards .project-name {font-size: 16px; font-weight: normal; display: inline-block; max-width: 80%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle;}
#cards .project-infos {font-size: 12px;}
#cards .project-infos > span {display: inline-block; line-height: 12px;}
#cards .project-infos > span > .icon {font-size: 12px; display: inline-block; position: relative; top: -1px}
#cards .project-infos > span + span {margin-left: 15px;}
#cards .project-detail {position: absolute; bottom: 16px; left: 16px; right: 16px; font-size: 12px;}
#cards .project-detail > p {margin-bottom: 8px;}
#cards .project-detail .progress {height: 4px;}
#cards .project-detail .progress-text-left .progress-text {width: 50px; left: -50px;}
+2
View File
@@ -50,6 +50,8 @@ $lang->block->openedStories = 'The Number Of Stories Created';
$lang->block->resolvedTasks = 'The Number Of Tasks Resolved';
$lang->block->resolvedBugs = 'The Number Of Bugs Resolved';
$lang->block->openedTestcases = 'The Number Of Test Case Created';
$lang->block->cmmi = 'CMMI 3';
$lang->block->scrum = 'Scrum+';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Name';
+2
View File
@@ -50,6 +50,8 @@ $lang->block->openedStories = 'The Number Of Stories Created';
$lang->block->resolvedTasks = 'The Number Of Tasks Resolved';
$lang->block->resolvedBugs = 'The Number Of Bugs Resolved';
$lang->block->openedTestcases = 'The Number Of Test Case Created';
$lang->block->cmmi = 'CMMI 3';
$lang->block->scrum = 'Scrum+';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Name';
+2
View File
@@ -50,6 +50,8 @@ $lang->block->openedStories = 'The Number Of Stories Created';
$lang->block->resolvedTasks = 'The Number Of Tasks Resolved';
$lang->block->resolvedBugs = 'The Number Of Bugs Resolved';
$lang->block->openedTestcases = 'The Number Of Test Case Created';
$lang->block->cmmi = 'CMMI 3';
$lang->block->scrum = 'Scrum+';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Nom';
+2
View File
@@ -50,6 +50,8 @@ $lang->block->openedStories = 'The Number Of Stories Created';
$lang->block->resolvedTasks = 'The Number Of Tasks Resolved';
$lang->block->resolvedBugs = 'The Number Of Bugs Resolved';
$lang->block->openedTestcases = 'The Number Of Test Case Created';
$lang->block->cmmi = 'CMMI 3';
$lang->block->scrum = 'Scrum+';
$lang->block->params = new stdclass();
$lang->block->params->name = 'Tên';
+2
View File
@@ -51,6 +51,8 @@ $lang->block->openedStories = '创建的需求数';
$lang->block->resolvedTasks = '完成的任务数';
$lang->block->resolvedBugs = '解决Bug数';
$lang->block->openedTestcases = '创建用例数';
$lang->block->cmmi = 'CMMI 3';
$lang->block->scrum = 'Scrum+';
$lang->block->params = new stdclass();
$lang->block->params->name = '参数名称';
+2
View File
@@ -50,6 +50,8 @@ $lang->block->openedStories = '創建的需求數';
$lang->block->resolvedTasks = '完成的任務數';
$lang->block->resolvedBugs = '解決Bug數';
$lang->block->openedTestcases = '創建用例數';
$lang->block->cmmi = 'CMMI 3';
$lang->block->scrum = 'Scrum+';
$lang->block->params = new stdclass();
$lang->block->params->name = '參數名稱';
+75
View File
@@ -624,6 +624,12 @@ class blockModel extends model
return $blockPairs;
}
/**
* Get contribute block data.
*
* @access public
* @return array
*/
public function getContributeBlockData()
{
$data = array();
@@ -654,6 +660,75 @@ class blockModel extends model
return $data;
}
public function getRecentProject()
{
$projects = $this->loadModel('program')->getUserPrograms('all', 'id_desc', 3);
if(empty($projects)) return array();
$this->loadModel('project');
foreach($projects as $projectID => $project)
{
$project->teamCount = count($this->project->getTeamMembers($project->id));
}
$projectKeys = array_keys($projects);
$hours = array();
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
/* Get all tasks and compute totalEstimate, totalConsumed, totalLeft, progress according to them. */
$tasks = $this->dao->select('id, project, estimate, consumed, `left`, status, closedReason')
->from(TABLE_TASK)
->where('project')->in($projectKeys)
->andWhere('parent')->lt(1)
->andWhere('deleted')->eq(0)
->fetchGroup('project', 'id');
/* Compute totalEstimate, totalConsumed, totalLeft. */
foreach($tasks as $projectID => $projectTasks)
{
$hour = (object)$emptyHour;
foreach($projectTasks as $task)
{
if($task->status != 'cancel')
{
$hour->totalEstimate += $task->estimate;
$hour->totalConsumed += $task->consumed;
}
if($task->status != 'cancel' and $task->status != 'closed') $hour->totalLeft += $task->left;
}
$hours[$projectID] = $hour;
}
/* Compute totalReal and progress. */
foreach($hours as $hour)
{
$hour->totalEstimate = round($hour->totalEstimate, 1) ;
$hour->totalConsumed = round($hour->totalConsumed, 1);
$hour->totalLeft = round($hour->totalLeft, 1);
$hour->totalReal = $hour->totalConsumed + $hour->totalLeft;
$hour->progress = $hour->totalReal ? round($hour->totalConsumed / $hour->totalReal, 3) * 100 : 0;
}
/* Process projects. */
foreach($projects as $key => $project)
{
// Process the end time.
$project->end = date(DT_DATE1, strtotime($project->end));
/* Judge whether the project is delayed. */
if($project->status != 'done' and $project->status != 'closed' and $project->status != 'suspended')
{
$delay = helper::diffDate(helper::today(), $project->end);
if($delay > 0) $project->delay = $delay;
}
/* Process the hours. */
$project->hours = isset($hours[$project->id]) ? $hours[$project->id] : (object)$emptyHour;
}
return $projects;
}
/**
* Build number params.
*
@@ -0,0 +1,58 @@
<div class='row cell' id='cards'>
<?php foreach ($programs as $projectID => $project):?>
<div class='col'>
<div class='panel'>
<div class='panel-heading'>
<?php if($project->template === 'cmmi'): ?>
<span class='project-type-label label label-warning label-outline'><?php echo $lang->block->cmmi; ?></span>
<?php else: ?>
<span class='project-type-label label label-info label-outline'><?php echo $lang->block->scrum; ?></span>
<?php endif; ?>
<strong class='project-name' title='<?php echo $project->name;?>'><?php echo $project->name;?></strong>
<nav class='panel-actions nav nav-default'>
<li class='dropdown'>
<a href='javascript:;' data-toggle='dropdown' class='panel-action'><i class='icon icon-ellipsis-v'></i></a>
<ul class='dropdown-menu pull-right'>
<li><?php common::printIcon('program', 'group', "projectID=$project->id", $project, 'button', 'group');?></li>
<li><?php common::printIcon('program', 'manageMembers', "projectID=$project->id", $project, 'button', 'persons');?></li>
<li><?php common::printicon('program', 'activate', "projectid=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
<li><?php if(common::hasPriv('program', 'edit')) echo html::a($this->createLink("program", "edit", "projectID=$project->id"), "<i class='icon-edit'></i> " . $lang->edit, '', "");?></li>
<li><?php common::printIcon('program', 'start', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
<li><?php common::printIcon('program', 'suspend', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
<li><?php common::printIcon('program', 'close', "projectID=$project->id", $project, 'button', '', '', 'iframe', true);?></li>
<li><?php if(common::hasPriv('program', 'delete')) echo html::a($this->createLink("project", "delete", "projectID=$project->id"), "<i class='icon-trash'></i> " . $lang->delete, 'hiddenwin', "");?></li>
</ul>
</li>
</nav>
</div>
<div class='panel-body'>
<div class='project-infos'>
<span><i class='icon icon-group'></i> <?php printf($lang->program->membersUnit, $project->teamCount); ?></span>
<span><i class='icon icon-clock'></i> <?php printf($lang->program->hoursUnit, $project->hours->totalEstimate); ?></span>
<span><i class='icon icon-cost'></i> <?php echo $project->budget . '' . zget($lang->program->unitList, $project->budgetUnit);?></span>
</div>
<?php if($project->template === 'cmmi'): ?>
<div class='project-detail project-stages'>
<p class='text-muted'><?php echo $lang->program->ongoingStage; ?></p>
<div class='label label-outline'><?php echo zget($lang->project->statusList, $project->status);?></div>
</div>
<?php else: ?>
<div class='project-detail project-iteration'>
<p class='text-muted'><?php echo $lang->program->lastIteration; ?></p>
<div class='row'>
<div class='col-xs-5'><?php echo $project->name; ?></div>
<div class='col-xs-7'>
<div class="progress progress-text-left">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $project->hours->progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $project->hours->progress;?>%">
<span class="progress-text"><?php echo $project->hours->progress;?>%</span>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
<?php endforeach;?>
</div>
@@ -0,0 +1,47 @@
<?php
/**
* The testtask block view file of block module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Yidong Wang <yidong@cnezsoft.com>
* @package block
* @version $Id$
* @link http://www.zentao.net
*/
?>
<?php if(empty($projectOverview)): ?>
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
<?php else:?>
<style>
.status-bars {
display: table;
width: 60%;
height: 140px;
padding: 5px;
padding-top: 50px;
margin: 0;
overflow: hidden;
}
</style>
<div class="panel-body table-row">
<div class="col-4 text-middle text-center">
<div class="tile">
<div class="tile-title">所有阶段</div>
<div class="tile-amount">25</div>
</div>
</div>
<div class="col-8 text-middle">
<ul class="status-bars" style="transform: rotate(90deg);">
<li>
<span class="bar" style="height: 0%"><span class="value">0</span></span>
<span class="title">进行中</span>
</li>
<li>
<span class="bar" style="height: 100%"><span class="value">100</span></span>
<span class="title">已挂起</span>
</li>
</ul>
</div>
</div>
<?php endif;?>