/**
  * Group tasks by kanban type and get stats
  * @param Project $project
  * @return array
  */
 protected static function groupTasksByKanbanTypeAndGetStats(Project $project)
 {
     $tasks = $project->tasks;
     $kanbanItemsArray = array();
     $totalTasksToDoCount = 0;
     $completedTasksCount = 0;
     foreach ($tasks as $task) {
         if (ControllerSecurityUtil::doesCurrentUserHavePermissionOnSecurableItem($task, Permission::READ)) {
             $totalTasksToDoCount++;
             if ($task->status == Task::STATUS_COMPLETED) {
                 $completedTasksCount++;
             }
             $kanbanItem = KanbanItem::getByTask($task->id);
             if ($kanbanItem == null) {
                 //Create KanbanItem here
                 $kanbanItem = TasksUtil::createKanbanItemFromTask($task);
             }
             $kanbanItemsArray[$kanbanItem->type][] = $kanbanItem->id;
         }
     }
     $stats = array();
     $kanbanTypeDropDownData = KanbanItem::getTypeDropDownArray();
     foreach ($kanbanTypeDropDownData as $type => $label) {
         if (isset($kanbanItemsArray[$type])) {
             $stats[$type] = count($kanbanItemsArray[$type]);
         } else {
             $stats[$type] = 0;
         }
     }
     $stats['completionPercent'] = static::resolveCompletionPercentage($completedTasksCount, $totalTasksToDoCount);
     return $stats;
 }
 /**
  * Heals sortOrder for kanbanItems if they are wrong.  It can be wrong if tasks are created from workflow actions
  * because during that task creation, it doesn't know what project or other activityItem it is part of.
  * This will at least heal the sortOrder for display. Then upon subsequent saves of the board, it will properly
  * set the sortOrder in the database
  * @return array
  */
 protected function resolveDataIntoKanbanColumns()
 {
     $this->makeColumnsDataAndStructure();
     $kanbanItemsArray = array();
     $kanbanItems = array();
     $maximumKanbanItemSortOrder = 0;
     foreach ($this->dataProvider->getData() as $notUsed => $task) {
         $kanbanItem = KanbanItem::getByTask($task->id);
         if ($kanbanItem == null) {
             //Create KanbanItem here
             $kanbanItem = TasksUtil::createKanbanItemFromTask($task);
         }
         $kanbanItems[] = $kanbanItem;
         if ($kanbanItem->sortOrder > $maximumKanbanItemSortOrder) {
             $maximumKanbanItemSortOrder = $kanbanItem->sortOrder;
         }
     }
     foreach ($kanbanItems as $kanbanItem) {
         if (isset($kanbanItemsArray[$kanbanItem->type]) && isset($kanbanItemsArray[$kanbanItem->type][intval($kanbanItem->sortOrder)])) {
             $sortOrder = $maximumKanbanItemSortOrder + 1;
             $maximumKanbanItemSortOrder = $sortOrder;
         } else {
             $sortOrder = intval($kanbanItem->sortOrder);
         }
         $kanbanItemsArray[$kanbanItem->type][$sortOrder] = $kanbanItem->task;
     }
     foreach ($kanbanItemsArray as $type => $kanbanData) {
         ksort($kanbanData, SORT_NUMERIC);
         foreach ($kanbanData as $sort => $item) {
             if (isset($this->columnsData[$type])) {
                 $this->columnsData[$type][] = $item;
             }
         }
     }
     $this->registerKanbanColumnScripts();
     return $this->columnsData;
 }
Ejemplo n.º 3
0
 public static function createKanbanItemForTask($task)
 {
     $id = $task->id;
     $kanbanItem = KanbanItem::getByTask($id);
     assert('$kanbanItem === null');
     $kanbanItem = TasksUtil::createKanbanItemFromTask($task);
     assert('$kanbanItem !== null');
     return $kanbanItem;
 }
