Merge branch 'master' of github.com:easysoft/zentaopms

This commit is contained in:
wangyidong
2016-04-18 10:07:25 +08:00
35 changed files with 341 additions and 87 deletions
+1 -1
View File
@@ -528,7 +528,7 @@ class block extends control
{
$this->app->loadLang('build');
$projects = $this->loadModel('project')->getPairs();
$this->view->builds = $this->dao->select('t1.*,t2.productName')->from(TABLE_BUILD)->alias('t1')
$this->view->builds = $this->dao->select('t1.*, t2.name as productName')->from(TABLE_BUILD)->alias('t1')
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
->where('t1.deleted')->eq('0')
->andWhere('t1.project')->in(array_keys($projects))
+36 -1
View File
@@ -51,6 +51,12 @@ function checkEmpty()
$dashboard.find('.dashboard-empty-message').toggleClass('hide', hasBlocks);
}
/**
* Resize block
* @param object $event
* @access public
* @return void
*/
function resizeBlock(event)
{
var blockID = event.element.find('.panel').data('id');
@@ -60,6 +66,33 @@ function resizeBlock(event)
});
}
/**
* Init table header
* @access public
* @return void
*/
function initTableHeader()
{
$('#dashboard .panel-block').each(function()
{
var $panel = $(this);
var $table = $panel.find('.table:first');
console.log($table.length, $table.children('thead').length, this);
if(!$table.length || !$table.children('thead').length) return;
console.log('ok');
var $header = $panel.children('.table-header-fixed');
if(!$header.length)
{
$header = $('<div class="table-header-fixed"><table class="table table-fixed"></table></div>').css('right', $panel.width() - $table.width() - 2);
$header.find('.table').append($table.find('thead').clone());
$panel.addClass('with-fixed-header').append($header);
var $heading = $panel.children('.panel-heading');
if($heading.length) $header.css('top', $heading.outerHeight());
}
});
}
$(function()
{
@@ -73,12 +106,14 @@ $(function()
sensitive : true,
panelRemovingTip : config.confirmRemoveBlock,
resizable : true,
onResize : resizeBlock
onResize : resizeBlock,
afterRefresh : initTableHeader
});
$dashboard.find('ul.dashboard-actions').addClass('hide').children('li').addClass('right').appendTo($('#modulemenu > .nav'));
$dashboard.find('[data-toggle=tooltip]').tooltip({container: 'body'});
checkEmpty();
initTableHeader();
});
+1
View File
@@ -15,6 +15,7 @@ $jsRoot = $webRoot . "js/";
$themeRoot = $webRoot . "theme/";
if(isset($pageCSS)) css::internal($pageCSS);
?>
<?php include '../../common/view/sparkline.html.php';?>
<div class='dashboard dashboard-draggable' id='dashboard' data-confirm-remove-block='<?php echo $lang->block->confirmRemoveBlock;?>'>
<ul class='dashboard-actions hide'><li><a href='<?php echo $this->createLink("block", "admin", "id=0&module=$module"); ?>' data-toggle='modal' data-type='ajax' data-width='600'><i class='icon icon-list-alt'></i> <?php echo $lang->block->createBlock?></a></li></ul>
<div class='dashboard-empty-message hide'>
+1
View File
@@ -90,6 +90,7 @@ $lang->bug->saveTemplate = 'Save template';
$lang->bug->deleteTemplate = 'Delete template';
$lang->bug->confirmStoryChange = 'Confirm Story Change';
$lang->bug->setPublic = 'Set public template';
$lang->bug->batchChangeModule = 'Batch change module';
/* Browse tabs. */
$lang->bug->assignToMe = 'MyBugs';
+1
View File
@@ -90,6 +90,7 @@ $lang->bug->deleteTemplate = '删除模板';
$lang->bug->confirmStoryChange = '确认需求变动';
$lang->bug->setPublic = '设为公共模板';
$lang->bug->colorTag = '颜色标签';
$lang->bug->batchChangeModule = '批量修改模块';
/* 查询条件列表。*/
$lang->bug->assignToMe = '指派给我';
+1 -1
View File
@@ -1,7 +1,7 @@
<style>
.datatable-menu-wrapper {position: relative;}
.datatable-menu {position: absolute; right: 0; top: 0; border: 1px solid #ddd; background: #fff; z-index: 999;}
.datatable-menu > .btn {padding: 5px 6px 6px; outline: none; color: #4d90fe!important}
.datatable-menu > .btn {padding: 5px 6px; outline: none; color: #4d90fe!important}
.datatable-menu > .btn:hover {color: #002563!important}
</style>
<?php $datatableId = $this->moduleName . $this->methodName;?>
+1 -8
View File
@@ -1,11 +1,4 @@
<?php if($extView = $this->getExtViewFile(__FILE__)){include $extView; return helper::cd();}?>
<?php
if($config->debug)
{
css::import($jsRoot . 'datatable/min.css');
js::import($jsRoot . 'datatable/min.js');
}
?>
<?php if(!empty($lang->datatable)):?>
<style>
.table-datatable tbody > tr td,
@@ -16,7 +9,7 @@ if($config->debug)
.table-datatable .checkbox-row {display: none}
.outer .datatable {border: 1px solid #ddd;}
.outer .datatable .table, .outer .datatable .table tfoot td {border: none; box-shadow: none}
.datatable .table>tbody>tr>td.col-hover, .datatable .table>tbody>tr.hover>td {background-color: #ebf2f9 !important;}
.datatable .table>tbody>tr.active>td.col-hover, .datatable .table>tbody>tr.active.hover>td {background-color: #f3eed8 !important;}
.datatable-span.flexarea .scroll-slide {bottom: -30px}
.panel > .datatable, .panel-body > .datatable {margin-bottom: 0;}
+17 -3
View File
@@ -16,10 +16,11 @@ class file extends control
*
* @param int $fileCount
* @param float $percent
* @param array $htmlTagName
* @access public
* @return void
*/
public function buildForm($fileCount = 1, $percent = 0.9)
public function buildForm($fileCount = 1, $percent = 0.9, $htmlTagName = array())
{
if(!file_exists($this->file->savePath))
{
@@ -31,8 +32,21 @@ class file extends control
printf($this->lang->file->errorCanNotWrite, $this->file->savePath, $this->file->savePath);
return false;
}
$this->view->fileCount = $fileCount;
$this->view->percent = $percent;
if(empty($htmlTagName))
{
$filesName = 'files';
$labelsName = 'labels';
}
else
{
list($filesName, $labelsName) = $htmlTagName;
}
$this->view->fileCount = $fileCount;
$this->view->percent = $percent;
$this->view->filesName = $filesName;
$this->view->labelsName = $labelsName;
$this->display();
}
+23 -7
View File
@@ -36,12 +36,17 @@ class fileModel extends model
*
* @param string $objectType
* @param string $objectID
* @param string $extra
* @access public
* @return array
*/
public function getByObject($objectType, $objectID)
public function getByObject($objectType, $objectID, $extra = '')
{
return $this->dao->select('*')->from(TABLE_FILE)->where('objectType')->eq($objectType)->andWhere('objectID')->eq((int)$objectID)->orderBy('id')->fetchAll();
return $this->dao->select('*')->from(TABLE_FILE)
->where('objectType')->eq($objectType)
->andWhere('objectID')->eq((int)$objectID)
->beginIF($extra)->andWhere('extra')->eq($extra)
->orderBy('id')->fetchAll();
}
/**
@@ -65,14 +70,24 @@ class fileModel extends model
* @param string $objectType
* @param string $objectID
* @param string $extra
* @param array $htmlTagName
* @access public
* @return array
*/
public function saveUpload($objectType = '', $objectID = '', $extra = '')
public function saveUpload($objectType = '', $objectID = '', $extra = '', $htmlTagName = array())
{
if(empty($htmlTagName))
{
$files = $this->getUpload();
}
else
{
list($filesName, $labelsName) = $htmlTagName;
$files = $this->getUpload($filesName, $labelsName);
}
$fileTitles = array();
$now = helper::today();
$files = $this->getUpload();
foreach($files as $id => $file)
{
@@ -107,10 +122,11 @@ class fileModel extends model
* Get info of uploaded files.
*
* @param string $htmlTagName
* @param string $labelsName
* @access public
* @return array
*/
public function getUpload($htmlTagName = 'files')
public function getUpload($htmlTagName = 'files', $labelsName = 'labels')
{
$files = array();
if(!isset($_FILES[$htmlTagName])) return $files;
@@ -130,7 +146,7 @@ class fileModel extends model
if(!validater::checkFileName($filename)) continue;
$file['extension'] = $this->getExtension($filename);
$file['pathname'] = $this->setPathName($id, $file['extension']);
$file['title'] = !empty($_POST['labels'][$id]) ? htmlspecialchars($_POST['labels'][$id]) : str_replace('.' . $file['extension'], '', $filename);
$file['title'] = !empty($_POST[$labelsName][$id]) ? htmlspecialchars($_POST[$labelsName][$id]) : str_replace('.' . $file['extension'], '', $filename);
$file['title'] = $purifier->purify($file['title']);
$file['size'] = $size[$id];
$file['tmpname'] = $tmp_name[$id];
@@ -144,7 +160,7 @@ class fileModel extends model
if(!validater::checkFileName($name)) return array();;
$file['extension'] = $this->getExtension($name);
$file['pathname'] = $this->setPathName(0, $file['extension']);
$file['title'] = !empty($_POST['labels'][0]) ? htmlspecialchars($_POST['labels'][0]) : substr($name, 0, strpos($name, $file['extension']) - 1);
$file['title'] = !empty($_POST[$labelsName][0]) ? htmlspecialchars($_POST[$labelsName][0]) : substr($name, 0, strpos($name, $file['extension']) - 1);
$file['title'] = $purifier->purify($file['title']);
$file['size'] = $size;
$file['tmpname'] = $tmp_name;
+11 -5
View File
@@ -12,10 +12,10 @@ table.fileBox td {padding: 0!important}
$fileRow = <<<EOT
<table class='fileBox' id='fileBox\$i'>
<tr>
<td class='w-p45'><div class='form-control file-wrapper'><input type='file' name='files[]' class='fileControl' tabindex='-1' onchange='checkSizeAndType(this)'/></div></td>
<td class=''><input type='text' name='labels[]' class='form-control' placeholder='{$lang->file->label}' tabindex='-1' /></td>
<td class='w-30px'><a href='javascript:void();' onclick='addFile(this)' class='btn btn-block'><i class='icon-plus'></i></a></td>
<td class='w-30px'><a href='javascript:void();' onclick='delFile(this)' class='btn btn-block'><i class='icon-remove'></i></a></td>
<td class='w-p45'><div class='form-control file-wrapper'><input type='file' name='{$filesName}[]' class='fileControl' tabindex='-1' onchange='checkSizeAndType(this)'/></div></td>
<td class=''><input type='text' name='{$labelsName}[]' class='form-control' placeholder='{$lang->file->label}' tabindex='-1' /></td>
<td class='w-30px'><a href='javascript:void(0);' onclick='addFile(this)' class='btn btn-block'><i class='icon-plus'></i></a></td>
<td class='w-30px'><a href='javascript:void(0);' onclick='delFile(this)' class='btn btn-block'><i class='icon-remove'></i></a></td>
</tr>
</table>
EOT;
@@ -100,7 +100,13 @@ function addFile(clickedButton)
{
fileRow = <?php echo json_encode($fileRow);?>;
fileRow = fileRow.replace('$i', $('.fileID').size() + 1);
$(clickedButton).closest('.fileBox').after(fileRow);
filesName = $(clickedButton).closest('tr').find('input[type="file"]').attr('name');
labelsName = $(clickedButton).closest('tr').find('input[type="text"]').attr('name');
$fileBox = $(clickedButton).closest('.fileBox').after(fileRow).next('.fileBox');
$fileBox.find('input[type="file"]').attr('name', filesName);
$fileBox.find('input[type="text"]').attr('name', labelsName);
setFileFormWidth(<?php echo $percent;?>);
updateID();
+37 -23
View File
@@ -79,6 +79,8 @@ $lang->resource->my->dynamic = 'dynamic';
$lang->resource->my->editProfile = 'editProfile';
$lang->resource->my->changePassword = 'changePassword';
$lang->resource->my->unbind = 'unbind';
$lang->resource->my->manageContacts = 'manageContacts';
$lang->resource->my->deleteContacts = 'deleteContacts';
$lang->my->methodOrder[0] = 'index';
$lang->my->methodOrder[5] = 'todo';
@@ -93,6 +95,8 @@ $lang->my->methodOrder[45] = 'dynamic';
$lang->my->methodOrder[50] = 'editProfile';
$lang->my->methodOrder[55] = 'changePassword';
$lang->my->methodOrder[60] = 'unbind';
$lang->my->methodOrder[65] = 'manageContacts';
$lang->my->methodOrder[75] = 'deleteContacts';
/* Todo. */
$lang->resource->todo = new stdclass();
@@ -178,26 +182,30 @@ $lang->resource->story->batchChangePlan = 'batchChangePlan';
$lang->resource->story->batchChangeBranch = 'batchChangeBranch';
$lang->resource->story->batchChangeStage = 'batchChangeStage';
$lang->resource->story->batchAssignTo = 'batchAssignTo';
$lang->resource->story->batchChangeModule = 'batchChangeModule';
$lang->story->methodOrder[5] = 'create';
$lang->story->methodOrder[10] = 'batchCreate';
$lang->story->methodOrder[15] = 'edit';
$lang->story->methodOrder[20] = 'export';
$lang->story->methodOrder[25] = 'delete';
$lang->story->methodOrder[30] = 'view';
$lang->story->methodOrder[35] = 'change';
$lang->story->methodOrder[40] = 'review';
$lang->story->methodOrder[45] = 'batchReview';
$lang->story->methodOrder[50] = 'close';
$lang->story->methodOrder[55] = 'batchClose';
$lang->story->methodOrder[60] = 'batchChangePlan';
$lang->story->methodOrder[65] = 'batchChangeStage';
$lang->story->methodOrder[70] = 'batchAssignTo';
$lang->story->methodOrder[75] = 'activate';
$lang->story->methodOrder[80] = 'tasks';
$lang->story->methodOrder[85] = 'zeroCase';
$lang->story->methodOrder[90] = 'report';
$lang->story->methodOrder[95] = 'batchChangeBranch';
$lang->story->methodOrder[5] = 'create';
$lang->story->methodOrder[10] = 'batchCreate';
$lang->story->methodOrder[15] = 'edit';
$lang->story->methodOrder[20] = 'export';
$lang->story->methodOrder[25] = 'delete';
$lang->story->methodOrder[30] = 'view';
$lang->story->methodOrder[35] = 'change';
$lang->story->methodOrder[40] = 'review';
$lang->story->methodOrder[45] = 'batchReview';
$lang->story->methodOrder[50] = 'close';
$lang->story->methodOrder[55] = 'batchClose';
$lang->story->methodOrder[60] = 'batchChangePlan';
$lang->story->methodOrder[65] = 'batchChangeStage';
$lang->story->methodOrder[70] = 'batchAssignTo';
$lang->story->methodOrder[75] = 'activate';
$lang->story->methodOrder[80] = 'tasks';
$lang->story->methodOrder[85] = 'zeroCase';
$lang->story->methodOrder[90] = 'report';
$lang->story->methodOrder[95] = 'linkStory';
$lang->story->methodOrder[100] = 'unlinkStory';
$lang->story->methodOrder[105] = 'batchChangeBranch';
$lang->story->methodOrder[110] = 'batchChangeModule';
/* Product plan. */
$lang->resource->productplan = new stdclass();
@@ -358,6 +366,7 @@ $lang->resource->task->recordEstimate = 'recordEstimate';
$lang->resource->task->editEstimate = 'editEstimate';
$lang->resource->task->deleteEstimate = 'deleteEstimate';
$lang->resource->task->report = 'reportChart';
$lang->resource->task->batchChangeModule = 'batchChangeModule';
$lang->task->methodOrder[5] = 'create';
$lang->task->methodOrder[10] = 'batchCreate';
@@ -381,6 +390,7 @@ $lang->task->methodOrder[95] = 'recordEstimate';
$lang->task->methodOrder[100] = 'editEstimate';
$lang->task->methodOrder[105] = 'deleteEstimate';
$lang->task->methodOrder[110] = 'report';
$lang->task->methodOrder[115] = 'batchChangeModule';
/* Build. */
$lang->resource->build = new stdclass();
@@ -439,6 +449,7 @@ $lang->resource->bug->delete = 'delete';
$lang->resource->bug->saveTemplate = 'saveTemplate';
$lang->resource->bug->deleteTemplate = 'deleteTemplate';
$lang->resource->bug->setPublic = 'setPublic';
$lang->resource->bug->batchChangeModule = 'batchChangeModule';
$lang->bug->methodOrder[0] = 'index';
$lang->bug->methodOrder[5] = 'browse';
@@ -463,6 +474,9 @@ $lang->bug->methodOrder[95] = 'delete';
$lang->bug->methodOrder[100] = 'saveTemplate';
$lang->bug->methodOrder[105] = 'deleteTemplate';
$lang->bug->methodOrder[110] = 'setPublic';
$lang->bug->methodOrder[115] = 'linkBugs';
$lang->bug->methodOrder[120] = 'unlinkBug';
$lang->bug->methodOrder[125] = 'batchChangeModule';
/* Test case. */
$lang->resource->testcase = new stdclass();
@@ -485,6 +499,7 @@ $lang->resource->testcase->import = 'import';
$lang->resource->testcase->showImport = 'showImport';
$lang->resource->testcase->confirmChange = 'confirmChange';
$lang->resource->testcase->confirmStoryChange = 'confirmStoryChange';
$lang->resource->testcase->batchChangeModule = 'batchChangeModule';
$lang->testcase->methodOrder[0] = 'index';
$lang->testcase->methodOrder[5] = 'browse';
@@ -500,6 +515,9 @@ $lang->testcase->methodOrder[50] = 'confirmChange';
$lang->testcase->methodOrder[55] = 'confirmStoryChange';
$lang->testcase->methodOrder[60] = 'batchEdit';
$lang->testcase->methodOrder[65] = 'batchDelete';
$lang->testcase->methodOrder[70] = 'batchChangeModule';
$lang->testcase->methodOrder[75] = 'linkCases';
$lang->testcase->methodOrder[80] = 'unlinkCase';
/* Test task. */
$lang->resource->testtask = new stdclass();
@@ -680,8 +698,6 @@ $lang->resource->user->project = 'project';
$lang->resource->user->dynamic = 'dynamic';
$lang->resource->user->profile = 'profile';
$lang->resource->user->batchEdit = 'batchEdit';
$lang->resource->user->manageContacts = 'manageContacts';
$lang->resource->user->deleteContacts = 'deleteContacts';
$lang->resource->user->unbind = 'unbind';
$lang->user->methodOrder[5] = 'create';
@@ -697,8 +713,6 @@ $lang->user->methodOrder[45] = 'project';
$lang->user->methodOrder[50] = 'dynamic';
$lang->user->methodOrder[55] = 'profile';
$lang->user->methodOrder[60] = 'batchEdit';
$lang->user->methodOrder[65] = 'manageContacts';
$lang->user->methodOrder[70] = 'deleteContacts';
$lang->user->methodOrder[75] = 'unbind';
/* Tree. */
+1 -1
View File
@@ -1,6 +1,6 @@
.cards {padding-bottom: 0;}
.cards > .col-sm-6 {width: 25%; padding: 0 10px}
.card {height: 225px; position: relative; padding-top: 50px; border-radius: 6px; margin: 0}
.card {height: 225px; position: relative; padding-top: 50px; margin: 0}
.card > .media {position: absolute; left: 0; top: 0; width: 100%; background: #f1f1f1; height:50px; bottom: 0; overflow: hidden; z-index: 90; transition: all 0.4s;}
.card > .media > .icon {position: absolute; display: block; font-size: 56px; color: #ddd; z-index: 99; bottom: -10px; right: -6px; transition: all 0.4s;}
.card > .media > h5 {position: absolute; display: block; color: #666; z-index: 100; font-size: 14px; left: 15px; top: 10px; transition: all 0.4s;}
+2
View File
@@ -15,6 +15,8 @@ $lang->my->dynamic = 'Dynamic';
$lang->my->editProfile = 'Edit profile';
$lang->my->changePassword = 'Change password';
$lang->my->unbind = 'Unbind ranzhi';
$lang->my->manageContacts = 'Manage contacts';
$lang->my->deleteContacts = 'Delete contacts';
$lang->my->taskMenu = new stdclass();
$lang->my->taskMenu->assignedToMe = 'To me';
+2
View File
@@ -15,6 +15,8 @@ $lang->my->dynamic = '我的动态';
$lang->my->editProfile = '修改档案';
$lang->my->changePassword = '修改密码';
$lang->my->unbind = '解除然之绑定';
$lang->my->manageContacts = '维护联系人';
$lang->my->deleteContacts = '删除联系人';
$lang->my->taskMenu = new stdclass();
$lang->my->taskMenu->assignedToMe = '指派给我';
+1
View File
@@ -33,6 +33,7 @@ $lang->story->batchChangePlan = "Batch change plan";
$lang->story->batchChangeBranch = "Batch change branch";
$lang->story->batchChangeStage = "Batch change stage";
$lang->story->batchAssignTo = "Batch assignto";
$lang->story->batchChangeModule = "Batch change module";
$lang->story->common = 'Story';
$lang->story->id = 'ID';
+1
View File
@@ -33,6 +33,7 @@ $lang->story->batchChangePlan = "批量修改计划";
$lang->story->batchChangeBranch = "批量修改分支";
$lang->story->batchChangeStage = "批量修改阶段";
$lang->story->batchAssignTo = "批量指派";
$lang->story->batchChangeModule = "批量修改模块";
$lang->story->common = '需求';
$lang->story->id = '编号';
+1
View File
@@ -31,6 +31,7 @@ $lang->task->export = "Export data";
$lang->task->reportChart = "Report chart";
$lang->task->fromBug = 'From Bug';
$lang->task->confirmStoryChange = "Confirm story change";
$lang->task->batchChangeModule = "Batch change module";
$lang->task->common = 'Task';
$lang->task->id = 'ID';
+1
View File
@@ -31,6 +31,7 @@ $lang->task->export = "导出数据";
$lang->task->reportChart = "报表统计";
$lang->task->fromBug = '来源Bug';
$lang->task->confirmStoryChange = "确认需求变动";
$lang->task->batchChangeModule = "批量修改模块";
$lang->task->common = '任务';
$lang->task->id = '编号';
+1
View File
@@ -69,6 +69,7 @@ $lang->testcase->export = "Export data";
$lang->testcase->confirmChange = 'Confirm case change';
$lang->testcase->confirmStoryChange = 'Confirm story change';
$lang->testcase->colorTag = 'Color tag';
$lang->testcase->batchChangeModule = "Batch change module";
$lang->testcase->new = 'New';
+1
View File
@@ -69,6 +69,7 @@ $lang->testcase->export = "导出数据";
$lang->testcase->confirmChange = '确认用例变动';
$lang->testcase->confirmStoryChange = '确认需求变动';
$lang->testcase->colorTag = '颜色标签';
$lang->testcase->batchChangeModule = "批量修改模块";
$lang->testcase->new = '新增';
+1
View File
@@ -318,6 +318,7 @@ class testtask extends control
$this->view->productName = $this->products[$productID];
$this->view->task = $task;
$this->view->users = $this->loadModel('user')->getPairs('noclosed,qafirst');
$this->view->assignedTos = $this->loadModel('user')->getPairs('noclosed,nodeleted,qafirst');
$this->view->moduleTree = $this->loadModel('tree')->getTreeMenu($productID, $viewType = 'case', $startModuleID = 0, array('treeModel', 'createTestTaskLink'), $extra = $taskID);
$this->view->browseType = $browseType;
$this->view->param = $param;
+4
View File
@@ -1 +1,5 @@
.outer > #titlebar {display: none}
.btn-file {float:right}
.fix-border td {border:0px;}
.fix-position td {vertical-align: middle;}
+1
View File
@@ -50,6 +50,7 @@ $lang->testtask->lastRunAccount = "Run";
$lang->testtask->lastRunTime = 'Time';
$lang->testtask->lastRunResult = 'Result';
$lang->testtask->report = 'Report';
$lang->testtask->files = 'Upload Files';
$lang->testtask->legendDesc = 'Desc';
$lang->testtask->legendReport = 'Report';
+1
View File
@@ -50,6 +50,7 @@ $lang->testtask->lastRunAccount = '执行人';
$lang->testtask->lastRunTime = '执行时间';
$lang->testtask->lastRunResult = '结果';
$lang->testtask->report = '测试总结';
$lang->testtask->files = '上传附件';
$lang->testtask->legendDesc = '版本描述';
$lang->testtask->legendReport = '测试总结';
+28
View File
@@ -365,7 +365,28 @@ class testtaskModel extends model
->skipSpecial('stepResults')
->remove('steps,reals,result')
->get();
/* Remove files and labels field when uploading files for case result or step result. */
foreach($result as $fieldName => $field)
{
if((strpos($fieldName, 'files') !== false) or (strpos($fieldName, 'labels') !== false)) unset($result->$fieldName);
}
$this->dao->insert(TABLE_TESTRESULT)->data($result)->autoCheck()->exec();
/* Save upload files for case result or step result. */
if(!dao::isError())
{
$resultID = $this->dao->lastInsertID();
if(!empty($stepResults))
{
foreach($stepResults as $stepID => $stepResult) $this->loadModel('file')->saveUpload('stepResult', $resultID, $stepID, array("files{$stepID}", "labels{$stepID}"));
}
else
{
$this->loadModel('file')->saveUpload('caseResult', $resultID);
}
}
$this->dao->update(TABLE_CASE)->set('lastRunner')->eq($this->app->user->account)->set('lastRunDate')->eq($now)->set('lastRunResult')->eq($caseResult)->where('id')->eq($postData->case)->exec();
if($runID)
@@ -502,6 +523,7 @@ class testtaskModel extends model
{
$result->stepResults = unserialize($result->stepResults);
$result->build = $result->run ? zget($runs, $result->run, 0) : 0;
$result->files = $this->loadModel('file')->getByObject('caseResult', $resultID);//Get files of case result.
$results[$resultID] = $result;
foreach($relatedSteps as $key => $step)
@@ -512,6 +534,12 @@ class testtaskModel extends model
$result->stepResults[$step->id]['expect'] = $step->expect;
}
}
/* Get files of step result. */
foreach($result->stepResults as $stepID => $stepResult)
{
$result->stepResults[$stepID]['files'] = $this->loadModel('file')->getByObject('stepResult', $resultID, $stepID);
}
}
return $results;
}
+1 -1
View File
@@ -58,7 +58,7 @@ include $useDatatable ? dirname(__FILE__) . '/datatabledata.html.php' : dirname(
{
$actionLink = inLink('batchAssign', "taskID=$task->id");
echo "<div class='input-group w-200px'>";
echo html::select('assignedTo', $users, '', 'class="form-control chosen"');
echo html::select('assignedTo', $assignedTos, '', 'class="form-control chosen"');
echo "<span class='input-group-addon'>";
echo html::a("javascript:setFormAction(\"$actionLink\")", $lang->testtask->assign);
echo '</span></div>';
+33 -2
View File
@@ -42,11 +42,12 @@
<td class='w-180px'><?php echo $result->date;?></td>
<td><?php echo $users[$result->lastRunner] . ' ' . $lang->testtask->runCase;?></td>
<td class='w-150px'><?php echo zget($builds, $result->build, '');?></td>
<td class='w-50px'><?php if(!empty($result->files)) echo html::a("#caseResult{$result->id}", '<i class="icon icon-file"></i>', '', "data-toggle='modal' title='{$lang->files}' data-type='iframe'")?></td>
<td class='w-50px text-right'><strong class='text-<?php echo $class;?>'><?php echo $lang->testcase->resultList[$result->caseResult]?></strong></td>
<td class='w-50px text-center'><i class='collapse-handle icon-chevron-down text-muted'></i></td>
</tr>
<tr class='result-detail hide'>
<td colspan='6' class='pd-0'>
<td colspan='7' class='pd-0'>
<table class='table table-condensed borderless mg-0'>
<thead>
<tr>
@@ -61,13 +62,17 @@
$i = 1;
foreach($result->stepResults as $key => $stepResult):
?>
<?php $modalID = $result->id . '-' . $key;?>
<tr>
<td class='w-30px text-center'><?php echo $i;?></td>
<td><?php if(isset($stepResult['desc'])) echo nl2br($stepResult['desc']);?></td>
<td><?php if(isset($stepResult['expect'])) echo nl2br($stepResult['expect']);?></td>
<?php if(!empty($stepResult['result'])):?>
<td class='<?php echo $stepResult['result'];?> text-center'><?php echo $lang->testcase->resultList[$stepResult['result']];?></td>
<td><?php echo $stepResult['real'];?></td>
<td>
<?php echo $stepResult['real'];?>
<?php if(!empty($stepResult['files'])) echo html::a("#stepResult{$modalID}", '<i class="icon icon-file"></i>', '', "data-toggle='modal' title='{$lang->files}' data-type='iframe' style='float:right'")?>
</td>
</tr>
<?php else:?>
<td></td>
@@ -80,6 +85,32 @@
</tr>
<?php endforeach;?>
</table>
<?php foreach($results as $result):?>
<div class="modal fade" id="caseResult<?php echo $result->id;?>">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title"><?php echo $lang->files;?></h4>
</div>
<div class="modal-body"><?php echo $this->fetch('file', 'printFiles', array('files' => $result->files, 'fieldset' => 'false'));?></div>
</div>
</div>
</div>
<?php foreach($result->stepResults as $stepID => $stepResult):?>
<div class="modal fade" id="stepResult<?php echo $result->id . '-' .$stepID;?>">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title"><?php echo $lang->files;?></h4>
</div>
<div class="modal-body"><?php echo $this->fetch('file', 'printFiles', array('files' => $stepResult['files'], 'fieldset' => 'false'));?></div>
</div>
</div>
</div>
<?php endforeach;?>
<?php endforeach;?>
<div id='resultTip' class='hide'><?php if($count > 0) echo $failCount > 0 ? "<span>" . sprintf($lang->testtask->showFail, $failCount) . "</span>":"<span class='text-success'>{$lang->testtask->passAll}</span>";?></div>
<style>.table-hover tr.result-detail:hover td {background: #fff} #casesResults > table > caption {border: 1px solid #ddd; margin-bottom: -1px}</style>
</div>
+56 -4
View File
@@ -19,18 +19,23 @@
</div>
</div>
<div class='main'>
<form class='form-condensed' method='post'>
<form class='form-condensed' method='post' enctype='multipart/form-data'>
<table class='table table-bordered table-form' style='word-break:break-all'>
<thead>
<tr>
<td colspan='5' style='word-break: break-all;'><strong><?php echo $lang->testcase->precondition;?></strong> <?php echo $run->case->precondition;?></td>
</tr>
<tr>
<tr class='fix-position'>
<th class='w-40px'><?php echo $lang->testcase->stepID;?></th>
<th class='w-p30'><?php echo $lang->testcase->stepDesc;?></th>
<th class='w-p30'><?php echo $lang->testcase->stepExpect;?></th>
<th class='w-100px'><?php echo $lang->testcase->result;?></th>
<th><?php echo $lang->testcase->real;?></th>
<th>
<?php echo $lang->testcase->real;?>
<?php if(empty($run->case->steps)):?>
<button type='button' class='btn-file' data-toggle='modal' data-target='#fileModal'><?php echo $lang->testtask->files;?></button>
<?php endif;?>
</th>
</tr>
</thead>
<?php foreach($run->case->steps as $key => $step):?>
@@ -40,7 +45,14 @@
<td><?php echo nl2br($step->desc);?></td>
<td><?php echo nl2br($step->expect);?></td>
<td class='text-center'><?php echo html::select("steps[$step->id]", $lang->testcase->resultList, $defaultResult, "class='form-control'");?></td>
<td><?php echo html::textarea("reals[$step->id]", '', "rows=2 class='form-control'");?></td>
<td>
<table class='fix-border fix-position'>
<tr>
<td><?php echo html::textarea("reals[$step->id]", '', "rows=2 class='form-control fix-textarea'");?></td>
<td><button type='button' title='<?php echo $lang->testtask->files?>' class='btn-file' data-toggle='modal' data-target='#fileModal<?php echo $step->id?>'><i class='icon icon-paper-clip'></i></button></td>
</tr>
</table>
</td>
</tr>
<?php endforeach;?>
<tr class='text-center'>
@@ -64,6 +76,46 @@
</td>
</tr>
</table>
<?php if(empty($run->case->steps)):?>
<div class="modal fade" id="fileModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title"><?php echo $lang->testtask->files;?></h4>
</div>
<div class="modal-body">
<table class='table table-form'>
<tr>
<td><?php echo $this->fetch('file', 'buildform');?></td>
</tr>
</table>
</div>
</div>
</div>
</div>
<?php else:?>
<?php foreach($run->case->steps as $key => $step):?>
<?php $htmlTagName = array("files{$step->id}", "labels{$step->id}");?>
<div class="modal fade" id="fileModal<?php echo $step->id;?>">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title"><?php echo $lang->testtask->files;?></h4>
</div>
<div class="modal-body">
<table class='table table-form'>
<tr>
<td><?php echo $this->fetch('file', 'buildform', array('fileCount' => 1, 'percent' => 0.9, 'htmlTagName' => $htmlTagName));?></td>
</tr>
</table>
</div>
</div>
</div>
</div>
<?php endforeach;?>
<?php endif;?>
</form>
</div>
<div class='main' id='resultsContainer'>
+39
View File
@@ -136,6 +136,9 @@ class upgradeModel extends model
$this->addPriv8_1();
case '8_1':
$this->execSQL($this->getUpgradeFile('8.1'));
case '8_1_3':
$this->execSQL($this->getUpgradeFile('8.1.3'));
$this->addPriv8_2();
default: if(!$this->isError()) $this->setting->updateVersion($this->config->version);
}
@@ -861,6 +864,42 @@ class upgradeModel extends model
$this->dao->replace($privTable)->set('module')->eq('project')->set('method')->eq('kanban')->set('`group`')->eq($group)->exec();
}
$groups = $this->dao->select('`group`')->from($privTable)->where('`module`')->eq('user')->andWhere('`method`')->eq('manageContacts')->fetchPairs('group', 'group');
foreach($groups as $group)
{
$this->dao->replace($privTable)->set('module')->eq('my')->set('method')->eq('manageContacts')->set('`group`')->eq($group)->exec();
}
$groups = $this->dao->select('`group`')->from($privTable)->where('`module`')->eq('user')->andWhere('`method`')->eq('deleteContacts')->fetchPairs('group', 'group');
foreach($groups as $group)
{
$this->dao->replace($privTable)->set('module')->eq('my')->set('method')->eq('deleteContacts')->set('`group`')->eq($group)->exec();
}
$groups = $this->dao->select('*')->from($privTable)->where('module')->eq('story')->andWhere('method')->eq('edit')->fetchAll();
foreach($groups as $group)
{
$this->dao->replace($privTable)->set('module')->eq('story')->set('method')->eq('batchChangeModule')->set('`group`')->eq($group)->exec();
}
$groups = $this->dao->select('*')->from($privTable)->where('module')->eq('bug')->andWhere('method')->eq('edit')->fetchAll();
foreach($groups as $group)
{
$this->dao->replace($privTable)->set('module')->eq('bug')->set('method')->eq('batchChangeModule')->set('`group`')->eq($group)->exec();
}
$groups = $this->dao->select('*')->from($privTable)->where('module')->eq('task')->andWhere('method')->eq('edit')->fetchAll();
foreach($groups as $group)
{
$this->dao->replace($privTable)->set('module')->eq('task')->set('method')->eq('batchChangeModule')->set('`group`')->eq($group)->exec();
}
$groups = $this->dao->select('*')->from($privTable)->where('module')->eq('testcase')->andWhere('method')->eq('edit')->fetchAll();
foreach($groups as $group)
{
$this->dao->replace($privTable)->set('module')->eq('testcase')->set('method')->eq('batchChangeModule')->set('`group`')->eq($group)->exec();
}
return true;
}