Merge branch '20.x' of https://github.com/easysoft/zentaopms into 20.x
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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 = '参数名称';
|
||||
|
||||
@@ -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 = '參數名稱';
|
||||
|
||||
@@ -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;?>
|
||||
|
||||
Reference in New Issue
Block a user