/**
  * 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;
 }
 protected function getAjaxLinkOptions()
 {
     $containerId = TasksUtil::getModalContainerId();
     $title = TasksUtil::getModalTitleForCreateTask('Copy');
     // Begin Not Coding Standard
     $options = array('type' => 'GET', 'update' => '#' . $containerId, 'complete' => "function(XMLHttpRequest, textStatus){\n                        \$('#" . $containerId . "').dialog('option', 'title', '" . $title . "');}");
     // End Not Coding Standard
     return $options;
 }
コード例 #3
0
 protected function getParamsForEmailSubject()
 {
     assert('$this->model instanceof Task');
     $relatedModelStringValue = TasksUtil::resolveFirstRelatedModelStringValue($this->model);
     if ($relatedModelStringValue != null) {
         $relatedModelStringValue = '(' . $relatedModelStringValue . ')';
     }
     $params = array('{task}' => strval($this->model), '{relatedModel}' => $relatedModelStringValue);
     return $params;
 }
コード例 #4
0
 /**
  * Register delete action event handler
  */
 protected function registerDeleteActionScript($htmlOptions)
 {
     $url = Yii::app()->createUrl('/tasks/default/delete', array('id' => $this->modelId));
     $modalContainerId = TasksUtil::getModalContainerId();
     $sourceViewId = $this->getSourceViewId();
     $confirmation = "if(!confirm(" . CJavaScript::encode($htmlOptions['confirm']) . ")) return false;";
     // Begin Not Coding Standard
     Yii::app()->clientScript->registerScript('deleteTaskAction', "\n                                                      \$('#" . $htmlOptions['id'] . "').click(function(){\n                                                          {$confirmation}\n                                                          \$.ajax(\n                                                                    {\n                                                                        url : '{$url}',\n                                                                        type : 'GET',\n                                                                        success : function(data)\n                                                                        {\n                                                                            \$('#{$modalContainerId}').dialog('close');\n                                                                            \$.fn.yiiGridView.update('" . $sourceViewId . "');\n                                                                        },\n                                                                        error : function()\n                                                                        {\n                                                                        }\n                                                                    }\n                                                                 );\n                                                             return false;\n                                                          });\n                                                      ", CClientScript::POS_END);
     // End Not Coding Standard
 }
コード例 #5
0
 public function actionDetails($id)
 {
     $contact = static::getModelAndCatchNotFoundAndDisplayError('Contact', intval($id));
     ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($contact);
     AuditEvent::logAuditEvent('ZurmoModule', ZurmoModule::AUDIT_EVENT_ITEM_VIEWED, array(strval($contact), 'ContactsModule'), $contact);
     if (KanbanUtil::isKanbanRequest() === false) {
         $breadCrumbView = StickySearchUtil::resolveBreadCrumbViewForDetailsControllerAction($this, 'ContactsSearchView', $contact);
         $detailsAndRelationsView = $this->makeDetailsAndRelationsView($contact, 'ContactsModule', 'ContactDetailsAndRelationsView', Yii::app()->request->getRequestUri(), $breadCrumbView);
         $view = new ContactsPageView(ZurmoDefaultViewUtil::makeStandardViewForCurrentUser($this, $detailsAndRelationsView));
     } else {
         $view = TasksUtil::resolveTaskKanbanViewForRelation($contact, $this->getModule()->getId(), $this, 'TasksForContactKanbanView', 'ContactsPageView');
     }
     echo $view->render();
 }
 public static function getActivityItemsModels($data, $isLink = false)
 {
     $text = '';
     foreach ($data->activityItems as $activityItem) {
         $model = TasksUtil::castDownActivityItem($activityItem);
         $modelClassName = get_class($model);
         if ($isLink) {
             $moduleClassName = $modelClassName::getModuleClassName();
             $moduleId = $moduleClassName::getDirectoryName();
             if (null != ($stateAdapterClassName = $moduleClassName::getStateMetadataAdapterClassName())) {
                 $moduleClassName = $stateAdapterClassName::getModuleClassNameByModel($model);
                 $moduleId = $moduleClassName::getDirectoryName();
             }
             $linkRoute = '/' . $moduleId . '/default/details/';
             $text .= static::getLinkStringForActivityItem($model, $linkRoute, $moduleClassName);
         } else {
             $text .= static::getNameForActivityItem(strval($model), $modelClassName);
         }
     }
     return trim($text, ';');
 }
