예제 #1
0
 /**
  * @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;
 }
예제 #4
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;
 }
예제 #5
0
 /**
  * @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);
 }
예제 #6
0
 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);
 }
예제 #10
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));
                 }
             }
         }
     }
 }