Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
CRAP | |
0.00% |
0 / 86 |
| TaskPicker | |
0.00% |
0 / 1 |
|
0.00% |
0 / 6 |
702 | |
0.00% |
0 / 86 |
| init | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 10 |
|||
| run | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 17 |
|||
| filter | |
0.00% |
0 / 1 |
90 | |
0.00% |
0 / 25 |
|||
| getTaskIdArray | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
|||
| asJSON | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 13 |
|||
| createJSONTaskInfo | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 14 |
|||
| <?php | |
| /** | |
| * @link https://www.humhub.org/ | |
| * @copyright Copyright (c) 2018 HumHub GmbH & Co. KG | |
| * @license https://www.humhub.com/licences | |
| * | |
| */ | |
| namespace humhub\modules\tasks\widgets; | |
| use Yii; | |
| use yii\helpers\Html; | |
| use \yii\helpers\Url; | |
| /** | |
| * TaskPickerWidget displays a task picker instead of an input field. | |
| * | |
| * To use this widget, you may insert the following code in a view: | |
| * <pre> | |
| * $this->widget('application.modules_core.task.widgets.TaskPickerWidget',array( | |
| * 'name'=>'tasks', | |
| * | |
| * // additional javascript options for the date picker plugin | |
| * 'options'=>array( | |
| * 'showAnim'=>'fold', | |
| * ), | |
| * 'htmlOptions'=>array( | |
| * 'style'=>'height:20px;' | |
| * ), | |
| * )); | |
| * </pre> | |
| * | |
| * By configuring the {@link options} property, you may specify the options | |
| * that need to be passed to the taskpicker plugin. Please refer to | |
| * the documentation for possible options (name-value pairs). | |
| * | |
| * @author davidborn | |
| */ | |
| class TaskPicker extends \yii\base\Widget | |
| { | |
| /** | |
| * Id of input element which should replaced | |
| * | |
| * @var type | |
| */ | |
| public $inputId = ""; | |
| /** | |
| * JSON Search URL - defaults: search/json | |
| * | |
| * The token -keywordPlaceholder- will replaced by the current search query. | |
| * | |
| * @var String Url with -keywordPlaceholder- | |
| */ | |
| public $taskSearchUrl = ""; | |
| /** | |
| * Maximum tasks | |
| * | |
| * @var type | |
| */ | |
| public $maxTasks = 50; | |
| /** | |
| * Set guid for the current task | |
| * | |
| * @var type int | |
| */ | |
| public $taskId = null; | |
| /** | |
| * Set focus to input or not | |
| * | |
| * @var type boolean | |
| */ | |
| public $focus = false; | |
| /** | |
| * @var CModel the data model associated with this widget. | |
| */ | |
| public $model = null; | |
| /** | |
| * @var string the attribute associated with this widget. | |
| * The name can contain square brackets (e.g. 'name[1]') which is used to collect tabular data input. | |
| */ | |
| public $attribute = null; | |
| /** | |
| * @var string for input placeholder attribute. | |
| */ | |
| public $placeholderText = ""; | |
| /** | |
| * Used to transfer additional data to the server | |
| * @var type | |
| */ | |
| public $data = null; | |
| /** | |
| * Inits the Task Picker | |
| * | |
| */ | |
| public function init() | |
| { | |
| // Default task search for all tasks | |
| if ($this->taskSearchUrl == "") { | |
| // provide the space id if the widget is calling from a space | |
| if (Yii::$app->controller->id == 'space') { | |
| $spaceId = Yii::$app->controller->getSpace()->id; | |
| $this->taskSearchUrl = Url::toRoute(['/tasks/search/json', 'keyword' => '-keywordPlaceholder-', 'space_id' => $spaceId]); | |
| } else { | |
| $this->taskSearchUrl = Url::toRoute(['/tasks/search/json', 'keyword' => '-keywordPlaceholder-']); | |
| } | |
| } | |
| } | |
| /** | |
| * Displays / Run the Widgets | |
| */ | |
| public function run() | |
| { | |
| // Try to get current field value, when model & attribute attributes are specified. | |
| $currentValue = ""; | |
| if ($this->model != null && $this->attribute != null) { | |
| $attribute = $this->attribute; | |
| $currentValue = $this->model->$attribute; | |
| } | |
| return $this->render('taskPicker', [ | |
| 'taskSearchUrl' => $this->taskSearchUrl, | |
| 'maxTasks' => $this->maxUsers, | |
| 'currentValue' => $currentValue, | |
| 'inputId' => $this->inputId, | |
| 'focus' => $this->focus, | |
| 'taskId' => $this->taskId, | |
| 'data' => json_encode($this->data), | |
| 'placeholderText' => $this->placeholderText, | |
| ]); | |
| } | |
| /** | |
| * Creates a json task array used in the taskpicker js frontend. | |
| * The $cfg is used to specify the filter values the following values are available: | |
| * | |
| * query - (ActiveQuery) The initial query which is used to append additional filters. - default = User Friends if friendship module is enabled else User::find() | |
| * | |
| * active - (boolean) Specifies if only active task should be included in the result - default = true | |
| * | |
| * maxResults - (int) The max number of entries returned in the array - default = 10 | |
| * | |
| * keyword - (string) A keyword which filters task by title and description | |
| * | |
| * permission - (BasePermission) An additional permission filter | |
| * | |
| * fillQuery - (ActiveQuery) Can be used to fill the result array if the initial query does not return the maxResults, these results will have a lower priority | |
| * | |
| * fillUser - (boolean) When set to true and no fillQuery is given the result is filled with User::find() results | |
| * | |
| * disableFillUser - Specifies if the results of the fillQuery should be disabled in the taskpicker results - default = true | |
| * | |
| * @param type $cfg filter configuration | |
| * @return type json representation used by the taskpicker | |
| */ | |
| public static function filter($cfg = null) | |
| { | |
| $defaultCfg = [ | |
| 'active' => true, | |
| 'maxResult' => 10, | |
| // 'disableFillUser' => true, | |
| 'keyword' => null, | |
| 'permission' => null, | |
| // 'fillQuery' => null, | |
| // 'fillUser' => false | |
| ]; | |
| $cfg = ($cfg == null) ? $defaultCfg : array_merge($defaultCfg, $cfg); | |
| //If no initial query is given we use getFriends if friendship module is enabled otherwise all tasks | |
| if(!isset($cfg['query'])) { | |
| $cfg['query'] = (Yii::$app->getModule('friendship')->getIsEnabled()) | |
| ? Yii::$app->task->getIdentity()->getFriends() | |
| : UserFilter::find(); | |
| } | |
| //Filter the initial query and disable task without the given permission | |
| $task = UserFilter::filter($cfg['query'], $cfg['keyword'], $cfg['maxResult'], null, $cfg['active']); | |
| $jsonResult = self::asJSON($task, $cfg['permission'], 2); | |
| //Fill the result with additional tasks if it's allowed and the result count less than maxResult | |
| if(count($task) < $cfg['maxResult'] && (isset($cfg['fillQuery']) || $cfg['fillUser']) ) { | |
| //Filter out tasks by means of the fillQuery or default the fillQuery | |
| $fillQuery = (isset($cfg['fillQuery'])) ? $cfg['fillQuery'] : UserFilter::find(); | |
| UserFilter::addKeywordFilter($fillQuery, $cfg['keyword'], ($cfg['maxResult'] - count($task))); | |
| $fillQuery->andFilterWhere(['not in', 'id', self::getUserIdArray($task)]); | |
| $fillUser = $fillQuery->all(); | |
| //Either the additional tasks are disabled (by default) or we disable them by permission | |
| $disableCondition = (isset($cfg['permission'])) ? $cfg['permission'] : $cfg['disableFillUser']; | |
| $jsonResult = array_merge($jsonResult, TaskPicker::asJSON($fillUser, $disableCondition, 1)); | |
| } | |
| return $jsonResult; | |
| } | |
| /** | |
| * Assambles all task Ids of the given $tasks into an array | |
| * | |
| * @param array $tasks array of task models | |
| * @return array task id array | |
| */ | |
| private static function getTaskIdArray($tasks) | |
| { | |
| $result = []; | |
| foreach($tasks as $task) { | |
| $result[] = $task->id; | |
| } | |
| return $result; | |
| } | |
| /** | |
| * Creates an json result with task information arrays. A task will be marked | |
| * as disabled, if the permission check fails on this task. | |
| * | |
| * @param type $tasks | |
| * @param type $permission | |
| * @return type | |
| */ | |
| public static function asJSON($tasks, $permission = null, $priority = null) | |
| { | |
| if (is_array($tasks)) { | |
| $result = []; | |
| foreach ($tasks as $task) { | |
| if ($task != null) { | |
| $result[] = self::createJSONTaskInfo($task, $permission, $priority); | |
| } | |
| } | |
| return $result; | |
| } else { | |
| return self::createJSONTaskInfo($tasks, $permission, $priority); | |
| } | |
| } | |
| /** | |
| * Creates an single task-information array for a given task. A task will be marked | |
| * as disabled, if the permission check fails on this task. | |
| * | |
| * @param type $task | |
| * @param type $permission | |
| * @return type | |
| */ | |
| private static function createJSONTaskInfo($task, $permission = null, $priority = null) | |
| { | |
| $disabled = false; | |
| if($permission != null && $permission instanceof \humhub\libs\BasePermission) { | |
| $disabled = !$task->getPermissionManager()->can($permission); | |
| } else if($permission != null) { | |
| $disabled = $permission; | |
| } | |
| $priority = ($priority == null) ? 0 : $priority; | |
| $text = Html::encode($task->title); | |
| $taskInfo = []; | |
| $taskInfo['id'] = $task->id; | |
| $taskInfo['disabled'] = $disabled; | |
| return $taskInfo; | |
| } | |
| } | |
| ?> |