Merge branch 'master' into sprint/220
This commit is contained in:
@@ -143,6 +143,7 @@ zentaoxx:
|
||||
sed -i "s#\$this->app->getModuleRoot() . 'im/apischeme.json'#\$this->app->getExtensionRoot() . 'xuan/im/apischeme.json'#g" zentaoxx/extension/xuan/im/model.php
|
||||
sed -i "s/'..\/..\/common\/view\/header.html.php'/\$$app->getModuleRoot() . 'common\/view\/header.html.php'/g" zentaoxx/extension/xuan/conference/view/admin.html.php
|
||||
sed -i "s/'..\/..\/common\/view\/footer.html.php'/\$$app->getModuleRoot() . 'common\/view\/footer.html.php'/g" zentaoxx/extension/xuan/conference/view/admin.html.php
|
||||
sed -i "s/\$$this->im->userGetChangedPassword()/array()/" zentaoxx/extension/xuan/im/control.php
|
||||
echo "ALTER TABLE \`zt_user\` ADD \`pinyin\` varchar(255) NOT NULL DEFAULT '' AFTER \`realname\`;" >> zentaoxx/db/xuanxuan.sql
|
||||
mkdir zentaoxx/tools; cp tools/cn2tw.php zentaoxx/tools; cd zentaoxx/tools; php cn2tw.php
|
||||
cp tools/en2other.php zentaoxx/tools; cd zentaoxx/tools; php en2other.php ../
|
||||
|
||||
@@ -210,7 +210,7 @@ class userEntry extends Entry
|
||||
if(!common::hasPriv('my', 'work')) break;
|
||||
|
||||
$control = $this->loadController('my', 'bug');
|
||||
$control->bug($this->param('type', 'assignedTo'), $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
$control->bug($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -266,7 +266,7 @@ class userEntry extends Entry
|
||||
if(!common::hasPriv('my', 'work')) break;
|
||||
|
||||
$control = $this->loadController('my', 'story');
|
||||
$control->story($this->param('type', 'assignedTo'), $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
$control->story($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -290,7 +290,7 @@ class userEntry extends Entry
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$control = $this->loadController('my', 'issue');
|
||||
$control->issue('createdBy', 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$control->issue('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -307,7 +307,7 @@ class userEntry extends Entry
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$control = $this->loadController('my', 'risk');
|
||||
$control->risk('createdBy', 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$control->risk('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -324,7 +324,7 @@ class userEntry extends Entry
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$control = $this->loadController('my', 'myMeeting');
|
||||
$control->myMeeting('all', 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$control->myMeeting('all', '', 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
|
||||
if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* 基本设置。Basic settings. */
|
||||
$config->version = '17.3'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->version = '17.4'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite.
|
||||
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
|
||||
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -4,7 +4,7 @@ ALTER TABLE `zt_mr` MODIFY COLUMN `targetProject` varchar(50) NOT NULL AFTER `s
|
||||
UPDATE `zt_project` SET `status`='closed' WHERE `type` IN ('sprint', 'stage', 'kanban') AND `model`='' AND `status` = 'done';
|
||||
ALTER TABLE `zt_repo` ADD COLUMN `serviceHost` varchar(50) NOT NULL AFTER `client`;
|
||||
ALTER TABLE `zt_repo` ADD COLUMN `serviceProject` varchar(100) NOT NULL AFTER `serviceHost`;
|
||||
UPDATE `zt_repo` SET `serviceHost` = `client`, `serviceProject` = `path` WHERE `SCM` = 'Gitlab';
|
||||
UPDATE `zt_repo` SET `serviceHost` = `client`, `serviceProject` = `path` WHERE `SCM` = 'Gitlab' AND `client` <> '' AND `path` <> '';
|
||||
UPDATE `zt_repo` SET `client` = '', `path` = '' WHERE `SCM` = 'Gitlab';
|
||||
|
||||
UPDATE `zt_workflowfield` SET `options`='user' WHERE `buildin`='1' AND `options`='8';
|
||||
@@ -13,4 +13,4 @@ INSERT IGNORE INTO `zt_workflowfield` (`module`, `field`, `type`, `length`, `nam
|
||||
('testcase', 'execution', 'mediumint', '8', '所属执行', 'select', '', '44', '0', '', '', 4, 0, 0, '0', '1', '0', '1', 1, '', '', '2022-03-18 09:16:38', '', '0000-00-00 00:00:00'),
|
||||
('task', 'execution', 'mediumint', '8', '所属执行', 'select', '', '44', '0', '', '', 4, 0, 0, '0', '1', '0', '1', 1, '', '', '2022-03-18 09:16:38', '', '0000-00-00 00:00:00'),
|
||||
('bug', 'execution', 'mediumint', '8', '所属执行', 'select', '', '44', '0', '', '', 6, 0, 0, '0', '1', '0', '1', 1, '', '', '2022-03-18 09:16:38', '', '0000-00-00 00:00:00'),
|
||||
('build', 'execution', 'mediumint', '8', '所属执行', 'select', '', '44', '0', '', '', 5, 0, 0, '0', '1', '0', '1', 1, '', '', '2022-03-18 09:16:38', '', '0000-00-00 00:00:00');
|
||||
('build', 'execution', 'mediumint', '8', '所属执行', 'select', '', '44', '0', '', '', 5, 0, 0, '0', '1', '0', '1', 1, '', '', '2022-03-18 09:16:38', '', '0000-00-00 00:00:00');
|
||||
|
||||
+110
@@ -1,3 +1,113 @@
|
||||
2022-07-27 17.4
|
||||
完成的需求
|
||||
开源版:
|
||||
25633 项目集可以按照状态进行检索
|
||||
30848 通用看板团队成员可以从系统通讯录中添加
|
||||
32326 地盘最新动态区块中过滤掉当前用户无权访问的动态
|
||||
32327 组织动态列表中过滤掉当前用户无权访问的动态
|
||||
32331 计划的需求列表打开需求后返回列表时,保持列表排序
|
||||
32679 添加待办页面增加指派给操作
|
||||
33311 Bug关联相关Bug后可以实现互相关联
|
||||
33316 软件需求详情的相关信息中增加相关版本信息
|
||||
33317 软件需求详情的相关信息中增加相关发布信息
|
||||
33594 地盘项目统计区块的排序规则和项目集列表保持一致
|
||||
34037 调整文档中富文本和Markdown类型文档的创建流程
|
||||
34136 详情页点击撤销评审后保留在该页面局部刷新
|
||||
34172 全局设置中增加是否启用代号的设置功能
|
||||
34282 调整文档全局创建流程第一步
|
||||
34285 调整文档全局创建流程第二步
|
||||
34292 文档编辑默认进入创建页面
|
||||
34486 开启或关闭代号功能后项目集的代号信息处理规则
|
||||
34487 开启或关闭代号功能后产品的代号信息处理规则
|
||||
34488 开启或关闭代号功能后项目的代号信息处理规则
|
||||
34489 开启或关闭代号功能后执行的代号信息处理规则
|
||||
34577 已删除的项目集、产品、项目、执行不参与是否同名和同代号的判断
|
||||
34732 专业研发看板项目二级导航中打印设置菜单
|
||||
34733 打印专业研发看板项目设置功能的三级导航菜单
|
||||
34734 实现专业研发看板项目的白名单页面及功能
|
||||
34735 实现专业研发看板项目的产品页面及功能
|
||||
34736 实现专业研发看板项目的团队页面及功能
|
||||
34737 专业研发看板二级导航中打印设置菜单
|
||||
34738 打印看板设置功能的三级导航菜单
|
||||
34739 实现专业研发看板的概况页面及功能
|
||||
34740 实现专业研发看板的产品页面及功能
|
||||
34741 实现专业研发看板的团队页面及功能
|
||||
34806 计划的Bug列表打开Bug后返回列表时,保持列表排序
|
||||
34888 权限成员维护页面支持长按鼠标拖动后批量勾选功能
|
||||
34923 在权限维护页面点击保存后继续保留在当前页面
|
||||
35191 任务提交页面中,测试任务类型的多选文案显示完整
|
||||
35205 实现专业研发看板的白名单页面及功能
|
||||
35305 搜索展开保存条件时,保存搜索条件按钮左移
|
||||
34618 调用API浏览Gitea合并请求列表
|
||||
34619 调用API浏览Gitea合并请求概述
|
||||
34620 调用API查看Gitea合并请求中的代码改动
|
||||
34633 Gitea合并请求可以关联禅道的需求、任务以及Bug
|
||||
34634 调用API创建Gitea合并请求
|
||||
34635 调用API删除Gitea合并请求
|
||||
34636 调用API实现Gitea合并请求的评审
|
||||
34637 Gitea合并请求合并后调用API删除源分支
|
||||
34638 调用API实现Gitea合并请求的合并
|
||||
35241 在合并请求列表显示创建时间
|
||||
35249 合并请求概况页面显示历史记录
|
||||
35251 实现Gitea代码库下的代码对比功能
|
||||
企业版:
|
||||
29884 执行任务导出数据的名称增加来源Bug的信息
|
||||
32192 组织菜单调整为团队、日程、日志、动态、公司
|
||||
33191 加班申请通过后,办公我的考勤列表中操作/状态列展示“已加班”
|
||||
33201 办公考勤的列表的标题字号修改为16px
|
||||
33219 办公公司考勤页面中列表表头固定
|
||||
33222 增加办公公司考勤表格的底部栏高度
|
||||
33242 反馈页的通知改为“接收邮件通知”
|
||||
33244 创建反馈时必填项校验在字段下方红字展示
|
||||
33248 办公请假页面展示逻辑优化
|
||||
33252 反馈功能的权限模块icon调整
|
||||
33254 反馈权限列表中用户数量超出列宽时用省略号示意
|
||||
33397 缩短办公节假日页面中左侧的时间目录宽度
|
||||
33421 运维服务列表页面字段过长时省略显示
|
||||
33423 运维账号页面列表为空时的快捷新建页面改为弹窗样式
|
||||
34683 增加反馈转研发需求页面中父需求的标题宽度
|
||||
34684 增大反馈转研发需求页面中反馈者的输入框宽度
|
||||
34721 组织日志页面置顶显示滚动条
|
||||
34730 固定组织日志页面日志详情的展示位置
|
||||
旗舰版:
|
||||
31845 修改项目风险列表中的挂起操作图标
|
||||
33122 修改问题列表的创建日期显示内容
|
||||
33305 项目问题列表页面优先级字段居中显示
|
||||
33511 修改资产问题库中问题列表中“优先级”为“P”
|
||||
33512 修改资产风险库列表页面“优先级”为“P”
|
||||
33514 修改资产机会库列表页面“优先级”为“P”
|
||||
33525 资产需求库需求列表页面审批字段居左显示
|
||||
33528 资产问题库问题列表页面审批字段居左显示
|
||||
33529 资产风险库风险列表页面审批字段居左显示
|
||||
33530 资产机会库机会列表页面审批字段居左显示
|
||||
33823 问题指派页面增加备注
|
||||
34097 修改执行QA不符合项详情页面中解决图标
|
||||
禅道客户端:
|
||||
34124 XXD可以从XXB主动拉取配置
|
||||
34123 喧喧增加禅道的checktable.php以便自动修复数据库
|
||||
34122 去掉XXD中无意义的错误日志
|
||||
33667 通知中心的信息通知逻辑优化
|
||||
33665 修改通知中心的样式
|
||||
33464 禅道客户端支持弹窗显示
|
||||
33216 禅道客户端重连后不用跳到地盘页面
|
||||
33213 喧喧webview中增加加载中的过渡页面
|
||||
33196 合并禅道客户端禅道上方导航栏和窗口控制栏
|
||||
33187 喧喧一键安装包采用新的控制面板
|
||||
33068 实现客户端修改个人信息的功能
|
||||
33066 将群的设为公开和白名单设置放入群设置弹窗
|
||||
33065 实现只有群主和管理员才能添加群成员的功能
|
||||
33063 实现禁用移动端的功能
|
||||
33062 实现群主被删除后自动转让的功能
|
||||
32013 输出roadrunner相关文档
|
||||
修复的Bug
|
||||
24009 內禅任务详情页面上一个下一个切换错误
|
||||
25389 升级时需要把项目负责人加到团队中
|
||||
25439 需求换了执行对应的用例无法关联测试单
|
||||
22844 项目中创建或者编辑会议页面关联迭代后会清除之前选择的参会人员
|
||||
23200 多人任务串行,可以操作出负的消耗工时
|
||||
24357 多人任务填写日志后把日志删除对应的消耗工时仍然存在
|
||||
25185 内置报表里,执行状态的下拉框里都没有已完成
|
||||
|
||||
2022-07-13 17.3
|
||||
完成的需求
|
||||
14130 点击按钮执行升级后禁用升级按钮
|
||||
|
||||
@@ -172,11 +172,6 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
|
||||
<strong>
|
||||
<?php echo $this->product->getByID($productID)->name ?>
|
||||
</strong>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id="mainContent" class="main-row fade">
|
||||
@@ -588,11 +583,5 @@ function setBadgeStyle(obj, isShow)
|
||||
$label.find('.label-badge').css({"color":"#838a9d", "border-color":"#838a9d"});
|
||||
}
|
||||
}
|
||||
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
</script>
|
||||
<?php include $this->app->getModuleRoot() . '/common/view/footer.html.php';?>
|
||||
|
||||
@@ -16,13 +16,6 @@
|
||||
<?php js::set('sysurl', common::getSysUrl());?>
|
||||
<?php if(strpos($_SERVER["QUERY_STRING"], 'isNotice=1') === false):?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<?php if($this->app->getViewType() == 'xhtml'):?>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php if(!isonlybody()):?>
|
||||
<?php echo html::a($browseLink, '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn btn-secondary'");?>
|
||||
@@ -344,11 +337,6 @@ js::set('cancel', $lang->cancel);
|
||||
js::set('rawModule', $this->app->rawModule);
|
||||
?>
|
||||
<script>
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
</script>
|
||||
<?php include $this->app->getModuleRoot() . 'common/view/syntaxhighlighter.html.php';?>
|
||||
<?php include $this->app->getModuleRoot() . 'common/view/footer.html.php';?>
|
||||
|
||||
+13
-1
@@ -12,15 +12,26 @@ class Gitea
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @param string $encoding
|
||||
* @param object $repo
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8')
|
||||
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8', $repo = null)
|
||||
{
|
||||
putenv('LC_CTYPE=en_US.UTF-8');
|
||||
|
||||
$this->client = $client;
|
||||
$this->root = rtrim($root, DIRECTORY_SEPARATOR);
|
||||
if(!realpath($this->root) and !empty($repo))
|
||||
{
|
||||
global $app;
|
||||
$project = $app->control->loadModel('gitea')->apiGetSingleProject($repo->serviceHost, $repo->serviceProject);
|
||||
if(isset($project->tokenCloneUrl))
|
||||
{
|
||||
$cmd = 'git clone --progress -v "' . $project->tokenCloneUrl . '" "' . $this->root . '"';
|
||||
exec($cmd);
|
||||
}
|
||||
}
|
||||
|
||||
$branch = isset($_COOKIE['repoBranch']) ? $_COOKIE['repoBranch'] : '';
|
||||
if($branch)
|
||||
@@ -51,6 +62,7 @@ class Gitea
|
||||
chdir($this->root);
|
||||
if(!empty($path)) $sub = ":$path";
|
||||
if(!empty($this->branch))$revision = $this->branch;
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
$cmd = escapeCmd("$this->client ls-tree -l $revision$sub");
|
||||
$list = execCmd($cmd . ' 2>&1', 'array', $result);
|
||||
if($result) return array();
|
||||
|
||||
@@ -7,15 +7,16 @@ class gitlab
|
||||
/**
|
||||
* Construct
|
||||
*
|
||||
* @param string $client gitlab api url.
|
||||
* @param string $root id of gitlab project.
|
||||
* @param string $username null
|
||||
* @param string $password token of gitlab api.
|
||||
* @param string $encoding
|
||||
* @param string $client gitlab api url.
|
||||
* @param string $root id of gitlab project.
|
||||
* @param string $username null
|
||||
* @param string $password token of gitlab api.
|
||||
* @param string $encoding
|
||||
* @param object $repo
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8')
|
||||
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8', $repo = null)
|
||||
{
|
||||
$this->client = $client;
|
||||
$this->root = rtrim($root, '/') . '/';
|
||||
|
||||
@@ -12,10 +12,11 @@ class GitRepo
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @param string $encoding
|
||||
* @param object $repo
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8')
|
||||
public function __construct($client, $root, $username, $password, $encoding = 'UTF-8', $repo = null)
|
||||
{
|
||||
putenv('LC_CTYPE=en_US.UTF-8');
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class scm
|
||||
$className = $repo->SCM;
|
||||
if($className == 'Git') $className = 'GitRepo';
|
||||
if(!class_exists($className)) require(strtolower($className) . '.class.php');
|
||||
$this->engine = new $className($repo->client, $repo->path, $repo->account, $repo->password, $repo->encoding);
|
||||
$this->engine = new $className($repo->client, $repo->path, $repo->account, $repo->password, $repo->encoding, $repo);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -18,10 +18,11 @@ class Subversion
|
||||
* @param string $account
|
||||
* @param string $password
|
||||
* @param string $encoding
|
||||
* @param object $repo
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($client, $root, $account, $password, $encoding = 'UTF-8')
|
||||
public function __construct($client, $root, $account, $password, $encoding = 'UTF-8', $repo = null)
|
||||
{
|
||||
putenv('LC_CTYPE=en_US.UTF-8');
|
||||
$this->root = str_replace(array('%3A', '%2F', '+'), array(':', '/', ' '), urlencode(rtrim($root, '/')));
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<th></th>
|
||||
<td colspan='2'>
|
||||
<i class="icon icon-exclamation-sign"></i>
|
||||
<span style='color:#5E626D;font-weight:bold;font-size:13px;'><i class="icon icon-exclamation-sign"></i><?php echo $lang->admin->safe->modeRuleList[2] . $lang->admin->safe->noticeStrong;?></span>
|
||||
<span style='color:#5E626D;font-weight:bold;font-size:13px;'><?php echo $lang->admin->safe->modeRuleList[2] . $lang->admin->safe->noticeStrong;?></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#whiteListBox .input-group:last-child {margin-top: 10px;}
|
||||
@@ -221,13 +221,16 @@ class blockModel extends model
|
||||
->andWhere('t1.deadline')->ne('0000-00-00')
|
||||
->andWhere('t1.deadline')->lt($today)
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->andWhere('t3.deleted')->eq(0)
|
||||
->fetch('count');
|
||||
$data['delayBug'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)
|
||||
->where('assignedTo')->eq($this->app->user->account)
|
||||
->andWhere('status')->eq('active')
|
||||
->andWhere('deadline')->ne('0000-00-00')
|
||||
->andWhere('deadline')->lt($today)
|
||||
->andWhere('deleted')->eq(0)
|
||||
$data['delayBug'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_BUG)->alias('t1')
|
||||
->leftJoin(TABLE_PRODUCT)->alias('t2')->on('t1.product=t2.id')
|
||||
->where('t1.assignedTo')->eq($this->app->user->account)
|
||||
->andWhere('t1.status')->eq('active')
|
||||
->andWhere('t1.deadline')->ne('0000-00-00')
|
||||
->andWhere('t1.deadline')->lt($today)
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->andWhere('t2.deleted')->eq(0)
|
||||
->fetch('count');
|
||||
$data['delayProject'] = (int)$this->dao->select('count(*) AS count')->from(TABLE_PROJECT)
|
||||
->where('status')->in('wait,doing')
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
<?php $id = 0; ?>
|
||||
<?php foreach($executionStats as $execution):?>
|
||||
<?php
|
||||
if(!empty($execution->children)) continue;
|
||||
|
||||
$appid = isset($_GET['entry']) ? "class='app-btn text-center' data-id='{$this->get->entry}'" : "class='text-center'";
|
||||
$viewLink = $this->createLink('execution', 'task', 'executionID=' . $execution->id);
|
||||
if($config->systemMode == 'new') $execution->name = zget($projectPairs, $execution->project, '') . ' / ' . $execution->name;
|
||||
|
||||
@@ -185,11 +185,11 @@ $(function()
|
||||
<table class='status-count'>
|
||||
<tr>
|
||||
<td class='text-right'><?php echo $lang->bug->allBugs;?> :</td>
|
||||
<td class='text-left'><?php echo empty($execution->totalBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&productID=0&orderBy=status,id_desc&build=0&type=all"), $execution->totalBugs);?></td>
|
||||
<td class='text-left'><?php echo empty($execution->totalBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&productID=0&branch=0&orderBy=status,id_desc&build=0&type=all"), $execution->totalBugs);?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class='text-right'><?php echo $lang->bug->unResolved;?> :</td>
|
||||
<td class='text-left'><?php echo empty($execution->activeBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&productID=0&orderBy=status,id_desc&build=0&type=unresolved"), $execution->activeBugs);?></td>
|
||||
<td class='text-left'><?php echo empty($execution->activeBugs) ? 0 : html::a($this->createLink('execution', 'bug', "executionID={$execution->id}&productID=0&branch=0&orderBy=status,id_desc&build=0&type=unresolved"), $execution->activeBugs);?></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -10,5 +10,5 @@ td.branchName > span {vertical-align: middle;}
|
||||
#mergeBranch .form-actions {padding-top: 20px;}
|
||||
.modal-body {padding-top: 0;}
|
||||
.tips {background-color: #ffffff; max-width: 650px; display: flex; padding: 14px;}
|
||||
.icon-exclamation-sign.icon {align-self: center; color: #2667E3; font-size: 24px;}
|
||||
.icon-exclamation-sign.icon {align-self: center; color: #2667E3; font-size: 24px; opacity: 1;}
|
||||
#marginTips {max-width: 585px; margin-left: 10px;}
|
||||
|
||||
@@ -2254,12 +2254,13 @@ class bug extends control
|
||||
* AJAX: get all users as assignedTo list.
|
||||
*
|
||||
* @param string $selectedUser
|
||||
* @param string $params noletter|noempty|nodeleted|noclosed|withguest|pofirst|devfirst|qafirst|pmfirst|realname|outside|inside|all, can be sets of theme
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function ajaxLoadAllUsers($selectedUser = '')
|
||||
public function ajaxLoadAllUsers($selectedUser = '', $params = 'devfirst|noclosed')
|
||||
{
|
||||
$allUsers = $this->loadModel('user')->getPairs('devfirst|noclosed');
|
||||
$allUsers = $this->loadModel('user')->getPairs($params);
|
||||
|
||||
return print(html::select('assignedTo', $allUsers, $selectedUser, 'class="form-control"'));
|
||||
}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
.main-table {height: 600px !important}
|
||||
.main-table {height: 80% !important}
|
||||
#mainContent {min-height: 400px;}
|
||||
|
||||
+11
-4
@@ -60,14 +60,21 @@ function loadAll(productID)
|
||||
*/
|
||||
function loadAllUsers()
|
||||
{
|
||||
var link = createLink('bug', 'ajaxLoadAllUsers', 'selectedUser=' + $('#assignedTo').val());
|
||||
isClosedBug = typeof isClosedBug == 'undefined' ? false : isClosedBug;
|
||||
|
||||
var params = isClosedBug ? '¶ms=devfirst' : '';
|
||||
var link = createLink('bug', 'ajaxLoadAllUsers', 'selectedUser=' + $('#assignedTo').val() + params);
|
||||
$.get(link, function(data)
|
||||
{
|
||||
if(data)
|
||||
{
|
||||
var moduleID = $('#module').val();
|
||||
var productID = $('#product').val();
|
||||
setAssignedTo(moduleID, productID);
|
||||
if(!isClosedBug)
|
||||
{
|
||||
var moduleID = $('#module').val();
|
||||
var productID = $('#product').val();
|
||||
setAssignedTo(moduleID, productID);
|
||||
}
|
||||
|
||||
$('#assignedTo').replaceWith(data);
|
||||
$('#assignedTo_chosen').remove();
|
||||
$('#assignedTo').chosen();
|
||||
|
||||
@@ -12,7 +12,7 @@ $(function()
|
||||
var btnClass = " class='" + $that.attr('class') + "'";
|
||||
var action = $that.html();
|
||||
|
||||
if(href.indexOf('createCase') >= 0 || href.indexOf('toStory') >= 0 || href.indexOf('create') >= 0 || href.indexOf('delete') >= 0) return true;
|
||||
if(href.indexOf('createCase') >= 0 || href.indexOf('toStory') >= 0 || href.indexOf('toTask') >= 0 || href.indexOf('create') >= 0 || href.indexOf('delete') >= 0) return true;
|
||||
|
||||
if($that.hasClass('iframe'))
|
||||
{
|
||||
|
||||
@@ -1790,6 +1790,8 @@ class bugModel extends model
|
||||
->andWhere('project')->eq((int)$projectID)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi()
|
||||
->beginIF(!empty($productID) and strpos($bugQuery, 'product') === false and strpos($bugQuery, '`product` IN') === false)->andWhere('product')->eq($productID)->fi()
|
||||
->beginIF(!empty($productID) and strpos($bugQuery, 'product') === false and strpos($bugQuery, '`product` IN') === false)->andWhere('branch')->eq($branchID)->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
@@ -1801,7 +1803,7 @@ class bugModel extends model
|
||||
->where('t1.deleted')->eq(0)
|
||||
->beginIF(empty($build))->andWhere('t1.project')->eq($projectID)->fi()
|
||||
->beginIF(!empty($productID))->andWhere('t1.product')->eq($productID)->fi()
|
||||
->andWhere('t1.branch')->eq($branchID)
|
||||
->beginIF(!empty($productID))->andWhere('t1.branch')->eq($branchID)->fi()
|
||||
->beginIF($type == 'unresolved')->andWhere('t1.status')->eq('active')->fi()
|
||||
->beginIF($type == 'noclosed')->andWhere('t1.status')->ne('closed')->fi()
|
||||
->beginIF($type == 'assignedtome')->andWhere('t1.assignedTo')->eq($this->app->user->account)->fi()
|
||||
@@ -1856,6 +1858,8 @@ class bugModel extends model
|
||||
->andWhere('execution')->eq((int)$executionID)
|
||||
->andWhere('deleted')->eq(0)
|
||||
->beginIF($excludeBugs)->andWhere('id')->notIN($excludeBugs)->fi()
|
||||
->beginIF(!empty($productID) and strpos($bugQuery, 'product') === false and strpos($bugQuery, '`product` IN') === false)->andWhere('product')->eq($productID)->fi()
|
||||
->beginIF(!empty($productID) and $branchID !== 'all' and strpos($bugQuery, 'product') === false and strpos($bugQuery, '`product` IN') === false)->andWhere('branch')->eq($branchID)->fi()
|
||||
->orderBy($orderBy)
|
||||
->page($pager)
|
||||
->fetchAll('id');
|
||||
@@ -1865,7 +1869,7 @@ class bugModel extends model
|
||||
$bugs = $this->dao->select('t1.*')->from(TABLE_BUG)->alias('t1')
|
||||
->leftJoin(TABLE_MODULE)->alias('t2')->on('t1.module=t2.id')
|
||||
->where('t1.deleted')->eq(0)
|
||||
->beginIF($branchID != 'all')->andWhere('t1.branch')->eq($branchID)->fi()
|
||||
->beginIF(!empty($productID) and $branchID !== 'all')->andWhere('t1.branch')->eq($branchID)->fi()
|
||||
->beginIF(empty($build))->andWhere('t1.execution')->eq($executionID)->fi()
|
||||
->beginIF(!empty($productID))->andWhere('t1.product')->eq($productID)->fi()
|
||||
->beginIF($type == 'unresolved')->andWhere('t1.status')->eq('active')->fi()
|
||||
@@ -3165,7 +3169,7 @@ class bugModel extends model
|
||||
break;
|
||||
case 'confirmed':
|
||||
$class = 'confirm' . $bug->confirmed;
|
||||
echo "<span class='$class'>" . zget($this->lang->bug->confirmedList, $bug->confirmed, $bug->confirmed) . "</span> ";
|
||||
echo "<span class='$class' title='" . zget($this->lang->bug->confirmedList, $bug->confirmed, $bug->confirmed) . "'>" . zget($this->lang->bug->confirmedList, $bug->confirmed, $bug->confirmed) . "</span> ";
|
||||
break;
|
||||
case 'title':
|
||||
$showBranch = isset($this->config->bug->browse->showBranch) ? $this->config->bug->browse->showBranch : 1;
|
||||
|
||||
@@ -159,11 +159,6 @@ $currentBrowseType = isset($lang->bug->mySelects[$browseType]) && in_array($brow
|
||||
<strong>
|
||||
<?php echo $this->product->getByID($productID)->name ?>
|
||||
</strong>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id="mainContent" class="main-row fade">
|
||||
@@ -460,10 +455,5 @@ $(function(){$('#modulemenu .nav li:last').after("<li class='right'><a style='fo
|
||||
<?php if(count($bugs) <= 2):?>
|
||||
$('#bugForm .table-footer .table-actions #assignedTo').closest('.btn-group.dropup').removeClass('dropup').addClass('dropdown');
|
||||
<?php endif;?>
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -28,6 +28,7 @@ js::set('systemMode' , $config->systemMode);
|
||||
js::set('confirmUnlinkBuild' , sprintf($lang->bug->confirmUnlinkBuild, zget($resolvedBuilds, $bug->resolvedBuild)));
|
||||
js::set('tab' , $this->app->tab);
|
||||
js::set('bugBranch' , $bug->branch);
|
||||
js::set('isClosedBug' , $bug->status == 'closed');
|
||||
if($this->app->tab == 'execution') js::set('objectID', $bug->execution);
|
||||
if($this->app->tab == 'project') js::set('objectID', $bug->project);
|
||||
?>
|
||||
|
||||
@@ -23,13 +23,6 @@
|
||||
<?php $browseLink = $app->session->bugList ? $app->session->bugList : inlink('browse', "productID=$bug->product");?>
|
||||
<?php if(strpos($_SERVER["QUERY_STRING"], 'isNotice=1') === false):?>
|
||||
<div id="mainMenu" class="clearfix">
|
||||
<?php if($this->app->getViewType() == 'xhtml'):?>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php if(!isonlybody()):?>
|
||||
<?php echo html::a($browseLink, '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn btn-secondary'");?>
|
||||
@@ -466,11 +459,6 @@
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/syntaxhighlighter.html.php';?>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -5,3 +5,4 @@
|
||||
.page-title .text>a {font-weight: 700;}
|
||||
|
||||
.body-modal #mainContent {min-height: 200px;}
|
||||
td.article-content{overflow:auto !important;}
|
||||
|
||||
@@ -568,7 +568,7 @@ class buildModel extends model
|
||||
|
||||
$menu .= $this->buildMenu('testtask', 'create', "product=$build->product&execution={$executionID}&build=$build->id&projectID=$build->project", $build, $type, 'bullhorn', '', '', '', $testtaskApp);
|
||||
|
||||
if($tab == 'execution' and !empty($execution->type) and $execution->type != 'kanban') $menu .= $this->buildMenu('execution', 'bug', "execution={$extraParams['executionID']}&productID={$extraParams['productID']}&orderBy=status&build=$build->id", $build, $type, '', '', '', '', $this->lang->execution->viewBug);
|
||||
if($tab == 'execution' and !empty($execution->type) and $execution->type != 'kanban') $menu .= $this->buildMenu('execution', 'bug', "execution={$extraParams['executionID']}&productID={$extraParams['productID']}&branchID=all&orderBy=status&build=$build->id", $build, $type, '', '', '', '', $this->lang->execution->viewBug);
|
||||
if($tab == 'project' or empty($execution->type) or $execution->type == 'kanban') $menu .= $this->buildMenu('build', 'view', "{$params}&type=generatedBug", $build, $type, 'bug', '', '', '', "data-app='$tab'", $this->lang->project->bug);
|
||||
|
||||
$menu .= $this->buildMenu('build', 'edit', $params, $build, $type);
|
||||
|
||||
@@ -344,7 +344,7 @@ tbody tr td:first-child input {display: none;}
|
||||
<?php $this->printExtendFields($build, 'table', 'inForm=0');?>
|
||||
<tr>
|
||||
<th style="vertical-align:top"><?php echo $lang->build->desc;?></th>
|
||||
<td>
|
||||
<td class='article-content'>
|
||||
<?php if($build->desc):?>
|
||||
<?php echo $build->desc;?>
|
||||
<?php else:?>
|
||||
|
||||
@@ -373,6 +373,7 @@ $lang->error->companyNotFound = "The domain %s cannot be found!";
|
||||
$lang->error->length = array("『%s』Length Error. It should be『%s』", "『%s』length should be <=『%s』and >『%s』.");
|
||||
$lang->error->reg = "『%s』Format Error. It should be『%s』.";
|
||||
$lang->error->unique = "『%s』『%s』existed. Please go to Admin->System->Data->Recycle to restore it, if you are sure it is deleted.";
|
||||
$lang->error->repeat = "『%s』『%s』exists.";
|
||||
$lang->error->gt = "『%s』should be >『%s』.";
|
||||
$lang->error->ge = "『%s』should be >=『%s』.";
|
||||
$lang->error->lt = "『%s』should be <『%s』。";
|
||||
|
||||
@@ -373,6 +373,7 @@ $lang->error->companyNotFound = "The domain %s cannot be found!";
|
||||
$lang->error->length = array("『%s』length error. It should be『%s』", "『%s』length should be <=『%s』and >『%s』.");
|
||||
$lang->error->reg = "『%s』format error. It should be『%s』.";
|
||||
$lang->error->unique = "『%s』『%s』exists. Go to Admin->System->Data->Recycle Bin to restore it, if you are sure it is deleted.";
|
||||
$lang->error->repeat = "『%s』『%s』exists.";
|
||||
$lang->error->gt = "『%s』should be >『%s』.";
|
||||
$lang->error->ge = "『%s』should be >=『%s』.";
|
||||
$lang->error->lt = "『%s』should be <『%s』。";
|
||||
|
||||
@@ -373,6 +373,7 @@ $lang->error->companyNotFound = "Le domaine %s ne peut être trouvé !";
|
||||
$lang->error->length = array("『 %s 』erreur de longueur. Il devrait être『%s』", "La longueur de 『%s』devrait être <=『%s』et >『%s』.");
|
||||
$lang->error->reg = "『 %s 』erreur de format. Il devrait être『%s』.";
|
||||
$lang->error->unique = "『 %s 』『 %s 』existes. Allez à Admin->System->Data->Recycle Bin pour le restaurer, si vous êtes sûr qu'il est supprimé.";
|
||||
$lang->error->repeat = "『 %s 』『 %s 』existes.";
|
||||
$lang->error->gt = "『 %s 』devrait être > 『 %s 』.";
|
||||
$lang->error->ge = "『 %s 』devrait être >= 『 %s 』.";
|
||||
$lang->error->lt = "『%s』should be <『%s』。";
|
||||
|
||||
@@ -373,6 +373,7 @@ $lang->error->companyNotFound = "您访问的域名 %s 没有对应的公司。"
|
||||
$lang->error->length = array("『%s』长度错误,应当为『%s』", "『%s』长度应当不超过『%s』,且大于『%s』。");
|
||||
$lang->error->reg = "『%s』不符合格式,应当为:『%s』。";
|
||||
$lang->error->unique = "『%s』已经有『%s』这条记录了。如果您确定该记录已删除,请到后台-系统-数据-回收站还原。";
|
||||
$lang->error->repeat = "『%s』已经有『%s』这条记录了。";
|
||||
$lang->error->gt = "『%s』应当大于『%s』。";
|
||||
$lang->error->ge = "『%s』应当不小于『%s』。";
|
||||
$lang->error->lt = "『%s』应当小于『%s』。";
|
||||
|
||||
@@ -47,7 +47,7 @@ class compileModel extends model
|
||||
*/
|
||||
public function getList($repoID, $jobID, $orderBy = 'id_desc', $pager = null)
|
||||
{
|
||||
return $this->dao->select('t1.id, t1.name, t1.job, t1.status, t1.createdDate, t1.testtask, t2.pipeline, t2.triggerType, t2.comment, t2.atDay, t2.atTime, t2.engine, t3.name as repoName, t4.name as jenkinsName')->from(TABLE_COMPILE)->alias('t1')
|
||||
return $this->dao->select('t1.id, t1.name, t1.job, t1.status, DATE_FORMAT(t1.createdDate, "%m-%d %H:%i") AS createdDate, t1.testtask, t2.pipeline, t2.triggerType, t2.comment, t2.atDay, t2.atTime, t2.engine, t3.name as repoName, t4.name as jenkinsName')->from(TABLE_COMPILE)->alias('t1')
|
||||
->leftJoin(TABLE_JOB)->alias('t2')->on('t1.job=t2.id')
|
||||
->leftJoin(TABLE_REPO)->alias('t3')->on('t2.repo=t3.id')
|
||||
->leftJoin(TABLE_PIPELINE)->alias('t4')->on('t2.server=t4.id')
|
||||
|
||||
@@ -28,22 +28,22 @@
|
||||
<form class='main-table' id='ajaxForm' method='post'>
|
||||
<table id='buildList' class='table has-sort-head table-fixed'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
<?php $vars = "jobID={$jobID}&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?>
|
||||
<tr>
|
||||
<?php $vars = "repoID=$repoID&jobID={$jobID}&orderBy=%s&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}&pageID={$pager->pageID}";?>
|
||||
<th class='c-id'><?php common::printOrderLink('id', $orderBy, $vars, $lang->compile->id);?></th>
|
||||
<th class='text-left'><?php common::printOrderLink('name', $orderBy, $vars, $lang->compile->name);?></th>
|
||||
<th class='c-build-type text-left'><?php echo $lang->compile->buildType;?></th>
|
||||
<th class='c-repo text-left'><?php echo $lang->job->repo;?></th>
|
||||
<th class='text-left'><?php echo $lang->job->triggerType;?></th>
|
||||
<th class='c-status text-center'><?php common::printOrderLink('status', $orderBy, $vars, $lang->compile->status);?></th>
|
||||
<th class='c-date text-center'><?php common::printOrderLink('createdDate', $orderBy, $vars, $lang->compile->time);?></th>
|
||||
<th class='c-actions'><?php echo $lang->actions;?></th>
|
||||
<th class='text'><?php common::printOrderLink('name', $orderBy, $vars, $lang->compile->name);?></th>
|
||||
<th class='c-build-type'><?php echo $lang->compile->buildType;?></th>
|
||||
<th class='c-repo'><?php echo $lang->job->repo;?></th>
|
||||
<th class='text'><?php echo $lang->job->triggerType;?></th>
|
||||
<th class='c-status'><?php common::printOrderLink('status', $orderBy, $vars, $lang->compile->status);?></th>
|
||||
<th class='c-date'><?php common::printOrderLink('createdDate', $orderBy, $vars, $lang->compile->time);?></th>
|
||||
<th class='c-actions-2'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class='text-left'>
|
||||
<?php foreach($buildList as $id => $build):?>
|
||||
<tr>
|
||||
<td class='text-center'><?php echo $id;?></td>
|
||||
<td class='text'><?php echo $id;?></td>
|
||||
<td class='c-name' title='<?php echo $build->name;?>'><?php echo common::hasPriv('job', 'view') ? html::a($this->createLink('job', 'view', "jobID={$build->job}&compileID={$build->id}", 'html', true), $build->name, '', "class='iframe' data-width='90%'") : $build->name;?></td>
|
||||
<td title='<?php echo $build->engine;?>'><?php echo $build->engine;?></td>
|
||||
<td title='<?php echo $build->repoName;?>'><?php echo $build->repoName;?></td>
|
||||
@@ -51,7 +51,7 @@
|
||||
<?php $triggerConfig = $this->loadModel('job')->getTriggerConfig($build);?>
|
||||
<td title='<?php echo $triggerConfig;?>'><?php echo $triggerConfig;?></td>
|
||||
<?php $buildStatus = zget($lang->compile->statusList, $build->status);?>
|
||||
<td class='text-center' title='<?php echo $buildStatus;?>'><?php echo $buildStatus;?></td>
|
||||
<td class='text' title='<?php echo $buildStatus;?>'><?php echo $buildStatus;?></td>
|
||||
<td title='<?php echo $build->createdDate;?>'><?php echo $build->createdDate;?></td>
|
||||
<td class='c-actions text-left'>
|
||||
<?php
|
||||
|
||||
@@ -609,7 +609,7 @@ class custom extends control
|
||||
if($this->config->edition != 'max') $this->loadModel('setting')->setItem('system.custom.hourPoint', $this->post->hourPoint);
|
||||
|
||||
$this->app->loadLang('common');
|
||||
$locate = $this->config->systemMode == 'new' ? inlink('flow') : 'top';
|
||||
$locate = $this->config->systemMode == 'new' ? 'parent' : 'top';
|
||||
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate));
|
||||
}
|
||||
|
||||
@@ -2,4 +2,14 @@ $(function()
|
||||
{
|
||||
$('#subNavbar .nav li').removeClass('active');
|
||||
$('#subNavbar .nav li[data-id=' + type + ']').addClass('active');
|
||||
|
||||
$('#subNavbar .nav li > a').each(function()
|
||||
{
|
||||
var type = $(this).parent().attr('data-id');
|
||||
if(type == 'bysearch') return;
|
||||
|
||||
type = type == 'all' ? type : type.toUpperCase();
|
||||
var href = createLink('design', 'browse', 'projectID=' + projectID + '&productID=' + productID + '&type=' + type);
|
||||
$(this).attr('href', href);
|
||||
});
|
||||
})
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<?php include '../../common/view/sortable.html.php';?>
|
||||
<?php js::set('type', strtolower($type));?>
|
||||
<?php js::set('projectID', $projectID);?>
|
||||
<?php js::set('productID', $productID);?>
|
||||
<style>
|
||||
.btn-group a i.icon-plus {font-size: 16px;}
|
||||
.btn-group a.btn-primary {border-right: 1px solid rgba(255,255,255,0.3);}
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
<?php foreach($design->tasks as $task):?>
|
||||
<tr class='text-center'>
|
||||
<td><?php $task->id?></td>
|
||||
<td class='text-left'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id"), $task->name, '_blank');?></td>;
|
||||
<td class='text-left'><?php echo html::a($this->createLink('task', 'view', "taskID=$task->id"), $task->name, '_blank');?></td>
|
||||
<td><?php echo zget($users, $task->assignedTo);?></td>
|
||||
<td><span class='status-task status-<?php echo $task->status;?>'><?php $this->processStatus('task', $task);?></span></td>
|
||||
<td><?php echo $task->consumed;?></td>
|
||||
|
||||
@@ -292,10 +292,11 @@ class doc extends control
|
||||
* @param int $moduleID
|
||||
* @param string $docType
|
||||
* @param bool $fromGlobal
|
||||
* @param string $from
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function create($objectType, $objectID, $libID, $moduleID = 0, $docType = '', $fromGlobal = false)
|
||||
public function create($objectType, $objectID, $libID, $moduleID = 0, $docType = '', $fromGlobal = false, $from = 'doc')
|
||||
{
|
||||
if(!empty($_POST))
|
||||
{
|
||||
@@ -361,7 +362,7 @@ class doc extends control
|
||||
if($this->config->systemMode == 'new') unset($this->lang->doc->menu->project['subMenu']);
|
||||
}
|
||||
|
||||
$this->config->showMainMenu = strpos($this->config->doc->textTypes, $docType) === false;
|
||||
$this->config->showMainMenu = (strpos($this->config->doc->textTypes, $docType) === false or $from == 'template');
|
||||
|
||||
/* Get libs and the default lib id. */
|
||||
$gobackLink = ($objectID == 0 and $libID == 0) ? $this->createLink('doc', 'tableContents', "type=$objectType") : '';
|
||||
@@ -388,6 +389,7 @@ class doc extends control
|
||||
$this->view->groups = $this->loadModel('group')->getPairs();
|
||||
$this->view->users = $this->user->getPairs('nocode|noclosed|nodeleted');
|
||||
$this->view->fromGlobal = $fromGlobal;
|
||||
$this->view->from = $from;
|
||||
|
||||
$this->display();
|
||||
}
|
||||
@@ -424,12 +426,14 @@ class doc extends control
|
||||
if(!empty($changes)) $this->action->logHistory($actionID, $changes);
|
||||
}
|
||||
|
||||
$link = $this->session->docList ? $this->session->docList : $this->createLink('doc', 'index');
|
||||
$doc = $this->doc->getById($docID);
|
||||
$link = $this->session->docList ? $this->session->docList : $this->createLink('doc', 'index');
|
||||
$doc = $this->doc->getById($docID);
|
||||
$lib = $this->doc->getLibById($doc->lib);
|
||||
$objectID = zget($lib, $lib->type, 0);
|
||||
|
||||
if(!empty($objectType) and $objectType != 'doc' and $doc->type != 'chapter' and $doc->type != 'article')
|
||||
{
|
||||
$link = $this->createLink('doc', 'objectLibs', "type=$objectType&objectID=$objectID&libID=$libID&docID=$docID");
|
||||
$link = $this->createLink('doc', 'objectLibs', "type={$lib->type}&objectID=$objectID&libID={$doc->lib}&docID=$docID");
|
||||
}
|
||||
|
||||
if(isonlybody()) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
|
||||
|
||||
@@ -34,6 +34,15 @@ function loadDocLibs(type)
|
||||
$('#lib').replaceWith(data);
|
||||
$('#lib_chosen').remove();
|
||||
$('#lib').chosen();
|
||||
|
||||
if($('#lib').find('option').length == 0)
|
||||
{
|
||||
$('#submit').attr('disabled', 'disabled');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#submit').removeAttr('disabled');
|
||||
}
|
||||
})
|
||||
|
||||
$('#docType').toggleClass('hidden', type == 'api');
|
||||
|
||||
@@ -133,7 +133,7 @@ $("a[href^='###']").click(function()
|
||||
<td colspan='3' class='text-center form-actions'>
|
||||
<?php echo html::hidden('contentType', 'html');?>
|
||||
<?php echo html::submitButton();?>
|
||||
<?php if(strpos($config->doc->textTypes, $docType) === false):?>
|
||||
<?php if($config->showMainMenu):?>
|
||||
<?php if(empty($gobackLink)) echo html::backButton($lang->goback, "data-app='{$app->tab}'");?>
|
||||
<?php if(!empty($gobackLink)) echo html::a($gobackLink, $lang->goback, '', "class='btn btn-back btn-wide'");?>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -94,7 +94,7 @@ if(empty($type)) $type = 'product';
|
||||
foreach($this->lang->doc->typeList as $typeKey => $typeName)
|
||||
{
|
||||
$icon = zget($this->config->doc->iconList, $typeKey);
|
||||
$class = strpos($this->config->doc->officeTypes, $typeKey) !== false ? 'iframe' : '';
|
||||
$class = (strpos($this->config->doc->officeTypes, $typeKey) !== false or strpos($this->config->doc->textTypes, $typeKey) !== false) ? 'iframe' : '';
|
||||
$html .= "<li>";
|
||||
$html .= html::a(helper::createLink('doc', 'create', "objectType=$type&objectID=$objectID&libID=$libID&moduleID=0&type=$typeKey", '', $class ? true : false), "<i class='icon-$icon text-muted'></i> " . $typeName, '', "class='$class' data-app='{$this->app->tab}'");
|
||||
$html .= "</li>";
|
||||
|
||||
@@ -1667,7 +1667,6 @@ class execution extends control
|
||||
}
|
||||
}
|
||||
|
||||
$this->app->loadLang('kanban');
|
||||
$this->loadModel('user');
|
||||
$poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', '', $this->config->maxCount);
|
||||
if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PM"] = $this->config->user->moreLink;
|
||||
@@ -1870,7 +1869,6 @@ class execution extends control
|
||||
}
|
||||
|
||||
$this->loadModel('user');
|
||||
$this->loadModel('kanban');
|
||||
$poUsers = $this->user->getPairs('noclosed|nodeleted|pofirst', $execution->PO, $this->config->maxCount);
|
||||
if(!empty($this->config->user->moreLink)) $this->config->moreLinks["PM"] = $this->config->user->moreLink;
|
||||
|
||||
@@ -1909,10 +1907,6 @@ class execution extends control
|
||||
$this->view->teamMembers = $this->execution->getTeamMembers($executionID);
|
||||
if($this->config->systemMode == 'new') $this->view->allProjects = $this->project->getPairsByModel($project->model, 0, 'noclosed', $project->id);
|
||||
|
||||
$this->view->laneCount = $this->kanban->getLaneCount($executionID, $execution->type);
|
||||
$this->view->heightType = $execution->displayCards > 2 ? 'custom' : 'auto';
|
||||
$this->view->displayCards = $execution->displayCards ? $execution->displayCards : '';
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
@@ -2300,6 +2294,7 @@ class execution extends control
|
||||
$end = helper::today();
|
||||
$dateList = date::getDateList($begin, $end, 'Y-m-d', 'noweekend');
|
||||
$chartData = $this->execution->buildCFDData($executionID, $dateList, 'task');
|
||||
if(isset($chartData['line'])) $chartData['line'] = array_reverse($chartData['line']);
|
||||
|
||||
$this->view->begin = helper::safe64Encode(urlencode($begin));
|
||||
$this->view->end = helper::safe64Encode(urlencode($end));
|
||||
@@ -2608,6 +2603,33 @@ class execution extends control
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Kanban.
|
||||
*
|
||||
* @param int $executionID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setKanban($executionID)
|
||||
{
|
||||
$execution = $this->execution->getByID($executionID);
|
||||
|
||||
if($_POST)
|
||||
{
|
||||
$this->execution->setKanban($executionID);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'parent'));
|
||||
}
|
||||
|
||||
$this->view->title = $this->lang->execution->setKanban;
|
||||
$this->view->execution = $execution;
|
||||
$this->view->laneCount = $this->loadModel('kanban')->getLaneCount($executionID, $execution->type);
|
||||
$this->view->heightType = $execution->displayCards > 2 ? 'custom' : 'auto';
|
||||
$this->view->displayCards = $execution->displayCards ? $execution->displayCards : '';
|
||||
|
||||
$this->display();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tree view.
|
||||
* Product
|
||||
|
||||
@@ -9,3 +9,4 @@
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
|
||||
.c-severity {width: 80px;}
|
||||
.c-confirmed {overflow: hidden;}
|
||||
|
||||
@@ -25,13 +25,10 @@
|
||||
#plansBox .row {display: inline-table; width: 102%;}
|
||||
#plansBox .row .col-sm-4 {display: inline-block; float: none; padding-right: 13px;}
|
||||
|
||||
#mainContent .laneHeightBox .radio-inline+.radio-inline {margin-left: 20px;}
|
||||
#mainContent .laneHeightBox .tip {color: #999;}
|
||||
|
||||
#dateRange {vertical-align: top; padding-top: 13px;}
|
||||
#dateRangeOption {vertical-align: top; padding-top: 13px;}
|
||||
#beginLabel {white-space: nowrap;}
|
||||
#endLabel {white-space: nowrap;}
|
||||
#copyProjectModal .projectSelect {display: inline-block; margin-left: 10px; width: 20%;}
|
||||
#copyProjectModal .titleBox{position: relative; bottom: 3px; display: inline-block;}
|
||||
a.chosen-single > div > b {top: -4px !important;}
|
||||
a.chosen-single > div > b {top: -4px !important;}
|
||||
|
||||
@@ -5,6 +5,4 @@
|
||||
|
||||
.chosen-container.chosen-highlight-selected .disabled-result.result-selected {background: none;}
|
||||
|
||||
#mainContent .laneHeightBox .radio-inline+.radio-inline, #mainContent .importBox .radio-inline+.radio-inline {margin-left: 20px;}
|
||||
#mainContent .laneHeightBox .tip {color: #999;}
|
||||
#dateRange {vertical-align: top; padding-top: 13px;}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#mainContent tr > th{width: 66px;}
|
||||
[lang^='en'] #mainContent tr > th, [lang^='de'] #mainContent tr > th, [lang^='fr'] #mainContent tr > th{width: 105px;}
|
||||
|
||||
#mainContent .table-form > tbody > tr > th {vertical-align: top; padding-right: 5px;}
|
||||
#mainContent .radio-inline {display: block;}
|
||||
#mainContent .radio-inline+.radio-inline {margin-left: 0px; padding-top: 8px;}
|
||||
#mainContent label > .tip {color: #999;}
|
||||
#mainContent #cardBox th {vertical-align: middle;}
|
||||
@@ -143,7 +143,7 @@ function loadBranches(product)
|
||||
var projectID = (typeof(systemMode) != 'undefined' && systemMode == 'new') ? $('#project').val() : 0;
|
||||
|
||||
var index = $inputgroup.find('select:first').attr('id').replace('products' , '');
|
||||
$.get(createLink('branch', 'ajaxGetBranches', "productID=" + $(product).val() + "&oldBranch=0¶m=active&projectID=" + projectID + "&withMainBranch="), function(data)
|
||||
$.get(createLink('branch', 'ajaxGetBranches', "productID=" + $(product).val() + "&oldBranch=¶m=active&projectID=" + projectID + "&withMainBranch="), function(data)
|
||||
{
|
||||
if(data)
|
||||
{
|
||||
|
||||
@@ -5,9 +5,6 @@ function setCopyProject(executionID)
|
||||
|
||||
$(function()
|
||||
{
|
||||
var heightType = $("[name='heightType']:checked").val();
|
||||
setCardCount(heightType);
|
||||
|
||||
$(document).on('click', '#copyProjects a', function()
|
||||
{
|
||||
setCopyProject($(this).data('id')); $('#copyProjectModal').modal('hide');
|
||||
|
||||
@@ -37,9 +37,6 @@ $().ready(function()
|
||||
|
||||
$(function()
|
||||
{
|
||||
var heightType = $("[name='heightType']:checked").val();
|
||||
setCardCount(heightType);
|
||||
|
||||
/* If the story of the product which linked the execution under the project, you don't allow to remove the product. */
|
||||
$("#productsBox select[name^='products']").each(function()
|
||||
{
|
||||
|
||||
@@ -1813,7 +1813,7 @@ function toggleRDSearchBox()
|
||||
}
|
||||
else
|
||||
{
|
||||
$(".querybox-toggle").css("color", "3c495c");
|
||||
$(".querybox-toggle").css("color", "#3c495c");
|
||||
$('#rdKanbanSearchInput').attr('value', '');
|
||||
searchCards('');
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
$(function()
|
||||
{
|
||||
var heightType = $("[name='heightType']:checked").val();
|
||||
setCardCount(heightType);
|
||||
});
|
||||
@@ -1459,7 +1459,7 @@ function toggleSearchBox()
|
||||
}
|
||||
else
|
||||
{
|
||||
$(".querybox-toggle").css("color", "3c495c");
|
||||
$(".querybox-toggle").css("color", "#3c495c");
|
||||
$('#taskKanbanSearchInput').attr('value', '');
|
||||
searchCards('');
|
||||
}
|
||||
|
||||
@@ -461,6 +461,7 @@ $lang->execution->orderList['stage_desc'] = "Phase Ab.";
|
||||
|
||||
$lang->execution->kanban = "Kanban";
|
||||
$lang->execution->kanbanSetting = "Kanban Einstellung";
|
||||
$lang->execution->setKanban = "Kanban Einstellung";
|
||||
$lang->execution->resetKanban = "Einstellungen zurücksetzen";
|
||||
$lang->execution->printKanban = "Kanban drucken";
|
||||
$lang->execution->fullScreen = "Full Screen";
|
||||
|
||||
@@ -461,6 +461,7 @@ $lang->execution->orderList['stage_desc'] = "Story Phase Descending";
|
||||
|
||||
$lang->execution->kanban = "Kanban";
|
||||
$lang->execution->kanbanSetting = "Settings";
|
||||
$lang->execution->setKanban = "Set Kanban";
|
||||
$lang->execution->resetKanban = "Reset";
|
||||
$lang->execution->printKanban = "Print";
|
||||
$lang->execution->fullScreen = "Full Screen";
|
||||
|
||||
@@ -461,6 +461,7 @@ $lang->execution->orderList['stage_desc'] = "Story Phase Descendante";
|
||||
|
||||
$lang->execution->kanban = "Kanban";
|
||||
$lang->execution->kanbanSetting = "Paramétrage";
|
||||
$lang->execution->setKanban = "Paramétrage";
|
||||
$lang->execution->resetKanban = "Réinitialiser";
|
||||
$lang->execution->printKanban = "Impression";
|
||||
$lang->execution->fullScreen = "Full Screen";
|
||||
|
||||
@@ -461,6 +461,7 @@ $lang->execution->orderList['stage_desc'] = "{$lang->SRCommon}阶段倒序";
|
||||
|
||||
$lang->execution->kanban = "看板";
|
||||
$lang->execution->kanbanSetting = "看板设置";
|
||||
$lang->execution->setKanban = "设置看板";
|
||||
$lang->execution->resetKanban = "恢复默认";
|
||||
$lang->execution->printKanban = "打印看板";
|
||||
$lang->execution->fullScreen = "看板全屏展示";
|
||||
|
||||
@@ -391,6 +391,7 @@ class executionModel extends model
|
||||
$this->lang->project->code = $this->lang->execution->execCode;
|
||||
}
|
||||
|
||||
$this->lang->error->unique = $this->lang->error->repeat;
|
||||
$sprintProject = isset($sprint->project) ? $sprint->project : '0';
|
||||
$this->dao->insert(TABLE_EXECUTION)->data($sprint)
|
||||
->autoCheck($skipFields = 'begin,end')
|
||||
@@ -540,6 +541,7 @@ class executionModel extends model
|
||||
}
|
||||
|
||||
/* Update data. */
|
||||
$this->lang->error->unique = $this->lang->error->repeat;
|
||||
$executionProject = isset($execution->project) ? $execution->project : '0';
|
||||
$this->dao->update(TABLE_EXECUTION)->data($execution)
|
||||
->autoCheck($skipFields = 'begin,end')
|
||||
@@ -1073,6 +1075,25 @@ class executionModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Kanban.
|
||||
*
|
||||
* @param int $executionID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setKanban($executionID)
|
||||
{
|
||||
$execution = fixer::input('post')
|
||||
->setIF($this->post->heightType == 'auto', 'displayCards', 0)
|
||||
->remove('heightType')
|
||||
->get();
|
||||
|
||||
if(isset($_POST['heightType']) and $this->post->heightType == 'custom' and !$this->loadModel('kanban')->checkDisplayCards($execution->displayCards)) return;
|
||||
|
||||
$this->dao->update(TABLE_EXECUTION)->data($execution)->where('id')->eq((int)$executionID)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check the workload format and total.
|
||||
*
|
||||
@@ -2592,9 +2613,13 @@ class executionModel extends model
|
||||
}
|
||||
}
|
||||
|
||||
$projectID = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch('project');
|
||||
if($this->config->systemMode == 'new')
|
||||
{
|
||||
$projectID = $this->dao->select('project')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch('project');
|
||||
$this->session->set('project', $projectID);
|
||||
$this->linkStory($projectID, $planStories, $planProducts);
|
||||
}
|
||||
$this->linkStory($executionID, $planStories, $planProducts);
|
||||
if($this->config->systemMode == 'new') $this->linkStory($projectID, $planStories, $planProducts);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3165,7 +3190,7 @@ class executionModel extends model
|
||||
}
|
||||
elseif((helper::today() > $execution->end))
|
||||
{
|
||||
$begin = date($execution->end, strtotime('-13 days')) > $execution->begin ? date($execution->end, strtotime('-13 days')) : $execution->begin;
|
||||
$begin = date('Y-m-d', strtotime('-13 days', strtotime($execution->end))) > $execution->begin ? date('Y-m-d', strtotime('-13 days', strtotime($execution->end))) : $execution->begin;
|
||||
$end = $execution->end;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,8 +33,9 @@
|
||||
<div class="btn-toolbar pull-left">
|
||||
<?php
|
||||
$buildName = $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=all"), "<span class='text'>{$lang->bug->allBugs}</span>" . ($type == 'all' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='allTab' class='btn btn-link" . ('all' == $type ? ' btn-active-text' : '') . "'");
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=unresolved"), "<span class='text'>{$lang->bug->unResolved}</span>" . ($type == 'unresolved' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='unresolvedTab' class='btn btn-link" . ('unresolved' == $type ? ' btn-active-text' : '') . "'");
|
||||
$module = $type != 'bysearch' ? "¶m=$param" : '';
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=all$module"), "<span class='text'>{$lang->bug->allBugs}</span>" . ($type == 'all' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='allTab' class='btn btn-link" . ('all' == $type ? ' btn-active-text' : '') . "'");
|
||||
echo html::a($this->inlink('bug', "executionID={$execution->id}&productID={$productID}&branch={$branchID}&orderBy=status,id_desc&build=$buildID&type=unresolved$module"), "<span class='text'>{$lang->bug->unResolved}</span>" . ($type == 'unresolved' ? " <span class='label label-light label-badge'>{$pager->recTotal}</span>$buildName" : ''), '', "id='unresolvedTab' class='btn btn-link" . ('unresolved' == $type ? ' btn-active-text' : '') . "'");
|
||||
?>
|
||||
<a class="btn btn-link querybox-toggle" id="bysearchTab"><i class="icon icon-search muted"></i> <?php echo $lang->bug->search;?></a>
|
||||
</div>
|
||||
@@ -48,11 +49,6 @@
|
||||
<strong>
|
||||
<?php echo ($this->project->getById($execution->project)->name . ' / ' . $this->execution->getByID($execution->id)->name) ?>
|
||||
</strong>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id="mainContent" class='main-row split-row fade'>
|
||||
@@ -208,10 +204,5 @@
|
||||
<?php if(!empty($useDatatable)):?>
|
||||
$(function(){$('#executionBugForm').table();})
|
||||
<?php endif;?>
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -224,18 +224,6 @@
|
||||
<th><?php echo $lang->execution->team;?></th>
|
||||
<td colspan='3'><?php echo html::select('teamMembers[]', $users, '', "class='form-control picker-select' multiple"); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->kanban->columnWidth;?></th>
|
||||
<td colspan='2'><?php echo nl2br(html::radio('fluidBoard', $lang->kanbancolumn->fluidBoardList, 0));?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th id='c-name'><?php echo $lang->kanban->laneHeight;?></th>
|
||||
<td class='laneHeightBox' colspan='3'><?php echo nl2br(html::radio('heightType', $lang->kanbanlane->heightTypeList, 'auto', "onclick='setCardCount(this.value);'"));?></td>
|
||||
</tr>
|
||||
<tr class="hidden" id='cardBox'>
|
||||
<th class='c-count'><?php echo $lang->kanban->cardCount;?></th>
|
||||
<td><?php echo html::input('displayCards', '', "class='form-control' required placeholder='{$lang->kanban->cardCountTip}' autocomplete='off'");?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $showExecutionExec ? $lang->execution->execDesc : $lang->execution->desc;?></th>
|
||||
<td colspan='3'>
|
||||
|
||||
@@ -195,20 +195,6 @@
|
||||
<th><?php echo $lang->execution->team;?></th>
|
||||
<td colspan='2'><?php echo html::select('teamMembers[]', $users, array_keys($teamMembers), "class='form-control picker-select' multiple"); ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->kanban->columnWidth;?></th>
|
||||
<td colspan='2'><?php echo nl2br(html::radio('fluidBoard', $lang->kanbancolumn->fluidBoardList, $execution->fluidBoard));?></td>
|
||||
</tr>
|
||||
<?php if($laneCount > 1):?>
|
||||
<tr>
|
||||
<th id='c-name'><?php echo $lang->kanban->laneHeight;?></th>
|
||||
<td class='laneHeightBox' colspan='2'><?php echo nl2br(html::radio('heightType', $lang->kanbanlane->heightTypeList, $heightType, "onclick='setCardCount(this.value);'"));?></td>
|
||||
</tr>
|
||||
<tr class="hidden" id='cardBox'>
|
||||
<th class='c-count'><?php echo $lang->kanban->cardCount;?></th>
|
||||
<td><?php echo html::input('displayCards', $displayCards, "class='form-control' required placeholder='{$lang->kanban->cardCountTip}' autocomplete='off'");?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr>
|
||||
<th><?php echo $lang->execution->desc;?></th>
|
||||
<td colspan='2'><?php echo html::textarea('desc', htmlSpecialString($execution->desc), "rows='6' class='form-control kindeditor' hidefocus='true'");?></td>
|
||||
|
||||
@@ -226,6 +226,15 @@
|
||||
<td colspan='13'>
|
||||
<div class="table-row segments-list">
|
||||
<?php if($groupBy == 'assignedTo' and isset($members[$task->assignedTo])) printf($lang->execution->memberHours, zget($users, $task->assignedTo), $members[$task->assignedTo]->totalHours);?>
|
||||
<?php if($groupBy == 'assignedTo' and empty($task->assignedTo)):?>
|
||||
<div class="table-col">
|
||||
<div class="clearfix segments">
|
||||
<div class="segment">
|
||||
<div class="segment-title"><?php echo $groupName;?></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<?php printf($lang->execution->countSummary, $groupSum, $groupDoing, $groupWait);?>
|
||||
<?php printf($lang->execution->timeSummary, $groupEstimate . $lang->execution->workHourUnit, $groupConsumed . $lang->execution->workHourUnit, $groupLeft . $lang->execution->workHourUnit);?>
|
||||
</div>
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
</td>
|
||||
<td title="<?php echo $executions[$task->execution];?>"><?php echo $executions[$task->execution];?></td>
|
||||
<td><span class='label-pri label-pri-<?php echo $task->pri;?>' title='<?php echo zget($lang->task->priList, $task->pri, $task->pri);?>'><?php echo $task->pri == '0' ? '' : zget($lang->task->priList, $task->pri, $task->pri);?></span></td>
|
||||
<td class='text-left nobr'><?php if(!common::printLink('task', 'view', "task=$task->id", $task->name, '', "class='preview'", true, true)) echo $task->name;?></td>
|
||||
<td class='text-left nobr'><?php if(!common::printLink('task', 'view', "task=$task->id", $task->name, '', "class='preview iframe' data-width='90%'", true, true)) echo $task->name;?></td>
|
||||
<td <?php echo $class;?>><?php echo $task->assignedToRealName;?></td>
|
||||
<td title="<?php echo $task->left . ' ' . $lang->execution->workHour;?>"><?php echo $task->left . ' ' . $lang->execution->workHourUnit;?></td>
|
||||
<td class=<?php if(isset($task->delay)) echo 'delayed';?>><?php if(substr($task->deadline, 0, 4) > 0) echo $task->deadline;?></td>
|
||||
|
||||
@@ -156,14 +156,16 @@ js::set('priv',
|
||||
echo html::a('javascript:fullScreen()', "<i class='icon-fullscreen muted'></i> " . $lang->kanban->fullScreen, '', "class='btn btn-link'");
|
||||
$actions = '';
|
||||
$printCreateRegion = (common::hasPriv('kanban', 'createRegion') and $groupBy == 'default');
|
||||
$printSettingBtn = ($printCreateRegion or common::hasPriv('execution', 'edit') or common::hasPriv('execution', 'close') or common::hasPriv('execution', 'delete') or !empty($executionActions));
|
||||
$printSettingBtn = ($printCreateRegion or common::hasPriv('execution', 'edit') or common::hasPriv('execution', 'setKanban') or common::hasPriv('execution', 'close') or common::hasPriv('execution', 'delete') or !empty($executionActions));
|
||||
|
||||
if($printSettingBtn)
|
||||
{
|
||||
$actions .= html::a('javascript:;', "<i class='icon icon-cog-outline'></i>" . $lang->kanban->setting, '', "data-toggle='dropdown' class='btn btn-link'");
|
||||
$actions .= "<ul id='kanbanActionMenu' class='dropdown-menu pull-right'>";
|
||||
$width = $this->app->getClientLang() == 'en' ? '750' : '650';
|
||||
$actions .= "<div class='btn-group menu-actions'>";
|
||||
$actions .= html::a('javascript:;', "<i class='icon icon-ellipsis-v'></i>", '', "data-toggle='dropdown' class='btn btn-link'");
|
||||
$actions .= "<ul class='dropdown-menu pull-right'>";
|
||||
$width = common::checkNotCN() ? '600px' : '470px';
|
||||
if($printCreateRegion) $actions .= '<li>' . html::a(helper::createLink('kanban', 'createRegion', "kanbanID=$execution->id&from=execution", '', true), '<i class="icon icon-plus"></i>' . $lang->kanban->createRegion, '', "class='iframe btn btn-link text-left'") . '</li>';
|
||||
if(common::hasPriv('execution', 'setKanban')) $actions .= '<li>' . html::a(helper::createLink('execution', 'setKanban', "executionID=$execution->id", '', true), '<i class="icon icon-cog-outline"></i>' . $lang->execution->setKanban, '', "class='iframe btn btn-link text-left' data-width='$width'") . '</li>';
|
||||
$kanbanActions = '';
|
||||
if(common::hasPriv('execution', 'edit')) $kanbanActions .= '<li>' . html::a(helper::createLink('execution', 'edit', "executionID=$execution->id", '', true), '<i class="icon icon-edit"></i>' . $lang->kanban->edit, '', "class='iframe btn btn-link text-left' data-width='80%'") . '</li>';
|
||||
if(common::hasPriv('execution', 'start')) $kanbanActions .= '<li class="startButton hidden">' . html::a(helper::createLink('execution', 'start', "executionID=$execution->id&from=kanban", '', true), '<i class="icon icon-play"></i>' . $lang->execution->start, '', "class='iframe btn btn-link text-left' data-width='75%'") . '</li>';
|
||||
@@ -174,9 +176,9 @@ js::set('priv',
|
||||
if(common::hasPriv('execution', 'delete')) $kanbanActions .= '<li>' . html::a(helper::createLink('execution', 'delete', "executionID=$execution->id"), '<i class="icon icon-trash"></i>' . $lang->delete, 'hiddenwin', "class='btn btn-link text-left'") . '</li>';
|
||||
if($kanbanActions)
|
||||
{
|
||||
$actions .= (common::hasPriv('kanban', 'createRegion') and (common::hasPriv('execution', 'edit') or common::hasPriv('execution', 'delete') or !empty($executionActions))) ? "<div class='divider'></div>" . $kanbanActions : $kanbanActions;
|
||||
$actions .= ((common::hasPriv('kanban', 'createRegion') or common::hasPriv('execution', 'setKanban')) and (common::hasPriv('execution', 'edit') or common::hasPriv('execution', 'delete') or !empty($executionActions))) ? "<div class='divider'></div>" . $kanbanActions : $kanbanActions;
|
||||
}
|
||||
$actions .= "</ul>";
|
||||
$actions .= '</ul></div>';
|
||||
}
|
||||
|
||||
echo $actions;
|
||||
|
||||
@@ -19,9 +19,11 @@
|
||||
<div class="btn-toolbar pull-left">
|
||||
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->execution->linkStory;?></span></span>
|
||||
</div>
|
||||
<?php if(!isonlybody()):?>
|
||||
<div class='btn-toolbar pull-right'>
|
||||
<?php echo html::a($browseLink, '<i class="icon icon-back icon-sm"></i> ' . $lang->goback, '', "class='btn btn-primary'");?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div id="mainContent">
|
||||
<div class="cell space-sm">
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
/**
|
||||
* The edit view of execution 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 execution
|
||||
* @version $Id: edit.html.php 4728 2013-05-03 06:14:34Z chencongzhi520@gmail.com $
|
||||
* @link http://www.zentao.net
|
||||
*/
|
||||
?>
|
||||
<?php include '../../common/view/header.html.php';?>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<div class='center-block'>
|
||||
<div class='main-header'>
|
||||
<h2>
|
||||
<?php echo $lang->execution->setKanban;?>
|
||||
</h2>
|
||||
</div>
|
||||
<form class='load-indicator main-form form-ajax' method='post' id='dataform'>
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th><?php echo $lang->kanban->columnWidth;?></th>
|
||||
<td colspan='2'><?php echo nl2br(html::radio('fluidBoard', $lang->kanbancolumn->fluidBoardList, $execution->fluidBoard));?></td>
|
||||
</tr>
|
||||
<?php if($laneCount > 1):?>
|
||||
<tr>
|
||||
<th id='c-name'><?php echo $lang->kanban->laneHeight;?></th>
|
||||
<td class='laneHeightBox' colspan='2'><?php echo nl2br(html::radio('heightType', $lang->kanbanlane->heightTypeList, $heightType, "onclick='setCardCount(this.value);'"));?></td>
|
||||
</tr>
|
||||
<tr class="hidden" id='cardBox'>
|
||||
<th class='c-count'><?php echo $lang->kanban->cardCount;?></th>
|
||||
<td><?php echo html::input('displayCards', $displayCards, "class='form-control' required placeholder='{$lang->kanban->cardCountTip}' autocomplete='off'");?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<tr><td colspan='3' class='text-center form-actions'><?php echo html::submitButton() . ' ' . html::backButton();?></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
@@ -155,11 +155,6 @@
|
||||
<strong>
|
||||
<?php echo ($this->project->getById($execution->project)->name . ' / ' . $this->execution->getByID($execution->id)->name) ?>
|
||||
</strong>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id="mainContent" class="main-row fade">
|
||||
@@ -398,11 +393,6 @@ $(function()
|
||||
}
|
||||
});
|
||||
});
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
<?php if(!empty($useDatatable)):?>
|
||||
$(function(){$('#executionStoryForm').table();})
|
||||
<?php endif;?>
|
||||
|
||||
@@ -174,11 +174,6 @@ body {margin-bottom: 25px;}
|
||||
<strong>
|
||||
<?php echo $projectName;?>
|
||||
</strong>
|
||||
<div class="linkButton" onclick="handleLinkButtonClick()">
|
||||
<span title="<?php echo $lang->viewDetails;?>">
|
||||
<i class="icon icon-import icon-rotate-270"></i>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div id="mainContent" class="main-row fade">
|
||||
@@ -475,12 +470,6 @@ $(function()
|
||||
});
|
||||
|
||||
<?php if($this->app->getViewType() == 'xhtml'):?>
|
||||
function handleLinkButtonClick()
|
||||
{
|
||||
var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
|
||||
window.open(xxcUrl);
|
||||
}
|
||||
|
||||
$(function()
|
||||
{
|
||||
function handleClientReady()
|
||||
|
||||
@@ -71,12 +71,13 @@
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$width = common::checkNotCN() ? '600px' : '470px';
|
||||
echo "<div class='btn-group menu-actions'>";
|
||||
echo html::a('javascript:;', "<i class='icon icon-ellipsis-v'></i>", '', "data-toggle='dropdown' class='btn btn-link'");
|
||||
echo "<ul class='dropdown-menu pull-right'>";
|
||||
if(common::hasPriv('execution', 'printKanban')) echo '<li>' . html::a($this->createLink('execution', 'printKanban', "executionID=$executionID"), "<i class='icon icon-printer muted'></i> " . $lang->execution->printKanban, '', "class='iframe btn btn-link' id='printKanban' title='{$lang->execution->printKanban}' data-width='500'") . '</li>';
|
||||
if(common::hasPriv('execution', 'edit')) echo '<li>' . html::a(helper::createLink('execution', 'edit', "executionID=$execution->id", '', true), '<i class="icon icon-edit"></i>' . $lang->execution->edit, '', "class='iframe btn btn-link text-left' data-width='75%'") . '</li>';
|
||||
echo '<li>' .html::a('javascript:fullScreen()', "<i class='icon icon-fullscreen muted'></i> " . $lang->execution->fullScreen, '', "class='btn btn-link' title='{$lang->execution->fullScreen}' data-width='500'") . '</li>';
|
||||
if(common::hasPriv('execution', 'setKanban')) echo '<li>' . html::a(helper::createLink('execution', 'setKanban', "executionID=$execution->id", '', true), '<i class="icon icon-cog-outline"></i>' . $lang->execution->setKanban, '', "class='iframe btn btn-link text-left' data-width='$width'") . '</li>';
|
||||
if(common::hasPriv('execution', 'printKanban')) echo '<li>' . html::a($this->createLink('execution', 'printKanban', "executionID=$executionID"), "<i class='icon icon-printer muted'></i>" . $lang->execution->printKanban, '', "class='iframe btn btn-link' id='printKanban' title='{$lang->execution->printKanban}' data-width='500'") . '</li>';
|
||||
echo '<li>' .html::a('javascript:fullScreen()', "<i class='icon icon-fullscreen muted'></i>" . $lang->execution->fullScreen, '', "class='btn btn-link' title='{$lang->execution->fullScreen}' data-width='500'") . '</li>';
|
||||
echo '</ul></div>';
|
||||
?>
|
||||
<?php
|
||||
|
||||
@@ -269,8 +269,10 @@
|
||||
<p>
|
||||
<?php if($execution->deleted):?>
|
||||
<span class='label label-danger label-outline'><?php echo $lang->execution->deleted;?></span>
|
||||
<?php endif; ?>
|
||||
<?php endif;?>
|
||||
<?php if(!empty($execution->lifetime)):?>
|
||||
<span class="label label-primary label-outline"><?php echo zget($lang->execution->lifeTimeList, $execution->lifetime);?></span>
|
||||
<?php endif;?>
|
||||
<?php if(isset($execution->delay)):?>
|
||||
<span class="label label-danger label-outline"><?php echo $lang->execution->delayed;?></span>
|
||||
<?php else:?>
|
||||
|
||||
@@ -8,10 +8,10 @@ $lang->gitea->edit = 'Edit Gitea';
|
||||
$lang->gitea->view = 'View Gitea';
|
||||
$lang->gitea->delete = 'Delete Gitea';
|
||||
$lang->gitea->confirmDelete = 'Do you want to delete this Gitea server?';
|
||||
$lang->gitea->giteaAvatar = 'Avatar';
|
||||
$lang->gitea->bindUser = 'Bind User';
|
||||
$lang->gitea->giteaEmail = 'Email';
|
||||
$lang->gitea->giteaAvatar = 'Avatar';
|
||||
$lang->gitea->giteaAccount = 'Gitea Account';
|
||||
$lang->gitea->giteaEmail = 'Email';
|
||||
$lang->gitea->zentaoAccount = 'Zentao Account';
|
||||
$lang->gitea->bindingStatus = 'Binding Status';
|
||||
$lang->gitea->notBind = 'Not bind';
|
||||
|
||||
@@ -8,10 +8,10 @@ $lang->gitea->edit = 'Edit Gitea';
|
||||
$lang->gitea->view = 'View Gitea';
|
||||
$lang->gitea->delete = 'Delete Gitea';
|
||||
$lang->gitea->confirmDelete = 'Do you want to delete this Gitea server?';
|
||||
$lang->gitea->giteaAvatar = 'Avatar';
|
||||
$lang->gitea->bindUser = 'Bind User';
|
||||
$lang->gitea->giteaEmail = 'Email';
|
||||
$lang->gitea->giteaAvatar = 'Avatar';
|
||||
$lang->gitea->giteaAccount = 'Gitea Account';
|
||||
$lang->gitea->giteaEmail = 'Email';
|
||||
$lang->gitea->zentaoAccount = 'Zentao Account';
|
||||
$lang->gitea->bindingStatus = 'Binding Status';
|
||||
$lang->gitea->notBind = 'Not bind';
|
||||
|
||||
@@ -8,10 +8,10 @@ $lang->gitea->edit = 'Edit Gitea';
|
||||
$lang->gitea->view = 'View Gitea';
|
||||
$lang->gitea->delete = 'Delete Gitea';
|
||||
$lang->gitea->confirmDelete = 'Do you want to delete this Gitea server?';
|
||||
$lang->gitea->giteaAvatar = 'Avatar';
|
||||
$lang->gitea->bindUser = 'Bind User';
|
||||
$lang->gitea->giteaEmail = 'Email';
|
||||
$lang->gitea->giteaAvatar = 'Avatar';
|
||||
$lang->gitea->giteaAccount = 'Gitea Account';
|
||||
$lang->gitea->giteaEmail = 'Email';
|
||||
$lang->gitea->zentaoAccount = 'Zentao Account';
|
||||
$lang->gitea->bindingStatus = 'Binding Status';
|
||||
$lang->gitea->notBind = 'Not bind';
|
||||
|
||||
+4
-32
@@ -384,6 +384,10 @@ class giteaModel extends model
|
||||
$project->path_with_namespace = $project->full_name;
|
||||
$project->http_url_to_repo = $project->html_url;
|
||||
$project->name_with_namespace = $project->full_name;
|
||||
|
||||
$gitea = $this->getByID($giteaID);
|
||||
$oauth = "oauth2:{$gitea->token}@";
|
||||
$project->tokenCloneUrl = preg_replace('/(http(s)?:\/\/)/', "\$1$oauth", $project->html_url);
|
||||
}
|
||||
|
||||
return $project;
|
||||
@@ -600,36 +604,4 @@ class giteaModel extends model
|
||||
|
||||
return $newBranches;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check remote url.
|
||||
*
|
||||
* @param int $giteaID
|
||||
* @param string $project
|
||||
* @param string $client
|
||||
* @param string $path
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function checkRemoteUrl($giteaID, $project, $client, $path)
|
||||
{
|
||||
if(chdir($path))
|
||||
{
|
||||
$url = new stdclass();
|
||||
$remote = execCmd(escapeCmd("$client remote -v"), 'array');
|
||||
$pregHttp = '/http(s)?:\/\/(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+)*\.git/';
|
||||
$pregSSH = '/ssh:\/\/git@[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+)*\.git/';
|
||||
|
||||
if(preg_match($pregHttp, $remote[0], $matches)) $url->http = $matches[0];
|
||||
if(preg_match($pregSSH, $remote[0], $matches)) $url->ssh = $matches[0];
|
||||
|
||||
$project = $this->apiGetSingleProject($giteaID, $project);
|
||||
if(isset($project->clone_url))
|
||||
{
|
||||
if($project->clone_url == $url->http or $project->ssh_url == $url->ssh) return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
<th class='c-id'><?php common::printOrderLink('id', $orderBy, $vars, $lang->gitea->id);?></th>
|
||||
<th class='c-name w-300px'><?php common::printOrderLink('name', $orderBy, $vars, $lang->gitea->name);?></th>
|
||||
<th class='text'><?php common::printOrderLink('url', $orderBy, $vars, $lang->gitea->url);?></th>
|
||||
<th class='c-actions-3'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-3 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
<th class='c-id'><?php common::printOrderLink('id', $orderBy, $vars, $lang->gitlab->id);?></th>
|
||||
<th class='c-name w-300px'><?php common::printOrderLink('name', $orderBy, $vars, $lang->gitlab->name);?></th>
|
||||
<th class='text-left'><?php common::printOrderLink('url', $orderBy, $vars, $lang->gitlab->url);?></th>
|
||||
<th class='c-actions-3'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-3 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<th class='c-name text-left'><?php common::printOrderLink('name', $orderBy, $vars, $lang->gitlab->group->name);?></th>
|
||||
<th class='text-left'><?php common::printOrderLink('path', $orderBy, $vars, $lang->gitlab->group->path);?></th>
|
||||
<th class='text-left'><?php echo $lang->gitlab->group->createOn;?></th>
|
||||
<th class='c-actions-3'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-3 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<th class='c-name'><?php common::printOrderLink('name', $orderBy, $vars, $lang->gitlab->project->name);?></th>
|
||||
<th class='text'></th>
|
||||
<th class='text'><?php echo $lang->gitlab->lastUpdate;?></th>
|
||||
<th class='c-actions-8'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-9 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -60,6 +60,8 @@
|
||||
<td class='text' title='<?php echo substr($gitlabProject->last_activity_at, 0, 10);?>'><?php echo substr($gitlabProject->last_activity_at, 0, 10);?></td>
|
||||
<td class='c-actions'>
|
||||
<?php
|
||||
echo common::buildIconButton('gitlab', 'browseBranch', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'treemap', '', '', false, '', $this->lang->gitlab->browseBranch, 0, $gitlabProject->default_branch);
|
||||
echo common::buildIconButton('gitlab', 'browseTag', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'tag', '', '', false, '', $this->lang->gitlab->browseTag, 0, $gitlabProject->default_branch);
|
||||
echo common::buildIconButton('gitlab', 'manageBranchPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'branch-lock', '', '', false, '', $this->lang->gitlab->browseBranchPriv, 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch));
|
||||
echo common::buildIconButton('gitlab', 'manageTagPriv', "gitlabID=$gitlabID&projectID=$gitlabProject->id", '', 'list', 'tag-lock', '', '', false, '', $this->lang->gitlab->browseTagPriv, 0, ($gitlabProject->isMaintainer and $gitlabProject->default_branch));
|
||||
echo common::buildIconButton('gitlab', 'manageProjectMembers', 'repoID=' . zget($repoPairs, $gitlabProject->id), '', 'list', 'team', '', '', false, '', '', 0, isset($repoPairs[$gitlabProject->id]));
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<th class='c-name text-left'><?php common::printOrderLink('name', $orderBy, $vars, $lang->gitlab->tag->name);?></th>
|
||||
<th class='text-left'><?php echo $lang->gitlab->tag->lastCommitter;?></th>
|
||||
<th class='text-left'><?php common::printOrderLink('updated', $orderBy, $vars, $lang->gitlab->tag->lastCommittedDate);?></th>
|
||||
<th class='c-actions-1'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-1 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<th class='c-name text w-400px'></th>
|
||||
<th class='text'><?php echo $lang->gitlab->user->createOn;?></th>
|
||||
<th class='text'><?php echo $lang->gitlab->user->lastActivity;?></th>
|
||||
<th class='c-actions-4'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-2'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -91,6 +91,7 @@ class group extends control
|
||||
if(!empty($_POST))
|
||||
{
|
||||
$this->group->update($groupID);
|
||||
if(dao::isError()) return print(js::error(dao::getError()));
|
||||
if(isonlybody()) return print(js::closeModal('parent.parent', 'this'));
|
||||
return print(js::locate($this->createLink('group', 'browse'), 'parent'));
|
||||
}
|
||||
@@ -191,8 +192,8 @@ class group extends control
|
||||
if($type == 'byModule') $result = $this->group->updatePrivByModule();
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
if($type == 'byGroup') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('managePriv', "type=byGroup¶m=$param&menu=$menu&version=$version")));
|
||||
if($type == 'byModule') return print(js::alert($this->lang->saveSuccess) . js::execute('window.parent.location.reload()'));
|
||||
if($type == 'byGroup') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'reload'));
|
||||
if($type == 'byModule') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => 'window.parent.location.reload()'));
|
||||
}
|
||||
|
||||
if($type == 'byGroup')
|
||||
|
||||
@@ -46,6 +46,7 @@ $lang->group->group = 'Group';
|
||||
$lang->group->more = 'More';
|
||||
$lang->group->allCheck = 'All';
|
||||
$lang->group->noGroup = 'No group';
|
||||
$lang->group->repeat = "『%s』『%s』exists.Please adjust it and try again.";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'new') $lang->group->noneProject = 'No Project';
|
||||
|
||||
@@ -46,6 +46,7 @@ $lang->group->group = 'Group';
|
||||
$lang->group->more = 'More';
|
||||
$lang->group->allCheck = 'All';
|
||||
$lang->group->noGroup = 'No group';
|
||||
$lang->group->repeat = "『%s』『%s』exists.Please adjust it and try again.";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'new') $lang->group->noneProject = 'No Project';
|
||||
|
||||
@@ -46,6 +46,7 @@ $lang->group->group = 'Group';
|
||||
$lang->group->more = 'More';
|
||||
$lang->group->allCheck = 'All';
|
||||
$lang->group->noGroup = 'Aucun groupe';
|
||||
$lang->group->repeat = "『%s』『%s』exists.Please adjust it and try again.";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'new') $lang->group->noneProject = 'No Project';
|
||||
|
||||
@@ -767,6 +767,7 @@ $lang->resource->execution->storyEstimate = 'storyEstimate';
|
||||
$lang->resource->execution->storyView = 'storyView';
|
||||
if($config->systemMode == 'new') $lang->resource->execution->executionkanban = 'kanbanAction';
|
||||
$lang->resource->execution->kanban = 'RDKanban';
|
||||
$lang->resource->execution->setKanban = 'setKanban';
|
||||
//if($config->systemMode == 'classic') $lang->resource->project->list = 'list';
|
||||
|
||||
//$lang->execution->methodOrder[0] = 'index';
|
||||
@@ -825,6 +826,7 @@ $lang->execution->methodOrder[255] = 'unbindWhitelist';
|
||||
$lang->execution->methodOrder[260] = 'storyEstimate';
|
||||
$lang->execution->methodOrder[265] = 'executionkanban';
|
||||
$lang->execution->methodOrder[270] = 'kanban';
|
||||
$lang->execution->methodOrder[275] = 'setKanban';
|
||||
|
||||
/* Task. */
|
||||
$lang->resource->task = new stdclass();
|
||||
|
||||
@@ -46,6 +46,7 @@ $lang->group->group = '分组';
|
||||
$lang->group->more = '更多';
|
||||
$lang->group->allCheck = '全部';
|
||||
$lang->group->noGroup = '暂时没有分组。';
|
||||
$lang->group->repeat = "『%s』已经有『%s』这条记录了,请调整后再试。";
|
||||
|
||||
global $config;
|
||||
if($config->systemMode == 'new') $lang->group->noneProject = '暂时没有项目';
|
||||
|
||||
@@ -27,7 +27,8 @@ class groupModel extends model
|
||||
unset($group->limited);
|
||||
$group->role = 'limited';
|
||||
}
|
||||
$this->dao->insert(TABLE_GROUP)->data($group)->batchCheck($this->config->group->create->requiredFields, 'notempty')->exec();
|
||||
$this->lang->error->unique = $this->lang->group->repeat;
|
||||
$this->dao->insert(TABLE_GROUP)->data($group)->batchCheck($this->config->group->create->requiredFields, 'notempty')->check('name', 'unique')->exec();
|
||||
return $this->dao->lastInsertId();
|
||||
}
|
||||
|
||||
@@ -41,7 +42,8 @@ class groupModel extends model
|
||||
public function update($groupID)
|
||||
{
|
||||
$group = fixer::input('post')->get();
|
||||
return $this->dao->update(TABLE_GROUP)->data($group)->batchCheck($this->config->group->edit->requiredFields, 'notempty')->where('id')->eq($groupID)->exec();
|
||||
$this->lang->error->unique = $this->lang->group->repeat;
|
||||
return $this->dao->update(TABLE_GROUP)->data($group)->batchCheck($this->config->group->edit->requiredFields, 'notempty')->check('name', 'unique', "id != {$groupID}")->where('id')->eq($groupID)->exec();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,6 +56,7 @@ class groupModel extends model
|
||||
public function copy($groupID)
|
||||
{
|
||||
$group = fixer::input('post')->remove('options')->get();
|
||||
$this->lang->error->unique = $this->lang->group->repeat;
|
||||
$this->dao->insert(TABLE_GROUP)->data($group)->check('name', 'unique')->check('name', 'notempty')->exec();
|
||||
if($this->post->options == false) return;
|
||||
if(!dao::isError())
|
||||
@@ -315,9 +318,9 @@ class groupModel extends model
|
||||
|
||||
/**
|
||||
* Get admins by object id list.
|
||||
*
|
||||
* @param int $idList
|
||||
* @param string $field
|
||||
*
|
||||
* @param int $idList
|
||||
* @param string $field
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div id='mainContent' class='main-content'>
|
||||
<form class="load-indicator main-form form-ajax" id="managePrivForm" method="post" target='hiddenwin'>
|
||||
<form class="load-indicator main-form form-ajax" id="managePrivForm" method="post">
|
||||
<table class='table table-hover table-striped table-bordered'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
|
||||
@@ -120,3 +120,5 @@ body.menu-hide {padding-left: 0;}
|
||||
{
|
||||
#upgradeContent{width: 85%;}
|
||||
}
|
||||
#searchbox .dropdown-menu > li.search-type-all{max-width: 250px}
|
||||
#searchbox .dropdown-menu > li.search-type-all a{width: 100%; overflow: hidden; text-overflow: ellipsis;}
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
* @param {string} [appCode] The code of target app to open
|
||||
* @return {void}
|
||||
*/
|
||||
function openTab(url, appCode)
|
||||
function openTab(url, appCode, forceReload)
|
||||
{
|
||||
/* Check params */
|
||||
if(!appCode)
|
||||
@@ -264,7 +264,9 @@
|
||||
}
|
||||
|
||||
/* Show page app and update iframe source */
|
||||
if (url)
|
||||
var iframe = app.$iframe[0];
|
||||
var isSameUrl = iframe && url && iframe.contentWindow.location.href.endsWith(url);
|
||||
if (url && (!isSameUrl || forceReload !== false))
|
||||
{
|
||||
app.$app.toggleClass('open-from-hidden', app.$app.is(':hidden'))
|
||||
reloadApp(appCode, url, true);
|
||||
@@ -441,7 +443,8 @@
|
||||
if(url === true) url = app.url;
|
||||
else if($.tabSession) url = $.tabSession.convertUrlWithTid(url);
|
||||
|
||||
var iframe = app.$iframe[0];
|
||||
var iframe = app.$iframe[0];
|
||||
var isSameUrl = iframe && url && iframe.contentWindow.location.href.endsWith(url);
|
||||
|
||||
/* Add hook to page before reload it */
|
||||
if (iframe && iframe.contentWindow.beforeAppReload)
|
||||
@@ -451,7 +454,7 @@
|
||||
|
||||
try
|
||||
{
|
||||
if(url) iframe.contentWindow.location.assign(url);
|
||||
if(url && !isSameUrl) iframe.contentWindow.location.assign(url);
|
||||
else iframe.contentWindow.location.reload(true);
|
||||
}
|
||||
catch(_)
|
||||
@@ -462,7 +465,7 @@
|
||||
if(!notTriggerEvent) app.$app.trigger('reloadapp', app);
|
||||
|
||||
if(url) $(iframe.contentWindow.document.body).hide(); // Code for task #59703.
|
||||
app.$app.addClass('loading');
|
||||
if(!isSameUrl) app.$app.addClass('loading');
|
||||
if(app._loadTimer) clearTimeout(app._loadTimer);
|
||||
app._loadTimer = setTimeout(function()
|
||||
{
|
||||
|
||||
+17
-17
@@ -139,16 +139,16 @@ class job extends control
|
||||
/**
|
||||
* Edit a job.
|
||||
*
|
||||
* @param int $id
|
||||
* @param int $jobID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function edit($id)
|
||||
public function edit($jobID)
|
||||
{
|
||||
$job = $this->job->getByID($id);
|
||||
$job = $this->job->getByID($jobID);
|
||||
if($_POST)
|
||||
{
|
||||
$this->job->update($id);
|
||||
$this->job->update($jobID);
|
||||
if(dao::isError())
|
||||
{
|
||||
$errors = dao::getError();
|
||||
@@ -174,7 +174,7 @@ class job extends control
|
||||
return $this->send(array('result' => 'fail', 'message' => $errors));
|
||||
}
|
||||
|
||||
$this->loadModel('action')->create('job', $id, 'edited');
|
||||
$this->loadModel('action')->create('job', $jobID, 'edited');
|
||||
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse', "repoID={$job->repo}")));
|
||||
}
|
||||
|
||||
@@ -190,7 +190,7 @@ class job extends control
|
||||
foreach($repoList as $repo)
|
||||
{
|
||||
if(empty($repo->synced)) continue;
|
||||
$repoPairs[$repo->id] = $repo->name;
|
||||
$repoPairs[$repo->id] = "[{$repo->SCM}] {$repo->name}";
|
||||
$repoTypes[$repo->id] = $repo->SCM;
|
||||
if(strtolower($repo->SCM) == 'gitlab') $gitlabRepos[$repo->id] = $repo->name;
|
||||
}
|
||||
@@ -221,15 +221,15 @@ class job extends control
|
||||
/**
|
||||
* Delete a job.
|
||||
*
|
||||
* @param int $id
|
||||
* @param int $jobID
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function delete($id, $confirm = 'no')
|
||||
public function delete($jobID, $confirm = 'no')
|
||||
{
|
||||
if($confirm != 'yes') return print(js::confirm($this->lang->job->confirmDelete, inlink('delete', "jobID=$id&confirm=yes")));
|
||||
if($confirm != 'yes') return print(js::confirm($this->lang->job->confirmDelete, inlink('delete', "jobID=$jobID&confirm=yes")));
|
||||
|
||||
$this->job->delete(TABLE_JOB, $id);
|
||||
$this->job->delete(TABLE_JOB, $jobID);
|
||||
echo js::reload('parent');
|
||||
}
|
||||
|
||||
@@ -317,27 +317,27 @@ class job extends control
|
||||
/**
|
||||
* Exec a job.
|
||||
*
|
||||
* @param int $id
|
||||
* @param int $jobID
|
||||
* @param string $showForm
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function exec($id)
|
||||
public function exec($jobID)
|
||||
{
|
||||
$job = $this->job->getByID($id);
|
||||
$job = $this->job->getByID($jobID);
|
||||
if(strtolower($job->engine) == 'gitlab')
|
||||
{
|
||||
if(!isset($job->reference) or !$job->reference)
|
||||
{
|
||||
return $this->send(array('result' => 'fail', 'message' => $this->lang->job->setReferenceTips, 'locate' => inlink('edit', "id=$id")));
|
||||
return $this->send(array('result' => 'fail', 'message' => $this->lang->job->setReferenceTips, 'locate' => inlink('edit', "id=$jobID")));
|
||||
}
|
||||
}
|
||||
|
||||
$compile = $this->job->exec($id);
|
||||
$compile = $this->job->exec($jobID);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
$this->app->loadLang('compile');
|
||||
$this->loadModel('action')->create('job', $id, 'executed');
|
||||
$this->loadModel('action')->create('job', $jobID, 'executed');
|
||||
return $this->send(array('result' => 'success', 'message' => sprintf($this->lang->job->sendExec, zget($this->lang->compile->statusList, $compile->status))));
|
||||
}
|
||||
|
||||
@@ -409,7 +409,7 @@ class job extends control
|
||||
}
|
||||
else
|
||||
{
|
||||
$repoPairs[$repo->id] = $repo->name;
|
||||
$repoPairs[$repo->id] = "[{$repo->SCM}] {$repo->name}";
|
||||
}
|
||||
}
|
||||
echo html::select('repo', $repoPairs, '', "class='form-control chosen'");
|
||||
|
||||
@@ -46,7 +46,7 @@ class jobModel extends model
|
||||
*/
|
||||
public function getList($repoID = 0, $orderBy = 'id_desc', $pager = null, $engine = '', $pipeline = '')
|
||||
{
|
||||
return $this->dao->select('t1.*, t2.name as repoName, t3.name as jenkinsName')->from(TABLE_JOB)->alias('t1')
|
||||
return $this->dao->select('t1.*, DATE_FORMAT(t1.lastExec, "%m-%d %H:%i") AS lastExec, t2.name as repoName, t3.name as jenkinsName')->from(TABLE_JOB)->alias('t1')
|
||||
->leftJoin(TABLE_REPO)->alias('t2')->on('t1.repo=t2.id')
|
||||
->leftJoin(TABLE_PIPELINE)->alias('t3')->on('t1.server=t3.id')
|
||||
->where('t1.deleted')->eq('0')
|
||||
@@ -182,7 +182,7 @@ class jobModel extends model
|
||||
$repo = $this->loadModel('repo')->getRepoByID($job->repo);
|
||||
$project = zget($repo, 'project');
|
||||
|
||||
$job->server = (int)zget($repo, 'gitlab', 0);
|
||||
$job->server = (int)zget($repo, 'serviceHost', 0);
|
||||
$job->pipeline = json_encode(array('project' => $project, 'reference' => $this->post->reference));
|
||||
}
|
||||
|
||||
@@ -300,7 +300,7 @@ class jobModel extends model
|
||||
$project = zget($repo, 'project');
|
||||
|
||||
$job->repo = $job->gitlabRepo;
|
||||
$job->server = (int)zget($repo, 'gitlab', 0);
|
||||
$job->server = (int)zget($repo, 'serviceHost', 0);
|
||||
$job->pipeline = json_encode(array('project' => $project, 'reference' => $this->post->reference));
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
<th class='text-left'><?php echo $lang->job->triggerType;?></th>
|
||||
<th class='c-status text-center'><?php common::printOrderLink('lastStatus', $orderBy, $vars, $lang->job->lastStatus);?></th>
|
||||
<th class='c-exec'><?php common::printOrderLink('lastExec', $orderBy, $vars, $lang->job->lastExec);?></th>
|
||||
<th class='c-actions-4'><?php echo $lang->actions;?></th>
|
||||
<th class='c-actions-4 text-center'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -72,7 +72,7 @@
|
||||
<td><?php if($job->lastStatus) echo $job->lastExec;?></td>
|
||||
<td class='c-actions text-center'>
|
||||
<?php
|
||||
common::printIcon('compile', 'browse', "jobID=$id", '', 'list', 'history');
|
||||
common::printIcon('compile', 'browse', "repoID={$job->repo}&jobID=$id", '', 'list', 'history');
|
||||
common::printIcon('job', 'edit', "jobID=$id", '', 'list', 'edit');
|
||||
common::printIcon('job', 'exec', "jobID=$id", '', 'list', 'play');
|
||||
if(common::hasPriv('job', 'delete')) echo html::a($this->createLink('job', 'delete', "jobID=$id"), '<i class="icon-trash"></i>', 'hiddenwin', "title='{$lang->job->delete}' class='btn'");
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
</tr>
|
||||
<tr class='commonRepo'>
|
||||
<th><?php echo $lang->job->repo; ?></th>
|
||||
<td><?php echo html::select('repo', $repoPairs, $job->repo, "class='form-control'"); ?></td>
|
||||
<td><?php echo html::select('repo', $repoPairs, $job->repo, "class='form-control chosen'"); ?></td>
|
||||
</tr>
|
||||
<tr class='gitlabRepo hide'>
|
||||
<th><?php echo $lang->job->repo; ?></th>
|
||||
|
||||
@@ -1512,7 +1512,7 @@ class kanban extends control
|
||||
$this->loadModel($objectType)->delete(constant($table), $objectID);
|
||||
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
$kanbanID = $regionID ? $this->kanban->getKanbanIDByregion($regionID) : $this->session->execution;
|
||||
$kanbanID = $regionID ? $this->kanban->getKanbanIDByRegion($regionID) : $this->session->execution;
|
||||
$browseType = $this->config->vision == 'lite' ? 'task' : $this->session->execLaneType;
|
||||
$groupBy = $this->session->execGroupBy ? $this->session->execGroupBy : 'default';
|
||||
$kanbanGroup = $this->kanban->getRDKanban($kanbanID, $browseType, 'id_desc', 0, $groupBy);
|
||||
|
||||
@@ -346,8 +346,8 @@ $lang->kanbanlane->modeList['independent'] = 'Independent Kanban column';
|
||||
$lang->kanbanlane->heightTypeList['auto'] = "Adaptive <span class='tip'>(Adaptive to card height and lane name height)</span>";
|
||||
$lang->kanbanlane->heightTypeList['custom'] = "Custom <span class='tip'>(Customize lane height based on number of cards)</span>";
|
||||
|
||||
$lang->kanbancolumn->fluidBoardList['0'] = 'Fixed';
|
||||
$lang->kanbancolumn->fluidBoardList['1'] = 'Auto Width';
|
||||
$lang->kanbancolumn->fluidBoardList['0'] = "Fixed<span class='tip'>(Keep all columns the same width)</span>";
|
||||
$lang->kanbancolumn->fluidBoardList['1'] = "Auto Width<span class='tip'>(Adapts to lane width)</span>";
|
||||
|
||||
$lang->kanbanlane->error = new stdclass();
|
||||
$lang->kanbanlane->error->mustBeInt = 'No. of cards must be a positive integer from 3 to 32767.';
|
||||
|
||||
@@ -346,8 +346,8 @@ $lang->kanbanlane->modeList['independent'] = 'Independent Kanban column';
|
||||
$lang->kanbanlane->heightTypeList['auto'] = "Adaptive <span class='tip'>(Adaptive to card height and lane name height)</span>";
|
||||
$lang->kanbanlane->heightTypeList['custom'] = "Custom <span class='tip'>(Customize lane height based on number of cards)</span>";
|
||||
|
||||
$lang->kanbancolumn->fluidBoardList['0'] = 'Fixed';
|
||||
$lang->kanbancolumn->fluidBoardList['1'] = 'Auto Width';
|
||||
$lang->kanbancolumn->fluidBoardList['0'] = "Fixed<span class='tip'>(Keep all columns the same width)</span>";
|
||||
$lang->kanbancolumn->fluidBoardList['1'] = "Auto Width<span class='tip'>(Adapts to lane width)</span>";
|
||||
|
||||
$lang->kanbanlane->error = new stdclass();
|
||||
$lang->kanbanlane->error->mustBeInt = 'No. of cards must be a positive integer from 3 to 32767.';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user