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

This commit is contained in:
caoyanyi
2023-04-14 13:13:48 +08:00
412 changed files with 13423 additions and 3950 deletions
+4
View File
@@ -356,6 +356,10 @@ $filter->testtask->cases->cookie['preTaskID'] = 'int';
$filter->testtask->cases->cookie['taskCaseModule'] = 'int';
$filter->testtask->default->cookie['lastProduct'] = 'int';
$filter->testtask->default->cookie['preProductID'] = 'int';
$filter->testcase->browse->cookie['onlyScene'] = 'code';
if(empty($filter->project->testcase)) $filter->project->testcase = new stdclass();
$filter->project->testcase->cookie = array('onlyScene' => 'code');
$filter->todo->export->cookie['checkedItem'] = 'reg::checked';
+5
View File
@@ -357,6 +357,10 @@ define('TABLE_DASHBOARD', '`' . $config->db->prefix . 'dashboard`');
define('TABLE_DATASET', '`' . $config->db->prefix . 'dataset`');
define('TABLE_DATAVIEW', '`' . $config->db->prefix . 'dataview`');
define('TABLE_DIMENSION', '`' . $config->db->prefix . 'dimension`');
define('TABLE_SCENE', '`' . $config->db->prefix . 'scene`');
define('VIEW_SCENECASE', '`ztv_scenecase`');
define('CHANGEVALUE', 100000000);
$config->objectTables['product'] = TABLE_PRODUCT;
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
@@ -411,6 +415,7 @@ $config->objectTables['zahost'] = TABLE_ZAHOST;
$config->objectTables['zanode'] = TABLE_ZAHOST;
$config->objectTables['automation'] = TABLE_AUTOMATION;
$config->objectTables['stepResult'] = TABLE_TESTRUN;
$config->objectTables['scene'] = TABLE_SCENE;
$config->newFeatures = array('introduction', 'tutorial', 'youngBlueTheme', 'visions');
$config->disabledFeatures = '';
+190 -21
View File
File diff suppressed because one or more lines are too long
+196 -21
View File
File diff suppressed because one or more lines are too long
+318
View File
@@ -0,0 +1,318 @@
<?php
/**
* The xmind library of zentaopms, can be used to bakup and restore a database.
*
* @copyright Copyright 2009-2015 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) 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 Ke Zhao <zhaoke@cnezsoft.com>
* @package Xmind
* @version $Id$
* @link http://www.zentao.net
*/
class xmind
{
/**
* Create module node.
*
* @param DOMDocument $xmlDoc
* @param array $context
* @param DOMElement $productNode
* @param array $moduleNodes
* @access public
* @return void
*/
function createModuleNode($xmlDoc, $context, $productNode, &$moduleNodes)
{
$config = $context['config'];
$moduleList = $context['moduleList'];
foreach($moduleList as $key => $name)
{
$suffix = $config['module'].':'.$key;
$moduleNode = $this->createNode($xmlDoc, $name, $suffix, array('nodeType' => 'module'));
$productNode->appendChild($moduleNode);
$moduleNodes[$key] = $moduleNode;
}
}
/**
* Create scene node.
*
* @param DOMDocument $xmlDoc
* @param array $context
* @param DOMElement $productNode
* @param array $moduleNodes
* @param array $sceneNodes
* @access public
* @return void
*/
function createSceneNode($xmlDoc, $context, $productNode, &$moduleNodes, &$sceneNodes)
{
$sceneMaps = $context['sceneMaps'];
$config = $context['config'];
$topScenes = $context['topScenes'];
foreach($topScenes as $scene)
{
$suffix = $config['scene'].':'.$scene->sceneID;
$sceneNode = $this->createNode($xmlDoc, $scene->sceneName, $suffix, array('nodeType' => 'scene'));
$this->createNextChildScenesNode($scene, $sceneNode, $xmlDoc, $context, $moduleNodes, $sceneNodes);
if(isset($moduleNodes[$scene->moduleID]))
{
$moduleNode = $moduleNodes[$scene->moduleID];
$moduleNode->appendChild($sceneNode);
}
else
{
$productNode->appendChild($sceneNode);
}
$sceneNodes[$scene->sceneID] = $sceneNode;
}
}
/**
* Create next child scene node.
*
* @param object $parentScene
* @param object $parentNode
* @param DOMDocument $xmlDoc
* @param array $context
* @param array $moduleNodes
* @param array $sceneNodes
* @access public
* @return void
*/
function createNextChildScenesNode($parentScene,$parentNode, $xmlDoc, $context, &$moduleNodes, &$sceneNodes)
{
$sceneMaps = $context['sceneMaps'];
$config = $context['config'];
foreach($sceneMaps as $key => $scene)
{
if($scene->parentID != $parentScene->sceneID + CHANGEVALUE) continue;
$suffix = $config['scene'].':'.$scene->sceneID;
$sceneNode = $this->createNode($xmlDoc, $scene->sceneName, $suffix, array('nodeType'=>'scene'));
$this->createNextChildScenesNode($scene, $sceneNode, $xmlDoc, $context, $moduleNodes, $sceneNodes);
$parentNode->appendChild($sceneNode);
$sceneNodes[$scene->sceneID] = $sceneNode;
}
}
/**
* Create test case node.
*
* @param DOMDocument $xmlDoc
* @param array $context
* @param object $productNode
* @param array $moduleNodes
* @param array $sceneNodes
* @access public
* @return void
*/
function createTestcaseNode($xmlDoc, $context, $productNode, &$moduleNodes, &$sceneNodes)
{
$caseList = $context['caseList'];
foreach($caseList as $case)
{
if(empty($case->testcaseID)) continue;
$parentNode = $sceneNodes[$case->sceneID];
if(!isset($parentNode)) $parentNode = $moduleNodes[$case->moduleID];
if(!isset($parentNode)) $parentNode = $productNode;
$this->createOneTestcaseNode($case, $xmlDoc, $context, $parentNode);
}
}
/**
* Create one test case node.
*
* @param object $case
* @param DOMDocument $xmlDoc
* @param array $context
* @param object $parentNode
* @access public
* @return void
*/
function createOneTestcaseNode($case, $xmlDoc, $context, $parentNode)
{
$caseList = $context['caseList'];
$stepList = $context['stepList'];
$config = $context['config'];
$suffix = $config['case'].':'.$case->testcaseID.','.$config['pri'].':'.$case->pri;
$caseNode = $this->createNode($xmlDoc, $case->name, $suffix, array('nodeType'=>'testcase'));
$parentNode->appendChild($caseNode);
$topStepList = $this->findTopStepListByCase($case, $stepList);
foreach($topStepList as $step)
{
$subStepList = $this->findSubStepListByStep($step,$stepList);
$suffix = count($subStepList) > 0 ? $config['group'] : '';
$stepNode = $this->createNode($xmlDoc, $step->desc, $suffix, array('nodeType' => 'step'));
$caseNode->appendChild($stepNode);
if(count($subStepList))
{
foreach($subStepList as $sub)
{
$subNode = $this->createNode($xmlDoc, $sub->desc, '', array('nodeType'=>'substep'));
$stepNode->appendChild($subNode);
if(!empty($sub->expect))
{
$expectNode = $this->createNode($xmlDoc, $sub->expect, '', array('nodeType'=>'expect'));
$subNode->appendChild($expectNode);
}
}
}
if(count($subStepList) == 0 && !empty($step->expect))
{
$expectNode = $this->createNode($xmlDoc, $step->expect, '', array('nodeType'=>'expect'));
$stepNode->appendChild($expectNode);
}
}
}
/**
* Find substep list by step.
*
* @param object $step
* @param array $stepList
* @access public
* @return array
*/
function findSubStepListByStep($step,$stepList)
{
$subList = array();
foreach($stepList as $one)
{
if($one->parentID == $step->stepID)
{
$subList[] = $one;
}
}
return $subList;
}
/**
* Find top step list by case.
*
* @param object $case
* @param array $stepList
* @access public
* @return array
*/
public function findTopStepListByCase($case,$stepList)
{
$topList = array();
foreach($stepList as $step)
{
if($step->parentID == '0' && $step->testcaseID == $case->testcaseID)
{
$topList[] = $step;
}
}
return $topList;
}
/**
* Create xmind node.
*
* @param DOMDocument $xmlDoc
* @param string $text
* @param string $suffix
* @param array $attrs
* @access public
* @return object
*/
public function createNode($xmlDoc, $text, $suffix = '', $attrs=array())
{
$node = $xmlDoc->createElement('node');
$textAttr = $xmlDoc->createAttribute('TEXT');
$textAttrValue = $xmlDoc->createTextNode($this->toText($text,$suffix));
$textAttr->appendChild($textAttrValue);
$node->appendChild($textAttr);
$positionAttr = $xmlDoc->createAttribute("POSITION");
$positionAttrValue = $xmlDoc->createTextNode('right');
$positionAttr->appendChild($positionAttrValue);
$node->appendChild($positionAttr);
foreach($attrs as $key => $value)
{
$attr = $xmlDoc->createAttribute($key);
$attrValue = $xmlDoc->createTextNode($value);
$attr->appendChild($attrValue);
$node->appendChild($attr);
}
return $node;
}
/**
* Add suffix before string.
*
* @param string $str
* @param string $suffix
* @access public
* @return string
*/
public function toText($str, $suffix)
{
if(empty($suffix)) return $str;
return $str . '['.$suffix.']';
}
/**
* Get substring between mark1 and mark2 from kw.
*
* @param string $str
* @param string $suffix
* @access public
* @return string
*/
function getBetween($kw1, $mark1, $mark2)
{
$kw = $kw1;
$kw = '123' . $kw . '123';
$st = strripos($kw, $mark1);
$ed = strripos($kw, $mark2);
if(($st == false || $ed == false) || $st >= $ed) return 0;
$kw = substr($kw, ($st + 1), ($ed - $st - 1));
return $kw;
}
/**
* Judgment ends with a string.
*
* @param string $haystack
* @param string $needle
* @access public
* @return string
*/
function endsWith($haystack, $needle)
{
return $needle === '' || substr_compare($haystack, $needle, -strlen($needle)) === 0;
}
}
+1
View File
@@ -51,6 +51,7 @@ $config->action->objectNameFields['repo'] = 'name';
$config->action->objectNameFields['dataview'] = 'name';
$config->action->objectNameFields['zahost'] = 'name';
$config->action->objectNameFields['zanode'] = 'name';
$config->action->objectNameFields['scene'] = 'title';
$config->action->commonImgSize = 870;
+4
View File
@@ -48,6 +48,9 @@ $lang->action->byQuery = 'Search';
$lang->action->undeleteAction = 'Reset Data';
$lang->action->hideOneAction = 'Hide Data';
$lang->action->refusecase = 'Before restoring the use case, please restore the scene to which the use case belongs';
$lang->action->refusescene = ' Before restoring the use case, please restore the parent scene of this scene ';
$lang->action->trashTips = 'Hinweis: Alle Löschungen in ZenTao sind logische Löschungen.';
$lang->action->textDiff = 'Text Format';
$lang->action->original = 'Original Format';
@@ -156,6 +159,7 @@ $lang->action->objectTypes['stage'] = 'Stage';
$lang->action->objectTypes['patch'] = 'Patch';
$lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['scene'] = 'Scene';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
+4
View File
@@ -48,6 +48,9 @@ $lang->action->byQuery = 'Search';
$lang->action->undeleteAction = 'Reset Data';
$lang->action->hideOneAction = 'Hide Data';
$lang->action->refusecase = 'Before restoring the use case, please restore the scene to which the use case belongs';
$lang->action->refusescene = ' Before restoring the use case, please restore the parent scene of this scene ';
$lang->action->trashTips = 'Note: Delete in ZenTao is logic.';
$lang->action->textDiff = 'Text Format';
$lang->action->original = 'Original Format';
@@ -156,6 +159,7 @@ $lang->action->objectTypes['stage'] = 'Stage';
$lang->action->objectTypes['patch'] = 'Patch';
$lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['scene'] = 'Scene';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
+4
View File
@@ -48,6 +48,9 @@ $lang->action->byQuery = 'Search';
$lang->action->undeleteAction = 'Reset Data';
$lang->action->hideOneAction = 'Hide Data';
$lang->action->refusecase = 'Before restoring the use case, please restore the scene to which the use case belongs';
$lang->action->refusescene = ' Before restoring the use case, please restore the parent scene of this scene ';
$lang->action->trashTips = 'Note: Les suppressions dans ZenTao sont purement logiques.';
$lang->action->textDiff = 'Text Format';
$lang->action->original = 'Original Format';
@@ -156,6 +159,7 @@ $lang->action->objectTypes['stage'] = 'Stage';
$lang->action->objectTypes['patch'] = 'Patch';
$lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['scene'] = 'Scene';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
+4
View File
@@ -48,6 +48,9 @@ $lang->action->history->old = 'Giá trị cũ';
$lang->action->history->new = 'Giá trị mới';
$lang->action->history->diff = 'So sánh';
$lang->action->refusecase = 'Before restoring the use case, please restore the scene to which the use case belongs';
$lang->action->refusescene = ' Before restoring the use case, please restore the parent scene of this scene ';
$lang->action->dynamic = new stdclass();
$lang->action->dynamic->today = 'Hôm nay';
$lang->action->dynamic->yesterday = 'Hôm qua';
@@ -123,6 +126,7 @@ $lang->action->objectTypes['stage'] = 'Stage';
$lang->action->objectTypes['patch'] = 'Patch';
$lang->action->objectTypes['repo'] = 'Repo';
$lang->action->objectTypes['dataview'] = 'Data View';
$lang->action->objectTypes['scene'] = 'Scene';
/* Used to describe operation history. */
$lang->action->desc = new stdclass();
+5
View File
@@ -48,6 +48,9 @@ $lang->action->byQuery = '搜索';
$lang->action->undeleteAction = '还原数据';
$lang->action->hideOneAction = '隐藏数据';
$lang->action->refusecase = '还原用例之前,请先还原该用例所属场景';
$lang->action->refusescene = '还原场景之前,请先还原该场景的父场景';
$lang->action->trashTips = '提示:为了保证系统的完整性,禅道系统的删除都是标记删除。';
$lang->action->textDiff = '文本格式';
$lang->action->original = '原始格式';
@@ -156,6 +159,8 @@ $lang->action->objectTypes['stage'] = '阶段';
$lang->action->objectTypes['patch'] = '补丁';
$lang->action->objectTypes['repo'] = '代码库';
$lang->action->objectTypes['dataview'] = '中间表';
$lang->action->objectTypes['scene'] = '场景';
/* 用来描述操作历史记录。*/
$lang->action->desc = new stdclass();
+4
View File
@@ -46,6 +46,9 @@ $lang->action->comment = '備註';
$lang->action->undeleteAction = '還原數據';
$lang->action->hideOneAction = '隱藏數據';
$lang->action->refusecase = 'Before restoring the use case, please restore the scene to which the use case belongs';
$lang->action->refusescene = ' Before restoring the use case, please restore the parent scene of this scene ';
$lang->action->trashTips = '提示:為了保證系統的完整性,禪道系統的刪除都是標記刪除。';
$lang->action->textDiff = '文本格式';
$lang->action->original = '原始格式';
@@ -136,6 +139,7 @@ $lang->action->objectTypes['kanbancolumn'] = '看板列';
$lang->action->objectTypes['kanbancard'] = '看板卡片';
$lang->action->objectTypes['repo'] = '代码库';
$lang->action->objectTypes['dataview'] = '数据表';
$lang->action->objectTypes['scene'] = 'Scene';
/* 用來描述操作歷史記錄。*/
$lang->action->desc = new stdclass();
+23
View File
@@ -1930,6 +1930,29 @@ class actionModel extends model
if($release->shadow) $this->dao->update(TABLE_BUILD)->set('deleted')->eq(0)->where('id')->eq($release->shadow)->exec();
}
if($action->objectType == 'case')
{
$case = $this->dao->select('*')->from(TABLE_CASE)->where('id')->eq($action->objectID)->fetch();
if($case->scene)
{
$scene = $this->dao->select('*')->from(VIEW_SCENECASE)->where('id')->eq($case->scene)->fetch();
if($scene->deleted)
{
return print(js::error($this->lang->action->refusecase));
}
}
}
if($action->objectType == 'scene')
{
$scene = $this->dao->select('*')->from("zt_scene")->where('id')->eq($action->objectID)->fetch();
if($scene->parent)
{
$scenerow = $this->dao->select('*')->from(VIEW_SCENECASE)->where('id')->eq($scene->parent)->fetch();
if($scenerow->deleted) return print(js::error($this->lang->action->refusescene));
}
}
/* Update deleted field in object table. */
$table = $this->config->objectTables[$action->objectType];
$this->dao->update($table)->set('deleted')->eq(0)->where('id')->eq($action->objectID)->exec();
+6
View File
@@ -102,6 +102,11 @@
<tr>
<td><?php echo zget($lang->action->objectTypes, $action->objectType, '');?></td>
<td><?php echo $action->objectID;?></td>
<?php if($action->objectType == 'scene'): ?>
<td class='text-left'>
<?php echo $action->objectName;?>
</td>
<?php else: ?>
<td class='text-left'>
<?php
$params = $action->objectType == 'user' ? "account={$action->objectName}" : "id={$action->objectID}";
@@ -146,6 +151,7 @@
}
?>
</td>
<?php endif ?>
<?php if($currentObjectType == 'execution'):?>
<td class="c-name flex" title="<?php echo $projectList[$action->project]->name;?>">
<span class="text-ellipsis"><?php echo $projectList[$action->project]->name;?></span>
+1 -1
View File
@@ -11,7 +11,7 @@
*/
?>
<style>
.block-docstatistic .flex {display: flex; flex-wrap: nowrap; flex-direction: row; justify-content: space-between; flex: auto;}
.block-docstatistic .flex {display: flex; flex-wrap: nowrap; flex-direction: row; justify-content: space-around; flex: auto;}
.block-docstatistic .flex-column {flex-direction: column; padding-left: 10px;}
.block-docstatistic .statistic {flex: 0 1 32%;}
.block-docstatistic .created {flex: 0 1 48%;}
+2 -1
View File
@@ -65,6 +65,7 @@ class chart extends control
$filters = $this->post->filters;
$fieldSettings = $this->post->fieldSettings;
$langs = $this->post->langs;
$sql = $this->post->sql;
$clientLang = $this->app->getClientLang();
$fieldPairs = array();
@@ -91,7 +92,7 @@ class chart extends control
if($type == 'select')
{
$fieldSetting = $fieldSettings[$field];
$options = $this->chart->getSysOptions(zget($fieldSetting, 'type', ''), zget($fieldSetting, 'object', ''), zget($fieldSetting, 'field', ''));
$options = $this->chart->getSysOptions(zget($fieldSetting, 'type', ''), zget($fieldSetting, 'object', ''), zget($fieldSetting, 'field', ''), $sql);
}
$filterHtml = array();
+10 -1
View File
@@ -36,19 +36,28 @@ function resizeChart()
}
}
function waitForRepaint(callback)
{
window.requestAnimationFrame(function()
{
window.requestAnimationFrame(callback);
});
}
/**
* Init picker.
*
* @access public
* @return void
*/
function initPicker($row, pickerName = 'picker-select')
function initPicker($row, pickerName = 'picker-select', onready = false)
{
$row.find('.' + pickerName).picker(
{
maxDropHeight: pickerHeight,
onReady: function()
{
if(!onready) return;
if(!$row.find('.picker')) return;
if(window.getComputedStyle($row.find('.picker').find('.picker-selections')[0]).getPropertyValue('width') !== 'auto')
{
+25 -9
View File
@@ -159,14 +159,15 @@ function calcPreviewGrowFilter(resize = false)
chart.filters.forEach(function(filter, index)
{
var nowItem = '.filter-item-' + index;
var leftPadding = parseInt($filterItems.find(nowItem).css('padding-left'));
var rightPadding = parseInt($filterItems.find(nowItem).css('padding-right'));
var spanWidth = $filterItems.find(nowItem).find('.input-group-addon').first()[0].getBoundingClientRect().width;
var $nowDom = $filterItems.find(nowItem);
var leftPadding = parseInt($nowDom.css('padding-left'));
var rightPadding = parseInt($nowDom.css('padding-right'));
var spanWidth = $nowDom.find('.input-group-addon').first()[0].getBoundingClientRect().width;
var filterWidth = ((filter.type == 'input' || filter.type == 'select') ? WIDTH_INPUT : WIDTH_DATE) + (spanWidth + leftPadding + rightPadding);
/* Clear the flex-basis and set flex-basic again. */
$filterItems.find(nowItem).css('flex-basis', '');
$filterItems.find(nowItem).css('flex-basis', filterWidth);
$nowDom.css('flex-basis', '');
$nowDom.css('flex-basis', filterWidth);
if(nowWidth - filterWidth >= 0)
{
nowWidth -= filterWidth;
@@ -185,12 +186,27 @@ function calcPreviewGrowFilter(resize = false)
$filterItems.children().removeClass('filter-item-grow');
chart.filters.forEach(function(filter, index)
{
var nowItem = '.filter-item-' + index;
if(canGrowTotal >= index + 1) $filterItems.find(nowItem).addClass('filter-item-grow');
var $nowDom = $filterItems.find('.filter-item-' + index);
if(canGrowTotal >= index + 1) $nowDom.addClass('filter-item-grow');
if(filter.type == 'select' && $nowDom.find('.picker').length) $nowDom.find('.picker').find('.picker-selections').css('width', WIDTH_INPUT);
});
var queryType =(!lineWrap && nowWidth >= 60) ? '.query-inside' : '.query-outside';
$filterBox.find(queryType).removeClass('hidden');
/* Set picker-selection width, default 128px. */
waitForRepaint(function()
{
chart.filters.forEach(function(filter, index)
{
var $nowDom = $filterItems.find('.filter-item-' + index);
if(filter.type == 'select' && $nowDom.find('.picker').length)
{
var pickerWidth = $nowDom.hasClass('filter-item-grow') ? $nowDom.find('.picker')[0].getBoundingClientRect().width : WIDTH_INPUT;
$nowDom.find('.picker').find('.picker-selections').css('width', pickerWidth);
}
});
});
});
}
@@ -206,7 +222,7 @@ function renderFilters(chart)
var fieldNames = {};
Object.keys(chart.fieldSettings).forEach(function(key){fieldNames[key] = chart.fieldSettings[key].name;});
$.post(createLink('chart', 'ajaxGetFilterForm', 'chartID=' + chart.id), {fieldList: fieldNames, fieldSettings: chart.fieldSettings, filters: chart.filters, langs: chart.langs}, function(resp)
$.post(createLink('chart', 'ajaxGetFilterForm', 'chartID=' + chart.id), {fieldList: fieldNames, fieldSettings: chart.fieldSettings, filters: chart.filters, langs: chart.langs, sql: chart.sql}, function(resp)
{
resp = JSON.parse(resp);
var $filterItems = $('#filterItems' + chart.currentGroup + '_' + chart.id + ' .filter-items');
@@ -230,7 +246,7 @@ function renderFilterItem(filter, resp, index, step)
search: resp[index].item
};
var html = $($.zui.formatString(tpl, data))
initPicker(html);
initPicker(html, 'picker-select', true);
initDatepicker(html);
return html;
}
+2 -2
View File
@@ -477,8 +477,8 @@ class chartModel extends model
$series[] = array('name' => $seriesName, 'data' => $yData, 'type' => 'bar', 'stack' => $stack);
}
$dataZoomX = '[{"type":"inside","startValue":0,"endValue":5,"minValueSpan":10,"maxValueSpan":10,"xAxisIndex":[0],"zoomOnMouseWheel":false,"moveOnMouseWheel":true,"moveOnMouseMove":true},{"type":"slider","realtime":true,"startValue":0,"endValue":5,"zoomLock":true,"brushSelect":false,"width":"80%","height":"5","xAxisIndex":[0],"fillerColor":"#33aaff","borderColor":"#33aaff00","backgroundColor":"#cfcfcf00","handleSize":0,"showDataShadow":false,"showDetail":false,"bottom":"0","left":"10%"}]';
$dataZoomY = '[{"type":"inside","startValue":0,"endValue":5,"minValueSpan":10,"maxValueSpan":10,"yAxisIndex":[0],"zoomOnMouseWheel":false,"moveOnMouseWheel":true,"moveOnMouseMove":true},{"type":"slider","realtime":true,"startValue":0,"endValue":5,"zoomLock":true,"brushSelect":false,"width":5,"height":"80%","yAxisIndex":[0],"fillerColor":"#33aaff","borderColor":"#33aaff00","backgroundColor":"#cfcfcf00","handleSize":0,"showDataShadow":false,"showDetail":false,"top":"10%","right":0}]';
$dataZoomX = '[{"type":"inside","startValue":0,"endValue":5,"minValueSpan":10,"maxValueSpan":10,"xAxisIndex":[0],"zoomOnMouseWheel":false,"moveOnMouseWheel":true,"moveOnMouseMove":true},{"type":"slider","realtime":true,"startValue":0,"endValue":5,"zoomLock":true,"brushSelect":false,"width":"80%","height":"5","xAxisIndex":[0],"fillerColor":"#ccc","borderColor":"#33aaff00","backgroundColor":"#cfcfcf00","handleSize":0,"showDataShadow":false,"showDetail":false,"bottom":"0","left":"10%"}]';
$dataZoomY = '[{"type":"inside","startValue":0,"endValue":5,"minValueSpan":10,"maxValueSpan":10,"yAxisIndex":[0],"zoomOnMouseWheel":false,"moveOnMouseWheel":true,"moveOnMouseMove":true},{"type":"slider","realtime":true,"startValue":0,"endValue":5,"zoomLock":true,"brushSelect":false,"width":5,"height":"80%","yAxisIndex":[0],"fillerColor":"#ccc","borderColor":"#33aaff00","backgroundColor":"#cfcfcf00","handleSize":0,"showDataShadow":false,"showDetail":false,"top":"10%","right":0}]';
$isY = in_array($settings['type'], array('cluBarY', 'stackedBarY'));
$dataZoom = $isY ? json_decode($dataZoomY, true) : json_decode($dataZoomX, true);
+2 -1
View File
@@ -41,10 +41,11 @@ $lang->company = new stdclass();
$lang->dept = new stdclass();
$lang->group = new stdclass();
$lang->user = new stdclass();
$lang->bi = new stdclass();
$lang->screen = new stdclass();
$lang->report = new stdclass();
$lang->pivot = new stdclass();
$lang->chart = new stdclass();
$lang->report = new stdclass();
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
$lang->gitlab = new stdclass();
+2 -1
View File
@@ -176,10 +176,11 @@ $lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->bi->common = 'BI';
$lang->screen->common = 'Screen';
$lang->report->common = 'BI';
$lang->pivot->common = 'Pivot Table';
$lang->chart->common = 'Chart';
$lang->report->common = 'Report';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
+2 -1
View File
@@ -176,10 +176,11 @@ $lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->bi->common = 'BI';
$lang->screen->common = 'Screen';
$lang->report->common = 'BI';
$lang->pivot->common = 'Pivot Table';
$lang->chart->common = 'Chart';
$lang->report->common = 'Report';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
+2 -1
View File
@@ -176,10 +176,11 @@ $lang->devops->common = 'DevOps';
$lang->doc->common = 'Doc';
$lang->repo->common = 'Code';
$lang->repo->codeRepo = 'Code Repo';
$lang->bi->common = 'BI';
$lang->screen->common = 'Screen';
$lang->report->common = 'BI';
$lang->pivot->common = 'Pivot Table';
$lang->chart->common = 'Chart';
$lang->report->common = 'Report';
$lang->system->common = 'System';
$lang->admin->common = 'Admin';
$lang->story->common = 'Story';
+15 -15
View File
@@ -9,7 +9,7 @@ $lang->navIcons['qa'] = "<i class='icon icon-test'></i>";
$lang->navIcons['devops'] = "<i class='icon icon-devops'></i>";
$lang->navIcons['kanban'] = "<i class='icon icon-kanban'></i>";
$lang->navIcons['doc'] = "<i class='icon icon-doc'></i>";
$lang->navIcons['report'] = "<i class='icon icon-statistic'></i>";
$lang->navIcons['bi'] = "<i class='icon icon-statistic'></i>";
$lang->navIcons['system'] = "<i class='icon icon-group'></i>";
$lang->navIcons['admin'] = "<i class='icon icon-cog-outline'></i>";
@@ -42,7 +42,7 @@ $lang->mainNav->qa = "{$lang->navIcons['qa']} {$lang->qa->common}|qa|inde
$lang->mainNav->devops = "{$lang->navIcons['devops']} DevOps|repo|browse|";
$lang->mainNav->kanban = "{$lang->navIcons['kanban']} {$lang->kanban->common}|kanban|space|";
$lang->mainNav->doc = "{$lang->navIcons['doc']} {$lang->doc->common}|doc|index|";
$lang->mainNav->report = "{$lang->navIcons['report']} {$lang->report->common}|screen|browse|";
$lang->mainNav->bi = "{$lang->navIcons['bi']} {$lang->bi->common}|screen|browse|";
$lang->mainNav->system = "{$lang->navIcons['system']} {$lang->system->common}|my|team|";
$lang->mainNav->admin = "{$lang->navIcons['admin']} {$lang->admin->common}|admin|index|";
@@ -57,7 +57,7 @@ $lang->mainNav->menuOrder[30] = 'qa';
$lang->mainNav->menuOrder[35] = 'devops';
$lang->mainNav->menuOrder[40] = 'kanban';
$lang->mainNav->menuOrder[45] = 'doc';
$lang->mainNav->menuOrder[50] = 'report';
$lang->mainNav->menuOrder[50] = 'bi';
$lang->mainNav->menuOrder[55] = 'system';
$lang->mainNav->menuOrder[60] = 'admin';
@@ -515,16 +515,16 @@ $lang->doc->menuOrder[20] = 'project';
$lang->doc->menuOrder[25] = 'api';
$lang->doc->menuOrder[30] = 'custom';
/* Report menu.*/
$lang->report->menu = new stdclass();
$lang->report->menu->screen = array('link' => "{$lang->screen->common}|screen|browse");
$lang->report->menu->pivot = array('link' => "{$lang->pivot->common}|pivot|preview");
$lang->report->menu->chart = array('link' => "{$lang->chart->common}|chart|preview");
/* BI menu.*/
$lang->bi->menu = new stdclass();
$lang->bi->menu->screen = array('link' => "{$lang->screen->common}|screen|browse");
$lang->bi->menu->pivot = array('link' => "{$lang->pivot->common}|pivot|preview");
$lang->bi->menu->chart = array('link' => "{$lang->chart->common}|chart|preview");
/* Report menu order. */
$lang->report->menuOrder[5] = 'screen';
$lang->report->menuOrder[10] = 'pivot';
$lang->report->menuOrder[15] = 'chart';
/* BI menu order. */
$lang->bi->menuOrder[5] = 'screen';
$lang->bi->menuOrder[10] = 'pivot';
$lang->bi->menuOrder[15] = 'chart';
/* Company menu.*/
$lang->company->menu = new stdclass();
@@ -611,9 +611,9 @@ $lang->navGroup->doc = 'doc';
$lang->navGroup->doclib = 'doc';
$lang->navGroup->api = 'doc';
$lang->navGroup->screen = 'report';
$lang->navGroup->pivot = 'report';
$lang->navGroup->chart = 'report';
$lang->navGroup->screen = 'bi';
$lang->navGroup->pivot = 'bi';
$lang->navGroup->chart = 'bi';
$lang->navGroup->qa = 'qa';
$lang->navGroup->bug = 'qa';
+2 -1
View File
@@ -176,10 +176,11 @@ $lang->devops->common = 'DevOps';
$lang->doc->common = '文档';
$lang->repo->common = '代码';
$lang->repo->codeRepo = '代码库';
$lang->bi->common = 'BI';
$lang->screen->common = '大屏';
$lang->report->common = 'BI';
$lang->pivot->common = '透视表';
$lang->chart->common = '图表';
$lang->report->common = '统计';
$lang->system->common = '组织';
$lang->admin->common = '后台';
$lang->story->common = $lang->SRCommon;
+1 -1
View File
@@ -153,7 +153,7 @@ $lang->devops->common = 'DevOps';
$lang->doc->common = '文檔';
$lang->repo->common = '代碼';
$lang->repo->codeRepo = '代碼庫';
$lang->report->common = 'BI';
$lang->report->common = '统计';
$lang->system->common = '組織';
$lang->admin->common = '後台';
$lang->task->common = '任務';
+5
View File
@@ -0,0 +1,5 @@
<?php
css::import($jsRoot . 'mindmap/css/zui.mindmap.css');
js::import($jsRoot . 'mindmap/js/hotkey.min.js');
js::import($jsRoot . 'mindmap/js/zui.mindmap.js?v=2');
?>
+11 -1
View File
@@ -75,7 +75,17 @@ class datatableModel extends model
$module = zget($this->config->datatable->moduleAlias, "$module-$method", $module);
if(!isset($this->config->$module)) $this->loadModel($module);
if(isset($this->config->datatable->$datatableId->$key)) $setting = json_decode($this->config->datatable->$datatableId->$key);
if(isset($this->config->datatable->$datatableId->$key))
{
if($datatableId == 'testcaseBrowse' && $key == 'tablecols' && $this->cookie->onlyScene)
{
$setting = json_decode('[{"id":"id","order":1,"show":true,"width":"70px","fixed":"left"},{"id":"title","order":2,"show":true,"width":"auto","fixed":"left"},{"id":"openedBy","order":8,"show":true,"width":"80px","fixed":"no"},{"id":"openedDate","order":9,"show":true,"width":"90px","fixed":"no"},{"id":"lastEditedBy","order":16,"show":true,"width":"80px","fixed":"no"},{"id":"lastEditedDate","order":17,"show":true,"width":"90px","fixed":"no"},{"id":"actions","order":23,"show":true,"width":"150px","fixed":"right"}]');
}
else
{
$setting = json_decode($this->config->datatable->$datatableId->$key);
}
}
$fieldList = $this->getFieldList($module);
if(empty($setting))
-1
View File
@@ -395,7 +395,6 @@ class doc extends control
$this->action->create('doc', $docID, $actionType, $fileAction);
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $docID));
$objectID = zget($lib, $lib->type, 0);
$params = "docID=" . $docResult['id'];
$link = isonlybody() ? 'parent' : $this->createLink('doc', 'view', $params);
$response = array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $link);
+1 -1
View File
@@ -106,7 +106,7 @@ ol, ul {margin-bottom: 0}
#subHeader .list-group>a.selected {color: #e9f2fb !important;}
#pageNav #dropMenu .table-col .list-group .icon-move {display:block; float: left; font-size: 12px; padding: 3px 4px 3px 1px;}
#content .detail-content.article-content {overflow-y: auto; height: calc(100vh - 200px);}
#content .detail-content.article-content {overflow-y: auto; height: calc(100vh - 200px); padding-right: 20px;}
#aclBox .acl-tip {color: #838a9d;}
.ajaxCollect > img.star-empty {margin-right: 0px;}
#outlineMenu {background: #fff; position: absolute; height: calc(100vh - 180px)!important; overflow-y: auto; top: 50px; right: 25px;}
-2
View File
@@ -1,10 +1,8 @@
body {overflow: hidden;}
.doc-title {width:400px;}
.doc-title input {border: unset; font-size: 18px; font-weight: bold; color: #3c4353; padding-left: 16px;}
.doc-title .form-control:focus {border: unset; box-shadow: unset;}
.doc-title input::-webkit-input-placeholder {color: #D8DBDE;}
.doc-title.required:after {top: 4px; right: 0; left: 12px; display: inline-table;}
#savePath {display:inline-block; width:320px; overflow:hidden; white-space: nowrap; padding-right:8px; position: relative; top:7px;}
#headerBox {border-bottom: 1px solid #e3e3e3;}
#headerBox td:last-child {padding-right: 24px;}
.contentmarkdown.required:after, .contenthtml.required:after {right:3px;}
-2
View File
@@ -1,10 +1,8 @@
body {overflow: hidden;}
.doc-title {width:400px;}
.doc-title input {border: unset; font-size: 18px; font-weight: bold; color: #3c4353; padding-left: 16px;}
.doc-title .form-control:focus {border: unset; box-shadow: unset;}
.doc-title input::-webkit-input-placeholder {color: #D8DBDE;}
.doc-title.required:after {top: 4px; right: 0; left: 12px; display: inline-table;}
#savePath {display:inline-block; width:320px; overflow:hidden; white-space: nowrap; height: 19px; padding-top: 4px; padding-right:8px;}
.contenthtml.required:after {right:3px;}
#headerBox {border-bottom: 1px solid #e3e3e3;}
#headerBox td:last-child {padding-right: 24px;}
+4 -4
View File
@@ -1,8 +1,8 @@
.h-full-adjust {overflow-y: auto; height: calc(100vh - 120px);}
.h-full-adjust {overflow-y: auto; height: calc(100vh - 125px);}
.main-col .block-files .panel-heading {padding-right: 20px;}
.main-col .block-files .panel-heading .panel-title {height: 35px; line-height: 30px;}
.main-col .doc-title {display: flex; font-size: 16px; margin-bottom: 10px;}
.main-col .doc-title .title {margin-right: 10px; line-height: 32px; font-size: 25px;}
.main-col .doc-title .title {margin-right: 10px; line-height: 32px; font-size: 20px;}
.main-col .doc-title .info {flex: 1 1 0;}
.main-col .doc-title .version a {font-size: 13px; color: #8c8c8c;}
.main-col .doc-title .version .dropdown-menu a:hover {color: #ffffff;}
@@ -31,15 +31,15 @@
.outline-toggle {position: absolute; right: 20px; top: 50px;}
.outline-toggle i.icon-angle-right:before {content: "\e314"; cursor: pointer;}
.outline-toggle i.icon-angle-left:before {content: "\e315"; cursor: pointer;}
.outline-toggle {position: absolute; right: 55px; top: 50px;}
.outline ul li {list-style: none;}
.outline-content {display: none; padding-top: 18px;}
.outline-content a {color: #838A9D;}
.outline-content li.text-ellipsis.active>a {font-weight: 700; color: #0c64eb;}
.outline-content li.text-ellipsis.active>a {font-weight: 700;}
#outline li.has-list.open:before {content: unset;}
#fileTree {margin-bottom: 40px; max-height: calc(100vh - 180px); overflow: auto;}
#closeBtn {position: absolute; right: 10px; top: 10px;}
.title {font-size: 20px !important;}
.article-content.comment {width: 100% !important;}
.flex {display: flex;}
-42
View File
@@ -285,7 +285,6 @@ $(document).ready(function()
$(function()
{
$('.split-row').splitRow();
updateCrumbs();
});
var $pageSetting = $('#pageSetting');
@@ -347,47 +346,6 @@ function locateNewLib(type, objectID, libID)
location.href = createLink('doc', method, params);
}
/**
* Set save path.
*
* @access public
* @return void
*/
function setSavePath()
{
var getSubPath = function($obj)
{
var $td = $obj.parent();
var usePicker = $td.find('.picker').length == 1;
var subPath = $obj.find('option:checked').text();
if(usePicker) subPath = $td.find('.picker .picker-selection-text').text();
return subPath;
}
savePath = defaultSave;
if($('#modalBasicInfo #product').length == 1)
{
savePath += getSubPath($('#modalBasicInfo #product')) + '/';
}
else if($('#modalBasicInfo #project').length == 1 && $('#modalBasicInfo #execution').length == 0)
{
savePath += getSubPath($('#modalBasicInfo #project')) + '/';
}
else if($('#modalBasicInfo #project').length == 1 && $('#modalBasicInfo #execution').length == 1)
{
var executionID = $('#modalBasicInfo #execution').val();
if(executionID == '0' || executionID == '') savePath += getSubPath($('#modalBasicInfo #project')) + '/';
if(executionID != '0' && executionID != '') savePath += getSubPath($('#modalBasicInfo #execution')) + '/';
}
else if($('#modalBasicInfo #execution').length == 1)
{
savePath += getSubPath($('#modalBasicInfo #execution')) + '/';
}
savePath += getSubPath($('#modalBasicInfo #module'));
$('#savePath').html(savePath).attr('title', savePath);
}
/**
* Submit form.
*
-2
View File
@@ -7,7 +7,6 @@ $(function()
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
if(objectType == 'project') loadExecutions($('#project').val());
setSavePath();
/* Change for show create error. */
$('#contentBox #content').attr('id', 'contentHTML');
@@ -16,7 +15,6 @@ $(function()
{
$('#modalBasicInfo #copyTitle').html($('.doc-title #editorTitle').val().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"));
});
$('#modalBasicInfo').on('hide.zui.modal', function(){setSavePath();});
$('#saveDraft').click(function()
{
-3
View File
@@ -6,9 +6,6 @@ $(function()
setTimeout(function(){$('.CodeMirror').height($(document).height() - 112);}, 100);
$('iframe.ke-edit-iframe').contents().find('.article-content').css('padding', '20px 20px 0 20px');
setSavePath();
$('#modalBasicInfo').on('hide.zui.modal', function(){setSavePath();});
$('#saveDraft').click(function()
{
if($('#editorTitle').val() == '')
+3 -8
View File
@@ -151,13 +151,14 @@ $(function()
{
$('.outline').css({'min-width' : '180px', 'border-left' : '2px solid #efefef'});
$(this).removeClass('icon-menu-arrow-left').addClass('icon-menu-arrow-right').css('left', '-9px');
$('.outline').removeClass('hidden');
$('.outline-content').show();
if($('#sidebar>.cell').is(':visible')) $('#sidebar .icon.icon-menu-arrow-right').trigger("click");
}).on('click', '.outline-toggle i.icon-menu-arrow-right', function()
{
$(this).removeClass('icon-menu-arrow-right').addClass('icon-menu-arrow-left');
$('.outline').css({'min-width' : '180px', 'border-left' : 'none'});
$('.outline-content').hide();
$('.outline').addClass('hidden');
}).on('click', '#outline li', function(e)
{
$('#outline li.active').removeClass('active');
@@ -169,6 +170,7 @@ $(function()
$('#outline li.has-list').addClass('open in');
$('#outline li.has-list>i+ul').prev('i').remove();
$('.outline-toggle i.icon-menu-arrow-left').trigger('click');
$(document).on('click', '.detail-content a', function(event)
{
@@ -199,13 +201,6 @@ $(function()
});
})
$('#sidebar .icon.icon-menu-arrow-left').click(function()
{
if($('#sidebar>.cell').is(':hidden') && $('.outline-content').is(':visible'))
{
$('.outline .outline-toggle i.icon-menu-arrow-right').trigger("click");
}
})
$('#history').append('<a id="closeBtn" href="###" class="btn btn-link"><i class="icon icon-close"></i></a>');
$('#hisTrigger').on('click', function()
-1
View File
@@ -121,7 +121,6 @@ $lang->doc->update = 'Update';
$lang->doc->nextStep = 'Next';
$lang->doc->closed = 'Closed';
$lang->doc->saveDraft = 'Save Draft';
$lang->doc->defaultSave = 'Default Save: ';
$lang->doc->position = 'Position';
$lang->doc->person = 'Person';
$lang->doc->team = 'Team';
-1
View File
@@ -121,7 +121,6 @@ $lang->doc->update = 'Update';
$lang->doc->nextStep = 'Next';
$lang->doc->closed = 'Closed';
$lang->doc->saveDraft = 'Save Draft';
$lang->doc->defaultSave = 'Default Save: ';
$lang->doc->position = 'Position';
$lang->doc->person = 'Person';
$lang->doc->team = 'Team';
-1
View File
@@ -121,7 +121,6 @@ $lang->doc->update = 'Update';
$lang->doc->nextStep = 'Next';
$lang->doc->closed = 'Closed';
$lang->doc->saveDraft = 'Save Draft';
$lang->doc->defaultSave = 'Default Save: ';
$lang->doc->position = 'Position';
$lang->doc->person = 'Person';
$lang->doc->team = 'Team';
-1
View File
@@ -121,7 +121,6 @@ $lang->doc->update = '更新';
$lang->doc->nextStep = '下一步';
$lang->doc->closed = '已关闭';
$lang->doc->saveDraft = '存为草稿';
$lang->doc->defaultSave = '默认存入:';
$lang->doc->position = '所在位置';
$lang->doc->person = '个人';
$lang->doc->team = '团队';
+5
View File
@@ -2753,6 +2753,11 @@ class docModel extends model
$object = $this->dao->select('id,name,status')->from($table)->where('id')->eq($objectID)->fetch();
$objectTitle = zget($objects, $objectID, '');
$objectDropdown = $this->select($type, $objectTitle, $objectID);
if($type == 'execution' and isset($libs[$libID]))
{
$objectTitle = zget($libs[$libID], 'name', '');
$objectDropdown = "<div id='sidebarHeader'><div class='title' title='{$objectTitle}'>{$objectTitle}</div></div>";
}
if(empty($object))
{
-2
View File
@@ -29,7 +29,6 @@
<td width='90px'><?php echo html::backButton("<i class='icon icon-back icon-sm'></i> " . $lang->goback, "id='backBtn'", 'btn btn-secondary');?></td>
<td class="doc-title" colspan='3'><?php echo html::input('title', '', "placeholder='{$lang->doc->titlePlaceholder}' id='editorTitle' class='form-control' required");?></td>
<td class="text-right btn-tools">
<span id='savePath' class='text-gray'></span>
<?php echo html::commonButton($lang->doc->saveDraft, "id='saveDraft' data-placement='bottom'", "btn btn-secondary");?>
<?php echo html::a('#modalBasicInfo', $lang->release->common, '', "data-toggle='modal' id='basicInfoLink' class='btn btn-primary'");?>
</td>
@@ -155,7 +154,6 @@
<?php js::set('libNotEmpty', sprintf($lang->error->notempty, $lang->doc->lib));?>
<?php js::set('keywordsNotEmpty', sprintf($lang->error->notempty, $lang->doc->keywords));?>
<?php js::set('from', $from);?>
<?php js::set('defaultSave', $lang->doc->defaultSave);?>
<?php js::set('titleNotEmpty', sprintf($lang->error->notempty, $lang->doc->title));?>
<?php js::set('contentNotEmpty', sprintf($lang->error->notempty, $lang->doc->content));?>
<?php include '../../common/view/footer.lite.html.php';?>
-2
View File
@@ -28,7 +28,6 @@
<td class="doc-title" colspan='3'><?php echo html::input('title', $doc->title, "placeholder='{$lang->doc->titlePlaceholder}'' id='editorTitle' class='form-control' required");?></td>
<td class="text-right btn-tools">
<?php if($doc->status == 'draft'):?>
<span id='savePath' class='text-gray'></span>
<?php echo html::commonButton($lang->doc->saveDraft, "id='saveDraft'", "btn btn-secondary");?>
<?php echo html::commonButton($lang->release->common, "id='saveRelease'", "btn btn-primary");?>
<?php else:?>
@@ -149,6 +148,5 @@ $(function()
<?php js::set('docID', $doc->id);?>
<?php js::set('draft', $doc->draft);?>
<?php js::set('type', 'doc');?>
<?php js::set('defaultSave', $lang->doc->defaultSave);?>
<?php js::set('titleNotEmpty', sprintf($lang->error->notempty, $lang->doc->title));?>
<?php include '../../common/view/footer.html.php';?>
+28
View File
@@ -1090,6 +1090,19 @@ $lang->resource->testcase->batchConfirmStoryChange = 'batchConfirmStoryChange';
$lang->resource->testcase->importToLib = 'importToLib';
$lang->resource->testcase->automation = 'automation';
$lang->resource->testcase->createScene = 'createScene';
$lang->resource->testcase->editScene = 'editScene';
$lang->resource->testcase->deleteScene = 'deleteScene';
$lang->resource->testcase->changeScene = 'changeScene';
$lang->resource->testcase->batchChangeScene = 'batchChangeScene';
$lang->resource->testcase->updateOrder = 'updateOrder';
$lang->resource->testcase->importXmind = 'importXmind';
$lang->resource->testcase->saveXmindImport = 'saveXmindImport';
$lang->resource->testcase->exportXmind = 'exportXmind';
$lang->resource->testcase->getXmindImport = 'getXmindImport';
$lang->resource->testcase->showXMindImport = 'showXMindImport';
$lang->testcase->methodOrder[0] = 'index';
$lang->testcase->methodOrder[5] = 'browse';
$lang->testcase->methodOrder[10] = 'groupCase';
@@ -1122,6 +1135,18 @@ $lang->testcase->methodOrder[140] = 'importToLib';
$lang->testcase->methodOrder[145] = 'automation';
$lang->testcase->methodOrder[150] = 'showScript';
$lang->testcase->methodOrder[155] = 'createScene';
$lang->testcase->methodOrder[160] = 'editScene';
$lang->testcase->methodOrder[165] = 'deleteScene';
$lang->testcase->methodOrder[170] = 'changeScene';
$lang->testcase->methodOrder[175] = 'batchChangeScene';
$lang->testcase->methodOrder[180] = 'updateOrder';
$lang->testcase->methodOrder[185] = 'importXmind';
$lang->testcase->methodOrder[190] = 'getXmindImport';
$lang->testcase->methodOrder[195] = 'showXMindImport';
$lang->testcase->methodOrder[200] = 'exportXmind';
$lang->testcase->methodOrder[205] = 'saveXmindImport';
/* Test task. */
$lang->resource->testtask = new stdclass();
$lang->resource->testtask->create = 'create';
@@ -1809,6 +1834,9 @@ $lang->resource->chart->preview = 'preview';
$lang->chart->methodOrder[2] = 'preview';
/* Report . */
$lang->resource->report = new stdclass();
/* Search. */
$lang->resource->search = new stdclass();
$lang->resource->search->buildForm = 'buildForm';
+10 -5
View File
@@ -416,12 +416,15 @@ class myModel extends model
->orderBy('order_asc')
->fetchPairs();
$scene = $this->loadModel('testcase')->getSceneMenu(0, 0);
$queryName = $type == 'contribute' ? 'contributeTestcase' : 'workTestcase';
$this->app->loadConfig('testcase');
$this->config->testcase->search['module'] = $queryName;
$this->config->testcase->search['queryID'] = $queryID;
$this->config->testcase->search['actionURL'] = $actionURL;
$this->config->testcase->search['params']['product']['values'] = array('' => '') + $products;
$this->config->testcase->search['params']['scene']['values'] = array('' => '') + $scene;
$this->config->testcase->search['params']['lib']['values'] = array('' => '') + $this->loadModel('caselib')->getLibraries();
unset($this->config->testcase->search['fields']['module']);
@@ -1380,24 +1383,26 @@ class myModel extends model
if(empty($actionField)) $actionField = 'date';
$orderBy = $actionField . '_' . $direction;
$condition = "(action = 'reviewed' or action = 'approvalreview')";
$condition = "(`action` = 'reviewed' or `action` = 'approvalreview')";
if($browseType == 'createdbyme')
{
$condition = "(objectType in('story','case','feedback') and action = 'submitreview') OR ";
$condition .= "(objectType = 'review' and action = 'opened') OR ";
$condition .= "(objectType = 'attend' and action = 'commited') OR ";
$condition .= "(action = 'approvalsubmit') OR ";
$condition .= "(`action` = 'approvalsubmit') OR ";
$condition .= "(objectType in('leave','makeup','overtime','lieu') and action = 'created')";
$condition = "($condition)";
}
$actions = $this->dao->select('objectType,objectID,actor,action,MAX(`date`) as `date`,extra')->from(TABLE_ACTION)
$actionIdList = $this->dao->select('MAX(`id`) as `id`')->from(TABLE_ACTION)
->where('actor')->eq($this->app->user->account)
->andWhere('vision')->eq($this->config->vision)
->andWhere($condition)
->groupBy('objectType,objectID')
->orderBy($orderBy)
->page($pager, 'objectType,objectID')
->page($pager)
->fetchPairs();
$actions = $this->dao->select('objectType,objectID,actor,action,`date`,extra')->from(TABLE_ACTION)
->where('id')->in($actionIdList)
->fetchAll();
$objectTypeList = array();
foreach($actions as $action) $objectTypeList[$action->objectType][] = $action->objectID;
+46 -1
View File
@@ -29,6 +29,11 @@ class screenModel extends model
{
parent::__construct();
$this->filter = new stdclass();
$this->filter->screen = '';
$this->filter->year = '';
$this->filter->dept = '';
$this->filter->account = '';
$this->filter->charts = array();
}
/**
@@ -314,7 +319,7 @@ class screenModel extends model
switch($key)
{
case 'year':
$conditions[] = $field . ' = ' . $this->filter->$key;
$conditions[] = $field . " = '" . $this->filter->$key . "'";
break;
case 'dept':
if($this->filter->dept and !$this->filter->account)
@@ -699,6 +704,46 @@ class screenModel extends model
}
}
/**
* Build water polo chart.
*
* @param object $component
* @param object $chart
* @access public
* @return object
*/
public function buildWaterPolo($component, $chart)
{
if(!$chart->settings)
{
$component->request = json_decode('{"requestDataType":0,"requestHttpType":"get","requestUrl":"","requestIntervalUnit":"second","requestContentType":0,"requestParamsBodyType":"none","requestSQLContent":{"sql":"select * from where"},"requestParams":{"Body":{"form-data":{},"x-www-form-urlencoded":{},"json":"","xml":""},"Header":{},"Params":{}}}');
$component->events = json_decode('{"baseEvent":{},"advancedEvents":{}}');
$component->key = "PieCircle";
$component->chartConfig = json_decode('{"key":"WaterPolo","chartKey":"VWaterPolo","conKey":"VCWaterPolo","title":"水球图","category":"Mores","categoryName":"更多","package":"Charts","chartFrame":"common","image":"water_WaterPolo.png"}');
$component->option = json_decode('{"type":"nomal","series":[{"type":"liquidFill","radius":"90%","roseType":false}],"backgroundColor":"rgba(0,0,0,0)"}');
return $this->setComponentDefaults($component);
}
else
{
if($chart->sql)
{
$settings = json_decode($chart->settings);
$sourceData = 0;
if($settings and isset($settings->metric))
{
$sql = $this->setFilterSQL($chart);
$result = $this->dao->query($sql)->fetch();
$group = $settings->group[0]->field;
$sourceData = zget($result, $group, 0);
}
$component->option->dataset = $sourceData;
}
return $this->setComponentDefaults($component);
}
}
/**
* Build radar chart.
*
+5
View File
@@ -189,6 +189,11 @@ class searchModel extends model
$allDepts = $this->loadModel('dept')->getAllChildId($value);
$condition = helper::dbIN($allDepts);
}
elseif($this->post->$fieldName == 'scene')
{
$allScenes = $value === '0' ? array() : ($value === '' ? array(0) : $this->loadModel('testcase')->getAllChildId($value));
if(count($allScenes)) $condition = helper::dbIN($allScenes);
}
else
{
$condition = ' = ' . $this->dbh->quote($value) . ' ';
+2 -1
View File
@@ -579,11 +579,12 @@
<?php
if(isset($story->linkStoryTitles))
{
$iframe = isonlybody() ? '' : 'iframe';
foreach($story->linkStoryTitles as $linkStoryID => $linkStoryTitle)
{
if($app->user->admin or strpos(",{$app->user->view->products},", ",{$storyProducts[$linkStoryID]},") !== false)
{
$storyLink = html::a($this->createLink('story', 'view', "storyID=$linkStoryID&version=0&param=0&storyType=$story->type", '', true), "#$linkStoryID $linkStoryTitle", '', "class='iframe' data-width='80%' title='$linkStoryTitle'") . '<br />';
$storyLink = html::a($this->createLink('story', 'view', "storyID=$linkStoryID&version=0&param=0&storyType=$story->type", '', true), "#$linkStoryID $linkStoryTitle", '', "class='{$iframe}' data-width='80%' title='$linkStoryTitle'") . '<br />';
}
else
{
+12
View File
@@ -235,3 +235,15 @@ $config->testcase->datatable->fieldList['actions']['fixed'] = 'right';
$config->testcase->datatable->fieldList['actions']['width'] = '180';
$config->testcase->datatable->fieldList['actions']['required'] = 'yes';
$config->testcase->datatable->fieldList['actions']['sort'] = 'no';
$config->testcase->search['module'] = 'testcase';
$config->testcase->search['fields']['scene'] = $lang->testcase->iScene;
$config->testcase->search['params']['scene'] = array('operator' => 'belong', 'control' => 'select', 'values' => '');
$config->testcase->createscene = new stdclass();
$config->testcase->createscene->requiredFields = 'title';
$config->testcase->customBatchCreateFields = 'module,scene,stage,story,pri,precondition,keywords,review';
$config->testcase->customBatchEditFields = 'module,scene,story,stage,precondition,status,pri,keywords';
$config->testcase->custom->batchCreateFields = 'module,scene,story,%s';
$config->testcase->custom->batchEditFields = 'branch,module,scene,stage,status,pri,story';
File diff suppressed because it is too large Load Diff
+14
View File
@@ -32,3 +32,17 @@ tbody > tr > td .icon-share {font-size: 9px;}
.btn-toolbar>.btn, .btn-toolbar>.btn-group, .btn-toolbar>.dropdown {margin-right: 5px;}
#mainMenu > .btn-toolbar > .checkbox-primary{float: left;}
.table-nest-icon { cursor: pointer; }
.tr-moving { opacity: 0.3; }
.tr-acceptable { border: 2px solid rgba(255,0,0,0.5); }
.none-select { -webkit-user-select: none; -moz-user-select: none; -moz-user-select: none; user-select: none; }
.table-nest-toggle { vertical-align: middle; }
.table-nest-title .icon-test { pointer-events: none; }
.icon-test:after { border: 0px solid!important; }
+110
View File
@@ -0,0 +1,110 @@
.mindmap-container
{
border: none !important;
}
.mindmap-node
{
display: flex;
align-items: center;
}
.pri-level,.testcase-pri-root a
{
border-width: 2px;
border-style: solid;
border-radius: 50%;
width: 20px;
height: 20px;
text-align:center;
line-height:16px;
display: block;
}
.pri-1
{
color: #d50000;
border-color: #d50000;
}
.pri-2
{
color: #ff9800;
border-color: #ff9800;
}
.pri-3
{
color: #2098ee;
border-color: #2098ee;
}
.pri-4
{
color: #009688;
border-color: #009688;
}
.pri-empty
{
background-color: lightgray;
}
.testcase-pri-root a
{
margin: 8px;
}
.testcase-pri-root
{
display: flex;
position: absolute;
padding-left: 10px;
padding-right: 10px;
z-index: 20;
}
.effect
{
z-index: 15;
box-shadow:0px 1px 4px rgba(0,0,0,0.8),0px 0px 40px rgba(0,0,0,0.1) inset;
background-color: white;
}
.effect a
{
width: 24px;
height: 24px;
line-height: 20px;
}
.effect:before,.effect:after
{
content:"";
border-radius:100px/10px;
box-shadow:0 0px 20px rgba(0,0,0,0.8);
}
.scene-indicator
{
margin-left: 5px;
color: lightgray;
}
.scene-indicator-yes
{
color: darkgreen;
}
.suffix
{
color: darkred;
display: none;
}
#productName
{
height: 32px;
width: 100%;
padding-left: 10px;
}
+89
View File
@@ -40,3 +40,92 @@ $(document).ready(function()
return false;
});
});
function findRealRowIndex(num)
{
var $sel = $('#module' + num);
var $tr = $sel.closest("tr");
return $tr.get(0).rowIndex-1;
}
function findModuleID(moduleID, num)
{
if(moduleID != "ditto")
return moduleID;
var rIndex = findRealRowIndex(num);
var trList = $("#tableBody").find("tbody").find("tr");
for(var i=rIndex-1; i>=0; i--)
{
var currentID = $(trList[i]).find("td:eq(2)").find("select").val();
if(currentID != "ditto")
{
moduleID = currentID;
break;
}
}
return moduleID;
}
function canSceneDitto(num)
{
var rIndex = findRealRowIndex(num);
if(rIndex == 0) return false;
var trList = $("#tableBody").find("tbody").find("tr");
var rowModule = $(trList[rIndex]).find("td:eq(2)").find("select").val();
var preModule = $(trList[rIndex-1]).find("td:eq(2)").find("select").val();
return rowModule == "ditto" || rowModule == preModule;
}
function onModuleChanged(productID, moduleID, num)
{
loadStories(productID, moduleID, num);
loadScenes(productID, moduleID, num);
}
function loadScenes(productID, moduleID, num)
{
moduleID = findModuleID(moduleID, num);
var branchIDName = (config.currentMethod == 'batchcreate' || config.currentMethod == 'showimport') ? '#branch' : '#branches';
var branchID = $(branchIDName + num).val();
var sceneLink = createLink('testcase', 'ajaxGetScenesForBC', 'productID=' + productID + '&branch=' + branchID + '&moduleID=' + moduleID + '&stype=2&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1&number=' + num);
$.get(sceneLink, function(scenes)
{
if(!scenes) scenes = '<select id="scene' + num + '" name="scene[' + num + ']" class="form-control"></select>';
if(config.currentMethod == 'batchcreate')
{
for(var i = num; i <= rowIndex ; i ++)
{
//if(i != num && $('#scene' + i).val() != 'ditto') break;
var nowScenes = scenes.replaceAll('scene' + num, 'scene' + i);
$('#scene' + i).replaceWith(nowScenes);
if(canSceneDitto(i) == false) $('#scene' + i).find("option:last").remove();
$('#scene' + i + "_chosen").remove();
$('#scene' + i).next('.picker').remove();
$('#scene' + i).attr('name', 'scene[' + i + ']');
$('#scene' + i).picker();
if (i != num)
{
var myPicker = $('#scene' + i).data('zui.picker');
myPicker && myPicker.setValue("ditto");
}
}
}
else
{
$('#scene' + num).replaceWith(scenes);
$('#scene' + num + "_chosen").remove();
$('#scene' + num).next('.picker').remove();
$('#scene' + num).attr('name', 'scene[' + num + ']');
$('#scene' + num).picker();
}
});
}
+59
View File
@@ -159,3 +159,62 @@ $(document).on('change', 'select', function()
$(this).trigger("change");
}
});
function loadStories2(productID, moduleID, num)
{
var branchIDName = (config.currentMethod == 'batchcreate' || config.currentMethod == 'showimport') ? '#branch' : '#branches';
var branchID = $(branchIDName + num).val();
var storyLink = createLink('story', 'ajaxGetProductStories', 'productID=' + productID + '&branch=' + branchID + '&moduleID=' + moduleID + '&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1&executionID=0&number=' + num);
$.get(storyLink, function(stories)
{
if(!stories) stories = '<select id="story' + num + '" name="story[' + num + ']" class="form-control"></select>';
if(config.currentMethod == 'batchcreate')
{
for(var i = num; i < 10 ; i ++)
{
if(i != num && $('#module' + i).val() != 'ditto') break;
var nowStories = stories.replaceAll('story' + num, 'story' + i);
$('#story' + i).replaceWith(nowStories);
$('#story' + i + "_chosen").remove();
$('#story' + i).next('.picker').remove();
$('#story' + i).attr('name', 'story[' + i + ']');
$('#story' + i).chosen();
}
}
else
{
$('#story' + num).replaceWith(stories);
$('#story' + num + "_chosen").remove();
$('#story' + num).next('.picker').remove();
$('#story' + num).attr('name', 'story[' + num + ']');
$('#story' + num).chosen();
}
});
branch = 0;
link = createLink('testcase', 'ajaxGetModuleScenes', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&stype=2&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1&number=' + num);
$.get(link, function(scenes){
if(!scenes) scenes = '<select id="scene' + num + '" name="scene[' + num + ']" class="form-control"></select>';
if(config.currentMethod == 'batchcreate')
{
for(var i = num; i < 10 ; i ++)
{
if(i != num && $('#module' + i).val() != 'ditto') break;
var nowScenes = scenes.replaceAll('scene' + num, 'scene' + i);
$('#scene' + i).replaceWith(nowScenes);
$('#scene' + i + "_chosen").remove();
$('#scene' + i).next('.picker').remove();
$('#scene' + i).attr('name', 'scene[' + i + ']');
$('#scene' + i).chosen();
}
}
else
{
$('#scene' + num).replaceWith(scenes);
$('#scene' + num + "_chosen").remove();
$('#scene' + num).next('.picker').remove();
$('#scene' + num).attr('name', 'scene[' + num + ']');
$('#scene' + num).chosen();
}
});
}
+596
View File
@@ -54,3 +54,599 @@ function triggerHidden()
if(runCase == true) window.location.reload();
});
}
//sort js
var DtSort = {};
DtSort.defaultConfig = {
idAttrName: 'data-id',
parentAttrName: 'data-parent',
dataNestedAttrName: 'data-nested',
nestPathAttrName: 'data-nest-path',
dataTypeAttrName: 'data-itype',
moveBuffer: 2,
canAccept: function(source, target,sameLevel, sourceMgr, targetMgr){return target.dataNested == "true";},
canMove: function(source, sourceMgr){return source.dataNested != "true";},
finish: function(source, target, sameLevel , sourceMgr, targetMgr){},
movingClass: 'tr-moving',
acceptableClass: 'tr-acceptable',
indicatorYOffset: 0.5
};
DtSort.Table = function(options)
{
this.options = $.extend({},DtSort.defaultConfig, options);
this.indicator = undefined;
this.sourceRow = undefined;
this.targetRow = undefined;
this.mousePress = false;
if(this.options.container == undefined)
return;
this.$container = $(this.options.container);
this.overRow = undefined;
this.downPosition = undefined;
this.rowList = [];
this.init();
var that = this;
//解决表格展开折叠按钮单击导致checkbox自动选中功能,临时先放在这里
this.$container.find("tr").on("click",'.table-nest-toggle', function(e)
{
e.stopPropagation();
var table = $('#caseForm').data('zui.table');
var $row = $(e.currentTarget).closest("tr");
var dataId = $row.attr("data-id");
table.toggleNestedRows(dataId,undefined,true);
that.measure();
})
}
DtSort.Table.prototype.init = function()
{
var that = this;
$(document).on("mousedown", this.options.container, function(e){
that.mousePress = true;
that.mouseDown(DtSort.tools.mousePos(e));
});
$(document).on("mousemove", this.options.container, function(e){
that.mouseMove(DtSort.tools.mousePos(e));
});
$(document).on("mouseup", function(e){
that.mouseUp(DtSort.tools.mousePos(e));
that.mousePress = false;
});
$(window).resize(function(){
that.measure();
})
that.measure();
}
DtSort.Table.prototype.measure = function()
{
this.rowList = [];
var $rows = this.$container.find("tr");
for(var i=0;i<$rows.length;i++)
{
$row = $($rows[i]);
var rowIndex = i;
var id = $row.attr(this.options.idAttrName);
var parent = $row.attr(this.options.parentAttrName);
var dataNested = $row.attr(this.options.dataNestedAttrName);
var nestPath = $row.attr(this.options.nestPathAttrName);
var dataType = $row.attr(this.options.dataTypeAttrName);
var pos = DtSort.tools.elementPos($rows[i]);
var size = DtSort.tools.elementSize($rows[i]);
if($row.hasClass("table-nest-hide") && i>0)
{
size = {w:this.rowList[0].boundary.w, h:this.rowList[0].boundary.h};
}
if(dataNested == "true" && nestPath == undefined)
nestPath = "," + id + ",";
this.rowList.push({
id: id,
index: i,
parent: parent,
dataNested: dataNested,
nestPath: nestPath,
dateType: dataType,
boundary: {x:pos.x, y:pos.y, w:size.w, h:size.h},
$dom: $row
});
}
}
DtSort.Table.prototype.getNextEle = function(currentIndex)
{
if(currentIndex+1 >= this.rowList.length) return -1;
for(var i=currentIndex+1; i<this.rowList.length;i++)
{
if(this.rowList[i].boundary.y > 0) return i;
}
}
DtSort.Table.prototype.pick = function(pos)
{
if(pos == undefined) return;
if(this.rowList.length == 0) return undefined;
var hitIndex = -1;
var x = this.rowList[0].boundary.x;
var y = this.rowList[0].boundary.y;
for(var i=0; i<this.rowList.length;i++)
{
if(this.rowList[i].$dom.hasClass("table-nest-hide")) continue;
var boundary = this.rowList[i].boundary;
var maxH = boundary.y+boundary.h;
var nextIndex = this.getNextEle(i);
if(nextIndex != -1)
{
maxH = this.rowList[nextIndex].boundary.y;
}
if(boundary.y <= pos.y && pos.y < maxH)
{
hitIndex = i;
break;
}
}
if(hitIndex < 0) return undefined;
var hitRow = this.rowList[hitIndex];
if(this.rowList[hitIndex].dataNested == "true")
{
var hitRows = [hitRow]
for(var i=hitIndex+1; i<this.rowList.length;i++)
{
if(this.rowList[i].nestPath != undefined && this.rowList[i].nestPath.indexOf(hitRow.nestPath) ==0)
hitRows.push(this.rowList[i]);
}
return new DtSort.NestRow(this,hitRows);
}
else
{
return new DtSort.NormalRow(this,hitRow);
}
}
DtSort.Table.prototype.mouseDown = function(pos)
{
this.downPosition = pos;
};
DtSort.Table.prototype.mouseMove = function(pos)
{
if(this.downPosition == undefined) return ;
var result = this.pick(this.sourceRow == undefined ? this.downPosition : pos);
if(this.mousePress == false || DtSort.tools.distance(this.downPosition,pos)<=this.options.moveBuffer)
{
if(this.overRow != undefined) this.overRow.removeCanMoveIndicator();
this.overRow = result;
if(this.overRow != undefined && this.options.canMove(result.getRow(),result)) this.overRow.setCanMoveIndicator();
}
else
{
if(this.overRow != undefined) this.overRow.removeCanMoveIndicator();
this.overRow = undefined;
this.$container.css("cursor","move");
this.$container.addClass("none-select");
if(this.indicator != undefined)
{
var sourceRowPos = this.getRowPos(this.sourceRow.getRow());
var yOffset = this.options.indicatorYOffset * this.sourceRow.getRow().boundary.h;
var x = sourceRowPos.x;
var y = pos.y + yOffset;
this.indicator.$dom.css({position:"absolute", top:y+"px", left:x+"px"});
}
if(this.sourceRow == undefined)
{
this.sourceRow = result;
this.sourceRow.setMovingCss();
//make drag indicator
this.setSourceIndicator(pos);
}
else
{
if(result == undefined)
{
if(this.targetRow != undefined) this.targetRow.removeAcceptCss();
this.targetRow = undefined;
}
else
{
if(this.sourceRow.include(result.getRow()))
{
if(this.targetRow != undefined)
{
this.targetRow.removeAcceptCss();
this.targetRow = undefined;
}
return;
}
var isSameParent = this.sourceRow.getRow().parent == result.getRow().parent;
var acceptable = this.options.canAccept(this.sourceRow.getRow(),result.getRow(),isSameParent,this.sourceRow,result);
if(acceptable == true)
{
if(this.targetRow != undefined) this.targetRow.removeAcceptCss();
this.targetRow = result;
this.targetRow.setAcceptCss();
}
else
{
if(this.targetRow != undefined) this.targetRow.removeAcceptCss();
this.targetRow = undefined;
}
}
}
}
};
DtSort.Table.prototype.mouseUp = function(pos)
{
this.sourceRow && this.sourceRow.removeMovingCss();
this.targetRow && this.targetRow.removeAcceptCss();
this.$container.css("cursor","pointer");
this.$container.removeClass("none-select");
this.removeSourceIndicator();
if(this.mousePress == true && this.sourceRow != undefined && this.targetRow != undefined)
{
var isSameParent = this.sourceRow.getRow().parent == this.targetRow.getRow().parent;
this.options.finish(this.sourceRow.getRow(),this.targetRow.getRow(),isSameParent,this.sourceRow,this.targetRow,function(afterCommand){});
}
this.sourceRow = undefined;
this.targetRow = undefined;
this.downPosition = undefined;
};
DtSort.Table.prototype.getRowPos = function(row)
{
var x = this.rowList[0].boundary.x;
var y = this.rowList[1].boundary.y;
for(var i=0;i<this.rowList.length;i++)
{
if(this.rowList[i].$dom.hasClass("table-nest-hide")) continue;
if(this.rowList[i] == row) break;
y += this.rowList[i].boundary.h;
}
return {x:x, y:y};
}
DtSort.Table.prototype.setSourceIndicator = function(pos)
{
var row = this.sourceRow.getRow();
var $cloneRow = row.$dom.clone();
$cloneRow.css("opacity",1);
var $table = this.$container.closest("table").clone();
$table.empty();
$table.find("thead tr").css("visibility","hidden");
var $busCells = row.$dom.find("td");
var $copyCells = $cloneRow.find("td");
for(var i=0;i<$busCells.length;i++)
{
$($copyCells[i]).width($($busCells[i]).width());
}
$table.append($cloneRow);
$root = $("<div class='main-table' style='position:absolute'></div>");
$root.height(row.boundary.h);
$root.width(row.boundary.w);
$root.append($table);
$root.css("opacity",0.75);
$root.css("z-index",99999);
$cloneRow.css({"background":"#FFFFFF"});
$root.addClass("none-select");
$table.css("cursor","move");
//var yOffset = this.options.indicatorYOffset * row.boundary.h;
//$root.css({position: "absolute", top: rowPos.y + yOffset + "px", left: rowPos.x + "px"});
this.indicator = {$dom:$root};
$("body").append($root);
}
DtSort.Table.prototype.removeSourceIndicator = function()
{
this.indicator && this.indicator.$dom.remove();
this.indicator = undefined;
}
DtSort.RowBase = function(table){ this.table = table;}
DtSort.RowBase.prototype.setCanMoveIndicator = function(){ this.table.$container.css("cursor","move");}
DtSort.RowBase.prototype.removeCanMoveIndicator = function(){ this.table.$container.css("cursor","pointer");}
DtSort.NestRow = function(table, rows)
{
DtSort.RowBase.call(this,table);
this.rows = rows;
};
DtSort.NestRow.prototype = Object.create(DtSort.RowBase.prototype);
DtSort.NestRow.prototype.getIndex = function(){ return this.rows[0].index;}
DtSort.NestRow.prototype.getRow = function(){ return this.rows[0];}
DtSort.NestRow.prototype.include = function(row)
{
for(var one of this.rows)
{
if(one.id == row.id) return true;
}
return false;
}
DtSort.NestRow.prototype.setMovingCss = function()
{
for(var one of this.rows)
{
one.$dom.addClass(this.table.options.movingClass);
}
}
DtSort.NestRow.prototype.removeMovingCss = function()
{
for(var one of this.rows)
{
one.$dom.removeClass(this.table.options.movingClass);
}
}
DtSort.NestRow.prototype.setAcceptCss = function(){ this.rows[0].$dom.addClass(this.table.options.acceptableClass);}
DtSort.NestRow.prototype.removeAcceptCss = function(){ this.rows[0].$dom.removeClass(this.table.options.acceptableClass);}
DtSort.NestRow.prototype.toString = function(){ return langRowIndex + ' ' + this.getIndex() + ' [' + langNestTotal + ': '+ this.rows.length +']'}
DtSort.NormalRow = function(table, row)
{
DtSort.RowBase.call(this,table);
this.row = row;
};
DtSort.NormalRow.prototype = Object.create(DtSort.RowBase.prototype);
DtSort.NormalRow.prototype.getIndex = function()
{
return this.row.index;
}
DtSort.NormalRow.prototype.getRow = function(){ return this.row;}
DtSort.NormalRow.prototype.include = function(row){ return this.row.id == row.id;}
DtSort.NormalRow.prototype.setMovingCss = function(){ this.row.$dom.addClass(this.table.options.movingClass);}
DtSort.NormalRow.prototype.removeMovingCss = function(){ this.row.$dom.removeClass(this.table.options.movingClass);}
DtSort.NormalRow.prototype.setAcceptCss = function(){ this.row.$dom.addClass(this.table.options.acceptableClass);}
DtSort.NormalRow.prototype.removeAcceptCss = function(){ this.row.$dom.removeClass(this.table.options.acceptableClass);}
DtSort.NormalRow.prototype.toString = function(){ return langRowIndex + ' ' + this.getIndex() + ' [' + langNormal + ']';}
DtSort.tools = {
elementSize: function(el)
{
let w = el.clientWidth || el.offsetWidth;
let h = el.clientHeight || el.offsetHeight;
return { w: w, h: h }
},
elementPos: function(el)
{
if (el.parentNode === null || el.style.display == 'none')
{
return false;
}
var parent = null;
var pos = [];
var box;
if (el.getBoundingClientRect)
{
// IE
box = el.getBoundingClientRect();
var scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
var scrollLeft = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
return {
x: box.left + scrollLeft,
y: box.top + scrollTop
};
}
else if (document.getBoxObjectFor)
{
box = document.getBoxObjectFor(el);
var borderLeft = (el.style.borderLeftWidth) ? parseInt(el.style.borderLeftWidth) : 0;
var borderTop = (el.style.borderTopWidth) ? parseInt(el.style.borderTopWidth) : 0;
pos = [box.x - borderLeft, box.y - borderTop];
}
else
{
// safari & opera
pos = [el.offsetLeft, el.offsetTop];
parent = el.offsetParent;
if (parent != el)
{
while (parent)
{
pos[0] += parent.offsetLeft;
pos[1] += parent.offsetTop;
parent = parent.offsetParent;
}
}
if (ua.indexOf('opera') != -1 || (ua.indexOf('safari') != -1 && el.style.position == 'absolute'))
{
pos[0] -= document.body.offsetLeft;
pos[1] -= document.body.offsetTop;
}
}
if (el.parentNode)
{
parent = el.parentNode;
} else {
parent = null;
}
while (parent && parent.tagName != 'BODY' && parent.tagName != 'HTML')
{
// account for any scrolled ancestors
pos[0] -= parent.scrollLeft;
pos[1] -= parent.scrollTop;
if (parent.parentNode)
{
parent = parent.parentNode;
}
else
{
parent = null;
}
}
return {
x: pos[0],
y: pos[1]
};
},
mousePos: function(event)
{
var e = event || window.event;
var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
var x = e.pageX || e.clientX + scrollX;
var y = e.pageY || e.clientY + scrollY;
return { x: x, y: y };
},
distance(p1, p2)
{
var dx = p1.x - p2.x;
var dy = p1.y - p2.y;
return Math.pow((dx * dx + dy * dy), 0.5);
}
};
DtSort.sort = function(options)
{
var dtSort = new DtSort.Table(options);
return dtSort;
};
//tree js
$(function()
{
$('#caseTableList').on('click', '.c-id a,.c-name a,.c-actions a', function(e)
{
e.stopPropagation();
});
$('#caseTableList').on('click', '.row-case', function(e)
{
var $row = $(this);
$row.toggleClass('checked');
updateChildrenCheckboxes($row);
updatePrarentCheckbox($row);
});
function updateChildrenCheckboxes($row)
{
var rowID = $row.data('id');
var isChecked = $row.hasClass('checked');
if ($row.hasClass('has-nest-child'))
{
$('#caseTableList tr[data-nest-parent="'+rowID+'"]').each(function(){
$(this).toggleClass('checked', isChecked);
$(this).find('input:checkbox').prop('checked', isChecked);
updateChildrenCheckboxes($(this));
});
}
}
/* Update parent checkbox */
function updatePrarentCheckbox($row)
{
var rowID = $row.data('id');
var parentID = $row.attr('data-nest-parent');
var $parent = $('#caseTableList>tr[data-id="' + parentID + '"]');
if(parentID && parentID !== '0')
{
var isAllChecked = true;
$('#caseTableList tr[data-nest-parent="'+parentID+'"]').each(function(){
if (!$(this).hasClass('checked'))
{
isAllChecked = false;
}
});
$parent.toggleClass('checked', isAllChecked);
$parent.find('input:checkbox').prop('checked', isAllChecked);
updatePrarentCheckbox($parent);
}
}
//only scene
$('input[name^="onlyScene"]').click(function(){
var onlyScene = $(this).is(':checked') ? 1 : 0;
$.cookie('onlyScene', onlyScene, {expires:config.cookieLife, path:config.webRoot});
window.location.reload();
});
$("input[name^=caseIDList]").change(function(){
var trList = $("#caseTableList").find("tr");
var selectedCaseNum = 0;
for(var i=0; i<trList.length; i++)
{
var $tr = $(trList[i]);
var dataType = $tr.attr("data-itype");
if(dataType != "1") continue;
var $cbx = $tr.find(".checkbox-primary").find("input");
if($cbx.is(':checked') == true) selectedCaseNum ++;
}
var group = $(".table-actions").find(".btn-group:first");
if(selectedCaseNum > 0)
{
group.show();
}
else
{
group.hide();
}
});
});
+73
View File
@@ -175,3 +175,76 @@ $(function()
return false;
});
});
function loadAllNew(productID)
{
loadProductBranchesNew(productID);
}
function loadProductBranchesNew(productID)
{
$('#branch').remove();
var param = page == 'create' ? 'active' : 'all';
var oldBranch = page == 'edit' ? caseBranch : 0;
var param = "productID=" + productID + "&oldBranch=" + oldBranch + "&param=" + param;
if(typeof(tab) != 'undefined' && (tab == 'execution' || tab == 'project')) param += "&projectID=" + objectID;
$.get(createLink('branch', 'ajaxGetBranches', param), function(data)
{
if(data)
{
$('#product').closest('.input-group').append(data);
$('#branch').css('width', config.currentMethod == 'create' ? '120px' : '95px');
}
loadProductModulesNew(productID);
setStories();
})
}
function loadProductModulesNew(productID, branch)
{
if(typeof(branch) == 'undefined') branch = $('#branch').val();
if(!branch) branch = 0;
var currentModuleID = config.currentMethod == 'edit' ? $('#module').val() : 0;
link = createLink('testcase', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=case&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true&extra=&currentModuleID=' + currentModuleID);
$('#moduleIdBox').load(link, function()
{
var $inputGroup = $(this);
$inputGroup.find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>");
$inputGroup.fixInputGroup();
});
setScenes();
setStories();
}
function setScenes()
{
moduleID = $('#module').val();
productID = $('#product').val();
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('testcase', 'ajaxGetModuleScenes', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&stype=2&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1');
$('#sceneIdBox').load(link, function()
{
$(this).find('select').chosen()
});
}
function loadBranchNew()
{
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
loadProductModulesNew($('#product').val(), branch);
setStories();
}
function loadModuleRelatedNew()
{
setScenes();
setStories();
}
+67
View File
@@ -0,0 +1,67 @@
function loadAllNew(productID)
{
loadProductBranchesNew(productID);
}
function loadProductBranchesNew(productID)
{
$('#branch').remove();
console.log(1111, caseBranch)
var param = page == 'create' ? 'active' : 'all';
var oldBranch = page == 'edit' ? caseBranch : 0;
var param = "productID=" + productID + "&oldBranch=" + oldBranch + "&param=" + param;
if(typeof(tab) != 'undefined' && (tab == 'execution' || tab == 'project')) param += "&projectID=" + objectID;
$.get(createLink('branch', 'ajaxGetBranches', param), function(data)
{
if(data)
{
$('#product').closest('.input-group').append(data);
$('#branch').css('width', config.currentMethod == 'create' ? '120px' : '95px');
}
loadProductModulesNew(productID);
})
}
function loadProductModulesNew(productID, branch)
{
if(typeof(branch) == 'undefined') branch = $('#branch').val();
if(!branch) branch = 0;
var currentModuleID = config.currentMethod == 'edit' ? $('#module').val() : 0;
link = createLink('testcase', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=case&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true&extra=&currentModuleID=' + currentModuleID);
$('#moduleIdBox').load(link, function()
{
var $inputGroup = $(this);
$inputGroup.find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>");
$inputGroup.fixInputGroup();
});
setScenes();
}
function setScenes()
{
moduleID = $('#module').val();
productID = $('#product').val();
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('testcase', 'ajaxGetModuleScenes', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&stype=2&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1');
$('#sceneIdBox').load(link, function()
{
$(this).find('select').chosen()
});
}
function loadBranchNew()
{
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
loadProductModulesNew($('#product').val(), branch);
}
function loadModuleRelatedNew()
{
setScenes();
}
+73
View File
@@ -90,3 +90,76 @@ function loadBranch(oldBranch)
setStories();
}
}
function loadAllNew(productID)
{
loadProductBranchesNew(productID);
}
function loadProductBranchesNew(productID)
{
$('#branch').remove();
var param = page == 'create' ? 'active' : 'all';
var oldBranch = page == 'edit' ? caseBranch : 0;
var param = "productID=" + productID + "&oldBranch=" + oldBranch + "&param=" + param;
if(typeof(tab) != 'undefined' && (tab == 'execution' || tab == 'project')) param += "&projectID=" + objectID;
$.get(createLink('branch', 'ajaxGetBranches', param), function(data)
{
if(data)
{
$('#product').closest('.input-group').append(data);
$('#branch').css('width', config.currentMethod == 'create' ? '120px' : '95px');
}
loadProductModulesNew(productID);
setStories();
})
}
function loadProductModulesNew(productID, branch)
{
if(typeof(branch) == 'undefined') branch = $('#branch').val();
if(!branch) branch = 0;
var currentModuleID = config.currentMethod == 'edit' ? $('#module').val() : 0;
link = createLink('testcase', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=case&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true&extra=&currentModuleID=' + currentModuleID);
$('#moduleIdBox').load(link, function()
{
var $inputGroup = $(this);
$inputGroup.find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>");
$inputGroup.fixInputGroup();
});
setScenes();
setStories();
}
function setScenes()
{
moduleID = $('#module').val();
productID = $('#product').val();
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('testcase', 'ajaxGetModuleScenes', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&stype=2&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1');
$('#sceneIdBox').load(link, function()
{
$(this).find('select').chosen()
});
}
function loadBranchNew()
{
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
loadProductModulesNew($('#product').val(), branch);
setStories();
}
function loadModuleRelatedNew()
{
setScenes();
setStories();
}
+66
View File
@@ -0,0 +1,66 @@
function loadAllNew(productID)
{
loadProductBranchesNew(productID);
}
function loadProductBranchesNew(productID)
{
$('#branch').remove();
var param = page == 'create' ? 'active' : 'all';
var oldBranch = page == 'edit' ? caseBranch : 0;
var param = "productID=" + productID + "&oldBranch=" + oldBranch + "&param=" + param;
if(typeof(tab) != 'undefined' && (tab == 'execution' || tab == 'project')) param += "&projectID=" + objectID;
$.get(createLink('branch', 'ajaxGetBranches', param), function(data)
{
if(data)
{
$('#product').closest('.input-group').append(data);
$('#branch').css('width', config.currentMethod == 'create' ? '120px' : '95px');
}
loadProductModulesNew(productID);
})
}
function loadProductModulesNew(productID, branch)
{
if(typeof(branch) == 'undefined') branch = $('#branch').val();
if(!branch) branch = 0;
var currentModuleID = config.currentMethod == 'edit' ? $('#module').val() : 0;
link = createLink('testcase', 'ajaxGetOptionMenu', 'productID=' + productID + '&viewtype=case&branch=' + branch + '&rootModuleID=0&returnType=html&fieldID=&needManage=true&extra=&currentModuleID=' + currentModuleID);
$('#moduleIdBox').load(link, function()
{
var $inputGroup = $(this);
$inputGroup.find('select').chosen()
if(typeof(caseModule) == 'string') $('#moduleIdBox').prepend("<span class='input-group-addon'>" + caseModule + "</span>");
$inputGroup.fixInputGroup();
});
setScenes();
}
function setScenes()
{
moduleID = $('#module').val();
productID = $('#product').val();
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('testcase', 'ajaxGetModuleScenes', 'productID=' + productID + '&branch=' + branch + '&moduleID=' + moduleID + '&stype=1&storyID=0&onlyOption=false&status=noclosed&limit=50&type=full&hasParent=1&number=&currentScene=' + sceneId);
$('#sceneIdBox').load(link, function()
{
$(this).find('select').chosen()
});
}
function loadBranchNew()
{
var branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
loadProductModulesNew($('#product').val(), branch);
}
function loadModuleRelatedNew()
{
setScenes();
}
File diff suppressed because it is too large Load Diff
+79
View File
@@ -266,3 +266,82 @@ $lang->testcase->featureBar['browse']['group'] = 'Group View';
$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story';
$lang->testcase->featureBar['browse']['suite'] = 'Suite';
$lang->testcase->featureBar['browse']['autocase'] = $lang->testcase->showAutoCase;
$lang->testcase->importXmind = "Import XMIND";
$lang->testcase->exportXmind = "Export XMIND";
$lang->testcase->getXmindImport = "Get Mindmap";
$lang->testcase->showXMindImport = "Display Mindmap";
$lang->testcase->saveXmindImport = "Save Mindmap";
$lang->testcase->xmindImport = "Imort XMIND";
$lang->testcase->xmindExport = "Export XMIND";
$lang->testcase->xmindImportEdit = "XMIND Edit";
$lang->testcase->errorFileNotEmpty = 'The uploaded file cannot be empty';
$lang->testcase->errorXmindUpload = 'Upload failed';
$lang->testcase->errorFileFormat = 'File format error';
$lang->testcase->moduleSelector = 'Module Selection';
$lang->testcase->errorImportBadProduct = 'Product does not exist, import error';
$lang->testcase->errorSceneNotExist = 'Scene [%d] not exists';
$lang->testcase->save = 'Save';
$lang->testcase->close = 'Close';
$lang->testcase->xmindImportSetting = 'Import Characteristic Character Settings';
$lang->testcase->xmindExportSetting = 'Export Characteristic Character Settings';
$lang->testcase->settingModule = 'Module';
$lang->testcase->settingScene = 'Scene';
$lang->testcase->settingCase = 'Testcase';
$lang->testcase->settingPri = 'Priority';
$lang->testcase->settingGroup = 'Step Group';
$lang->testcase->caseNotExist = 'The test case in the imported file was not recognized and the import failed';
$lang->testcase->saveFail = 'Save failed';
$lang->testcase->set2Scene = 'Set as Scene';
$lang->testcase->set2Testcase = 'Set as Testcase';
$lang->testcase->clearSetting = 'Clear Settings';
$lang->testcase->setModule = 'Set scene module';
$lang->testcase->pickModule = 'Please select a module';
$lang->testcase->clearBefore = 'Clear previous scenes';
$lang->testcase->clearAfter = 'Clear the following scenes';
$lang->testcase->clearCurrent = 'Clear the current scene';
$lang->testcase->removeGroup = 'Remove Group';
$lang->testcase->set2Group = 'Set as Group';
$lang->testcase->exportTemplet = 'Export Template';
$lang->testcase->createScene = "Add Scene";
$lang->testcase->changeScene = "Drag to change the scene which it belongs";
$lang->testcase->batchChangeScene = "Batch change scene";
$lang->testcase->updateOrder = "Drag Sort";
$lang->testcase->differentProduct = "Different product";
$lang->testcase->newScene = "Add Scene";
$lang->testcase->sceneTitle = 'Scene Title';
$lang->testcase->parentScene = "Parent Scene";
$lang->testcase->scene = "Scene";
$lang->testcase->summary = 'Total %d Top Scene,%d Independent test case.';
$lang->testcase->summaryScene = 'Total %d Top Scene.';
$lang->testcase->deleteScene = 'Delete Scene';
$lang->testcase->editScene = 'Edit Scene';
$lang->testcase->hasChildren = 'This scene has sub scene or test cases. Do you want to delete them all?';
$lang->testcase->confirmDeleteScene = 'Are you sure you want to delete the scene: \"%s\"?';
$lang->testcase->sceneb = "Scene";
$lang->testcase->onlyScene = 'Only Scene';
$lang->testcase->iScene = 'Scene';
$lang->testcase->generalTitle = 'Title';
$lang->testcase->noScene = 'No Scene';
$lang->testcase->rowIndex = 'Row Index';
$lang->testcase->nestTotal = 'nest total';
$lang->testcase->normal = 'normal';
/* Translation for drag modal message box. */
$lang->testcase->dragModalTitle = 'Drag and drop operation selection';
$lang->testcase->dragModalMessage = '<p>There are two possible situations for the current operation: </p><p>1) Adjust the sequence.<br/> 2) Change its scenario, meanwhile its module will be changed accordingly.</p><p>Please select the operation you want to perform.</p>';
$lang->testcase->dragModalChangeScene = 'Change its scene';
$lang->testcase->dragModalChangeOrder = 'Reorder';
$lang->testcase->confirmBatchDeleteSceneCase = 'Are you sure you want to delete these scene or test cases in batch?';
$lang->scene = new stdclass();
$lang->scene->title = 'Scene Title';
+79
View File
@@ -266,3 +266,82 @@ $lang->testcase->featureBar['browse']['group'] = 'Group View';
$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story';
$lang->testcase->featureBar['browse']['suite'] = 'Suite';
$lang->testcase->featureBar['browse']['autocase'] = $lang->testcase->showAutoCase;
$lang->testcase->importXmind = "Import XMIND";
$lang->testcase->exportXmind = "Export XMIND";
$lang->testcase->getXmindImport = "Get Mindmap";
$lang->testcase->showXMindImport = "Display Mindmap";
$lang->testcase->saveXmindImport = "Save Mindmap";
$lang->testcase->xmindImport = "Imort XMIND";
$lang->testcase->xmindExport = "Export XMIND";
$lang->testcase->xmindImportEdit = "XMIND Edit";
$lang->testcase->errorFileNotEmpty = 'The uploaded file cannot be empty';
$lang->testcase->errorXmindUpload = 'Upload failed';
$lang->testcase->errorFileFormat = 'File format error';
$lang->testcase->moduleSelector = 'Module Selection';
$lang->testcase->errorImportBadProduct = 'Product does not exist, import error';
$lang->testcase->errorSceneNotExist = 'Scene [%d] not exists';
$lang->testcase->save = 'Save';
$lang->testcase->close = 'Close';
$lang->testcase->xmindImportSetting = 'Import Characteristic Character Settings';
$lang->testcase->xmindExportSetting = 'Export Characteristic Character Settings';
$lang->testcase->settingModule = 'Module';
$lang->testcase->settingScene = 'Scene';
$lang->testcase->settingCase = 'Testcase';
$lang->testcase->settingPri = 'Priority';
$lang->testcase->settingGroup = 'Step Group';
$lang->testcase->caseNotExist = 'The test case in the imported file was not recognized and the import failed';
$lang->testcase->saveFail = 'Save failed';
$lang->testcase->set2Scene = 'Set as Scene';
$lang->testcase->set2Testcase = 'Set as Testcase';
$lang->testcase->clearSetting = 'Clear Settings';
$lang->testcase->setModule = 'Set scene module';
$lang->testcase->pickModule = 'Please select a module';
$lang->testcase->clearBefore = 'Clear previous scenes';
$lang->testcase->clearAfter = 'Clear the following scenes';
$lang->testcase->clearCurrent = 'Clear the current scene';
$lang->testcase->removeGroup = 'Remove Group';
$lang->testcase->set2Group = 'Set as Group';
$lang->testcase->exportTemplet = 'Export Template';
$lang->testcase->createScene = "Add Scene";
$lang->testcase->changeScene = "Drag to change the scene which it belongs";
$lang->testcase->batchChangeScene = "Batch change scene";
$lang->testcase->updateOrder = "Drag Sort";
$lang->testcase->differentProduct = "Different product";
$lang->testcase->newScene = "Add Scene";
$lang->testcase->sceneTitle = 'Scene Title';
$lang->testcase->parentScene = "Parent Scene";
$lang->testcase->scene = "Scene";
$lang->testcase->summary = 'Total %d Top Scene,%d Independent test case.';
$lang->testcase->summaryScene = 'Total %d Top Scene.';
$lang->testcase->deleteScene = 'Delete Scene';
$lang->testcase->editScene = 'Edit Scene';
$lang->testcase->hasChildren = 'This scene has sub scene or test cases. Do you want to delete them all?';
$lang->testcase->confirmDeleteScene = 'Are you sure you want to delete the scene: \"%s\"?';
$lang->testcase->sceneb = "Scene";
$lang->testcase->onlyScene = 'Only Scene';
$lang->testcase->iScene = 'Scene';
$lang->testcase->generalTitle = 'Title';
$lang->testcase->noScene = 'No Scene';
$lang->testcase->rowIndex = 'Row Index';
$lang->testcase->nestTotal = 'nest total';
$lang->testcase->normal = 'normal';
/* Translation for drag modal message box. */
$lang->testcase->dragModalTitle = 'Drag and drop operation selection';
$lang->testcase->dragModalMessage = '<p>There are two possible situations for the current operation: </p><p>1) Adjust the sequence.<br/> 2) Change its scenario, meanwhile its module will be changed accordingly.</p><p>Please select the operation you want to perform.</p>';
$lang->testcase->dragModalChangeScene = 'Change its scene';
$lang->testcase->dragModalChangeOrder = 'Reorder';
$lang->testcase->confirmBatchDeleteSceneCase = 'Are you sure you want to delete these scene or test cases in batch?';
$lang->scene = new stdclass();
$lang->scene->title = 'Scene Title';
+79
View File
@@ -266,3 +266,82 @@ $lang->testcase->featureBar['browse']['group'] = 'Group View';
$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story';
$lang->testcase->featureBar['browse']['suite'] = 'Suite';
$lang->testcase->featureBar['browse']['autocase'] = $lang->testcase->showAutoCase;
$lang->testcase->importXmind = "Import XMIND";
$lang->testcase->exportXmind = "Export XMIND";
$lang->testcase->getXmindImport = "Get Mindmap";
$lang->testcase->showXMindImport = "Display Mindmap";
$lang->testcase->saveXmindImport = "Save Mindmap";
$lang->testcase->xmindImport = "Imort XMIND";
$lang->testcase->xmindExport = "Export XMIND";
$lang->testcase->xmindImportEdit = "XMIND Edit";
$lang->testcase->errorFileNotEmpty = 'The uploaded file cannot be empty';
$lang->testcase->errorXmindUpload = 'Upload failed';
$lang->testcase->errorFileFormat = 'File format error';
$lang->testcase->moduleSelector = 'Module Selection';
$lang->testcase->errorImportBadProduct = 'Product does not exist, import error';
$lang->testcase->errorSceneNotExist = 'Scene [%d] not exists';
$lang->testcase->save = 'Save';
$lang->testcase->close = 'Close';
$lang->testcase->xmindImportSetting = 'Import Characteristic Character Settings';
$lang->testcase->xmindExportSetting = 'Export Characteristic Character Settings';
$lang->testcase->settingModule = 'Module';
$lang->testcase->settingScene = 'Scene';
$lang->testcase->settingCase = 'Testcase';
$lang->testcase->settingPri = 'Priority';
$lang->testcase->settingGroup = 'Step Group';
$lang->testcase->caseNotExist = 'The test case in the imported file was not recognized and the import failed';
$lang->testcase->saveFail = 'Save failed';
$lang->testcase->set2Scene = 'Set as Scene';
$lang->testcase->set2Testcase = 'Set as Testcase';
$lang->testcase->clearSetting = 'Clear Settings';
$lang->testcase->setModule = 'Set scene module';
$lang->testcase->pickModule = 'Please select a module';
$lang->testcase->clearBefore = 'Clear previous scenes';
$lang->testcase->clearAfter = 'Clear the following scenes';
$lang->testcase->clearCurrent = 'Clear the current scene';
$lang->testcase->removeGroup = 'Remove Group';
$lang->testcase->set2Group = 'Set as Group';
$lang->testcase->exportTemplet = 'Export Template';
$lang->testcase->createScene = "Add Scene";
$lang->testcase->changeScene = "Drag to change the scene which it belongs";
$lang->testcase->batchChangeScene = "Batch change scene";
$lang->testcase->updateOrder = "Drag Sort";
$lang->testcase->differentProduct = "Different product";
$lang->testcase->newScene = "Add Scene";
$lang->testcase->sceneTitle = 'Scene Title';
$lang->testcase->parentScene = "Parent Scene";
$lang->testcase->scene = "Scene";
$lang->testcase->summary = 'Total %d Top Scene,%d Independent test case.';
$lang->testcase->summaryScene = 'Total %d Top Scene.';
$lang->testcase->deleteScene = 'Delete Scene';
$lang->testcase->editScene = 'Edit Scene';
$lang->testcase->hasChildren = 'This scene has sub scene or test cases. Do you want to delete them all?';
$lang->testcase->confirmDeleteScene = 'Are you sure you want to delete the scene: \"%s\"?';
$lang->testcase->sceneb = "Scene";
$lang->testcase->onlyScene = 'Only Scene';
$lang->testcase->iScene = 'Scene';
$lang->testcase->generalTitle = 'Title';
$lang->testcase->noScene = 'No Scene';
$lang->testcase->rowIndex = 'Row Index';
$lang->testcase->nestTotal = 'nest total';
$lang->testcase->normal = 'normal';
/* Translation for drag modal message box. */
$lang->testcase->dragModalTitle = 'Drag and drop operation selection';
$lang->testcase->dragModalMessage = '<p>There are two possible situations for the current operation: </p><p>1) Adjust the sequence.<br/> 2) Change its scenario, meanwhile its module will be changed accordingly.</p><p>Please select the operation you want to perform.</p>';
$lang->testcase->dragModalChangeScene = 'Change its scene';
$lang->testcase->dragModalChangeOrder = 'Reorder';
$lang->testcase->confirmBatchDeleteSceneCase = 'Are you sure you want to delete these scene or test cases in batch?';
$lang->scene = new stdclass();
$lang->scene->title = 'Scene Title';
+119 -10
View File
@@ -11,7 +11,15 @@
*/
$lang->testcase->id = 'ID';
$lang->testcase->product = $lang->productCommon;
$lang->testcase->project = $lang->projectCommon;
$lang->testcase->execution = $lang->executionCommon;
$lang->testcase->linkStory = 'linkStory';
$lang->testcase->module = 'Module';
$lang->testcase->auto = 'Test Automation Cases';
$lang->testcase->frame = 'Test Automation Cramework';
$lang->testcase->howRun = 'Testing Method';
$lang->testcase->frequency = 'Frequency';
$lang->testcase->path = 'Path';
$lang->testcase->lib = "Thư viện tình huống";
$lang->testcase->branch = "Branch/Platform";
$lang->testcase->moduleAB = 'Module';
@@ -24,9 +32,11 @@ $lang->testcase->precondition = 'Điều kiện bắt buộc';
$lang->testcase->pri = 'Ưu tiên';
$lang->testcase->type = 'Loại';
$lang->testcase->status = 'Tình trạng';
$lang->testcase->statusAB = 'Status';
$lang->testcase->subStatus = 'Tình trạng con';
$lang->testcase->steps = 'Các bước';
$lang->testcase->openedBy = 'Người tạo';
$lang->testcase->openedByAB = 'Reporter';
$lang->testcase->openedDate = 'Ngày tạo';
$lang->testcase->lastEditedBy = 'Người sửa';
$lang->testcase->result = 'Kết quả';
@@ -36,7 +46,14 @@ $lang->testcase->files = 'Files';
$lang->testcase->linkCase = 'Tình huống liên kết';
$lang->testcase->linkCases = 'Liên kết tình huống';
$lang->testcase->unlinkCase = 'Hủy liên kết tình huống';
$lang->testcase->linkBug = 'Linked Bugs';
$lang->testcase->linkBugs = 'Link Bug';
$lang->testcase->unlinkBug = 'Unlink Bugs';
$lang->testcase->stage = 'Giai đoạn';
$lang->testcase->scriptedBy = 'ScriptedBy';
$lang->testcase->scriptedDate = 'ScriptedDate';
$lang->testcase->scriptStatus = 'Script Status';
$lang->testcase->scriptLocation = 'Script Location';
$lang->testcase->reviewedBy = 'Người duyệt';
$lang->testcase->reviewedDate = 'Ngày duyệt';
$lang->testcase->reviewResult = 'Duyệt kết quả';
@@ -54,6 +71,7 @@ $lang->testcase->assignedTo = 'Giao cho';
$lang->testcase->colorTag = 'Màu';
$lang->testcase->lastRunResult = 'Kết quả';
$lang->testcase->desc = 'Các bước';
$lang->testcase->parent = 'Parent';
$lang->testcase->xml = 'XML';
$lang->testcase->expect = 'Kỳ vọng';
$lang->testcase->allProduct = "Tất cả {$lang->productCommon}";
@@ -73,11 +91,17 @@ $lang->testcase->sync = 'Đồng bộ tình huống';
$lang->testcase->ignore = 'Bỏ qua';
$lang->testcase->fromTesttask = 'Từ Yêu cầu Test';
$lang->testcase->fromCaselib = 'Từ thư viện tình huống';
$lang->testcase->fromCaseID = 'From Case ID';
$lang->testcase->fromCaseVersion = 'From Case Version';
$lang->testcase->mailto = 'Mailto';
$lang->testcase->deleted = 'Đã xóa';
$lang->testcase->browseUnits = 'Unit Test';
$lang->testcase->suite = 'Test Suite';
$lang->testcase->executionStatus = 'executionStatus';
$lang->testcase->caseType = 'Case Type';
$lang->testcase->allType = 'All Types';
$lang->testcase->showAutoCase = 'Automated Test Cases';
$lang->testcase->showAutoCase = 'Automated';
$lang->testcase->automation = 'Automation Test';
$lang->case = $lang->testcase; // For dao checking using. Because 'case' is a php keywords, so the module name is testcase, table name is still case.
@@ -86,7 +110,6 @@ $lang->testcase->stepDesc = 'Bước';
$lang->testcase->stepExpect = 'Kỳ vọng';
$lang->testcase->stepVersion = 'Phiên bản';
$lang->testcase->common = 'Tình huống';
$lang->testcase->index = "Trang tình huống";
$lang->testcase->create = "Thêm tình huống";
$lang->testcase->batchCreate = "Thêm hàng loạt";
@@ -108,6 +131,7 @@ $lang->testcase->batchConfirmStoryChange = "Xác nhận hàng loạt";
$lang->testcase->batchCaseTypeChange = "Thay đổi Loại hàng loạt";
$lang->testcase->browse = "Danh sách tình huống";
$lang->testcase->groupCase = "Xem theo Nhóm";
$lang->testcase->zeroCase = "Stories without cases";
$lang->testcase->import = "Nhập";
$lang->testcase->importAction = "Nhập tình huống";
$lang->testcase->fileImport = "Nhập CSV";
@@ -126,7 +150,9 @@ $lang->testcase->groupName = 'Tên nhóm';
$lang->testcase->step = 'Các bước';
$lang->testcase->stepChild = 'Các bước con';
$lang->testcase->viewAll = 'Tất cả tình huống';
$lang->testcase->importToLib = "Import To Library";
$lang->testcase->showScript = 'Show Script';
$lang->testcase->autoScript = 'Script';
$lang->testcase->new = 'Mới';
@@ -156,11 +182,12 @@ $lang->testcase->legendLinkBugs = 'Bugs';
$lang->testcase->legendOpenAndEdit = 'Tạo/Sửa';
$lang->testcase->legendComment = 'Nhận xét';
$lang->testcase->summary = "Tổng <strong>%s</strong> tình huống, và <strong>%s</strong> tình huống đang chạy.";
$lang->testcase->confirmDelete = 'Bạn có muốn xóa tình huống này?';
$lang->testcase->confirmBatchDelete = 'Bạn có muốn xóa tình huống hàng loạt?';
$lang->testcase->ditto = 'Như trên';
$lang->testcase->dittoNotice = 'Tình huống này không liên kết tới sản phẩm bởi vì nó là cuối cùng!';
$lang->testcase->summary = "Tổng <strong>%s</strong> tình huống, và <strong>%s</strong> tình huống đang chạy.";
$lang->testcase->confirmDelete = 'Bạn có muốn xóa tình huống này?';
$lang->testcase->confirmBatchDelete = 'Bạn có muốn xóa tình huống hàng loạt?';
$lang->testcase->ditto = 'Như trên';
$lang->testcase->dittoNotice = 'Tình huống này không liên kết tới sản phẩm bởi vì nó là cuối cùng!';
$lang->testcase->confirmUnlinkTesttask = 'The case [%s] is already associated in the testtask order of the previous branch/platform, after adjusting the branch/platform, it will be removed from the test list of the previous branch/platform, please confirm whether to continue to modify.';
$lang->testcase->reviewList[0] = 'KHÔNG';
$lang->testcase->reviewList[1] = 'CÓ';
@@ -207,16 +234,21 @@ $lang->testcase->resultList['blocked'] = 'Bị khóa';
$lang->testcase->buttonToList = 'Trở lại';
$lang->testcase->whichLine = 'Line No.%s : ';
$lang->testcase->stepsEmpty = 'Step %s cannot be empty.';
$lang->testcase->errorEncode = 'Không có dữ liệu. Vui lòng chọn giải mã đúng và tải lên lại!';
$lang->testcase->noFunction = 'Iconv và mb_convert_encoding không được tìm thấy. Bạn không thể chuyển dữ liệu này thành mã hóa bạn muốn!';
$lang->testcase->noRequire = "Dòng %s có “%s ” là trường bắt buộc và nó nên để trống.";
$lang->testcase->noRequireTip = "“%s”is a required field and it should not be blank.";
$lang->testcase->noLibrary = "Không có thư viện tồn tại. Vui lòng tạo một trước.";
$lang->testcase->mustChooseResult = 'Kết quả xét duyệt là bắt buộc.';
$lang->testcase->noModule = '<div>Chưa có Module.</div><div>Quản lý ngay.</div>';
$lang->testcase->noCase = 'Không có tình huống nào';
$lang->testcase->importedCases = 'The case with ID%s has been imported in the same module and has been ignored.';
$lang->testcase->searchStories = 'Nhập nội dung cần tìm cho câu chuyện';
$lang->testcase->selectLib = 'Chọn thư viện';
$lang->testcase->selectLibAB = 'Select Library';
$lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, nhập bởi <strong>$actor</strong> từ <strong>$extra</strong>.');
@@ -231,8 +263,85 @@ $lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases
$lang->testcase->featureBar['browse']['wait'] = 'Đang đợi';
$lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm;
$lang->testcase->featureBar['browse']['group'] = 'Group View';
$lang->testcase->featureBar['browse']['suite'] = 'Suite';
$lang->testcase->featureBar['browse']['zerocase'] = 'Zero Case Story';
$lang->testcase->featureBar['browse']['browseunits'] = 'Unit Test';
$lang->testcase->featureBar['browse']['suite'] = 'Suite';
$lang->testcase->featureBar['browse']['autocase'] = $lang->testcase->showAutoCase;
$lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse'];
$lang->testcase->importXmind = "Import XMIND";
$lang->testcase->exportXmind = "Export XMIND";
$lang->testcase->getXmindImport = "Get Mindmap";
$lang->testcase->showXMindImport = "Display Mindmap";
$lang->testcase->saveXmindImport = "Save Mindmap";
$lang->testcase->xmindImport = "Imort XMIND";
$lang->testcase->xmindExport = "Export XMIND";
$lang->testcase->xmindImportEdit = "XMIND Edit";
$lang->testcase->errorFileNotEmpty = 'The uploaded file cannot be empty';
$lang->testcase->errorXmindUpload = 'Upload failed';
$lang->testcase->errorFileFormat = 'File format error';
$lang->testcase->moduleSelector = 'Module Selection';
$lang->testcase->errorImportBadProduct = 'Product does not exist, import error';
$lang->testcase->errorSceneNotExist = 'Scene [%d] not exists';
$lang->testcase->save = 'Save';
$lang->testcase->close = 'Close';
$lang->testcase->xmindImportSetting = 'Import Characteristic Character Settings';
$lang->testcase->xmindExportSetting = 'Export Characteristic Character Settings';
$lang->testcase->settingModule = 'Module';
$lang->testcase->settingScene = 'Scene';
$lang->testcase->settingCase = 'Testcase';
$lang->testcase->settingPri = 'Priority';
$lang->testcase->settingGroup = 'Step Group';
$lang->testcase->caseNotExist = 'The test case in the imported file was not recognized and the import failed';
$lang->testcase->saveFail = 'Save failed';
$lang->testcase->set2Scene = 'Set as Scene';
$lang->testcase->set2Testcase = 'Set as Testcase';
$lang->testcase->clearSetting = 'Clear Settings';
$lang->testcase->setModule = 'Set scene module';
$lang->testcase->pickModule = 'Please select a module';
$lang->testcase->clearBefore = 'Clear previous scenes';
$lang->testcase->clearAfter = 'Clear the following scenes';
$lang->testcase->clearCurrent = 'Clear the current scene';
$lang->testcase->removeGroup = 'Remove Group';
$lang->testcase->set2Group = 'Set as Group';
$lang->testcase->exportTemplet = 'Export Template';
$lang->testcase->createScene = "Add Scene";
$lang->testcase->changeScene = "Drag to change the scene which it belongs";
$lang->testcase->batchChangeScene = "Batch change scene";
$lang->testcase->updateOrder = "Drag Sort";
$lang->testcase->differentProduct = "Different product";
$lang->testcase->newScene = "Add Scene";
$lang->testcase->sceneTitle = 'Scene Title';
$lang->testcase->parentScene = "Parent Scene";
$lang->testcase->scene = "Scene";
$lang->testcase->summary = 'Total %d Top Scene,%d Independent test case.';
$lang->testcase->summaryScene = 'Total %d Top Scene.';
$lang->testcase->deleteScene = 'Delete Scene';
$lang->testcase->editScene = 'Edit Scene';
$lang->testcase->hasChildren = 'This scene has sub scene or test cases. Do you want to delete them all?';
$lang->testcase->confirmDeleteScene = 'Are you sure you want to delete the scene: \"%s\"?';
$lang->testcase->sceneb = "Scene";
$lang->testcase->onlyScene = 'Only Scene';
$lang->testcase->iScene = 'Scene';
$lang->testcase->generalTitle = 'Title';
$lang->testcase->noScene = 'No Scene';
$lang->testcase->rowIndex = 'Row Index';
$lang->testcase->nestTotal = 'nest total';
$lang->testcase->normal = 'normal';
/* Translation for drag modal message box. */
$lang->testcase->dragModalTitle = 'Drag and drop operation selection';
$lang->testcase->dragModalMessage = '<p>There are two possible situations for the current operation: </p><p>1) Adjust the sequence.<br/> 2) Change its scenario, meanwhile its module will be changed accordingly.</p><p>Please select the operation you want to perform.</p>';
$lang->testcase->dragModalChangeScene = 'Change its scene';
$lang->testcase->dragModalChangeOrder = 'Reorder';
$lang->testcase->confirmBatchDeleteSceneCase = 'Are you sure you want to delete these scene or test cases in batch?';
$lang->scene = new stdclass();
$lang->scene->title = 'Scene Title';
+79
View File
@@ -266,3 +266,82 @@ $lang->testcase->featureBar['browse']['group'] = '分组查看';
$lang->testcase->featureBar['browse']['zerocase'] = "零用例{$lang->SRCommon}";
$lang->testcase->featureBar['browse']['suite'] = '套件';
$lang->testcase->featureBar['browse']['autocase'] = $lang->testcase->showAutoCase;
$lang->testcase->importXmind = "导入XMIND";
$lang->testcase->exportXmind = "导出XMIND";
$lang->testcase->getXmindImport = "获取导图";
$lang->testcase->showXMindImport = "显示导图";
$lang->testcase->saveXmindImport = "保存导图";
$lang->testcase->xmindImport = "导入XMIND";
$lang->testcase->xmindExport = "导出XMIND";
$lang->testcase->xmindImportEdit = "XMIND 编辑";
$lang->testcase->errorFileNotEmpty = '上传文件不能为空';
$lang->testcase->errorXmindUpload = '上传失败';
$lang->testcase->errorFileFormat = '文件格式错误';
$lang->testcase->moduleSelector = '模块选择';
$lang->testcase->errorImportBadProduct = '产品不存在,导入错误';
$lang->testcase->errorSceneNotExist = '场景[%d]不存在';
$lang->testcase->save = '保存';
$lang->testcase->close = '关闭';
$lang->testcase->xmindImportSetting = '导入特征字符设置';
$lang->testcase->xmindExportSetting = '导出特征字符设置';
$lang->testcase->settingModule = '模&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;块';
$lang->testcase->settingScene = '场&nbsp;&nbsp;&nbsp;&nbsp;景';
$lang->testcase->settingCase = '测试用例';
$lang->testcase->settingPri = '优先级&nbsp;';
$lang->testcase->settingGroup = '步骤分组';
$lang->testcase->caseNotExist = '未识别导入数据中的用例,导入失败';
$lang->testcase->saveFail = '保存失败';
$lang->testcase->set2Scene = '设为场景';
$lang->testcase->set2Testcase = '设为测试用例';
$lang->testcase->clearSetting = '清除设置';
$lang->testcase->setModule = '设置场景模块';
$lang->testcase->pickModule = '请选择模块';
$lang->testcase->clearBefore = '清除前面场景';
$lang->testcase->clearAfter = '清除后面场景';
$lang->testcase->clearCurrent = '清除当前场景';
$lang->testcase->removeGroup = '移除分组';
$lang->testcase->set2Group = '设为分组';
$lang->testcase->exportTemplet = '导出模板';
$lang->testcase->createScene = "建场景";
$lang->testcase->changeScene = "拖动改变所属场景";
$lang->testcase->batchChangeScene = "批量改变所属场景";
$lang->testcase->updateOrder = "拖动排序";
$lang->testcase->differentProduct = "所属产品不同";
$lang->testcase->newScene = "建场景";
$lang->testcase->sceneTitle = '场景标题';
$lang->testcase->parentScene = "父场景";
$lang->testcase->scene = "所属场景";
$lang->testcase->summary = '本页共 %d 个顶级场景,%d 个独立用例。';
$lang->testcase->summaryScene = '本页共 %d 个顶级场景。';
$lang->testcase->deleteScene = '删除场景';
$lang->testcase->editScene = '编辑场景';
$lang->testcase->hasChildren = '该场景有子场景或测试用例存在,要全部删除吗?';
$lang->testcase->confirmDeleteScene = '您确定要删除场景:“%s”吗?';
$lang->testcase->sceneb = "场景";
$lang->testcase->onlyScene = '仅场景';
$lang->testcase->iScene = '所属场景';
$lang->testcase->generalTitle = '标题';
$lang->testcase->noScene = '暂时没有场景';
$lang->testcase->rowIndex = '行索引';
$lang->testcase->nestTotal = '嵌套总数';
$lang->testcase->normal = '正常';
/* Translation for drag modal message box. */
$lang->testcase->dragModalTitle = '拖拽操作选择';
$lang->testcase->dragModalMessage = '<p>当前操作有两种可能的情况: </p><p>1) 调整排序<br/> 2) 更改所属场景,所属模块同时变更为目标场景的模块</p><p>请选择您要执行的操作</p>';
$lang->testcase->dragModalChangeScene = '更改所属场景';
$lang->testcase->dragModalChangeOrder = '调整排序';
$lang->testcase->confirmBatchDeleteSceneCase = '您确认要批量删除这些场景或测试用例吗?';
$lang->scene = new stdclass();
$lang->scene->title = '场景标题';
+106 -7
View File
@@ -11,8 +11,9 @@
*/
$lang->testcase->id = '用例編號';
$lang->testcase->product = "所屬{$lang->productCommon}";
$lang->testcase->project = '所屬項目';
$lang->testcase->execution = '所屬執行';
$lang->testcase->project = '所屬' . $lang->projectCommon;
$lang->testcase->execution = '所屬' . $lang->executionCommon;
$lang->testcase->linkStory = '关联需求';
$lang->testcase->module = '所屬模組';
$lang->testcase->auto = '自動化測試用例';
$lang->testcase->frame = '自動化測試框架';
@@ -20,7 +21,7 @@ $lang->testcase->howRun = '測試方式';
$lang->testcase->frequency = '使用頻率';
$lang->testcase->path = '路徑';
$lang->testcase->lib = "所屬庫";
$lang->testcase->branch = "分支/平台";
$lang->testcase->branch = "平台/分支";
$lang->testcase->moduleAB = '模組';
$lang->testcase->story = "相關{$lang->SRCommon}";
$lang->testcase->storyVersion = "{$lang->SRCommon}版本";
@@ -31,9 +32,11 @@ $lang->testcase->precondition = '前置條件';
$lang->testcase->pri = '優先順序';
$lang->testcase->type = '用例類型';
$lang->testcase->status = '用例狀態';
$lang->testcase->statusAB = '状态';
$lang->testcase->subStatus = '子狀態';
$lang->testcase->steps = '用例步驟';
$lang->testcase->openedBy = '由誰創建';
$lang->testcase->openedByAB = '创建者';
$lang->testcase->openedDate = '創建日期';
$lang->testcase->lastEditedBy = '最後修改者';
$lang->testcase->result = '測試結果';
@@ -43,6 +46,9 @@ $lang->testcase->files = '附件';
$lang->testcase->linkCase = '相關用例';
$lang->testcase->linkCases = '關聯相關用例';
$lang->testcase->unlinkCase = '移除相關用例';
$lang->testcase->linkBug = '相关Bug';
$lang->testcase->linkBugs = '关联相关Bug';
$lang->testcase->unlinkBug = '移除相关Bug';
$lang->testcase->stage = '適用階段';
$lang->testcase->scriptedBy = '腳本由誰創建';
$lang->testcase->scriptedDate = '腳本創建日期';
@@ -91,6 +97,11 @@ $lang->testcase->mailto = '抄送給';
$lang->testcase->deleted = '是否刪除';
$lang->testcase->browseUnits = '單元測試';
$lang->testcase->suite = '套件';
$lang->testcase->executionStatus = '执行状态';
$lang->testcase->caseType = '用例类型';
$lang->testcase->allType = '所有类型';
$lang->testcase->showAutoCase = '自动化';
$lang->testcase->automation = '自动化设置';
$lang->case = $lang->testcase; // 用於DAO檢查時使用。因為case是系統關鍵字,所以無法定義該模組為case,只能使用testcase,但表還是使用的case。
@@ -99,7 +110,6 @@ $lang->testcase->stepDesc = '步驟';
$lang->testcase->stepExpect = '預期';
$lang->testcase->stepVersion = '版本';
$lang->testcase->common = '用例';
$lang->testcase->index = "用例管理首頁";
$lang->testcase->create = "建用例";
$lang->testcase->batchCreate = "批量建用例";
@@ -121,6 +131,7 @@ $lang->testcase->batchConfirmStoryChange = "批量確認變更";
$lang->testcase->batchCaseTypeChange = "批量修改類型";
$lang->testcase->browse = "用例列表";
$lang->testcase->groupCase = "分組瀏覽用例";
$lang->testcase->zeroCase = "零用例{$lang->common->story}";
$lang->testcase->import = "導入";
$lang->testcase->importAction = "導入用例";
$lang->testcase->fileImport = "導入CSV";
@@ -139,6 +150,9 @@ $lang->testcase->groupName = '分組名稱';
$lang->testcase->step = '步驟';
$lang->testcase->stepChild = '子步驟';
$lang->testcase->viewAll = '查看所有';
$lang->testcase->importToLib = '导入用例库';
$lang->testcase->showScript = '查看自动化脚本';
$lang->testcase->autoScript = '自动化脚本';
$lang->testcase->new = '新增';
@@ -173,6 +187,7 @@ $lang->testcase->confirmDelete = '您確認要刪除該測試用例嗎?';
$lang->testcase->confirmBatchDelete = '您確認要批量刪除這些測試用例嗎?';
$lang->testcase->ditto = '同上';
$lang->testcase->dittoNotice = '該用例與上一用例不屬於同一產品!';
$lang->testcase->confirmUnlinkTesttask = '用例[%s]已关联在之前所属平台/分支的测试单中,调整平台/分支后,将从之前所属平台/分支的测试单中移除,请确认是否继续修改。';
$lang->testcase->reviewList[0] = '否';
$lang->testcase->reviewList[1] = '是';
@@ -219,16 +234,21 @@ $lang->testcase->resultList['blocked'] = '阻塞';
$lang->testcase->buttonToList = '返回';
$lang->testcase->whichLine = '第%s行';
$lang->testcase->stepsEmpty = '步骤%s不能为空';
$lang->testcase->errorEncode = '無數據,請選擇正確的編碼重新上傳!';
$lang->testcase->noFunction = '不存在iconv和mb_convert_encoding轉碼方法,不能將數據轉成想要的編碼!';
$lang->testcase->noRequire = "%s行的“%s”是必填欄位,不能為空";
$lang->testcase->noRequireTip = "“%s”是必填字段,不能为空";
$lang->testcase->noLibrary = "現在還沒有用例庫,請先創建!";
$lang->testcase->mustChooseResult = '必須選擇評審結果';
$lang->testcase->noModule = '<div>您現在還沒有模組信息</div><div>請維護測試模組</div>';
$lang->testcase->noCase = '暫時沒有用例。';
$lang->testcase->importedCases = 'ID为 %s 的用例在相同模块已经导入,已忽略。';
$lang->testcase->searchStories = "鍵入來搜索{$lang->SRCommon}";
$lang->testcase->selectLib = '請選擇庫';
$lang->testcase->selectLibAB = '选择用例库';
$lang->testcase->action = new stdclass();
$lang->testcase->action->fromlib = array('main' => '$date, 由 <strong>$actor</strong> 從用例庫 <strong>$extra</strong>導入。');
@@ -238,11 +258,90 @@ $lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <st
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 關聯到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 從' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['casetype'] = $lang->testcase->caseType;
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['wait'] = '待評審';
$lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm;
$lang->testcase->featureBar['browse']['group'] = '分組查看';
$lang->testcase->featureBar['browse']['suite'] = '套件';
$lang->testcase->featureBar['browse']['zerocase'] = "零用例{$lang->SRCommon}";
$lang->testcase->featureBar['browse']['browseunits'] = '單元測試';
$lang->testcase->featureBar['groupcase'] = $lang->testcase->featureBar['browse'];
$lang->testcase->featureBar['browse']['suite'] = '套件';
$lang->testcase->featureBar['browse']['autocase'] = $lang->testcase->showAutoCase;
$lang->testcase->importXmind = "导入XMIND";
$lang->testcase->exportXmind = "导出XMIND";
$lang->testcase->getXmindImport = "获取导图";
$lang->testcase->showXMindImport = "显示导图";
$lang->testcase->saveXmindImport = "保存导图";
$lang->testcase->xmindImport = "导入XMIND";
$lang->testcase->xmindExport = "导出XMIND";
$lang->testcase->xmindImportEdit = "XMIND 编辑";
$lang->testcase->errorFileNotEmpty = '上传文件不能为空';
$lang->testcase->errorXmindUpload = '上传失败';
$lang->testcase->errorFileFormat = '文件格式错误';
$lang->testcase->moduleSelector = '模块选择';
$lang->testcase->errorImportBadProduct = '产品不存在,导入错误';
$lang->testcase->errorSceneNotExist = '场景[%d]不存在';
$lang->testcase->save = '保存';
$lang->testcase->close = '关闭';
$lang->testcase->xmindImportSetting = '导入特征字符设置';
$lang->testcase->xmindExportSetting = '导出特征字符设置';
$lang->testcase->settingModule = '模&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;块';
$lang->testcase->settingScene = '场&nbsp;&nbsp;&nbsp;&nbsp;景';
$lang->testcase->settingCase = '测试用例';
$lang->testcase->settingPri = '优先级&nbsp;';
$lang->testcase->settingGroup = '步骤分组';
$lang->testcase->caseNotExist = '未识别导入数据中的用例,导入失败';
$lang->testcase->saveFail = '保存失败';
$lang->testcase->set2Scene = '设为场景';
$lang->testcase->set2Testcase = '设为测试用例';
$lang->testcase->clearSetting = '清除设置';
$lang->testcase->setModule = '设置场景模块';
$lang->testcase->pickModule = '请选择模块';
$lang->testcase->clearBefore = '清除前面场景';
$lang->testcase->clearAfter = '清除后面场景';
$lang->testcase->clearCurrent = '清除当前场景';
$lang->testcase->removeGroup = '移除分组';
$lang->testcase->set2Group = '设为分组';
$lang->testcase->exportTemplet = '导出模板';
$lang->testcase->createScene = "建场景";
$lang->testcase->changeScene = "拖动改变所属场景";
$lang->testcase->batchChangeScene = "批量改变所属场景";
$lang->testcase->updateOrder = "拖动排序";
$lang->testcase->differentProduct = "所属产品不同";
$lang->testcase->newScene = "建场景";
$lang->testcase->sceneTitle = '场景标题';
$lang->testcase->parentScene = "父场景";
$lang->testcase->scene = "所属场景";
$lang->testcase->summary = '本页共 %d 个顶级场景,%d 个独立用例。';
$lang->testcase->summaryScene = '本页共 %d 个顶级场景。';
$lang->testcase->deleteScene = '删除场景';
$lang->testcase->editScene = '编辑场景';
$lang->testcase->hasChildren = '该场景有子场景或测试用例存在,要全部删除吗?';
$lang->testcase->confirmDeleteScene = '您确定要删除场景:\“%s\”吗?';
$lang->testcase->sceneb = "场景";
$lang->testcase->onlyScene = '仅场景';
$lang->testcase->iScene = '所属场景';
$lang->testcase->generalTitle = '标题';
$lang->testcase->noScene = '暂时没有场景';
$lang->testcase->rowIndex = '行索引';
$lang->testcase->nestTotal = '嵌套总数';
$lang->testcase->normal = '正常';
/* Translation for drag modal message box. */
$lang->testcase->dragModalTitle = '拖拽操作选择';
$lang->testcase->dragModalMessage = '<p>当前操作有两种可能的情况: </p><p>1) 调整排序<br/> 2) 更改所属场景,所属模块同时变更为目标场景的模块</p><p>请选择您要执行的操作</p>';
$lang->testcase->dragModalChangeScene = '更改所属场景';
$lang->testcase->dragModalChangeOrder = '调整排序';
$lang->testcase->confirmBatchDeleteSceneCase = '您确认要批量删除这些场景或测试用例吗?';
$lang->scene = new stdclass();
$lang->scene->title = '场景标题';
+1912 -40
View File
File diff suppressed because it is too large Load Diff
+8 -3
View File
@@ -57,6 +57,7 @@
<th class='c-id'><?php echo $lang->idAB;?></th>
<th class='c-branch<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox'><?php echo $lang->product->branch;?></th>
<th class='c-module<?php echo zget($visibleFields, 'module', ' hidden') . zget($requiredFields, 'module', '', ' required');?> moduleBox'><?php echo $lang->testcase->module;?></th>
<th class='c-scene<?php echo zget($visibleFields, 'scene', ' hidden') . zget($requiredFields, 'scene', '', ' required');?> sceneBox'><?php echo $lang->testcase->scene;?></th>
<th class='c-story<?php echo zget($visibleFields, 'story', ' hidden') . zget($requiredFields, 'story', '', ' required'); echo $hiddenStory;?> storyBox'> <?php echo $lang->testcase->story;?></th>
<th class='text-left required has-btn c-title'><?php echo $lang->testcase->title;?></th>
<th class='c-type text-left required'><?php echo $lang->testcase->type;?></th>
@@ -81,6 +82,7 @@
<?php for($i = 1; $i <= $config->testcase->batchCreate; $i++):?>
<?php
if($i != 1) $currentModuleID = 'ditto';
if($i != 1) $currentSceneID = 'ditto';
if($i != 1) $lang->testcase->typeList['ditto'] = $lang->testcase->ditto;
if($i != 1) $lang->testcase->priList['ditto'] = $lang->testcase->ditto;
$type = $i == 1 ? 'feature' : 'ditto';
@@ -89,7 +91,8 @@
<tr>
<td class="text-center"><?php echo $i;?></td>
<td class='text-left<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox'><?php echo html::select("branch[$i]", $branches, $branch, "class='form-control' onchange='setModules(this.value, $productID, $i)'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?> moduleBox' style='overflow:visible'><?php echo html::select("module[$i]", $moduleOptionMenu, $currentModuleID, "class='form-control chosen' onchange='loadStories($productID, this.value, $i)' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?> moduleBox' style='overflow:visible'><?php echo html::select("module[$i]", $moduleOptionMenu, $currentModuleID, "class='form-control chosen' onchange='onModuleChanged($productID, this.value, $i)' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'scene', ' hidden')?>' style='overflow:visible;'><?php echo html::select("scene[$i]", $sceneOptionMenu, $currentSceneID, "class='form-control chosen' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'story', ' hidden'); echo $hiddenStory;?> storyBox' style='overflow:visible'> <?php echo html::select("story[$i]", $storyPairs, $story ? $story->id : '', 'class="form-control picker-select"');?></td>
<td style='overflow:visible'>
<div class="input-control has-icon-right">
@@ -140,7 +143,8 @@
<tr>
<td class="text-center">%s</td>
<td class='text-left<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox'><?php echo html::select("branch[%s]", $branches, $branch, "class='form-control chosen' onchange='setModules(this.value, $productID, \"%s\")'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?> moduleBox' style='overflow:visible'><?php echo html::select("module[%s]", $moduleOptionMenu, $currentModuleID, "class='form-control chosen' onchange='loadStories($productID, this.value, \"%s\")' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?> moduleBox' style='overflow:visible'><?php echo html::select("module[%s]", $moduleOptionMenu, $currentModuleID, "class='form-control chosen' onchange='onModuleChanged($productID, this.value, \"%s\")' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'scene', ' hidden')?>' style='overflow:visible'><?php echo html::select("scene[%s]", $sceneOptionMenu, $currentSceneID, "class='form-control chosen' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'story', ' hidden'); echo $hiddenStory;?> storyBox' style='overflow:visible'> <?php echo html::select("story[%s]", $storyPairs, '', 'class="form-control picker-select"');?></td>
<td style='overflow:visible'>
<div class="input-control has-icon-right">
@@ -179,7 +183,8 @@
<tr id='addRow' class='hidden'>
<td class="text-center"><?php echo $i;?></td>
<td class='text-left<?php echo zget($visibleFields, $product->type, ' hidden')?> branchBox'><?php echo html::select("branch[$i]", $branches, $branch, "class='form-control' onchange='setModules(this.value, $productID, $i)'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?> moduleBox' style='overflow:visible'><?php echo html::select("module[$i]", $moduleOptionMenu, $currentModuleID, "class='form-control chosen' onchange='loadStories($productID, this.value, $i)' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?> moduleBox' style='overflow:visible'><?php echo html::select("module[$i]", $moduleOptionMenu, $currentModuleID, "class='form-control chosen' onchange='onModuleChanged($productID, this.value, $i)' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'scene', ' hidden')?>' style='overflow:visible'><?php echo html::select("scene[$i]", $sceneOptionMenu, $currentSceneID, "class='form-control chosen' data-drop_direction='down'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'story', ' hidden'); echo $hiddenStory;?> storyBox' style='overflow:visible'> <?php echo html::select("story[$i]", $storyPairs, $story ? $story->id : '', 'class="form-control picker-select"');?></td>
<td style='overflow:visible'>
<div class="input-control has-icon-right">
+7 -1
View File
@@ -57,6 +57,9 @@
<th class='c-branch'><?php echo $lang->testcase->branch;?></th>
<?php endif;?>
<th class='c-module<?php echo zget($visibleFields, 'module', ' hidden') . zget($requiredFields, 'module', '', ' required');?>'><?php echo $lang->testcase->module;?></th>
<?php if(!$isLibCase):?>
<th class='c-scene<?php echo zget($visibleFields, 'scene', ' hidden') . zget($requiredFields, 'scene', '', ' required');?>'><?php echo $lang->testcase->scene;?></th>
<?php endif;?>
<th class='c-story<?php echo zget($visibleFields, 'story', ' hidden') . zget($requiredFields, 'story', '', ' required');?>'><?php echo $lang->testcase->story;?></th>
<th class='text-left c-title required'><?php echo $lang->testcase->title;?></th>
<th class='c-type required'><?php echo $lang->testcase->type;?></th>
@@ -96,7 +99,10 @@
<?php echo html::select("branches[$caseID]", !empty($disabled) ? array() : $branchTagOption[$branchProductID], $productType != 'normal' ? $cases[$caseID]->branch : '', "class='form-control chosen' onchange='loadBranches($branchProductID, this.value, $caseID, {$cases[$caseID]->branch})', $disabled");?>
</td>
<?php endif;?>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?>' style='overflow:visible'><?php echo html::select("modules[$caseID]", zget($modulePairs, $caseID, array(0 => '/')), $cases[$caseID]->module, "class='form-control chosen' onchange='loadStories($productID, this.value, $caseID)'");?></td>
<td class='text-left<?php echo zget($visibleFields, 'module', ' hidden')?>' style='overflow:visible'><?php echo html::select("modules[$caseID]", zget($modulePairs, $caseID, array(0 => '/')), $cases[$caseID]->module, "class='form-control chosen' onchange='loadStories2($productID, this.value, $caseID)'");?></td>
<?php if(!$isLibCase):?>
<td class='text-left<?php echo zget($visibleFields, 'scene', ' hidden')?>' style='overflow:visible'><?php echo html::select("scene[$caseID]", zget($scenePairs, $caseID, array(0 => '/')), $cases[$caseID]->scene, "class='form-control chosen' data-drop_direction='down'");?></td>
<?php endif;?>
<td class='text-left<?php echo zget($visibleFields, 'story', ' hidden')?>' style='overflow:visible'><?php echo html::select("story[$caseID]", $stories, $cases[$caseID]->story, "class='form-control picker-select'");?></td>
<td style='overflow:visible' title='<?php echo $cases[$caseID]->title?>'>
<div class='input-group'>
+274 -31
View File
@@ -13,20 +13,25 @@
<?php
include '../../common/view/header.html.php';
include '../../common/view/datepicker.html.php';
include '../../common/view/datatable.fix.html.php';
include './datatable.fix.html.php';
include './caseheader.html.php';
js::set('browseType', $browseType);
js::set('caseBrowseType', ($browseType == 'bymodule' and $this->session->caseBrowseType == 'bysearch') ? 'all' : $this->session->caseBrowseType);
js::set('moduleID' , $moduleID);
js::set('confirmDelete', $lang->testcase->confirmDelete);
js::set('batchDelete', $lang->testcase->confirmBatchDelete);
js::set('productID', $productID);
js::set('branch', $branch);
js::set('suiteID', $suiteID);
js::set('automation', !empty($automation) ? $automation->id : 0);
js::set('runCaseConfirm', $lang->zanode->runCaseConfirm);
js::set('confirmURL', $this->createLink('testtask', 'batchRun', "productID=$productID&orderBy=$orderBy&from=testcase&taskID=0&confirm=yes"));
js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$productID&orderBy=$orderBy&from=testcase&taskID=0&confirm=no"));
js::set('browseType', $browseType);
js::set('caseBrowseType', ($browseType == 'bymodule' and $this->session->caseBrowseType == 'bysearch') ? 'all' : $this->session->caseBrowseType);
js::set('moduleID' , $moduleID);
js::set('confirmDelete', $lang->testcase->confirmDelete);
js::set('batchDelete', $lang->testcase->confirmBatchDeleteSceneCase);
js::set('productID', $productID);
js::set('branch', $branch);
js::set('suiteID', $suiteID);
js::set('automation', !empty($automation) ? $automation->id : 0);
js::set('runCaseConfirm', $lang->zanode->runCaseConfirm);
js::set('confirmURL', $this->createLink('testtask', 'batchRun', "productID=$productID&orderBy=$orderBy&from=testcase&taskID=0&confirm=yes"));
js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$productID&orderBy=$orderBy&from=testcase&taskID=0&confirm=no"));
js::set('orderBy', $orderBy);
js::set('differentProduct', $lang->testcase->differentProduct);
js::set('langRowIndex', $lang->testcase->rowIndex);
js::set('langNestTotal', $lang->testcase->nestTotal);
js::set('langNormal', $lang->testcase->normal);
?>
<?php if($this->app->tab == 'project'):?>
<style>
@@ -53,19 +58,27 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
</div>
<div class='main-col'>
<div id='queryBox' data-module='testcase' class='cell<?php if($browseType == 'bysearch') echo ' show';?>'></div>
<?php if(empty($cases)):?>
<?php if(empty($scenes)):?>
<?php $useDatatable = '';?>
<div class="table-empty-tip">
<p>
<span class="text-muted"><?php echo $lang->testcase->noCase;?></span>
<?php if((empty($productID) or common::canModify('product', $product)) and common::hasPriv('testcase', 'create') and $browseType != 'bysuite'):?>
<?php $initModule = isset($moduleID) ? (int)$moduleID : 0;?>
<?php echo html::a($this->createLink('testcase', 'create', "productID=$productID&branch=$branch&moduleID=$initModule"), "<i class='icon icon-plus'></i> " . $lang->testcase->create, '', "class='btn btn-info' data-app='{$this->app->tab}'");?>
<?php endif;?>
<?php if($this->cookie->onlyScene): ?>
<span class="text-muted"><?php echo $lang->testcase->noScene;?></span>
<?php if((empty($productID) or common::canModify('product', $product)) and common::hasPriv('testcase', 'createScene') and $browseType != 'bysuite'):?>
<?php $initModule = isset($moduleID) ? (int)$moduleID : 0;?>
<?php echo html::a($this->createLink('testcase', 'createScene', "productID=$productID&branch=$branch&moduleID=$initModule"), "<i class='icon icon-plus'></i> " . $lang->testcase->newScene, '', "class='btn btn-info' data-app='{$this->app->tab}'");?>
<?php endif;?>
<?php else: ?>
<span class="text-muted"><?php echo $lang->testcase->noCase;?></span>
<?php if((empty($productID) or common::canModify('product', $product)) and common::hasPriv('testcase', 'create') and $browseType != 'bysuite'):?>
<?php $initModule = isset($moduleID) ? (int)$moduleID : 0;?>
<?php echo html::a($this->createLink('testcase', 'create', "productID=$productID&branch=$branch&moduleID=$initModule"), "<i class='icon icon-plus'></i> " . $lang->testcase->create, '', "class='btn btn-info' data-app='{$this->app->tab}'");?>
<?php endif;?>
<?php if(common::hasPriv('testsuite', 'linkCase') and $browseType == 'bysuite'):?>
<?php echo html::a($this->createLink('testsuite', 'linkCase', "suiteID=$param"), "<i class='icon icon-plus'></i> " . $lang->testsuite->linkCase, '', "class='btn btn-info' data-app='{$this->app->tab}'");?>
<?php endif;?>
<?php if(common::hasPriv('testsuite', 'linkCase') and $browseType == 'bysuite'):?>
<?php echo html::a($this->createLink('testsuite', 'linkCase', "suiteID=$param"), "<i class='icon icon-plus'></i> " . $lang->testsuite->linkCase, '', "class='btn btn-info' data-app='{$this->app->tab}'");?>
<?php endif;?>
<?php endif ?>
</p>
</div>
<?php else:?>
@@ -73,7 +86,8 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
$datatableId = $this->moduleName . ucfirst($this->methodName);
$useDatatable = (isset($config->datatable->$datatableId->mode) and $config->datatable->$datatableId->mode == 'datatable');
?>
<form class='main-table table-case' id='caseForm' method='post' <?php if(!$useDatatable) echo "data-ride='table'";?>>
<form class='main-table table-case' data-nested='true' data-expand-nest-child='false' data-checkable='true' data-enable-empty-nested-row='true' data-replace-id='caseTableList' data-preserve-nested='true'
id='caseForm' method='post' <?php if(!$useDatatable) echo "data-ride='table'";?>>
<div class="table-header fixed-right">
<nav class="btn-toolbar pull-right setting"></nav>
</div>
@@ -98,7 +112,7 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
$canBatchAction = ($canBatchRun or $canBatchEdit or $canBatchDelete or $canBatchCaseTypeChange or $canBatchConfirmStoryChange or $canBatchChangeModule or $canImportToLib);
?>
<?php if(!$useDatatable) echo '<div class="table-responsive">';?>
<table class='table has-sort-head<?php if($useDatatable) echo ' datatable';?>' id='caseList' data-fixed-left-width='<?php echo $widths['leftWidth']?>' data-fixed-right-width='<?php echo $widths['rightWidth']?>' data-checkbox-name='caseIDList[]'>
<table class='table has-sort-head table-fixed table-nested table has-sort-head<?php if($useDatatable) echo ' datatable';?>' id='caseList' data-fixed-left-width='<?php echo $widths['leftWidth']?>' data-fixed-right-width='<?php echo $widths['rightWidth']?>' data-checkbox-name='caseIDList[]'>
<thead>
<tr>
<?php
@@ -113,13 +127,36 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
?>
</tr>
</thead>
<tbody>
<?php foreach($cases as $case):?>
<tr data-id='<?php echo $case->id?>' data-auto='<?php echo $case->auto;?>'>
<?php foreach($setting as $key => $value) $this->testcase->printCell($value, $case, $users, $branchOption, $modulePairs, $browseType, $useDatatable ? 'datatable' : 'table');?>
</tr>
<?php $caseProductIds[$case->product] = $case->product;?>
<?php endforeach;?>
<tbody id='caseTableList'>
<?php $originOrders = array(); ?>
<?php foreach($scenes as $kk => $scene):?>
<?php
$trClass = '';
$trAttrs = "data-id='$scene->id' data-auto='$scene->auto' data-order='$scene->sort' data-parent='$scene->parent' data-product='$scene->product'";
if($scene->isCase == 2)
{
$trAttrs .= " data-nested='true'";
$trClass .= $scene->parent == '0' ? ' is-top-level table-nest-child-hide' : ' table-nest-hide';
}
if($scene->parent and isset($scenes[$scene->parent]))
{
if($scene->isCase != 2) $trClass .= ' is-nest-child';
if(empty($scene->path)) $scene->path = $scenes[$scene->parent]->path . "$scene->id,";
$trClass .= ' table-nest-hide';
$trAttrs .= " data-nest-parent='$scene->parent' data-nest-path='$scene->path'";
}
elseif($scene->isCase != 2)
{
$trClass .= ' no-nest';
}
$trAttrs .= " class='row-case $trClass'";
$originOrders[] = $scene->id;
?>
<tr data-itype='<?php echo $scene->isCase; ?>' <?php echo $trAttrs;?>>
<?php foreach($setting as $key => $value) $this->testcase->printCell($value, $scene, $users, $branchOption, $modulePairs, $browseType, $useDatatable ? 'datatable' : 'table',$scene->isCase);?>
</tr>
<?php endforeach;?>
</tbody>
</table>
<?php if(!$useDatatable) echo '</div>';?>
@@ -134,6 +171,7 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
$misc = $canBatchRun ? "onclick=\"confirmAction('$actionLink', '', '#caseList')\"" : "disabled='disabled'";
echo html::commonButton($lang->testtask->runCase, $misc);
foreach($cases as $case) $caseProductIds[$case->product] = $case->product;
$caseProductID = count($caseProductIds) > 1 ? 0 : $productID;
$actionLink = $this->createLink('testcase', 'batchEdit', "productID=$caseProductID&branch=$branch");
$misc = $canBatchEdit ? "onclick=\"setFormAction('$actionLink', '', '#caseList')\"" : "disabled='disabled'";
@@ -251,6 +289,33 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
echo html::a($actionLink, $lang->testcase->importToLib, '', "class='btn btn-primary' data-toggle='modal'");
}
?>
<div class="btn-group dropup">
<button data-toggle="dropdown" type="button" class="btn"><?php echo $lang->testcase->sceneb;?> <span class="caret"></span></button>
<?php $withSearch = count($iscenes) > 6;?>
<?php if($withSearch):?>
<div class="dropdown-menu search-list search-box-sink" data-ride="searchList">
<div class="input-control search-box has-icon-left has-icon-right search-example">
<input id="userSearchBox2" type="search" autocomplete="off" class="form-control search-input">
<label for="userSearchBox2" class="input-control-icon-left search-icon"><i class="icon icon-search"></i></label>
<a class="input-control-icon-right search-clear-btn"><i class="icon icon-close icon-sm"></i></a>
</div>
<?php $scenesPinYin = common::convert2Pinyin($iscenes);?>
<?php else:?>
<div class="dropdown-menu search-list">
<?php endif;?>
<div class="list-group">
<?php
foreach($iscenes as $sceneId => $scene)
{
$searchKey = $withSearch ? ('data-key="' . zget($scenesPinYin, $scene, '') . '"') : '';
$actionLink = $this->createLink('testcase', 'batchChangeScene', "sceneId=$sceneId");
echo html::a('#', $scene, '', "title='$scene' $searchKey onclick=\"setFormAction('$actionLink', 'hiddenwin')\"");
}
?>
</div>
</div>
</div>
</div>
<div class="table-statistic"><?php echo $summary;?></div>
<?php $pager->show('right', 'pagerjs');?>
@@ -283,6 +348,40 @@ js::set('cancelURL', $this->createLink('testtask', 'batchRun', "productID=$
</div>
</div>
</div>
<div id="sceneDragModal" class="modal fade">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">x<?php echo $lang->close;?></span></button>
<h4 class="modal-title"><?php echo $lang->testcase->dragModalTitle;?></h4>
</div>
<div class="modal-body">
<?php echo $lang->testcase->dragModalMessage;?>
</div>
<div class="modal-footer">
<button onclick="runToChange()" type="button" class="btn btn-primary"><?php echo $lang->testcase->dragModalChangeScene;?></button>
<button onclick="runToOrder()" type="button" class="btn btn-primary"><?php echo $lang->testcase->dragModalChangeOrder;?></button>
<button type="button" class="btn btn-default" data-dismiss="modal"><?php echo $lang->close;?></button>
</div>
</div>
</div>
</div>
<style>
#caseTableList.sortable-sorting > tr {opacity: 0.7}
#caseTableList.sortable-sorting > tr.drag-row {opacity: 1;}
#caseTableList > tr.drop-not-allowed {opacity: 0.1!important}
#caseList .c-actions {overflow: visible;}
#caseList > thead > tr > th .table-nest-toggle-global {top: 6px}
#caseList > thead > tr > th .table-nest-toggle-global:before {color: #a6aab8;}
#caseTableList > tr:last-child .c-actions .dropdown-menu {top: auto; bottom: 100%; margin-bottom: -5px;}
#caseTableList .icon-common:before {width: 22px; height: 22px; background: none; color: rgb(166, 170, 184); top: 0; line-height: 22px; margin-right: 2px; font-size: 14px}
#caseTableList .icon-project:before {content: '\e99c';}
#caseTableList .icon-test:before {content: '\e956';}
#caseTableList .icon-waterfall:before {content: '\e9a4';}
#caseTableList .icon-kanban:before {content: '\e983';}
</style>
<?php js::set('originOrders', isset($originOrders) ? $originOrders : '');?>
<script>
$('#module' + moduleID).closest('li').addClass('active');
$('#' + caseBrowseType + 'Tab').addClass('btn-active-text').find('.text').after(" <span class='label label-light label-badge'><?php echo $pager->recTotal;?></span>");
@@ -339,4 +438,148 @@ function confirmAction(obj)
$(function(){$('#caseForm').table();})
<?php endif;?>
</script>
<script>
function toChange(sourceId, targetId)
{
if(!checkProduct(sourceId, targetId)) return;
$.post(createLink('testcase', 'changeScene'), {'sourceId' : sourceId,'targetId' : targetId}, function(data){
toOrder(sourceId, targetId);
});
}
function toOrder(sourceId,targetId)
{
if(!checkProduct(sourceId, targetId)) return;
var origOrders = [];
var newOrders = [];
var productID = 0;
$('#caseTableList > tr').each(function(i, elem){
if($(elem).data('id') == sourceId) productID = $(elem).data('product');
});
$('#caseTableList > tr').each(function(i, elem){
if($(elem).data('product') != productID) return;
origOrders.push($(elem).data('id'));
});
for(var i=0; i<origOrders.length;i++)
{
if(origOrders[i] == targetId)
{
newOrders.push(sourceId);
newOrders.push(targetId);
}
else if(origOrders[i] == sourceId)
{
continue;
}
else
{
newOrders.push(origOrders[i]);
}
}
var scenes = newOrders.join();
var orderBy = 'sort_asc';
$.post(createLink('testcase', 'updateOrder'), {'scenes' : scenes, 'orderBy' : orderBy}, function(data){
window.location.reload();
});
}
function runToChange()
{
var sourceId = $("#sceneDragModal").attr("sourceId");
var targetId = $("#sceneDragModal").attr("targetId");
$("#sceneDragModal").modal("hide");
toChange(sourceId, targetId);
}
function runToOrder()
{
var sourceId = $("#sceneDragModal").attr("sourceId");
var targetId = $("#sceneDragModal").attr("targetId");
$("#sceneDragModal").modal("hide");
toOrder(sourceId, targetId);
}
function checkProduct(sourceId, targetId)
{
/* Check source and target ID if belong to the same product. */
var sourceElem = null;
var targetElem = null;
$('#caseTableList > tr').each(function(i, elem){
if($(elem).data('id') == sourceId) sourceElem = elem;
if($(elem).data('id') == targetId) targetElem = elem;
});
if(sourceId == targetId) return false;
if($(sourceElem).data('product') !== $(targetElem).data('product'))
{
bootbox.alert(differentProduct);
return false;
}
return true;
}
$(function()
{
//下面是 source 和 target 的数据结构 $dom 是行tr 对应的Jquery 对象
// id: id,
// index: i,
// parent: parent,
// dataNested: dataNested,
// nestPath: nestPath,
// dateType: dataType,
// boundary: {x:pos.x, y:pos.y, w:size.w, h:size.h},
// $dom: $row,
var xtable = $('#caseForm').data('zui.table');
var trList = $("#caseTableList").find("tr");
for(var i=0; i<trList.length; i++){
$row = $(trList[i]);
if($row.attr("data-itype") == "1") continue;
var dataId = $row.attr("data-id");
xtable.toggleNestedRows(dataId,true,true);
}
DtSort.sort({
container: "#caseTableList",
canMove: function(source,sourceMgr){ return true; },
canAccept: function(source, target,sameLevel, sourceMgr, targetMgr){
if(sameLevel == true) return true; //同级别
if(target.dataNested == "true") return true; //拖到场景下面
return false;
},
finish: function(source, target, sameLevel , sourceMgr, targetMgr){
if(sameLevel == true) {
if(target.dataNested == "true"){
//同级别拖拽到场景下面,需要弹框询问是排序还是切换场景
$("#sceneDragModal").attr("sourceId",source.id);
$("#sceneDragModal").attr("targetId",target.id);
$("#sceneDragModal").modal("show");
} else {
//同级别拖拽到测试用例上,只能是调整顺序
toOrder(source.id,target.id);
}
} else {
//不同级别,只有拖拽到场景下才有用,这里执行切换场景操作
if(target.dataNested == "true"){
toChange(source.id,target.id);
}
}
}
});
});
</script>
<?php include '../../common/view/footer.html.php';?>
+24
View File
@@ -202,6 +202,11 @@
</div>
<?php if(!isonlybody()):?>
<div class='btn-toolbar pull-right'>
<?php if(common::hasPriv('testcase', 'createScene') || common::hasPriv('testcase', 'editScene') || common::hasPriv('testcase', 'deleteScene') || common::hasPriv('testcase', 'changeScene') || common::hasPriv('testcase', 'batchChangeScene') || common::hasPriv('testcase', 'updateOrder') || common::hasPriv('testcase', 'importXmind') || common::hasPriv('testcase', 'getXmindImport') || common::hasPriv('testcase', 'showXMindImport') || common::hasPriv('testcase', 'exportXmind')): ?>
<div class='btn-group btn btn-link'>
<?php echo html::checkbox('onlyScene', array('1' => $lang->testcase->onlyScene), '', $this->cookie->onlyScene ? 'checked=checked' : '');?>
</div>
<?php endif;?>
<?php if(!empty($productID)): ?>
<div class='btn-group'>
<button type='button' class='btn btn-link dropdown-toggle' data-toggle='dropdown'>
@@ -219,6 +224,11 @@
$misc = common::hasPriv('testcase', 'exportTemplate') ? "class='export'" : "class=disabled";
$link = common::hasPriv('testcase', 'exportTemplate') ? $this->createLink('testcase', 'exportTemplate', "productID=$productID") : '#';
echo "<li $class>" . html::a($link, $lang->testcase->exportTemplate, '', $misc . "data-app={$this->app->tab} data-width='65%'") . "</li>";
$class = common::hasPriv('testcase', 'exportXmind') ? '' : "class=disabled";
$misc = common::hasPriv('testcase', 'exportXmind') ? "class='export'" : "class=disabled";
$link = common::hasPriv('testcase', 'exportXmind') ? $this->createLink('testcase', 'exportXmind', "productID=$productID&moduleID=$moduleID&branch=$branch") : '#';
echo "<li $class>" . html::a($link, $lang->testcase->xmindExport, '', $misc . "data-app={$this->app->tab}") . "</li>";
?>
</ul>
</div>
@@ -233,6 +243,11 @@
$link = $this->createLink('testcase', 'importFromLib', "productID=$productID&branch=$branch&libID=0&orderBy=id_desc&browseType=&queryID=10&recTotal=0&recPerPage=20&pageID=1&projectID=$projectID");
if(common::hasPriv('testcase', 'importFromLib')) echo "<li>" . html::a($link, $lang->testcase->importFromLib, '', "data-app={$app->tab}") . "</li>";
$class = common::hasPriv('testcase', 'importXmind') ? '' : "class=disabled";
$misc = common::hasPriv('testcase', 'importXmind') ? "class='export'" : "class=disabled";
$link = common::hasPriv('testcase', 'importXmind') ? $this->createLink('testcase', 'importXmind', "productID=$productID&branch=$branch") : '#';
echo "<li $class>" . html::a($link, $lang->testcase->xmindImport, '', $misc . "data-app={$this->app->tab}") . "</li>";
?>
</ul>
</div>
@@ -248,9 +263,15 @@
<?php
$createTestcaseLink = $this->createLink('testcase', 'create', "productID=$productID&branch=$branch&moduleID=$initModule");
$batchCreateLink = $this->createLink('testcase', 'batchCreate', "productID=$productID&branch=$branch&moduleID=$initModule");
$createSceneLink = $this->createLink('testcase', 'createScene', "productID=$productID&branch=$branch&moduleID=$initModule");
$buttonLink = '';
$buttonTitle = '';
if(common::hasPriv('testcase', 'createScene'))
{
$buttonLink = $createSceneLink;
$buttonTitle = $lang->testcase->newScene;
}
if(common::hasPriv('testcase', 'batchCreate'))
{
$buttonLink = !empty($productID) ? $batchCreateLink : '';
@@ -270,6 +291,9 @@
<ul class='dropdown-menu'>
<li><?php echo html::a($createTestcaseLink, $lang->testcase->create);?></li>
<li><?php echo html::a($batchCreateLink, $lang->testcase->batchCreate, '', "data-app='{$this->app->tab}'");?></li>
<?php if(common::hasPriv('testcase', 'createScene')){ ?>
<li><?php echo html::a($createSceneLink, $lang->testcase->newScene);?></li>
<?php } ?>
</ul>
<?php endif;?>
</div>
+12 -4
View File
@@ -45,8 +45,8 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field)
<th><?php echo $hiddenProduct ? $lang->testcase->module : $lang->testcase->product;?></th>
<td class='<?php if($hiddenProduct) echo 'hidden';?>'>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAll(this.value);' class='form-control chosen'");?>
<?php if(isset($product->type) and $product->type != 'normal') echo html::select('branch', $branches, $branch, "onchange='loadBranch();' class='form-control' style='width:120px'");?>
<?php echo html::select('product', $products, $productID, "onchange='loadAllNew(this.value);' class='form-control chosen'");?>
<?php if(isset($product->type) and $product->type != 'normal') echo html::select('branch', $branches, $branch, "onchange='loadBranchNew();' class='form-control' style='width:120px'");?>
</div>
</td>
<td style='<?php if(!$hiddenProduct) echo 'padding-left:15px;';?>'>
@@ -55,12 +55,12 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field)
<span class="input-group-addon w-80px"><?php echo $lang->testcase->module?></span>
<?php endif;?>
<?php
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelated();' class='form-control chosen'");
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelatedNew();' class='form-control chosen'");
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=case&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "id='refresh' class='refresh' title='$lang->refresh' onclick='loadProductModules($productID)'");
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "id='refresh' class='refresh' title='$lang->refresh' onclick='loadProductModulesNew($productID)'");
echo '</span>';
}
?>
@@ -107,6 +107,14 @@ foreach(explode(',', $config->testcase->create->requiredFields) as $field)
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->testcase->scene;?></th>
<td colspan='2'>
<div class='input-group' id='sceneIdBox'>
<?php echo html::select('scene', $sceneOptionMenu, $currentSceneID, "class='form-control chosen'");?>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->testcase->title;?></th>
<td colspan='2'>
+90
View File
@@ -0,0 +1,90 @@
<?php
/**
* The create view of case 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 case
* @version $Id: create.html.php 4904 2013-06-26 05:37:45Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/kindeditor.html.php';?>
<?php js::set('page', 'createscene');?>
<?php js::set('lblDelete', $lang->testcase->deleteStep);?>
<?php js::set('lblBefore', $lang->testcase->insertBefore);?>
<?php js::set('lblAfter', $lang->testcase->insertAfter);?>
<?php js::set('isonlybody', isonlybody());?>
<?php js::set('tab', $this->app->tab);?>
<?php js::set('caseBranch', 0);?>
<?php if($this->app->tab == 'project') js::set('objectID', $projectID);?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<div class='main-header'>
<h2><?php echo $lang->testcase->newScene;?></h2>
</div>
<?php
foreach(explode(',', $config->testcase->createscene->requiredFields) as $field)
{
if($field and strpos($showFields, $field) === false) $showFields .= ',' . $field;
}
?>
<form class='load-indicator main-form form-ajax' method='post' enctype='multipart/form-data' id='dataform' data-type='ajax'>
<table class='table table-form'>
<tbody>
<tr>
<th><?php echo $lang->testcase->product;?></th>
<td>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAllNew(this.value);' class='form-control chosen'");?>
<?php if(isset($product->type) and $product->type != 'normal') echo html::select('branch', $branches, $branch, "onchange='loadBranchNew();' class='form-control' style='width:120px'");?>
</div>
</td>
<td style='padding-left:15px;'>
<div class='input-group' id='moduleIdBox'>
<span class="input-group-addon w-80px"><?php echo $lang->testcase->module?></span>
<?php
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelatedNew();' class='form-control chosen'");
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=case&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModulesNew($productID)'");
echo '</span>';
}
?>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->testcase->parentScene;?></th>
<td colspan='2'>
<div class='input-group' id='sceneIdBox'>
<?php echo html::select('parent', $sceneOptionMenu, $currentParentID, "class='form-control chosen'");?>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->testcase->sceneTitle;?></th>
<td class="required" colspan='2'>
<?php echo html::input('title', '', "class='form-control'");?>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan='3' class='text-center form-actions'>
<?php echo html::submitButton();?>
<?php echo $gobackLink ? html::a($gobackLink, $lang->goback, '', 'class="btn btn-wide"') : html::backButton();?>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
<?php js::set('caseModule', $lang->testcase->module)?>
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
+134
View File
@@ -0,0 +1,134 @@
<?php $currentModule = $this->app->rawModule;?>
<?php $currentMethod = $this->app->rawMethod;?>
<?php $datatableId = $this->moduleName . ucfirst($this->methodName);?>
<style>
#setShowModule {margin-left: 30px;}
</style>
<script>
$(function()
{
<?php if(!empty($setModule)):?>
$('#sidebar .cell .text-center:last').append("<a href='#showModuleModal' data-toggle='modal' class='btn btn-info btn-wide'><?php echo $lang->datatable->displaySetting;?></a><hr class='space-sm' />");
<?php endif;?>
var addSettingButton = function()
{
var $btnToolbar = $('#main .table-header .btn-toolbar:first');
if($btnToolbar.length > 0)
{
<?php $mode = isset($config->datatable->$datatableId->mode) ? $config->datatable->$datatableId->mode : 'table';?>
var $dropdown = $('<div class="dropdown"><button id="tableCustomBtn" type="button" class="btn btn-link" data-toggle="dropdown"><i class="icon-cog-outline"></i></button></div>');
var $dropmenu = $('<ul class="dropdown-menu pull-right"></ul>');
if(typeof(storyType) != 'undefined' && storyType == 'requirement')
{
$dropmenu.append("<li><a href='<?php echo $this->createLink('datatable', 'ajaxCustom', 'id=' . $this->moduleName . '&method=' . $this->methodName . '&extra=requirement')?>' data-toggle='modal' data-type='ajax'><?php echo $lang->datatable->custom?></a></li>");
}
else if(typeof(from) != 'undefined')
{
<?php $fromPage = isset($fromPage) ? $fromPage : '';?>
<?php $fromPage = ($fromPage == 'project' and isset($isStage) and $isStage) ? 'stage' : $fromPage;?>
$dropmenu.append("<li><a href='<?php echo $this->createLink('datatable', 'ajaxCustom', 'id=' . $this->moduleName . '&method=' . $this->methodName . "&extra=$fromPage")?>' data-toggle='modal' data-type='ajax'><?php echo $lang->datatable->custom?></a></li>");
}
else
{
$dropmenu.append("<li><a href='<?php echo $this->createLink('datatable', 'ajaxCustom', 'id=' . $this->moduleName . '&method=' . $this->methodName)?>' data-toggle='modal' data-type='ajax'><?php echo $lang->datatable->custom?></a></li>");
}
// $dropmenu.append("<li><a href='javascript:saveDatatableConfig(\"mode\", \"<?php echo $mode == 'table' ? 'datatable' : 'table';?>\", true);' id='switchToDatatable'><?php echo $mode == 'table' ? $lang->datatable->switchToDatatable : $lang->datatable->switchToTable;?></a></li>");
$dropdown.append($dropmenu)
.appendTo($btnToolbar)
.on('shown.zui.dropdown', function(){$btnToolbar.closest('.table-header').css('z-index', 11);})
.on('hidden.zui.dropdown', function(){$btnToolbar.closest('.table-header').css('z-index', 5);});
}
};
if ($.cookie('onlyScene') == 1) {
}else{
$('#main .main-table').on('tableReload', addSettingButton);
addSettingButton();
}
$('#setShowModule').click(function()
{
if('<?php echo $this->app->user->account?>' == 'guest') return;
datatableId = '<?php echo $datatableId?>';
currentModule = '<?php echo $currentModule?>';
currentMethod = '<?php echo $currentMethod?>';
var value = $('#showModuleModal input[name="showModule"]:checked').val();
var allModule = $('#showModuleModal input[name="showAllModule"]:checked').val();
var showBranch = $('#showModuleModal input[name="showBranch"]:checked').val();
if(typeof allModule === 'undefined') allModule = false;
$.ajax(
{
type: "POST",
dataType: 'json',
data:
{
target: datatableId,
name: 'showModule',
value: value,
allModule: allModule,
showBranch: showBranch,
currentModule: currentModule,
currentMethod: currentMethod,
},
success:function(){window.location.reload();},
url: '<?php echo $this->createLink('datatable', 'ajaxSave')?>'
});
});
window.saveDatatableConfig = function(name, value, reload, global)
{
if('<?php echo $this->app->user->account?>' == 'guest') return;
var datatableId = '<?php echo $datatableId;?>';
if(typeof value === 'object') value = JSON.stringify(value);
if(typeof global === 'undefined') global = 0;
$.ajax(
{
type: "POST",
dataType: 'json',
data: {target: datatableId, name: name, value: value, global: global},
success:function(e){if(reload) window.location.reload();},
url: '<?php echo $this->createLink('datatable', 'ajaxSave')?>'
});
$.get(createLink('score', 'ajax', "method=switchToDataTable"));
};
});
</script>
<div class="modal fade" id="showModuleModal" tabindex="-1" role="dialog">
<div class="modal-dialog w-600px">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><i class="icon icon-close"></i></button>
<h4 class="modal-title"><i class="icon-cog-outline"></i> <?php echo $lang->datatable->displaySetting;?></h4>
</div>
<div class="modal-body">
<form class="form-condensed not-watch" method='post' target='hiddenwin' action='<?php echo $this->createLink('datatable', 'ajaxSave')?>'>
<table class='table table-form'>
<tr>
<td class='w-160px'><?php echo $lang->datatable->showModule;?></td>
<td><?php echo html::radio('showModule', $lang->datatable->showModuleList, isset($config->datatable->$datatableId->showModule) ? $config->datatable->$datatableId->showModule : '');?></td>
</tr>
<?php if($app->moduleName == 'execution' and $app->methodName == 'task' and $this->config->vision != 'lite'):?>
<tr>
<td><?php echo $lang->datatable->showAllModule;?></td>
<td><?php echo html::radio('showAllModule', $lang->datatable->showAllModuleList, isset($config->execution->task->allModule) ? $config->execution->task->allModule : 0);?></td>
</tr>
<?php endif;?>
<?php if($showBranch):?>
<tr>
<td><?php echo $lang->datatable->showBranch;?></td>
<td><?php echo html::radio('showBranch', $lang->datatable->showBranchList, isset($config->$currentModule->$currentMethod->showBranch) ? $config->$currentModule->$currentMethod->showBranch : 1);?></td>
</tr>
<?php endif;?>
<tr>
<td colspan='2' class='text-center'><button type='button' id='setShowModule' class='btn btn-primary'><?php echo $lang->save?></button></td>
</tr>
</table>
</form>
</div>
</div>
</div>
</div>
+12 -4
View File
@@ -51,6 +51,14 @@
</div>
</div>
</div>
<div class='detail'>
<div class='detail-title'><?php echo $lang->testcase->scene;?></div>
<div class="detail-content">
<div class="input-control" id='sceneIdBox'>
<?php echo html::select('scene', $sceneOptionMenu, $currentSceneID, "class='form-control chosen'");?>
</div>
</div>
</div>
<div class='detail'>
<div class='detail-title'><?php echo $lang->testcase->precondition;?></div>
<div class='detail-content'><?php echo html::textarea('precondition', $case->precondition, "rows='2' class='form-control'");?></div>
@@ -179,8 +187,8 @@
<th><?php echo $lang->testcase->product;?></th>
<td>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAll(this.value)' class='form-control chosen'");?>
<?php if(isset($product->type) and $product->type != 'normal') echo html::select('branch', $branchTagOption, $case->branch, "onchange='loadBranch($case->branch);' class='form-control'");?>
<?php echo html::select('product', $products, $productID, "onchange='loadAllNew(this.value)' class='form-control chosen'");?>
<?php if(isset($product->type) and $product->type != 'normal') echo html::select('branch', $branchTagOption, $case->branch, "onchange='loadBranchNew($case->branch);' class='form-control'");?>
</div>
</td>
</tr>
@@ -189,13 +197,13 @@
<td>
<div class='input-group' id='moduleIdBox'>
<?php
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelated()' class='form-control chosen'");
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelatedNew()' class='form-control chosen'");
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=case&currentModuleID=0&branch=$case->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->refreshIcon, '', "class='refresh' onclick='loadProductModules($productID)'");
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' onclick='loadProductModulesNew($productID)'");
echo '</span>';
}
+99
View File
@@ -0,0 +1,99 @@
<?php
/**
* The create view of case 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 case
* @version $Id: create.html.php 4904 2013-06-26 05:37:45Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php include $app->getModuleRoot() . 'common/view/kindeditor.html.php';?>
<?php js::set('page', 'edit');?>
<?php js::set('isonlybody', isonlybody());?>
<?php js::set('executionID', $executionID);?>
<?php js::set('lblDelete', $lang->testcase->deleteStep);?>
<?php js::set('lblBefore', $lang->testcase->insertBefore);?>
<?php js::set('lblAfter', $lang->testcase->insertAfter);?>
<?php js::set('sceneId', $scene->id);?>
<?php js::set('caseBranch', $scene->branch);?>
<?php js::set('tab', $this->app->tab);?>
<?php if($this->app->tab == 'execution') js::set('objectID', $executionID);?>
<div id='mainContent' class='main-content'>
<div class='center-block'>
<?php
$showid = substr($scene->id, 1);
$showid = preg_replace('/^0+/', '', $showid);
?>
<div class='main-header'>
<h2>
<span class='label label-id'><?php echo $showid;?></span>
<?php echo $scene->title;?>
</h2>
</div>
<form method='post' enctype='multipart/form-data' target='hiddenwin' id='dataform'>
<table class='table table-form'>
<tbody>
<tr>
<th><?php echo $lang->testcase->product;?></th>
<td>
<div class='input-group'>
<?php echo html::select('product', $products, $productID, "onchange='loadAllNew(this.value);' class='form-control chosen'");?>
<?php if(isset($product->type) and $product->type != 'normal') echo html::select('branch', $branchTagOption, $scene->branch, "onchange='loadBranchNew();' class='form-control' style='width:120px'");?>
</div>
</td>
<td style='padding-left:15px;'>
<div class='input-group' id='moduleIdBox'>
<span class="input-group-addon w-80px"><?php echo $lang->testcase->module?></span>
<?php
echo html::select('module', $moduleOptionMenu, $currentModuleID, "onchange='loadModuleRelatedNew();' class='form-control chosen'");
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=case&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModulesNew($productID)'");
echo '</span>';
}
?>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->testcase->parentScene;?></th>
<td colspan='2'>
<div class='input-group' id='sceneIdBox'>
<?php echo html::select('parent', $sceneOptionMenu, $currentParentID, "class='form-control chosen'");?>
</div>
</td>
</tr>
<tr>
<th><?php echo $lang->testcase->sceneTitle;?></th>
<td class="required" colspan='2'>
<div class="input-group title-group">
<div class="input-control has-icon-right">
<?php echo html::input('title',$scene->title, "class='form-control'");?>
</div>
</div>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan='3' class='text-center form-actions'>
<?php echo html::submitButton();?>
<?php echo $gobackLink ? html::a($gobackLink, $lang->goback, '', 'class="btn btn-wide"') : html::backButton();?>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
<?php js::set('caseModule', $lang->testcase->module)?>
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
+108
View File
@@ -0,0 +1,108 @@
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
<script>
function setDownloading()
{
if(navigator.userAgent.toLowerCase().indexOf("opera") > -1) return true; // Opera don't support, omit it.
$.cookie('downloading', 0);
time = setInterval("closeWindow()", 300);
return true;
}
function closeWindow()
{
if($.cookie('downloading') == 1)
{
parent.$.closeModal();
$.cookie('downloading', null);
clearInterval(time);
}
}
</script>
<style>
.xmind-title { font-size:14px; font-weight:700; margin-bottom:10px;}
.group-label { line-height:25px; margin-left:10px;}
.product-name { max-width: 440px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
</style>
<div id='mainContent' class='main-content'>
<div class='main-header'>
<h2><?php echo $lang->testcase->xmindExport;?></h2>
</div>
<form method='post' target='hiddenwin' onsubmit='setDownloading();' style='padding: 0px 5% 20px;'>
<input name="download" type="hidden" value="download"/>
<table class='w-p100 table table-form'>
<tr>
<td>
<span style="display: inline-block; margin-bottom: 5px;" class='xmind-title'>
<?php echo $lang->testcase->xmindExportSetting;?>
</span>
<div style="margin-bottom: 2px;" class="row">
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingModule;?></span>
<?php echo html::input('module', $settings['module'], "class='form-control' placeholder='M'");?>
</div>
</div>
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingScene;?></span>
<?php echo html::input('scene', $settings['scene'], "class='form-control' placeholder='S'");?>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingCase;?></span>
<?php echo html::input('case', $settings['case'], "class='form-control' placeholder='C'");?>
</div>
</div>
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingPri;?></span>
<?php echo html::input('pri', $settings['pri'], "class='form-control' placeholder='P'");?>
</div>
</div>
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingGroup;?></span>
<?php echo html::input('group', $settings['group'], "class='form-control' placeholder='G'");?>
</div>
</div>
</div>
</td>
<td class="w-150px"/>
</tr>
<tr>
<td>
<div class="row">
<div class="col-sm-12">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->product;?></span>
<span class="form-control product-name" title='<?php echo $productName; ?>' ><?php echo $productName;?></span>
</div>
</div>
</div>
</td>
<td>
</td>
</tr>
<tr>
<td>
<div class="row">
<div class="col-sm-12">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->module;?></span>
<?php echo html::select('imodule', $moduleOptionMenu, $moduleID, "class='form-control chosen'"); ?>
</div>
</div>
</div>
</td>
<td>
<?php echo html::submitButton();?>
</td>
</tr>
</table>
</form>
</div>
<?php include $app->getModuleRoot() . 'common/view/footer.lite.html.php';?>
+72
View File
@@ -0,0 +1,72 @@
<?php include $app->getModuleRoot() . 'common/view/header.lite.html.php';?>
<style>
.xmind-title {
font-size:14px;
font-weight:700;
margin-bottom:10px;
}
</style>
<main id="main">
<div class="container">
<div id="mainContent" class='main-content'>
<div class='main-header'>
<h2><?php echo $lang->testcase->xmindImport;?></h2>
</div>
<form method='post' enctype='multipart/form-data' target='hiddenwin' style="padding: 0px 3% 20px;">
<table class='table table-form w-p100'>
<tr>
<td>
<span style="display: inline-block; margin-bottom: 5px;" class='xmind-title'>
<?php echo $lang->testcase->xmindImportSetting;?>
</span>
<div style="margin-bottom: 2px;" class="row">
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingModule;?></span>
<?php echo html::input('module', $settings['module'], "class='form-control' placeholder='M'");?>
</div>
</div>
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingScene;?></span>
<?php echo html::input('scene', $settings['scene'], "class='form-control' placeholder='S'");?>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingCase;?></span>
<?php echo html::input('case', $settings['case'], "class='form-control' placeholder='C'");?>
</div>
</div>
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingPri;?></span>
<?php echo html::input('pri', $settings['pri'], "class='form-control' placeholder='P'");?>
</div>
</div>
<div class="col-sm-4">
<div class="input-group">
<span class="input-group-addon"><?php echo $lang->testcase->settingGroup;?></span>
<?php echo html::input('group', $settings['group'], "class='form-control' placeholder='G'");?>
</div>
</div>
</div>
</td>
<td class="w-150px"></td>
</tr>
<tr>
<td align='center'>
<input type='file' name='file' class='form-control'/>
</td>
<td>
<?php echo html::submitButton('', '', 'btn btn-primary btn-block');?>
</td>
</tr>
</table>
</form>
</div>
</div>
</main>
<?php include $app->getModuleRoot() . 'common/view/footer.lite.html.php';?>
@@ -0,0 +1,96 @@
<?php
/**
* The create view of case 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 case
* @version $Id: create.html.php 4904 2013-06-26 05:37:45Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php include $app->getModuleRoot() . 'common/view/header.html.php';?>
<?php include '../../common/view/mindmap.html.php' ?>
<?php js::set('productID', $productID);?>
<?php js::set('branch', $branch);?>
<?php js::set('userConfig_module', $settings['module']);?>
<?php js::set('userConfig_scene', $settings['scene']);?>
<?php js::set('userConfig_case', $settings['case']);?>
<?php js::set('userConfig_pri', $settings['pri']);?>
<?php js::set('userConfig_group', $settings['group']);?>
<?php js::set('jsLng',$jsLng);?>
<div id='mainContent' class='main-content' style="min-width:1000px;min-height:500px;">
<div class='center-block'>
<div class='main-header'>
<h2><?php echo $lang->testcase->xmindImportEdit;?>(<?php echo $product->name;?>)</h2>
<div class="pull-right btn-toolbar">
<!-- Place buttons for switching between XMind and table. -->
</div>
</div>
<form class='load-indicator main-form'>
<table class='table table-form'>
<tbody>
<tr><td>
<div id="mindmap" class="mindmap" style="height:calc(100vh - 230px)"></div>
</td></tr>
</tbody>
<tfoot>
<tr>
<td class='text-center form-actions'>
<button id="xmindmapSave" type="button" class="btn btn-wide btn-primary"><?php echo $lang->testcase->save;?></button>
<?php echo $gobackLink ? html::a($gobackLink, $lang->goback, '', 'class="btn btn-wide"') : html::backButton();?>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
<div class="modal fade" id="moduleSelector">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only"><?php echo $lang->testcase->close;?></span></button>
<h4 class="modal-title"><?php echo $lang->testcase->moduleSelector;?></h4>
</div>
<div class="modal-body">
<table class='table table-form'>
<tbody>
<tr>
<td>
<div class='input-group' id='moduleNameBox'>
<span class="input-group-addon w-80px"><?php echo $lang->testcase->product;?></span>
<?php echo html::input('productName', $product->name, 'disabled', '');?>
</div>
</td>
<td style='padding-left:15px;'>
<div class='input-group' id='moduleIdBox'>
<span class="input-group-addon w-80px"><?php echo $lang->testcase->module;?></span>
<?php
echo html::select('module', $moduleOptionMenu, "/", "class='form-control chosen'");
if(count($moduleOptionMenu) == 1)
{
echo "<span class='input-group-addon'>";
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=case&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
echo '</span>';
}
?>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal"><?php echo $lang->testcase->close;?></button>
<button id="sceneProperySave" type="button" class="btn btn-primary"><?php echo $lang->testcase->save;?></button>
</div>
</div>
</div>
</div>
<?php include $app->getModuleRoot() . 'common/view/footer.html.php';?>
+5
View File
@@ -338,8 +338,13 @@ class testsuite extends control
$this->loadModel('testcase');
$this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, $viewType = 'case', 0, 'all');
$this->config->testcase->search['params']['lib']['values'] = $this->loadModel('caselib')->getLibraries();
$this->config->testcase->search['module'] = 'testsuite';
$this->config->testcase->search['actionURL'] = inlink('linkCase', "suiteID=$suiteID&param=myQueryID");
$scene = $this->testcase->getSceneMenu($productID, 0, '', 0, 0,0);
$this->config->testcase->search['params']['scene']['values'] = array('' => '') + $scene;
unset($this->config->testcase->search['fields']['product']);
unset($this->config->testcase->search['params']['product']);
unset($this->config->testcase->search['fields']['branch']);
+5 -2
View File
@@ -540,6 +540,7 @@ class testtask extends control
$this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, $viewType = 'case');
$this->config->testcase->search['params']['status']['values'] = array('' => '') + $this->lang->testcase->statusList;
$this->config->testcase->search['params']['lib']['values'] = $this->loadModel('caselib')->getLibraries();
$this->config->testcase->search['params']['scene']['values'] = $this->testcase->getSceneMenu($productID, $moduleID, 'case', 0, 0);
$this->config->testcase->search['queryID'] = $queryID;
$this->config->testcase->search['fields']['assignedTo'] = $this->lang->testtask->assignedTo;
@@ -1109,8 +1110,10 @@ class testtask extends control
$this->loadModel('testcase');
$this->config->testcase->search['params']['product']['values'] = array($productID => $this->products[$productID]);
$this->config->testcase->search['params']['module']['values'] = $this->loadModel('tree')->getOptionMenu($productID, 'case', 0, $task->branch);
$this->config->testcase->search['actionURL'] = inlink('linkcase', "taskID=$taskID&type=$type&param=$param");
$this->config->testcase->search['style'] = 'simple';
$this->config->testcase->search['actionURL'] = inlink('linkcase', "taskID=$taskID&type=$type&param=$param");
$this->config->testcase->search['params']['scene']['values'] = $this->testcase->getSceneMenu($productID, 0, $viewType = 'case', $startSceneID = 0, 0);
$this->config->testcase->search['style'] = 'simple';
$build = $this->loadModel('build')->getByID($task->build);
$stories = array();
+10 -10
View File
@@ -448,26 +448,26 @@ $config->delete['18_4'][] = 'extension/max/report/ext/view/projectworkload.html.
$config->delete['18_4'][] = 'extension/max/report/ext/view/customeredreport.html.php';
$config->delete['18_4'][] = 'extension/max/report/ext/view/instancetemplate.html.php';
$config->delete['18_4'][] = 'extension/max/report/ext/view/blockreportlist.html.php';
$config->delete['18_4'][] = 'extension/biz/common/ext/lang/zh-cn/crystal.php';
$config->delete['18_4'][] = 'extension/biz/common/ext/lang/en/crystal.php';
$config->delete['18_4'][] = 'extension/biz/common/ext/lang/de/crystal.php';
$config->delete['18_4'][] = 'extension/biz/common/ext/lang/fr/crystal.php';
$config->delete['18_4'][] = 'extension/biz/common/ext/lang/zh-tw/crystal.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/zh-cn/export.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/en/export.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/de/export.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/fr/export.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/zh-tw/export.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/zh-cn/crystal.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/en/crystal.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/de/crystal.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/fr/crystal.php';
$config->delete['18_4'][] = 'extension/biz/group/ext/lang/zh-tw/crystal.php';
$config->delete['18_4'][] = 'extension/max/common/ext/lang/zh-cn/crystal.php';
$config->delete['18_4'][] = 'extension/max/common/ext/lang/en/crystal.php';
$config->delete['18_4'][] = 'extension/max/common/ext/lang/de/crystal.php';
$config->delete['18_4'][] = 'extension/max/common/ext/lang/fr/crystal.php';
$config->delete['18_4'][] = 'extension/max/common/ext/lang/zh-tw/crystal.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/zh-cn/export.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/en/export.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/de/export.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/fr/export.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/zh-tw/export.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/zh-cn/crystal.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/en/crystal.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/de/crystal.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/fr/crystal.php';
$config->delete['18_4'][] = 'extension/max/group/ext/lang/zh-tw/crystal.php';
$config->upgrade->openModules = array('action', 'admin', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'caselib', 'chart', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dataview', 'dept', 'design', 'dev', 'dimension', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'pivot', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode', 'editor');
+4 -4
View File
@@ -199,7 +199,7 @@ class zanodemodel extends model
if(!empty($result) and $result->code == 'success')
{
$this->dao->update(TABLE_HOST)->set('status')->eq(static::STATUS_CREATING_IMG)->where('id')->eq($node->id)->exec();
$this->dao->update(TABLE_ZAHOST)->set('status')->eq(static::STATUS_CREATING_IMG)->where('id')->eq($node->id)->exec();
return $newID;
}
@@ -259,7 +259,7 @@ class zanodemodel extends model
if(!empty($result) and $result->code == 'success')
{
$this->loadModel('action')->create('zanode', $zanodeID, 'createdSnapshot', '', $data->name);
$this->dao->update(TABLE_HOST)->set('status')->eq(static::STATUS_CREATING_SNAP)->where('id')->eq($node->id)->exec();
$this->dao->update(TABLE_ZAHOST)->set('status')->eq(static::STATUS_CREATING_SNAP)->where('id')->eq($node->id)->exec();
return $newID;
}
@@ -309,7 +309,7 @@ class zanodemodel extends model
if(!empty($result) and $result->code == 'success')
{
$this->dao->update(TABLE_HOST)->set('status')->eq(static::STATUS_CREATING_SNAP)->where('id')->eq($node->id)->exec();
$this->dao->update(TABLE_ZAHOST)->set('status')->eq(static::STATUS_CREATING_SNAP)->where('id')->eq($node->id)->exec();
return $newID;
}
@@ -383,7 +383,7 @@ class zanodemodel extends model
if(!empty($result) and $result->code == 'success')
{
$this->dao->update(TABLE_HOST)->set('status')->eq('restoring')->where('id')->eq($node->id)->exec();
$this->dao->update(TABLE_ZAHOST)->set('status')->eq('restoring')->where('id')->eq($node->id)->exec();
$this->loadModel('action')->create('zanode', $zanodeID, 'restoredsnapshot', '', $snap->name);
return true;
}
+312
View File
@@ -0,0 +1,312 @@
/*!
* ZUI: 思维导图 - v1.10.0 - 2022-05-20
* http://openzui.com
* GitHub: https://github.com/easysoft/zui.git
* Copyright (c) 2022 cnezsoft.com; Licensed MIT
*/
.mindmap
{
position: relative;
z-index: 0;
overflow: hidden;
}
.mindmap-container
{
position: absolute;
top: 0;
left: 0;
z-index: 1;
width: 100%;
height: 100%;
background: #fff;
border: 1px solid #e5e5e5;
}
.mindmap-container.dragging
{
cursor: pointer;
}
.mindmap-bg
{
position: absolute;
top: 0;
left: 0;
z-index: 5;
max-width: inherit;
}
.mindmap-desktop
{
position: absolute;
top: 0;
left: 0;
z-index: 10;
width: 100%;
height: 100%;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
}
.mindmap-node
{
position: absolute;
border-radius: 24px;
}
.mindmap-node > .wrapper
{
min-height: 28px;
background: #ebf2f9;
border: 4px solid #aaa;
border-radius: 22px;
-webkit-transition: all .2s cubic-bezier(.175, .885, .32, 1);
-o-transition: all .2s cubic-bezier(.175, .885, .32, 1);
transition: all .2s cubic-bezier(.175, .885, .32, 1);
}
.mindmap-node > .wrapper > .text
{
padding: 8px 12px;
font-size: 14px;
font-weight: bold;
cursor: default;
}
.mindmap-node > .wrapper > .text *
{
display: inline;
}
.mindmap-node > .wrapper > .text br
{
display: none;
}
.mindmap-node > .wrapper > .text:focus
{
outline: none;
}
.mindmap-node > .wrapper > .text:empty:not(:focus)
{
position: relative;
top: 7px;
min-width: 10px;
min-height: 10px;
background: #508dee;
border-radius: 50%;
}
.mindmap-node > .wrapper > .caption
{
display: none;
}
.mindmap-node:hover
{
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .4);
box-shadow: 0 0 5px rgba(0, 0, 0, .4);
}
.mindmap-node:hover > .wrapper
{
border-color: #999;
}
.mindmap-node[data-type="root"] > .wrapper
{
min-width: 45px;
min-height: 45px;
}
.mindmap-node[data-type="root"] > .wrapper > .text
{
text-align: center;
}
.mindmap-node[data-type="root"] > .wrapper > .text:empty:not(:focus)
{
top: 0;
min-width: 37px;
min-height: 37px;
background: none;
border-radius: 50%;
}
.mindmap-node[data-type="sub"]
{
border-radius: 6px;
}
.mindmap-node[data-type="sub"] > .wrapper
{
background: #fff;
border-width: 2px;
border-radius: 5px;
}
.mindmap-node[data-type="sub"] > .wrapper > .text
{
padding: 3px 5px;
font-size: 13px;
font-weight: normal;
}
.mindmap-node[data-type="sub"] > .wrapper > .text:empty:not(:focus)
{
background: none;
}
.mindmap-node[data-type="node"]
{
border-radius: 4px;
}
.mindmap-node[data-type="node"] > .wrapper
{
background: transparent;
border: 2px solid transparent;
border-radius: 3px;
}
.mindmap-node[data-type="node"] > .wrapper > .text
{
padding: 3px 3px;
font-size: 13px;
font-weight: normal;
}
.mindmap-node[data-type="node"]:hover > .wrapper
{
color: #353535;
background: #fff;
border-color: #999;
}
.mindmap-node.active,
.mindmap-node.active:hover,
.mindmap-node.drag-shadow
{
z-index: 900;
-webkit-box-shadow: none;
box-shadow: none;
}
.mindmap-node.active > .wrapper,
.mindmap-node.active:hover > .wrapper,
.mindmap-node.drag-shadow > .wrapper
{
color: #fff;
background: #508dee;
border-color: #2a74ea;
}
.mindmap-node.focus,
.mindmap-node.focus:hover,
.mindmap-node.drop-to
{
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(20, 92, 205, .6);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(20, 92, 205, .6);
}
.mindmap-node.focus > .wrapper,
.mindmap-node.focus:hover > .wrapper,
.mindmap-node.drop-to > .wrapper
{
color: #353535;
background: #fff;
border-color: #145ccd;
}
.mindmap-node.focus > .wrapper > .text,
.mindmap-node.focus:hover > .wrapper > .text,
.mindmap-node.drop-to > .wrapper > .text
{
cursor: text;
}
.mindmap-node .btn-toggle
{
position: absolute;
top: 50%;
right: -14px;
display: none;
width: 16px;
height: 16px;
margin-top: -9px;
font-size: 16px;
line-height: 12px;
color: #fff;
text-align: center;
cursor: pointer;
visibility: hidden;
background: #808080;
border: 1px solid transparent;
border-radius: 50%;
opacity: 0;
-webkit-transition-duration: .2s;
-o-transition-duration: .2s;
transition-duration: .2s;
-webkit-transition-property: visibility, opacity, border-color, -webkit-box-shadow;
-o-transition-property: visibility, opacity, border-color, box-shadow;
transition-property: visibility, opacity, border-color, -webkit-box-shadow;
transition-property: visibility, opacity, border-color, box-shadow;
transition-property: visibility, opacity, border-color, box-shadow, -webkit-box-shadow;
}
.mindmap-node .btn-toggle:hover
{
background: #3280fc;
border-color: rgba(0, 0, 0, .1);
-webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .4);
box-shadow: 0 0 5px rgba(0, 0, 0, .4);
}
.mindmap-node .btn-toggle:before
{
content: '-';
}
.mindmap-node.mindmap-side-left .btn-toggle
{
right: auto;
left: -14px;
}
.mindmap-node.mindmap-collapesed .btn-toggle:before
{
content: '+';
}
.mindmap-node[data-type="root"] .btn-toggle
{
display: none!important;
}
.mindmap-show-toggle-btn .mindmap-has-child .btn-toggle
{
display: block;
}
.mindmap-show-toggle-btn .mindmap-node.focus .btn-toggle
{
display: none;
}
.mindmap-show-toggle-btn .mindmap-node.mindmap-collapesed .btn-toggle,
.mindmap-show-toggle-btn .mindmap-node:hover .btn-toggle
{
visibility: visible;
opacity: 1;
}
.mindmap-shadow
{
position: absolute;
z-index: 1000;
width: 100%;
height: 100%;
-webkit-transition: all .4s cubic-bezier(.175, .885, .32, 1);
-o-transition: all .4s cubic-bezier(.175, .885, .32, 1);
transition: all .4s cubic-bezier(.175, .885, .32, 1);
}
.mindmap-shadow.shadow-left,
.mindmap-shadow.shadow-right
{
top: 0;
width: 20px;
}
.mindmap-shadow.shadow-left
{
left: -20px;
}
.mindmap-shadow.shadow-right
{
right: -20px;
}
.mindmap-shadow.shadow-top,
.mindmap-shadow.shadow-bottom
{
left: 0;
height: 20px;
}
.mindmap-shadow.shadow-top
{
top: -20px;
}
.mindmap-shadow.shadow-bottom
{
bottom: -20px;
}
.shadow-left > .shadow-left,
.shadow-right > .shadow-right,
.shadow-top > .shadow-top,
.shadow-bottom > .shadow-bottom
{
-webkit-box-shadow: 0 0 8px rgba(0, 0, 0, .8);
box-shadow: 0 0 8px rgba(0, 0, 0, .8);
}
+12
View File
@@ -0,0 +1,12 @@
/*!
* jQuery Hotkeys Plugin
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
*
* Based upon the plugin by Tzury Bar Yochay:
* http://github.com/tzuryby/hotkeys
*
* Original idea by:
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
*/
!function(e){function t(t){if("string"==typeof t.data){var s=t.handler,a=t.data.toLowerCase().split(" ");t.handler=function(t){if(this===t.target||!/textarea|select/i.test(t.target.nodeName)&&"text"!==t.target.type){var r="keypress"!==t.type&&e.hotkeys.specialKeys[t.which],f=String.fromCharCode(t.which).toLowerCase(),i="",h={};t.altKey&&"alt"!==r&&(i+="alt+"),t.ctrlKey&&"ctrl"!==r&&(i+="ctrl+"),t.metaKey&&!t.ctrlKey&&"meta"!==r&&(i+="meta+"),t.shiftKey&&"shift"!==r&&(i+="shift+"),r?h[i+r]=!0:(h[i+f]=!0,h[i+e.hotkeys.shiftNums[f]]=!0,"shift+"===i&&(h[e.hotkeys.shiftNums[f]]=!0));for(var o=0,c=a.length;o<c;o++)if(h[a[o]])return s.apply(this,arguments)}}}}e.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",191:"/",224:"meta"},shiftNums:{"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"}},e.each(["keydown","keyup","keypress"],function(){e.event.special[this]={add:t}})}(jQuery);
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More