diff --git a/api/v1/entries/executions.php b/api/v1/entries/executions.php index aca894ee3f..918c9b6cc2 100644 --- a/api/v1/entries/executions.php +++ b/api/v1/entries/executions.php @@ -57,7 +57,7 @@ class executionsEntry extends entry $executionsMap = array(); foreach($data->data->executionStats as $execution) { - $execution = $this->filterFields($execution, 'id,name,project,code,type,parent,begin,end,status,openedBy,openedDate,delay,progress,children,' . $appendFields); + $execution = $this->filterFields($execution, 'id,name,project,code,type,parent,begin,end,status,openedBy,openedDate,delay,progress,children,isParent,' . $appendFields); $execution = $this->format($execution, 'openedBy:user,openedDate:time,lastEditedBy:user,lastEditedDate:time,closedBy:user,closedDate:time,canceledBy:user,canceledDate:time,PM:user,PO:user,RD:user,QD:user,whitelist:userList,begin:date,end:date,realBegan:date,realEnd:date,deleted:bool'); if($mergeChildren) diff --git a/api/v1/entries/tasks.php b/api/v1/entries/tasks.php index cc156cd87c..a71f50ec11 100644 --- a/api/v1/entries/tasks.php +++ b/api/v1/entries/tasks.php @@ -79,12 +79,52 @@ class tasksEntry extends entry { $tasks = $data->data->tasks; $pager = $data->data->pager; + $mergeChildren = $this->param('mergeChildren', 0); + $result = array(); - foreach($tasks as $task) + $tasksMap = array(); + + if($mergeChildren) { - if(isset($task->children)) $task->children = array_values((array)$task->children); - $result[] = $this->format($task, 'deadline:date,openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,realStarted:time,finishedBy:user,finishedDate:time,closedBy:user,closedDate:time,canceledBy:user,canceledDate:time,lastEditedBy:user,lastEditedDate:time,deleted:bool,mailto:userList'); + /* Build tasks map. */ + foreach($tasks as $task) + { + $tasksMap[$task->id] = $task; + } + + /* Merge children tasks into parent tasks. */ + foreach($tasksMap as $task) + { + if(!empty($task->parent) && $task->parent != 0 && $task->parent != '0' && isset($tasksMap[$task->parent])) + { + $parentTask = $tasksMap[$task->parent]; + if(!isset($parentTask->children)) $parentTask->children = array(); + $parentTask->children[] = $task; + } + } + + /* Only return parent tasks (tasks with no parent or parent not in the map). */ + foreach($tasksMap as $task) + { + if(empty($task->parent) || $task->parent == 0 || $task->parent == '0' || !isset($tasksMap[$task->parent])) + { + if(isset($task->children)) $task->children = array_values((array)$task->children); + $result[] = $this->format($task, 'deadline:date,openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,realStarted:time,finishedBy:user,finishedDate:time,closedBy:user,closedDate:time,canceledBy:user,canceledDate:time,lastEditedBy:user,lastEditedDate:time,deleted:bool,mailto:userList'); + } + } + + /* Adjust pager total when mergeChildren is enabled. */ + $pager->recTotal = count($result); } + else + { + foreach($tasks as $task) + { + if(isset($task->children)) $task->children = array_values((array)$task->children); + $result[] = $this->format($task, 'deadline:date,openedBy:user,openedDate:time,assignedTo:user,assignedDate:time,realStarted:time,finishedBy:user,finishedDate:time,closedBy:user,closedDate:time,canceledBy:user,canceledDate:time,lastEditedBy:user,lastEditedDate:time,deleted:bool,mailto:userList'); + } + } + return $this->send(200, array('page' => $pager->pageID, 'total' => $pager->recTotal, 'limit' => $pager->recPerPage, 'tasks' => $result)); }