diff --git a/module/branch/control.php b/module/branch/control.php index 7e0a6c65d1..36bc5300e9 100644 --- a/module/branch/control.php +++ b/module/branch/control.php @@ -328,4 +328,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'")); + } } diff --git a/module/branch/css/manage.css b/module/branch/css/manage.css index a34994347c..edaa96f5ca 100644 --- a/module/branch/css/manage.css +++ b/module/branch/css/manage.css @@ -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;} diff --git a/module/branch/js/manage.js b/module/branch/js/manage.js index 89e2faa12a..f52b3a8b75 100644 --- a/module/branch/js/manage.js +++ b/module/branch/js/manage.js @@ -78,35 +78,78 @@ $(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(); + }) + }) + + $('#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; + } + + 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) + return false; + } + else + { + $('#mergeBranch').modal('hide'); + window.location.reload(); + } } - else - { - $('#mergeBranch').modal('hide'); - window.location.reload(); - } - } - }) + }) + } + else + { + window.location.reload(); + } }); }) diff --git a/module/branch/lang/en.php b/module/branch/lang/en.php index 45a74d62be..6f6292b986 100644 --- a/module/branch/lang/en.php +++ b/module/branch/lang/en.php @@ -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.'; diff --git a/module/branch/lang/zh-cn.php b/module/branch/lang/zh-cn.php index d839898ad8..4b8ea184ba 100644 --- a/module/branch/lang/zh-cn.php +++ b/module/branch/lang/zh-cn.php @@ -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。'; diff --git a/module/branch/model.php b/module/branch/model.php index 4d27e1ed7e..7fddfa1fef 100644 --- a/module/branch/model.php +++ b/module/branch/model.php @@ -94,10 +94,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) @@ -114,6 +115,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); @@ -596,10 +598,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) { @@ -607,7 +609,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. */ diff --git a/module/branch/view/manage.html.php b/module/branch/view/manage.html.php index f8cda10794..bb39ad9aab 100644 --- a/module/branch/view/manage.html.php +++ b/module/branch/view/manage.html.php @@ -78,7 +78,7 @@ ';?> - + name;?>  default) @@ -126,7 +126,7 @@ 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'"); ?> @@ -143,14 +143,22 @@