Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/238_wangzemei_68933

This commit is contained in:
wangzemei
2022-09-22 13:50:12 +08:00
67 changed files with 280 additions and 138 deletions
+11 -8
View File
@@ -2,6 +2,7 @@ stages:
- sonar
- unit_test
- uitest
- notify
- cleanup_packages
- package
sonarqube:
@@ -31,7 +32,7 @@ unit_test:
- "/home/gitlab-runner/bin/zentao-unittest.sh ${CI_PROJECT_DIR}"
allow_failure: true
only:
- master
- master
- merge_requests
uitest:
stage: uitest
@@ -39,14 +40,16 @@ uitest:
- "/home/gitlab-runner/bin/zentao-uitest.sh ${CI_PROJECT_DIR}"
allow_failure: true
only:
- master
- master
- merge_requests
notify:
stage: notify
script:
- "/home/gitlab-runner/bin/ci-notify.php"
when: on_success
only:
- master
- merge_requests
#notify:
# script:
# - 'curl --location --request POST ''http://api.lf.oop.cc/api/v1/xuan/chatMessage'' --header ''Content-Type: application/json'' --data-raw ''{"gid": "84be4c6e-02e3-4fdc-b081-318c0c1eca02", "title": "开源包下载地址", "content": "点击查看详情链接", "url": "http://10.0.7.242:8080/allpacks/"}'''
# when: on_success
# only:
# - master
cleanup_packages:
stage: cleanup_packages
script:
+1 -1
View File
@@ -82,7 +82,7 @@ $lang->action->dynamic->all = '所有';
$lang->action->dynamic->hidden = '已隐藏';
$lang->action->dynamic->search = '搜索';
$lang->action->periods['all'] = $lang->action->dynamic->all;
$lang->action->periods['all'] = '全部';
$lang->action->periods['today'] = $lang->action->dynamic->today;
$lang->action->periods['yesterday'] = $lang->action->dynamic->yesterday;
$lang->action->periods['thisweek'] = $lang->action->dynamic->thisWeek;
+1 -1
View File
@@ -14,7 +14,7 @@
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<?php $activeClass = $currentObjectType == 'all' ? 'btn-active-text' : '';?>
<?php echo html::a($this->createLink('action', 'trash', "objectType=all&type=$type"), "<span class='text'>" . $lang->all . "</span>", '', "class='btn btn-link $activeClass'");?>
<?php echo html::a($this->createLink('action', 'trash', "objectType=all&type=$type"), "<span class='text'>" . $lang->action->periods['all'] . "</span>", '', "class='btn btn-link $activeClass'");?>
<?php
/* Output the objectType order by preferredTypeConfig. */
foreach($preferredTypeConfig as $objectType)
+1 -1
View File
@@ -57,6 +57,6 @@ $lang->branch->statusList = array();
$lang->branch->statusList['active'] = '激活';
$lang->branch->statusList['closed'] = '已关闭';
$lang->branch->featureBar['manage']['all'] = '所有';
$lang->branch->featureBar['manage']['all'] = '全部';
$lang->branch->featureBar['manage']['active'] = '激活';
$lang->branch->featureBar['manage']['closed'] = '已关闭';
+9
View File
@@ -2313,6 +2313,15 @@ class bug extends control
{
$this->loadModel('port');
$this->session->set('bugPortParams', array('productID' => $productID, 'executionID' => $executionID, 'branch' => 'all'));
if(!$productID)
{
$this->config->bug->datatable->fieldList['module']['dataSource']['method'] = 'getAllModulePairs';
$this->config->bug->datatable->fieldList['module']['dataSource']['params'] = 'bug';
$this->config->bug->datatable->fieldList['project']['dataSource'] = array('module' => 'project', 'method' => 'getPairsByIdList', 'params' => $executionID);
$this->config->bug->datatable->fieldList['execution']['dataSource'] = array('module' => 'execution', 'method' => 'getPairs', 'params' => $executionID);
}
$this->port->export('bug');
$this->fetch('file', 'export2' . $_POST['fileType'], $_POST);
}
+2 -1
View File
@@ -335,7 +335,8 @@ function loadProductExecutions(productID, projectID = 0)
branch = $('#branch').val();
if(typeof(branch) == 'undefined') branch = 0;
link = createLink('product', 'ajaxGetExecutions', 'productID=' + productID + '&projectID=' + projectID + '&branch=' + branch);
var execution = $('#execution').val();
link = createLink('product', 'ajaxGetExecutions', 'productID=' + productID + '&projectID=' + projectID + '&branch=' + branch + '&number=&executionID=' + execution);
$('#executionIdBox').load(link, function()
{
$(this).find('select').chosen();
+1 -1
View File
@@ -413,7 +413,7 @@ $lang->bug->placeholder = new stdclass();
$lang->bug->placeholder->chooseBuilds = '选择相关版本...';
$lang->bug->placeholder->newBuildName = '新版本名称';
$lang->bug->featureBar['browse']['all'] = $lang->bug->allBugs;
$lang->bug->featureBar['browse']['all'] = '全部';
$lang->bug->featureBar['browse']['unclosed'] = $lang->bug->unclosed;
$lang->bug->featureBar['browse']['openedbyme'] = $lang->bug->openedByMe;
$lang->bug->featureBar['browse']['assigntome'] = $lang->bug->assignToMe;
+1 -1
View File
@@ -45,5 +45,5 @@ $lang->caselib->legendDesc = '描述';
$lang->caselib->libraryDelete = '您确认要删除该用例库吗?';
$lang->caselib->noModule = '<div>您现在还没有模块信息</div><div>请维护用例库模块</div>';
$lang->caselib->featureBar['browse']['all'] = '所有';
$lang->caselib->featureBar['browse']['all'] = '全部';
$lang->caselib->featureBar['browse']['wait'] = '待评审';
+10 -2
View File
@@ -1460,9 +1460,17 @@ class commonModel extends model
echo '<li>' . html::a(helper::createLink('misc', 'downloadClient', '', '', true), $lang->downloadClient, '', "title='$lang->downloadClient' class='iframe text-ellipsis' data-width='600'") . '</li>';
echo "<li class='dropdown-submenu' id='downloadMobile'><a href='javascript:;'>" . $lang->downloadMobile . "</a><ul class='dropdown-menu pull-left''>";
$appqrcode = self::http('https://www.zentao.net/page/appqrcode.json');
/* Intranet users use local pictures. */
if(!empty($appqrcode))
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://www.zentao.net/page/appqrcode.json');
curl_setopt($curl, CURLOPT_TIMEOUT_MS, 200);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 200);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
$connected = curl_exec($curl);
curl_close($curl);
if($connected)
{
echo "<li><div class='mobile-qrcode'><iframe src='https://www.zentao.net/page/appqrcode.html?v={$config->version}' frameborder='0' scrolling='no' seamless></iframe></div></li>";
}
+3
View File
@@ -21,6 +21,9 @@
</div>
</div>
</div>
<style>
#importNoticeModal .modal-dialog {top: 15% !important; max-height: 450px; overflow-y: auto;}
</style>
<script>
function submitForm(type)
{
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "No Department";
$lang->dept->confirmDelete = " Möchten Sie diese Abteilung löschen?";
$lang->dept->successSave = " Gespeichert!";
$lang->dept->repeatDepart = " Es gibt einen doppelten Abteilungsnamen, möchten Sie ihn wirklich hinzufügen?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'Diese Abteilung hat Unterabteilungen und kann daher nicht gelöscht werden!';
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "No Department";
$lang->dept->confirmDelete = " Do you want to delete this department?";
$lang->dept->successSave = " Saved!";
$lang->dept->repeatDepart = " There is a duplicate department name, are you sure to add it?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'This Department has child departments. You cannot delete it!';
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "No Department";
$lang->dept->confirmDelete = " Confirmez que vous voulez bien supprimer ce Compartiment ?";
$lang->dept->successSave = " Sauvé !";
$lang->dept->repeatDepart = " Il y a un nom de département en double, êtes-vous sûr de l'ajouter ?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'Ce Compartiment possède des domaines. Vous ne pouvez pas le supprimer !';
+1
View File
@@ -26,6 +26,7 @@ $lang->dept->dragAndSort = "Drag để sắp xếp";
$lang->dept->confirmDelete = " Bạn có muốn xóa this department?";
$lang->dept->successSave = " Saved!";
$lang->dept->repeatDepart = " Có một tên bộ phận trùng lặp, bạn có chắc chắn thêm nó không?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = 'This Department has child departments. You cannot xóa it!';
+1
View File
@@ -30,6 +30,7 @@ $lang->dept->noDepartment = "无部门";
$lang->dept->confirmDelete = " 您确定删除该部门吗?";
$lang->dept->successSave = " 修改成功。";
$lang->dept->repeatDepart = " 存在部门名称重复,您确认添加吗?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = '该部门有子部门,不能删除!';
+1
View File
@@ -29,6 +29,7 @@ $lang->dept->dragAndSort = "拖動排序";
$lang->dept->confirmDelete = " 您確定刪除該部門嗎?";
$lang->dept->successSave = " 修改成功。";
$lang->dept->repeatDepart = " 存在部門名稱重複,您確認添加嗎?";
$lang->dept->error = new stdclass();
$lang->dept->error->hasSons = '該部門有子部門,不能刪除!';
+41 -4
View File
@@ -11,6 +11,7 @@
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php js::set('repeatDepart', $lang->dept->repeatDepart);?>
<div id='mainMenu' class='clearfix'>
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->dept->common;?></span></span>
@@ -33,7 +34,7 @@
<div class='panel-title'><?php echo $lang->dept->manageChild;?></div>
</div>
<div class='panel-body'>
<form method='post' target='hiddenwin' action='<?php echo $this->createLink('dept', 'manageChild');?>'>
<form method='post' target='hiddenwin' action='<?php echo $this->createLink('dept', 'manageChild');?>' id="dataForm">
<table class='table table-form'>
<tr>
<td>
@@ -49,7 +50,7 @@
?>
</nobr>
</td>
<td class='w-300px'>
<td class='w-300px'>
<?php
$maxOrder = 0;
foreach($sons as $sonDept)
@@ -85,7 +86,7 @@ $(function()
name: 'deptTree',
initialState: 'preserve',
data: data,
sortable:
sortable:
{
lazy: true,
nested: true,
@@ -105,7 +106,7 @@ $(function()
$li.append($toggle);
return true;
},
actions:
actions:
{
sort:
{
@@ -172,6 +173,42 @@ $(function()
$(this).addClass('hover');
e.stopPropagation();
});
$("#dataForm").submit(function(e)
{
var postDept = new Array();
var depts = new Array();
$.each($('input[name*="depts[]"]'), function(index, value)
{
if($(this).val()) postDept.push($(this).val());
});
$.each($('input[name*="depts[id"]'), function(index, value)
{
if($(this).val()) depts.push($(this).val());
});
for(var i = 0; i < postDept.length; i++)
{
if(depts.indexOf(postDept[i]) > -1 || postDept[i] == postDept[i + 1])
{
if(confirm(repeatDepart))
{
var link = createLink('dept', 'manageChild');
break;
}
else
{
setTimeout(function()
{
$('#submit').removeAttr('disabled');
},10)
return false;
}
}
}
});
});
</script>
<?php include '../../common/view/footer.html.php';?>
+7 -7
View File
@@ -317,12 +317,12 @@ $lang->execution->groups['finishedBy'] = '完成者分组';
$lang->execution->groups['closedBy'] = '关闭者分组';
$lang->execution->groups['type'] = '类型分组';
$lang->execution->groupFilter['story']['all'] = '所有';
$lang->execution->groupFilter['story']['all'] = '全部';
$lang->execution->groupFilter['story']['linked'] = "已关联{$lang->SRCommon}的任务";
$lang->execution->groupFilter['pri']['all'] = '所有';
$lang->execution->groupFilter['pri']['all'] = '全部';
$lang->execution->groupFilter['pri']['noset'] = '未设置';
$lang->execution->groupFilter['assignedTo']['undone'] = '未完成';
$lang->execution->groupFilter['assignedTo']['all'] = '所有';
$lang->execution->groupFilter['assignedTo']['all'] = '全部';
$lang->execution->byQuery = '搜索';
@@ -501,7 +501,7 @@ $lang->execution->typeList['stage'] = '阶段';
$lang->execution->typeList['sprint'] = $lang->executionCommon;
$lang->execution->typeList['kanban'] = '看板';
$lang->execution->featureBar['task']['all'] = $lang->execution->allTasks;
$lang->execution->featureBar['task']['all'] = '全部';
$lang->execution->featureBar['task']['unclosed'] = $lang->execution->unclosed;
$lang->execution->featureBar['task']['assignedtome'] = $lang->execution->assignedToMe;
$lang->execution->featureBar['task']['myinvolved'] = $lang->execution->myInvolved;
@@ -509,17 +509,17 @@ $lang->execution->featureBar['task']['assignedbyme'] = $lang->execution->assigne
$lang->execution->featureBar['task']['needconfirm'] = "{$lang->SRCommon}变更";
$lang->execution->featureBar['task']['status'] = $lang->execution->statusSelects[''];
$lang->execution->featureBar['all']['all'] = $lang->execution->all;
$lang->execution->featureBar['all']['all'] = '全部';
$lang->execution->featureBar['all']['undone'] = $lang->execution->undone;
$lang->execution->featureBar['all']['wait'] = $lang->execution->statusList['wait'];
$lang->execution->featureBar['all']['doing'] = $lang->execution->statusList['doing'];
$lang->execution->featureBar['all']['suspended'] = $lang->execution->statusList['suspended'];
$lang->execution->featureBar['all']['closed'] = $lang->execution->statusList['closed'];
$lang->execution->featureBar['bug']['all'] = '所有';
$lang->execution->featureBar['bug']['all'] = '全部';
$lang->execution->featureBar['bug']['unresolved'] = '未解决';
$lang->execution->featureBar['build']['all'] = '所有版本';
$lang->execution->featureBar['build']['all'] = '全部版本';
$lang->execution->myExecutions = '我参与的';
$lang->execution->doingProject = '进行中的项目';
+1 -1
View File
@@ -33,7 +33,7 @@
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy&filter=$filterKey"), $name, '', "class='btn btn-link $active'");?>
<?php endforeach;?>
<?php else:?>
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy"), "<span class='text'>{$lang->execution->allTasks}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link btn-active-text'");?>
<?php echo html::a(inlink('grouptask', "executionID=$executionID&groupBy=$groupBy"), "<span class='text'>{$lang->execution->featureBar['task']['all']}</span> <span class='label label-light label-badge'>{$allCount}</span>", '', "class='btn btn-link btn-active-text'");?>
<?php endif;?>
</div>
<div class="btn-toolbar pull-right">
+1 -1
View File
@@ -116,7 +116,7 @@
<?php if(($hasStoryButton or $hasBugButton) and $hasTaskButton) echo '<li class="divider"></li>';?>
<?php if($canImportBug) echo '<li>' . html::a(helper::createLink('execution', 'importBug', "execution=$execution->id", '', true), $lang->execution->importBug, '', "class='iframe' data-width='90%'") . '</li>';?>
<?php endif;?>
<?php if($canCreateTask) echo '<li>' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe'") . '</li>';?>
<?php if($canCreateTask) echo '<li>' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe' data-width='80%'") . '</li>';?>
<?php if($canBatchCreateTask) echo '<li>' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe' data-width=90%") . '</li>';?>
</ul>
</div>
+1 -1
View File
@@ -13,7 +13,7 @@
</div>
</div>
<div class="btn-toolbar pull-left">
<?php echo html::a(inlink('testcase', "executionID=$executionID&productID=$productID&branchID=$branchID&type=$type&moduleID=$moduleID&orderBy=$orderBy"), "<span class='text'>{$lang->execution->all}</span>", '', "class='btn btn-link btn-active-text'");?>
<?php echo html::a(inlink('testcase', "executionID=$executionID&productID=$productID&branchID=$branchID&type=$type&moduleID=$moduleID&orderBy=$orderBy"), "<span class='text'>{$lang->execution->featureBar['all']['all']}</span>", '', "class='btn btn-link btn-active-text'");?>
</div>
<div class="btn-toolbar pull-right">
<?php if(common::canModify('execution', $execution)) echo html::a(helper::createLink('testcase', 'create', "productID=$productID&branch=0&moduleID=0&from=execution&param=$execution->id", '', '', '', true), "<i class='icon icon-plus'></i> " . $lang->testcase->create, '', "class='btn btn-primary' data-app='{$this->app->tab}'");?>
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = 'Create';
$lang->gitlab->branch->lastCommitter = 'Last Committer';
$lang->gitlab->branch->lastCommittedDate = 'Last Committed Date';
$lang->gitlab->branch->accessLevel = "Branch protection list";
$lang->gitlab->branch->mergeAllowed = "Merge Allowed";
$lang->gitlab->branch->pushAllowed = "Push Allowed";
$lang->gitlab->branch->mergeAllowed = "Allowed to merge";
$lang->gitlab->branch->pushAllowed = "Allowed to push";
$lang->gitlab->branch->placeholderSearch = "Branch name";
$lang->gitlab->branch->placeholderSelect = "Branch name";
$lang->gitlab->branch->confirmDelete = 'Branch will be writable for developers. Are you sure?';
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = 'Create';
$lang->gitlab->branch->lastCommitter = 'Last Committer';
$lang->gitlab->branch->lastCommittedDate = 'Last Committed Date';
$lang->gitlab->branch->accessLevel = "Branch protection list";
$lang->gitlab->branch->mergeAllowed = "Merge Allowed";
$lang->gitlab->branch->pushAllowed = "Push Allowed";
$lang->gitlab->branch->mergeAllowed = "Allowed to merge";
$lang->gitlab->branch->pushAllowed = "Allowed to push";
$lang->gitlab->branch->placeholderSearch = "Branch name";
$lang->gitlab->branch->placeholderSelect = "Branch name";
$lang->gitlab->branch->confirmDelete = 'Branch will be writable for developers. Are you sure?';
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = 'Create';
$lang->gitlab->branch->lastCommitter = 'Last Committer';
$lang->gitlab->branch->lastCommittedDate = 'Last Committed Date';
$lang->gitlab->branch->accessLevel = "Branch protection list";
$lang->gitlab->branch->mergeAllowed = "Merge Allowed";
$lang->gitlab->branch->pushAllowed = "Push Allowed";
$lang->gitlab->branch->mergeAllowed = "Allowed to merge";
$lang->gitlab->branch->pushAllowed = "Allowed to push";
$lang->gitlab->branch->placeholderSearch = "Branch name";
$lang->gitlab->branch->placeholderSelect = "Branch name";
$lang->gitlab->branch->confirmDelete = 'Branch will be writable for developers. Are you sure?';
+2 -2
View File
@@ -206,8 +206,8 @@ $lang->gitlab->branch->create = '创建';
$lang->gitlab->branch->lastCommitter = '最后提交';
$lang->gitlab->branch->lastCommittedDate = '最后修改时间';
$lang->gitlab->branch->accessLevel = "分支保护列表";
$lang->gitlab->branch->mergeAllowed = "允许合并到";
$lang->gitlab->branch->pushAllowed = "允许推送到";
$lang->gitlab->branch->mergeAllowed = "允许合并";
$lang->gitlab->branch->pushAllowed = "允许推送";
$lang->gitlab->branch->placeholderSearch = "请输入分支名称";
$lang->gitlab->branch->placeholderSelect = "请选择分支";
$lang->gitlab->branch->confirmDelete = '确定删除分支保护?';
+1
View File
@@ -1666,6 +1666,7 @@ $lang->resource->report->bugCreate = 'bugCreate';
$lang->resource->report->bugAssign = 'bugAssign';
$lang->resource->report->workload = 'workload';
$lang->resource->report->annualData = 'annual';
$lang->resource->report->allAnnualData = 'viewEveryoneAnnual';
$lang->report->methodOrder[0] = 'index';
$lang->report->methodOrder[5] = 'projectDeviation';
+14 -10
View File
@@ -157,24 +157,28 @@
.executionName .delayed {margin-right: 10px;}
#kanbanBox {position: relative;}
#regionTabs {background-color: #efefef; z-index: 100; display: flex;}
#regionTabs {background-color: #efefef; z-index: 100; display: flex; align-items: center; gap: 1.5rem; justify-content: space-between;}
#regionTabs .leftBtn.disabled i, #regionTabs .rightBtn.disabled i{color: #c2c2c2;}
#regionTabs .leftBtn i, #regionTabs .rightBtn i{vertical-align: 1px;}
#regionTabs .icon-angle-left, #regionTabs .icon-angle-right {font-size: 20px; vertical-align: -webkit-baseline-middle;}
#regionNavTabs {display: inline-flex; overflow: hidden; width: 100%; padding-left: 10px;}
#regionNavTabs > ul {display: inline-flex; border-bottom: unset;}
#regionNavTabs > ul > li {padding: 6px 15px; margin-bottom: 6px; border-radius: 4px 4px 0px 0px;}
#regionNavTabs > ul > li.active {background-color: #fff;}
#regionNavTabs > ul > li.active::before {content: ''; width: 10px; height: 10px; position: absolute; left: -10px; top: 21px; background: radial-gradient(circle at 0% 0%,transparent 10px,#fff 0);}
#regionNavTabs > ul > li.active::after {content: ''; width: 10px; height: 10px; position: absolute; left: calc(100%); top: 21px; background: radial-gradient(circle at 100% 0%,transparent 10px,#fff 0);}
#regionNavTabs > ul > li > a {max-width: 195px; overflow: hidden; white-space: nowrap; padding: 0; background-color: transparent;}
#regionNavTabs > ul > li.active > a:before {background: unset;}
#regionNavTabs {display: inline-flex; overflow: hidden;}
.leftBtn.hidden + #regionNavTabs {padding-left: 10px;}
#regionNavTabs > ul {display: inline-flex; border-bottom: none; margin-bottom: -3px;}
#regionNavTabs > ul > li {padding: 0; text-align: center;}
#regionNavTabs > ul > li > a {min-width: 134px; overflow: hidden; white-space: nowrap; z-index: 0; position: relative; padding: 1.7rem; margin-left: -20px; background: none; outline: 0;}
#regionNavTabs > ul > li:first-child > a {margin-left: 0;}
#regionNavTabs > ul > li.active > a {z-index: 1;}
#regionNavTabs > ul > li.active > a::before {background-color: #fff;}
#regionNavTabs > ul > li > a:before {content: ""; position: absolute; top: -1rem; left: 0; background: #f8f8f8; height: 100%; width: 100%; z-index: -1; border-top-left-radius: 1rem; border-top-right-radius: 1rem; transform: perspective(0.5rem) rotateX(2deg); transform-origin: bottom;}
#regionNavTabs > ul > li > a > span {vertical-align: bottom; overflow: hidden; max-width: 6em; white-space: nowrap; display: inline-block;}
#regionNavTabs > ul > li.active > a > span {color: #2b80ff!important;}
#regionTabs.affixed {margin-bottom: 5px; position: fixed; top: 0px;}
#regionTabs.affixed + #kanbanContainer .kanban-board.kanban-affixed > .kanban-header {margin-top: 30px;}
#regionTabs.affixed + #kanbanContainer .kanban-board.kanban-affixed > .kanban-header + .kanban-lane {margin-top: 38px;}
#regionTabs.affixed ul > li {margin-bottom: 0px !important;}
#regionTabs .region-actions .dropdown-menu {top: 25px;}
#region-tab-actions {display: none;}
#region-tab-actions.active {display: flex; position: relative; right: 0px; top: -2px;}
#region-tab-actions.active {display: flex;}
.region {display: none;}
.region.active {display: block;}
.region.active.notAll {margin-top: -5px;}
+5
View File
@@ -1865,6 +1865,8 @@ function swipeRegionNavTabs($object, direction)
{
/* If you swipe left, the distance is equal to the item's left. */
distance = - itemLeft + radius - ($item.prev().hasClass('active') ? radiusWidth : 0);
/* tab overlap width */
distance += 20;
if($item.prev().length == 0)
{
distance = 0;
@@ -1882,6 +1884,7 @@ function swipeRegionNavTabs($object, direction)
{
/* If you swipe right, the distance is equal to the left distance of item plus the width of item minus the width of the regionNavTabs. */
distance = offsetWidth - itemOffset - radius + nextRadius - radiusWidth * 2;
distance += 20;
if($item.next().length == 0)
{
distance = - objectWidth + offsetWidth - radiusWidth * 2;
@@ -1922,6 +1925,7 @@ function initRegionTabs()
if(acitiveItemLeft + distance < 0)
{
distance = - acitiveItemLeft;
distance += 20;
if($acitiveItem.prev().length == 0)
{
distance = 0;
@@ -1932,6 +1936,7 @@ function initRegionTabs()
else if(acitiveItemWidth + acitiveItemLeft + distance + radiusWidth * 2 > regionTabsWidth && acitiveItemLeft != 0 && acitiveItemWidth != 0)
{
distance = regionTabsWidth - acitiveItemWidth - acitiveItemLeft + (distance != 0 ? - radiusWidth * 2 : radiusWidth);
distance += 20;
if($acitiveItem.next().length == 0)
{
distance = regionTabsWidth - acitiveItemWidth - acitiveItemLeft - radiusWidth * 2;
+2 -2
View File
@@ -92,7 +92,7 @@
<?php $style = $this->app->clientLang == 'en' ? "style='width:80px'" : '';?>
<th class="c-pri" <?php echo $style;?> title=<?php echo $lang->todo->pri;?>> <?php common::printOrderLink('pri', $orderBy, $vars, $lang->priAB);?></th>
<th class="c-name"> <?php common::printOrderLink('name', $orderBy, $vars, $lang->todo->name);?></th>
<th class="c-user"> <?php common::printOrderLink('assignedBy', $orderBy, $vars, $lang->todo->assignedBy);?></th>
<th class="c-user"> <?php common::printOrderLink('assignedTo', $orderBy, $vars, $lang->todo->assignedTo);?></th>
<th class="c-begin"> <?php common::printOrderLink('begin', $orderBy, $vars, $lang->todo->beginAB);?></th>
<th class="c-end"> <?php common::printOrderLink('end', $orderBy, $vars, $lang->todo->endAB);?></th>
<th class="c-status"> <?php common::printOrderLink('status', $orderBy, $vars, $lang->todo->status);?></th>
@@ -115,7 +115,7 @@
<td class="c-type"><?php echo zget($lang->todo->typeList, $todo->type, '');?></td>
<td class="c-pri"><span title="<?php echo zget($lang->todo->priList, $todo->pri);?>" class='label-pri <?php echo 'label-pri-' . $todo->pri;?>' title='<?php echo zget($lang->todo->priList, $todo->pri, $todo->pri);?>'><?php echo zget($lang->todo->priList, $todo->pri)?></span></td>
<td class="c-name" title="<?php echo $todo->name;?>"><?php echo html::a($this->createLink('todo', 'view', "id=$todo->id&from=my", '', true), $todo->name, '', "data-toggle='modal' data-width='80%' data-type='iframe' data-title='" . $lang->todo->view . "' data-icon='check'");?></td>
<td><?php echo zget($users, $todo->assignedBy);?></td>
<td><?php echo zget($users, $todo->assignedTo);?></td>
<td class="c-begin"><?php echo $todo->begin;?></td>
<td class="c-end"><?php echo $todo->end;?></td>
<td class="c-status"><span class="status-todo status-<?php echo $todo->status;?>"><?php echo $lang->todo->statusList[$todo->status];?></span></td>
+1 -1
View File
@@ -186,7 +186,7 @@ $lang->product->statusList['closed'] = 'Geschlossen';
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Stakeholders and owner of the respective program, team members and stakeholders of the associated project can access)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Manager and Stakeholders of the respective program, team members and stakeholders of the associated project can access)";
}
else
{
+1 -1
View File
@@ -186,7 +186,7 @@ $lang->product->statusList['closed'] = 'Closed';
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Stakeholders and owner of the respective program, team members and stakeholders of the associated project can access)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Manager and Stakeholders of the respective program, team members and stakeholders of the associated project can access)";
}
else
{
+1 -1
View File
@@ -186,7 +186,7 @@ $lang->product->statusList['closed'] = 'Fermé';
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Stakeholders and owner of the respective program, team members and stakeholders of the associated project can access)";
$lang->product->aclList['private'] = "Private {$lang->productCommon} (Manager and Stakeholders of the respective program, team members and stakeholders of the associated project can access)";
}
else
{
+2 -2
View File
@@ -207,7 +207,7 @@ $lang->product->noModule = "<div>您现在还没有模块信息</div><div>
$lang->product->noProduct = "暂时没有{$lang->productCommon}。";
$lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon;
$lang->product->featureBar['browse']['allstory'] = $lang->product->allStory;
$lang->product->featureBar['browse']['allstory'] = '全部';
$lang->product->featureBar['browse']['unclosed'] = $lang->product->unclosed;
$lang->product->featureBar['browse']['assignedtome'] = $lang->product->assignedToMe;
$lang->product->featureBar['browse']['openedbyme'] = $lang->product->openedByMe;
@@ -216,7 +216,7 @@ $lang->product->featureBar['browse']['reviewbyme'] = $lang->product->reviewByM
$lang->product->featureBar['browse']['draftstory'] = $lang->product->draftStory;
$lang->product->featureBar['browse']['more'] = $lang->more;
$lang->product->featureBar['all']['all'] = '所有' . $lang->productCommon;
$lang->product->featureBar['all']['all'] = '全部' . $lang->productCommon;
$lang->product->featureBar['all']['noclosed'] = $lang->product->unclosed;
$lang->product->featureBar['all']['closed'] = $lang->product->statusList['closed'];
+4 -2
View File
@@ -388,8 +388,10 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
<div class="table-actions btn-toolbar">
<div class='btn-group dropup'>
<?php
$disabled = $canBatchEdit ? '' : "disabled='disabled'";
$actionLink = $this->createLink('story', 'batchEdit', "productID=$productID&projectID=$projectID&branch=$branch&storyType=$storyType");
foreach($stories as $story) $storyProductIds[$story->product] = $story->product;
$storyProductID = count($storyProductIds) > 1 ? 0 : $productID;
$disabled = $canBatchEdit ? '' : "disabled='disabled'";
$actionLink = $this->createLink('story', 'batchEdit', "productID=$storyProductID&projectID=$projectID&branch=$branch&storyType=$storyType");
?>
<?php if($canBatchEdit or $canBatchClose or $canBatchUnlink or $canBatchReview or $canBatchChangeStage or $canBatchChangeBranch) echo html::commonButton($lang->edit, "data-form-action='$actionLink' $disabled");?>
<?php if($canBatchEdit or $canBatchClose or $canBatchUnlink or $canBatchReview or $canBatchChangeStage or $canBatchChangeBranch):?>
+2 -2
View File
@@ -72,7 +72,7 @@
<?php if(count($track) != 0):?>
<?php $i = 0;?>
<?php foreach($track as $storyID => $story):?>
<?php if($i != 1) echo '<tr>';?>
<?php if($i > 0) echo '<tr>';?>
<td>
<?php if(isset($story->parent) and $story->parent > 0):?><span class="label label-badge label-light" title="<?php echo $this->lang->story->children;?>"><?php echo $this->lang->story->childrenAB;?></span><?php endif;?>
<?php echo html::a($this->createLink($module, 'view', "storyID=$storyID"), $story->title, '',"title='$story->title' data-app='$tab'");?>
@@ -108,7 +108,7 @@
<?php echo html::a($this->createLink('bug', 'view', "bugID=$bugID"), $bug->title, '', "title='$bug->title'") . '<br/>';?>
<?php endforeach;?>
</td>
<?php if($i != 1) echo '</tr>';?>
<?php if($i > 0) echo '</tr>';?>
<?php $i++;?>
<?php endforeach;?>
<?php endif;?>
+1 -1
View File
@@ -135,7 +135,7 @@ $lang->productplan->endLetterChildTip = "父计划[%s]的完成日期:%s,
$lang->productplan->beginLetterParentTip = "子计划[%s]的开始日期:%s,不能小于父计划的开始日期: %s";
$lang->productplan->endGreaterParentTip = "子计划[%s]的完成日期:%s,不能大于父计划的完成日期: %s";
$lang->productplan->featureBar['browse']['all'] = '所有';
$lang->productplan->featureBar['browse']['all'] = '全部';
$lang->productplan->featureBar['browse']['undone'] = '未完成';
$lang->productplan->featureBar['browse']['wait'] = '未开始';
$lang->productplan->featureBar['browse']['doing'] = '进行中';
+4 -2
View File
@@ -12,9 +12,11 @@ tbody.sortable > tr > td.sort-handler {color: #3c4353 !important;}
.has-prefix > span {flex: none;}
.has-prefix > a {padding-left: 5px;}
.has-suffix > a {max-width: calc(100% - 100px); padding-right: 5px; color: #0c60e1; display: inline-block; max-width: calc(100% - 50px);}
.has-suffix > a {padding-right: 5px; color: #0c60e1; display: inline-block; max-width: calc(100% - 50px);}
.is-nest-child span.table-nest-icon {visibility: hidden; width: 0;}
div.checkbox-primary + span.table-nest-icon {margin-left: 0px !important;}
#checkAll + label.hover:after {border-width: 0px;}
.c-budget {width:100px; text-align: right; padding-right:16px !important;}
.c-status {width: 65px !important;}
.c-status {width: 65px !important;}
+1 -1
View File
@@ -143,7 +143,7 @@ $lang->program->statusList['doing'] = '进行中';
$lang->program->statusList['suspended'] = '已挂起';
$lang->program->statusList['closed'] = '已关闭';
$lang->program->featureBar['browse']['all'] = '所有';
$lang->program->featureBar['browse']['all'] = '全部';
$lang->program->featureBar['browse']['unclosed'] = '未关闭';
$lang->program->featureBar['browse']['wait'] = '未开始';
$lang->program->featureBar['browse']['doing'] = '进行中';
-1
View File
@@ -29,7 +29,6 @@
<?php $label = "<span class='text'>$label</span>";?>
<?php echo html::a(inlink('browse', "status=$key&orderBy=$orderBy"), $label, '', "class='btn btn-link $active'");?>
<?php endforeach;?>
<?php if($status == 'all' or $status == 'bySearch') echo html::checkbox('showClosed', array('1' => $lang->program->showClosed), '', $this->cookie->showClosed ? 'checked=checked' : '');?>
<?php if(common::hasPriv('project', 'batchEdit') and $programType != 'bygrid' and $hasProject === true) echo html::checkbox('editProject', array('1' => $lang->project->edit), '', $this->cookie->editProject ? 'checked=checked' : '');?>
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->user->search;?></a>
</div>
+2 -2
View File
@@ -245,14 +245,14 @@ $lang->project->modelList['scrum'] = "Scrum";
$lang->project->modelList['waterfall'] = "瀑布";
$lang->project->modelList['kanban'] = "看板";
$lang->project->featureBar['browse']['all'] = '所有';
$lang->project->featureBar['browse']['all'] = '全部';
$lang->project->featureBar['browse']['undone'] = '未完成';
$lang->project->featureBar['browse']['wait'] = '未开始';
$lang->project->featureBar['browse']['doing'] = '进行中';
$lang->project->featureBar['browse']['suspended'] = '已挂起';
$lang->project->featureBar['browse']['closed'] = '已关闭';
$lang->project->featureBar['build']['all'] = '所有版本';
$lang->project->featureBar['build']['all'] = '全部版本';
$lang->project->aclList['private'] = "私有 (只有项目负责人、团队成员和干系人可访问)";
$lang->project->aclList['open'] = "公开 (有项目视图权限即可访问)";
+1 -1
View File
@@ -34,7 +34,7 @@
<?php
$buildName = $build ? " <span class='label label-danger'>Build:{$build->name}</span>" : '';
$module = $type != 'bysearch' ? "&param=$param" : '';
echo html::a($this->inlink('bug', "projectID={$project->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', "projectID={$project->id}&productID={$productID}&branch=$branchID&orderBy=status,id_desc&build=$buildID&type=all$module"), "<span class='text'>{$lang->bug->featureBar['browse']['all']}</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', "projectID={$project->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>
+3 -1
View File
@@ -210,7 +210,7 @@
</tr>
<tr>
<th><?php echo $lang->project->end;?></th>
<td><?php echo $project->end;?></td>
<td><?php echo $project->end = $project->end == LONG_TIME ? $this->lang->project->longTime : $project->end;;?></td>
<th><?php echo $lang->project->realEndAB;?></th>
<td><?php echo $project->realEnd == '0000-00-00' ? '' : $project->realEnd;?></td>
</tr>
@@ -246,6 +246,8 @@
<td><?php echo $statData->taskCount;?></td>
<th><?php echo $lang->bug->common;?></th>
<td><?php echo $statData->bugCount;?></td>
<th><?php echo $lang->project->budget;?></th>
<td><?php echo $project->budget;?></td>
</tr>
</tbody>
</table>
+1 -1
View File
@@ -24,7 +24,7 @@ $lang->projectstory->batchUnlinkTip = '其他需求已经移除,如下需求
global $app;
$app->loadLang('product');
$lang->projectstory->featureBar['story']['allstory'] = $lang->product->allStory;
$lang->projectstory->featureBar['story']['allstory'] = '全部';
$lang->projectstory->featureBar['story']['unclosed'] = $lang->product->unclosed;
$lang->projectstory->featureBar['story']['draft'] = $lang->product->draftStory;
$lang->projectstory->featureBar['story']['reviewing'] = $lang->product->reviewingStory;
+1 -1
View File
@@ -95,6 +95,6 @@ $lang->release->notifyList['ET'] = "所在{$lang->execution->common}团队成员
$lang->release->notifyList['PT'] = "所在项目团队成员";
$lang->release->notifyList['CT'] = "抄送给";
$lang->release->featureBar['browse']['all'] = $lang->release->all;
$lang->release->featureBar['browse']['all'] = '全部';
$lang->release->featureBar['browse']['normal'] = $lang->release->statusList['normal'];
$lang->release->featureBar['browse']['terminate'] = $lang->release->statusList['terminate'];
+3 -1
View File
@@ -292,6 +292,8 @@ class report extends control
$this->loadModel('dept');
$this->loadModel('user');
$super = common::hasPriv('report', 'allAnnualData');
$firstAction = $this->dao->select('*')->from(TABLE_ACTION)->orderBy('id')->limit(1)->fetch();
$currentYear = date('Y');
$firstYear = empty($firstAction) ? $currentYear : substr($firstAction->date, 0, 4);
@@ -329,7 +331,7 @@ class report extends control
$noDepartment = array('0' => '/' . $this->lang->dept->noDepartment);
$depts = $this->dept->getOptionMenu();
if(!$this->app->user->admin)
if(!$super)
{
$depts = ($dept and isset($depts[$dept])) ? array($dept => $depts[$dept]) : $noDepartment;
}
+11 -10
View File
@@ -9,16 +9,17 @@
* @version $Id: en.php 5080 2013-07-10 00:46:59Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->report->index = 'Report Home';
$lang->report->list = 'Report';
$lang->report->item = 'Item';
$lang->report->value = 'Value';
$lang->report->percent = '%';
$lang->report->undefined = 'Undefined';
$lang->report->query = 'Query';
$lang->report->annual = 'Annual Summary';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->index = 'Report Home';
$lang->report->list = 'Report';
$lang->report->item = 'Item';
$lang->report->value = 'Value';
$lang->report->percent = '%';
$lang->report->undefined = 'Undefined';
$lang->report->query = 'Query';
$lang->report->annual = 'Annual Summary';
$lang->report->project = 'Project';
$lang->report->PO = 'PO';
$lang->report->viewEveryoneAnnual = 'View everyone annual summary';
$lang->report->colors[] = 'AFD8F8';
$lang->report->colors[] = 'F6BD0F';
+11 -10
View File
@@ -9,16 +9,17 @@
* @version $Id: zh-cn.php 5080 2013-07-10 00:46:59Z wyd621@gmail.com $
* @link http://www.zentao.net
*/
$lang->report->index = '统计首页';
$lang->report->list = '统计报表';
$lang->report->item = '条目';
$lang->report->value = '值';
$lang->report->percent = '百分比';
$lang->report->undefined = '未设定';
$lang->report->query = '查询';
$lang->report->annual = '年度总结';
$lang->report->project = '项目';
$lang->report->PO = 'PO';
$lang->report->index = '统计首页';
$lang->report->list = '统计报表';
$lang->report->item = '条目';
$lang->report->value = '值';
$lang->report->percent = '百分比';
$lang->report->undefined = '未设定';
$lang->report->query = '查询';
$lang->report->annual = '年度总结';
$lang->report->project = '项目';
$lang->report->PO = 'PO';
$lang->report->viewEveryoneAnnual = '查看所有人年度总结';
$lang->report->colors[] = 'AFD8F8';
$lang->report->colors[] = 'F6BD0F';
+6 -4
View File
@@ -98,12 +98,13 @@ class reportModel extends model
*/
public function getExecutions($begin = 0, $end = 0)
{
$tasks = $this->dao->select('t1.*, t2.name as executionName, t3.name as projectName')->from(TABLE_TASK)->alias('t1')
$permission = common::hasPriv('report', 'showProject') or $this->app->user->admin;
$tasks = $this->dao->select('t1.*, t2.name as executionName, t3.name as projectName')->from(TABLE_TASK)->alias('t1')
->leftJoin(TABLE_EXECUTION)->alias('t2')->on('t1.execution = t2.id')
->leftJoin(TABLE_PROJECT)->alias('t3')->on('t1.project = t3.id')
->where('t1.status')->ne('cancel')
->andWhere('t1.deleted')->eq(0)
->beginIF(!$this->app->user->admin)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi()
->beginIF(!$permission)->andWhere('t2.id')->in($this->app->user->view->sprints)->fi()
->andWhere('t2.deleted')->eq(0)
->andWhere('t1.parent')->lt(1)
->andWhere('t2.status')->eq('closed')
@@ -140,11 +141,12 @@ class reportModel extends model
*/
public function getProducts($conditions, $storyType = 'story')
{
$products = $this->dao->select('t1.id as id, t1.code, t1.name, t1.PO')->from(TABLE_PRODUCT)->alias('t1')
$permission = common::hasPriv('report', 'showProduct') or $this->app->user->admin;
$products = $this->dao->select('t1.id as id, t1.code, t1.name, t1.PO')->from(TABLE_PRODUCT)->alias('t1')
->leftJoin(TABLE_PROGRAM)->alias('t2')->on('t1.program = t2.id')
->where('t1.deleted')->eq(0)
->beginIF(strpos($conditions, 'closedProduct') === false)->andWhere('t1.status')->ne('closed')->fi()
->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->products)->fi()
->beginIF(!$permission)->andWhere('t1.id')->in($this->app->user->view->products)->fi()
->orderBy('t2.order_asc, t1.line_desc, t1.order_asc')
->fetchAll('id');
+3 -4
View File
@@ -606,7 +606,7 @@ class story extends control
/* Init vars. */
$planID = $plan;
$pri = 0;
$pri = 3;
$estimate = '';
$title = '';
$spec = '';
@@ -750,6 +750,7 @@ class story extends control
$this->loadModel('file');
$this->app->loadLang('bug');
$story = $this->story->getById($storyID, 0, true);
$this->commonAction($storyID);
if(!empty($_POST))
{
@@ -793,8 +794,6 @@ class story extends control
return print(js::locate($this->createLink($this->app->rawModule, 'view', $params), 'parent'));
}
$this->commonAction($storyID);
/* Sort products. */
$myProducts = array();
$othersProducts = array();
@@ -847,7 +846,7 @@ class story extends control
if($product->type == 'normal' and !empty($story->branch)) $this->view->moduleOptionMenu += $this->tree->getModulesName($story->module);
$branch = $product->type == 'branch' ? ($story->branch > 0 ? $story->branch : '0') : 'all';
$productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, '');
$productStories = $this->story->getProductStoryPairs($story->product, $branch, 0, 'all', 'id_desc', 0, '', $story->type);
$this->view->title = $this->lang->story->edit . "STORY" . $this->lang->colon . $this->view->story->title;
$this->view->position[] = $this->lang->story->edit;
+1 -1
View File
@@ -460,7 +460,7 @@ $lang->story->subDivideTip['subStory'] = '子需求无法细分';
$lang->story->subDivideTip['notWait'] = '该需求%s,无法进行细分操作';
$lang->story->subDivideTip['notActive'] = '需求不是激活状态,无法进行细分操作';
$lang->story->featureBar['browse']['all'] = $lang->all;
$lang->story->featureBar['browse']['all'] = '全部';
$lang->story->featureBar['browse']['unclosed'] = $lang->story->unclosed;
$lang->story->featureBar['browse']['draft'] = $lang->story->statusList['draft'];
$lang->story->featureBar['browse']['reviewing'] = $lang->story->statusList['reviewing'];
+3 -2
View File
@@ -497,11 +497,12 @@ class storyModel extends model
{
if(empty($title)) continue;
$stories->reviewer[$i] = array_filter($stories->reviewer[$i]);
if(empty($stories->reviewer[$i]) and empty($stories->reviewerDitto[$i])) $stories->reviewer[$i] = array();
$reviewers = (isset($stories->reviewDitto[$i])) ? $reviewers : $stories->reviewer[$i];
$stories->reviewer[$i] = $reviewers;
$_POST['reviewer'][$i] = $reviewers;
if(empty(array_filter($stories->reviewer[$i])) and $forceReview)
if(empty($stories->reviewer[$i]) and $forceReview)
{
dao::$errors[] = $this->lang->story->errorEmptyReviewedBy;
return false;
@@ -4273,7 +4274,7 @@ class storyModel extends model
{
$menu .= "<div class='dividing-line'></div>";
}
$menu .= $this->buildMenu('story', 'edit', $params . "&kanbanGroup=default&storyType=$story->type", $story, $type, '', '', 'showinonlybody');
$tab = $this->app->tab == 'project' ? 'project' : 'qa';
+2 -2
View File
@@ -45,10 +45,10 @@ $config->task->defaultLoadCount = 50;
$config->task->custom = new stdclass();
$config->task->custom->createFields = $config->task->customCreateFields;
$config->task->custom->batchCreateFields = 'module,story,assignedTo,estimate,desc,pri';
$config->task->custom->batchCreateFields = 'module,story,assignedTo,estimate,estStarted,deadline,desc,pri';
$config->task->custom->batchEditFields = 'module,assignedTo,status,pri,estimate,record,left';
$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,regions,lanes,';
$config->task->excludeCheckFileds = ',pri,estStartedDitto,deadlineDitto,parent,regions,lanes,vision,region,';
$config->task->datatable = new stdclass();
$config->task->datatable->defaultField = array('id', 'pri', 'name', 'status', 'assignedTo', 'finishedBy', 'estimate', 'consumed', 'left', 'progress', 'deadline', 'actions');
+4 -4
View File
@@ -1149,7 +1149,7 @@ class task extends control
$kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $execLaneType, 'id_desc', 0, $execGroupBy, $rdSearchValue);
$kanbanData = json_encode($kanbanData);
return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)"));
return print(js::reload('parent') . js::execute("parent.parent.updateKanban($kanbanData)"));
}
if($from == 'taskkanban')
{
@@ -1159,9 +1159,9 @@ class task extends control
$kanbanData = $kanbanData[$kanbanType];
$kanbanData = json_encode($kanbanData);
return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban(\"task\", $kanbanData)"));
return print(js::reload('parent') . js::execute("parent.parent.updateKanban(\"task\", $kanbanData)"));
}
return print(js::closeModal('parent.parent', 'this'));
return print(js::reload('parent') . js::execute("if(typeof(parent.parent.ajaxRefresh) == 'function') parent.parent.ajaxRefresh()"));
}
return print(js::locate($this->createLink('task', 'view', "taskID=$taskID"), 'parent'));
}
@@ -1199,7 +1199,7 @@ class task extends control
$actionID = $this->loadModel('action')->create('task', $estimate->task, 'EditEstimate', $this->post->work);
$this->action->logHistory($actionID, $changes);
$url = $this->session->estimateList ? $this->session->estimateList : inlink('record', "taskID={$estimate->task}");
$url = $this->session->estimateList ? $this->session->estimateList : inlink('recordEstimate', "taskID={$estimate->task}");
return print(js::locate($url, 'parent'));
}
+1 -1
View File
@@ -14,7 +14,7 @@
#testStoryBox table tr td input {border: 0px;}
#testStoryBox table tr td .input-group .input-group-addon {border-left: 1px solid #dcdcdc; border-right: 1px solid #dcdcdc;}
#testStoryBox table button.btn {border: 0px;}
#testStoryBox .c-name {width: 300px;}
#testStoryBox .c-name {width: 120px;}
#testStoryBox .c-pri, #testStoryBox .c-estimate, #testStoryBox .c-actions {width: 70px;}
#testStoryBox .c-date {width: 140px;}
#testStoryBox .c-assignedTo {width: 100px; padding: 7px;}
+17 -3
View File
@@ -1,6 +1,7 @@
$(function()
{
if(config.onlybody == 'yes') $('.main-actions').css('width', '100%');
limitIframeLevel();
});
function assign(taskID, assignedTo)
@@ -10,7 +11,20 @@ function assign(taskID, assignedTo)
$('.assign').load(createLink('user', 'ajaxGetUser', 'taskID=' + taskID + '&assignedTo=' + assignedTo));
}
$(document).ready(function()
/**
* Ajax refresh
*
* @access public
* @return void
*/
function ajaxRefresh()
{
limitIframeLevel();
});
$.get(location.href, function(data)
{
$data = $(data);
$('#actionbox ol.histories-list').html($data.find('#actionbox ol.histories-list').html());
$('.side-col').html($data.find('.side-col').html());
if($('#actionbox ol.histories-list #lastComment').length > 0) $('#actionbox ol.histories-list #lastComment').kindeditor();
});
}
+1
View File
@@ -165,6 +165,7 @@ foreach(explode(',', $config->task->create->requiredFields) as $field)
<?php $i++;?>
<?php if($i > 30) break;?>
<?php endforeach;?>
<?php unset($members['ditto']);?>
</tbody>
</table>
</td>
+30 -12
View File
@@ -56,19 +56,23 @@
<td>
<div class='input-group'><?php echo html::input('currentConsumed', 0, "class='form-control'");?> <span class='input-group-addon'><?php echo $lang->task->hour;?></span></div>
</td>
</tr>
<tr>
<th><?php echo empty($task->team) ? $lang->task->consumed : $lang->task->myConsumed;?></th>
<td>
<?php $consumed = empty($task->team) ? $task->consumed : (float)$task->myConsumed;?>
<?php
echo "<span id='totalConsumed'>" . (float)$consumed . "</span> " . $lang->workingHour . html::hidden('consumed', $consumed);
js::set('consumed', $consumed);
?>
<div class='table-row'>
<div class='table-col strong w-80px text-right' style='padding-right:10px'><?php echo empty($task->team) ? $lang->task->consumed : $lang->task->myConsumed;?> </div>
<div class='table-col'>
<?php $consumed = empty($task->team) ? $task->consumed : (float)$task->myConsumed;?>
<?php
echo "<span id='totalConsumed'>" . (float)$consumed . "</span> " . $lang->workingHour . html::hidden('consumed', $consumed);
js::set('consumed', $consumed);
?>
</div>
</div>
</td>
</tr>
<tr>
</tr>
<tr class='<?php if($task->mode == 'multi') echo 'hidden'?>'>
<th><?php echo (!empty($task->team) and $task->mode == 'linear') ? $lang->task->transferTo : $lang->task->assign;?></th>
<th><?php echo $lang->task->assign;?></th>
<td>
<?php
if(!empty($task->team) and $task->mode == 'linear')
@@ -83,11 +87,25 @@
</td>
</tr>
<tr>
<th><?php echo empty($task->team) ? $lang->task->realStarted : $lang->task->my . $lang->task->realStarted;?></th>
<td><div class='datepicker-wrapper'><?php echo html::input('realStarted', $task->realStarted != '0000-00-00 00:00:00' ? $task->realStarted : '', "class='form-control form-datetime'");?></div></td><td></td>
<th><?php echo $lang->task->realStarted;?></th>
<td>
<div class='datepicker-wrapper'>
<?php
$realStarted = $task->realStarted;
$readonly = 'readonly';
if(helper::isZeroDate($realStarted))
{
$realStarted = '';
$readonly = '';
}
?>
<?php echo html::input('realStarted', $realStarted, "class='form-control" . ($readonly ? '' : ' form-datetime') . "' $readonly");?>
</div>
</td>
<td></td>
</tr>
<tr>
<th><?php echo empty($task->team) ? $lang->task->finishedDate : $lang->task->my . $lang->task->finishedDate;?></th>
<th><?php echo $lang->task->finishedDate;?></th>
<td><div class='datepicker-wrapper'><?php echo html::input('finishedDate', helper::now(), "class='form-control form-datetime'");?></div></td><td></td>
</tr>
<tr class='hide'>
+1 -1
View File
@@ -250,7 +250,7 @@ $lang->testcase->action->unlinkedfromproject = array('main' => '$date, 由 <st
$lang->testcase->action->linked2execution = array('main' => '$date, 由 <strong>$actor</strong> 关联到' . $lang->executionCommon . ' <strong>$extra</strong>。');
$lang->testcase->action->unlinkedfromexecution = array('main' => '$date, 由 <strong>$actor</strong> 从' . $lang->executionCommon . ' <strong>$extra</strong> 移除。');
$lang->testcase->featureBar['browse']['all'] = $lang->testcase->allCases;
$lang->testcase->featureBar['browse']['all'] = '全部';
$lang->testcase->featureBar['browse']['wait'] = '待评审';
$lang->testcase->featureBar['browse']['needconfirm'] = $lang->testcase->needConfirm;
$lang->testcase->featureBar['browse']['group'] = '分组查看';
+1 -1
View File
@@ -2504,8 +2504,8 @@ class testcaseModel extends model
return $this->buildMenu('testcase', 'confirmstorychange', $params, $case, 'browse', 'confirm', 'hiddenwin', '', '', '', $this->lang->confirm);
}
$menu .= $this->buildMenu('testtask', 'results', "runID=0&$params", $case, 'browse', '', '', 'iframe', true, "data-width='95%'");
$menu .= $this->buildMenu('testtask', 'runCase', "runID=0&$params&version=$case->version", $case, 'browse', 'play', '', 'runCase iframe', false, "data-width='95%'");
$menu .= $this->buildMenu('testtask', 'results', "runID=0&$params", $case, 'browse', '', '', 'iframe', true, "data-width='95%'");
$editParams = $params;
if($this->app->tab == 'project') $editParams .= "&comment=false&projectID={$this->session->project}";
+1
View File
@@ -24,3 +24,4 @@ $(function()
$('tr:first').click();
});
+1 -1
View File
@@ -148,7 +148,7 @@ $lang->testtask->finishedDateLess = '实际完成日期不能小于开始日期
$lang->testtask->finishedDateMore = '实际完成日期不能大于今天';
$lang->testtask->assignedToMe = '指派给我';
$lang->testtask->allCases = '所有用例';
$lang->testtask->allCases = '全部用例';
$lang->testtask->lblCases = '用例列表';
$lang->testtask->lblUnlinkCase = '移除用例';
+1 -1
View File
@@ -1622,8 +1622,8 @@ class testtaskModel extends model
common::printIcon('testcase', 'createBug', "product=$run->product&branch=$run->branch&extra=executionID=$task->execution,buildID=$task->build,caseID=$run->case,version=$run->version,runID=$run->id,testtask=$task->id", $run, 'list', 'bug', '', 'iframe', '', "data-width='90%'");
common::printIcon('testtask', 'results', "id=$run->id", $run, 'list', '', '', 'iframe', '', "data-width='90%'");
common::printIcon('testtask', 'runCase', "id=$run->id", $run, 'list', 'play', '', 'runCase iframe', false, "data-width='95%'");
common::printIcon('testtask', 'results', "id=$run->id", $run, 'list', '', '', 'iframe', '', "data-width='90%'");
if(common::hasPriv('testtask', 'unlinkCase', $run))
{
+1 -1
View File
@@ -1452,7 +1452,7 @@ class treeModel extends model
$module = $this->getById((int)$moduleID);
if(empty($module)) return array();
return $this->dao->select('id')->from(TABLE_MODULE)->where("CONCAT(',', path, ',')")->like("%,$module->path,%")->andWhere('deleted')->eq(0)->fetchPairs();
return $this->dao->select('id')->from(TABLE_MODULE)->where("CONCAT(',', path, ',')")->like("%$module->path%")->andWhere('deleted')->eq(0)->fetchPairs();
}
/**
+1 -1
View File
@@ -29,7 +29,7 @@ fields:
range: [],1-99,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,1-100,[]{4}
- field: password
note: "密码"
range: 123qwe!@#{346}
range: 123Qwe!@#{346}
format: md5
- field: role
note: "职位"
+1 -1
View File
@@ -15,7 +15,7 @@ class apiCheckModel
global $argv;
$path = $argv[1];
$entries = '';
if($argv[2]) $entries = $argv[2];
if(isset($argv[2])) $entries = $argv[2];
$this->run($argv[1], $entries);
}
+8 -2
View File
@@ -145,8 +145,14 @@ class db
{
$this->dao->query('DROP DATABASE IF EXISTS ' . $this->config->test->dbPrefix . $i);
$this->dao->query('CREATE DATABASE ' . $this->config->test->dbPrefix . $i);
shell_exec("mysql -h{$this->config->db->host} -u {$this->config->db->user} -p{$this->config->db->password} -P {$this->config->db->port} {$this->config->test->dbPrefix}{$i} < {$this->sqlFile}");
if($this->config->db->host = 'localhost' and $this->config->db->port = '3306')
{
shell_exec("mysql -u {$this->config->db->user} -p{$this->config->db->password} {$this->config->test->dbPrefix}{$i} < {$this->sqlFile}");
}
else
{
shell_exec("mysql -h{$this->config->db->host} -u {$this->config->db->user} -p{$this->config->db->password} -P {$this->config->db->port} {$this->config->test->dbPrefix}{$i} < {$this->sqlFile}");
}
}
}
}
+19 -5
View File
@@ -218,12 +218,19 @@ function zdRun()
function copyDB()
{
global $config, $dao;
$dumpCommand = "mysqldump -h%s -P%s -u%s -p%s %s --add-drop-table=false > %s";
$sqlFile = TEST_BASEHPATH . DS . 'tmp/raw.sql';
$sqlFile = TEST_BASEHPATH . DS . 'tmp/raw.sql';
if($config->db->host = 'localhost' and $config->db->port = '3306')
{
$dumpCommand = "mysqldump -u%s -p%s %s --add-drop-table=false > %s";
$dumpCommand = sprintf($dumpCommand, $config->db->user, $config->db->password, $config->test->rawDB, $sqlFile);
}
else
{
$dumpCommand = "mysqldump -h%s -P%s -u%s -p%s %s --add-drop-table=false > %s";
$dumpCommand = sprintf($dumpCommand, $config->db->host, $config->db->port, $config->db->user, $config->db->password, $config->test->rawDB, $sqlFile);
}
$currentDBNum = $dao->query("select count(*) as num from information_schema.SCHEMATA where SCHEMA_NAME like '" . $config->test->dbPrefix . "%'")->fetch();
$dumpCommand = sprintf($dumpCommand, $config->db->host, $config->db->port, $config->db->user, $config->db->password, $config->test->rawDB, $sqlFile);
shell_exec($dumpCommand);
$dbNum = $config->test->dbNum;
@@ -238,7 +245,14 @@ function copyDB()
{
if($currentDBNum->num > 0) $dao->query('DROP DATABASE IF EXISTS ' . $db);
$dao->query('CREATE DATABASE ' . $db);
shell_exec("mysql -h{$config->db->host} -P {$config->db->port} -u{$config->db->user} -p{$config->db->password} $db < $sqlFile");
if($config->db->host = 'localhost' and $config->db->port = '3306')
{
shell_exec("mysql -u{$config->db->user} -p{$config->db->password} $db < $sqlFile");
}
else
{
shell_exec("mysql -h{$config->db->host} -P {$config->db->port} -u{$config->db->user} -p{$config->db->password} $db < $sqlFile");
}
echo '数据库<' . $db . '>复制成功!' . PHP_EOL;
}
}