/** * @param RedBeanModel $model * @param string $groupByAttribute * @param RedBeanModel $relatedModel * @param string $relatedModelClassName * @throws NotSupportedException */ public function __construct(RedBeanModel $model, $groupByAttribute, $relatedModel, $relatedModelClassName) { $this->model = $model; $this->groupByAttribute = $groupByAttribute; $this->groupByDataAndTranslatedLabels = KanbanItem::getTypeDropDownArray(); $this->groupByAttributeVisibleValues = array_keys($this->groupByDataAndTranslatedLabels); $this->relatedModel = $relatedModel; $this->relatedModelClassName = $relatedModelClassName; }
public function testCopy() { Yii::app()->user->userModel = User::getByUsername('super'); $user = Yii::app()->user->userModel; $project = new Project(); $project->name = 'Project 1'; $project->owner = $user; $project->description = 'Description'; $user = UserTestHelper::createBasicUser('Steven'); $account = new Account(); $account->owner = $user; $account->name = DataUtil::purifyHtml("Tom & Jerry's Account"); $this->assertTrue($account->save()); $id = $account->id; unset($account); $account = Account::getById($id); $this->assertEquals("Tom & Jerry's Account", $account->name); $contact = ContactTestHelper::createContactByNameForOwner('Jerry', $user); $opportunity = OpportunityTestHelper::createOpportunityByNameForOwner('Jerry Opp', $user); $this->assertTrue($project->save()); $this->assertEquals(1, count($project->auditEvents)); $id = $project->id; $project->forget(); unset($project); $project = Project::getById($id); ProjectZurmoControllerUtil::resolveProjectManyManyAccountsFromPost($project, array('accountIds' => $account->id)); ProjectZurmoControllerUtil::resolveProjectManyManyContactsFromPost($project, array('contactIds' => $contact->id)); ProjectZurmoControllerUtil::resolveProjectManyManyOpportunitiesFromPost($project, array('opportunityIds' => $opportunity->id)); $this->assertEquals('Project 1', $project->name); $this->assertEquals('Description', $project->description); $this->assertEquals(1, $project->accounts->count()); $this->assertEquals(1, $project->contacts->count()); $this->assertEquals(1, $project->opportunities->count()); $task = TaskTestHelper::createTaskByNameWithProjectAndStatus('MyFirstKanbanTask', Yii::app()->user->userModel, $project, Task::STATUS_IN_PROGRESS); $kanbanItem1 = KanbanItem::getByTask($task->id); $this->assertEquals(KanbanItem::TYPE_IN_PROGRESS, $kanbanItem1->type); $this->assertEquals($task->project->id, $kanbanItem1->kanbanRelatedItem->id); $copyToProject = new Project(); ProjectZurmoCopyModelUtil::copy($project, $copyToProject); ProjectZurmoCopyModelUtil::processAfterCopy($project, $copyToProject); $this->assertTrue($copyToProject->save()); $this->assertEquals($copyToProject->name, $project->name); $this->assertEquals($copyToProject->description, $project->description); $this->assertEquals($copyToProject->status, $project->status); $project = Project::getByName('Project 1'); $this->assertEquals(2, count($project)); $tasks = Task::getAll(); $this->assertEquals(2, count($tasks)); }
/** * 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 processKanbanItemUpdateOnButtonAction */ public function testProcessKanbanItemUpdateWithSourceKanbanTypeAsInProgress() { $tasks = Task::getByName('MyFirstKanbanTask'); $task = $tasks[0]; $tasks = Task::getByName('MySecondKanbanTask'); $task2 = $tasks[0]; $tasks = Task::getByName('MyThirdKanbanTask'); $task3 = $tasks[0]; $kanbanItem2 = KanbanItem::getByTask($task2->id); $task2->setScenario('kanbanViewButtonClick'); //Check for target status waiting for acceptance(should not change sort order) TasksUtil::processKanbanItemUpdateOnButtonAction(Task::STATUS_AWAITING_ACCEPTANCE, $task2->id, $kanbanItem2->type); $kanbanItem = KanbanItem::getByTask($task->id); $kanbanItem2 = KanbanItem::getByTask($task2->id); $kanbanItem3 = KanbanItem::getByTask($task3->id); $this->assertEquals($task->id, $kanbanItem->task->id); $this->assertEquals(3, $kanbanItem->sortOrder); $this->assertEquals($task2->id, $kanbanItem2->task->id); $this->assertEquals(1, $kanbanItem2->sortOrder); $this->assertEquals($task3->id, $kanbanItem3->task->id); $this->assertEquals(2, $kanbanItem3->sortOrder); $task2->setScenario('kanbanViewButtonClick'); //Check for target status rejected(should not change sort order) TasksUtil::processKanbanItemUpdateOnButtonAction(Task::STATUS_REJECTED, $task2->id, $kanbanItem2->type); $kanbanItem = KanbanItem::getByTask($task->id); $kanbanItem2 = KanbanItem::getByTask($task2->id); $kanbanItem3 = KanbanItem::getByTask($task3->id); $this->assertEquals($task->id, $kanbanItem->task->id); $this->assertEquals(3, $kanbanItem->sortOrder); $this->assertEquals($task2->id, $kanbanItem2->task->id); $this->assertEquals(1, $kanbanItem2->sortOrder); $this->assertEquals($task3->id, $kanbanItem3->task->id); $this->assertEquals(2, $kanbanItem3->sortOrder); $task2->setScenario('kanbanViewButtonClick'); //Check for target status in progress(should not change sort order) TasksUtil::processKanbanItemUpdateOnButtonAction(Task::STATUS_IN_PROGRESS, $task2->id, $kanbanItem2->type); $kanbanItem = KanbanItem::getByTask($task->id); $kanbanItem2 = KanbanItem::getByTask($task2->id); $kanbanItem3 = KanbanItem::getByTask($task3->id); $this->assertEquals($task->id, $kanbanItem->task->id); $this->assertEquals(3, $kanbanItem->sortOrder); $this->assertEquals($task2->id, $kanbanItem2->task->id); $this->assertEquals(1, $kanbanItem2->sortOrder); $this->assertEquals($task3->id, $kanbanItem3->task->id); $this->assertEquals(2, $kanbanItem3->sortOrder); $task2->setScenario('kanbanViewButtonClick'); //Check for target status completed(should change sort order) TasksUtil::processKanbanItemUpdateOnButtonAction(Task::STATUS_COMPLETED, $task2->id, $kanbanItem2->type); $kanbanItem = KanbanItem::getByTask($task->id); $kanbanItem2 = KanbanItem::getByTask($task2->id); $kanbanItem3 = KanbanItem::getByTask($task3->id); $this->assertEquals($task->id, $kanbanItem->task->id); $this->assertEquals(2, $kanbanItem->sortOrder); $this->assertEquals($task2->id, $kanbanItem2->task->id); $this->assertEquals(KanbanItem::TYPE_COMPLETED, $kanbanItem2->type); $this->assertEquals(1, $kanbanItem2->sortOrder); $this->assertEquals($task3->id, $kanbanItem3->task->id); $this->assertEquals(1, $kanbanItem3->sortOrder); }
public function testGetMaximumSortOrderByType() { $tasks = Task::getByName('MyTask'); $task = $tasks[0]; $kanbanItem = KanbanItem::getByTask($task->id); $sortOrder = KanbanItem::getMaximumSortOrderByType($kanbanItem->type, $task->activityItems->offsetGet(0)); $this->assertEquals(2, $sortOrder); }
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); }
/** * Get active project information for dashboard * @param array $project * @return string */ public static function getActiveProjectInformationForDashboard(Project $project) { $content = static::resolveProjectLinkWithRedirectURl($project->name, $project->id); $stats = static::groupTasksByKanbanTypeAndGetStats($project); $kanbanTypes = KanbanItem::getTypeDropDownArray(); foreach ($stats as $key => $value) { if ($key != 'completionPercent') { $content .= ZurmoHtml::tag('div', array('class' => 'project-stats'), ZurmoHtml::tag('strong', array(), $value) . ZurmoHtml::tag('span', array(), $kanbanTypes[$key])); } else { $label = '% ' . Zurmo::t('Core', 'Complete'); $color = (int) $value > 0 ? 'percent-yellow' : 'percent-red'; $color = (int) $value == 100 ? 'percent-green' : $color; $content .= ZurmoHtml::tag('div', array('class' => 'project-stats percent-complete ' . $color), ZurmoHtml::tag('strong', array(), $value) . ZurmoHtml::tag('span', array(), $label)); } } return $content; }
/** * Update status for the task when dragging in the kanban view */ public function actionUpdateStatusOnDragInKanbanView($type) { $getData = GetUtil::getData(); $counter = 1; $response = array(); if (count($getData['items']) > 0) { foreach ($getData['items'] as $taskId) { if ($taskId != '') { $kanbanItem = KanbanItem::getByTask(intval($taskId)); $task = Task::getById(intval($taskId)); //if kanban type is completed if ($type == KanbanItem::TYPE_COMPLETED) { //kanban update has to be done first $kanbanItem->sortOrder = TasksUtil::resolveAndGetSortOrderForTaskOnKanbanBoard($type, $task); $kanbanItem->type = intval($type); $kanbanItem->save(); //set the scenario $task->setScenario('kanbanViewDrag'); $this->processStatusUpdateViaAjax($task, Task::STATUS_COMPLETED, false); $response['button'] = ''; $response['status'] = Task::getStatusDisplayName($task->status); $response['owner'] = $task->owner->getFullName(); $subscriptionContent = TasksUtil::resolveAndRenderTaskCardDetailsSubscribersContent($task); $subscriptionContent .= TasksUtil::resolveSubscriptionLink($task, 'subscribe-task-link', 'unsubscribe-task-link'); $response['subscriptionContent'] = $subscriptionContent; } else { //When in the same column if ($type == $kanbanItem->type) { $kanbanItem->sortOrder = $counter; $kanbanItem->save(); } else { //This would be the one which is dragged across column $targetStatus = TasksUtil::getDefaultTaskStatusForKanbanItemType(intval($type)); $this->processStatusUpdateViaAjax($task, $targetStatus, false); $content = TasksUtil::resolveActionButtonForTaskByStatus($targetStatus, $this->getId(), $this->getModule()->getId(), intval($taskId)); $kanbanItem->sortOrder = $counter; $kanbanItem->type = intval($type); $kanbanItem->save(); $subscriptionContent = TasksUtil::resolveAndRenderTaskCardDetailsSubscribersContent($task); $subscriptionContent .= TasksUtil::resolveSubscriptionLink($task, 'subscribe-task-link', 'unsubscribe-task-link'); $response['button'] = $content; $response['status'] = Task::getStatusDisplayName($task->status); $response['owner'] = $task->owner->getFullName(); $response['subscriptionContent'] = $subscriptionContent; } } $counter++; } } } echo CJSON::encode($response); }
/** * 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)); } } } } }