コード例 #7
0
 /**
  * Details view for project
  * @param int $id
  */
 public function actionDetails($id)
 {
     $project = static::getModelAndCatchNotFoundAndDisplayError('Project', intval($id));
     ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($project);
     AuditEvent::logAuditEvent('ZurmoModule', ZurmoModule::AUDIT_EVENT_ITEM_VIEWED, array(strval($project), 'ProjectsModule'), $project);
     $view = TasksUtil::resolveTaskKanbanViewForRelation($project, $this->getModule()->getId(), $this, 'TasksForProjectKanbanView', 'ProjectsPageView');
     echo $view->render();
 }
コード例 #8
0
 /**
  * @return string
  */
 protected function getDefaultRoute()
 {
     return Yii::app()->createUrl('tasks/default/modalCreate', array('modalId' => TasksUtil::getModalContainerId()));
 }
コード例 #9
0
 /**
  * Register the additional script for task detail modal
  */
 protected function renderScripts()
 {
     parent::renderScripts();
     TasksUtil::registerTaskModalDetailsScript($this->getGridViewId());
 }
コード例 #10
0
ファイル: Task.php プロジェクト: stoysnet/zurmo
 protected function afterSave()
 {
     if ($this->getScenario() != 'importModel') {
         $this->processNotificationsToBeSent();
     }
     if ($this->getScenario() != 'kanbanViewButtonClick' && $this->getScenario() != 'kanbanViewDrag') {
         TasksUtil::checkKanbanTypeByStatusAndUpdateIfRequired($this);
     }
     parent::afterSave();
 }
