Merge branch '20.x' of github.com:easysoft/zentaopms into 20.x

This commit is contained in:
tianshujie98
2020-08-20 10:25:48 +08:00
11 changed files with 1409 additions and 18 deletions
+1 -1
View File
@@ -9,4 +9,4 @@ $config->issue->editor = new stdclass();
$config->issue->editor->create = array('id' => 'desc', 'tools' => 'simpleTools');
$config->issue->editor->edit = array('id' => 'desc', 'tools' => 'simpleTools');
$config->issue->editor->cancel = array('id' => 'desc', 'tools' => 'simpleTools');
$config->issue->editor->resolve = array('id' => 'resolutionComment', 'tools' => 'simpleTools');
$config->issue->editor->resolve = array('id' => 'spec,steps,desc,resolutionComment', 'tools' => 'simpleTools');
+103 -2
View File
@@ -257,6 +257,45 @@ class issue extends control
if($_POST)
{
$this->issue->resolve($issue);
$resolution = $this->post->issue['resolution'];
$objectID = '';
if($resolution == 'totask')
{
$objectID = $this->issue->createTask($issue);
$objectLink = html::a($this->createLink('task', 'view', "id=$objectID"), $this->post->name, "data-toggle='modal'");
$comment = sprintf($this->lang->issue->logComments[$resolution], $objectLink);
$this->loadModel('action')->create('task', $objectID, 'Opened', '');
$this->loadModel('action')->create('issue', $issue, 'resolved', $comment);
}
if($resolution == 'tostory')
{
$objectID = $this->issue->createStory($issue);
$objectLink = html::a($this->createLink('story', 'view', "id=$objectID"), $this->post->title, "data-toggle='modal'");
$comment = sprintf($this->lang->issue->logComments[$resolution], $objectLink);
$this->loadModel('action')->create('story', $objectID, 'Opened', '');
$this->loadModel('action')->create('issue', $issue, 'resolved', $comment);
}
if($resolution == 'tobug')
{
$objectID = $this->issue->createBug($issue);
$objectLink = html::a($this->createLink('bug', 'view', "id=$objectID"), $this->post->title, "data-toggle='modal'");
$comment = sprintf($this->lang->issue->logComments[$resolution], $objectLink);
$this->loadModel('action')->create('bug', $objectID, 'Opened', '');
$this->loadModel('action')->create('issue', $issue, 'resolved', $comment);
}
if($resolution == 'torisk')
{
$objectID = $this->issue->createRisk($issue);
$objectLink = html::a($this->createLink('risk', 'view', "id=$objectID"), $this->post->title, "data-toggle='modal'");
$comment = sprintf($this->lang->issue->logComments[$resolution], $objectLink);
$this->loadModel('action')->create('risk', $objectID, 'Opened', '');
$this->loadModel('action')->create('issue', $issue, 'resolved', $comment);
}
$this->dao->update(TABLE_ISSUE)->set('objectID')->eq($objectID)->where('id')->eq($issue)->exec();
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse')));
}
@@ -264,9 +303,72 @@ class issue extends control
$this->view->issue = $this->issue->getByID($issue);
$this->view->users = $this->loadModel('user')->getPairs('noletter');
$this->prepairParams($this->view->issue);
$this->display();
}
public function prepairParams($issue)
{
$this->loadModel('task');
$this->loadModel('risk');
$this->loadModel('bug');
$this->loadModel('tree');
$this->loadModel('story');
$this->loadModel('build');
$this->loadModel('release');
$this->loadModel('project')->getLimitedProject();
$limitedProjects = !empty($_SESSION['limitedProjects']) ? $_SESSION['limitedProjects'] : '';
$task = new stdClass();
$task->module = 0;
$task->assignedTo = '';
$task->name = $issue->title;
$task->story = 0;
$task->type = '';
$task->pri = '3';
$task->estimate = '';
$task->desc = $issue->desc;
$task->estStarted = '';
$task->deadline = '';
$task->mailto = '';
$task->color = '';
$projectID = $this->session->project;
$project = $this->project->getById($projectID);
$users = $this->loadModel('user')->getPairs('noclosed|nodeleted');
$members = $this->project->getTeamMemberPairs($projectID, 'nodeleted');
$showAllModule = isset($this->config->project->task->allModule) ? $this->config->project->task->allModule : '';
$moduleOptionMenu = $this->tree->getTaskOptionMenu($projectID, 0, 0, $showAllModule ? 'allModule' : '');
/* Fix bug #2737. When moduleID is not story module. */
$stories = $this->story->getProjectStoryPairs($projectID, 0, 0);
/* Set Custom*/
foreach(explode(',', $this->config->task->customCreateFields) as $field) $customFields[$field] = $this->lang->task->$field;
$this->view->customFields = $customFields;
$this->view->showFields = $this->config->task->custom->createFields;
$this->view->showAllModule = $showAllModule;
$this->view->project = $project;
$this->view->task = $task;
$this->view->users = $users;
$this->view->stories = $stories;
$this->view->members = $members;
$this->view->moduleOptionMenu = $moduleOptionMenu;
$this->view->projects = $this->loadModel('project')->getPairs();
$this->view->program = $this->loadModel('project')->getById($this->session->program);
$this->view->products = $this->loadModel('product')->getPairs();
$this->view->productID = $this->session->product;
$this->view->moduleID = 0;
$this->view->branch = 0;
$this->view->modules = $this->tree->getOptionMenu($this->view->productID, 'story');
$this->view->builds = $this->loadModel('build')->getProductBuildPairs($this->view->productID, '', 'noempty,noterminate,nodone');
$this->view->buildID = 0;
}
/**
* Get question details.
*
@@ -282,9 +384,8 @@ class issue extends control
$this->view->position[] = $this->lang->issue->common;
$this->view->position[] = $this->lang->issue->basicInfo;
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted');
$this->view->users = $this->loadModel('user')->getPairs('noletter|pofirst|nodeleted');
$this->view->issue = $issue;
$this->display();
}
+7
View File
@@ -28,6 +28,7 @@ $lang->issue->assignedTo = '指派给';
$lang->issue->assignedBy = '由谁指派';
$lang->issue->assignedDate = '指派时间';
$lang->issue->resolved = '解决';
$lang->issue->id = '编号';
$lang->issue->delete = '删除';
$lang->issue->basicInfo = '基本信息';
@@ -89,3 +90,9 @@ $lang->issue->resolveMethods['tostory'] = '转需求';
$lang->issue->resolveMethods['torisk'] = '转风险';
$lang->issue->confirmDelete = '您确认删除该问题?';
$lang->issue->logComments = array();
$lang->issue->logComments['totask'] = "创建了任务:%s。";
$lang->issue->logComments['tostory'] = "创建了需求:%s。";
$lang->issue->logComments['tobug'] = "创建了BUG:%s。";
$lang->issue->logComments['torisk'] = "创建了风险:%s。";
+76
View File
@@ -260,4 +260,80 @@ class issueModel extends model
return true;
}
/**
* Resolve issue.
*
* @param int $issueID
* @access public
* @return void
*/
public function resolve($issueID)
{
$issue = $this->post->issue;
$issue['status'] = 'resolved';
$this->dao->update(TABLE_ISSUE)->data($issue)->where('id')->eq($issueID)->exec();
}
/**
* Create task.
*
* @access public
* @return void
*/
public function createTask()
{
$task = fixer::input('post')->remove('issue,spec')->get();
$this->dao->insert(TABLE_TASK)->data($task, 'teamMember,storyEstimate,storyDesc,storyPri,labels,files')->exec();
return $this->dao->lastInsertID();
}
/**
* Create story.
*
* @access public
* @return int
*/
public function createStory()
{
$story = fixer::input('post')->remove('issue,color')
->setIF($this->post->needNotReview or $this->post->projectID > 0, 'status', 'active')
->get();
$this->dao->insert(TABLE_STORY)->data($story, 'teamMember,storyEstimate,storyDesc,storyPri,labels,files,spec,story,needNotReview')->exec();
$id = $this->dao->lastInsertID();
$this->dao->insert(TABLE_STORYSPEC)
->set('story')->eq($id)
->set('title')->eq($story->title)
->set('spec')->eq($story->spec)
->set('version')->eq(1)
->exec();
return $id;
}
/**
* Create bug.
*
* @access public
* @return int
*/
public function createBug()
{
$bug = fixer::input('post')->remove('issue,spec,color')->join('openedBuild', ',')->get();
$this->dao->insert(TABLE_BUG)->data($bug, 'teamMember,storyEstimate,storyDesc,storyPri,labels,files')->exec();
return $this->dao->lastInsertID();
}
/**
* Create risk.
*
* @access public
* @return int
*/
public function createRisk()
{
$risc = fixer::input('post')->remove('issue,color,estimate')->get();
$this->dao->insert(TABLE_RISK)->data($risc, 'spec,title,teamMember,storyEstimate,storyDesc,storyPri,labels,files')->exec();
return $this->dao->lastInsertID();
}
}
+3 -3
View File
@@ -60,11 +60,11 @@
<td title="<?php echo $issue->createdDate;?>"><?php echo $issue->createdDate;?></td>
<td class="c-actions">
<?php
echo common::printIcon('issue', 'resolve', "issueID=$issue->id", $issue, 'list', 'checked', '', 'iframe', 'yes');
echo common::printIcon('issue', 'assignTo', "issueID=$issue->id", $issue, 'list', 'hand-right', '', 'iframe', 'yes');
echo common::printIcon('issue', 'resolve', "issueID=$issue->id", $issue, 'list', 'checked', '', 'iframe', 'yes', '', $lang->issue->resolved);
echo common::printIcon('issue', 'assignTo', "issueID=$issue->id", $issue, 'list', 'hand-right', '', 'iframe', 'yes', '', $lang->issue->assignedTo);
echo common::printIcon('issue', 'close', "issueID=$issue->id", $issue, 'list', 'off', '', 'iframe', 'yes');
echo common::printIcon('issue', 'cancel', "issueID=$issue->id", $issue, 'list', 'ban-circle', '', 'iframe', 'yes');
echo common::printIcon('issue', 'activate', "issueID=$issue->id", $issue, 'list', 'magic', '', 'iframe', 'yes');
echo common::printIcon('issue', 'activate', "issueID=$issue->id", $issue, 'list', 'magic', '', 'iframe', 'yes', '', $lang->issue->active);
echo common::printIcon('issue', 'edit', "issueID=$issue->id", $issue, 'list', 'edit');
$deleteClass = common::hasPriv('issue', 'delete') ? 'btn' : 'btn disabled';
echo html::a($this->createLink('issue', 'delete', "issueID=$issue->id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->issue->delete}' class='$deleteClass'");
+834
View File
@@ -0,0 +1,834 @@
<tr class='bugTR storyTR'>
<th class='w-110px'><?php echo $lang->bug->product;?></th>
<td>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAll(this.value);' class='form-control chosen control-product'");?>
<?php if($this->session->currentProductType != 'normal' and isset($products[$productID])):?>
<?php echo html::select('branch', $branches, $branch, "onchange='loadBranch()' class='form-control chosen control-branch'");?>
<?php endif;?>
</div>
</td>
<td>
<div class='input-group' id='moduleIdBox'>
<span class="input-group-addon"><?php echo $lang->bug->module?></span>
<?php
echo html::select('module', $moduleOptionMenu, $moduleID, "onchange='loadModuleRelated()' class='form-control chosen'");
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=bug&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo '&nbsp; ';
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
echo '</span>';
}
?>
</div>
</td>
</tr>
<?php $showProject = (strpos(",$showFields,", ',project,') !== false && $config->global->flow != 'onlyTest');?>
<tr class='bugTR'>
<th><?php echo ($showProject) ? $lang->bug->project : $lang->bug->type;?></th>
<?php if(!$showProject):?>
<?php $showOS = strpos(",$showFields,", ',os,') !== false;?>
<?php $showBrowser = strpos(",$showFields,", ',browser,') !== false;?>
<td>
<div class='input-group' id='bugTypeInputGroup'>
<?php echo html::select('type', $lang->bug->typeList, '', "class='form-control'");?>
<?php if($showOS):?>
<span class='input-group-addon fix-border'><?php echo $lang->bug->os?></span>
<?php echo html::select('os', $lang->bug->osList, $os, "class='form-control'");?>
<?php endif;?>
<?php if($showBrowser):?>
<span class='input-group-addon fix-border'><?php echo $lang->bug->browser?></span>
<?php echo html::select('browser', $lang->bug->browserList, $browser, "class='form-control'");?>
<?php endif;?>
</div>
</td>
<?php endif;?>
<?php if($showProject):?>
<td><span id='projectIdBox'><?php echo html::select('project', $projects, $projectID, "class='form-control chosen' onchange='loadProjectRelated(this.value)'");?></span></td>
<?php endif;?>
<td>
<div class='input-group' id='buildBox'>
<span class="input-group-addon"><?php echo $lang->bug->openedBuild?></span>
<?php echo html::select('openedBuild[]', $builds, $buildID, "size=4 multiple=multiple class='chosen form-control'");?>
<span class='input-group-addon fix-border' id='buildBoxActions'></span>
<div class='input-group-btn'><?php echo html::commonButton($lang->bug->allBuilds, "class='btn' id='all' data-toggle='tooltip' onclick='loadAllBuilds()'")?></div>
</div>
</td>
</tr>
<tr class='bugTR'>
<th><nobr><?php echo $lang->bug->lblAssignedTo;?></nobr></th>
<td>
<div class='input-group'>
<?php echo html::select('assignedTo', $users, '', "class='form-control chosen'");?>
<span class='input-group-btn'><?php echo html::commonButton($lang->bug->allUsers, "class='btn btn-default' onclick='loadAllUsers()' data-toggle='tooltip'");?></span>
</div>
</td>
<?php $showDeadline = strpos(",$showFields,", ',deadline,') !== false;?>
<?php if($showDeadline):?>
<td id='deadlineTd'>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->bug->deadline?></span>
<span><?php echo html::input('deadline', $issue->deadline, "class='form-control form-date'");?></span>
</div>
</td>
</tr>
<?php endif;?>
<?php if($this->config->global->flow != 'onlyTest' && $showProject):?>
<?php $showOS = strpos(",$showFields,", ',os,') !== false;?>
<?php $showBrowser = strpos(",$showFields,", ',browser,') !== false;?>
<tr class='bugTR'>
<th><?php echo $lang->bug->type;?></th>
<td>
<div class='table-row'>
<div class='table-col' id='typeBox'>
<?php echo html::select('type', $lang->bug->typeList, $type, "class='form-control chosen'");?>
</div>
<?php if($showOS):?>
<div class='table-col' id='osBox'>
<div class='input-group'>
<span class='input-group-addon fix-border'><?php echo $lang->bug->os?></span>
<?php echo html::select('os', $lang->bug->osList, $os, "class='form-control chosen'");?>
</div>
</div>
<?php endif;?>
<?php if($showBrowser):?>
<div class='table-col'>
<div class='input-group'>
<span class='input-group-addon fix-border'><?php echo $lang->bug->browser?></span>
<?php echo html::select('browser', $lang->bug->browserList, $browser, "class='form-control chosen'");?>
</div>
</div>
<?php endif;?>
</div>
</td>
</tr>
<?php endif;?>
<tr class='bugTR'>
<th><?php echo $lang->bug->title;?></th>
<td colspan='2'>
<div class="input-group title-group">
<div class="input-control has-icon-right">
<?php echo html::input('title', $issue->title, "class='form-control'");?>
<div class="colorpicker">
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
<ul class="dropdown-menu clearfix">
<li class="heading"><?php echo $lang->story->colorTag;?><i class="icon icon-close"></i></li>
</ul>
<input type="hidden" class="colorpicker" id="color" name="color" value="" data-icon="color" data-wrapper="input-control-icon-right" data-update-color="#title" data-provide="colorpicker">
</div>
</div>
<?php if(strpos(",$showFields,", ',severity,') !== false): // begin print severity selector ?>
<span class="input-group-addon fix-border br-0"><?php echo $lang->bug->severity;?></span>
<?php
$hasCustomSeverity = false;
foreach($lang->bug->severityList as $severityKey => $severityValue)
{
if(!empty($severityKey) and (string)$severityKey != (string)$severityValue)
{
$hasCustomSeverity = true;
break;
}
}
?>
<?php if($hasCustomSeverity):?>
<?php echo html::select('severity', (array)$lang->bug->severityList, $severity, "class='form-control'");?>
<?php else: ?>
<div class="input-group-btn pri-selector" data-type="severity">
<button type="button" class="btn dropdown-toggle br-0" data-toggle="dropdown">
<span class="pri-text"><span class="label-severity" data-severity="<?php echo $severity;?>" title="<?php echo $severity;?>"></span></span> &nbsp;<span class="caret"></span>
</button>
<div class='dropdown-menu pull-right'>
<?php echo html::select('severity', (array)$lang->bug->severityList, $severity, "class='form-control' data-provide='labelSelector' data-label-class='label-severity'");?>
</div>
</div>
<?php endif; ?>
<?php endif; // end print severity selector ?>
<?php if(strpos(",$showFields,", ',pri,') !== false): // begin print pri selector?>
<span class="input-group-addon fix-border br-0"><?php echo $lang->bug->pri;?></span>
<?php
$hasCustomPri = false;
foreach($lang->bug->priList as $priKey => $priValue)
{
if(!empty($priKey) and (string)$priKey != (string)$priValue)
{
$hasCustomPri = true;
break;
}
}
$priList = $lang->bug->priList;
if(end($priList)) unset($priList[0]);
?>
<?php if($hasCustomPri):?>
<?php echo html::select('pri', (array)$priList, $issue->pri, "class='form-control'");?>
<?php else: ?>
<div class="input-group-btn pri-selector" data-type="pri">
<button type="button" class="btn dropdown-toggle br-0" data-toggle="dropdown">
<span class="pri-text"><span class="label-pri label-pri-<?php echo empty($issue->pri) ? '0' : $issue->pri?>" title="<?php echo $issue->pri?>"><?php echo $issue->pri?></span></span> &nbsp;<span class="caret"></span>
</button>
<div class='dropdown-menu pull-right'>
<?php echo html::select('pri', (array)$priList, $issue->pri, "class='form-control' data-provide='labelSelector' data-label-class='label-pri'");?>
</div>
</div>
<?php endif; ?>
<?php endif; // end print pri selector ?>
</div>
</td>
</tr>
<tr class='bugTR'>
<th><?php echo $lang->bug->steps;?></th>
<td colspan='2'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=bug&link=steps');?>
<?php echo html::textarea('steps', $issue->desc, "rows='10' class='form-control'");?>
</td>
</tr>
<?php
$showStory = strpos(",$showFields,", ',story,') !== false;
$showTask = strpos(",$showFields,", ',task,') !== false;
?>
<?php if(($showStory or $showTask) and $this->config->global->flow != 'onlyTest'):?>
<tr class='bugTR'>
<th><?php echo ($showStory) ? $lang->bug->story : $lang->bug->task;?></th>
<?php if($showStory):?>
<td>
<span id='storyIdBox'><?php echo html::select('story', empty($stories) ? '' : $stories, $storyID, "class='form-control chosen'");?></span>
</td>
<?php endif;?>
<?php if($showTask):?>
<td>
<div class='input-group'>
<?php if($showStory):?>
<span class='input-group-addon'><?php echo $lang->bug->task?></span>
<?php endif;?>
<?php echo html::select('task', '', $taskID, "class='form-control chosen'") . html::hidden('oldTaskID', $taskID);?>
</div>
</td>
<?php endif;?>
</tr>
<?php endif;?>
<?php
$showMailto = strpos(",$showFields,", ',mailto,') !== false;
$showKeywords = strpos(",$showFields,", ',keywords,') !== false;
?>
<tr class='bugTR'>
<th><?php echo $lang->bug->files;?></th>
<td colspan='2'><?php echo $this->fetch('file', 'buildform', 'fileCount=1&percent=0.85');?></td>
</tr>
</tbody>
<?php
js::set('holders', $lang->bug->placeholder);
js::set('page', 'create');
js::set('createRelease', $lang->release->create);
js::set('createBuild', $lang->build->create);
js::set('refresh', $lang->refresh);
?>
<script>
$(function()
{
var page = window.page || '';
var flow = window.flow;
$('#subNavbar a[data-toggle=dropdown]').parent().addClass('dropdown dropdown-hover');
if(page == 'create')
{
var productID = $('#product').val();
var moduleID = $('#module').val();
var assignedto = $('#assignedTo').val();
changeProductConfirmed = true;
oldStoryID = $('#story').val() || 0;
oldProjectID = 0;
oldOpenedBuild = '';
oldTaskID = $('#oldTaskID').val() || 0;
notice();
}
if(page == 'create' || page == 'edit' || page == 'assignedto' || page == 'confirmbug')
{
oldProductID = $('#product').val();
$("#story, #task, #mailto").chosen();
}
if(window.flow != 'full')
{
$('.querybox-toggle').click(function()
{
$(this).parent().toggleClass('active');
});
}
});
/**
* Load all fields.
*
* @param int $productID
* @access public
* @return void
*/
function loadAll(productID)
{
if(page == 'create')
{
loadProjectTeamMembers(productID);
}
if(!changeProductConfirmed)
{
firstChoice = confirm(confirmChangeProduct);
changeProductConfirmed = true; // Only notice the user one time.
if(!firstChoice)
{
$('#product').val(oldProductID);//Revert old product id if confirm is no.
$('#product').trigger("chosen:updated");
$('#product').chosen();
return true;
}
loadAll(productID);
}
else
{
$('#taskIdBox').innerHTML = '<select id="task"></select>'; // Reset the task.
$('#task').chosen();
loadProductBranches(productID)
loadProductModules(productID);
loadProductProjects(productID);
loadProductBuilds(productID);
loadProductplans(productID);
loadProductStories(productID);
}
}
/**
* Load by branch.
*
* @access public
* @return void
*/
function loadBranch()
{
$('#taskIdBox').innerHTML = '<select id="task"></select>'; // Reset the task.
$('#task').chosen();
productID = $('#product').val();
loadProductModules(productID);
loadProductProjects(productID);
loadProductBuilds(productID);
loadProductplans(productID);
loadProductStories(productID);
}
/**
*Load all builds of one project or product.
*
* @access public
* @return void
*/
function loadAllBuilds(that)
{
if(page == 'resolve')
{
oldResolvedBuild = $('#resolvedBuild').val() ? $('#resolvedBuild').val() : 0;
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=0&index=0&type=all');
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
else
{
productID = $('#product').val();
projectID = $('#project').val();
if(page == 'edit') buildBox = $(that).closest('.input-group').attr('id');
if(projectID)
{
loadAllProjectBuilds(projectID, productID);
}
else
{
loadAllProductBuilds(productID);
}
}
}
/**
* Load all builds of the project.
*
* @param int $projectID
* @param int $productID
* @access public
* @return void
*/
function loadAllProjectBuilds(projectID, productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
if(page == 'create')
{
oldOpenedBuild = $('#openedBuild').val() ? $('#openedBuild').val() : 0;
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&needCreate=true&type=all');
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$("#openedBuild").chosen();
notice();
})
}
if(page == 'edit')
{
if(buildBox == 'openedBuildBox')
{
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&needCreate=true&type=all');
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
if(buildBox == 'resolvedBuildBox')
{
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=0&index=0&needCreate=true&type=all');
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
}
}
/**
* Load all builds of the product.
*
* @param int $productID
* @access public
* @return void
*/
function loadAllProductBuilds(productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
if(page == 'create')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&type=all');
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$("#openedBuild").chosen();
notice();
})
}
if(page == 'edit')
{
if(buildBox == 'openedBuildBox')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch + '&index=0&type=all');
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
if(buildBox == 'resolvedBuildBox')
{
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=0&index=0&type=all');
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
}
}
/**
* Load product's modules.
*
* @param int $productID
* @access public
* @return void
*/
function loadProductModules(productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('tree', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=bug&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true');
$('#moduleIdBox').load(link, function()
{
$(this).find('select').chosen()
if(typeof(bugModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon' style='border-left-width: 1px;'>" + bugModule + "</span>");
});
}
/**
* Load product stories
*
* @param int $productID
* @access public
* @return void
*/
function loadProductStories(productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('story', 'ajaxGetProductStories', 'productID=' + productID + '&branch=' + branch + '&moduleId=0&storyID=' + oldStoryID);
$('#storyIdBox').load(link, function(){$('#story').chosen();});
}
/**
* Load projects of product.
*
* @param int $productID
* @access public
* @return void
*/
function loadProductProjects(productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('product', 'ajaxGetProjects', 'productID=' + productID + '&projectID=' + oldProjectID + '&branch=' + branch);
$('#projectIdBox').load(link, function(){$(this).find('select').chosen()});
}
/**
* Load product plans.
*
* @param productID $productID
* @access public
* @return void
*/
function loadProductplans(productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('productplan', 'ajaxGetProductplans', 'productID=' + productID + '&branch=' + branch);
$('#planIdBox').load(link, function(){$(this).find('select').chosen()});
}
/**
* Load product builds.
*
* @param productID $productID
* @access public
* @return void
*/
function loadProductBuilds(productID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch);
if(page == 'create')
{
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$("#openedBuild").chosen();
notice();
})
}
else
{
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
link = createLink('build', 'ajaxGetProductBuilds', 'productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch);
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
}
/**
* Load project related bugs and tasks.
*
* @param int $projectID
* @access public
* @return void
*/
function loadProjectRelated(projectID)
{
if(projectID)
{
loadProjectTasks(projectID);
loadProjectStories(projectID);
loadProjectBuilds(projectID);
loadAssignedTo(projectID);
}
else
{
$('#taskIdBox').innerHTML = '<select id="task"></select>'; // Reset the task.
loadProductStories($('#product').val());
loadProductBuilds($('#product').val());
}
}
/**
* Load project tasks.
*
* @param projectID $projectID
* @access public
* @return void
*/
function loadProjectTasks(projectID)
{
link = createLink('task', 'ajaxGetProjectTasks', 'projectID=' + projectID + '&taskID=' + oldTaskID);
$.post(link, function(data)
{
if(!data) data = '<select id="task" name="task" class="form-control"></select>';
$('#task').replaceWith(data);
$('#task_chosen').remove();
$("#task").chosen();
})
}
/**
* Load project stories.
*
* @param projectID $projectID
* @access public
* @return void
*/
function loadProjectStories(projectID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('story', 'ajaxGetProjectStories', 'projectID=' + projectID + '&productID=' + $('#product').val() + '&branch=' + branch + '&moduleID=0&storyID=' + oldStoryID);
$('#storyIdBox').load(link, function(){$('#story').chosen();});
}
/**
* Load builds of a project.
*
* @param int $projectID
* @access public
* @return void
*/
function loadProjectBuilds(projectID)
{
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
productID = $('#product').val();
oldOpenedBuild = $('#openedBuild').val() ? $('#openedBuild').val() : 0;
if(page == 'create')
{
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + "&branch=" + branch + "&index=0&needCreate=true");
$.get(link, function(data)
{
if(!data) data = '<select id="openedBuild" name="openedBuild" class="form-control" multiple=multiple></select>';
$('#openedBuild').replaceWith(data);
$('#openedBuild_chosen').remove();
$("#openedBuild").chosen();
notice();
})
}
else
{
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=openedBuild&build=' + oldOpenedBuild + '&branch=' + branch);
$('#openedBuildBox').load(link, function(){$(this).find('select').chosen()});
oldResolvedBuild = $('#resolvedBuild').val() ? $('#resolvedBuild').val() : 0;
link = createLink('build', 'ajaxGetProjectBuilds', 'projectID=' + projectID + '&productID=' + productID + '&varName=resolvedBuild&build=' + oldResolvedBuild + '&branch=' + branch);
$('#resolvedBuildBox').load(link, function(){$(this).find('select').chosen()});
}
}
/**
* Set story field.
*
* @param moduleID $moduleID
* @param productID $productID
* @access public
* @return void
*/
function setStories(moduleID, productID)
{
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('story', 'ajaxGetProductStories', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID);
$.get(link, function(stories)
{
if(!stories) stories = '<select id="story" name="story" class="form-control"></select>';
$('#story').replaceWith(stories);
$('#story_chosen').remove();
$("#story").chosen();
});
}
/**
* Load product branches.
*
* @param int $productID
* @access public
* @return void
*/
function loadProductBranches(productID)
{
$('#branch').remove();
$('#branch_chosen').remove();
$.get(createLink('branch', 'ajaxGetBranches', "productID=" + productID), function(data)
{
if(data)
{
$('#product').closest('.input-group').append(data);
$('#branch').css('width', page == 'create' ? '120px' : '65px');
$('#branch').chosen();
}
})
}
/**
* Load team members of the project as assignedTo list.
*
* @param int $projectID
* @access public
* @return void
*/
function loadAssignedTo(projectID)
{
link = createLink('bug', 'ajaxLoadAssignedTo', 'projectID=' + projectID + '&selectedUser=' + $('#assignedTo').val());
$.get(link, function(data)
{
$('#assignedTo_chosen').remove();
$('#assignedTo').replaceWith(data);
$('#assignedTo').chosen();
});
}
/**
* notice for create build.
*
* @access public
* @return void
*/
function notice()
{
$('#buildBoxActions').empty().hide();
if($('#openedBuild').find('option').length <= 1)
{
var html = '';
if($('#project').length == 0 || $('#project').val() == '')
{
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
var link = createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch);
if(typeof(flow) != 'undefined' && flow == 'onlyTest') link = createLink('build', 'create','projectID=' + $('#product').val());
html += '<a href="' + link + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProductBuilds(' + $('#product').val() + ')">' + refresh + '</a>';
}
else
{
projectID = $('#project').val();
html += '<a href="' + createLink('build', 'create','projectID=' + projectID) + '" target="_blank" style="padding-right:5px">' + createBuild + '</a> ';
html += '<a href="javascript:loadProjectBuilds(' + projectID + ')">' + refresh + '</a>';
}
var $bba = $('#buildBoxActions');
if($bba.length)
{
$bba.html(html);
$bba.show();
}
else
{
if($('#buildBox').closest('tr').find('td').size() > 1)
{
$('#buildBox').closest('td').next().attr('id', 'buildBoxActions');
$('#buildBox').closest('td').next().html(html);
}
else
{
html = "<td id='buildBoxActions'>" + html + '</td>';
$('#buildBox').closest('td').after(html);
}
}
}
}
/**
* Load all users as assignedTo list.
*
* @access public
* @return void
*/
function loadAllUsers()
{
var link = createLink('bug', 'ajaxLoadAllUsers', 'selectedUser=' + $('#assignedTo').val());
$.get(link, function(data)
{
if(data)
{
var moduleID = $('#module').val();
var productID = $('#product').val();
setAssignedTo(moduleID, productID);
$('#assignedTo').empty().append($(data).find('option')).trigger('chosen:updated').trigger('chosen:activate');
}
});
}
/**
* Load team members of the latest project of a product as assignedTo list.
*
* @param $productID
* @access public
* @return void
*/
function loadProjectTeamMembers(productID)
{
var link = createLink('bug', 'ajaxLoadProjectTeamMembers', 'productID=' + productID + '&selectedUser=' + $('#assignedTo').val());
$('#assignedToBox').load(link, function(){$('#assignedTo').chosen();});
}
/**
* load assignedTo and stories of module.
*
* @access public
* @return void
*/
function loadModuleRelated()
{
var moduleID = $('#module').val();
var productID = $('#product').val();
setAssignedTo(moduleID, productID);
setStories(moduleID, productID);
}
/**
* Set the assignedTo field.
*
* @access public
* @return void
*/
function setAssignedTo(moduleID, productID)
{
if(typeof(productID) == 'undefined') productID = $('#product').val();
if(typeof(moduleID) == 'undefined') moduleID = $('#module').val();
var link = createLink('bug', 'ajaxGetModuleOwner', 'moduleID=' + moduleID + '&productID=' + productID);
$.get(link, function(owner)
{
$('#assignedTo').val(owner);
$("#assignedTo").trigger("chosen:updated");
});
}
$(function()
{
if($('#project').val()) loadProjectRelated($('#project').val());
$('[data-toggle=tooltip]').tooltip();
// adjust size of bug type input group
var adjustBugTypeGroup = function()
{
var $group = $('#bugTypeInputGroup');
var width = ($group.parent().width()), addonWidth = 0;
var $controls = $group.find('.chosen-single');
$group.children('.input-group-addon').each(function()
{
addonWidth += $(this).outerWidth();
});
var bestWidth = Math.floor((width - addonWidth)/$controls.length);
$controls.css('width', bestWidth);
var lastWidth = width - addonWidth - bestWidth * ($controls.length - 1);
$controls.last().css('width', lastWidth);
};
adjustBugTypeGroup();
$(window).on('resize', adjustBugTypeGroup);
// init pri and severity selector
$('#severity, #pri').on('change', function()
{
var $select = $(this);
var $selector = $select.closest('.pri-selector');
var value = $select.val();
$selector.find('.pri-text').html($selector.data('type') === 'severity' ? '<span class="label-severity" data-severity="' + value + '" title="' + value + '"></span>' : '<span class="label-pri label-pri-' + value + '" title="' + value + '">' + value + '</span>');
});
loadAll(<?php echo $productID;?>);
});
</script>
+24
View File
@@ -0,0 +1,24 @@
<tr class="riskTR">
<th><?php echo $lang->risk->name;?></th>
<td>
<?php echo html::input('name', $issue->title, "class='form-control'");?>
</td>
</tr>
<tr class="riskTR">
<th><?php echo $lang->risk->source;?></th>
<td>
<?php echo html::select('source', $lang->risk->sourceList, '', "class='form-control chosen'");?>
</td>
</tr>
<tr class="riskTR">
<th><?php echo $lang->risk->category;?></th>
<td>
<?php echo html::select('category', $lang->risk->categoryList, '', "class='form-control chosen'");?>
</td>
</tr>
<tr class="riskTR">
<th><?php echo $lang->risk->strategy;?></th>
<td>
<?php echo html::select('strategy', $lang->risk->strategyList, '', "class='form-control chosen'");?>
</td>
</tr>
+89
View File
@@ -0,0 +1,89 @@
<tr class='storyTR'>
<th><?php echo $lang->story->reviewedBy;?></th>
<td><?php echo html::select('assignedTo', $users, '', "class='form-control chosen'");?></td>
<?php if(!$this->story->checkForceReview()):?>
<td>
<div class='checkbox-primary'>
<input id='needNotReview' name='needNotReview' value='1' type='checkbox' class='no-margin'/>
<label for='needNotReview'><?php echo $lang->story->needNotReview;?></label>
</div>
</td>
<?php endif;?>
</tr>
<tr class='storyTR'>
<th><?php echo $lang->story->title;?></th>
<td colspan="2">
<div class='table-row'>
<div class='table-col'>
<div class="input-control has-icon-right">
<?php echo html::input('title', $issue->title, "class='form-control'");?>
<div class="colorpicker">
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
<ul class="dropdown-menu clearfix">
<li class="heading"><?php echo $lang->story->colorTag;?><i class="icon icon-close"></i></li>
</ul>
<input type="hidden" class="colorpicker" id="color" name="color" value="" data-icon="color" data-wrapper="input-control-icon-right" data-update-color="#title" data-provide="colorpicker">
</div>
</div>
</div>
<?php if(strpos(",$showFields,", ',pri,') !== false): // begin print pri selector?>
<div class='table-col w-150px'>
<div class="input-group">
<span class="input-group-addon fix-border br-0"><?php echo $lang->story->pri;?></span>
<?php
$hasCustomPri = false;
foreach($lang->story->priList as $priKey => $priValue)
{
if(!empty($priKey) and (string)$priKey != (string)$priValue)
{
$hasCustomPri = true;
break;
}
}
$priList = $lang->story->priList;
if(end($priList)) unset($priList[0]);
?>
<?php if($hasCustomPri):?>
<?php echo html::select('pri', (array)$priList, $issue->pri, "class='form-control'");?>
<?php else:?>
<div class="input-group-btn pri-selector" data-type="pri">
<button type="button" class="btn dropdown-toggle br-0" data-toggle="dropdown">
<span class="pri-text"><span class="label-pri label-pri-<?php echo empty($issue->pri) ? '0' : $issue->pri?>" title="<?php echo $issue->pri?>"><?php echo $issue->pri?></span></span> &nbsp;<span class="caret"></span>
</button>
<div class='dropdown-menu pull-right'>
<?php echo html::select('pri', (array)$priList, $issue->pri, "class='form-control' data-provide='labelSelector' data-label-class='label-pri'");?>
</div>
</div>
<?php endif;?>
</div>
</div>
<?php endif; ?>
<?php if(strpos(",$showFields,", ',estimate,') !== false):?>
<div class='table-col w-120px'>
<div class="input-group">
<span class="input-group-addon fix-border br-0"><?php echo $lang->story->estimateAB;?></span>
<input type="text" name="estimate" id="estimate" value="" class="form-control" autocomplete="off" placeholder='<?php echo $lang->story->hour;?>' />
</div>
</div>
<?php endif;?>
</div>
</td>
</tr>
<tr class='storyTR'>
<th><?php echo $lang->story->spec;?></th>
<td colspan="2">
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=story&link=spec');?>
<?php echo html::textarea('spec', $issue->desc, "rows='9' class='form-control kindeditor disabled-ie-placeholder' hidefocus='true' placeholder='" . htmlspecialchars($lang->story->specTemplate . "\n" . $lang->noticePasteImg) . "'");?>
</td>
</tr>
<?php if(strpos(",$showFields,", ',verify,') !== false):?>
<tr class='storyTR'>
<th><?php echo $lang->story->verify;?></th>
<td colspan="2"><?php echo html::textarea('verify', $verify, "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
</tr>
<?php endif;?>
<tr class='storyTR'>
<th><?php echo $lang->story->legendAttatch;?></th>
<td colspan='2'><?php echo $this->fetch('file', 'buildform');?></td>
</tr>
+176
View File
@@ -0,0 +1,176 @@
<tr class='taskTR'>
<th><?php echo $lang->task->project;?></th>
<td><?php echo html::select('project', $projects, $project->id, "class='form-control chosen' onchange='loadAll(this.value)'");?></td><td></td><td></td>
</tr>
<tr class='taskTR'>
<th><?php echo $lang->task->type;?></th>
<td><?php echo html::select('type', $lang->task->typeList, $task->type, "class='form-control chosen'");?></td>
<td>
<div class="checkbox-primary hidden" id='selectTestStoryBox'>
<input type="checkbox" name='selectTestStory' id="selectTestStory" value='1' onchange='toggleSelectTestStory()' /><label for="selectTestStory" class="no-margin"><?php echo $lang->task->selectTestStory;?></label>
</div>
</td>
</tr>
<tr class='taskTR'>
<th><?php echo $lang->task->module;?></th>
<td id='moduleIdBox'><?php echo html::select('module', $moduleOptionMenu, $task->module, "class='form-control chosen' onchange='setStories(this.value, $project->id)'");?></td>
<td>
<div class="checkbox-primary">
<input type="checkbox" id="showAllModule" <?php if($showAllModule) echo 'checked';?>><label for="showAllModule" class="no-margin"><?php echo $lang->task->allModule;?></label>
</div>
</td>
<td></td>
</tr>
<tr class='taskTR'>
<th><?php echo $lang->task->assignedTo;?></th>
<td>
<div class="input-group" id="dataPlanGroup">
<?php echo html::select('assignedTo[]', $members, $task->assignedTo, "class='form-control chosen'");?>
<?php echo html::input('teamMember', '', "class='form-control team-group fix-border hidden' readonly='readonly'");?>
<span class="input-group-btn team-group hidden"><a class="btn br-0" href="#modalTeam" data-toggle="modal"><?php echo $lang->task->team;?></a></span>
</div>
</td>
<td>
<div class="checkbox-primary affair">
<input type="checkbox" name="multiple" value="1" id="multipleBox"><label for="multipleBox" class="no-margin"><?php echo $lang->task->multiple;?></label>
</div>
<button id='selectAllUser' type="button" class="btn btn-link<?php if($task->type !== 'affair') echo ' hidden';?>"><?php echo $lang->task->selectAllUser;?></button>
</td>
</tr>
<tr class='hide'>
<th><?php echo $lang->task->status;?></th>
<td><?php echo html::hidden('status', 'wait');?></td>
</tr>
<?php if($stories and $config->global->flow != 'onlyTask' and $project->type != 'ops'):?>
<tr id='testStoryBox' class='hidden'>
<th><?php echo $lang->task->selectTestStory;?></th>
<td colspan='3'>
<table class='table table-form mg-0 table-bordered'>
<thead>
<tr class='taskTR'>
<th><?php echo $lang->task->storyAB;?></th>
<th class='w-100px'><?php echo $lang->task->pri;?></th>
<th class='w-300px'><?php echo $lang->task->datePlan;?></th>
<th class='w-150px'><?php echo $lang->task->assignedTo;?></th>
<th class='w-80px'><?php echo $lang->task->estimate;?></th>
<th class='w-80px'><?php echo $lang->actions;?></th>
</tr>
</thead>
<tbody>
<?php $i = 0;?>
<?php if($i == 0):?>
<tr class='taskTR'>
<td><?php echo html::select("testStory[]", $stories, '', "class='form-control chosen'");?></td>
<td><?php echo html::select("testPri[]", $lang->task->priList, $task->pri, "class='form-control chosen'");?></td>
<td>
<div class='input-group'>
<?php echo html::input("testEstStarted[]", $task->estStarted, "class='form-control form-date' placeholder='{$lang->task->estStarted}'");?>
<span class='input-group-addon fix-border'>~</span>
<?php echo html::input("testDeadline[]", $task->deadline, "class='form-control form-date' placeholder='{$lang->task->deadline}'");?>
</div>
</td>
<td><?php echo html::select("testAssignedTo[]", $members, $task->assignedTo, "class='form-control chosen'");?></td>
<td><?php echo html::input("testEstimate[]", '', "class='form-control'");?></td>
<td class='text-center'>
<div class="btn-group">
<button type="button" class="btn btn-sm" tabindex="-1" onclick='addItem(this)'><i class="icon icon-plus"></i></button>
<button type="button" class="btn btn-sm" tabindex="-1" onclick='removeItem(this)'><i class="icon icon-close"></i></button>
</div>
</td>
</tr>
<?php endif;?>
</tbody>
</table>
</td>
</tr>
<?php endif;?>
<tr class='taskTR'>
<th><?php echo $lang->task->name;?></th>
<td colspan='3'>
<div class="input-group title-group">
<div class="input-control has-icon-right">
<div class="colorpicker">
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
<ul class="dropdown-menu clearfix">
<li class="heading"><?php echo $lang->task->colorTag;?><i class="icon icon-close"></i></li>
</ul>
<input type="hidden" class="colorpicker" id="color" name="color" value="" data-icon="color" data-wrapper="input-control-icon-right" data-update-color="#name" data-provide="colorpicker">
</div>
<?php echo html::input('name', $task->name, "class='form-control'");?>
<?php if($config->global->flow != 'onlyTask'):?>
<a href='javascript:copyStoryTitle();' id='copyButton' class='input-control-icon-right'><?php echo $lang->task->copyStoryTitle;?></a>
<?php echo html::hidden("storyEstimate") . html::hidden("storyDesc") . html::hidden("storyPri");?>
<?php endif;?>
</div>
<?php if(strpos(",$showFields,", ',pri,') !== false): // begin print pri selector?>
<span class="input-group-addon fix-border br-0"><?php echo $lang->task->pri;?></span>
<?php
$hasCustomPri = false;
foreach($lang->task->priList as $priKey => $priValue)
{
if(!empty($priKey) and (string)$priKey != (string)$priValue)
{
$hasCustomPri = true;
break;
}
}
$priList = $lang->task->priList;
if(end($priList)) unset($priList[0]);
?>
<?php if($hasCustomPri):?>
<?php echo html::select('pri', (array)$priList, $task->pri, "class='form-control'");?>
<?php else: ?>
<div class="input-group-btn pri-selector" data-type="pri">
<button type="button" class="btn dropdown-toggle br-0" data-toggle="dropdown">
<span class="pri-text"><span class="label-pri label-pri-<?php echo empty($task->pri) ? '0' : $task->pri?>" title="<?php echo $task->pri?>"><?php echo $task->pri?></span></span> &nbsp;<span class="caret"></span>
</button>
<div class='dropdown-menu pull-right'>
<?php echo html::select('pri', (array)$priList, $task->pri, "class='form-control' data-provide='labelSelector' data-label-class='label-pri'");?>
</div>
</div>
<?php endif; ?>
<?php endif; // end print pri selector ?>
<?php if(strpos(",$showFields,", ',estimate,') !== false):?>
<div class='table-col w-120px'>
<div class="input-group">
<span class="input-group-addon fix-border br-0"><?php echo $lang->task->estimateAB;?></span>
<input type="text" name="estimate" id="estimate" value="<?php echo $task->estimate;?>" class="form-control" autocomplete="off">
</div>
</div>
<?php endif;?>
</div>
</td>
</tr>
<tr class='taskTR'>
<th><?php echo $lang->task->desc;?></th>
<td colspan='3'>
<?php echo $this->fetch('user', 'ajaxPrintTemplates', 'type=task&link=desc');?>
<?php echo html::textarea('desc', $task->desc, "rows='10' class='form-control'");?>
</td>
</tr>
<tr class='taskTR'>
<th><?php echo $lang->files;?></th>
<td colspan='3'><?php echo $this->fetch('file', 'buildform');?></td>
</tr>
<?php
$hiddenEstStarted = strpos(",$showFields,", ',estStarted,') === false;
$hiddenDeadline = strpos(",$showFields,", ',deadline,') === false;
?>
<?php if(!$hiddenEstStarted or !$hiddenDeadline):?>
<tr class='taskTR'>
<th><?php echo $lang->task->datePlan;?></th>
<td colspan='2'>
<div class='input-group'>
<?php if(!$hiddenEstStarted):?>
<?php echo html::input('estStarted', $task->estStarted, "class='form-control form-date' placeholder='{$lang->task->estStarted}'");?>
<?php endif;?>
<?php if(!$hiddenEstStarted and !$hiddenDeadline):?>
<span class='input-group-addon fix-border'>~</span>
<?php endif;?>
<?php if(!$hiddenDeadline):?>
<?php echo html::input('deadline', $task->deadline, "class='form-control form-date' placeholder='{$lang->task->deadline}'");?>
<?php endif;?>
</div>
</td>
</tr>
<?php endif;?>
+16 -6
View File
@@ -2,6 +2,10 @@
include '../../common/view/header.html.php';
include '../../common/view/kindeditor.html.php';
include '../../common/view/datepicker.html.php';
js::set('holders', $lang->bug->placeholder);
js::set('page', 'create');
js::set('refresh', $lang->refresh);
js::set('flow', $config->global->flow);
?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
@@ -11,30 +15,34 @@ include '../../common/view/datepicker.html.php';
<?php echo "<span title='$issue->title'>" . $issue->title . '</span>';?>
</div>
</div>
<div class="modal-body" style="min-height: 282px; overflow: auto;">
<form id='ajaxForm' class="form-ajax" method='post'>
<div class="modal-body" style="min-height: 282px; overflow: auto;">
<form id='ajaxForm' class="form-ajax" method='post' action="<?php echo inlink('resolve', "issue=$issue->id");?>">
<table class="table table-form">
<tr>
<th><?php echo $lang->issue->resolution;?></th>
<td>
<?php echo html::select('resolution', $lang->issue->resolveMethods, 'resolved', "class='form-control chosen'");?>
<?php echo html::select('issue[resolution]', $lang->issue->resolveMethods, 'resolved', "class='form-control chosen'");?>
</td>
</tr>
<?php include 'createtask.html.php';?>
<?php include 'createbug.html.php';?>
<?php include 'createstory.html.php';?>
<?php include 'createrisk.html.php';?>
<tr class='resolvedTR'>
<th><?php echo $lang->issue->resolutionComment;?></th>
<td colspan='3'><textarea name='resolutionComment' class='form-control' rows='5' id='resolutionComment'><?php echo $issue->resolutionComment;?></textarea></td>
<td colspan='3'><textarea name='issue[resolutionComment]' class='form-control' rows='5' id='resolutionComment'><?php echo $issue->resolutionComment;?></textarea></td>
</tr>
<tr>
<th><?php echo $lang->issue->resolvedBy;?></th>
<td>
<?php echo html::select('resolvedBy', $users, $this->app->user->account, "class='form-control chosen'");?>
<?php echo html::select('issue[resolvedBy]', $users, $this->app->user->account, "class='form-control chosen'");?>
</td>
</tr>
<tr>
<th><?php echo $lang->issue->resolvedDate;?></th>
<td>
<div class='input-group has-icon-right'>
<?php echo html::input('resolvedDate', date('Y-m-d'), "class='form-control form-date'");?>
<?php echo html::input('issue[resolvedDate]', date('Y-m-d'), "class='form-control form-date'");?>
<label for="date" class="input-control-icon-right"><i class="icon icon-delay"></i></label>
</div>
</td>
@@ -52,8 +60,10 @@ include '../../common/view/datepicker.html.php';
<script>
$().ready(function()
{
$('.taskTR,.bugTR,.storyTR,.riskTR').hide();
$('#issueresolution').change(function()
{
$('.resolvedTR,.taskTR,.bugTR,.storyTR,.riskTR').hide().find('input[type=text],input[type=radio],input[type=checkbox],select,textarea').prop('disabled', true);
if($(this).val() == 'resolved') $('.resolvedTR').show().find('input[type=text],input[type=radio],input[type=checkbox],select,textarea').prop('disabled', false);
if($(this).val() == 'tobug') $('.bugTR').show().find('input[type=text],input[type=radio],input[type=checkbox],select,textarea').prop('disabled', false);
if($(this).val() == 'totask') $('.taskTR').show().find('input[type=text],input[type=radio],input[type=checkbox],select,textarea').prop('disabled', false);
+80 -6
View File
@@ -15,6 +15,12 @@
<?php
$browseLink = $this->createLink('issue', 'browse');
$createLink = $this->createLink('issue', 'create');
$dateFiled = array('deadline', 'resolvedDate', 'createdDate', 'editedDate', 'activateDate', 'closedDate', 'assignedDate');
foreach($issue as $field => $value)
{
if(in_array($field, $dateFiled) && strpos($value, '0000') === 0) $issue->$field = '';
}
?>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
@@ -35,8 +41,8 @@ $createLink = $this->createLink('issue', 'create');
<div class="main-col col-8">
<div class="cell">
<div class="detail">
<p><strong>标题</strong> - 设计出现偏差,需求重新设计</p>
<p><strong>标题</strong> - 设计出现偏差,需求重新设计</p>
<p><strong><?php echo $lang->issue->title;?></strong> - <?php echo $issue->title?></p>
<p><strong><?php echo $lang->issue->deadline;?></strong> - <?php echo $issue->deadline;?></p>
</div>
<div class="detail">
<div class="detail-title"><?php echo $lang->issue->desc;?></div>
@@ -59,12 +65,80 @@ $createLink = $this->createLink('issue', 'create');
<div class="tab-content">
<div class="tab-pane active" id="basicInfo">
<table class="table table-data">
<tbody>
<tbody>
<tr valign="middle">
<th class="thWidth w-100px"><?php echo $lang->issue->id;?></th>
<td><?php echo $issue->id;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->type;?></th>
<td></td>
</tr>
<td><?php echo zget($lang->issue->typeList, $issue->type);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->severity;?></th>
<td><?php echo $issue->severity;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->pri;?></th>
<td><?php echo $issue->pri;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->resolvedDate;?></th>
<td><?php echo $issue->resolvedDate;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->owner;?></th>
<td><?php echo zget($users, $issue->owner);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->assignedTo;?></th>
<td><?php echo zget($users, $issue->assignedTo);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->createdBy;?></th>
<td><?php echo zget($users, $issue->createdBy);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->createdDate;?></th>
<td><?php echo $issue->createdDate;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->editedBy;?></th>
<td><?php echo zget($users, $issue->editedBy);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->editedDate;?></th>
<td><?php echo $issue->editedDate;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->assignedBy;?></th>
<td><?php echo zget($users, $issue->assignedBy);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->assignedDate;?></th>
<td><?php echo $issue->assignedDate;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->closedDate;?></th>
<td><?php echo $issue->closedDate;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->activateBy;?></th>
<td><?php echo zget($users, $issue->activateBy);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->activateDate;?></th>
<td><?php echo $issue->activateDate;?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->closeBy;?></th>
<td><?php echo zget($users, $issue->closeBy);?></td>
</tr>
<tr valign="middle">
<th class="thWidth w-80px"><?php echo $lang->issue->status;?></th>
<td><?php echo zget($lang->issue->statusList, $issue->status);?></td>
</tr>
</tbody>
</table>
</div>