Merge branch 'zenops_69'

This commit is contained in:
朱金勇
2023-04-14 04:41:28 +00:00
56 changed files with 9525 additions and 121 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 = '';
+130
View File
@@ -39,6 +39,136 @@ CREATE TABLE IF NOT EXISTS `zt_pivot` (
KEY `group` (`group`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE zt_case ADD scene int(11) DEFAULT 0;
ALTER TABLE zt_case ADD sort int(11) DEFAULT 0;
CREATE TABLE IF NOT EXISTS `zt_scene` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`product` mediumint(8) unsigned NOT NULL DEFAULT 0,
`branch` mediumint(8) unsigned NOT NULL DEFAULT 0,
`module` mediumint(8) unsigned NOT NULL DEFAULT 0,
`title` varchar(255) NOT NULL,
`sort` int(11) unsigned NOT NULL DEFAULT 0,
`openedBy` char(30) NOT NULL DEFAULT '''''',
`openedDate` datetime DEFAULT NULL,
`lastEditedBy` char(30) NOT NULL DEFAULT '',
`lastEditedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`parent` int(11) DEFAULT NULL,
`grade` tinyint(3) DEFAULT NULL,
`path` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE OR REPLACE VIEW `ztv_scenecase` AS SELECT
`zt_case`.`id` AS `id`,
`zt_case`.`title` AS `title`,
`zt_case`.`project` AS `project`,
`zt_case`.`product` AS `product`,
`zt_case`.`execution` AS `execution`,
`zt_case`.`branch` AS `branch`,
`zt_case`.`lib` AS `lib`,
`zt_case`.`module` AS `module`,
`zt_case`.`story` AS `story`,
`zt_case`.`storyVersion` AS `storyVersion`,
`zt_case`.`precondition` AS `precondition`,
`zt_case`.`keywords` AS `keywords`,
`zt_case`.`pri` AS `pri`,
`zt_case`.`type` AS `type`,
`zt_case`.`auto` AS `auto`,
`zt_case`.`frame` AS `frame`,
`zt_case`.`stage` AS `stage`,
`zt_case`.`howRun` AS `howRun`,
`zt_case`.`scriptedBy` AS `scriptedBy`,
`zt_case`.`scriptedDate` AS `scriptedDate`,
`zt_case`.`scriptStatus` AS `scriptStatus`,
`zt_case`.`scriptLocation` AS `scriptLocation`,
`zt_case`.`status` AS `status`,
`zt_case`.`subStatus` AS `subStatus`,
`zt_case`.`color` AS `color`,
`zt_case`.`frequency` AS `frequency`,
IF(`zt_case`.`sort` = 0, `zt_case`.`id`, `zt_case`.`sort`) AS `sort`,
`zt_case`.`openedBy` AS `openedBy`,
`zt_case`.`openedDate` AS `openedDate`,
`zt_case`.`reviewedBy` AS `reviewedBy`,
`zt_case`.`reviewedDate` AS `reviewedDate`,
`zt_case`.`lastEditedBy` AS `lastEditedBy`,
`zt_case`.`lastEditedDate` AS `lastEditedDate`,
`zt_case`.`version` AS `version`,
`zt_case`.`linkCase` AS `linkCase`,
`zt_case`.`fromBug` AS `fromBug`,
`zt_case`.`fromCaseID` AS `fromCaseID`,
`zt_case`.`fromCaseVersion` AS `fromCaseVersion`,
`zt_case`.`deleted` AS `deleted`,
`zt_case`.`lastRunner` AS `lastRunner`,
`zt_case`.`lastRunDate` AS `lastRunDate`,
`zt_case`.`lastRunResult` AS `lastRunResult`,
`zt_case`.`scene` AS `parent`,
`zt_case`.`scene` AS `scene`,
ifnull(`zt_scene`.`grade` + 1 , 1) AS `grade`,
ifnull(
concat(
`zt_scene`.`path`,
`zt_case`.`id`,
','
),
CONVERT(
concat(',' , `zt_case`.`id` , ',') USING utf8
)
) AS `path`,
1 AS `isCase`
FROM (`zt_case` LEFT JOIN `zt_scene` ON( `zt_case`.`scene` = `zt_scene`.`id`+100000000))
UNION
SELECT
`zt_scene`.`id`+ 100000000 AS `id`,
`zt_scene`.`title` AS `title`,
0 AS `project`,
`zt_scene`.`product` AS `product`,
0 AS `execution`,
`zt_scene`.`branch` AS `branch`,
0 AS `lib`,
`zt_scene`.`module` AS `module`,
0 AS `story`,
0 AS `storyVersion`,
'' AS `precondition`,
'' AS `keywords`,
0 AS `pri`,
'' AS `type`,
'' AS `auto`,
'' AS `frame`,
'' AS `stage`,
'' AS `howRun`,
'' AS `scriptedBy`,
'' AS `scriptedDate`,
'' AS `scriptStatus`,
'' AS `scriptLocation`,
'' AS `status`,
'' AS `subStatus`,
'' AS `color`,
'' AS `frequency`,
`zt_scene`.`sort` AS `sort`,
`zt_scene`.`openedBy` AS `openedBy`,
`zt_scene`.`openedDate` AS `openedDate`,
'' AS `reviewedBy`,
'' AS `reviewedDate`,
`zt_scene`.`lastEditedBy` AS `lastEditedBy`,
`zt_scene`.`lastEditedDate` AS `lastEditedDate`,
0 AS `version`,
'' AS `linkCase`,
0 AS `fromBug`,
0 AS `fromCaseID`,
'' AS `fromCaseVersion`,
`zt_scene`.`deleted` AS `deleted`,
'' AS `lastRunner`,
'' AS `lastRunDate`,
'' AS `lastRunResult`,
`zt_scene`.`parent` AS `parent`,
`zt_scene`.`parent` AS `scene`,
`zt_scene`.`grade` AS `grade`,
`zt_scene`.`path` AS `path`,
2 AS `isCase`
FROM `zt_scene`;
CREATE TABLE `zt_chart_back` SELECT * FROM `zt_chart`;
ALTER TABLE `zt_chart` MODIFY `fields` mediumtext NULL;
+132 -1
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>
+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))
+25
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';
+3
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']);
+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) . ' ';
+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();
+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