コード例 #11
0
 /**
  * Register kanban grid script
  */
 protected function registerKanbanGridScript()
 {
     Yii::app()->clientScript->registerScriptFile(Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.core.kanbanBoard.widgets.assets')) . '/KanbanUtils.js');
     TasksUtil::registerTaskModalDetailsScript($this->getGridId());
     if ($this->dataProvider->getTotalItemCount() == 0) {
         $script = "\$('#" . $this->getGridId() . "').hide();";
         $script .= "\$('#ZeroTasksForRelatedModelYetView').show();";
     } else {
         $script = "\$('#" . $this->getGridId() . "').show();";
         $script .= "\$('#ZeroTasksForRelatedModelYetView').hide();";
     }
     Yii::app()->clientScript->registerScript('taskKanbanDetailScript', $script);
 }
コード例 #12
0
 /**
  * Register the additional script for task detail modal
  */
 protected function renderScripts()
 {
     parent::renderScripts();
     Yii::app()->custom->registerTaskModalDetailsScript($this->getGridViewId());
     TasksUtil::registerTaskModalEditScript($this->getGridViewId(), $this->getCreateLinkRouteParameters());
     TasksUtil::registerTaskModalCopyScript($this->getGridViewId(), $this->getCreateLinkRouteParameters());
     TasksUtil::registerTaskModalDeleteScript($this->getGridViewId());
 }
コード例 #13
0
 /**
  * Renders content.
  * @return string
  */
 protected function renderContent()
 {
     $content = parent::renderContent();
     TasksUtil::resolveShouldOpenToTaskForDetailsAndRelationsView();
     return $content;
 }
コード例 #14
0
 /**
  * Renders content
  * @return string
  */
 protected function renderContent()
 {
     $content = parent::renderContent();
     TasksUtil::resolveShouldOpenToTask($this->getGridViewId());
     return $content;
 }
コード例 #15
0
 /**
  * Resolves the link string for task detail modal view
  * @param array $data
  * @param int $row
  * @return string
  */
 protected function resolveTaskLink($data, $row)
 {
     $content = TasksUtil::getModalDetailsLink($data, $this->controllerId, $this->moduleId, $this->getActionModuleClassName());
     return $content;
 }
コード例 #16
0
 /**
  * @param Task $task
  * @param $row
  * @return string
  */
 protected function renderTaskCardDetailsContent(Task $task, $row)
 {
     $statusClass = 'status-' . $task->status;
     $content = $this->renderCardDataContent($this->cardColumns['completionBar'], $task, $row);
     $content .= ZurmoHtml::openTag('div', array('class' => 'task-details clearfix ' . $statusClass));
     $content .= ZurmoHtml::tag('span', array('class' => 'task-status'), Task::getStatusDisplayName($task->status));
     $content .= $this->resolveAndRenderTaskCardDetailsDueDateContent($task);
     $content .= ZurmoHtml::closeTag('div');
     $content .= ZurmoHtml::openTag('div', array('class' => 'task-content clearfix'));
     $content .= $this->resolveAndRenderTaskCardDetailsStatusContent($task, $row);
     $content .= Yii::app()->custom->renderExtraAttributesWithNameInKanbanCard($this->cardColumns, $task, $row);
     $content .= ZurmoHtml::openTag('h4');
     $content .= $this->renderCardDataContent($this->cardColumns['name'], $task, $row);
     $content .= ZurmoHtml::closeTag('h4');
     if ($task->description != null) {
         $description = $task->description;
         if (strlen($description) > TaskKanbanBoard::TASK_DESCRIPTION_LENGTH) {
             $description = substr($description, 0, TaskKanbanBoard::TASK_DESCRIPTION_LENGTH) . '...';
         }
         $content .= ZurmoHtml::tag('p', array(), $description);
     }
     $content .= ZurmoHtml::closeTag('div');
     $content .= ZurmoHtml::openTag('div', array('class' => 'task-subscribers'));
     $content .= TasksUtil::resolveAndRenderTaskCardDetailsSubscribersContent($task);
     $content .= $this->renderCardDataContent($this->cardColumns['subscribe'], $task, $row);
     $content .= ZurmoHtml::closeTag('div');
     return $content;
 }
 protected function getViewLinkUrlParams()
 {
     return array_merge(array('id' => $this->modelId, 'modalId' => TasksUtil::getModalContainerId(), 'portletId' => $this->getPortletId(), 'uniqueLayoutId' => $this->getUniqueLayoutId()), $this->getRouteParameters());
 }
コード例 #18
0
 /**
  * Gets notification subscribers
  * @param Task $task
  * @param $action
  * @param User $relatedUser
  * @return array
  */
 public static function resolvePeopleToSendNotification(Task $task, $action, User $relatedUser = null)
 {
     assert('is_string($action)');
     $peopleToSendNotification = array();
     if ($action == self::TASK_NEW) {
         $peopleToSendNotification[] = $task->owner;
     } elseif ($action == self::TASK_STATUS_BECOMES_REJECTED && Yii::app()->user->userModel->id != $task->owner->id) {
         $peopleToSendNotification[] = $task->owner;
     } elseif ($action == self::TASK_STATUS_BECOMES_COMPLETED && Yii::app()->user->userModel->id != $task->owner->id) {
         $peopleToSendNotification[] = $task->owner;
     } elseif ($action == self::TASK_STATUS_BECOMES_AWAITING_ACCEPTANCE || $action == self::TASK_OWNER_CHANGE) {
         $peopleToSendNotification[] = $task->requestedByUser;
     } elseif ($action == self::TASK_NEW_COMMENT) {
         $peopleToSendNotification = TasksUtil::getTaskSubscribers($task);
         if ($relatedUser != null) {
             foreach ($peopleToSendNotification as $key => $person) {
                 if ($person->getClassId('Item') == $relatedUser->getClassId('Item')) {
                     unset($peopleToSendNotification[$key]);
                 }
             }
         }
     }
     return $peopleToSendNotification;
 }
コード例 #19
0
 /**
  * Register script for special task detail link. This is from a redirect of something like
  * tasks/default/details and it should open up the task immediately.
  * @param int $taskId
  * @param string $sourceId
  */
 public function registerOpenToTaskModalDetailsScript($taskId, $sourceId)
 {
     TasksUtil::registerOpenToTaskModalDetailsScript($taskId, $sourceId);
 }
コード例 #20
0
 /**
  * Process status update via ajax
  * @param int $id
  * @param int $status
  * @param bool $showCompletionDate whether to show completion date
  */
 protected function processStatusUpdateViaAjax(Task $task, $status, $showCompletionDate = true)
 {
     $currentStatus = $task->status;
     $task->status = intval($status);
     //check for owner in case a user start the task
     if ($currentStatus == Task::STATUS_NEW && $currentStatus != $task->status) {
         $task->owner = Yii::app()->user->userModel;
     }
     if (intval($status) == Task::STATUS_COMPLETED) {
         foreach ($task->checkListItems as $checkItem) {
             $checkItem->completed = true;
             $checkItem->unrestrictedSave();
         }
         $task->status = Task::STATUS_COMPLETED;
         $task->completedDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time());
         $task->completed = true;
         $task->save();
         if ($showCompletionDate) {
             echo TasksUtil::renderCompletionDateTime($task);
         }
     } else {
         $task->completedDateTime = null;
         $task->completed = false;
         $task->save();
     }
     if ($task->project->id > 0) {
         ProjectsUtil::logTaskStatusChangeEvent($task, Task::getStatusDisplayName(intval($currentStatus)), Task::getStatusDisplayName(intval($status)));
     }
 }
