/** * 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; }
public static function createKanbanItemForTask($task) { $id = $task->id; $kanbanItem = KanbanItem::getByTask($id); assert('$kanbanItem === null'); $kanbanItem = TasksUtil::createKanbanItemFromTask($task); assert('$kanbanItem !== null'); return $kanbanItem; }
/** * @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); }
/** * 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)); } } } } }