* Finish task #72756.

This commit is contained in:
daitingting
2022-10-27 05:11:55 +00:00
parent 132eb72a4d
commit 4e9109c5a7
9 changed files with 393 additions and 220 deletions
+31
View File
@@ -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.
*
+41 -6
View File
@@ -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();
}
+34
View File
@@ -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');
});
});
+2
View File
@@ -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';
+70 -68
View File
@@ -1,73 +1,75 @@
<?php
/* Actions. */
$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->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';
+71 -68
View File
@@ -1,73 +1,76 @@
<?php
/* Actions. */
$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->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';
+70 -68
View File
@@ -1,73 +1,75 @@
<?php
/* Actions. */
$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->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 = '项目';
+36 -1
View File
@@ -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);
+38 -9
View File
@@ -14,7 +14,7 @@
<?php js::set('unmodifiableProducts', $unmodifiableProducts);?>
<?php js::set('unmodifiableBranches', $unmodifiableBranches);?>
<?php js::set('unmodifiableMainBranches', $unmodifiableMainBranches);?>
<?php js::set('allProducts', $allProducts);?>
<?php js::set('allProducts', $currentProducts);?>
<?php js::set('branchGroups', $branchGroups);?>
<?php js::set('BRANCH_MAIN', BRANCH_MAIN);?>
<?php js::set('unLinkProductTip', $lang->project->unLinkProductTip);?>
@@ -22,6 +22,12 @@
<div class='btn-toolbar pull-left'>
<span class='btn btn-link btn-active-text'><span class='text'><?php echo $lang->project->manageProducts;?></span></span>
</div>
<div class='btn-toolbar pull-right'>
<?php echo html::a(inlink('manageOtherProducts'), "<i class='icon icon-link'></i> " . $lang->project->manageOtherProducts, '', "class='btn btn-primary' data-toggle='modal'");?>
<button type='button' class='btn btn-primary' data-toggle='modal' data-target='#otherProductsModal'><i class='icon icon-link'></i> <?php echo $lang->project->manageOtherProducts; ?></button>
</div>
</div>
<div id='mainContent'>
<div class='cell'>
@@ -30,32 +36,30 @@
<div class='detail-title'><?php echo $lang->project->linkedProducts;?></div>
<div class='detail-content row'>
<?php $i = 0;?>
<?php foreach($allProducts as $productID => $productName):?>
<?php if(isset($linkedProducts[$productID])):?>
<?php foreach($linkedProducts as $productID => $linkedProduct):?>
<?php foreach($linkedBranches[$productID] as $branchID):?>
<div class='col-sm-4'>
<div class='product checked <?php echo isset($allBranches[$productID]) ? ' has-branch' : ''?>'>
<div class="checkbox-primary" title='<?php echo $productName;?>'>
<div class="checkbox-primary" title='<?php echo $linkedProduct->name;?>'>
<?php echo "<input type='checkbox' name='products[$i]' value='$productID' checked id='products{$productID}'>";?>
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>' title='<?php echo $productName;?>'><?php echo $productName;?></label>
<label class='text-ellipsis checkbox-inline' for='<?php echo 'products' . $productID;?>' title='<?php echo $linkedProduct->name;?>'><?php echo $linkedProduct->name;?></label>
</div>
<?php if(isset($allBranches[$productID][$branchID])) echo html::select("branch[$i]", $allBranches[$productID], $branchID, "class='form-control chosen' data-drop_direction='down' disabled='disabled'");?>
</div>
</div>
<?php echo html::hidden("branch[$i]", $branchID);?>
<?php if(!isset($branchGroups[$productID])) unset($allProducts[$productID]);?>
<?php if(!isset($branchGroups[$productID])) unset($currentProducts[$productID]);?>
<?php if(isset($branchGroups[$productID][$branchID])) unset($branchGroups[$productID][$branchID]);?>
<?php if(isset($branchGroups[$productID]) and empty($branchGroups[$productID])) unset($allProducts[$productID]);?>
<?php if(isset($branchGroups[$productID]) and empty($branchGroups[$productID])) unset($currentProducts[$productID]);?>
<?php $i++;?>
<?php endforeach;?>
<?php endif;?>
<?php endforeach;?>
</div>
</div>
<div class='detail'>
<div class='detail-title'><?php echo $lang->project->unlinkedProducts;?></div>
<div class='detail-content row'>
<?php foreach($allProducts as $productID => $productName):?>
<?php foreach($currentProducts as $productID => $productName):?>
<div class='col-sm-4'>
<div class='product<?php echo isset($branchGroups[$productID]) ? ' has-branch' : ''?>'>
<div class="checkbox-primary" title='<?php echo $productName;?>'>
@@ -73,6 +77,31 @@
<?php echo html::hidden("post", 'post');?>
<?php echo html::submitButton();?>
</div>
<div class='modal fade' id='otherProductsModal'>
<div class='modal-content'>
<div class='modal-dialog w-600px'>
<div class='modal-header'>
<button type='button' class='close' data-dismiss='modal'><span aria-hidden='true'>×</span><span class='sr-only'><?php echo $this->lang->close;?></span></button>
<h4 class='modal-title'><?php echo $lang->project->manageOtherProducts;?></h4>
</div>
<div class='modal-body'>
<table class='table table-form'>
<tr>
<th><?php echo $lang->project->selectProduct;?></th>
<td><?php echo html::select('otherProducts[]', $otherProducts, '', "class='form-control chosen' multiple");?></td>
</tr>
<tr>
<th></th>
<td>
<?php echo html::commonButton($lang->save, '', 'btn btn-primary btn-wide saveOtherProduct');?>
<?php echo html::commonButton($lang->cancel, '', 'btn btn-wide cancelOtherProduct');?>
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</form>
</div>
</div>