コード例 #21
0
 protected function renderConfigurationForm()
 {
     $formName = 'latest-activity-configuration-form';
     $clipWidget = new ClipWidget();
     list($form, $formStart) = $clipWidget->renderBeginWidget('ZurmoActiveForm', array('id' => $formName));
     $content = $formStart;
     $content .= $this->renderConfigurationFormLayout($form);
     $formEnd = $clipWidget->renderEndWidget();
     $content .= $formEnd;
     $this->registerConfigurationFormLayoutScripts($form);
     TasksUtil::registerTaskModalDetailsScript($this->getGridViewId());
     return $content;
 }
コード例 #22
0
 /**
  * Get shared calendar subscriber data.
  * @param SavedCalendar $subscribedCalendar
  * @return string
  */
 public static function getCalendarSubscriberData(SavedCalendar $subscribedCalendar)
 {
     $users = CalendarUtil::getUsersSubscribedForCalendar($subscribedCalendar);
     $content = null;
     $alreadySubscribedUsers = array();
     foreach ($users as $user) {
         //Take care of duplicates if any
         if (!in_array($user->id, $alreadySubscribedUsers)) {
             $content .= TasksUtil::renderSubscriberImageAndLinkContent($user, 25);
             $alreadySubscribedUsers[] = $user->id;
         }
     }
     return $content;
 }
コード例 #23
0
 /**
  * Gets email subject for the notification
  * @param Task $task
  * @param $action
  * @return string
  */
 public static function getTaskEmailSubject(Task $task, $action)
 {
     assert('$task instanceof Task');
     $relatedModelStringValue = TasksUtil::resolveFirstRelatedModelStringValue($task);
     if ($relatedModelStringValue != null) {
         $relatedModelStringValue = '(' . $relatedModelStringValue . ')';
     }
     $params = array('{task}' => strval($task), '{relatedModel}' => $relatedModelStringValue);
     if ($action == self::TASK_NEW) {
         return Zurmo::t('TasksModule', 'ASSIGNMENT {relatedModel}: {task}', $params);
     } elseif ($action == self::TASK_STATUS_BECOMES_AWAITING_ACCEPTANCE) {
         return Zurmo::t('TasksModule', 'DELIVERED {relatedModel}: {task}', $params);
     } elseif ($action == self::TASK_STATUS_BECOMES_COMPLETED) {
         return Zurmo::t('TasksModule', 'ACCEPTED {relatedModel}: {task}', $params);
     } elseif ($action == self::TASK_STATUS_BECOMES_REJECTED) {
         return Zurmo::t('TasksModule', 'REJECTED {relatedModel}: {task}', $params);
     } elseif ($action == self::TASK_OWNER_CHANGE) {
         return Zurmo::t('TasksModule', 'ASSIGNMENT {relatedModel}: {task}', $params);
     } elseif ($action == self::TASK_NEW_COMMENT) {
         return Zurmo::t('TasksModule', 'NEW COMMENT {relatedModel}: {task}', $params);
     }
 }
