/** * 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; }
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; }
/** * 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 }
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, ';'); }
/** * 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(); }
/** * @return string */ protected function getDefaultRoute() { return Yii::app()->createUrl('tasks/default/modalCreate', array('modalId' => TasksUtil::getModalContainerId())); }
/** * Register the additional script for task detail modal */ protected function renderScripts() { parent::renderScripts(); TasksUtil::registerTaskModalDetailsScript($this->getGridViewId()); }
protected function afterSave() { if ($this->getScenario() != 'importModel') { $this->processNotificationsToBeSent(); } if ($this->getScenario() != 'kanbanViewButtonClick' && $this->getScenario() != 'kanbanViewDrag') { TasksUtil::checkKanbanTypeByStatusAndUpdateIfRequired($this); } parent::afterSave(); }
/** * 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); }
/** * 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()); }
/** * Renders content. * @return string */ protected function renderContent() { $content = parent::renderContent(); TasksUtil::resolveShouldOpenToTaskForDetailsAndRelationsView(); return $content; }
/** * Renders content * @return string */ protected function renderContent() { $content = parent::renderContent(); TasksUtil::resolveShouldOpenToTask($this->getGridViewId()); return $content; }
/** * 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; }
/** * @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()); }
/** * 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; }
/** * 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); }
/** * 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))); } }
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; }
/** * 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; }
/** * 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); } }
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); }
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); }
/** * 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; }
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 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); }
/** * 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); }
/** * @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; }