diff --git a/module/task/js/edit.js b/module/task/js/edit.js
index acfd89af1a..277c580271 100644
--- a/module/task/js/edit.js
+++ b/module/task/js/edit.js
@@ -5,7 +5,14 @@ $(function()
$('#modalTeam').on('change', 'select#team', function()
{
$(this).closest('tr').find('input[id^=teamEstimate]').closest('.input-group').toggleClass('required', $(this).val() != '')
- })
+
+ var $source = $(this).siblings('[name^=source]');
+ if($source.val() == '') return;
+
+ var consumed = 0;
+ if($(this).val() == $source.val()) consumed = $(this).closest('tr').attr('data-consumed');
+ $(this).closest('tr').find('[name^=teamConsumed]').val(consumed);
+ });
$('#modalTeam select:enabled').change()
})
@@ -76,38 +83,6 @@ function setPreview(){}
$(document).ready(function()
{
- /* show team menu. */
- $('[name=multiple]').change(function()
- {
- var checked = $(this).prop('checked');
- if(checked)
- {
- $('#teamTr').removeClass('hidden');
- $('.modeBox').removeClass('hidden');
- $('#mode').removeAttr('disabled').trigger('chosen:updated');
- $('#parent').val('');
- $('#parent').trigger('chosen:updated');
- $('#parent').closest('tr').addClass('hidden');
- $('#estimate').attr('disabled', 'disabled');
- $('#left').attr('disabled', 'disabled');
-
- var mode = $('#mode').val();
- if((mode == 'linear' && currentUser != oldAssignedTo) || !team[currentUser]) $('[name=assignedTo]').attr('disabled', 'disabled').trigger('chosen:updated');
- }
- else
- {
- $('#teamTr').addClass('hidden');
- $('.modeBox').addClass('hidden');
- $('#mode').attr('disabled', 'disabled').trigger('chosen:updated');
- $('#parent').closest('tr').removeClass('hidden');
- $('#estimate').removeAttr('disabled');
- $('#left').removeAttr('disabled');
- $('[name=assignedTo]').removeAttr('disabled').trigger('chosen:updated');
- }
-
- updateAssignedTo();
- });
-
/* Init task team manage dialog */
var $taskTeamEditor = $('#taskTeamEditor').batchActionForm(
{
diff --git a/module/task/model.php b/module/task/model.php
index 4866a10d54..1937652a41 100755
--- a/module/task/model.php
+++ b/module/task/model.php
@@ -816,7 +816,16 @@ class taskModel extends model
}
$oldTask->team = $oldTeam;
- if($this->app->rawMethod == 'edit' and empty($oldTask->team) and isset($oldTask->consumed)) $currentTask->consumed += (float)$oldTask->consumed;
+ if($this->app->rawMethod == 'edit')
+ {
+ if(empty($oldTask->team) and isset($oldTask->consumed)) $currentTask->consumed += (float)$oldTask->consumed;
+
+ $efforts = $this->getTaskEstimate($oldTask->id);
+ foreach($efforts as $effort)
+ {
+ if(!isset($members[$effort->account])) $currentTask->consumed += (float)$effort->consumed;
+ }
+ }
if(!empty($task))
{
@@ -990,9 +999,11 @@ class taskModel extends model
$task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->edit['id'], $this->post->uid);
$teams = array();
- if($this->post->multiple and count(array_filter($this->post->team)) > 1)
+ $changeUsers = array();
+ if(count(array_filter($this->post->team)) > 1)
{
$this->dao->delete()->from(TABLE_TASKTEAM)->where('task')->eq($taskID)->exec();
+ $oldTeams = array_values($oldTask->team);
foreach($this->post->team as $row => $account)
{
if(empty($account)) continue;
@@ -1001,7 +1012,7 @@ class taskModel extends model
$member = new stdClass();
$member->task = $taskID;
$member->order = $row;
- $member->type = (!empty($source) and $source != $account) ? 'replace' : 'new';
+ $member->type = (!empty($source) and $source != $account and !isset($oldTask->members[$account])) ? 'replace' : 'new';
$member->account = $account;
$member->estimate = $this->post->teamEstimate[$row] ? $this->post->teamEstimate[$row] : 0;
$member->consumed = $this->post->teamConsumed[$row] ? $this->post->teamConsumed[$row] : 0;
@@ -1011,9 +1022,20 @@ class taskModel extends model
$memberMethod = ($oldTask->mode == 'multi' and isset($teams[$account])) ? 'update' : 'insert';
$this->manageTaskTeam($member, $memberMethod);
+ /* Set effort left = 0 when linear task members be changed. */
+ if($task->mode == 'linear' and isset($oldTeams[$row]) and $oldTeams[$row]->account != $account) $changeUsers[] = $oldTeams[$row]->account;
+
$teams[$account] = $account;
}
+ /* Set effort left = 0 when multi task members be removed. */
+ if($task->mode == 'multi')
+ {
+ $removedMembers = array_diff($oldTask->members, $teams);
+ $changeUsers = array_merge($changeUsers, $removedMembers);
+ }
+ if($changeUsers) $this->resetEffortLeft($taskID, $changeUsers);
+
if(!empty($teams)) $task = $this->computeHours4Multiple($oldTask, $task, array(), $autoStatus = false);
}
if(empty($teams)) $task->mode = '';
@@ -1810,6 +1832,23 @@ class taskModel extends model
return $changes;
}
+ /**
+ * Set effort left to 0.
+ *
+ * @param int $taskID
+ * @param array $members
+ * @access public
+ * @return void
+ */
+ public function resetEffortLeft($taskID, $members)
+ {
+ $table = $this->config->edition == 'open' ? TABLE_TASKESTIMATE : TABLE_EFFORT;
+ $this->dao->update($table)->set('`left`')->eq(0)->where('account')->in($members)
+ ->beginIF($this->config->edition == 'open')->andWhere('task')->eq($taskID)->fi()
+ ->beginIF($this->config->edition != 'open')->andWhere('objectID')->eq($taskID)->andWhere('objectType')->eq('task')->fi()
+ ->exec();
+ }
+
/**
* Finish a task.
*
diff --git a/module/task/view/edit.html.php b/module/task/view/edit.html.php
index b08085db62..6cc41feb18 100644
--- a/module/task/view/edit.html.php
+++ b/module/task/view/edit.html.php
@@ -20,7 +20,7 @@
consumed);?>
status);?>
user->account);?>
-team);?>
+members);?>
task->confirmChangeExecution);?>
team) < 6 ? 6 - count($task->team) : 1);?>
@@ -66,7 +66,7 @@ foreach(explode(',', $config->task->edit->requiredFields) as $field)
children) and empty($task->parent) and $task->type != 'affair'):?>