Merge branch 'master' into 'sprint/179_sunhao/kanban_ui'
# Conflicts: # module/kanban/js/view.js
This commit is contained in:
+27
-12
@@ -405,22 +405,37 @@ $lang->action->dynamicAction->execution['undeleted'] = 'Restore ' . $lang->execu
|
||||
$lang->action->dynamicAction->execution['hidden'] = 'Hide ' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = 'Improt Task';
|
||||
|
||||
$lang->action->dynamicAction->kanban['create'] = 'Create Kanban';
|
||||
$lang->action->dynamicAction->kanban['edited'] = 'Kanban Settings';
|
||||
$lang->action->dynamicAction->kanban['created'] = 'Create Kanban';
|
||||
$lang->action->dynamicAction->kanban['edited'] = 'Kanban Settings';
|
||||
$lang->action->dynamicAction->kanban['closed'] = 'Close Kanban';
|
||||
$lang->action->dynamicAction->kanban['deleted'] = 'Delete Kanban';
|
||||
|
||||
$lang->action->dynamicAction->kanbanspace['create'] = 'Create Space';
|
||||
$lang->action->dynamicAction->kanbanspace['edited'] = 'Space Settings';
|
||||
$lang->action->dynamicAction->kanbanspace['closed'] = 'Close Kanban';
|
||||
$lang->action->dynamicAction->kanbanspace['created'] = 'Create Space';
|
||||
$lang->action->dynamicAction->kanbanspace['edited'] = 'Space Settings';
|
||||
$lang->action->dynamicAction->kanbanspace['closed'] = 'Close Space';
|
||||
$lang->action->dynamicAction->kanbanspace['deleted'] = 'Deleted Space';
|
||||
|
||||
$lang->action->dynamicAction->kanbancolumn['create'] = 'Create Column';
|
||||
$lang->action->dynamicAction->kanbancolumn['edited'] = 'Column Settings';
|
||||
$lang->action->dynamicAction->kanbanregion['created'] = 'Create Region';
|
||||
$lang->action->dynamicAction->kanbanregion['edited'] = 'Edit Region';
|
||||
$lang->action->dynamicAction->kanbanregion['deleted'] = 'Delete Region';
|
||||
|
||||
$lang->action->dynamicAction->kanbanlane['created'] = 'Create Swimlane';
|
||||
$lang->action->dynamicAction->kanbanlane['edited'] = 'Swimlane Settings';
|
||||
$lang->action->dynamicAction->kanbanlane['moved'] = 'Move Swimlane';
|
||||
$lang->action->dynamicAction->kanbancolumn['created'] = 'Create Column';
|
||||
$lang->action->dynamicAction->kanbancolumn['edited'] = 'Column Settings';
|
||||
$lang->action->dynamicAction->kanbancolumn['archived'] = 'Archive Column';
|
||||
$lang->action->dynamicAction->kanbancolumn['restore'] = 'Restore Column';
|
||||
$lang->action->dynamicAction->kanbancolumn['deleted'] = 'Delete Column';
|
||||
|
||||
$lang->action->dynamicAction->kanbancard['create'] = 'Create Card';
|
||||
$lang->action->dynamicAction->kanbancard['edited'] = 'Edit card';
|
||||
$lang->action->dynamicAction->kanbanlane['created'] = 'Create Lane';
|
||||
$lang->action->dynamicAction->kanbanlane['edited'] = 'Lane Settings';
|
||||
$lang->action->dynamicAction->kanbanlane['moved'] = 'Move Lane';
|
||||
$lang->action->dynamicAction->kanbanlane['deleted'] = 'Delete Lane';
|
||||
|
||||
$lang->action->dynamicAction->kanbancard['created'] = 'Create Card';
|
||||
$lang->action->dynamicAction->kanbancard['edited'] = 'Edit Card';
|
||||
$lang->action->dynamicAction->kanbancard['commented'] = 'Comment Card';
|
||||
$lang->action->dynamicAction->kanbancard['archived'] = 'Archive Card';
|
||||
$lang->action->dynamicAction->kanbancard['restore'] = 'Restore Card';
|
||||
$lang->action->dynamicAction->kanbancard['deleted'] = 'Delete Card';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = 'Manage Team';
|
||||
|
||||
|
||||
@@ -405,22 +405,37 @@ $lang->action->dynamicAction->execution['undeleted'] = '还原' . $lang->executi
|
||||
$lang->action->dynamicAction->execution['hidden'] = '隐藏' . $lang->executionCommon;
|
||||
$lang->action->dynamicAction->execution['moved'] = '导入任务';
|
||||
|
||||
$lang->action->dynamicAction->kanban['create'] = '创建看板';
|
||||
$lang->action->dynamicAction->kanban['edited'] = '设置看板';
|
||||
$lang->action->dynamicAction->kanban['created'] = '创建看板';
|
||||
$lang->action->dynamicAction->kanban['edited'] = '设置看板';
|
||||
$lang->action->dynamicAction->kanban['closed'] = '关闭看板';
|
||||
$lang->action->dynamicAction->kanban['deleted'] = '删除看板';
|
||||
|
||||
$lang->action->dynamicAction->kanbanspace['create'] = '创建看板空间';
|
||||
$lang->action->dynamicAction->kanbanspace['edited'] = '设置看板空间';
|
||||
$lang->action->dynamicAction->kanbanspace['closed'] = '关闭看板空间';
|
||||
$lang->action->dynamicAction->kanbanspace['created'] = '创建看板空间';
|
||||
$lang->action->dynamicAction->kanbanspace['edited'] = '设置看板空间';
|
||||
$lang->action->dynamicAction->kanbanspace['closed'] = '关闭看板空间';
|
||||
$lang->action->dynamicAction->kanbanspace['deleted'] = '删除看板空间';
|
||||
|
||||
$lang->action->dynamicAction->kanbancolumn['create'] = '创建看板列';
|
||||
$lang->action->dynamicAction->kanbancolumn['edited'] = '设置看板列';
|
||||
$lang->action->dynamicAction->kanbanregion['created'] = '创建看板区域';
|
||||
$lang->action->dynamicAction->kanbanregion['edited'] = '编辑看板区域';
|
||||
$lang->action->dynamicAction->kanbanregion['deleted'] = '删除看板区域';
|
||||
|
||||
$lang->action->dynamicAction->kanbanlane['created'] = '创建泳道';
|
||||
$lang->action->dynamicAction->kanbanlane['edited'] = '设置泳道';
|
||||
$lang->action->dynamicAction->kanbanlane['moved'] = '移动泳道';
|
||||
$lang->action->dynamicAction->kanbancolumn['created'] = '创建看板列';
|
||||
$lang->action->dynamicAction->kanbancolumn['edited'] = '设置看板列';
|
||||
$lang->action->dynamicAction->kanbancolumn['archived'] = '归档看板列';
|
||||
$lang->action->dynamicAction->kanbancolumn['restore'] = '还原看板列';
|
||||
$lang->action->dynamicAction->kanbancolumn['deleted'] = '删除看板列';
|
||||
|
||||
$lang->action->dynamicAction->kanbancard['create'] = '创建看板卡片';
|
||||
$lang->action->dynamicAction->kanbancard['edited'] = '编辑看板卡片';
|
||||
$lang->action->dynamicAction->kanbanlane['created'] = '创建泳道';
|
||||
$lang->action->dynamicAction->kanbanlane['edited'] = '设置泳道';
|
||||
$lang->action->dynamicAction->kanbanlane['moved'] = '移动泳道';
|
||||
$lang->action->dynamicAction->kanbanlane['deleted'] = '删除泳道';
|
||||
|
||||
$lang->action->dynamicAction->kanbancard['created'] = '创建看板卡片';
|
||||
$lang->action->dynamicAction->kanbancard['edited'] = '编辑看板卡片';
|
||||
$lang->action->dynamicAction->kanbancard['commented'] = '备注看板卡片';
|
||||
$lang->action->dynamicAction->kanbancard['archived'] = '归档看板卡片';
|
||||
$lang->action->dynamicAction->kanbancard['restore'] = '还原看板卡片';
|
||||
$lang->action->dynamicAction->kanbancard['deleted'] = '删除看板卡片';
|
||||
|
||||
$lang->action->dynamicAction->team['managedTeam'] = '维护团队';
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
}
|
||||
elseif($action->objectType == 'kanbancard')
|
||||
{
|
||||
echo html::a($this->createLink('kanban', 'viewCard', "id=$action->objectID", '', true), $action->objectName, '', "title={$action->objectName} class='iframe'");
|
||||
echo html::a($this->createLink('kanban', 'viewCard', "id=$action->objectID", '', true), $action->objectName, '', "title={$action->objectName} class='iframe' data-width=80%");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
.main-col .doc-title {display: flex; font-size: 16px; margin-bottom: 15px;}
|
||||
.main-col .doc-title .title {margin: 0; line-height: 30px; font-size: 25px;}
|
||||
.main-col .doc-title .http-method {line-height: 27px; height: 27px; font-size: 13px; margin-right: 10px; padding: 0 10px;}
|
||||
.main-col .doc-title .path { line-height: 30px; font-size: 20px; margin-right: 15px;width:60%;word-wrap: break-word; }
|
||||
.main-col .doc-title .path {line-height: 30px; font-size: 20px; margin-right: 15px; word-wrap: break-word;}
|
||||
.main-col .doc-title .info {flex: 1 1 0;}
|
||||
.main-col .doc-title .version a {font-size: 13px; color: #8c8c8c;}
|
||||
.main-col .doc-title .version .dropdown-menu a:hover {color: #ffffff;}
|
||||
@@ -107,7 +107,7 @@
|
||||
padding-right: 10px;
|
||||
}
|
||||
.detail .list-group-item {list-style: none; font-size: 14px; margin-bottom: 10px; line-height: 30px}
|
||||
.detail .list-group-item span {line-height: 30px; width: 50px;}
|
||||
.detail .list-group-item span {line-height: 30px; width: 65px;}
|
||||
.detail .list-group-item .label+.label {margin-left: -4px;}
|
||||
.detail .list-group-item .label {border-radius: 0;}
|
||||
|
||||
|
||||
@@ -81,7 +81,6 @@
|
||||
<div class="heading <?php echo $api->method;?>">
|
||||
<a href="<?php echo helper::createLink('api', 'index', "libID={$api->lib}&moduleID=0&apiID={$api->id}&version=0&release=$release");?>">
|
||||
<span class="label label-primary"><?php echo $api->method;?></span>
|
||||
<span class="label label-warning" style="width: 60px"><?php echo apiModel::getApiStatusText($api->status);?></span>
|
||||
<span class="path"><?php echo $api->path;?></span>
|
||||
<span class="desc"><?php echo $api->title;?></span>
|
||||
</a>
|
||||
|
||||
@@ -325,4 +325,18 @@ class branch extends control
|
||||
|
||||
return $this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success'));
|
||||
}
|
||||
|
||||
/**
|
||||
* AJAX: Get target branches for merge branch.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param string $mergedBranches
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function ajaxGetTargetBranches($productID, $mergedBranches = '')
|
||||
{
|
||||
$branchPairs = $this->branch->getPairs($productID, 'active', 0, $mergedBranches);
|
||||
return print(html::select('targetBranch', $branchPairs, '', "class='form-control chosen'"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,3 +9,4 @@ td.flex .label-primary {min-width: 40px;}
|
||||
td.flex .setDefault {min-width: 120px;}
|
||||
|
||||
#mergeBranch .form-actions {padding-top: 20px;}
|
||||
.modal-body {padding-top: 0;}
|
||||
|
||||
+72
-20
@@ -65,8 +65,8 @@ $(function()
|
||||
{
|
||||
$('#targetBranch').attr('disabled', true).trigger('chosen:updated');
|
||||
|
||||
var newBranchName = '<tr><th>' + branchLang.name + "</th><td class='required'><input type='text' name='name' id='name' class='form-control' /></td></tr>";
|
||||
var newBranchDesc = '<tr><th>' + branchLang.desc + "</th><td><input type='text' name='desc' id='desc' class='form-control' /></td></tr>";
|
||||
var newBranchName = '<tr><th>' + branchLang.name + "</th><td class='required' colspan='7'><input type='text' name='name' id='name' class='form-control' /></td></tr>";
|
||||
var newBranchDesc = '<tr><th>' + branchLang.desc + "</th><td colspan='7'><input type='text' name='desc' id='desc' class='form-control' /></td></tr>";
|
||||
$(this).closest('tr').after(newBranchName + newBranchDesc);
|
||||
}
|
||||
else
|
||||
@@ -78,35 +78,87 @@ $(function()
|
||||
}
|
||||
});
|
||||
|
||||
$('#saveButton').on('click', function()
|
||||
$("#merge").click(function()
|
||||
{
|
||||
var mergedBranchIDList = [];
|
||||
var mergedBranchName = '';
|
||||
|
||||
$("input:checkbox[name^='branchIDList']:checked").each(function()
|
||||
{
|
||||
mergedBranchIDList.push($(this).val());
|
||||
mergedBranchName += ',' + $(this).closest('tr').find('.branchName').attr('title');
|
||||
});
|
||||
mergedBranchName = mergedBranchName.substr(1);
|
||||
mergedBranchIDList = mergedBranchIDList.join(',');
|
||||
|
||||
$.get(createLink('branch', 'ajaxGetTargetBranches', "productID=" + productID + "&mergedBranches=" + mergedBranchIDList), function(data)
|
||||
{
|
||||
$('#targetBranch').replaceWith(data);
|
||||
$('#targetBranch_chosen').remove();
|
||||
$('#targetBranch').chosen();
|
||||
|
||||
if($('#createBranch').prop('checked')) $('#targetBranch').attr('disabled', true).trigger('chosen:updated')
|
||||
})
|
||||
})
|
||||
|
||||
$('#saveButton').on('click', function()
|
||||
{
|
||||
var mergedBranchIDList = [];
|
||||
var mergedBranchName = '';
|
||||
var targetBranchName = $('#targetBranch_chosen').find('span').text();
|
||||
|
||||
$("input:checkbox[name^='branchIDList']:checked").each(function()
|
||||
{
|
||||
mergedBranchIDList.push($(this).val());
|
||||
mergedBranchName += ',' + $(this).closest('tr').find('.branchName').attr('title');
|
||||
});
|
||||
|
||||
mergedBranchName = mergedBranchName.substr(1);
|
||||
targetBranchName = $('#createBranch').prop('checked') ? $('#name').val() : targetBranchName;
|
||||
|
||||
var confirmMergeMessage = branchLang.confirmMerge.replace(/(.*)mergedBranch(.*)targetBranch(.*)/, "$1" + mergedBranchName + "$2" + targetBranchName + "$3");
|
||||
|
||||
var isChecked = $('#createBranch').attr('checked') ? 1 : 0;
|
||||
var postData = {'name' : $('#name').val(), 'desc' : $('#desc').val(), 'createBranch' : isChecked, 'mergedBranchIDList' : mergedBranchIDList, 'targetBranch' : $('#targetBranch').val()};
|
||||
$.ajax(
|
||||
if(isChecked && $('#name').val() == '')
|
||||
{
|
||||
url: createLink('branch', 'mergeBranch', 'productID=' + productID),
|
||||
dataType: 'json',
|
||||
method: 'post',
|
||||
data: postData,
|
||||
success: function(data)
|
||||
alert(branchLang.nameNotEmpty);
|
||||
return false;
|
||||
}
|
||||
|
||||
var branchNames = Object.values(branchPairs);
|
||||
if(isChecked && branchNames.includes($('#name').val()) !== -1)
|
||||
{
|
||||
alert(branchLang.existName);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(confirm(confirmMergeMessage))
|
||||
{
|
||||
var postData = {'name' : $('#name').val(), 'desc' : $('#desc').val(), 'createBranch' : isChecked, 'mergedBranchIDList' : mergedBranchIDList, 'targetBranch' : $('#targetBranch').val()};
|
||||
$.ajax(
|
||||
{
|
||||
if(data.result == 'fail')
|
||||
url: createLink('branch', 'mergeBranch', 'productID=' + productID),
|
||||
dataType: 'json',
|
||||
method: 'post',
|
||||
data: postData,
|
||||
success: function(data)
|
||||
{
|
||||
alert(data.message.name)
|
||||
return false;
|
||||
if(data.result == 'fail')
|
||||
{
|
||||
alert(data.message.name)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#mergeBranch').modal('hide');
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#mergeBranch').modal('hide');
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
else
|
||||
{
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
@@ -22,7 +22,7 @@ $lang->branch->batchEdit = 'Batch Edit';
|
||||
$lang->branch->defaultBranch = 'Default Branch';
|
||||
$lang->branch->setDefault = 'Set Default';
|
||||
$lang->branch->setDefaultAction = 'Set Default';
|
||||
$lang->branch->mergeTo = 'Merge branch to';
|
||||
$lang->branch->mergeTo = 'Merge to';
|
||||
$lang->branch->mergeBranch = 'Merge branch';
|
||||
$lang->branch->mergeBranchAction = 'Merge branch';
|
||||
|
||||
@@ -45,8 +45,10 @@ $lang->branch->nameNotEmpty = 'Name must not be empty!';
|
||||
$lang->branch->confirmClose = 'Do you want to close this @branch@?';
|
||||
$lang->branch->confirmActivate = 'Do you want to activate this @branch@?';
|
||||
$lang->branch->existName = '@branch@ name already exists.';
|
||||
$lang->branch->mergeTips = '(Trunk does not support being merged. After the branch is merged, the corresponding releases, plans, modules, requirements, bugs, and cases under the branch will be merged into the new branch)';
|
||||
$lang->branch->targetBranchTips = 'Note: You can merge it into an existing branch, merge it into the trunk, or create a new branch.';
|
||||
$lang->branch->mergedMain = 'Trunk does not support being merged.';
|
||||
$lang->branch->mergeTips = 'After the branch is merged, the corresponding releases, plans, modules, requirements, bugs, and cases under the branch will be merged into the new branch';
|
||||
$lang->branch->targetBranchTips = 'You can merge it into an existing branch, merge it into the trunk, or create a new branch.';
|
||||
$lang->branch->confirmMerge = 'The data of "mergedBranch" will be merged into "targetBranch", please confirm whether you want to perform the branch merge operation, the data will not be restored after the merge!';
|
||||
|
||||
$lang->branch->noData = 'No branches.';
|
||||
$lang->branch->mainBranch = 'The default main %s of the product.';
|
||||
|
||||
@@ -45,8 +45,10 @@ $lang->branch->nameNotEmpty = '名称不能为空!';
|
||||
$lang->branch->confirmClose = '是否关闭该@branch@?';
|
||||
$lang->branch->confirmActivate = '是否激活该@branch@?';
|
||||
$lang->branch->existName = '@branch@名称已存在';
|
||||
$lang->branch->mergeTips = '(主干不支持被合并,合并@branch@后,会将@branch@下面对应的发布、计划、模块、需求、Bug、用例都合并到新的@branch@下)';
|
||||
$lang->branch->targetBranchTips = '注:您可以将其合并到已有的一个@branch@,也可以合并到主干,也可以新创建一个@branch@。';
|
||||
$lang->branch->mergedMain = '主干不支持被合并。';
|
||||
$lang->branch->mergeTips = '合并@branch@后,会将@branch@下面对应的发布、计划、模块、需求、Bug、用例都合并到新的@branch@下';
|
||||
$lang->branch->targetBranchTips = '您可以将其合并到已有的一个@branch@,也可以合并到主干,也可以新创建一个@branch@。';
|
||||
$lang->branch->confirmMerge = '"mergedBranch"的数据将被合并到"targetBranch",请确认是否要执行分支合并操作,合并后数据将不可再恢复!';
|
||||
|
||||
$lang->branch->noData = '暂时没有分支。';
|
||||
$lang->branch->mainBranch = '产品默认主干%s。';
|
||||
|
||||
@@ -96,10 +96,11 @@ class branchModel extends model
|
||||
* @param int $productID
|
||||
* @param string $params
|
||||
* @param int $executionID
|
||||
* @param string $mergedBranches
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getPairs($productID, $params = '', $executionID = 0)
|
||||
public function getPairs($productID, $params = '', $executionID = 0, $mergedBranches = '')
|
||||
{
|
||||
$executionBranches = array();
|
||||
if($executionID)
|
||||
@@ -116,6 +117,7 @@ class branchModel extends model
|
||||
->beginIF($productID)->andWhere('product')->eq($productID)->fi()
|
||||
->beginIF($productID and $executionID)->andWhere('id')->in(array_keys($executionBranches))->fi()
|
||||
->beginIF(strpos($params, 'active') !== false)->andWhere('status')->eq('active')->fi()
|
||||
->beginIF(!empty($mergedBranches))->andWhere('id')->notIN($mergedBranches)->fi()
|
||||
->orderBy('`order`')
|
||||
->fetchPairs('id', 'name');
|
||||
foreach($branches as $branchID => $branchName) $branches[$branchID] = htmlspecialchars_decode($branchName);
|
||||
@@ -598,10 +600,10 @@ class branchModel extends model
|
||||
/**
|
||||
* Merge multiple branches into one branch.
|
||||
*
|
||||
* @param int $productID
|
||||
* @param string $mergedBranches
|
||||
* @param int $productID
|
||||
* @param string $mergedBranches
|
||||
* @access public
|
||||
* @return int
|
||||
* @return int|bool
|
||||
*/
|
||||
public function mergeBranch($productID, $mergedBranches)
|
||||
{
|
||||
@@ -609,7 +611,6 @@ class branchModel extends model
|
||||
|
||||
/* Get the target branch. */
|
||||
$targetBranch = $data->createBranch ? $this->create($productID, true) : $data->targetBranch;
|
||||
if(!$targetBranch and $targetBranch != BRANCH_MAIN) return false;
|
||||
if($data->createBranch) $this->loadModel('action')->create('branch', $targetBranch, 'Opened');
|
||||
|
||||
/* Branch. */
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
<?php js::set('orderBy', $orderBy)?>
|
||||
<?php js::set('branchLang', $lang->branch);?>
|
||||
<?php js::set('productID', $productID);?>
|
||||
<?php js::set('branchPairs', $branchPairs);?>
|
||||
<?php $canCreate = common::hasPriv('branch', 'create');?>
|
||||
<?php $canOrder = common::hasPriv('branch', 'sort');?>
|
||||
<?php $canBatchEdit = common::hasPriv('branch', 'batchEdit');?>
|
||||
@@ -78,7 +79,7 @@
|
||||
<?php echo $isMain ? '' : '<i class="icon icon-move"></i>';?>
|
||||
</td>
|
||||
<?php endif;?>
|
||||
<td class='c-name flex' title='<?php echo $branch->name;?>'>
|
||||
<td class='c-name flex branchName' title='<?php echo $branch->name;?>'>
|
||||
<span class="text-ellipsis"><?php echo $branch->name;?> </span>
|
||||
<?php
|
||||
if($branch->default)
|
||||
@@ -126,7 +127,7 @@
|
||||
<?php
|
||||
$batchEditLink = $this->createLink('branch', 'batchEdit', "productID=$productID");
|
||||
echo html::submitButton($lang->edit, "data-form-action='$batchEditLink'", 'btn');
|
||||
if($browseType != 'closed') echo html::a('#mergeBranch', $lang->branch->merge, '', "data-toggle='modal' class='btn'");
|
||||
if(($browseType != 'closed' and common::hasPriv('branch', 'mergeBranch'))) echo html::a('#mergeBranch', $lang->branch->merge, '', "data-toggle='modal' class='btn' id='merge'");
|
||||
?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
@@ -143,14 +144,22 @@
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="icon icon-close"></i></button>
|
||||
<span class="modal-title"><?php echo $lang->branch->mergeBranch;?></span>
|
||||
<small> <?php echo $lang->branch->mergeTips;?></small>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form method='post' enctype='multipart/form-data' class="form-ajax">
|
||||
<table class='table table-form'>
|
||||
<tr>
|
||||
<th class='thWidth'><?php echo $lang->branch->mergeTo;?></th>
|
||||
<td>
|
||||
<td colspan="8">
|
||||
<div class="alert alert-info no-margin">
|
||||
<p><?php echo $lang->branch->mergedMain;?></p>
|
||||
<p><?php echo $lang->branch->mergeTips;?></p>
|
||||
<p><?php echo $lang->branch->targetBranchTips;?></p>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->branch->mergeTo;?></th>
|
||||
<td colspan="7">
|
||||
<div class="input-group">
|
||||
<?php echo html::select('targetBranch', $branchPairs, '', "class='form-control chosen'");?>
|
||||
<span class='input-group-addon'>
|
||||
@@ -158,15 +167,10 @@
|
||||
</span>
|
||||
</div>
|
||||
</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3"><span><?php echo $lang->branch->targetBranchTips;?></span></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='3' class='text-center form-actions'>
|
||||
<td colspan='8' class='text-center form-actions'>
|
||||
<?php echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide');?>
|
||||
<?php echo html::linkButton($lang->goback, $this->createLink('branch', 'manage', "productID=$productID"), 'self', '', 'btn btn-wide');?>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -235,7 +235,7 @@ class buildModel extends model
|
||||
$releases = $this->dao->select('build, name')->from(TABLE_RELEASE)
|
||||
->where('build')->in(array_keys($builds))
|
||||
->andWhere('product')->in($products)
|
||||
->beginIF($branch !== 'all')->andWhere('branch')->in("$branch")->fi()
|
||||
->beginIF($branch !== 'all')->andWhere('branch')->in("0,$branch")->fi()
|
||||
->andWhere('deleted')->eq(0)
|
||||
->fetchPairs();
|
||||
foreach($releases as $buildID => $releaseName)
|
||||
|
||||
@@ -454,13 +454,7 @@ if(!window.kanbanDropRules)
|
||||
story:
|
||||
{
|
||||
backlog: ['ready'],
|
||||
ready: ['backlog', 'doing'],
|
||||
'doing': ['developed'],
|
||||
'developed': ['doing', 'testing'],
|
||||
'testing': ['tested'],
|
||||
'tested': ['verified'],
|
||||
'verified': ['released'],
|
||||
'released': false,
|
||||
ready: ['backlog'],
|
||||
},
|
||||
bug:
|
||||
{
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<?php common::printOrderLink('id', $orderBy, $vars, $lang->idAB);?>
|
||||
</th>
|
||||
<th><?php common::printOrderLink('name', $orderBy, $vars, (($from == 'execution') and ($config->systemMode == 'new')) ? $lang->execution->execName : $lang->execution->name);?></th>
|
||||
<?php if($config->systemMode == 'new'):?>
|
||||
<?php if($config->systemMode == 'new' and $this->app->tab == 'execution'):?>
|
||||
<th class='c-begin'><?php common::printOrderLink('projectName', $orderBy, $vars, $lang->execution->project);?></th></th>
|
||||
<?php endif;?>
|
||||
<th class='c-pm'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->execution->owner);?></th>
|
||||
@@ -129,7 +129,7 @@
|
||||
<a class="plan-toggle" data-id="<?php echo $execution->id;?>"><i class="icon icon-angle-double-right"></i></a>
|
||||
<?php endif;?>
|
||||
</td>
|
||||
<?php if($config->systemMode == 'new'):?>
|
||||
<?php if($config->systemMode == 'new' and $this->app->tab == 'execution'):?>
|
||||
<td class='c-begin' title='<?php echo $execution->projectName;?>'>
|
||||
<span class="status-execution status-<?php echo $execution->projectName?>"><?php echo $execution->projectName;?></span>
|
||||
</td>
|
||||
|
||||
@@ -289,7 +289,7 @@ body {margin-bottom: 25px;}
|
||||
}
|
||||
}?>
|
||||
<?php else:?>
|
||||
<?php foreach($customFields as $field) $this->task->printCell($field, $task, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table');?>
|
||||
<?php foreach($customFields as $field) $this->task->printCell($field, $task, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table', false, $showBranch);?>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php if(!empty($task->children)):?>
|
||||
@@ -306,7 +306,7 @@ body {margin-bottom: 25px;}
|
||||
$this->task->printCell($field, $child, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table', true);
|
||||
}?>
|
||||
<?php else:?>
|
||||
<?php foreach($customFields as $field) $this->task->printCell($field, $child, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table', true);?>
|
||||
<?php foreach($customFields as $field) $this->task->printCell($field, $child, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table', true, $showBranch);?>
|
||||
<?php endif;?>
|
||||
</tr>
|
||||
<?php $i ++;?>
|
||||
|
||||
@@ -663,6 +663,7 @@ $lang->resource->kanban->laneMove = 'laneMove';
|
||||
$lang->resource->kanban->cardsSort = 'cardsSort';
|
||||
$lang->resource->kanban->viewArchivedColumn = 'viewArchivedColumn';
|
||||
$lang->resource->kanban->viewArchivedCard = 'viewArchivedCard';
|
||||
$lang->resource->kanban->restoreCard = 'restoreCard';
|
||||
|
||||
$lang->kanban->methodOrder[5] = 'space';
|
||||
$lang->kanban->methodOrder[10] = 'createSpace';
|
||||
@@ -706,6 +707,7 @@ $lang->kanban->methodorder[190] = 'cardsSort';
|
||||
$lang->kanban->methodOrder[195] = 'viewArchivedColumn';
|
||||
$lang->kanban->methodorder[200] = 'viewArchivedCard';
|
||||
$lang->kanban->methodorder[205] = 'archiveColumn';
|
||||
$lang->kanban->methodorder[210] = 'restoreCard';
|
||||
|
||||
/* Execution. */
|
||||
$lang->resource->execution = new stdclass();
|
||||
|
||||
@@ -101,4 +101,4 @@ $config->kanban->taskColumnStatusList['closed'] = 'closed';
|
||||
|
||||
$config->kanban->laneColorList = array('#7ec5ff', '#333', '#2b529c', '#e48600', '#d2323d', '#229f24', '#777', '#d2691e', '#008b8b', '#2e8b57', '#4169e1', '#4b0082', '#fa8072', '#ba55d3', '#6b8e23');
|
||||
$config->kanban->columnColorList = array('#333', '#2b519c', '#e48610', '#d2313d', '#2a9f23', '#777', '#d2691e', '#2e8b8b', '#2f8b58', '#4168e0', '#4b0082', '#f58072', '#ba55d3', '#6a8e22');
|
||||
$config->kanban->cardColorList = array('#fff', '#d2323d', '#f7b501', '#278427');
|
||||
$config->kanban->cardColorList = array('#fff', '#b10b0b', '#cfa227', '#2a5f29');
|
||||
|
||||
@@ -797,7 +797,7 @@ class kanban extends control
|
||||
{
|
||||
$card = $this->kanban->getCardByID($cardID);
|
||||
$column = $this->dao->select('*')->from(TABLE_KANBANCOLUMN)->where('id')->eq($card->column)->fetch();
|
||||
if($column->archived) die(js::alert(sprintf($this->lang->kanbancard->confirmRestoreTip, $column->name)));
|
||||
if($column->archived or $column->deleted) die(js::alert(sprintf($this->lang->kanbancard->confirmRestoreTip, $column->name)));
|
||||
|
||||
die(js::confirm(sprintf($this->lang->kanbancard->confirmRestore, $column->name), $this->createLink('kanban', 'restoreCard', "cardID=$cardID&confirm=yes"), ''));
|
||||
}
|
||||
@@ -1069,15 +1069,18 @@ class kanban extends control
|
||||
public function ajaxGetKanbanMenu($kanbanID, $moduleName, $methodName)
|
||||
{
|
||||
$kanbanIdList = $this->kanban->getCanViewObjects();
|
||||
$spacePairs = $this->kanban->getSpacePairs('all');
|
||||
|
||||
$this->view->kanbanList = $this->dao->select('*')->from(TABLE_KANBAN)
|
||||
->where('deleted')->eq('0')
|
||||
->andWhere('id')->in($kanbanIdList)
|
||||
->andWhere('space')->in(array_keys($spacePairs))
|
||||
->fetchGroup('space');
|
||||
|
||||
$this->view->kanbanID = $kanbanID;
|
||||
$this->view->spaceList = $this->kanban->getSpacePairs('all');
|
||||
$this->view->module = $moduleName;
|
||||
$this->view->method = $methodName;
|
||||
$this->view->kanbanID = $kanbanID;
|
||||
$this->view->spaceList = $spacePairs;
|
||||
$this->view->module = $moduleName;
|
||||
$this->view->method = $methodName;
|
||||
$this->display();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
#nameBox .required:after {right: 130px; z-index: 2;}
|
||||
#nameBox .br-0 {height: 32px;}
|
||||
.pri-selector .br-0 {padding-bottom: 5px;}
|
||||
.required:after {left: 215px; z-index: 2;}
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
.region .kanban-lane {position: relative; border-bottom: none!important; min-height: 200px !important}
|
||||
|
||||
.region .kanban-lane > .kanban-lane-name > .text {margin: auto 0; max-height: 100px;}
|
||||
.region .kanban-lane > .kanban-lane-name > .text {margin: auto 0; max-height: 150px; overflow: hidden; text-overflow: ellipsis}
|
||||
.region .kanban-lane > .kanban-lane-name > .actions {position: absolute; top: 0; left: 0; right: 0; opacity: 0;}
|
||||
.region .kanban-lane > .kanban-lane-name > .actions > a {display: block; width: 20px; height: 20px; line-height: 20px; text-align: center; opacity: .7; color: #fff;}
|
||||
.region .kanban-lane > .kanban-lane-name > .actions > a:hover {background-color: rgba(0,0,0,.2); opacity: 1;}
|
||||
@@ -60,8 +60,8 @@
|
||||
.region .kanban-item > .kanban-card > .title:hover {color: #2272eb}
|
||||
.region .kanban-item > .kanban-card > .info {margin-top: 5px; position: relative;}
|
||||
.region .kanban-item > .kanban-card > .info > .pri {height: 14px; border-width: 1px; font-size: 12px; line-height: 12px; min-width: 14px; padding: 0 1px;}
|
||||
.region .kanban-item > .kanban-card > .info > .estimate{margin-left: 10px; color: #999; background-color: rgb(255, 255, 255); padding: 3px 0px}
|
||||
.region .kanban-item > .kanban-card > .info > .time {margin-left: 10px; font-size: 12px; background: rgb(242, 242, 242)}
|
||||
.region .kanban-item > .kanban-card > .info > .estimate{margin-left: 4px; color: #999; background-color: rgb(255, 255, 255); padding: 3px 0px}
|
||||
.region .kanban-item > .kanban-card > .info > .time {margin-left: 4px; font-size: 12px; background: rgb(242, 242, 242)}
|
||||
.region .kanban-item > .kanban-card > .info > .user {position: absolute; right: 0; top: -2px}
|
||||
.region .kanban-item > .kanban-card > .info > .user > .avatar {display: inline-block; width: 24px; height: 24px; line-height: 24px; margin-right: 0px; margin-left: 2px}
|
||||
.region .kanban-item > .kanban-card > .info > .user > span {display: inline-block; color: transparent; width: 2px; height: 2px; background-color: #8990a2; position: sticky; border-radius: 50%; top: 3px; margin: 0 7px;}
|
||||
|
||||
@@ -213,7 +213,7 @@ function renderUsersAvatar(users, itemID, size)
|
||||
|
||||
if(users.length == 0 || (users.length == 1 && users[0] == ''))
|
||||
{
|
||||
return $('<a class="avatar has-text ' + avatarSizeClass + ' avatar-circle iframe" title="' + noAssigned + '" style="background: #ccc" href="' + link + '"><i class="icon icon-person"></i></a>');
|
||||
return $('<div class="avatar has-text ' + avatarSizeClass + ' avatar-circle iframe" title="' + noAssigned + '" style="background: #ccc"><i class="icon icon-person"></i></div>');
|
||||
}
|
||||
|
||||
var assignees = [];
|
||||
@@ -309,15 +309,15 @@ function renderKanbanItem(item, $item)
|
||||
var needRemind = (begin.toLocaleDateString() == today.toLocaleDateString() || end.toLocaleDateString() == today.toLocaleDateString());
|
||||
if(item.end == '0000-00-00' && item.begin != '0000-00-00')
|
||||
{
|
||||
$time.text($.zui.formatDate(begin, 'MM-dd') + ' ' + kanbancardLang.beginAB).attr('title', $.zui.formatDate(begin, 'yyyy-MM-dd') + ' ' +kanbancardLang.beginAB).show();
|
||||
$time.text($.zui.formatDate(begin, 'MM/dd') + ' ' + kanbancardLang.beginAB).attr('title', $.zui.formatDate(begin, 'yyyy/MM/dd') + ' ' +kanbancardLang.beginAB).show();
|
||||
}
|
||||
else if(item.begin == '0000-00-00' && item.end != '0000-00-00')
|
||||
{
|
||||
$time.text($.zui.formatDate(end, 'MM-dd') + ' ' + kanbancardLang.deadlineAB).attr('title', $.zui.formatDate(end, 'yyyy-MM-dd') + ' ' + kanbancardLang.deadlineAB).show();
|
||||
$time.text($.zui.formatDate(end, 'MM/dd') + ' ' + kanbancardLang.deadlineAB).attr('title', $.zui.formatDate(end, 'yyyy/MM/dd') + ' ' + kanbancardLang.deadlineAB).show();
|
||||
}
|
||||
else if(item.begin != '0000-00-00' && item.end != '0000-00-00')
|
||||
{
|
||||
$time.text($.zui.formatDate(begin, 'MM-dd') + ' ' + kanbancardLang.to + ' ' + $.zui.formatDate(end, 'MM-dd')).attr('title', $.zui.formatDate(begin, 'yyyy-MM-dd') + ' ' + kanbancardLang.to + ' ' + $.zui.formatDate(end, 'yyyy-MM-dd')).show();
|
||||
$time.text($.zui.formatDate(begin, 'MM/dd') + ' ' + kanbancardLang.to + ' ' + $.zui.formatDate(end, 'MM/dd')).attr('title', $.zui.formatDate(begin, 'yyyy/MM/dd') + kanbancardLang.to + $.zui.formatDate(end, 'yyyy/MM/dd')).show();
|
||||
}
|
||||
|
||||
if(!$item.hasClass('has-color') && needRemind) $time.css('background-color', 'rgba(210, 50, 61, 0.3)');
|
||||
@@ -484,7 +484,7 @@ function openAddTaskForm($element)
|
||||
*/
|
||||
function resetLaneHeight()
|
||||
{
|
||||
var maxHeight = '360px';
|
||||
var maxHeight = '500px';
|
||||
if(laneCount < 2)
|
||||
{
|
||||
var windowHeight = $(window).height();
|
||||
@@ -697,8 +697,8 @@ function createCardMenu(options)
|
||||
}
|
||||
for(let i = moveColumns.length-1 ; i >= 0 ; i -- )
|
||||
{
|
||||
if(moveColumns[i].id == card.column || $.inArray(moveColumns[i].id, parentColumns) >= 0) continue;
|
||||
if(moveColumns[i].parent > 0) parentColumns.push(moveColumns[i].parent);
|
||||
if(moveColumns[i].id == card.column || $.inArray(moveColumns[i].id, parentColumns) >= 0) continue;
|
||||
moveCardItems.push({label: moveColumns[i].name, onClick: function(){moveCard(card.id, moveColumns[i].id, card.lane, card.kanban, card.region);}});
|
||||
}
|
||||
moveCardItems = moveCardItems.reverse();
|
||||
|
||||
@@ -50,6 +50,7 @@ $lang->kanban->viewArchivedColumn = 'View archived column';
|
||||
$lang->kanban->archivedColumn = 'Archived Column';
|
||||
$lang->kanban->archivedCard = 'Archived Card';
|
||||
$lang->kanban->restoreColumn = 'Restore Column';
|
||||
$lang->kanban->restoreCard = 'Restore Card';
|
||||
$lang->kanban->restore = 'Restore';
|
||||
$lang->kanban->child = 'Child';
|
||||
|
||||
@@ -285,12 +286,13 @@ $lang->kanbancard->lblHour = 'h';
|
||||
$lang->kanbancard->noAssigned = 'No Assigned';
|
||||
$lang->kanbancard->deadlineAB = 'DL';
|
||||
$lang->kanbancard->beginAB = 'Begin';
|
||||
$lang->kanbancard->to = 'to';
|
||||
$lang->kanbancard->to = '~';
|
||||
$lang->kanbancard->archived = 'Archived';
|
||||
|
||||
$lang->kanbancard->confirmArchive = 'Are you sure to archive this card? After archiving the card, it will be hidden from the column and you can view it in the Region - Archived.';
|
||||
$lang->kanbancard->confirmDelete = 'Are you sure to delete this card? After deleting the card, it will be deleted from the Kanban. You can only view it in the system recycle bin.';
|
||||
$lang->kanbancard->confirmRestore = 'Are you sure you want to restore this card? After the card is restored, the card will be restored to the "%s" Kanban column.';
|
||||
$lang->kanbancard->confirmRestoreTip = "The card's column has been archived, please restore '%s' column first.";
|
||||
$lang->kanbancard->confirmRestoreTip = "The card's column has been archived or deleted, please restore '%s' column first.";
|
||||
|
||||
$lang->kanbancard->priList[1] = 1;
|
||||
$lang->kanbancard->priList[2] = 2;
|
||||
@@ -298,9 +300,9 @@ $lang->kanbancard->priList[3] = 3;
|
||||
$lang->kanbancard->priList[4] = 4;
|
||||
|
||||
$lang->kanbancard->colorList['#fff'] = 'Default';
|
||||
$lang->kanbancard->colorList['#d2323d'] = 'Blocking';
|
||||
$lang->kanbancard->colorList['#f7b501'] = 'Warning';
|
||||
$lang->kanbancard->colorList['#278427'] = 'Urgent';
|
||||
$lang->kanbancard->colorList['#b10b0b'] = 'Blocking';
|
||||
$lang->kanbancard->colorList['#cfa227'] = 'Warning';
|
||||
$lang->kanbancard->colorList['#2a5f29'] = 'Urgent';
|
||||
|
||||
$lang->kanbancard->error = new stdClass();
|
||||
$lang->kanbancard->error->recordMinus = 'Estimate cannot be negative!';
|
||||
|
||||
@@ -6,11 +6,11 @@ $lang->kanban->editSpace = '设置空间';
|
||||
$lang->kanban->closeSpace = '关闭空间';
|
||||
$lang->kanban->deleteSpace = '删除空间';
|
||||
$lang->kanban->sortSpace = '空间排序';
|
||||
$lang->kanban->edit = '编辑看板';
|
||||
$lang->kanban->edit = '看板设置';
|
||||
$lang->kanban->view = '查看看板';
|
||||
$lang->kanban->close = '关闭看板';
|
||||
$lang->kanban->delete = '删除看板';
|
||||
$lang->kanban->createRegion = '创建区域';
|
||||
$lang->kanban->createRegion = '新增区域';
|
||||
$lang->kanban->editRegion = '编辑区域';
|
||||
$lang->kanban->sortRegion = '区域排序';
|
||||
$lang->kanban->sortGroup = '泳道组排序';
|
||||
@@ -50,6 +50,7 @@ $lang->kanban->viewArchivedColumn = '查看已归档列';
|
||||
$lang->kanban->archivedColumn = '已归档的看板列';
|
||||
$lang->kanban->archivedCard = '已归档的卡片';
|
||||
$lang->kanban->restoreColumn = '还原看板列';
|
||||
$lang->kanban->restoreCard = '还原卡片';
|
||||
$lang->kanban->restore = '还原';
|
||||
$lang->kanban->child = '子';
|
||||
|
||||
@@ -285,12 +286,13 @@ $lang->kanbancard->lblHour = 'h';
|
||||
$lang->kanbancard->noAssigned = '未指派';
|
||||
$lang->kanbancard->deadlineAB = '截止';
|
||||
$lang->kanbancard->beginAB = '开始';
|
||||
$lang->kanbancard->to = '至';
|
||||
$lang->kanbancard->to = '~';
|
||||
$lang->kanbancard->archived = '已归档';
|
||||
|
||||
$lang->kanbancard->confirmArchive = '您确认归档该卡片吗?归档卡片后,该卡片将从列中隐藏,您可以在区域-已归档中查看。';
|
||||
$lang->kanbancard->confirmDelete = '您确认删除该卡片吗?删除卡片后,该卡片将从看板中删除,您只能通过系统回收站查看。';
|
||||
$lang->kanbancard->confirmRestore = '您确定要还原该卡片吗?还原卡片后,该卡片将还原到“%s”看板列中。';
|
||||
$lang->kanbancard->confirmRestoreTip = '该卡片所属的看板列已被归档,请先还原“%s”看板列。';
|
||||
$lang->kanbancard->confirmRestoreTip = '该卡片所属的看板列已被归档或删除,请先还原“%s”看板列。';
|
||||
|
||||
$lang->kanbancard->priList[1] = 1;
|
||||
$lang->kanbancard->priList[2] = 2;
|
||||
@@ -298,9 +300,9 @@ $lang->kanbancard->priList[3] = 3;
|
||||
$lang->kanbancard->priList[4] = 4;
|
||||
|
||||
$lang->kanbancard->colorList['#fff'] = '默认';
|
||||
$lang->kanbancard->colorList['#d2323d'] = '阻塞';
|
||||
$lang->kanbancard->colorList['#f7b501'] = '警告';
|
||||
$lang->kanbancard->colorList['#278427'] = '加急';
|
||||
$lang->kanbancard->colorList['#b10b0b'] = '阻塞';
|
||||
$lang->kanbancard->colorList['#cfa227'] = '警告';
|
||||
$lang->kanbancard->colorList['#2a5f29'] = '加急';
|
||||
|
||||
$lang->kanbancard->error = new stdClass();
|
||||
$lang->kanbancard->error->recordMinus = '预计不能为负数!';
|
||||
|
||||
+14
-16
@@ -594,7 +594,7 @@ class kanbanModel extends model
|
||||
->orderBy('order')
|
||||
->fetchGroup('group');
|
||||
|
||||
$actions = array('createColumn', 'editColumn', 'splitColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'splitColumn');
|
||||
$actions = array('createColumn', 'editColumn', 'setWIP', 'archiveColumn', 'restoreColumn', 'deleteColumn', 'createCard', 'splitColumn');
|
||||
|
||||
/* Group by parent. */
|
||||
$parentColumnGroup = array();
|
||||
@@ -609,7 +609,7 @@ class kanbanModel extends model
|
||||
if($this->isClickable($column, $action)) $column->actions[] = $action;
|
||||
}
|
||||
|
||||
if($column->parent and $column->parent != -1) continue;
|
||||
if($column->parent > 0) continue;
|
||||
|
||||
$parentColumnGroup[$group][] = $column;
|
||||
}
|
||||
@@ -2136,7 +2136,6 @@ class kanbanModel extends model
|
||||
$column = $this->dao->select('t1.*, t2.type as laneType')->from(TABLE_KANBANCOLUMN)->alias('t1')
|
||||
->leftjoin(TABLE_KANBANLANE)->alias('t2')->on('t1.lane=t2.id')
|
||||
->where('t1.id')->eq($columnID)
|
||||
->andWhere('t1.deleted')->eq(0)
|
||||
->fetch();
|
||||
|
||||
if($column->parent > 0) $column->parentName = $this->dao->findById($column->parent)->from(TABLE_KANBANCOLUMN)->fetch('name');
|
||||
@@ -2164,7 +2163,7 @@ class kanbanModel extends model
|
||||
/**
|
||||
* Get columns by object id.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param string $objectType parent|region|group
|
||||
* @param int $objectID
|
||||
* @param string $archived
|
||||
* @param string $deleted
|
||||
@@ -2259,14 +2258,14 @@ class kanbanModel extends model
|
||||
/**
|
||||
* Get cards by object id.
|
||||
*
|
||||
* @param string $objectType
|
||||
* @param string $objectType kanban|region|group|lane|column
|
||||
* @param int $objectID
|
||||
* @param string $archived
|
||||
* @param string $deleted
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getCardsByObject($objectType = '', $objectID = 0, $archived = 0, $deleted = 0)
|
||||
public function getCardsByObject($objectType = '', $objectID = 0, $archived = 0, $deleted = '0')
|
||||
{
|
||||
return $this->dao->select('*')->from(TABLE_KANBANCARD)
|
||||
->where(true)
|
||||
@@ -2380,46 +2379,45 @@ class kanbanModel extends model
|
||||
->beginIF($action == 'sortlane')->andWhere('`group`')->eq($object->group)->fi()
|
||||
->fetch('count');
|
||||
return $count > 1;
|
||||
case 'createColumn' :
|
||||
case 'copyColumn' :
|
||||
case 'splitcolumn' :
|
||||
if($object->parent) return false; // The current column is a child column.
|
||||
|
||||
$count = $this->dao->select('COUNT(id) AS count')->from(TABLE_KANBANCOLUMN)
|
||||
->where('parent')->eq($object->id)
|
||||
->andWhere('deleted')->eq('0')
|
||||
//->andWhere('archived')->eq('0')
|
||||
->andWhere('archived')->eq('0')
|
||||
->fetch('count');
|
||||
return $count == 0; // The column has child columns.
|
||||
case 'restoreColumn' :
|
||||
if($object->parent)
|
||||
case 'restorecolumn' :
|
||||
if($object->parent > 0)
|
||||
{
|
||||
$parent = $this->getColumnByID($object->parent);
|
||||
if($parent->deleted == '1' || $parent->archived == '1') return false;
|
||||
}
|
||||
return $object->archived == '1';
|
||||
case 'archivecolumn' :
|
||||
//if($object->archived != '0') return false; // The column has been archived.
|
||||
if($object->archived != '0') return false; // The column has been archived.
|
||||
case 'deletecolumn' :
|
||||
if($object->deleted != '0') return false;
|
||||
|
||||
if($object->parent)
|
||||
if($object->parent > 0)
|
||||
{
|
||||
$childrenCount = $this->dao->select('COUNT(id) AS count')->from(TABLE_KANBANCOLUMN)
|
||||
->where('parent')->eq($object->parent)
|
||||
->andWhere('deleted')->eq('0')
|
||||
//->andWhere('archived')->eq('0')
|
||||
->andWhere('archived')->eq('0')
|
||||
->fetch('count');
|
||||
|
||||
return $childrenCount > 2;
|
||||
}
|
||||
|
||||
|
||||
$count = $this->dao->select('COUNT(id) AS count')->from(TABLE_KANBANCOLUMN)
|
||||
->where('region')->eq($object->region)
|
||||
->andWhere('parent')->eq(0)
|
||||
->andWhere('parent')->in('0,-1')
|
||||
->andWhere('`group`')->eq($object->group)
|
||||
->andWhere('deleted')->eq('0')
|
||||
//->andWhere('archived')->eq('0')
|
||||
->andWhere('archived')->eq('0')
|
||||
->fetch('count');
|
||||
|
||||
return $count > 1;
|
||||
|
||||
@@ -93,7 +93,7 @@ foreach($kanbanList as $spaceID => $spaceKanbans)
|
||||
}
|
||||
elseif($kanban->status == 'closed')
|
||||
{
|
||||
$closedKanbansHtml .= '<li>' . html::a(sprintf($link, $kanban->id), $kanbanName, '', "class='$selected kanbanName' title='$kanbanName' data-key='" . zget($kanbansPinYin, $kanban->name, '') . "'") . '</li>';
|
||||
$closedKanbansHtml .= '<li>' . html::a(sprintf($link, $kanban->id), $kanbanName, '', "class='$selected kanbanName' title='{$kanban->name}' data-key='" . zget($kanbansPinYin, $kanban->name, '') . "'") . '</li>';
|
||||
|
||||
if($selected == 'selected') $tabActive = 'closed';
|
||||
}
|
||||
|
||||
@@ -50,7 +50,6 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan='2' class='form-actions text-center'>
|
||||
<?php echo html::hidden('color', '#333');?>
|
||||
<?php echo html::hidden('group', $column->group);?>
|
||||
<?php echo html::hidden('parent', $column->parent > 0 ? $column->parent : 0);?>
|
||||
<?php echo html::submitButton();?>
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
if(common::hasPriv('kanban','delete'))
|
||||
{
|
||||
echo '<li>';
|
||||
common::printLink('kanban', 'delete', "kanbanID={$kanban->id}", '<i class="icon icon-trash"></i> ' . $lang->kanban->delete, '', "class='iframe' data-width='75%'", '', true);
|
||||
common::printLink('kanban', 'delete', "kanbanID={$kanban->id}", '<i class="icon icon-trash"></i> ' . $lang->kanban->delete, 'hiddenwin', '', '', true);
|
||||
echo '</li>';
|
||||
}
|
||||
?>
|
||||
@@ -141,7 +141,7 @@
|
||||
<div class='kanbanAcl'>
|
||||
<?php $icon = $kanban->acl == 'open' ? 'unlock' : 'lock';?>
|
||||
<i class="<?php echo 'icon-' . $icon;?>"></i>
|
||||
<?php echo zget($lang->kanban->aclGroup, $kanban->acl, '');?>
|
||||
<?php echo zget($lang->kanban->aclGroup, $kanban->acl == 'open' ? 'open' : 'private', '');?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -51,7 +51,7 @@ $canCreateLane = commonModel::hasPriv('kanban', 'createLane');
|
||||
<span class="strong"><?php echo $region->name;?></span>
|
||||
<label class="label label-region"><?php echo $this->lang->kanbanlane->common . ' ' . $region->laneCount;?></label>
|
||||
<span><i class="icon icon-chevron-double-up" data-id="<?php echo $region->id;?>"></i></span>
|
||||
<span>
|
||||
<span class='regionActions'>
|
||||
<?php if($canEditRegion || $canCreateLane || $canDeleteRegion):?>
|
||||
<button class="btn btn-link action" type="button" data-toggle="dropdown"><i class="icon icon-ellipsis-v"></i></button>
|
||||
<ul class="dropdown-menu pull-right">
|
||||
@@ -61,7 +61,7 @@ $canCreateLane = commonModel::hasPriv('kanban', 'createLane');
|
||||
</ul>
|
||||
<?php endif;?>
|
||||
</span>
|
||||
<span>
|
||||
<span class='regionActions'>
|
||||
<?php $canViewArchivedCard = commonModel::hasPriv('kanban', 'viewArchivedCard');?>
|
||||
<?php $canViewArchivedColumn = commonModel::hasPriv('kanban', 'viewArchivedColumn');?>
|
||||
<?php if(($canViewArchivedCard or $canViewArchivedColumn) and $kanban->archived):?>
|
||||
|
||||
@@ -23,10 +23,20 @@
|
||||
#archivedCards .card-actions {position: relative; padding: 15px 10px; padding-top: 0px;}
|
||||
#archivedCards .card-actions > .btn {display: block;}
|
||||
#archivedCards .card-actions > .btn + .btn {margin-top: 10px;}
|
||||
#archivedCards .info > .time {background-color: rgba(0, 0, 0, 0.15);}
|
||||
#archivedCards .info > .users > span:before {left: -4px;}
|
||||
#archivedCards .info > .users > span:after {right: -4px;}
|
||||
#archivedCards .info > .users .avatar {display: inline-block; position: relative; border-radius: 50%; top: -5px; margin: 5px; right: -7px; margin-left: -4px;}
|
||||
#archivedCards .cardName {word-wrap: break-word;}
|
||||
#archivedCards .card-item .red {background-color: #b10b0b;}
|
||||
#archivedCards .card-item .yellow {background-color: #cfa227;}
|
||||
#archivedCards .card-item .green {background-color: #2a5f29;}
|
||||
#archivedCards .card-item .has-color .cardName,
|
||||
#archivedCards .card-item .has-color .actions .icon-more-v,
|
||||
#archivedCards .card-item .has-color .info > .label-pri,
|
||||
#archivedCards .card-item .has-color .info > .estimate,
|
||||
#archivedCards .card-item .has-color .info > .label-light {color: #FFFFFF;}
|
||||
#archivedCards .card-item .has-color .info > .label-pri {border-color: #FFFFFF;}
|
||||
</style>
|
||||
<div class='panel'>
|
||||
<div class='panel-heading text-center'>
|
||||
@@ -37,7 +47,13 @@
|
||||
<?php foreach($cards as $card):?>
|
||||
<div class='card-item' data-card='<?php echo $card->id;?>'>
|
||||
<div class='col-xs-10'>
|
||||
<div class="kanban-item" data-id="<?php echo $card->id;?>">
|
||||
<?php
|
||||
$color = '';
|
||||
if($card->color == '#b10b0b') $color = 'has-color red';
|
||||
if($card->color == '#cfa227') $color = 'has-color yellow';
|
||||
if($card->color == '#2a5f29') $color = 'has-color green';
|
||||
?>
|
||||
<div class="kanban-item <?php echo $color;?>" data-id="<?php echo $card->id;?>">
|
||||
<?php echo html::a($this->createLink('kanban', 'viewCard', "cardID=$card->id", '', true), $card->name, '', "class='cardName iframe' data-toggle='modal' data-width='80%' title='$card->name'");?>
|
||||
<div class="info">
|
||||
<span class="pri label-pri label-pri-<?php echo $card->pri;?>"><?php echo $card->pri;?></span>
|
||||
|
||||
@@ -36,10 +36,13 @@
|
||||
<div class="btn-toolbar">
|
||||
<?php if(!$card->deleted):?>
|
||||
<?php
|
||||
common::printLink('kanban', 'assigntoCard', "cardID=$card->id", "<i class='icon icon-hand-right'></i><span class='text'>{$lang->kanbancard->assign}</span>", '', "class='btn btn-link iframe' title='{$lang->kanbancard->assign}'", true, true);
|
||||
common::printLink('kanban', 'archiveCard', "cardID=$card->id", "<i class='icon icon-ban-circle'></i><span class='text'>{$lang->kanbancard->archive}</span>", 'hiddenwin', "class='btn btn-link' title='{$lang->kanbancard->archive}'", true, true);
|
||||
//common::printLink('kanban', 'assigntoCard', "cardID=$card->id", "<i class='icon icon-hand-right'></i><span class='text'>{$lang->kanbancard->assign}</span>", '', "class='btn btn-link iframe' title='{$lang->kanbancard->assign}'", true, true);
|
||||
if(!$card->archived)
|
||||
{
|
||||
common::printLink('kanban', 'archiveCard', "cardID=$card->id", "<i class='icon icon-ban-circle'></i><span class='text'>{$lang->kanbancard->archive}</span>", 'hiddenwin', "class='btn btn-link' title='{$lang->kanbancard->archive}'", true, true);
|
||||
|
||||
echo "<div class='divider'></div>";
|
||||
echo "<div class='divider'></div>";
|
||||
}
|
||||
|
||||
common::printLink('kanban', 'editCard', "cardID=$card->id", '<i class="icon icon-edit"></i>', '', "class='btn btn-link iframe' data-width='80%' title='{$lang->kanbancard->edit}'", true, true);
|
||||
common::printLink('kanban', 'copyCard', "cardID=$card->id", '<i class="icon icon-copy"></i>', '', "class='btn btn-link iframe' title='{$lang->kanbancard->copy}'", true, true);
|
||||
|
||||
@@ -254,7 +254,7 @@ class product extends control
|
||||
}
|
||||
|
||||
/* Process the sql, get the conditon partion, save it to session. */
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story', $browseType != 'bysearch' && $this->app->rawModule != 'projectstory');
|
||||
$this->loadModel('common')->saveQueryCondition($this->dao->get(), 'story', ($browseType != 'bysearch' and $browseType != 'reviewbyme' and $this->app->rawModule != 'projectstory'));
|
||||
|
||||
if(!empty($stories)) $stories = $this->story->mergeReviewer($stories);
|
||||
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
?>
|
||||
</td>
|
||||
<?php if($this->session->currentProductType != 'normal'):?>
|
||||
<td class='c-branch' title='<?php echo $branches[$plan->branch];?>'><?php if($plan->parent != '-1') echo $branchOption[$plan->branch];?></td>
|
||||
<td class='c-branch' title='<?php echo $branchOption[$plan->branch];?>'><?php if($plan->parent != '-1') echo $branchOption[$plan->branch];?></td>
|
||||
<?php endif;?>
|
||||
<td><?php echo $plan->begin == '2030-01-01' ? $lang->productplan->future : $plan->begin;?></td>
|
||||
<td><?php echo $plan->end == '2030-01-01' ? $lang->productplan->future : $plan->end;?></td>
|
||||
|
||||
@@ -489,7 +489,7 @@ class story extends control
|
||||
}
|
||||
$this->view->titles = $titles;
|
||||
}
|
||||
$plans = $this->loadModel('productplan')->getPairsForStory($productID, $branch === 'all' or !in_array($branch, array_keys($branches)) ? 0 : $branch, 'skipParent|unexpired');
|
||||
$plans = $this->loadModel('productplan')->getPairsForStory($productID, ($branch === 'all' or !in_array($branch, array_keys($branches))) ? 0 : $branch, 'skipParent|unexpired');
|
||||
$plans['ditto'] = $this->lang->story->ditto;
|
||||
|
||||
$priList = (array)$this->lang->story->priList;
|
||||
|
||||
Reference in New Issue
Block a user