Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/master_lanzongjun_fixbug

This commit is contained in:
lanzongjun
2022-06-20 09:30:53 +08:00
12 changed files with 390 additions and 19 deletions
+2
View File
@@ -48,6 +48,8 @@ body.menu-hide {padding-left: 0;}
#apps {position: fixed; left: 96px; bottom: 0; right: 0; top: 0;}
.app-container {position: absolute; left: 0; bottom: 40px; right: 0; top: 0; background-color: #efefef;}
.menu-hide #apps {left: 40px;}
.app-container.loading:before {background-color: rgba(0,0,0,.1);}
.app-container.loading:before, .app-container.loading::after {transition-delay: 1s;}
#appsBar {position: fixed; left: 96px; bottom: 0; right: 0; height: 40px; z-index: 1012; background: #fff; border-top: 1px solid #eff1f7;}
.menu-hide #appsBar {left: 40px;}
+10 -2
View File
@@ -234,7 +234,7 @@
'style="width: 100%; height: 100%; left: 0px;"',
'/>'
].join(' '));
var $app = $('<div class="app-container" id="app-' + appCode + '"></div>')
var $app = $('<div class="app-container load-indicator" id="app-' + appCode + '"></div>')
.append($iframe)
.appendTo('#apps');
@@ -247,7 +247,7 @@
var iframe = $iframe.get(0);
iframe.onload = iframe.onreadystatechange = function(e)
{
$app.trigger('loadapp', app);
$app.removeClass('loading').trigger('loadapp', app);
};
}
@@ -456,6 +456,14 @@
}
if(!notTriggerEvent) app.$app.trigger('reloadapp', app);
app.$app.addClass('loading');
if(app._loadTimer) clearTimeout(app._loadTimer);
app._loadTimer = setTimeout(function()
{
app.$app.removeClass('loading');
app._loadTimer = null;
}, 10000);
}
/**
+92
View File
@@ -1062,6 +1062,98 @@ EOF;
$this->display();
}
/**
* Feedback .
*
* @param string $browseType
* @param int $param
* @param string $orderBy
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function feedback($browseType = 'assigntome', $param = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
$this->loadModel('feedback');
$this->loadModel('datatable');
$this->lang->datatable->moduleSetting = str_replace($this->lang->module, $this->lang->feedback->moduleAB, $this->lang->datatable->moduleSetting);
$this->lang->datatable->showModule = str_replace($this->lang->module, $this->lang->feedback->moduleAB, $this->lang->datatable->showModule);
$this->lang->datatable->showModuleList = str_replace($this->lang->module, $this->lang->feedback->moduleAB, $this->lang->datatable->showModuleList);
$this->session->set('feedbackList', $this->app->getURI(true), 'feedback');
$queryID = $browseType == 'bysearch' ? (int)$param : 0;
$this->app->loadClass('pager', $static = true);
$pager = pager::init($recTotal, $recPerPage, $pageID);
if($browseType != 'bysearch')
{
$feedbacks = $this->feedback->getList($browseType, $orderBy, $pager);
}
else
{
$feedbacks = $this->feedback->getBySearch($queryID, $orderBy, $pager);
}
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'workFeedback');
$storyIdList = $bugIdList = $todoIdList = $taskIdList = array();
foreach($feedbacks as $feedback)
{
if($feedback->solution == 'tobug') $bugIdList[] = $feedback->result;
if($feedback->solution == 'tostory') $storyIdList[] = $feedback->result;
if($feedback->solution == 'totodo') $todoIdList[] = $feedback->result;
if($feedback->solution == 'totask') $taskIdList[] = $feedback->result;
}
$bugs = $bugIdList ? $this->loadModel('bug')->getByList($bugIdList) : array();
$stories = $storyIdList ? $this->loadModel('story')->getByList($storyIdList) : array();
$todos = $todoIdList ? $this->loadModel('todo')->getByList($todoIdList) : array();
$tasks = $taskIdList ? $this->loadModel('task')->getByList($taskIdList) : array();
$products = $this->loadModel('product')->getPairs();
$this->config->feedback->search['module'] = 'workFeedback';
$this->config->feedback->search['actionURL'] = inlink('work', "mode=feedback&browseType=bysearch&param=myQueryID&orderBy=$orderBy");
$this->config->feedback->search['queryID'] = $queryID;
$this->config->feedback->search['onMenuBar'] = 'no';
$this->config->feedback->search['params']['product']['values'] = array('' => '') + $products;
$this->config->feedback->search['params']['module']['values'] = array('' => '') + $this->loadModel('tree')->getOptionMenu(0, $viewType = 'feedback', $startModuleID = 0);
$this->config->feedback->search['params']['processedBy']['values'] = array('' => '') + $this->feedback->getFeedbackPairs('admin');
unset($this->config->feedback->search['fields']['assignedTo']);
unset($this->config->feedback->search['fields']['closedBy']);
unset($this->config->feedback->search['fields']['closedDate']);
unset($this->config->feedback->search['fields']['closedReason']);
unset($this->config->feedback->search['fields']['processedBy']);
unset($this->config->feedback->search['fields']['processedDate']);
unset($this->config->feedback->search['fields']['solution']);
$this->loadModel('search')->setSearchParams($this->config->feedback->search);
$this->view->title = $this->lang->my->feedback;
$this->view->position[] = $this->lang->my->feedback;
$this->view->mode = 'feedback';
$this->view->browseType = $browseType;
$this->view->feedbacks = $feedbacks;
$this->view->orderBy = $orderBy;
$this->view->pager = $pager;
$this->view->param = $param;
$this->view->bugs = $bugs;
$this->view->todos = $todos;
$this->view->stories = $stories;
$this->view->tasks = $tasks;
$this->view->depts = $this->loadModel('dept')->getOptionMenu();
$this->view->users = $this->loadModel('user')->getPairs('noletter|nodeleted|noclosed');
$this->view->projects = $this->loadModel('project')->getPairsByProgram(0, 'noclosed');
$this->view->allProducts = $this->dao->select('*')->from(TABLE_PRODUCT)->where('deleted')->eq('0')->fetchPairs('id', 'name');
$this->view->modulePairs = $this->tree->getModulePairs(0, 'feedback');
$this->view->modules = $this->tree->getOptionMenu(0, $viewType = 'feedback', 0);
$this->display();
}
/**
* My team.
*
+43
View File
@@ -0,0 +1,43 @@
<?php
/**
* The feedback view file of my 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) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
* @package my
* @version $Id
* @link http://www.zentao.net
*/
?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php js::set('mode', $mode);?>
<?php js::set('total', $pager->recTotal);?>
<?php js::set('rawMethod', $app->rawMethod);?>
<?php $viewMethod = 'view'?>
<style>
.table-form>tbody>tr>th {width:135px;}
.c-solution {white-space: nowrap; overflow: hidden;}
</style>
<div id="mainMenu" class="clearfix">
<div class="btn-toolbar pull-left">
<?php
$recTotalLabel = " <span class='label label-light label-badge'>{$pager->recTotal}</span>";
echo html::a(inlink($app->rawMethod, "mode=$mode&type=assigntome"), "<span class='text'>{$lang->my->taskMenu->assignedToMe}</span>" . ($browseType == 'assigntome' ? $recTotalLabel : ''), '', "class='btn btn-link" . ($browseType == 'assigntome' ? ' btn-active-text' : '') . "'");
?>
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->user->search;?></a>
</div>
</div>
<div id="mainContent">
<div class="cell<?php if($browseType == 'bysearch') echo ' show';?>" id="queryBox" data-module='workFeedback'></div>
<?php if(empty($feedbacks)):?>
<div class="table-empty-tip">
<p><span class="text-muted"><?php echo $lang->noData;?></span></p>
</div>
<?php else:?>
<?php
include '../../../extension/biz/feedback/view/data.html.php';
?>
<?php endif;?>
</div>
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
+220
View File
@@ -0,0 +1,220 @@
<?php echo html::hidden('feedbackID', '');?>
<div class="modal fade" id="toTask">
<div class="modal-dialog mw-500px">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title"><?php echo $lang->feedback->selectProjects;?></h4>
</div>
<div class="modal-body">
<table class='table table-form'>
<?php if($this->config->systemMode == 'new'):?>
<tr>
<th><?php echo $lang->feedback->project;?></th>
<td><?php echo html::select('taskProjects', $projects, '', "class='form-control chosen'");?></td>
</tr>
<tr>
<th id='executionHead'><?php echo $lang->feedback->execution;?></th>
<td><?php echo html::select('executions', '', '', "class='form-control chosen'");?></td>
</tr>
<?php else:?>
<tr>
<th><?php echo $lang->execution->common;?></th>
<td><?php echo html::select('executions', '', '', "class='form-control chosen'");?></td>
</tr>
<?php endif;?>
<tr>
<td colspan='2' class='text-center'>
<?php echo html::a('', $lang->feedback->nextStep, '',"class='btn btn-primary btn-wide iframe hidden' data-app='my' data-width='95%' id=taskProjectA");?>
<?php echo html::commonButton($lang->feedback->nextStep, "id='taskProjectButton'", 'btn btn-primary btn-wide');?>
<?php echo html::commonButton($lang->cancel, "data-dismiss='modal'", 'btn btn-default btn-wide');?>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="modal fade" id="toBug">
<div class="modal-dialog mw-500px">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title"><?php echo $lang->feedback->selectProjects;?></h4>
</div>
<div class="modal-body">
<table class='table table-form'>
<tr>
<th><?php echo $lang->feedback->project?></th>
<td><?php echo html::select('bugProjects', $projects, '', "class='form-control chosen'");?></td>
</tr>
<tr>
<td colspan='2' class='text-center'>
<?php echo html::hidden('productID', '');?>
<?php echo html::a('', $lang->feedback->nextStep, '',"class='btn btn-primary btn-wide iframe hidden' data-app='my' data-width='95%' id=bugProjectA");?>
<?php echo html::commonButton($lang->feedback->nextStep, "id='bugProjectButton'", 'btn btn-primary btn-wide');?>
<?php echo html::commonButton($lang->cancel, "data-dismiss='modal'", 'btn btn-default btn-wide');?>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<?php js::set('systemMode', $this->config->systemMode);?>
<script>
function getFeedbackID(obj)
{
var feedbackID = $(obj).attr("data-id");
$('#feedbackID').val(feedbackID);
if(systemMode == 'new')
{
$('#taskProjects').change();
getProjects(obj);
getExecutions(0);
}
else
{
var projectID = $(obj).attr("data-product");
getExecutions(projectID);
}
}
function getProjects(obj)
{
var productID = $(obj).attr("data-product");
var link = createLink('feedback', 'ajaxGetProjects', 'productID=' + productID + '&field=taskProjects');
$.post(link, function(data)
{
$('#taskProjects').replaceWith(data);
$('#taskProjects_chosen').remove();
$('#taskProjects').chosen();
changeTaskButton(false)
})
}
function initToBug(obj)
{
var feedbackID = $(obj).attr("data-id");
var productID = $(obj).attr("data-product");
$('#feedbackID').val(feedbackID);
$('#productID').val(productID);
var link = createLink('feedback', 'ajaxGetProjects', 'productID=' + productID + "&field=bugProjects&onchange=changeButton");
$.post(link, function(data)
{
$('#bugProjects').replaceWith(data);
$('#bugProjects_chosen').remove();
$('#bugProjects').chosen();
})
}
function getExecutions(projectID)
{
if(systemMode == 'new' && projectID)
{
var langLink = createLink('feedback', 'ajaxGetExecutionLang', 'projectID=' + projectID);
$.post(langLink, function(executionLang)
{
$('#executionHead').html(executionLang);
})
}
var link = createLink('feedback', 'ajaxGetExecutions', 'projectID=' + projectID);
$.post(link, function(data)
{
$('#executions').replaceWith(data);
$('#executions_chosen').remove();
$('#executions').chosen();
changeTaskButton()
})
}
/** Close dialog box when click href. */
$('#taskProjectA').on('click', function()
{
$('#toTask').modal('hide')
});
$('#bugProjectA').on('click', function()
{
$('#toBug').modal('hide')
});
/** alert warning .*/
$('#taskProjectButton').on('click', function()
{
var executionID = $('#executions').val();
var projectID = $('#taskProjects').val();
var executionID = executionID ? executionID : 0;
if(!executionID)
{
alert('<?php echo $lang->feedback->noExecution;?>');
}
else if(!projectID)
{
alert('<?php echo $lang->feedback->noProject;?>');
}
});
$('#bugProjectButton').on('click', function()
{
var projectID = $('#bugProjects').val();
if(!projectID)
{
alert('<?php echo $lang->feedback->noProject;?>');
}
});
/** change Button to A for open iframe. */
function changeTaskButton()
{
var projectID = $('#taskProjects').val();
var executionID = $('#executions').val();
var feedbackID = $('#feedbackID').val();
var executionID = executionID ? executionID : 0;
if(executionID == 0)
{
$('#taskProjectButton').removeClass('hidden');
$('#taskProjectA').addClass('hidden');
}
if(systemMode == 'new' && projectID && executionID)
{
var href = createLink('task', 'create', 'executionID=' + executionID + '&storyID=0&moduleID=0&taskID=0&todoID=0&extra=projectID=' + projectID + ',feedbackID=' + feedbackID, '', true);
$('#taskProjectButton').addClass('hidden');
$('#taskProjectA').removeClass('hidden').attr('href', href);
}
else if(systemMode == 'classic' && executionID)
{
var href = createLink('task', 'create', 'executionID=' + executionID + '&storyID=0&moduleID=0&taskID=0&todoID=0&extra=projectID=0,feedbackID=' + feedbackID, '', true);
$('#taskProjectButton').addClass('hidden');
$('#taskProjectA').removeClass('hidden').attr('href', href);
}
}
function changeButton()
{
var projectID = $('#bugProjects').val();
var feedbackID = $('#feedbackID').val();
var productID = $('#productID').val();
if(projectID)
{
var href = createLink('bug', 'create', 'product=' + productID + '&branch=0&extras=projectID=' + projectID + ',feedbackID=' + feedbackID, '', true);
$('#bugProjectButton').addClass('hidden');
$('#bugProjectA').removeClass('hidden').attr('href', href);
}
else
{
$('#bugProjectButton').removeClass('hidden');
$('#bugProjectA').addClass('hidden');
}
}
</script>
+2 -2
View File
@@ -1258,7 +1258,7 @@ class product extends control
$pager = new pager($recTotal, $recPerPage, $pageID);
/* Process product structure. */
if($this->config->systemMode == 'classic' and $orderBy == 'program_asc') $orderBy = 'order_desc';
if($this->config->systemMode == 'classic' and $orderBy == 'program_asc') $orderBy = 'order_asc';
$productStats = $this->product->getStats($orderBy, $pager, $browseType, '', 'story', '', $queryID);
$productStructure = $this->product->statisticProgram($productStats);
$productLines = $this->dao->select('*')->from(TABLE_MODULE)->where('type')->eq('line')->andWhere('deleted')->eq(0)->orderBy('`order` asc')->fetchAll();
@@ -1270,7 +1270,7 @@ class product extends control
$programLines[$productLine->root][$productLine->id] = $productLine->name;
}
$actionURL = $this->createLink('product', 'all', "browseType=bySearch&orderBy=order_desc&queryID=myQueryID");
$actionURL = $this->createLink('product', 'all', "browseType=bySearch&orderBy=order_asc&queryID=myQueryID");
$this->product->buildProductSearchForm($param, $actionURL);
$this->view->title = $this->lang->product->common;
+3 -3
View File
@@ -278,7 +278,7 @@ class productModel extends model
->orWhere('t1.createdBy')->eq($this->app->user->account)
->markRight(1)
->fi()
->orderBy('t2.order_asc, t1.line_desc, t1.order_desc')
->orderBy('t2.order_asc, t1.line_desc, t1.order_asc')
->beginIF($limit > 0)->limit($limit)->fi()
->fetchAll('id');
}
@@ -351,7 +351,7 @@ class productModel extends model
->beginIF(strpos($mode, 'noclosed') !== false)->andWhere('t1.status')->ne('closed')->fi()
->beginIF(!$this->app->user->admin and $this->config->vision == 'rnd')->andWhere('t1.id')->in($views)->fi()
->andWhere('t1.vision')->eq($this->config->vision)
->orderBy('isClosed, t2.order_asc, t1.line_desc, t1.order_desc')
->orderBy('isClosed, t2.order_asc, t1.line_desc, t1.order_asc')
->fetchPairs('id', 'name');
}
else
@@ -1675,7 +1675,7 @@ class productModel extends model
$products = $this->dao->select('t1.id as id, t1.*')->from(TABLE_PRODUCT)->alias('t1')
->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id')
->where('t1.id')->in($productKeys)
->orderBy('t2.order_asc, t1.line_desc, t1.order_desc')
->orderBy('t2.order_asc, t1.line_desc, t1.order_asc')
->page($pager)
->fetchAll('id');
}
+1 -1
View File
@@ -132,7 +132,7 @@ class program extends control
* @access public
* @return void
*/
public function product($programID = 0, $browseType = 'noclosed', $orderBy = 'order_desc', $recTotal = 0, $recPerPage = 15, $pageID = 1)
public function product($programID = 0, $browseType = 'noclosed', $orderBy = 'order_asc', $recTotal = 0, $recPerPage = 15, $pageID = 1)
{
$programPairs = $this->program->getPairs();
+5 -1
View File
@@ -1,5 +1,5 @@
<?php $canOrder = (common::hasPriv('program', 'updateOrder') and strpos($orderBy, 'order') !== false)?>
<form class='main-table' id='programForm' method='post' data-ride='table' data-nested='true' data-expand-nest-child='false' data-checkable='false' data-enable-empty-nested-row='true' data-replace-id='programTableList'>
<form class='main-table' id='programForm' method='post' data-ride='table' data-nested='true' data-expand-nest-child='false' data-checkable='false' data-enable-empty-nested-row='true' data-replace-id='programTableList' data-preserve-nested='true'>
<table class='table has-sort-head table-fixed table-nested' id='programList'>
<?php $vars = "status=$status&orderBy=%s";?>
<thead>
@@ -133,6 +133,10 @@ $(function()
selector: 'tr',
dragCssClass: 'drag-row',
trigger: $list.find('.sort-handler').length ? '.sort-handler' : null,
before: function(e)
{
if($(e.event.target).closest('a,.btn').length) return false;
},
canMoveHere: function($ele, $target)
{
return $ele.data('parent') === $target.data('parent');
+4 -2
View File
@@ -2183,9 +2183,11 @@ class testtaskModel extends model
$stepStatus = 'pass';
foreach($caseResult->steps as $i => $step)
{
$result->stepResults[$i]['result'] = $step->status ? 'pass' : 'fail';
if(!$step->status) $step->status = 'fail';
$result->stepResults[$i]['result'] = $step->status;
$result->stepResults[$i]['real'] = $step->checkPoints[0]->actual;
if(!$step->status) $stepStatus = 'fail';
if($step->status == 'fail') $stepStatus = 'fail';
$caseStep = new stdclass();
$caseStep->type = 'step';
+5 -5
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long