diff --git a/module/action/model.php b/module/action/model.php
index 0738ab9bbf..718d885972 100755
--- a/module/action/model.php
+++ b/module/action/model.php
@@ -1128,7 +1128,7 @@ class actionModel extends model
elseif($action->objectType == 'team')
{
$action->objectLink = '';
- if($action->project) $action->objectLink = helper::createLink('project', 'manageMembers', 'projectID=' . $action->project);
+ if($action->project) $action->objectLink = helper::createLink('project', 'team', 'projectID=' . $action->project);
if($action->execution) $action->objectLink = helper::createLink('execution', 'team', 'executionID=' . $action->execution);
$action->objectLabel = zget($this->lang->action->objectTypes, $action->objectLabel);
}
diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php
index 4cbb6a8d31..ce273b17eb 100644
--- a/module/common/lang/menu.php
+++ b/module/common/lang/menu.php
@@ -190,7 +190,7 @@ $lang->scrum->menu->devops = array('link' => "{$lang->repo->common}|repo|brow
$lang->scrum->menu->build = array('link' => "{$lang->build->common}|project|build|project=%s");
$lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease');
$lang->scrum->menu->dynamic = array('link' => "$lang->dynamic|project|dynamic|project=%s");
-$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist');
+$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team');
$lang->scrum->dividerMenu = ',execution,programplan,doc,settings,';
@@ -218,7 +218,7 @@ $lang->scrum->menu->qa['subMenu']->testreport = array('link' => "{$lang->testrep
$lang->scrum->menu->settings['subMenu'] = new stdclass();
$lang->scrum->menu->settings['subMenu']->view = array('link' => "$lang->overview|project|view|project=%s", 'alias' => 'edit');
$lang->scrum->menu->settings['subMenu']->products = array('link' => "{$lang->product->common}|project|manageProducts|project=%s", 'alias' => 'manageproducts');
-$lang->scrum->menu->settings['subMenu']->members = array('link' => "{$lang->team->common}|project|manageMembers|project=%s", 'alias' => 'managemembers');
+$lang->scrum->menu->settings['subMenu']->members = array('link' => "{$lang->team->common}|project|team|project=%s", 'alias' => 'managemembers,team');
$lang->scrum->menu->settings['subMenu']->whitelist = array('link' => "{$lang->whitelist}|project|whitelist|project=%s", 'subModule' => 'personnel');
$lang->scrum->menu->settings['subMenu']->stakeholder = array('link' => "{$lang->stakeholder->common}|stakeholder|browse|project=%s", 'subModule' => 'stakeholder');
$lang->scrum->menu->settings['subMenu']->group = array('link' => "{$lang->priv}|project|group|project=%s", 'alias' => 'group,manageview,managepriv');
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index 9284d875fe..ebabdcb63d 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -237,6 +237,8 @@ if($config->systemMode == 'new')
$lang->resource->project->export = 'export';
$lang->resource->project->createGuide = 'createGuide';
$lang->resource->project->updateOrder = 'updateOrder';
+ $lang->resource->project->team = 'teamAction';
+ $lang->resource->project->unlinkMember = 'unlinkMember';
$lang->project->methodOrder[0] = 'index';
$lang->project->methodOrder[5] = 'browse';
@@ -275,6 +277,8 @@ if($config->systemMode == 'new')
$lang->project->methodOrder[170] = 'export';
$lang->project->methodOrder[175] = 'createGuide';
$lang->project->methodOrder[180] = 'updateOrder';
+ $lang->project->methodOrder[185] = 'team';
+ $lang->project->methodOrder[190] = 'unlinkMember';
$lang->resource->projectbuild = new stdclass();
$lang->resource->projectbuild->browse = 'browse';
diff --git a/module/my/model.php b/module/my/model.php
index 52124c0429..d31af7fb9a 100644
--- a/module/my/model.php
+++ b/module/my/model.php
@@ -124,6 +124,7 @@ class myModel extends model
$info->todo->dynamic = new stdclass();
if(common::hasPriv('todo', 'view'))
{
+ $this->app->loadClass('date');
$todos = $this->dao->select('*')->from(TABLE_TODO)
->where('assignedTo')->eq($this->app->user->account)
->andWhere('cycle')->eq(0)
@@ -134,12 +135,6 @@ class myModel extends model
->fetchAll();
foreach($todos as $key => $todo)
{
- if($todo->status == 'done' and $todo->finishedBy == $this->app->user->account)
- {
- unset($todos[$key]);
- continue;
- }
-
$todo->begin = date::formatTime($todo->begin);
$todo->end = date::formatTime($todo->end);
}
@@ -182,10 +177,9 @@ class myModel extends model
->orWhere('participant')->in($this->app->user->account)
->markRight(1)
->orderBy('id_desc')
- ->limit(3)
->fetchAll();
- $info->meeting->total = (int) $this->dao->select('count(*) AS count')->from(TABLE_MEETING)->where('assignedTo')->eq($this->app->user->account)->andWhere('status')->ne('closed')->andWhere('deleted')->eq(0)->fetch('count');
- $info->meeting->dynamic = $meetings;
+ $info->meeting->total = count($meetings);
+ $info->meeting->dynamic = array_slice($meetings, 0, 3);
}
/* My issues. */
@@ -278,8 +272,8 @@ class myModel extends model
}
$info->dynamic = $actions;
- /* User info. */
- $info->participateProjectCount = count($info->projects);
+ /* Some count. */
+ $info->joinProjectCount = count($info->projects);
$info->createdDocs = $this->dao->select('count(*) AS count')->from(TABLE_DOC)->where('addedBy')->eq($this->app->user->account)->andWhere('deleted')->eq('0')->fetch('count');
return $info;
diff --git a/module/program/view/browsebylist.html.php b/module/program/view/browsebylist.html.php
index d2644a4c0d..4e59f68dc1 100644
--- a/module/program/view/browsebylist.html.php
+++ b/module/program/view/browsebylist.html.php
@@ -62,7 +62,7 @@
project->statusList, $program->status, '');?> |
PM)):?>
-
+
PM]) ? html::image($usersAvatar[$program->PM]) : strtoupper($program->PM[0]);?>
PM]) ? $PMList[$program->PM]->id : '';?>
diff --git a/module/project/control.php b/module/project/control.php
index ca3799d002..4db0a20ee8 100644
--- a/module/project/control.php
+++ b/module/project/control.php
@@ -1110,6 +1110,66 @@ class project extends control
$this->display();
}
+ /**
+ * Browse team of a project.
+ *
+ * @param int $projectID
+ * @access public
+ * @return void
+ */
+ public function team($projectID = 0)
+ {
+ $this->app->loadLang('execution');
+ $this->project->setMenu($projectID);
+
+ $project = $this->project->getById($projectID);
+
+ $this->view->title = $project->name . $this->lang->colon . $this->lang->project->team;
+ $this->view->projectID = $projectID;
+ $this->view->teamMembers = $this->project->getTeamMembers($projectID);
+ $this->view->deptUsers = $this->loadModel('dept')->getDeptUserPairs($this->app->user->dept, 'useid');
+ $this->view->canBeChanged = common::canModify('project', $project);
+
+ $this->display();
+ }
+
+ /**
+ * Unlink a memeber.
+ *
+ * @param int $projectID
+ * @param int $userID
+ * @param string $confirm yes|no
+ * @access public
+ * @return void
+ */
+ public function unlinkMember($projectID, $userID, $confirm = 'no')
+ {
+ if($confirm == 'no') die(js::confirm($this->lang->project->confirmUnlinkMember, $this->inlink('unlinkMember', "projectID=$projectID&userID=$userID&confirm=yes")));
+
+ $user = $this->loadModel('user')->getById($userID, 'id');
+ $account = $user->account;
+
+ $this->project->unlinkMember($projectID, $account);
+ if(!dao::isError()) $this->loadModel('action')->create('team', $projectID, 'managedTeam');
+
+ /* if ajax request, send result. */
+ if($this->server->ajax)
+ {
+ if(dao::isError())
+ {
+ $response['result'] = 'fail';
+ $response['message'] = dao::getError();
+ }
+ else
+ {
+ $response['result'] = 'success';
+ $response['message'] = '';
+ }
+ return $this->send($response);
+ }
+ die(js::locate($this->inlink('team', "projectID=$projectID"), 'parent'));
+ }
+
/**
* Manage project members.
*
@@ -1131,7 +1191,7 @@ class project extends control
$this->project->manageMembers($projectID);
$this->loadModel('action')->create('team', $projectID, 'ManagedTeam');
- $link = $this->createLink('project', 'manageMembers', "projectID=$projectID");
+ $link = $this->createLink('project', 'team', "projectID=$projectID");
return $this->send(array('message' => $this->lang->saveSuccess, 'result' => 'success', 'locate' => $link));
}
diff --git a/module/project/js/team.js b/module/project/js/team.js
new file mode 100644
index 0000000000..d58ba42f6b
--- /dev/null
+++ b/module/project/js/team.js
@@ -0,0 +1,4 @@
+function checkUserDept(userID)
+{
+ alert(noAccess);
+}
diff --git a/module/project/lang/en.php b/module/project/lang/en.php
index d718e6964f..2ce52b6ef0 100644
--- a/module/project/lang/en.php
+++ b/module/project/lang/en.php
@@ -52,6 +52,7 @@ $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';
/* Fields. */
$lang->project->common = 'Project';
@@ -77,6 +78,7 @@ $lang->project->closedDate = 'ClosedDate';
$lang->project->canceledBy = 'CanceledBy';
$lang->project->canceledDate = 'CanceledDate';
$lang->project->team = 'Team';
+$lang->project->teamAction = 'Team List';
$lang->project->order = 'Rank';
$lang->project->budget = 'Budget';
$lang->project->budgetUnit = 'Budget Unit';
@@ -231,18 +233,19 @@ $lang->project->programTitle['0'] = 'Hidden';
$lang->project->programTitle['base'] = 'Base-level project only';
$lang->project->programTitle['end'] = 'End-level project only';
-$lang->project->accessDenied = 'Access denied to this project';
-$lang->project->chooseProgramType = 'Select management type';
-$lang->project->scrumTitle = 'Agile Development Management';
-$lang->project->cannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.';
-$lang->project->hasChildren = 'This project has a child project, so it cannot be deleted.';
-$lang->project->confirmDelete = 'Do you want to delete this project?';
-$lang->project->cannotChangeToCat = "The project has contents, so you cannot it to a parent project.";
-$lang->project->cannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark.";
-$lang->project->parentBeginEnd = "The begin and end date of the parent project: %s ~ %s";
-$lang->project->parentBudget = "The budget of the parent project: ";
-$lang->project->beginLetterParent = "The begin date of the parent project: %s. It cannot be < the begin date of its parent project.";
-$lang->project->endGreaterParent = "The end date of the parent project: %s. It cannot be > the end date of its parent project.";
-$lang->project->beginGreateChild = "The minimum start date of the project set: %s. The start date of the project cannot be less than the minimum start date of the project set.";
-$lang->project->endLetterChild = "The maximum finish date for the project set: %s. The completion date of a project cannot be greater than the maximum completion date of the project set.";
-$lang->project->childLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project.";
+$lang->project->accessDenied = 'Access denied to this project';
+$lang->project->chooseProgramType = 'Select management type';
+$lang->project->scrumTitle = 'Agile Development Management';
+$lang->project->cannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.';
+$lang->project->hasChildren = 'This project has a child project, so it cannot be deleted.';
+$lang->project->confirmDelete = 'Do you want to delete this project?';
+$lang->project->cannotChangeToCat = "The project has contents, so you cannot it to a parent project.";
+$lang->project->cannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark.";
+$lang->project->parentBeginEnd = "The begin and end date of the parent project: %s ~ %s";
+$lang->project->parentBudget = "The budget of the parent project: ";
+$lang->project->beginLetterParent = "The begin date of the parent project: %s. It cannot be < the begin date of its parent project.";
+$lang->project->endGreaterParent = "The end date of the parent project: %s. It cannot be > the end date of its parent project.";
+$lang->project->beginGreateChild = "The minimum start date of the project set: %s. The start date of the project cannot be less than the minimum start date of the project set.";
+$lang->project->endLetterChild = "The maximum finish date for the project set: %s. The completion date of a project cannot be greater than the maximum completion date of the project set.";
+$lang->project->childLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project.";
+$lang->project->confirmUnlinkMember = "Do you want to remove this user from project?";
diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php
index bdfac9cf45..676b5d8209 100644
--- a/module/project/lang/zh-cn.php
+++ b/module/project/lang/zh-cn.php
@@ -22,7 +22,7 @@ $lang->project->editGroup = '项目编辑分组';
$lang->project->copyGroup = '项目复制分组';
$lang->project->manageView = '项目维护视野';
$lang->project->managePriv = '项目维护权限';
-$lang->project->manageMembers = '项目团队';
+$lang->project->manageMembers = '团队管理';
$lang->project->export = '导出';
$lang->project->addProduct = '新建产品';
$lang->project->manageGroupMember = '维护分组用户';
@@ -52,6 +52,7 @@ $lang->project->unlinkedProducts = '未关联';
$lang->project->testreport = '测试报告';
$lang->project->selectProgram = '项目集筛选';
$lang->project->teamMember = '团队成员';
+$lang->project->unlinkMember = '移除成员';
/* Fields. */
$lang->project->common = '项目';
@@ -77,6 +78,7 @@ $lang->project->closedDate = '关闭日期';
$lang->project->canceledBy = '由谁取消';
$lang->project->canceledDate = '取消日期';
$lang->project->team = '团队';
+$lang->project->teamAction = '团队列表';
$lang->project->order = '排序';
$lang->project->budget = '预算';
$lang->project->budgetUnit = '预算单位';
@@ -231,18 +233,19 @@ $lang->project->programTitle['0'] = '不显示';
$lang->project->programTitle['base'] = '只显示一级项目集';
$lang->project->programTitle['end'] = '只显示最后一级项目集';
-$lang->project->accessDenied = '您无权访问该项目!';
-$lang->project->chooseProgramType = '选择项目管理方式';
-$lang->project->scrumTitle = '敏捷开发全流程项目管理';
-$lang->project->cannotCreateChild = '该项目已经有实际的内容,无法直接添加子项目。您可以为当前项目创建一个父项目,然后在新的父项目下面添加子项目。';
-$lang->project->hasChildren = '该项目有子项目存在,不能删除。';
-$lang->project->confirmDelete = "您确定删除项目[%s]吗?";
-$lang->project->cannotChangeToCat = "该项目已经有实际的内容,无法修改为父项目";
-$lang->project->cannotCancelCat = "该项目下已经有子项目,无法取消父项目标记";
-$lang->project->parentBeginEnd = "父项目起止时间:%s ~ %s";
-$lang->project->parentBudget = "父项目预算:";
-$lang->project->beginLetterParent = "父项目的开始日期:%s,开始日期不能小于父项目的开始日期";
-$lang->project->endGreaterParent = "父项目的完成日期:%s,完成日期不能大于父项目的完成日期";
-$lang->project->beginGreateChild = "项目集的最小开始日期:%s,项目的开始日期不能小于项目集的最小开始日期";
-$lang->project->endLetterChild = "项目集的最大完成日期:%s,项目的完成日期不能大于项目集的最大完成日期";
-$lang->project->childLongTime = "子项目中有长期项目,父项目也应该是长期项目";
+$lang->project->accessDenied = '您无权访问该项目!';
+$lang->project->chooseProgramType = '选择项目管理方式';
+$lang->project->scrumTitle = '敏捷开发全流程项目管理';
+$lang->project->cannotCreateChild = '该项目已经有实际的内容,无法直接添加子项目。您可以为当前项目创建一个父项目,然后在新的父项目下面添加子项目。';
+$lang->project->hasChildren = '该项目有子项目存在,不能删除。';
+$lang->project->confirmDelete = "您确定删除项目[%s]吗?";
+$lang->project->cannotChangeToCat = "该项目已经有实际的内容,无法修改为父项目";
+$lang->project->cannotCancelCat = "该项目下已经有子项目,无法取消父项目标记";
+$lang->project->parentBeginEnd = "父项目起止时间:%s ~ %s";
+$lang->project->parentBudget = "父项目预算:";
+$lang->project->beginLetterParent = "父项目的开始日期:%s,开始日期不能小于父项目的开始日期";
+$lang->project->endGreaterParent = "父项目的完成日期:%s,完成日期不能大于父项目的完成日期";
+$lang->project->beginGreateChild = "项目集的最小开始日期:%s,项目的开始日期不能小于项目集的最小开始日期";
+$lang->project->endLetterChild = "项目集的最大完成日期:%s,项目的完成日期不能大于项目集的最大完成日期";
+$lang->project->childLongTime = "子项目中有长期项目,父项目也应该是长期项目";
+$lang->project->confirmUnlinkMember = "您确定从该项目中移除该用户吗?";
diff --git a/module/project/lang/zh-tw.php b/module/project/lang/zh-tw.php
index da9da51a0a..bbe8b095ba 100644
--- a/module/project/lang/zh-tw.php
+++ b/module/project/lang/zh-tw.php
@@ -22,7 +22,7 @@ $lang->project->editGroup = '項目編輯分組';
$lang->project->copyGroup = '項目複製分組';
$lang->project->manageView = '項目維護視野';
$lang->project->managePriv = '項目維護權限';
-$lang->project->manageMembers = '項目團隊';
+$lang->project->manageMembers = '團隊管理';
$lang->project->export = '導出';
$lang->project->addProduct = '新建產品';
$lang->project->manageGroupMember = '維護分組用戶';
@@ -52,6 +52,7 @@ $lang->project->unlinkedProducts = '未關聯';
$lang->project->testreport = '測試報告';
$lang->project->selectProgram = '項目集篩選';
$lang->project->teamMember = '團隊成員';
+$lang->project->unlinkMember = '移除成員';
/* Fields. */
$lang->project->common = '項目';
@@ -77,6 +78,7 @@ $lang->project->closedDate = '關閉日期';
$lang->project->canceledBy = '由誰取消';
$lang->project->canceledDate = '取消日期';
$lang->project->team = '團隊';
+$lang->project->teamAction = '團隊清單';
$lang->project->order = '排序';
$lang->project->budget = '預算';
$lang->project->budgetUnit = '預算單位';
@@ -231,18 +233,19 @@ $lang->project->programTitle['0'] = '不顯示';
$lang->project->programTitle['base'] = '只顯示一級項目集';
$lang->project->programTitle['end'] = '只顯示最後一級項目集';
-$lang->project->accessDenied = '您無權訪問該項目!';
-$lang->project->chooseProgramType = '選擇項目管理方式';
-$lang->project->scrumTitle = '敏捷開發全流程項目管理';
-$lang->project->cannotCreateChild = '該項目已經有實際的內容,無法直接添加子項目。您可以為當前項目創建一個父項目,然後在新的父項目下面添加子項目。';
-$lang->project->hasChildren = '該項目有子項目存在,不能刪除。';
-$lang->project->confirmDelete = "您確定刪除項目[%s]嗎?";
-$lang->project->cannotChangeToCat = "該項目已經有實際的內容,無法修改為父項目";
-$lang->project->cannotCancelCat = "該項目下已經有子項目,無法取消父項目標記";
-$lang->project->parentBeginEnd = "父項目起止時間:%s ~ %s";
-$lang->project->parentBudget = "父項目預算:";
-$lang->project->beginLetterParent = "父項目的開始日期:%s,開始日期不能小於父項目的開始日期";
-$lang->project->endGreaterParent = "父項目的完成日期:%s,完成日期不能大於父項目的完成日期";
-$lang->project->beginGreateChild = "項目集的最小開始日期:%s,項目的開始日期不能小於項目集的最小開始日期";
-$lang->project->endLetterChild = "項目集的最大完成日期:%s,項目的完成日期不能大於項目集的最大完成日期";
-$lang->project->childLongTime = "子項目中有長期項目,父項目也應該是長期項目";
+$lang->project->accessDenied = '您無權訪問該項目!';
+$lang->project->chooseProgramType = '選擇項目管理方式';
+$lang->project->scrumTitle = '敏捷開發全流程項目管理';
+$lang->project->cannotCreateChild = '該項目已經有實際的內容,無法直接添加子項目。您可以為當前項目創建一個父項目,然後在新的父項目下面添加子項目。';
+$lang->project->hasChildren = '該項目有子項目存在,不能刪除。';
+$lang->project->confirmDelete = "您確定刪除項目[%s]嗎?";
+$lang->project->cannotChangeToCat = "該項目已經有實際的內容,無法修改為父項目";
+$lang->project->cannotCancelCat = "該項目下已經有子項目,無法取消父項目標記";
+$lang->project->parentBeginEnd = "父項目起止時間:%s ~ %s";
+$lang->project->parentBudget = "父項目預算:";
+$lang->project->beginLetterParent = "父項目的開始日期:%s,開始日期不能小於父項目的開始日期";
+$lang->project->endGreaterParent = "父項目的完成日期:%s,完成日期不能大於父項目的完成日期";
+$lang->project->beginGreateChild = "項目集的最小開始日期:%s,項目的開始日期不能小於項目集的最小開始日期";
+$lang->project->endLetterChild = "項目集的最大完成日期:%s,項目的完成日期不能大於項目集的最大完成日期";
+$lang->project->childLongTime = "子項目中有長期項目,父項目也應該是長期項目";
+$lang->project->confirmUnlinkMember = "您確定從該項目中移除該用戶嗎?";
diff --git a/module/project/model.php b/module/project/model.php
index 28ae202f57..5c5d22edc0 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -1256,6 +1256,25 @@ class projectModel extends model
}
}
+ /**
+ * Unlink a member.
+ *
+ * @param int $projectID
+ * @param string $account
+ * @access public
+ * @return void
+ */
+ public function unlinkMember($projectID, $account)
+ {
+ $this->dao->delete()->from(TABLE_TEAM)->where('root')->eq((int)$projectID)->andWhere('type')->eq('project')->andWhere('account')->eq($account)->exec();
+
+ $this->loadModel('user');
+ $this->user->updateUserView($projectID, 'project', array($account));
+
+ $linkedProducts = $this->loadModel('product')->getProductPairsByProject($projectID);
+ if(!empty($linkedProducts)) $this->user->updateUserView(array_keys($linkedProducts), 'product', array($account));
+ }
+
/**
* Manage team members.
*
diff --git a/module/project/view/browsebycard.html.php b/module/project/view/browsebycard.html.php
index 84bdf0bf2e..a80ca96b65 100644
--- a/module/project/view/browsebycard.html.php
+++ b/module/project/view/browsebycard.html.php
@@ -145,13 +145,13 @@
'>
teamMembers as $key => $member):?>
2) continue;?>
-
+
teamCount > 3):?>
-
+
teamMembers)]) ? html::image(zget($usersAvatar, end($project->teamMembers))) : strtoupper($member[0]);?>
diff --git a/module/project/view/team.html.php b/module/project/view/team.html.php
new file mode 100644
index 0000000000..71ddb64495
--- /dev/null
+++ b/module/project/view/team.html.php
@@ -0,0 +1,110 @@
+
+
+project->confirmUnlinkMember)?>
+user->error->noAccess)?>
+
+
+ project->teamMember;?>
+
+
+ createLink('tutorial', 'wizard', "module=project&method=manageMembers¶ms=$wizardParams"), " " . $lang->project->manageMembers, '', "class='btn btn-primary manage-team-btn'");
+ }
+ else
+ {
+ if(!empty($app->user->admin) or empty($app->user->rights['rights']['my']['limited'])) common::printLink('project', 'manageMembers', "projectID=$projectID", " " . $lang->project->manageMembers, '', "class='btn btn-primary manage-team-btn'");
+ }
+ }
+ ?>
+
+
+
+
+
+
+ execution->noMembers;?>
+ user->admin) or empty($app->user->rights['rights']['my']['limited'])) && common::hasPriv('project', 'manageMembers')):?>
+ createLink('project', 'manageMembers', "projectID=$projectID"), " " . $lang->project->manageMembers, '', "class='btn btn-info'");?>
+
+
+
+
+
+
+
+
diff --git a/module/story/js/edit.js b/module/story/js/edit.js
index 73f5542098..f124856088 100644
--- a/module/story/js/edit.js
+++ b/module/story/js/edit.js
@@ -5,4 +5,18 @@ $(function()
{
if(reviewedReviewer.indexOf($(this).find('span').text()) != -1) $(this).css('pointer-events', 'none');
})
+
+ $('#reviewer').change(function()
+ {
+ if($('#reviewer_chosen .search-choice').length === 1)
+ {
+ alert(reviewerNotEmpty);
+ $('#reviewer').val(reviewers);
+ $('#reviewer').trigger('chosen:updated');
+ }
+ else
+ {
+ reviewers = $('#reviewer').val();
+ }
+ })
})
diff --git a/module/story/lang/de.php b/module/story/lang/de.php
index 348c408596..7acc0c162a 100644
--- a/module/story/lang/de.php
+++ b/module/story/lang/de.php
@@ -388,7 +388,8 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = 'Prüfer wählen';
$lang->story->notice = new stdClass();
-$lang->story->notice->closed = 'Die ausgewählten Storys wurden bereits geschlossen!';
+$lang->story->notice->closed = 'Die ausgewählten Storys wurden bereits geschlossen!';
+$lang->story->notice->reviewerNotEmpty = 'This requirement needs to be reviewed, and the reviewedby is required.';
$lang->story->convertToTask = new stdClass();
$lang->story->convertToTask->fieldList = array();
diff --git a/module/story/lang/en.php b/module/story/lang/en.php
index 032cda7943..d18f18bb0d 100644
--- a/module/story/lang/en.php
+++ b/module/story/lang/en.php
@@ -389,7 +389,8 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = 'Choose ReviewedBy';
$lang->story->notice = new stdClass();
-$lang->story->notice->closed = 'Story that you select is closed!';
+$lang->story->notice->closed = 'Story that you select is closed!';
+$lang->story->notice->reviewerNotEmpty = 'This requirement needs to be reviewed, and the reviewedby is required.';
$lang->story->convertToTask = new stdClass();
$lang->story->convertToTask->fieldList = array();
diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php
index 3fd4837161..3cad39afcc 100644
--- a/module/story/lang/fr.php
+++ b/module/story/lang/fr.php
@@ -388,7 +388,8 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = 'Choisir valideur';
$lang->story->notice = new stdClass();
-$lang->story->notice->closed = 'La Story que vous avez sélectionnée est malheureusement fermée !';
+$lang->story->notice->closed = 'La Story que vous avez sélectionnée est malheureusement fermée !';
+$lang->story->notice->reviewerNotEmpty = 'This requirement needs to be reviewed, and the reviewedby is required.';
$lang->story->convertToTask = new stdClass();
$lang->story->convertToTask->fieldList = array();
diff --git a/module/story/lang/vi.php b/module/story/lang/vi.php
index bc789c88cd..204c3aaac8 100644
--- a/module/story/lang/vi.php
+++ b/module/story/lang/vi.php
@@ -388,7 +388,8 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = 'Chọn xét duyệt bởi';
$lang->story->notice = new stdClass();
-$lang->story->notice->closed = 'Câu chuyện mà bạn chọn đã đóng!';
+$lang->story->notice->closed = 'Câu chuyện mà bạn chọn đã đóng!';
+$lang->story->notice->reviewerNotEmpty = 'This requirement needs to be reviewed, and the reviewedby is required.';
$lang->story->convertToTask = new stdClass();
$lang->story->convertToTask->fieldList = array();
diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php
index e4629a5735..e893d74bbe 100644
--- a/module/story/lang/zh-cn.php
+++ b/module/story/lang/zh-cn.php
@@ -389,7 +389,8 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = '选择评审人...';
$lang->story->notice = new stdClass();
-$lang->story->notice->closed = "您选择的{$lang->SRCommon}已经被关闭了!";
+$lang->story->notice->closed = "您选择的{$lang->SRCommon}已经被关闭了!";
+$lang->story->notice->reviewerNotEmpty = '该需求需要评审,评审人员不能为空。';
$lang->story->convertToTask = new stdClass();
$lang->story->convertToTask->fieldList = array();
diff --git a/module/story/lang/zh-tw.php b/module/story/lang/zh-tw.php
index 79d1c08f40..6daa4cb252 100644
--- a/module/story/lang/zh-tw.php
+++ b/module/story/lang/zh-tw.php
@@ -389,7 +389,8 @@ $lang->story->chosen = new stdClass();
$lang->story->chosen->reviewedBy = '選擇評審人...';
$lang->story->notice = new stdClass();
-$lang->story->notice->closed = "您選擇的{$lang->SRCommon}已經被關閉了!";
+$lang->story->notice->closed = "您選擇的{$lang->SRCommon}已經被關閉了!";
+$lang->story->notice->reviewerNotEmpty = '該需求需要評審,評審人員不能為空。';
$lang->story->convertToTask = new stdClass();
$lang->story->convertToTask->fieldList = array();
diff --git a/module/story/model.php b/module/story/model.php
index 28d3eefc8e..9e1f1593ec 100644
--- a/module/story/model.php
+++ b/module/story/model.php
@@ -793,8 +793,9 @@ class storyModel extends model
if(isset($_POST['reviewer']))
{
- $_POST['reviewer'] = array_filter($_POST['reviewer']);
- $oldReviewer = $this->getReviewerPairs($storyID, $oldStory->version);
+ $_POST['reviewer'] = array_filter($_POST['reviewer']);
+ $oldReviewer = $this->getReviewerPairs($storyID, $oldStory->version);
+ $oldStory->reviewers = implode(',', array_keys($oldReviewer));
/* Update story reviewer. */
$this->dao->delete()->from(TABLE_STORYREVIEW)->where('story')->eq($storyID)->andWhere('version')->eq($oldStory->version)->andWhere('reviewer')->notin(implode(',', $_POST['reviewer']))->exec();
@@ -810,8 +811,9 @@ class storyModel extends model
}
/* Update the story status by review rules. */
- $reviewerList = $this->getReviewerPairs($storyID, $oldStory->version);
- $reviewedBy = explode(',', trim($oldStory->reviewedBy, ','));
+ $reviewerList = $this->getReviewerPairs($storyID, $oldStory->version);
+ $story->reviewers = implode(',', array_keys($reviewerList));
+ $reviewedBy = explode(',', trim($oldStory->reviewedBy, ','));
if(!array_diff(array_keys($reviewerList), $reviewedBy))
{
$status = $this->setStatusByReviewRules($reviewerList);
@@ -830,7 +832,7 @@ class storyModel extends model
}
$this->dao->update(TABLE_STORY)
- ->data($story)
+ ->data($story, 'reviewers')
->autoCheck()
->checkIF(isset($story->closedBy), 'closedReason', 'notempty')
->checkIF(isset($story->closedReason) and $story->closedReason == 'done', 'stage', 'notempty')
@@ -4006,7 +4008,6 @@ class storyModel extends model
{
$stories = $this->getProductStories($productID, 0, 0, 'all', 'story', 'id_desc', true, $excludeStories);
}
- if($stories) $pager->recTotal += count($stories);
}
else
{
@@ -4041,6 +4042,7 @@ class storyModel extends model
}
$tracks['noRequirement'] = $stories;
+ $pager->recTotal += 1;
}
return $tracks;
@@ -4151,6 +4153,7 @@ class storyModel extends model
$data = new stdclass();
$data->AType = 'requirement';
$data->BType = 'story';
+ $data->product = $story->product;
$data->relation = 'subdivideinto';
$data->AID = $isStory ? $id : $storyID;
$data->BID = $isStory ? $storyID : $id;
@@ -4162,6 +4165,7 @@ class storyModel extends model
$data->AType = 'story';
$data->BType = 'requirement';
$data->relation = 'subdividedfrom';
+ $data->product = $story->product;
$data->AID = $isStory ? $storyID : $id;
$data->BID = $isStory ? $id : $storyID;
$data->AVersion = $isStory ? $story->version : $requirement->version;
@@ -4482,7 +4486,7 @@ class storyModel extends model
* @param string $result
* @param string $reason
* @access public
- * @return int
+ * @return int|string
*/
public function recordReviewAction($story, $result = '', $reason = '')
{
diff --git a/module/story/view/edit.html.php b/module/story/view/edit.html.php
index 146a962d30..76fcbc4893 100644
--- a/module/story/view/edit.html.php
+++ b/module/story/view/edit.html.php
@@ -17,6 +17,8 @@
app->rawModule);?>
story->module);?>
+
+story->notice->reviewerNotEmpty);?>
|