Merge branch 'master' of https://gitlab.zcorp.cc/easycorp/zentaopms into sprint/wangzemei/70012
This commit is contained in:
@@ -102,6 +102,11 @@ zentaoxx:
|
||||
mkdir zentaoxx/db/
|
||||
cp zentaoxx/db_bak/upgradexuanxuan*.sql zentaoxx/db_bak/xuanxuan.sql zentaoxx/db/
|
||||
rm -rf zentaoxx/db_bak/
|
||||
sed -i "s/\$$accountAdmin = \$$this->dao->select('account, admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();/\$$accountAdmin = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch();\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\n\$$accountAdmin->admin = in_array(\$$accountAdmin->account, \$$adminArray) ? 'super' : '';\n/" zentaoxx/extension/xuan/im/model/chat.php
|
||||
sed -i "/->on('tc.ownedBy=tu.account')/{ N ; s/type/tc.type/}" zentaoxx/extension/xuan/im/model/chat.php
|
||||
sed -i "s/\$$super = \$$this->dao->select('admin')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('admin');/\$$account = \$$this->dao->select('account')->from(TABLE_USER)->where('id')->eq(\$$userID)->fetch('account');\n\$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\n\$$adminArray = explode(',', \$$admins);\n\$$super = in_array(\$$account, \$$adminArray) ? 'super' : '';/g" zentaoxx/extension/xuan/im/control.php
|
||||
sed -i "/foreach(\$$users as \$$user)/i \$$admins = \$$this->dao->select('admins')->from(TABLE_COMPANY)->where('id')->eq(\$$this->app->company->id)->fetch('admins');\$$adminArray = explode(',', \$$admins);" zentaoxx/extension/xuan/im/model/user.php
|
||||
sed -i "/if(\!isset(\$$user->signed)) \$$user->signed = 0;/a \$$user->admin = in_array(\$$user->account, \$$adminArray) ? 'super' : '';" zentaoxx/extension/xuan/im/model/user.php
|
||||
sed -i 's/XXBVERSION/$(XVERSION)/g' zentaoxx/config/ext/_0_xuanxuan.php
|
||||
sed -i "/\$$config->xuanxuan->backend /c\\\$$config->xuanxuan->backend = 'zentao';" zentaoxx/config/ext/_0_xuanxuan.php
|
||||
sed -i 's/site,//' zentaoxx/extension/xuan/im/model/user.php
|
||||
|
||||
@@ -169,6 +169,7 @@ $filter->execution->export = new stdclass();
|
||||
$filter->tree->browse = new stdclass();
|
||||
$filter->productplan->browse = new stdclass();
|
||||
$filter->kanban->space = new stdclass();
|
||||
$filter->execution->kanban = new stdclass();
|
||||
|
||||
$filter->index->index->get['open'] = 'reg::base64';
|
||||
|
||||
@@ -300,6 +301,7 @@ $filter->execution->story->cookie['storyProductParam'] = 'int';
|
||||
$filter->execution->story->cookie['storyBranchParam'] = 'int';
|
||||
$filter->execution->story->cookie['executionStoryOrder'] = 'code';
|
||||
$filter->execution->export->cookie['checkedItem'] = 'reg::checked';
|
||||
$filter->execution->kanban->cookie['taskToOpen'] = 'int';
|
||||
|
||||
$filter->testcase->browse->cookie['caseModule'] = 'int';
|
||||
$filter->testcase->browse->cookie['caseSuite'] = 'int';
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
UPDATE `zt_workflowlabel` SET `label` = '全部' where `buildin` = 0 AND `role` = 'custom' AND `label` = '所有' AND `action` = 'browse';
|
||||
@@ -188,7 +188,7 @@ $config->bug->datatable->fieldList['pri']['name'] = $lang->bug->pri;
|
||||
|
||||
$config->bug->datatable->fieldList['confirmed']['title'] = 'confirmedAB';
|
||||
$config->bug->datatable->fieldList['confirmed']['fixed'] = 'left';
|
||||
$config->bug->datatable->fieldList['confirmed']['width'] = '50';
|
||||
$config->bug->datatable->fieldList['confirmed']['width'] = '100';
|
||||
$config->bug->datatable->fieldList['confirmed']['required'] = 'no';
|
||||
|
||||
$config->bug->datatable->fieldList['title']['title'] = 'title';
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
.closed, .closed a {color: gray; text-decoration:line-through;}
|
||||
.resolved, .resolved a {color: #8EC21F; text-decoration: none;}
|
||||
.tree .closed, .tree .closed a {color: #003366; text-decoration: none;}
|
||||
.confirm0 {color: gray;}
|
||||
.confirm1 {color: green;}
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
#bugForm .setting {height: 25px;}
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
.confirm0 {color:gray; font-size:9px}
|
||||
.confirm1 {color:green; font-size:9px}
|
||||
.confirm0 {font-size:9px}
|
||||
.confirm1 {font-size:9px}
|
||||
|
||||
@@ -285,8 +285,8 @@ $lang->bug->statusList['resolved'] = 'Resolved';
|
||||
$lang->bug->statusList['closed'] = 'Closed';
|
||||
|
||||
$lang->bug->confirmedList[''] = '';
|
||||
$lang->bug->confirmedList[1] = 'Yes';
|
||||
$lang->bug->confirmedList[0] = 'No';
|
||||
$lang->bug->confirmedList[1] = 'confirmed';
|
||||
$lang->bug->confirmedList[0] = 'unconfirmed';
|
||||
|
||||
$lang->bug->resolutionList[''] = '';
|
||||
$lang->bug->resolutionList['bydesign'] = 'As Designed';
|
||||
|
||||
@@ -285,8 +285,8 @@ $lang->bug->statusList['resolved'] = 'Résolu';
|
||||
$lang->bug->statusList['closed'] = 'Fermé';
|
||||
|
||||
$lang->bug->confirmedList[''] = '';
|
||||
$lang->bug->confirmedList[1] = 'Oui';
|
||||
$lang->bug->confirmedList[0] = 'Non';
|
||||
$lang->bug->confirmedList[1] = 'confirmé';
|
||||
$lang->bug->confirmedList[0] = 'non confirmé';
|
||||
|
||||
$lang->bug->resolutionList[''] = '';
|
||||
$lang->bug->resolutionList['bydesign'] = 'Du Design';
|
||||
|
||||
@@ -265,8 +265,8 @@ $lang->bug->statusList['active'] = 'Kích hoạt';
|
||||
$lang->bug->statusList['resolved'] = 'Đã giải quyết';
|
||||
$lang->bug->statusList['closed'] = 'Đã đóng';
|
||||
|
||||
$lang->bug->confirmedList[1] = 'Có';
|
||||
$lang->bug->confirmedList[0] = 'Không';
|
||||
$lang->bug->confirmedList[1] = 'đã xác nhận';
|
||||
$lang->bug->confirmedList[0] = 'chưa được xác nhận';
|
||||
|
||||
$lang->bug->resolutionList[''] = '';
|
||||
$lang->bug->resolutionList['bydesign'] = 'Như thiết kế';
|
||||
|
||||
@@ -285,8 +285,8 @@ $lang->bug->statusList['resolved'] = '已解决';
|
||||
$lang->bug->statusList['closed'] = '已关闭';
|
||||
|
||||
$lang->bug->confirmedList[''] = '';
|
||||
$lang->bug->confirmedList[1] = '是';
|
||||
$lang->bug->confirmedList[0] = '否';
|
||||
$lang->bug->confirmedList[1] = '已确认';
|
||||
$lang->bug->confirmedList[0] = '未确认';
|
||||
|
||||
$lang->bug->resolutionList[''] = '';
|
||||
$lang->bug->resolutionList['bydesign'] = '设计如此';
|
||||
|
||||
@@ -283,8 +283,8 @@ $lang->bug->statusList['resolved'] = '已解決';
|
||||
$lang->bug->statusList['closed'] = '已關閉';
|
||||
|
||||
$lang->bug->confirmedList[''] = '';
|
||||
$lang->bug->confirmedList[1] = '是';
|
||||
$lang->bug->confirmedList[0] = '否';
|
||||
$lang->bug->confirmedList[1] = '已確認';
|
||||
$lang->bug->confirmedList[0] = '未確認';
|
||||
|
||||
$lang->bug->resolutionList[''] = '';
|
||||
$lang->bug->resolutionList['bydesign'] = '設計如此';
|
||||
|
||||
@@ -2365,10 +2365,10 @@ class execution extends control
|
||||
/**
|
||||
* Kanban.
|
||||
*
|
||||
* @param int $executionID
|
||||
* @param string $browseType
|
||||
* @param string $orderBy
|
||||
* @param string $groupBy
|
||||
* @param int $executionID
|
||||
* @param string $browseType
|
||||
* @param string $orderBy
|
||||
* @param string $groupBy
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
@@ -2422,7 +2422,6 @@ class execution extends control
|
||||
}
|
||||
foreach($products as $product) $productNames[$product->id] = $product->name;
|
||||
|
||||
|
||||
$plans = $this->execution->getPlans($products, 'skipParent', $executionID);
|
||||
$allPlans = array('' => '');
|
||||
if(!empty($plans))
|
||||
@@ -2430,6 +2429,9 @@ class execution extends control
|
||||
foreach($plans as $plan) $allPlans += $plan;
|
||||
}
|
||||
|
||||
$taskToOpen = !empty($_COOKIE['taskToOpen']) ? $_COOKIE['taskToOpen'] : 0;
|
||||
setcookie('taskToOpen', 0, time() - 3600, $this->config->webRoot, '', $this->config->cookieSecure, true);
|
||||
|
||||
$this->view->title = $this->lang->kanban->view;
|
||||
$this->view->users = $users;
|
||||
$this->view->regions = $kanbanData;
|
||||
@@ -2448,6 +2450,7 @@ class execution extends control
|
||||
$this->view->kanbanData = $kanbanData;
|
||||
$this->view->executionActions = $executionActions;
|
||||
$this->view->kanban = $this->lang->execution->kanban;
|
||||
$this->view->taskToOpen = $taskToOpen;
|
||||
$this->display();
|
||||
}
|
||||
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
|
||||
.c-severity {width: 80px;}
|
||||
.c-confirmed {overflow: hidden;}
|
||||
.c-confirmed {overflow: hidden; text-align: center;}
|
||||
|
||||
@@ -304,4 +304,33 @@ js::set('priv',
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php js::set('taskToOpen', $taskToOpen);?>
|
||||
<script>
|
||||
$(function()
|
||||
{
|
||||
/* Open the task details popup from dynamic. */
|
||||
if(taskToOpen)
|
||||
{
|
||||
var kanban = document.querySelector('#kanban');
|
||||
var observer = new MutationObserver(function (mutationsList, observer)
|
||||
{
|
||||
for(var mutation of mutationsList)
|
||||
{
|
||||
var target = mutation.target;
|
||||
if(mutation.type == 'childList' && target.tagName.toLowerCase() == 'a' && target.classList.contains('title') && target.parentElement.parentElement.dataset.id == taskToOpen && target.parentElement.className.includes('kanban-item-task'))
|
||||
{
|
||||
var a = document.querySelector('[data-id="' + taskToOpen +'"] a.title');
|
||||
if(a)
|
||||
{
|
||||
observer.disconnect();
|
||||
a.click();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
observer.observe(kanban, {subtree: true, childList: true});
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<?php include '../../common/view/footer.html.php';?>
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
.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 > a {min-width: 134px; overflow: hidden; white-space: nowrap; z-index: 0; position: relative; padding: 1.7rem; margin-left: -20px; background: none; outline: 0; cursor: pointer !important;}
|
||||
#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;}
|
||||
@@ -173,8 +173,9 @@
|
||||
#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 {margin-top: 43px;}
|
||||
#regionTabs.affixed + #kanbanContainer .kanban-board.kanban-affixed > .kanban-header + .kanban-lane {margin-top: 38px;}
|
||||
#regionTabs.affixed ul {margin-bottom: -10px;}
|
||||
#regionTabs.affixed ul > li {margin-bottom: 0px !important;}
|
||||
#regionTabs .region-actions .dropdown-menu {top: 25px;}
|
||||
#region-tab-actions {display: none;}
|
||||
|
||||
@@ -1991,6 +1991,7 @@ $('[data-tab]').on('shown.zui.tab', function(e)
|
||||
if($(this).hasClass('archivedColumn')) $(this).find('a').attr('href', "javascript:loadMore(\"Column\", " + regionID + ')');
|
||||
});
|
||||
}
|
||||
window.scrollTo(0, 0);
|
||||
|
||||
/* To manually refresh stay under the current tab, save the ID of the current region. */
|
||||
var url = createLink('kanban', 'ajaxSaveRegionID', 'regionID=' + regionID);
|
||||
|
||||
@@ -77,7 +77,7 @@ $lang->mr->assignedToMe = '指派给我';
|
||||
$lang->mr->createdByMe = '由我创建';
|
||||
|
||||
$lang->mr->statusList = array();
|
||||
$lang->mr->statusList['all'] = '所有';
|
||||
$lang->mr->statusList['all'] = '全部';
|
||||
$lang->mr->statusList['opened'] = '开放中';
|
||||
$lang->mr->statusList['merged'] = '已合并';
|
||||
$lang->mr->statusList['closed'] = '已关闭';
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
td.delayed {color: #fff; background: #e84e0f !important;}
|
||||
.confirmed {color: #008000;}
|
||||
.unconfirmed {color: #808080;}
|
||||
.c-confirm {width:50px;}
|
||||
.c-confirm {width:60px;}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
<?php common::printIcon('project', 'group', "projectID=$project->id", $project, 'list', 'lock', '', '', false, "data-group='project'", '', $project->id);?>
|
||||
<?php if(common::hasPriv('project','manageProducts') || common::hasPriv('project','whitelist') || common::hasPriv('project','delete')):?>
|
||||
<div class='btn-group'>
|
||||
<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title="<?php echo $this->lang->more;?>"><i class='icon-more-alt'></i></button>
|
||||
<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title="<?php echo $this->lang->more;?>"><i class='icon-ellipsis-v'></i></button>
|
||||
<ul class='dropdown-menu pull-right text-center' role='menu'>
|
||||
<?php common::printIcon('project', 'manageProducts', "projectID=$project->id", $project, 'list', 'link', '', '', false, "data-group='project'", '', $project->id);?>
|
||||
<?php common::printIcon('project', 'whitelist', "projectID=$project->id&module=project", $project, 'list', 'shield-check', '', '', false, "data-group='project'", '', $project->id);?>
|
||||
|
||||
@@ -41,6 +41,7 @@ $projectIDParam = $isProjectStory ? "projectID=$projectID&" : '';
|
||||
.btn-group a i.icon-plus, .btn-group a i.icon-link {font-size: 16px;}
|
||||
.btn-group a.btn-secondary, .btn-group a.btn-primary {border-right: 1px solid rgba(255,255,255,0.2);}
|
||||
.btn-group button.dropdown-toggle.btn-secondary, .btn-group button.dropdown-toggle.btn-primary {padding:6px;}
|
||||
|
||||
#productStoryForm table tbody tr td.c-actions {overflow: visible;}
|
||||
#productStoryForm table tbody tr td.c-actions .dividing-line {width: 1px; height: 16px; display: inline-block; vertical-align: middle; background: #E4E4E4; margin: 0 4px 0 0;}
|
||||
</style>
|
||||
|
||||
@@ -1579,7 +1579,7 @@ class programModel extends model
|
||||
if(common::hasPriv('project', 'manageProducts') || common::hasPriv('project', 'whitelist') || common::hasPriv('project', 'delete'))
|
||||
{
|
||||
$menu .= "<div class='btn-group'>";
|
||||
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title='{$this->lang->more}'><i class='icon-more-alt'></i></button>";
|
||||
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='dropdown' title='{$this->lang->more}'><i class='icon-ellipsis-v'></i></button>";
|
||||
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu'>";
|
||||
$menu .= $this->buildMenu('project', 'manageProducts', "$params&from=program", $program, $type, 'link', '', '', '', "data-app='project'");
|
||||
|
||||
|
||||
@@ -108,6 +108,7 @@
|
||||
#programTableList.sortable-sorting > tr.drag-row {opacity: 1;}
|
||||
#programTableList > tr.drop-not-allowed {opacity: 0.1!important}
|
||||
#programList .c-actions {overflow: visible;}
|
||||
#programList .c-actions .btn-group:last-child {margin-left: -4px;}
|
||||
#programList > thead > tr > th .table-nest-toggle-global {top: 6px}
|
||||
#programList > thead > tr > th .table-nest-toggle-global:before {color: #a6aab8;}
|
||||
#programTableList > tr:last-child .c-actions .dropdown-menu {top: auto; bottom: 100%; margin-bottom: -5px;}
|
||||
@@ -116,6 +117,10 @@
|
||||
#programTableList .icon-scrum:before {content: '\e9a2';}
|
||||
#programTableList .icon-waterfall:before {content: '\e9a4';}
|
||||
#programTableList .icon-kanban:before {content: '\e983';}
|
||||
#programTableList .is-top-level {font-weight: bold;}
|
||||
#programTableList .has-nest-child > .c-name > a {color: #0b0f18!important;}
|
||||
#programTableList .is-nest-child > .c-name > a {color: #2463C7!important;}
|
||||
#programTableList .c-name .label-danger {position: absolute; right: 10px; padding: 2px 4px;}
|
||||
</style>
|
||||
<?php js::set('originOrders', $originOrders);?>
|
||||
<script>
|
||||
|
||||
@@ -143,6 +143,16 @@ function setParentProgram(parentProgram)
|
||||
$('#plansBox .col-sm-4').prepend(planSelect);
|
||||
$('#plansBox .col-sm-4 select').chosen();
|
||||
}
|
||||
|
||||
if(parentProgram != 0)
|
||||
{
|
||||
$('.aclBox').html($('#programAcl').html());
|
||||
}
|
||||
else
|
||||
{
|
||||
$('.aclBox').html($('#projectAcl').html());
|
||||
}
|
||||
|
||||
budgetOverrunTips();
|
||||
outOfDateTip();
|
||||
refreshBudgetUnit(data);
|
||||
|
||||
@@ -2612,7 +2612,7 @@ class projectModel extends model
|
||||
if(common::hasPriv($moduleName, 'manageProducts') || common::hasPriv($moduleName, 'whitelist') || common::hasPriv($moduleName, 'delete'))
|
||||
{
|
||||
$menu .= "<div class='btn-group'>";
|
||||
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}'><i class='icon-more-alt'></i></button>";
|
||||
$menu .= "<button type='button' class='btn dropdown-toggle' data-toggle='context-dropdown' title='{$this->lang->more}'><i class='icon-ellipsis-v'></i></button>";
|
||||
$menu .= "<ul class='dropdown-menu pull-right text-center' role='menu'>";
|
||||
$menu .= $this->buildMenu($moduleName, 'manageProducts', $params . "&from={$this->app->tab}", $project, 'browse', 'link', '', 'btn-action', '', '', $this->lang->project->manageProducts);
|
||||
if($this->config->systemMode == 'new') $menu .= $this->buildMenu('project', 'whitelist', "$params&module=project&from=$from", $project, 'browse', 'shield-check', '', 'btn-action', '', $dataApp);
|
||||
|
||||
@@ -58,6 +58,10 @@ if($app->tab == 'execution')
|
||||
{
|
||||
$config->story->datatable->defaultField = array('id','order', 'pri', 'title', 'plan', 'openedBy', 'assignedTo', 'estimate', 'status', 'stage', 'taskCount', 'actions');
|
||||
}
|
||||
else if($app->tab == 'product')
|
||||
{
|
||||
$config->story->datatable->defaultField = array('id', 'title', 'plan', 'pri', 'status', 'openedBy', 'estimate', 'reviewedBy', 'stage', 'assignedTo', 'taskCount', 'actions');
|
||||
}
|
||||
else
|
||||
{
|
||||
$config->story->datatable->defaultField = array('id', 'pri', 'title', 'plan', 'openedBy', 'assignedTo', 'estimate', 'status', 'stage', 'taskCount', 'actions');
|
||||
@@ -168,7 +172,7 @@ $config->story->datatable->fieldList['assignedDate']['required'] = 'no';
|
||||
|
||||
$config->story->datatable->fieldList['reviewedBy']['title'] = 'reviewedBy';
|
||||
$config->story->datatable->fieldList['reviewedBy']['fixed'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedBy']['width'] = '80';
|
||||
$config->story->datatable->fieldList['reviewedBy']['width'] = '100';
|
||||
$config->story->datatable->fieldList['reviewedBy']['required'] = 'no';
|
||||
$config->story->datatable->fieldList['reviewedBy']['control'] = 'multiple';
|
||||
$config->story->datatable->fieldList['reviewedBy']['dataSource'] = array('module' => 'story', 'method' => 'getStoriesReviewer', 'params' => '$productID');
|
||||
|
||||
@@ -126,10 +126,10 @@ $lang->story->stageAB = '阶段';
|
||||
$lang->story->stagedBy = '设置阶段者';
|
||||
$lang->story->mailto = '抄送给';
|
||||
$lang->story->openedBy = '由谁创建';
|
||||
$lang->story->openedByAB = '创建';
|
||||
$lang->story->openedByAB = '创建者';
|
||||
$lang->story->openedDate = '创建日期';
|
||||
$lang->story->assignedTo = '指派给';
|
||||
$lang->story->assignedToAB = '指派';
|
||||
$lang->story->assignedToAB = '指派给';
|
||||
$lang->story->assignedDate = '指派日期';
|
||||
$lang->story->lastEditedBy = '最后修改';
|
||||
$lang->story->lastEditedDate = '最后修改日期';
|
||||
@@ -139,7 +139,7 @@ $lang->story->closedReason = '关闭原因';
|
||||
$lang->story->rejectedReason = '拒绝原因';
|
||||
$lang->story->changedBy = '由谁变更';
|
||||
$lang->story->changedDate = '变更时间';
|
||||
$lang->story->reviewedBy = '由谁评审';
|
||||
$lang->story->reviewedBy = '评审者';
|
||||
$lang->story->reviewer = $lang->story->reviewedBy;
|
||||
$lang->story->reviewers = '评审人员';
|
||||
$lang->story->reviewedDate = '评审时间';
|
||||
|
||||
@@ -941,7 +941,11 @@ class task extends control
|
||||
}
|
||||
|
||||
$execution = $this->execution->getById($task->execution);
|
||||
if(!isonlybody() and $execution->type == 'kanban') return print(js::locate($this->createLink('execution', 'kanban', "executionID=$execution->id")));
|
||||
if(!isonlybody() and $execution->type == 'kanban')
|
||||
{
|
||||
setcookie('taskToOpen', $taskID, 0, $this->config->webRoot, '', false, true);
|
||||
return print(js::locate($this->createLink('execution', 'kanban', "executionID=$execution->id")));
|
||||
}
|
||||
|
||||
$this->session->project = $task->project;
|
||||
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
$(function()
|
||||
{
|
||||
/* Hide creation logs when displaying team logs. */
|
||||
$('#linearefforts .tabs ul > li').click(function()
|
||||
{
|
||||
var tab = $(this).find('a').attr('href');
|
||||
$('#recordForm').toggleClass('hidden', tab == '#legendAllEffort');
|
||||
});
|
||||
|
||||
|
||||
$('.form-date').datetimepicker('setEndDate', today);
|
||||
|
||||
$("#recordForm #submit").click(function(e, confirmed)
|
||||
@@ -43,4 +51,9 @@ $(function()
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('#recordForm .input-group-addon').on('click', function()
|
||||
{
|
||||
$(this).prev().datetimepicker('show');
|
||||
});
|
||||
})
|
||||
|
||||
@@ -255,6 +255,7 @@ $lang->task->error->recordMinus = 'Work hours should not be negative numbe
|
||||
$lang->task->error->leftNumber = '"Left" must be numbers.';
|
||||
$lang->task->error->recordMinus = 'Work hours should not be negative number.';
|
||||
$lang->task->error->consumedSmall = '"Genutzt" muss larger than before.';
|
||||
$lang->task->error->dateEmpty = 'Please enter "Date"';
|
||||
$lang->task->error->consumedThisTime = 'Bitte geben Sie die Stunden an';
|
||||
$lang->task->error->left = 'Bitte geben Sie die verbleibenden Stunden an"';
|
||||
$lang->task->error->work = '"Bemerkung" muss kleiner als %d Zeichen sein.';
|
||||
|
||||
@@ -255,6 +255,7 @@ $lang->task->error->recordMinus = 'Work hours should not be negative numbe
|
||||
$lang->task->error->leftNumber = '"Left" must be numbers.';
|
||||
$lang->task->error->recordMinus = 'Work hours should not be negative number.';
|
||||
$lang->task->error->consumedSmall = '"Total Cost" must be > the last number.';
|
||||
$lang->task->error->dateEmpty = 'Please enter "Date"';
|
||||
$lang->task->error->consumedThisTime = 'Please enter "Hours Cost"';
|
||||
$lang->task->error->left = 'Please enter "Hours Left"';
|
||||
$lang->task->error->work = '"Comment" must be < %d characters.';
|
||||
|
||||
@@ -255,6 +255,7 @@ $lang->task->error->recordMinus = 'Work hours should not be negative numbe
|
||||
$lang->task->error->leftNumber = '"Entrez" doit être numérique.';
|
||||
$lang->task->error->recordMinus = 'Work hours should not be negative number.';
|
||||
$lang->task->error->consumedSmall = '"Coût Total" doit être > au dernier chiffre.';
|
||||
$lang->task->error->dateEmpty = 'Please enter "Date"';
|
||||
$lang->task->error->consumedThisTime = 'Entrez le "Coût en Heures"';
|
||||
$lang->task->error->left = 'Entrez les "Heures Restantes"';
|
||||
$lang->task->error->work = '"Commentaire" doit être < %d caractères.';
|
||||
|
||||
@@ -255,6 +255,7 @@ $lang->task->error->recordMinus = '工时不能为负数';
|
||||
$lang->task->error->leftNumber = '"预计剩余"必须为数字';
|
||||
$lang->task->error->recordMinus = '工时不能为负数';
|
||||
$lang->task->error->consumedSmall = '"总计消耗"必须大于之前消耗';
|
||||
$lang->task->error->dateEmpty = '请填写"日期"';
|
||||
$lang->task->error->consumedThisTime = '请填写"消耗"';
|
||||
$lang->task->error->left = '请填写"剩余"';
|
||||
$lang->task->error->work = '"备注"必须小于%d个字符';
|
||||
|
||||
@@ -1828,8 +1828,9 @@ class taskModel extends model
|
||||
|
||||
if(!empty($record->work[$id]) or !empty($record->consumed[$id]))
|
||||
{
|
||||
if(!$record->consumed[$id]) helper::end(js::alert($this->lang->task->error->consumedThisTime));
|
||||
if($record->left[$id] === '') helper::end(js::alert($this->lang->task->error->left));
|
||||
if(helper::isZeroDate($record->dates[$id])) helper::end(js::alert($this->lang->task->error->dateEmpty));
|
||||
if(!$record->consumed[$id]) helper::end(js::alert($this->lang->task->error->consumedThisTime));
|
||||
if($record->left[$id] === '') helper::end(js::alert($this->lang->task->error->left));
|
||||
|
||||
$estimates[$id] = new stdclass();
|
||||
$estimates[$id]->date = $record->dates[$id];
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<?php js::set('teamMemberError', $lang->task->error->teamMember);?>
|
||||
<?php js::set('vision', $config->vision);?>
|
||||
<?php js::set('requiredFields', $config->task->create->requiredFields);?>
|
||||
<?php js::set('estimateNotEmpty', sprintf($lang->error->notempty, $lang->task->estimate))?>
|
||||
<?php js::set('estimateNotEmpty', sprintf($lang->error->gt, $lang->task->estimate, '0'))?>
|
||||
<?php js::set('lifetime', $execution->lifetime);?>
|
||||
<?php js::set('lifetimeList', $lifetimeList);?>
|
||||
<?php
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
<?php if(!empty($task) and !empty($task->team) and $task->mode == 'linear'):?>
|
||||
<style>
|
||||
#linearefforts .nav-tabs{margin-bottom:20px;}
|
||||
#linearefforts div.caption {height:25px; margin:10px 0px;}
|
||||
#mainContent {min-height: 500px;}
|
||||
#mainContent .main-header {padding-bottom: 5px;}
|
||||
#linearefforts {margin-top: -18px;}
|
||||
#linearefforts .nav-tabs{margin-bottom: 10px;}
|
||||
#linearefforts div.caption {height:25px; margin: 10px 0px;}
|
||||
#linearefforts div.caption .account{font-weight: bolder;}
|
||||
#linearefforts .tabs ul > li > a { padding-top: 6px; padding-bottom: 4px;}
|
||||
</style>
|
||||
<?php
|
||||
$this->app->loadLang('execution');
|
||||
@@ -11,7 +15,7 @@ foreach($task->team as $team) $teamOrders[$team->order] = $team->account;
|
||||
|
||||
$myOrders = array();
|
||||
$allEfforts = array();
|
||||
$recorders = array();
|
||||
$recorders = array();
|
||||
foreach($efforts as $effort)
|
||||
{
|
||||
$order = $effort->order;
|
||||
@@ -26,7 +30,6 @@ foreach($efforts as $effort)
|
||||
}
|
||||
?>
|
||||
<div id='linearefforts'>
|
||||
<?php if($myOrders):?>
|
||||
<div class='tabs'>
|
||||
<ul class='nav nav-tabs'>
|
||||
<li class='active'><a href='#legendMyEffort' data-toggle='tab'><?php echo $lang->task->myEffort;?></a></li>
|
||||
@@ -34,6 +37,7 @@ foreach($efforts as $effort)
|
||||
</ul>
|
||||
<div class='tab-content'>
|
||||
<div class='tab-pane active' id='legendMyEffort'>
|
||||
<?php if(!empty($myOrders)):?>
|
||||
<table class='table table-bordered table-fixed table-recorded'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
@@ -41,7 +45,7 @@ foreach($efforts as $effort)
|
||||
<th class="w-120px"><?php echo $lang->task->date;?></th>
|
||||
<th class="w-120px"><?php echo $lang->task->recordedBy;?></th>
|
||||
<th><?php echo $lang->task->work;?></th>
|
||||
<th class="thWidth"><?php echo $lang->task->consumed;?></th>
|
||||
<th class="thWidth"><?php echo $lang->task->consumedAB;?></th>
|
||||
<th class="thWidth"><?php echo $lang->task->left;?></th>
|
||||
<th class='c-actions-2'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
@@ -77,9 +81,9 @@ foreach($efforts as $effort)
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<div class='tab-pane' id='legendAllEffort'>
|
||||
<?php endif;?>
|
||||
<table class='table table-bordered table-fixed table-recorded'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
@@ -87,9 +91,8 @@ foreach($efforts as $effort)
|
||||
<th class="w-120px"><?php echo $lang->task->date;?></th>
|
||||
<th class="w-120px"><?php echo $lang->task->recordedBy;?></th>
|
||||
<th><?php echo $lang->task->work;?></th>
|
||||
<th class="thWidth"><?php echo $lang->task->consumed;?></th>
|
||||
<th class="thWidth"><?php echo $lang->task->consumedAB;?></th>
|
||||
<th class="thWidth"><?php echo $lang->task->left;?></th>
|
||||
<th class='c-actions-2'><?php echo $lang->actions;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -108,25 +111,16 @@ foreach($efforts as $effort)
|
||||
<td class="text-left" title="<?php echo $effort->work;?>"><?php echo $effort->work;?></td>
|
||||
<td title="<?php echo $effort->consumed . ' ' . $lang->execution->workHour;?>"><?php echo $effort->consumed . ' ' . $lang->execution->workHourUnit;?></td>
|
||||
<td title="<?php echo $effort->left . ' ' . $lang->execution->workHour;?>"><?php echo $effort->left . ' ' . $lang->execution->workHourUnit;?></td>
|
||||
<td align='center' class='c-actions'>
|
||||
<?php
|
||||
$canOperateEffort = $this->task->canOperateEffort($task, $effort);
|
||||
common::printIcon($this->config->edition == 'open' ? 'task' : 'effort', $this->config->edition == 'open' ? 'editEstimate' : 'edit', "effortID=$effort->id", '', 'list', 'edit', '', 'showinonlybody', true, $canOperateEffort ? '' : 'disabled');
|
||||
$deleteDisable = false;
|
||||
if(!$canOperateEffort or ($index == $count and $effort->left == 0)) $deleteDisable = true;
|
||||
common::printIcon($this->config->edition == 'open' ? 'task' : 'effort', $this->config->edition == 'open' ? 'deleteEstimate' : 'delete', "effortID=$effort->id", '', 'list', 'trash', 'hiddenwin', 'showinonlybody', false, $deleteDisable ? 'disabled' : '');
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php $index ++;?>
|
||||
<?php endforeach;?>
|
||||
<?php endforeach;?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php if($myOrders):?>
|
||||
<?php if(!empty($myOrders)):?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
|
||||
@@ -115,13 +115,13 @@ if(!empty($members) && $task->mode == 'linear')
|
||||
<table class='table table-form table-fixed table-record'>
|
||||
<thead>
|
||||
<tr class='text-center'>
|
||||
<th class="w-150px"><?php echo $lang->task->date;?></th>
|
||||
<th class="w-150px required"><?php echo $lang->task->date;?></th>
|
||||
<?php if($readonly):?>
|
||||
<th class="w-60px <?php if(count($reverseOrders) == 1) echo "hidden"?>"><?php echo $lang->task->teamOrder;?></th>
|
||||
<?php endif;?>
|
||||
<th><?php echo $lang->task->work;?></th>
|
||||
<th class="w-100px"><?php echo $lang->task->consumedAB;?></th>
|
||||
<th class="w-100px"><?php echo $lang->task->leftAB;?></th>
|
||||
<th class="w-100px required"><?php echo $lang->task->consumedAB;?></th>
|
||||
<th class="w-100px <?php if(empty($readonly)) echo 'required'?>"><?php echo $lang->task->leftAB;?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -75,6 +75,10 @@
|
||||
$lblConsumed = $lang->task->myConsumed;
|
||||
$readonly = 'readonly';
|
||||
}
|
||||
elseif($app->rawMethod == 'start' and $task->mode == 'linear')
|
||||
{
|
||||
$lblConsumed = $lang->task->myConsumed;
|
||||
}
|
||||
?>
|
||||
<th><?php echo $lblConsumed;?></th>
|
||||
<td>
|
||||
|
||||
@@ -32,7 +32,7 @@ $config->testcase->custom->createFields = $config->testcase->customCreateFi
|
||||
$config->testcase->custom->batchCreateFields = 'module,story,%s';
|
||||
$config->testcase->custom->batchEditFields = 'branch,module,stage,status,pri,story';
|
||||
|
||||
$config->testcase->excludeCheckFileds = ',pri,type,stage,';
|
||||
$config->testcase->excludeCheckFileds = ',pri,type,stage,needReview,';
|
||||
|
||||
global $lang;
|
||||
$config->testcase->search['module'] = 'testcase';
|
||||
|
||||
@@ -71,6 +71,10 @@ a.showMoreImage:hover {opacity: 1;}
|
||||
.c-object {width: 250px;}
|
||||
.c-case-step {width: 300px;}
|
||||
.c-actions-8 {width: 240px;}
|
||||
|
||||
.confirmed, .confirm1 {color: #0DBB7D;}
|
||||
.unconfirmed, .confirm0 {color: gray;}
|
||||
|
||||
#userNav>li.open>a:before, #userNav>li>a:hover:before {position: absolute; bottom: 0px; left: calc(50% - 10px); width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 10px 10px 10px;}
|
||||
#userNav .dropdown-menu {z-index: 2000;}
|
||||
#userNav .dropdown-menu:hover + .dropdown-toggle:before {position: absolute; bottom: 0px; left: calc(50% - 10px); width: 0; height: 0; content: ' '; border-color: transparent transparent #fff transparent; border-style: solid; border-width: 0 10px 10px 10px;}
|
||||
|
||||
Reference in New Issue
Block a user