Merge branch 'zenops_69'
This commit is contained in:
@@ -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';
|
||||
|
||||
|
||||
@@ -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 = '';
|
||||
|
||||
@@ -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
File diff suppressed because one or more lines are too long
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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');
|
||||
?>
|
||||
@@ -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))
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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']);
|
||||
|
||||
@@ -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) . ' ';
|
||||
|
||||
@@ -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';
|
||||
|
||||
+1012
-13
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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 + "¶m=" + 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=¤tModuleID=' + 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();
|
||||
}
|
||||
|
||||
@@ -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 + "¶m=" + 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=¤tModuleID=' + 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();
|
||||
}
|
||||
@@ -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 + "¶m=" + 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=¤tModuleID=' + 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();
|
||||
}
|
||||
|
||||
@@ -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 + "¶m=" + 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=¤tModuleID=' + 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=¤tScene=' + 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
@@ -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';
|
||||
@@ -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';
|
||||
@@ -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
@@ -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';
|
||||
@@ -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 = '模 块';
|
||||
$lang->testcase->settingScene = '场 景';
|
||||
$lang->testcase->settingCase = '测试用例';
|
||||
$lang->testcase->settingPri = '优先级 ';
|
||||
$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 = '场景标题';
|
||||
@@ -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 = '模 块';
|
||||
$lang->testcase->settingScene = '场 景';
|
||||
$lang->testcase->settingCase = '测试用例';
|
||||
$lang->testcase->settingPri = '优先级 ';
|
||||
$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
File diff suppressed because it is too large
Load Diff
@@ -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">
|
||||
|
||||
@@ -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'>
|
||||
|
||||
@@ -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';?>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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¤tModuleID=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'>
|
||||
|
||||
@@ -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¤tModuleID=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';?>
|
||||
@@ -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>
|
||||
@@ -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¤tModuleID=0&branch=$case->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
|
||||
echo ' ';
|
||||
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>';
|
||||
}
|
||||
|
||||
@@ -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¤tModuleID=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';?>
|
||||
@@ -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';?>
|
||||
@@ -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¤tModuleID=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';?>
|
||||
@@ -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¶m=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']);
|
||||
|
||||
@@ -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¶m=$param");
|
||||
$this->config->testcase->search['style'] = 'simple';
|
||||
$this->config->testcase->search['actionURL'] = inlink('linkcase', "taskID=$taskID&type=$type¶m=$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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Vendored
+12
@@ -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
Reference in New Issue
Block a user