Ejemplo n.º 4
0
 /**
  * @covers createKanbanItemFromTask
  */
 public function testCreateKanbanItemFromTask()
 {
     $task = TaskTestHelper::createTaskByNameForOwner('My Kanban Task', Yii::app()->user->userModel);
     $task->status = Task::STATUS_IN_PROGRESS;
     $accounts = Account::getByName('anAccount');
     $task->activityItems->add($accounts[0]);
     $this->assertTrue($task->save());
     $kanbanItem = TasksUtil::createKanbanItemFromTask($task);
     $this->assertEquals($kanbanItem->type, KanbanItem::TYPE_IN_PROGRESS);
 }
 public function testUpdateStatusOnDragInKanbanView()
 {
     $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super');
     $project = ProjectTestHelper::createProjectByNameForOwner('a new project', $super);
     $task = TaskTestHelper::createTaskByNameForOwner('My Kanban Task', Yii::app()->user->userModel);
     $task->project = $project;
     $task->status = Task::STATUS_IN_PROGRESS;
     $taskId = $task->id;
     $this->assertTrue($task->save());
     $task1 = TaskTestHelper::createTaskByNameForOwner('My Kanban Task 1', Yii::app()->user->userModel);
     $task1->project = $project;
     $task1->status = Task::STATUS_NEW;
     $this->assertTrue($task1->save());
     $task1Id = $task1->id;
     $taskArray = array($task, $task1);
     foreach ($taskArray as $row => $data) {
         $kanbanItem = KanbanItem::getByTask($data->id);
         if ($kanbanItem == null) {
             //Create KanbanItem here
             $kanbanItem = TasksUtil::createKanbanItemFromTask($data);
         }
         $kanbanItemsArray[] = $kanbanItem;
     }
     $this->assertEquals(KanbanItem::TYPE_SOMEDAY, $kanbanItemsArray[1]->type);
     $this->assertEquals(1, $kanbanItemsArray[1]->sortOrder);
     $this->assertEquals(1, $kanbanItemsArray[0]->sortOrder);
     $this->setGetArray(array('items' => array($task1->id, $task->id), 'type' => KanbanItem::TYPE_IN_PROGRESS));
     $content = $this->runControllerWithNoExceptionsAndGetContent('tasks/default/updateStatusOnDragInKanbanView', false);
     $contentArray = CJSON::decode($content);
     $this->assertContains('Finish', $contentArray['button']);
     $task1 = Task::getById($task1Id);
     $this->assertEquals(Task::STATUS_IN_PROGRESS, $task1->status);
     $kanbanItem = KanbanItem::getByTask($task1Id);
     $this->assertEquals(KanbanItem::TYPE_IN_PROGRESS, $kanbanItem->type);
     $kanbanItem = KanbanItem::getByTask($taskId);
     $this->assertEquals(2, $kanbanItem->sortOrder);
 }
Ejemplo n.º 6
0
 /**
  * Check kanban type for status and update if it is required, it is required
  * when user is changing the status from modal detail view
  * @param $task Task
  */
 public static function checkKanbanTypeByStatusAndUpdateIfRequired(Task $task)
 {
     $kanbanItem = KanbanItem::getByTask($task->id);
     //It should be created here but check for create as well here
     if ($kanbanItem == null) {
         TasksUtil::createKanbanItemFromTask($task);
     } else {
         if (!TasksUtil::isKanbanItemTypeValidBasedOnTaskStatus($kanbanItem->type, $task->status)) {
             $kanbanTypeByStatus = TasksUtil::resolveKanbanItemTypeForTaskStatus($task->status);
             if ($kanbanItem->type != $kanbanTypeByStatus) {
                 $sourceKanbanItemType = $kanbanItem->type;
                 //put the item at the end
                 $kanbanItem->sortOrder = TasksUtil::resolveAndGetSortOrderForTaskOnKanbanBoard($kanbanTypeByStatus, $task);
                 $kanbanItem->type = $kanbanTypeByStatus;
                 $kanbanItem->save();
                 //Resort the source column
                 if ($task->project->id > 0) {
                     TasksUtil::sortKanbanColumnItems($sourceKanbanItemType, $task->project);
                 } elseif ($task->activityItems->count() > 0) {
                     TasksUtil::sortKanbanColumnItems($sourceKanbanItemType, $task->activityItems->offsetGet(0));
                 }
             }
         }
     }
 }