diff --git a/module/product/model.php b/module/product/model.php index ef0bc132fb..61d5d9060d 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -600,6 +600,37 @@ class productModel extends model ->fetchPairs(); } + /** + * Get products group by program. + * + * @param array $appendIDList + * @access public + * @return void + */ + public function getProductsGroupByProgram($appendIDList = array()) + { + $views = $this->app->user->view->products; + if(!empty($appendIDList)) $views .= ',' . implode(',', $appendIDList); + + $products = $this->dao->select("t1.id, t1.name, t1.program, t2.name AS programName")->from(TABLE_PRODUCT)->alias('t1') + ->leftJoin(TABLE_PROJECT)->alias('t2')->on('t1.program = t2.id') + ->where('t1.deleted')->eq('0') + ->andWhere('t1.vision')->eq($this->config->vision) + ->andWhere('t1.shadow')->eq((int)0) + ->andWhere('t1.status')->ne('closed') + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($views)->fi() + ->orderBy('program') + ->fetchGroup('program'); + + $productsGroupByProgram = array(); + foreach($products as $program => $programProducts) + { + foreach($programProducts as $product) $productsGroupByProgram[$program][$product->id] = $product->programName . '/' . $product->name; + } + + return $productsGroupByProgram; + } + /* * Get product switcher. * diff --git a/module/project/control.php b/module/project/control.php index f6b7c07033..48112765c3 100755 --- a/module/project/control.php +++ b/module/project/control.php @@ -2124,17 +2124,17 @@ class project extends control $this->loadModel('product'); $this->loadModel('program'); $this->loadModel('execution'); + $project = $this->project->getById($projectID); if(!empty($_POST)) { - if(!isset($_POST['products'])) + if(!isset($_POST['products']) and !isset($_POST['otherProducts'])) { dao::$errors['message'][] = $this->lang->project->errorNoProducts; return $this->send(array('result' => 'fail', 'message' => dao::getError())); } - $oldProducts = $this->product->getProducts($projectID); $this->project->updateProducts($projectID); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); @@ -2144,6 +2144,7 @@ class project extends control if($executionID) $this->execution->updateProducts($executionID); } + $oldProducts = $this->product->getProducts($projectID); $newProducts = $this->product->getProducts($projectID); $oldProductIDs = array_keys($oldProducts); $newProductIDs = array_keys($newProducts); @@ -2176,7 +2177,7 @@ class project extends control $linkedBranches = array(); $branches = $this->project->getBranchesByProject($projectID); $linkedProductIdList = empty($branches) ? '' : array_keys($branches); - $allProducts = $this->program->getProductPairs($project->parent, 'assign', 'noclosed', $linkedProductIdList); + $allProducts = $this->program->getProductPairs($project->parent, 'all', 'noclosed', $linkedProductIdList); $linkedProducts = $this->product->getProducts($projectID, 'all', '', true, $linkedProductIdList); $projectStories = $this->project->getStoriesByProject($projectID); $projectBranches = $this->project->getBranchGroupByProject($projectID, array_keys($linkedProducts)); @@ -2188,10 +2189,10 @@ class project extends control foreach($linkedProducts as $productID => $linkedProduct) { $linkedBranches[$productID] = array(); - if(!isset($allProducts[$productID])) $allProducts[$productID] = $linkedProduct->name; foreach($branches[$productID] as $branchID => $branch) { $linkedBranches[$productID][$branchID] = $branchID; + if(!empty($projectStories[$productID][$branchID]) or !empty($projectBranches[$productID][$branchID])) { if($branchID == BRANCH_MAIN) $unmodifiableMainBranches[$productID] = $branchID; @@ -2201,18 +2202,52 @@ class project extends control } } + $branchGroups = $this->loadModel('branch')->getByProducts(array_keys($allProducts), 'ignoreNormal|noclosed'); + $productsGroupByProgram = $this->product->getProductsGroupByProgram(); + + $currentProducts = array(); + $otherProducts = array(); + foreach($productsGroupByProgram as $programID => $programProducts) + { + if($programID != $project->parent) + { + foreach($programProducts as $productID => $productName) + { + if(!empty($branchGroups[$productID])) + { + foreach($branchGroups[$productID] as $branchID => $branchName) + { + if(isset($linkedProducts[$productID]) and isset($linkedBranches[$productID][$branchID])) continue; + + $otherProducts["{$productID}_{$branchID}"] = $productName . '_' . $branchName; + } + } + else + { + if(isset($linkedProducts[$productID])) continue; + $otherProducts[$productID] = $productName; + } + } + } + else + { + $currentProducts += $programProducts; + } + } + /* Assign. */ $this->view->title = $this->lang->project->manageProducts . $this->lang->colon . $project->name; $this->view->project = $project; - $this->view->allProducts = $allProducts; + $this->view->currentProducts = $currentProducts; $this->view->linkedProducts = $linkedProducts; $this->view->linkedBranches = $linkedBranches; $this->view->branches = $branches; $this->view->unmodifiableProducts = $unmodifiableProducts; $this->view->unmodifiableBranches = $unmodifiableBranches; $this->view->unmodifiableMainBranches = $unmodifiableMainBranches; - $this->view->branchGroups = $this->loadModel('branch')->getByProducts(array_keys($allProducts), 'ignoreNormal|noclosed'); + $this->view->branchGroups = $branchGroups; $this->view->allBranches = $this->branch->getByProducts(array_keys($allProducts), 'ignoreNormal'); + $this->view->otherProducts = $otherProducts; $this->display(); } diff --git a/module/project/js/manageproducts.js b/module/project/js/manageproducts.js index cff7f15591..f4c96c60ce 100644 --- a/module/project/js/manageproducts.js +++ b/module/project/js/manageproducts.js @@ -42,4 +42,38 @@ $(function() $(this).closest('div').find("input[id^=products]").prop('checked', true); } }); + + $('.saveOtherProduct').click(function() + { + $('#productsBox').ajaxForm( + { + finish:function(response) + { + if(response.result == 'success') + { + $('#productsBox #submit').popover('destroy'); + + $('.saveOtherProduct').popover( + { + trigger: 'manual', + content: response.message, + tipClass: 'popover-success popover-form-result', + placement: 'right' + }).popover('show'); + + setTimeout(function(){$('.saveOtherProduct').popover('destroy')}, 2000); + + var reloadUrl = response.locate == 'reload' ? location.href : response.locate; + setTimeout(function(){location.href = reloadUrl;}, 1200); + } + } + }); + + $('form#productsBox').submit(); + }); + + $('.cancelOtherProduct').click(function() + { + $('#otherProductsModal').modal('hide'); + }); }); diff --git a/module/project/lang/de.php b/module/project/lang/de.php index 89641b6733..cc5480a9d6 100644 --- a/module/project/lang/de.php +++ b/module/project/lang/de.php @@ -41,6 +41,7 @@ $lang->project->whitelist = 'Project Whitelist'; $lang->project->addWhitelist = 'Project Add Whitelist'; $lang->project->unbindWhitelist = 'Project Remove Whitelist'; $lang->project->manageProducts = 'Manage Products'; +$lang->project->manageOtherProducts = 'Manage Other Products'; $lang->project->copyTitle = 'Please select an project to copy'; $lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.'; $lang->project->errorSameBranches = 'Project cannot be associated with multiple identical branches.'; @@ -68,6 +69,7 @@ $lang->project->manageRepo = 'Manage Repo'; $lang->project->linkedRepo = 'Link Repo'; $lang->project->unlinkedRepo = 'Unlink Repo'; $lang->project->disableExecution = 'Project of disable iteration'; +$lang->project->selectProduct = 'Select Product'; /* Fields. */ $lang->project->common = 'Project'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index a2c82aa4b7..cf132789eb 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -1,73 +1,75 @@ project->createGuide = 'Select Template'; -$lang->project->index = 'Dashboard'; -$lang->project->home = 'Home'; -$lang->project->create = 'Create Project'; -$lang->project->edit = 'Edit'; -$lang->project->batchEdit = 'Batch Edit Projects'; -$lang->project->view = 'Project View'; -$lang->project->batchEdit = 'Batch Edit'; -$lang->project->browse = 'Projects'; -$lang->project->all = 'All'; -$lang->project->start = 'Start'; -$lang->project->finish = 'Finish'; -$lang->project->suspend = 'Suspend'; -$lang->project->delete = 'Delete'; -$lang->project->close = 'Close'; -$lang->project->activate = 'Activate'; -$lang->project->group = 'Privilege Group'; -$lang->project->createGroup = 'Create Group'; -$lang->project->editGroup = 'Edit Group'; -$lang->project->copyGroup = 'Copy Group'; -$lang->project->manageView = 'Manage View'; -$lang->project->managePriv = 'Manage Privilege'; -$lang->project->manageMembers = 'Manage Team'; -$lang->project->export = 'Export'; -$lang->project->addProduct = 'Add Product'; -$lang->project->manageGroupMember = 'Manage Group'; -$lang->project->moduleSetting = 'List Settings'; -$lang->project->moduleOpen = 'Program Name'; -$lang->project->dynamic = 'Dynamic'; -$lang->project->execution = 'Execution'; -$lang->project->qa = 'QA'; -$lang->project->bug = 'Bug List'; -$lang->project->testcase = 'Case List'; -$lang->project->testtask = 'Test Task'; -$lang->project->build = 'Build'; -$lang->project->updateOrder = 'Order'; -$lang->project->sort = 'Order'; -$lang->project->whitelist = 'Project Whitelist'; -$lang->project->addWhitelist = 'Project Add Whitelist'; -$lang->project->unbindWhitelist = 'Project Remove Whitelist'; -$lang->project->manageProducts = 'Manage Products'; -$lang->project->copyTitle = 'Please select an project to copy'; -$lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.'; -$lang->project->errorSameBranches = 'Project cannot be associated with multiple identical branches.'; -$lang->project->errorSamePlans = 'Project cannot be associated with multiple identical plans.'; -$lang->project->errorNoProducts = 'At least one product is associated'; -$lang->project->copyNoProject = 'There are no items available to copy.'; -$lang->project->searchByName = 'Enter the project name to retrieve'; -$lang->project->deleted = 'Deleted'; -$lang->project->linkedProducts = "Linked {$lang->productCommon}s"; -$lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s"; -$lang->project->testreport = 'Test Report'; -$lang->project->selectProgram = 'Program filtering'; -$lang->project->teamMember = 'Team Member'; -$lang->project->unlinkMember = 'Remove Member'; -$lang->project->copyTeamTitle = 'Select a project team to copy'; -$lang->project->daysGreaterProject = 'Days cannot be greater than days of project『%s』'; -$lang->project->errorHours = 'Hours/Day cannot be greater than『24』'; -$lang->project->workdaysExceed = 'No more than『%s』working days'; -$lang->project->teamMembersCount = ', there are %s team members.'; -$lang->project->budgetNumber = '『Budget』must be numbers.'; -$lang->project->budgetGe0 = '『Budget』must be greater than or equal to 0.'; -$lang->project->allProjects = 'All Projects'; -$lang->project->ignore = 'Ignore'; -$lang->project->manageRepo = 'Manage Repo'; -$lang->project->linkedRepo = 'Link Repo'; -$lang->project->unlinkedRepo = 'Unlink Repo'; -$lang->project->disableExecution = 'Project of disable iteration'; +$lang->project->createGuide = 'Select Template'; +$lang->project->index = 'Dashboard'; +$lang->project->home = 'Home'; +$lang->project->create = 'Create Project'; +$lang->project->edit = 'Edit'; +$lang->project->batchEdit = 'Batch Edit Projects'; +$lang->project->view = 'Project View'; +$lang->project->batchEdit = 'Batch Edit'; +$lang->project->browse = 'Projects'; +$lang->project->all = 'All'; +$lang->project->start = 'Start'; +$lang->project->finish = 'Finish'; +$lang->project->suspend = 'Suspend'; +$lang->project->delete = 'Delete'; +$lang->project->close = 'Close'; +$lang->project->activate = 'Activate'; +$lang->project->group = 'Privilege Group'; +$lang->project->createGroup = 'Create Group'; +$lang->project->editGroup = 'Edit Group'; +$lang->project->copyGroup = 'Copy Group'; +$lang->project->manageView = 'Manage View'; +$lang->project->managePriv = 'Manage Privilege'; +$lang->project->manageMembers = 'Manage Team'; +$lang->project->export = 'Export'; +$lang->project->addProduct = 'Add Product'; +$lang->project->manageGroupMember = 'Manage Group'; +$lang->project->moduleSetting = 'List Settings'; +$lang->project->moduleOpen = 'Program Name'; +$lang->project->dynamic = 'Dynamic'; +$lang->project->execution = 'Execution'; +$lang->project->qa = 'QA'; +$lang->project->bug = 'Bug List'; +$lang->project->testcase = 'Case List'; +$lang->project->testtask = 'Test Task'; +$lang->project->build = 'Build'; +$lang->project->updateOrder = 'Order'; +$lang->project->sort = 'Order'; +$lang->project->whitelist = 'Project Whitelist'; +$lang->project->addWhitelist = 'Project Add Whitelist'; +$lang->project->unbindWhitelist = 'Project Remove Whitelist'; +$lang->project->manageProducts = 'Manage Products'; +$lang->project->manageOtherProducts = 'Manage Other Products'; +$lang->project->copyTitle = 'Please select an project to copy'; +$lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.'; +$lang->project->errorSameBranches = 'Project cannot be associated with multiple identical branches.'; +$lang->project->errorSamePlans = 'Project cannot be associated with multiple identical plans.'; +$lang->project->errorNoProducts = 'At least one product is associated'; +$lang->project->copyNoProject = 'There are no items available to copy.'; +$lang->project->searchByName = 'Enter the project name to retrieve'; +$lang->project->deleted = 'Deleted'; +$lang->project->linkedProducts = "Linked {$lang->productCommon}s"; +$lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s"; +$lang->project->testreport = 'Test Report'; +$lang->project->selectProgram = 'Program filtering'; +$lang->project->teamMember = 'Team Member'; +$lang->project->unlinkMember = 'Remove Member'; +$lang->project->copyTeamTitle = 'Select a project team to copy'; +$lang->project->daysGreaterProject = 'Days cannot be greater than days of project『%s』'; +$lang->project->errorHours = 'Hours/Day cannot be greater than『24』'; +$lang->project->workdaysExceed = 'No more than『%s』working days'; +$lang->project->teamMembersCount = ', there are %s team members.'; +$lang->project->budgetNumber = '『Budget』must be numbers.'; +$lang->project->budgetGe0 = '『Budget』must be greater than or equal to 0.'; +$lang->project->allProjects = 'All Projects'; +$lang->project->ignore = 'Ignore'; +$lang->project->manageRepo = 'Manage Repo'; +$lang->project->linkedRepo = 'Link Repo'; +$lang->project->unlinkedRepo = 'Unlink Repo'; +$lang->project->disableExecution = 'Project of disable iteration'; +$lang->project->selectProduct = 'Select Product'; /* Fields. */ $lang->project->common = 'Project'; diff --git a/module/project/lang/fr.php b/module/project/lang/fr.php index 53f0727a4c..62f239c26b 100644 --- a/module/project/lang/fr.php +++ b/module/project/lang/fr.php @@ -1,73 +1,76 @@ project->createGuide = 'Select Template'; -$lang->project->index = 'Dashboard'; -$lang->project->home = 'Home'; -$lang->project->create = 'Create Project'; -$lang->project->edit = 'Edit'; -$lang->project->batchEdit = 'Batch Edit Projects'; -$lang->project->view = 'Project View'; -$lang->project->batchEdit = 'Batch Edit Projects'; -$lang->project->browse = 'Projects'; -$lang->project->all = 'All'; -$lang->project->start = 'Start'; -$lang->project->finish = 'Finish'; -$lang->project->suspend = 'Suspend'; -$lang->project->delete = 'Delete'; -$lang->project->close = 'Close'; -$lang->project->activate = 'Activate'; -$lang->project->group = 'Privilege Group'; -$lang->project->createGroup = 'Create Group'; -$lang->project->editGroup = 'Edit Group'; -$lang->project->copyGroup = 'Copy Group'; -$lang->project->manageView = 'Manage View'; -$lang->project->managePriv = 'Manage Privilege'; -$lang->project->manageMembers = 'Manage Team'; -$lang->project->export = 'Export'; -$lang->project->addProduct = 'Add Product'; -$lang->project->manageGroupMember = 'Manage Group'; -$lang->project->moduleSetting = 'List Settings'; -$lang->project->moduleOpen = 'Program Name'; -$lang->project->dynamic = 'Dynamic'; -$lang->project->execution = 'Execution'; -$lang->project->qa = 'QA'; -$lang->project->bug = 'Bug List'; -$lang->project->testcase = 'Case List'; -$lang->project->testtask = 'Test Task'; -$lang->project->build = 'Build'; -$lang->project->updateOrder = 'Order'; -$lang->project->sort = 'Order'; -$lang->project->whitelist = 'Project Whitelist'; -$lang->project->addWhitelist = 'Project Add Whitelist'; -$lang->project->unbindWhitelist = 'Project Remove Whitelist'; -$lang->project->manageProducts = 'Manage Products'; -$lang->project->copyTitle = 'Please select an project to copy'; -$lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.'; -$lang->project->errorSameBranches = 'Project cannot be associated with multiple identical branches.'; -$lang->project->errorSamePlans = 'Project cannot be associated with multiple identical plans.'; -$lang->project->errorNoProducts = 'At least one product is associated'; -$lang->project->copyNoProject = 'There are no items available to copy.'; -$lang->project->searchByName = 'Enter the project name to retrieve'; -$lang->project->deleted = 'Supprimé'; -$lang->project->linkedProducts = "Linked {$lang->productCommon}s"; -$lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s"; -$lang->project->testreport = 'Testreport'; -$lang->project->selectProgram = 'Program filtering'; -$lang->project->teamMember = 'Team Member'; -$lang->project->unlinkMember = 'Remove Member'; -$lang->project->copyTeamTitle = 'Select a project team to copy'; -$lang->project->daysGreaterProject = 'Days cannot be greater than days of project『%s』'; -$lang->project->errorHours = 'Hours/Day cannot be greater than『24』'; -$lang->project->workdaysExceed = 'No more than『%s』working days'; -$lang->project->teamMembersCount = ', there are %s team members.'; -$lang->project->budgetNumber = '『Budget』must be numbers.'; -$lang->project->budgetGe0 = '『Budget』must be greater than or equal to 0.'; -$lang->project->allProjects = 'All Projects'; -$lang->project->ignore = 'Ignorer'; -$lang->project->manageRepo = 'Manage Repo'; -$lang->project->linkedRepo = 'Link Repo'; -$lang->project->unlinkedRepo = 'Unlink Repo'; -$lang->project->disableExecution = 'Project of disable iteration'; +$lang->project->createGuide = 'Select Template'; +$lang->project->index = 'Dashboard'; +$lang->project->home = 'Home'; +$lang->project->create = 'Create Project'; +$lang->project->edit = 'Edit'; +$lang->project->batchEdit = 'Batch Edit Projects'; +$lang->project->view = 'Project View'; +$lang->project->batchEdit = 'Batch Edit Projects'; +$lang->project->browse = 'Projects'; +$lang->project->all = 'All'; +$lang->project->start = 'Start'; +$lang->project->finish = 'Finish'; +$lang->project->suspend = 'Suspend'; +$lang->project->delete = 'Delete'; +$lang->project->close = 'Close'; +$lang->project->activate = 'Activate'; +$lang->project->group = 'Privilege Group'; +$lang->project->createGroup = 'Create Group'; +$lang->project->editGroup = 'Edit Group'; +$lang->project->copyGroup = 'Copy Group'; +$lang->project->manageView = 'Manage View'; +$lang->project->managePriv = 'Manage Privilege'; +$lang->project->manageMembers = 'Manage Team'; +$lang->project->export = 'Export'; +$lang->project->addProduct = 'Add Product'; +$lang->project->manageGroupMember = 'Manage Group'; +$lang->project->moduleSetting = 'List Settings'; +$lang->project->moduleOpen = 'Program Name'; +$lang->project->dynamic = 'Dynamic'; +$lang->project->execution = 'Execution'; +$lang->project->qa = 'QA'; +$lang->project->bug = 'Bug List'; +$lang->project->testcase = 'Case List'; +$lang->project->testtask = 'Test Task'; +$lang->project->build = 'Build'; +$lang->project->updateOrder = 'Order'; +$lang->project->sort = 'Order'; +$lang->project->whitelist = 'Project Whitelist'; +$lang->project->addWhitelist = 'Project Add Whitelist'; +$lang->project->unbindWhitelist = 'Project Remove Whitelist'; +$lang->project->manageProducts = 'Manage Products'; +$lang->project->manageOtherProducts = 'Manage Other Products'; +$lang->project->copyTitle = 'Please select an project to copy'; +$lang->project->errorSameProducts = 'Project cannot be associated with multiple identical products.'; +$lang->project->errorSameBranches = 'Project cannot be associated with multiple identical branches.'; +$lang->project->errorSamePlans = 'Project cannot be associated with multiple identical plans.'; +$lang->project->errorNoProducts = 'At least one product is associated'; +$lang->project->copyNoProject = 'There are no items available to copy.'; +$lang->project->searchByName = 'Enter the project name to retrieve'; +$lang->project->deleted = 'Supprimé'; +$lang->project->linkedProducts = "Linked {$lang->productCommon}s"; +$lang->project->unlinkedProducts = "Unlinked {$lang->productCommon}s"; +$lang->project->testreport = 'Testreport'; +$lang->project->selectProgram = 'Program filtering'; +$lang->project->teamMember = 'Team Member'; +$lang->project->unlinkMember = 'Remove Member'; +$lang->project->copyTeamTitle = 'Select a project team to copy'; +$lang->project->daysGreaterProject = 'Days cannot be greater than days of project『%s』'; +$lang->project->errorHours = 'Hours/Day cannot be greater than『24』'; +$lang->project->workdaysExceed = 'No more than『%s』working days'; +$lang->project->teamMembersCount = ', there are %s team members.'; +$lang->project->budgetNumber = '『Budget』must be numbers.'; +$lang->project->budgetGe0 = '『Budget』must be greater than or equal to 0.'; +$lang->project->allProjects = 'All Projects'; +$lang->project->ignore = 'Ignorer'; +$lang->project->manageRepo = 'Manage Repo'; +$lang->project->linkedRepo = 'Link Repo'; +$lang->project->unlinkedRepo = 'Unlink Repo'; +$lang->project->disableExecution = 'Project of disable iteration'; +$lang->project->selectProduct = 'Select Product'; + /* Fields. */ $lang->project->common = 'Projets'; $lang->project->id = 'ID'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 4bf728a949..e89dfbf272 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -1,73 +1,75 @@ project->createGuide = '选择项目模板'; -$lang->project->index = '项目仪表盘'; -$lang->project->home = '项目主页'; -$lang->project->create = '创建项目'; -$lang->project->edit = '编辑项目'; -$lang->project->batchEdit = '批量编辑项目'; -$lang->project->view = '项目概况'; -$lang->project->batchEdit = '批量编辑'; -$lang->project->browse = '项目列表'; -$lang->project->all = '所有项目'; -$lang->project->start = '启动项目'; -$lang->project->finish = '完成项目'; -$lang->project->suspend = '挂起项目'; -$lang->project->delete = '删除项目'; -$lang->project->close = '关闭项目'; -$lang->project->activate = '激活项目'; -$lang->project->group = '项目权限分组'; -$lang->project->createGroup = '项目创建分组'; -$lang->project->editGroup = '项目编辑分组'; -$lang->project->copyGroup = '项目复制分组'; -$lang->project->manageView = '项目维护视野'; -$lang->project->managePriv = '项目维护权限'; -$lang->project->manageMembers = '团队管理'; -$lang->project->export = '导出'; -$lang->project->addProduct = '新建产品'; -$lang->project->manageGroupMember = '维护分组用户'; -$lang->project->moduleSetting = '列表设置'; -$lang->project->moduleOpen = '显示项目集名'; -$lang->project->dynamic = '动态'; -$lang->project->execution = '执行列表'; -$lang->project->qa = '测试仪表盘'; -$lang->project->bug = 'Bug列表'; -$lang->project->testcase = '用例列表'; -$lang->project->testtask = '测试单'; -$lang->project->build = '版本'; -$lang->project->updateOrder = '排序'; -$lang->project->sort = '项目排序'; -$lang->project->whitelist = '项目白名单'; -$lang->project->addWhitelist = '项目添加白名单'; -$lang->project->unbindWhitelist = '项目删除白名单'; -$lang->project->manageProducts = '关联产品'; -$lang->project->copyTitle = '请选择要复制的项目'; -$lang->project->errorSameProducts = '项目不能关联多个相同的产品。'; -$lang->project->errorSameBranches = '项目不能关联多个相同的分支。'; -$lang->project->errorSamePlans = '项目不能关联多个相同的计划。'; -$lang->project->errorNoProducts = '最少关联一个产品'; -$lang->project->copyNoProject = '没有可用的项目来复制'; -$lang->project->searchByName = '输入项目名称进行检索'; -$lang->project->deleted = '已删除'; -$lang->project->linkedProducts = '已关联产品'; -$lang->project->unlinkedProducts = '未关联'; -$lang->project->testreport = '测试报告'; -$lang->project->selectProgram = '项目集筛选'; -$lang->project->teamMember = '团队成员'; -$lang->project->unlinkMember = '移除成员'; -$lang->project->copyTeamTitle = '选择一个项目团队来复制'; -$lang->project->daysGreaterProject = '可用工日不能大于项目的可用工日『%s』'; -$lang->project->errorHours = '可用工时/天不能大于『24』'; -$lang->project->workdaysExceed = '可用工作日不能超过『%s』天'; -$lang->project->teamMembersCount = ',团队成员共%s人。'; -$lang->project->budgetNumber = '『预算』金额必须为数字。'; -$lang->project->budgetGe0 = '『预算』金额必须大于等于0。'; -$lang->project->allProjects = '所有项目'; -$lang->project->ignore = '忽略'; -$lang->project->manageRepo = '关联代码库'; -$lang->project->linkedRepo = '已关联代码库'; -$lang->project->unlinkedRepo = '未关联代码库'; -$lang->project->disableExecution = '不启用迭代的项目'; +$lang->project->createGuide = '选择项目模板'; +$lang->project->index = '项目仪表盘'; +$lang->project->home = '项目主页'; +$lang->project->create = '创建项目'; +$lang->project->edit = '编辑项目'; +$lang->project->batchEdit = '批量编辑项目'; +$lang->project->view = '项目概况'; +$lang->project->batchEdit = '批量编辑'; +$lang->project->browse = '项目列表'; +$lang->project->all = '所有项目'; +$lang->project->start = '启动项目'; +$lang->project->finish = '完成项目'; +$lang->project->suspend = '挂起项目'; +$lang->project->delete = '删除项目'; +$lang->project->close = '关闭项目'; +$lang->project->activate = '激活项目'; +$lang->project->group = '项目权限分组'; +$lang->project->createGroup = '项目创建分组'; +$lang->project->editGroup = '项目编辑分组'; +$lang->project->copyGroup = '项目复制分组'; +$lang->project->manageView = '项目维护视野'; +$lang->project->managePriv = '项目维护权限'; +$lang->project->manageMembers = '团队管理'; +$lang->project->export = '导出'; +$lang->project->addProduct = '新建产品'; +$lang->project->manageGroupMember = '维护分组用户'; +$lang->project->moduleSetting = '列表设置'; +$lang->project->moduleOpen = '显示项目集名'; +$lang->project->dynamic = '动态'; +$lang->project->execution = '执行列表'; +$lang->project->qa = '测试仪表盘'; +$lang->project->bug = 'Bug列表'; +$lang->project->testcase = '用例列表'; +$lang->project->testtask = '测试单'; +$lang->project->build = '版本'; +$lang->project->updateOrder = '排序'; +$lang->project->sort = '项目排序'; +$lang->project->whitelist = '项目白名单'; +$lang->project->addWhitelist = '项目添加白名单'; +$lang->project->unbindWhitelist = '项目删除白名单'; +$lang->project->manageProducts = '关联产品'; +$lang->project->manageOtherProducts = '关联其他产品'; +$lang->project->copyTitle = '请选择要复制的项目'; +$lang->project->errorSameProducts = '项目不能关联多个相同的产品。'; +$lang->project->errorSameBranches = '项目不能关联多个相同的分支。'; +$lang->project->errorSamePlans = '项目不能关联多个相同的计划。'; +$lang->project->errorNoProducts = '最少关联一个产品'; +$lang->project->copyNoProject = '没有可用的项目来复制'; +$lang->project->searchByName = '输入项目名称进行检索'; +$lang->project->deleted = '已删除'; +$lang->project->linkedProducts = '已关联产品'; +$lang->project->unlinkedProducts = '未关联'; +$lang->project->testreport = '测试报告'; +$lang->project->selectProgram = '项目集筛选'; +$lang->project->teamMember = '团队成员'; +$lang->project->unlinkMember = '移除成员'; +$lang->project->copyTeamTitle = '选择一个项目团队来复制'; +$lang->project->daysGreaterProject = '可用工日不能大于项目的可用工日『%s』'; +$lang->project->errorHours = '可用工时/天不能大于『24』'; +$lang->project->workdaysExceed = '可用工作日不能超过『%s』天'; +$lang->project->teamMembersCount = ',团队成员共%s人。'; +$lang->project->budgetNumber = '『预算』金额必须为数字。'; +$lang->project->budgetGe0 = '『预算』金额必须大于等于0。'; +$lang->project->allProjects = '所有项目'; +$lang->project->ignore = '忽略'; +$lang->project->manageRepo = '关联代码库'; +$lang->project->linkedRepo = '已关联代码库'; +$lang->project->unlinkedRepo = '未关联代码库'; +$lang->project->disableExecution = '不启用迭代的项目'; +$lang->project->selectProduct = '选择产品'; /* Fields. */ $lang->project->common = '项目'; diff --git a/module/project/model.php b/module/project/model.php index 03f0a01ee1..886fe25d28 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -2316,12 +2316,47 @@ class projectModel extends model { $this->loadModel('user'); + $members = array_keys($this->getTeamMembers($projectID)); + + if($_POST['otherProducts']) + { + $products = array(); + $otherProducts = $_POST['otherProducts']; + foreach($otherProducts as $index => $otherProduct) + { + if(!$otherProduct) continue; + + $data = new stdclass(); + $data->project = $projectID; + $data->plan = 0; + + if(strpos($otherProduct, '_') !== false) + { + $params = explode('_', $otherProduct); + $data->product = $params[0]; + $data->branch = $params[1]; + } + else + { + $data->product = $otherProduct; + $data->branch = 0; + } + + $this->dao->insert(TABLE_PROJECTPRODUCT)->data($data)->exec(); + + $products[] = $data->product; + } + + $this->user->updateUserView($products, 'product', $members); + + return !dao::isError(); + } + $products = isset($_POST['products']) ? $_POST['products'] : $products; $oldProjectProducts = $this->dao->select('*')->from(TABLE_PROJECTPRODUCT)->where('project')->eq((int)$projectID)->fetchGroup('product', 'branch'); $this->dao->delete()->from(TABLE_PROJECTPRODUCT)->where('project')->eq((int)$projectID)->exec(); - $members = array_keys($this->getTeamMembers($projectID)); if(empty($products)) { $this->user->updateUserView(array_keys($oldProjectProducts), 'product', $members); diff --git a/module/project/view/manageproducts.html.php b/module/project/view/manageproducts.html.php index 0d47f06f8e..764059da54 100644 --- a/module/project/view/manageproducts.html.php +++ b/module/project/view/manageproducts.html.php @@ -14,7 +14,7 @@ - + project->unLinkProductTip);?> @@ -22,6 +22,12 @@
+ +