Merge branch '15.0.beta3' of https://gitlab.zcorp.cc/easycorp/zentaopms into 15.0.beta3
This commit is contained in:
@@ -1 +1,7 @@
|
||||
<?php
|
||||
$config->automation->ztfSite = 'http://www.ztesting.net';
|
||||
$config->automation->ztfDownload = 'https://ztf.im/ztf.html';
|
||||
$config->automation->ztfManual = 'https://ztf.im/book/ztf/ztf-about-26.html';
|
||||
$config->automation->zendataSite = 'https://www.zendata.cn';
|
||||
$config->automation->zendataDownload = 'https://www.zendata.cn/download.html';
|
||||
$config->automation->zendataManual = 'https://www.zendata.cn/book/zendata/why-zendata-115.html';
|
||||
|
||||
@@ -36,16 +36,7 @@ class automation extends control
|
||||
public function __construct($moduleName = '', $methodName = '')
|
||||
{
|
||||
parent::__construct($moduleName, $methodName);
|
||||
|
||||
/* Set testtask menu group. */
|
||||
$this->projectID = isset($_GET['PRJ']) ? $_GET['PRJ'] : 0;
|
||||
if(!$this->projectID)
|
||||
{
|
||||
$this->app->loadConfig('qa');
|
||||
foreach($this->config->qa->menuList as $module) $this->lang->navGroup->$module = 'qa';
|
||||
}
|
||||
|
||||
$this->view->products = $this->products = $this->loadModel('product')->getProductPairsByProject($this->projectID);
|
||||
$this->view->products = $this->products = $products = $this->loadModel('product')->getPairs();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,200 +12,55 @@
|
||||
$lang->automation->common = '自动化测试';
|
||||
$lang->automation->browse = '首页';
|
||||
|
||||
$lang->automation->description = '自动化测试解决方案';
|
||||
$lang->automation->ztf = 'ZTF自动化测试管理框架';
|
||||
$lang->automation->zendata = 'ZenData数据生成工具';
|
||||
$lang->automation->title = '自动化测试解决方案——两款工具';
|
||||
|
||||
$lang->automation->details = <<<EOF
|
||||
<article class="article">
|
||||
<header>
|
||||
<h1 class="text-center">自动化测试解决方案</h1>
|
||||
<div class="abstract">
|
||||
<p>
|
||||
摘要:欢迎使用禅道提供的自动化解决方案,本次为大家带来了两款工具。Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
|
||||
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
$lang->automation->ztfSite = '禅道ZTF官网';
|
||||
$lang->automation->ztfDownload = 'ZTF框架下载';
|
||||
$lang->automation->ztfManual = 'ZTF框架手册';
|
||||
|
||||
<section class="content">
|
||||
<h2>ZTF自动化测试管理框架</h2>
|
||||
<p>
|
||||
Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
|
||||
和市面上已有的自动化测试框架相比,ZTF更聚焦于自动化测试的管理功能。
|
||||
ZTF提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug的创建以及和其他自动化测框架的集成。
|
||||
ZTF使用go语言开发,可以支持各种平台。ZTF支持常见的编程语言,您可以选择您喜欢用的语言来开发自动化测试脚本。
|
||||
</p>
|
||||
<div class="section">
|
||||
<div class="text-left" style="padding:25px 15px 10px 15px;">
|
||||
<p>
|
||||
<a href="https://ztf.im/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">禅道ZTF官网</a>
|
||||
<a href="https://ztf.im/ztf.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架下载</a>
|
||||
<a href="https://ztf.im/book/ztf/ztf-about-26.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架手册</a>
|
||||
</p>
|
||||
<div style="margin-top:15px;" class="text-muted">
|
||||
<p>
|
||||
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
|
||||
</p>
|
||||
<p>
|
||||
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h2>ZenData数据生成工具</h2>
|
||||
<p>
|
||||
ZenData主要两大功能:数据生成和数据解析。通过一个配置文件,可以使用ZenData生成您想要的各种数据。
|
||||
同样也可以对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。
|
||||
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。还可以一键生成海量数据用于性能和压力测试。
|
||||
</p>
|
||||
<div class="section">
|
||||
<div class="text-left" style="padding:25px 15px 10px 15px;">
|
||||
<p>
|
||||
<a href="https://www.zendata.cn/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData官网</a>
|
||||
<a href="https://www.zendata.cn/download.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData下载</a>
|
||||
<a href="https://www.zendata.cn/book/zendata/why-zendata-115.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData手册</a>
|
||||
</p>
|
||||
<div style="margin-top:15px;" class="text-muted">
|
||||
<p>
|
||||
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
|
||||
</p>
|
||||
<p>
|
||||
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</article>
|
||||
EOF;
|
||||
$lang->automation->ztfDetails = <<<EOF
|
||||
<article class="article">
|
||||
<header>
|
||||
<h1 class="text-center">ZTF自动化测试管理框架</h1>
|
||||
<div class="abstract">
|
||||
<p>
|
||||
摘要:Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
$lang->automation->ztfFeature1 = 'ZTF为你解决各种问题';
|
||||
$lang->automation->ztfFeature2 = 'ZTF为你解决如下问题';
|
||||
$lang->automation->ztfFeature3 = '用例信息的管理';
|
||||
$lang->automation->ztfFeature4 = '测试结果的对比';
|
||||
$lang->automation->ztfFeature5 = '测试脚本的执行';
|
||||
$lang->automation->ztfFeature6 = '缺陷Bug的提交';
|
||||
|
||||
<section class="content">
|
||||
<h4>一、ZTF是什么</h4>
|
||||
<p>
|
||||
Zentao Testing Framework,简称ZTF,是一款开源自动化测试管理框架。
|
||||
和市面上已有的自动化测试框架相比,ZTF更聚焦于自动化测试的管理功能。
|
||||
ZTF提供了自动化测试脚本的定义、管理、驱动、执行结果的回传、bug的创建以及和其他自动化测框架的集成。
|
||||
ZTF使用go语言开发,可以支持各种平台。ZTF支持常见的编程语言,您可以选择您喜欢用的语言来开发自动化测试脚本。
|
||||
</p>
|
||||
<h4>二、为什么来做ZTF</h4>
|
||||
<p>
|
||||
市面上已经有很多自动化测试框架,我们为什么还要来做ZTF呢?ZTF主要是解决测试管理的问题。
|
||||
目前市面上的自动化测试框架主要分为两大类,一类是单元测试框架,一类是某种领域的自动化测试框架。
|
||||
单元测试框架是跟各个语言绑定的,比如cppunit, phpunit等。第二类框架以selenium为代表,可以用来做web的自动化测试。
|
||||
也还有做GUI或者手机应用乃至游戏等场景的自动化测试的框架。
|
||||
</p>
|
||||
<p>
|
||||
这就产生了一个问题,我们需要将这些自动化测试框架的测试脚本统一管理起来。
|
||||
每一个脚本都可以和测试管理系统里面的一个用例进行关联,脚本里面的步骤信息和管理系统里面的用例信息可以互相同步。
|
||||
测试执行的结果可以反映到测试管理系统中,失败的测试脚本可以创建bug。
|
||||
为此我们开发了ZTF测试管理框架。
|
||||
</p>
|
||||
<h4>三、ZTF和其他自动化测试框架的关系</h4>
|
||||
<p>
|
||||
ZTF和其他的自动化测试框架是互相合作的关系。
|
||||
您可以继续使用之前的自动化测试框架来进行脚本的开发,只需要通过注释的方式加入几个标签就可以转换成ztf的自动化测试脚本。
|
||||
</p>
|
||||
<h4>四、ZTF自动化测试框架的特点</h4>
|
||||
<ol>
|
||||
<li>简单:ZTF的语法标签和规则都很简单,一看就会,很容易上手。</li>
|
||||
<li>跨平台:ZTF使用GO语言开发,跨平台,只有一个可执行文件,就可以运行。</li>
|
||||
<li>跨语言:ZTF支持常见的编程语言,你喜欢用什么就用什么。</li>
|
||||
<li>跨框架:ZTF可以和市面上常见的单元测试框架、常见的自动化测试框架都可以很好的集成。</li>
|
||||
<li>工程化:使用ZTF可以真正达到工程化的自动化测试,可以大批量大规模的进行自动化测试的管理和执行。</li>
|
||||
<li>跨场景:借助于其他框架,ZTF可以用来做单元测试、接口测试、web界面测试、GUI界面测试、APP测试等多种场景。</li>
|
||||
</ol>
|
||||
<div class="section">
|
||||
<div class="text-left" style="padding:25px 15px 10px 15px;">
|
||||
<p>
|
||||
<a href="https://ztf.im/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">禅道ZTF官网</a>
|
||||
<a href="https://ztf.im/ztf.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架下载</a>
|
||||
<a href="https://ztf.im/book/ztf/ztf-about-26.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZTF框架手册</a>
|
||||
</p>
|
||||
<div style="margin-top:15px;" class="text-muted">
|
||||
<p>
|
||||
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
|
||||
</p>
|
||||
<p>
|
||||
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</article>
|
||||
EOF;
|
||||
$lang->automation->ztfFeature7 = 'ZTF对环境无任何依赖';
|
||||
$lang->automation->ztfFeature8 = '使用Go语言开发';
|
||||
$lang->automation->ztfFeature9 = '部署无任何依赖';
|
||||
$lang->automation->ztfFeature10 = '所有平台均可运行';
|
||||
$lang->automation->ztfFeature11 = '只有一个可执行文件';
|
||||
|
||||
$lang->automation->zendataDetails = <<<EOF
|
||||
<article class="article">
|
||||
<header>
|
||||
<h1 class="text-center">ZenData数据生成工具</h1>
|
||||
<div class="abstract">
|
||||
<p>
|
||||
摘要:ZenData使用YAML来作为数据类型配置文件实现了数据的生成和解析。
|
||||
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。
|
||||
还可以一键生成海量数据用于性能和压力测试。
|
||||
</p>
|
||||
</div>
|
||||
</header>
|
||||
$lang->automation->ztfFeature12 = 'ZTF对自动化测试方式无要求';
|
||||
$lang->automation->ztfFeature13 = '支持常见的各种开发语言';
|
||||
$lang->automation->ztfFeature14 = '可以和已知测试框架集成';
|
||||
$lang->automation->ztfFeature15 = '对脚本实现方式无要求';
|
||||
|
||||
<section class="content">
|
||||
<h4>一、ZenData的实现原理</h4>
|
||||
<p>
|
||||
ZenData使用YAML来作为数据类型配置文件。对于每一种类型的数据来讲,我们都可以将其拆分成若干的字段。
|
||||
比如我们要测试一个用户的订单表,会有订单的id,用户id或者账户名,订单的名称,订单的金额,订单的时间,订单状态等等字段。
|
||||
我们可以针对每一个字段配置其取值的范围。比如订单id,我可以定义为从1到10000,用户id可以是1-100。
|
||||
这样每一个字段都有了一个取值范围列表。当ZenData来生成数据的时候,从每一个字段里面依次取一个值,将其拼接在一起,就形成了一条记录。
|
||||
大家可以想象成每个字段都是一个转盘,按照自己的频率进行旋转,每一次旋转都从中取出一个值,和其他的字段进行组合。
|
||||
</p>
|
||||
<p>上面说的是最基本的的工作原理,ZenData还提供了步长、随机、循环、引用等多种定义方式,我们会在接下来的手册里面展开讲。</p>
|
||||
<h4>二、ZenData的用途</h4>
|
||||
<p>
|
||||
ZenData主要两大功能:数据生成和数据解析。通过一个配置文件,可以使用ZenData生成您想要的各种数据。
|
||||
同样也可以对某一个数据文件,指定其数据类型定义的配置文件,完成到结构化数据的解析。
|
||||
ZenData可以用于手工测试场景下面测试数据的准备,也可以用于自动化测试脚本里面的数据生成和解析。还可以一键生成海量数据用于性能和压力测试。
|
||||
</p>
|
||||
<h4>三、ZenData主要的特点</h4>
|
||||
<ol>
|
||||
<li>简单无依赖,只有一个可执行文件,即可满足命令行生成和HTTP接口两种数据生成服务。</li>
|
||||
<li>使用配置文件来生成数据,使用人员不需要有开发知识,即可上手应用。</li>
|
||||
<li>提供了功能强大的语法,分组、区间、步长、循环、随机、格式化和前后缀等,配置灵活性极强。</li>
|
||||
<li>支持从文本文件中读取数据,方便用户对字段取值进行精确控制。</li>
|
||||
<li>提供了Excel表格数据的标准SQL查询接口,使用更加灵活。</li>
|
||||
<li>使用预制的序列(ranges)、实例(instances)、配置(config)对定义进行复用,以解决复杂数据格式的定义。</li>
|
||||
<li>语法支持继承和扩展,为定义文件间的复用提供方便。</li>
|
||||
<li>可以反向解析数据,可以对程序的输出进行解析,方便自动化测试脚本进行比对。</li>
|
||||
<li>发行包內置了基础业务数据的定义文件(不断完善中)。</li>
|
||||
<li>提供了HTTP接口数据生成服务,各种语言都可以方便调用。</li>
|
||||
</ol>
|
||||
<div class="section">
|
||||
<div class="text-left" style="padding:25px 15px 10px 15px;">
|
||||
<p>
|
||||
<a href="https://www.zendata.cn/index.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData官网</a>
|
||||
<a href="https://www.zendata.cn/download.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData下载</a>
|
||||
<a href="https://www.zendata.cn/book/zendata/why-zendata-115.html" class="btn btn-primary bg-primary btn-lg" target="_blank">ZenData手册</a>
|
||||
</p>
|
||||
<div style="margin-top:15px;" class="text-muted">
|
||||
<p>
|
||||
我们还提供了QQ群和微信群的交流方式,官方QQ技术支持响应时间为:上午9:00—11:30,下午13:00—17:30(周六周日,节假日休息)
|
||||
</p>
|
||||
<p>
|
||||
软件测试交流群: 522506766 (添加客服微信: easycorp666,可邀请您加入软件测试微信群)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
</article>
|
||||
EOF;
|
||||
$lang->automation->ztfFeature16 = '可批量将禅道测试用例导出为脚本';
|
||||
$lang->automation->ztfFeature17 = '可以将执行结果提交到禅道中';
|
||||
$lang->automation->ztfFeature18 = '可以将执行结果创建为Bug';
|
||||
$lang->automation->ztfFeature19 = 'ZTF和禅道深度集成';
|
||||
|
||||
$lang->automation->zendataSite = 'ZenData官网';
|
||||
$lang->automation->zendataDownload = 'ZenData下载';
|
||||
$lang->automation->zendataManual = 'ZenData手册';
|
||||
|
||||
$lang->automation->zendata = '通用数据生成利器';
|
||||
$lang->automation->zendataFeature1 = '不懂代码也可以使用,轻松上手';
|
||||
$lang->automation->zendataFeature2 = '数据格式完全自定义,无任何限制';
|
||||
$lang->automation->zendataFeature3 = '一键生成百万条数据,毫无压力';
|
||||
|
||||
$lang->automation->zendataFeature4 = '跨平台跨语言';
|
||||
$lang->automation->zendataFeature5 = '运行只需要一个可执行文件';
|
||||
$lang->automation->zendataFeature6 = 'Windows、Linux、MacOS都可以用';
|
||||
$lang->automation->zendataFeature7 = '各种语言都可以用';
|
||||
|
||||
$lang->automation->zendataFeature8 = '各种黑技巧';
|
||||
$lang->automation->zendataFeature9 = '区间,步长,随机,重复,引用';
|
||||
$lang->automation->zendataFeature10 = '指定文件列表,从excel中查询';
|
||||
$lang->automation->zendataFeature11 = '平行生成、递归生成、反向解析';
|
||||
|
||||
$lang->automation->groupTips = '欢迎扫码加入自动化测试QQ交流群';
|
||||
$lang->automation->groupTitle = '软件测试交流群:';
|
||||
$lang->automation->qqGroup = '522506766';
|
||||
$lang->automation->groupDescription = '为软件测试从业者提供的软件测试技术交流社群,分享软件测试工具与方法,帮助大家提升软件测试技能水平。';
|
||||
|
||||
@@ -11,28 +11,178 @@
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<style>
|
||||
.ztf-block {width: 100%; margin-top: 22px; background: linear-gradient(to bottom, #deeaf8 , #f4f7fe); display: inline-flex; box-shadow: 2px 2px 5px #e2dede;}
|
||||
.ztf-logo {width: 40%; height: 190px; display: inline-block; line-height: 190px; text-align: right; padding-right: 65px;}
|
||||
.ztf-download {width: 45%; height: 190px; display: inline-block;}
|
||||
.ztf-download-trait {display: inline-block; width: 100%; margin: 45px 0px 6px 0px; font-weight:bold; font-size: 15px; color: #0c4678;}
|
||||
.ztf-download-trait div {width: 35%; float: left; padding: 8px 0px;}
|
||||
.ztf-download-button {width: 100%;}
|
||||
.ztf-download-button a {margin-right: 15px; font-weight:bold; font-size: 14px;}
|
||||
.dot-symbol{font-size: 12px; margin-right: 5px;}
|
||||
|
||||
.block-content {width: 100%;}
|
||||
.block-details {width: 49%; display: inline-block; padding: 30px 140px; margin-top: 20px; box-shadow: 2px 2px 5px #e2dede;}
|
||||
.block-details-right {float: right;}
|
||||
.block-details p {font-size: 18px; font-weight:bold; margin: 0 0 10px 20px;}
|
||||
.block-details li {width: 40%; float: left; padding: 6px 0px; font-size: 14px; font-weight:bold; color: #666666; text-align: left; list-style:none;}
|
||||
.block-details-line li {width: 100%;}
|
||||
|
||||
.zendata-block {width: 100%; margin-top: 40px; background: linear-gradient(to bottom, #deeaf8 , #f4f7fe); display: inline-flex; box-shadow: 2px 2px 5px #e2dede;}
|
||||
.zendata-logo {width: 40%; height: 170px; display: inline-block; line-height: 170px; text-align: right; padding-right: 90px;}
|
||||
.zendata-download {width: 45%; height: 170px; display: inline-block;}
|
||||
.zendata-download-trait {display: inline-block; width: 100%; margin: 60px 0px 6px 0px; font-weight:bold; font-size: 15px; color: #0c4678;}
|
||||
.zendata-download-trait div {margin-right: 35px; float: left; padding: 8px 0px;}
|
||||
.zendata-download-button {width: 100%;}
|
||||
.zendata-download-button a {margin-right: 15px; font-weight:bold; font-size: 14px;}
|
||||
|
||||
.zentata-content {display: table; width: 100%; table-layout: fixed; margin-top: 20px;}
|
||||
.block-zendata-block {display: table-cell;}
|
||||
.block-zendata {width: 96%; display: inline-block; padding: 30px 40px; margin-top: 20px; box-shadow: 2px 2px 5px #e2dede;}
|
||||
.block-zendata p {font-size: 18px; font-weight:bold; margin: 0 0 10px 20px;}
|
||||
.block-zendata li {width: 100%; float: left; padding: 6px 0px; font-size: 14px; font-weight:bold; color: #666666; text-align: left; list-style:none;}
|
||||
.qr-code {margin-top: 20px; padding: 20px 0px 20px 60px; box-shadow: 2px 2px 5px #e2dede;}
|
||||
.qr-code-img {width: 90px; height: 90px; display: inline-block; float: left;}
|
||||
.qr-code-details {display: inline-block; margin: 10px 0px 0px 10px;}
|
||||
.qr-code-details div{margin: 5px 0px;}
|
||||
.qr-code-group {color: #898989;}
|
||||
@media screen and (max-height: 768px)
|
||||
{
|
||||
.qr-code {padding: 20px 0px 20px 45px;}
|
||||
.block-details li {width: 50%;}
|
||||
.block-details-line li {width: 100%;}
|
||||
.ztf-download-trait div {width: 47%;}
|
||||
.block-details {padding: 30px 60px;}
|
||||
.block-zendata {padding: 30px 25px;}
|
||||
}
|
||||
.btn-automation {background: linear-gradient(to bottom, #0bb6fb, #0d67e1); border: 0px; padding: 8px 12px;}
|
||||
</style>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class="row">
|
||||
<div class="col-xs-2">
|
||||
<ul class="nav nav-tabs nav-stacked">
|
||||
<li class="active"><a href="###" data-target="#tab3Content1" data-toggle="tab"><?php echo $lang->automation->description;?></a></li>
|
||||
<li><a href="###" data-target="#tab3Content2" data-toggle="tab"><?php echo $lang->automation->ztf;?></a></li>
|
||||
<li><a href="###" data-target="#tab3Content3" data-toggle="tab"><?php echo $lang->automation->zendata;?></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-xs-1"></div>
|
||||
<div class="col-xs-10">
|
||||
<div class="tab-content col-xs-10">
|
||||
<div class="tab-pane fade active in" id="tab3Content1">
|
||||
<?php echo $lang->automation->details;?>
|
||||
<div class='text-center'>
|
||||
<h2 style='margin-top: 18px;'><?php echo $lang->automation->title;?></h1>
|
||||
</div>
|
||||
<div class='ztf-block'>
|
||||
<div class='ztf-logo'>
|
||||
<img src='<?php echo $config->webRoot . 'theme/default/images/main/ztf.png';?>' />
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tab3Content2">
|
||||
<?php echo $lang->automation->ztfDetails;?>
|
||||
<div class='ztf-download'>
|
||||
<div class='ztf-download-trait'>
|
||||
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature1;?></span></div>
|
||||
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature19;?></span></div>
|
||||
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature7;?></span></div>
|
||||
<div><span class='dot-symbol'>●</span><span><?php echo $lang->automation->ztfFeature12;?></span></div>
|
||||
</div>
|
||||
<div class="ztf-download-button">
|
||||
<a href="<?php echo $config->automation->ztfSite;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->ztfSite;?></a>
|
||||
<a href="<?php echo $config->automation->ztfDownload;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->ztfDownload;?></a>
|
||||
<a href="<?php echo $config->automation->ztfManual;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->ztfManual;?></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tab3Content3">
|
||||
<?php echo $lang->automation->zendataDetails;?>
|
||||
</div>
|
||||
|
||||
<div class='block-content'>
|
||||
<div class='block-details'>
|
||||
<p><?php echo $lang->automation->ztfFeature2;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature3;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature4;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature5;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature6;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='block-details block-details-right'>
|
||||
<p><?php echo $lang->automation->ztfFeature7;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature8;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature9;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature10;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature11;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='block-details block-details-line'>
|
||||
<p><?php echo $lang->automation->ztfFeature12;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature13;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature14;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature15;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='block-details block-details-line block-details-right'>
|
||||
<p><?php echo $lang->automation->ztfFeature12;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature16;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature17;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->ztfFeature18;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='zendata-block'>
|
||||
<div class='zendata-logo'>
|
||||
<img src='<?php echo $config->webRoot . 'theme/default/images/main/zendata.png';?>' />
|
||||
</div>
|
||||
<div class='zendata-download'>
|
||||
<div class='zendata-download-trait'>
|
||||
<div><span class='dot-symbol'>●</span><?php echo $lang->automation->zendata;?></div>
|
||||
<div><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature4;?></div>
|
||||
<div><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature8;?></div>
|
||||
</div>
|
||||
<div class="zendata-download-button">
|
||||
<a href="<?php echo $config->automation->zendataSite;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->zendataSite;?></a>
|
||||
<a href="<?php echo $config->automation->zendataDownload;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->zendataDownload;?></a>
|
||||
<a href="<?php echo $config->automation->zendataManual;?>" target='_blank' class='btn btn-primary btn-automation'><?php echo $lang->automation->zendataManual;?></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='zentata-content'>
|
||||
<div class='block-zendata-block'>
|
||||
<div class='block-zendata'>
|
||||
<p><?php echo $lang->automation->zendata;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature1;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature2;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature3;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class='block-zendata-block'>
|
||||
<div class='block-zendata'>
|
||||
<p><?php echo $lang->automation->zendataFeature4;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature5;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature6;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature7;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class='block-zendata-block'>
|
||||
<div class='block-zendata' style='width: 100%;'>
|
||||
<p><?php echo $lang->automation->zendataFeature8;?></p>
|
||||
<ul>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature9;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature10;?></li>
|
||||
<li><span class='dot-symbol'>●</span><?php echo $lang->automation->zendataFeature11;?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='qr-code'>
|
||||
<div class='qr-code-img'>
|
||||
<img src='<?php echo $config->webRoot . 'theme/default/images/main/qrcode.png';?>' />
|
||||
</div>
|
||||
<div class='qr-code-details'>
|
||||
<div style='font-size: 16px; font-weight: bold;'><?php echo $lang->automation->groupTips;?></div>
|
||||
<div class='qr-code-group'><span><?php echo $lang->automation->groupTitle;?></span> <span style='color: #1d7cf1;'><?php echo $lang->automation->qqGroup;?></span></div>
|
||||
<div class='qr-code-group'><?php echo $lang->automation->groupDescription;?></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-1"></div>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<style>.table .c-progress {width: 60px;}</style>
|
||||
<?php if(empty($executionStats)): ?>
|
||||
<div class='empty-tip'><?php echo $lang->block->emptyTip;?></div>
|
||||
<?php else:?>
|
||||
@@ -56,10 +57,8 @@
|
||||
<td class="c-hours" title="<?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHour;?>"><?php echo $execution->hours->totalLeft . ' ' . $lang->execution->workHourUnit;?></td>
|
||||
<?php endif;?>
|
||||
<td class="c-progress">
|
||||
<div class="progress progress-text-left">
|
||||
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo $execution->hours->progress;?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo $execution->hours->progress;?>%">
|
||||
<span class="progress-text"><?php echo $execution->hours->progress;?>%</span>
|
||||
</div>
|
||||
<div class='progress-pie' data-doughnut-size='90' data-color='#00da88' data-value='<?php echo $execution->hours->progress;?>' data-width='24' data-height='24' data-back-color='#e8edf3'>
|
||||
<div class='progress-info'><?php echo $execution->hours->progress;?></div>
|
||||
</div>
|
||||
</td>
|
||||
<?php if($longBlock):?>
|
||||
|
||||
@@ -19,7 +19,7 @@ if(!$selfCall) die(include('./todolist.html.php'));
|
||||
.block-todoes .todoes-input .form-control:-ms-input-placeholder {font-size: 12px; line-height: 20px;color: #a4a8b6;}
|
||||
.block-todoes .todoes-input .form-control::placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
|
||||
.block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -20px; max-height: 350px; overflow: auto; overflow-x:hidden}
|
||||
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden; width: 410px;}
|
||||
.block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden;}
|
||||
.block-todoes .todoes > li:hover {background-color: #e9f2fb;}
|
||||
.block-todoes .todo-title {padding: 5px 15px 5px 5px;}
|
||||
.block-todoes .todo-pri {margin: 0 5px;}
|
||||
|
||||
@@ -317,7 +317,7 @@ js::set('blockID', $blockID);
|
||||
<?php echo html::submitButton();?>
|
||||
<?php if($caseID == 0) echo html::backButton();?>
|
||||
<?php echo html::hidden('case', (int)$caseID) . html::hidden('caseVersion', (int)$version);?>
|
||||
<?php echo html::hidden('result', (int)$runID) . html::hidden('testtask', $testtask ? (int)$testtask->id : 0);?>
|
||||
<?php echo html::hidden('result', (int)$runID) . html::hidden('testtask', $testtask ? (int)$testtask : 0);?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
|
||||
@@ -67,7 +67,10 @@
|
||||
<div class='cell'><?php include '../../common/view/action.html.php';?></div>
|
||||
<?php
|
||||
$params = "bugID=$bug->id";
|
||||
$copyParams = "productID=$productID&branch=$bug->branch&extras=bugID=$bug->id,projectID={$bug->project},executionID={$bug->execution}";
|
||||
$extraParams = "extras=bugID=$bug->id";
|
||||
if($this->app->openApp == 'project') $extraParams .= ",projectID={$bug->project}";
|
||||
if($this->app->openApp == 'execution') $extraParams .= ",executionID={$bug->execution}";
|
||||
$copyParams = "productID=$productID&branch=$bug->branch&$extraParams";
|
||||
$convertParams = "productID=$productID&branch=$bug->branch&moduleID=0&from=bug&bugID=$bug->id";
|
||||
?>
|
||||
<div class='main-actions'>
|
||||
|
||||
@@ -294,7 +294,7 @@ $lang->execution->noExecution = "暂时没有{$lang->executionCommon}。
|
||||
$lang->execution->noMembers = '暂时没有团队成员。';
|
||||
$lang->execution->workloadTotal = "工作量占比累计不应当超过100, 当前产品下的工作量之和为%s";
|
||||
// $lang->execution->linkProjectStoryTip = "(关联{$lang->SRCommon}来源于项目下所关联的{$lang->SRCommon})";
|
||||
$lang->execution->linkAllStoryTip = "(项目下还未关联{$lang->SRCommon},可直接关联该迭代/阶段/冲刺所关联产品的{$lang->SRCommon})";
|
||||
$lang->execution->linkAllStoryTip = "(项目下还未关联{$lang->SRCommon},可直接关联该执行所关联产品的{$lang->SRCommon})";
|
||||
|
||||
/* 交互提示。*/
|
||||
$lang->execution->confirmDelete = "您确定删除{$lang->executionCommon}[%s]吗?";
|
||||
|
||||
@@ -1471,7 +1471,7 @@ class story extends control
|
||||
*/
|
||||
public function zeroCase($productID = 0, $branchID = 0, $orderBy = 'id_desc')
|
||||
{
|
||||
$this->session->set('storyList', $this->app->getURI(true), 'product');
|
||||
$this->session->set('storyList', $this->app->getURI(true) . '#app=' . $this->app->openApp, 'product');
|
||||
|
||||
$this->loadModel('testcase');
|
||||
if($this->app->openApp == 'project')
|
||||
|
||||
@@ -45,7 +45,9 @@
|
||||
<tbody>
|
||||
<?php foreach($stories as $key => $story):?>
|
||||
<?php
|
||||
$viewLink = $this->createLink('story', 'view', "storyID=$story->id");
|
||||
if($this->app->openApp == 'project') $param = $this->session->project;
|
||||
if($this->app->openApp == 'execution') $param = $this->session->execution;
|
||||
$viewLink = $this->createLink('story', 'view', "storyID=$story->id&version=0¶m=$param");
|
||||
$canView = common::hasPriv('story', 'view');
|
||||
?>
|
||||
<tr>
|
||||
@@ -57,7 +59,7 @@
|
||||
<?php printf('%03d', $story->id);?>
|
||||
</td>
|
||||
<td><span class='label-pri <?php echo 'label-pri-' . $story->pri;?>' title='<?php echo zget($lang->story->priList, $story->pri);?>'><?php echo zget($lang->story->priList, $story->pri)?></span></td>
|
||||
<td class='text-left' title="<?php echo $story->title?>"><nobr><?php echo html::a($viewLink, $story->title);?></nobr></td>
|
||||
<td class='text-left' title="<?php echo $story->title?>"><nobr><?php echo html::a($viewLink, $story->title, '', "data-app='{$this->app->openApp}'");?></nobr></td>
|
||||
<td title="<?php echo $story->planTitle?>"><?php echo $story->planTitle;?></td>
|
||||
<td><?php echo $lang->story->sourceList[$story->source];?></td>
|
||||
<td><?php echo zget($users, $story->openedBy);?></td>
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
}
|
||||
elseif($hasZeroPriv and $menuType == 'zerocase')
|
||||
{
|
||||
echo html::a($this->createLink('story', 'zeroCase', "productID=$productID&branch=$branch&orderBy=id_desc&from={$this->lang->navGroup->testcase}"), "<span class='text'>{$lang->story->zeroCase}</span>", '', "class='btn btn-link' id='zerocaseTab' data-app='{$this->app->openApp}'");
|
||||
echo html::a($this->createLink('story', 'zeroCase', "productID=$productID&branch=$branch&orderBy=id_desc"), "<span class='text'>{$lang->story->zeroCase}</span>", '', "class='btn btn-link' id='zerocaseTab' data-app='{$this->app->openApp}'");
|
||||
}
|
||||
elseif($hasUnitPriv and $menuType == 'browseunits')
|
||||
{
|
||||
|
||||
@@ -137,7 +137,7 @@ class testtask extends control
|
||||
{
|
||||
/* Save session. */
|
||||
$this->session->set('testtaskList', $this->app->getURI(true), 'qa');
|
||||
$this->session->set('buildList', $this->app->getURI(true), 'execution');
|
||||
$this->session->set('buildList', $this->app->getURI(true) . '#app=' . $this->app->openApp, 'execution');
|
||||
$this->loadModel('testcase');
|
||||
$this->app->loadLang('tree');
|
||||
|
||||
@@ -145,6 +145,8 @@ class testtask extends control
|
||||
$productID = $this->loadModel('product')->saveState($productID, $this->products);
|
||||
if($this->app->openApp == 'project')
|
||||
{
|
||||
$this->lang->scrum->menu->qa['subMenu']->testcase['subModule'] = 'testtask';
|
||||
$this->lang->scrum->menu->qa['subMenu']->testtask['subModule'] = '';
|
||||
$this->loadModel('project')->setMenu($this->session->project);
|
||||
$this->lang->modulePageNav = $this->product->select($this->products, $productID, 'testtask', 'browseUnits');
|
||||
}
|
||||
|
||||
@@ -96,7 +96,6 @@ $(function()
|
||||
{
|
||||
$('#<?php echo $browseType?>UnitTab').addClass('selected');
|
||||
$('#browseunitsTab').addClass('btn-active-text');
|
||||
$('#subNavbar li[data-id="case"]').addClass('active');
|
||||
})
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
<td class='w-60px'><?php if(!empty($result->files)) echo html::a("#caseResult{$result->id}", $lang->files . $fileCount, '', "data-toggle='modal' data-type='iframe'")?></td>
|
||||
<td class='w-50px text-center'><i class='collapse-handle icon-angle-down text-muted'></i></td>
|
||||
</tr>
|
||||
<?php $params = isset($testtask) ? ",testtask=$testtask->id,executionID=$testtask->execution,buildID=$testtask->build" : '';?>
|
||||
<?php $executionParam = $this->app->openApp == 'execution' ? "executionID=$testtask->execution," : '';?>
|
||||
<?php $params = isset($testtask) ? ",testtask=$testtask->id,{$executionParam}buildID=$testtask->build" : '';?>
|
||||
<tr class='result-detail hide' id='tr-detail_<?php echo $trCount++; ?>'>
|
||||
<td colspan='7' class='pd-0'>
|
||||
<?php $projectParam = $this->app->openApp == 'project' ? "projectID={$this->session->project}," : ''?>
|
||||
|
||||
@@ -393,6 +393,7 @@ class treeModel extends model
|
||||
foreach($branches as $branchID => $branch)
|
||||
{
|
||||
$treeMenu = array();
|
||||
if($branchID == 0) $branchID = 'null';
|
||||
$stmt = $this->dbh->query($this->buildMenuQuery($rootID, $type, $startModule, $branchID));
|
||||
while($module = $stmt->fetch()) $this->buildTree($treeMenu, $module, $type, $userFunc, $extra, $branchID);
|
||||
if(!empty($extra) and empty($treeMenu)) continue;
|
||||
|
||||
@@ -635,6 +635,7 @@ class upgradeModel extends model
|
||||
case '15_0':
|
||||
$this->saveLogs('Execute 15_0');
|
||||
$this->execSQL($this->getUpgradeFile('15.0'));
|
||||
$this->adjustWhitelistOfProject();
|
||||
$this->appendExec('15_0');
|
||||
case '15_0_beta1':
|
||||
$this->saveLogs('Execute 15_0_beta1');
|
||||
@@ -4412,8 +4413,10 @@ class upgradeModel extends model
|
||||
{
|
||||
if($sprint->acl != 'private') continue;
|
||||
|
||||
$groups = explode(',', $sprint->whitelist);
|
||||
$groupAccounts = $this->group->getGroupAccounts($groups);
|
||||
$groups = explode(',', $sprint->whitelist);
|
||||
$groupAccounts = $this->group->getGroupAccounts($groups);
|
||||
/* Get the whitelist data from the classic version mode upgrade. */
|
||||
$groupAccounts += $this->dao->select('account')->from(TABLE_ACL)->where('objectID')->eq($sprint->id)->andWhere('objectType')->eq('sprint')->andWhere('type')->eq('whitelist')->fetchPairs('account');
|
||||
$this->personnel->updateWhitelist($groupAccounts, 'sprint', $sprint->id, 'whitelist', 'upgrade');
|
||||
}
|
||||
}
|
||||
@@ -4689,4 +4692,35 @@ class upgradeModel extends model
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjust the whitelist of projects.
|
||||
*
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function adjustWhitelistOfProject()
|
||||
{
|
||||
$projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('acl')->eq('custom')->andWhere('type')->eq('sprint')->fetchAll();
|
||||
foreach($projects as $project)
|
||||
{
|
||||
$groups = explode(',', $project->whitelist);
|
||||
$accounts = $this->dao->select('account')->from(TABLE_USERGROUP)->where('`group`')->in($groups)->fetchPairs('account');
|
||||
foreach($accounts as $account)
|
||||
{
|
||||
$acl = new stdclass();
|
||||
$acl->account = $account;
|
||||
$acl->objectType = $project->type;
|
||||
$acl->objectID = $project->id;
|
||||
$acl->type = 'whitelist';
|
||||
$acl->source = 'upgrade';
|
||||
|
||||
$this->dao->insert(TABLE_ACL)->data($acl)->exec();
|
||||
}
|
||||
|
||||
$this->dao->update(TABLE_PROJECT)->set('acl')->eq('private')->where('id')->eq($project->id)->exec();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1032,7 +1032,7 @@ class userModel extends model
|
||||
$projectType = $type == 'execution' ? 'sprint,stage' : $type;
|
||||
$myProjectsList = $this->dao->select('t1. *,t2. *')->from(TABLE_TEAM)->alias('t1')
|
||||
->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.root = t2.id')
|
||||
->where('t1.type')->in($type)
|
||||
->where('t1.type')->eq($type)
|
||||
->andWhere('t2.type')->in($projectType)
|
||||
->beginIF(strpos('doing|wait|suspended|closed', $status) !== false)->andWhere('status')->eq($status)->fi()
|
||||
->beginIF($status == 'done')->andWhere('status')->in('done,closed')->fi()
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -44,15 +44,18 @@ a.showMoreImage:hover {opacity: 1;}
|
||||
.table-actions .btn {background: #78bdf5; color: #fff; border-color: #78bdf5}
|
||||
.table-footer .checked+div .btn, .table-actions .btn:hover {background: #16a8f8; border-color: #16a8f8}
|
||||
|
||||
#header #toolbar a{color: #3c4353; font-size: 13px; line-height: 15px;}
|
||||
#header #toolbar i{font-size: 16px;}
|
||||
#header #toolbar a {color: #3c4353; font-size: 13px;}
|
||||
#header #toolbar a:hover, .selected a {color: #fff!important;}
|
||||
#header #toolbar i {font-size: 16px;}
|
||||
|
||||
#toolbar {top: 6px;}
|
||||
#navbar .nav>li.divider {margin: 15px 8px 15px 8px;}
|
||||
#navbar .nav>li>a {padding: 10px 10px;}
|
||||
#toolbar {top: 0px; height: 50px;}
|
||||
#userNav {float: none; margin: 0;}
|
||||
#userNav>li {text-align: center}
|
||||
#userNav>li>a {padding: 6px 6px;color: #000; opacity: .9;margin-left: 0px}
|
||||
#userNav>li>a:hover {background: #0c64eb;}
|
||||
#userNav>li>.dropdown-menu {text-align: left;}
|
||||
#userNav>li>a {padding: 10px 5px; color: #000; opacity: .9; margin-left: 0px}
|
||||
#userNav>li>a:hover {height: 50px;}
|
||||
#userNav>li>.dropdown-menu {margin: 0; text-align: left;}
|
||||
#userNav>li>.dropdown-menu a {color: #fff}
|
||||
#userNav>li .lang .dropdown-menu, #userNav>li .theme .dropdown-menu {top: -60px}
|
||||
#userNav .dropdown-menu>li>a>.icon { position: initial; display: inline;}
|
||||
#userNav .dropdown-menu>li>a>.icon { position: initial; display: inline;}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user