コード例 #24
0
 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);
 }
コード例 #25
0
 protected function renderConfigSaveAjax($formId, $url, $sourceKanbanBoardId, $modalId, $sourceId)
 {
     // Begin Not Coding Standard
     if ($sourceId == null) {
         $kanbanRefreshScript = TasksUtil::resolveExtraCloseScriptForModalAjaxOptions($sourceKanbanBoardId);
     } else {
         $kanbanRefreshScript = TasksUtil::resolveExtraCloseScriptForModalAjaxOptions($sourceId);
     }
     $title = TasksUtil::getModalDetailsTitle();
     // Begin Not Coding Standard
     $options = array('type' => 'POST', 'data' => 'js:$("#' . $formId . '").serialize()', 'url' => $url, 'update' => '#' . $modalId, 'complete' => "function(XMLHttpRequest, textStatus){\n                                    \$('#" . $modalId . "').dialog('option', 'title', '" . $title . "');\n                                    " . $kanbanRefreshScript . "}");
     // End Not Coding Standard
     return ZurmoHtml::ajax($options);
 }
コード例 #26
0
 /**
  * Renders owner box
  * @param string $form
  * @return string
  */
 protected function renderStatusContent($form)
 {
     $content = '<div id="status-box">';
     $element = new TaskStatusDropDownElement($this->getModel(), 'status', $form);
     $content .= $element->render();
     $content .= '<span id="completionDate">';
     if ($this->model->status == Task::STATUS_COMPLETED) {
         $content .= TasksUtil::renderCompletionDateTime($this->model);
     }
     $content .= '</span>';
     $content .= '</div>';
     return $content;
 }
コード例 #27
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;
 }
コード例 #28
0
 /**
  * @covers resolveAndRenderTaskCardDetailsSubscribersContent
  */
 public function testResolveAndRenderTaskCardDetailsSubscribersContent()
 {
     $hellodear = UserTestHelper::createBasicUser('hellodear');
     $task = new Task();
     $task->name = 'MyCardTest';
     $task->owner = $hellodear;
     $this->assertTrue($task->save());
     $task = Task::getById($task->id);
     $user = Yii::app()->user->userModel;
     TasksUtil::addSubscriber($hellodear, $task);
     $this->assertTrue($task->save());
     $content = TasksUtil::resolveAndRenderTaskCardDetailsSubscribersContent($task);
     $this->assertContains('gravatar', $content);
     $this->assertContains('users/default/details', $content);
     $this->assertContains('hellodear', $content);
     $this->assertContains('task-owner', $content);
 }
コード例 #29
0
ファイル: Task.php プロジェクト: maruthisivaprasad/zurmo
 /**
  * Resolve and set default subscribers
  */
 protected function resolveAndSetDefaultSubscribers()
 {
     //Add requested by user as default subscriber
     if ($this->requestedByUser->id > 0) {
         TasksUtil::addSubscriber($this->requestedByUser, $this, false);
     }
     TasksUtil::addSubscriber($this->owner, $this, false);
 }
コード例 #30
0
 /**
  * @return array
  */
 public static function getDefaultMetadata()
 {
     $metadata = array();
     $metadata['global'] = array('designerMenuItems' => array('showFieldsLink' => true, 'showGeneralLink' => true, 'showLayoutsLink' => true, 'showMenusLink' => false), 'shortcutsCreateMenuItems' => array(array('label' => "eval:Zurmo::t('TasksModule', 'TasksModuleSingularLabel', \$translationParams)", 'url' => Yii::app()->createUrl('tasks/default/modalCreate', array('modalId' => TasksUtil::getModalContainerId())), 'ajaxLinkOptions' => "TasksUtil::resolveAjaxOptionsForCreateMenuItem()", 'right' => self::RIGHT_CREATE_TASKS, 'mobile' => true)), 'globalSearchAttributeNames' => array('uniqueIdentifier', 'name'));
     return $metadata;
 }