%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/tasks/models/lists/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/tasks/models/lists/TaskList.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2018 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*
*/
namespace humhub\modules\tasks\models\lists;
use humhub\modules\content\components\ActiveQueryContent;
use humhub\modules\content\components\ContentContainerActiveRecord;
use humhub\modules\content\models\ContentContainer;
use humhub\modules\content\models\ContentTag;
use humhub\modules\tasks\models\Sortable;
use humhub\modules\tasks\models\Task;
use yii\db\ActiveQuery;
use yii\db\Expression;
/**
* Class TaskList
* @property int $id
* @property TaskListSettings $addition
*/
class TaskList extends ContentTag implements TaskListInterface, Sortable
{
public $moduleId = 'tasks';
public $additionClass = TaskListSettings::class;
const FILTER_STATUS_INCLUDE = 'status';
const FILTER_STATUS_EXCLUDE = 'status';
public function afterSave($insert, $changedAttributes)
{
// TODO: this can be removed after v1.2.6
$this->addition->setTag($this);
if($insert) {
$root = new TaskListRoot(['contentContainer' => $this->getContainer()]);
$root->moveItemIndex($this->id, 0);
}
parent::afterSave($insert, $changedAttributes);
}
/**
* @return ActiveQueryContent
*/
public function getTasks()
{
return Task::find()->andWhere(['task_list_id' => $this->id])->readable();
}
public function load($data, $formName = null)
{
// TODO: this can be removed after v1.2.6
$this->addition->load($data);
return parent::load($data, $formName); // TODO: Change the autogenerated stub
}
/**
* @return ActiveQueryContent
*/
public function getNonCompletedTasks()
{
return $this->getTasks()->where(['!=', 'task.status', Task::STATUS_COMPLETED])->orderBy(['sort_order' => SORT_ASC, 'updated_at' => SORT_DESC]);
}
/**
* @param $offset int
* @param $limit int
* @return static[]
*/
public function getShowMoreCompletedTasks($offset, $limit)
{
return $this->getCompletedTasks()->orderBy(['task.updated_at' => SORT_DESC])->offset($offset)->limit($limit)->all();
}
/**
* @return ActiveQuery
*/
public function getCompletedTasks()
{
return $this->getTasksByStatus(Task::STATUS_COMPLETED)->orderBy(['task.updated_at' => SORT_DESC]);
}
/**
* @param $status
* @return ActiveQuery
*/
public function getTasksByStatus($status)
{
return $this->getTasks()->where(['task.status' => $status]);
}
/**
* @param $id
* @param $container
* @return TaskList|null
*/
public static function findById($id, $container)
{
return static::findByContainer($container)->andWhere(['id' => $id])->one();
}
/**
* @param $container
* @param array $filters
* @return ActiveQuery
*/
public static function findByFilter($container, $filters = [])
{
$query = static::findByContainer($container);
if(isset($filters[static::FILTER_STATUS_EXCLUDE])) {
$includes = Task::$statuses;
$excludes = is_array($filters[static::FILTER_STATUS_EXCLUDE]) ? $filters[static::FILTER_STATUS_EXCLUDE] : [$filters[static::FILTER_STATUS_EXCLUDE]];
foreach ($excludes as $exclude) {
unset($includes[$exclude]);
}
$filters[static::FILTER_STATUS_INCLUDE] = $includes;
}
if(isset($filters[static::FILTER_STATUS_INCLUDE])) {
$query->leftJoin('task', 'task.task_list_id=content_tag.id');
$includes = is_array($filters[static::FILTER_STATUS_INCLUDE]) ? $filters[static::FILTER_STATUS_INCLUDE] : [$filters[static::FILTER_STATUS_INCLUDE]];
$query->andWhere(
['OR',
['IS', 'task.id', new Expression("NULL")],
['IN', 'task.status', $includes]
]);
}
return $query;
}
/**
* @param $container
* @return ActiveQuery
*/
public static function findOverviewLists(ContentContainerActiveRecord $container)
{
$query = static::findByContainer($container);
$query->leftJoin('task', 'task.task_list_id=content_tag.id');
$query->leftJoin('task_list_setting', 'task_list_setting.tag_id=content_tag.id');
$includes = [Task::STATUS_IN_PROGRESS, Task::STATUS_PENDING_REVIEW, Task::STATUS_PENDING];
$query->andWhere(
['OR',
['IN', 'task.status', $includes],
['IS', 'task.id', new Expression("NULL")],
['task_list_setting.hide_if_completed' => '0']
]
);
$query->orderBy(['task_list_setting.sort_order' => SORT_ASC]);
return $query;
}
public static function findHiddenLists(ContentContainerActiveRecord $container)
{
$query = static::findByContainer($container);
$query->leftJoin('task t', 't.task_list_id=content_tag.id');
$query->leftJoin('task_list_setting', 'task_list_setting.tag_id=content_tag.id');
$includes = [Task::STATUS_IN_PROGRESS, Task::STATUS_PENDING_REVIEW, Task::STATUS_PENDING];
$subQuery = Task::find()->where('task.task_list_id = content_tag.id')->andWhere(['IN', 'task.status', $includes]);
$query->andWhere(
['AND',
['NOT EXISTS', $subQuery],
['IS NOT', 't.id', new Expression("NULL")],
['task_list_setting.hide_if_completed' => '1']
]
);
$query->orderBy(['task_list_setting.updated_at' => SORT_ASC, 'task_list_setting.id' => SORT_DESC])->distinct();
return $query;
}
public static function hasCompletedLists(ContentContainerActiveRecord $container): bool
{
return self::findHiddenLists($container)->exists();
}
/**
* Deletes all tags by module id
* @param ContentContainerActiveRecord|int $contentContainer
*/
public static function deleteByModule($contentContainer = null)
{
$instance = new static();
if($contentContainer) {
$container_id = $contentContainer instanceof ContentContainerActiveRecord ? $contentContainer->contentcontainer_id : $contentContainer;
static::deleteAll(['module_id' => $instance->module_id, 'contentcontainer_id' => $container_id]);
} else {
static::deleteAll(['module_id' => $instance->module_id]);
}
}
/**
* Deletes all tags by type
* @param ContentContainerActiveRecord|int $contentContainer
*/
public static function deleteByType($contentContainer = null)
{
$instance = new static();
if($contentContainer) {
$container_id = $contentContainer instanceof ContentContainerActiveRecord ? $contentContainer->contentcontainer_id : $contentContainer;
static::deleteAll(['type' => $instance->type, 'contentcontainer_id' => $container_id]);
} else {
static::deleteAll(['type' => $instance->type]);
}
}
/**
* @inheritdoc
*/
public function afterDelete()
{
// Workaround for non foreign key support
Task::updateAll(['task_list_id' => new Expression('NULL')], ['task_list_id' => $this->id]);
parent::afterDelete();
}
public function moveItemIndex($taskId, $newIndex)
{
/** @var $task Task */
$transaction = Task::getDb()->beginTransaction();
try {
$task = Task::findOne(['id' => $taskId]);
$tasks = $this->getNonCompletedTasks()->andWhere(['!=', 'task.id', $task->id])->all();
$task->updateAttributes(['task_list_id' => $this->id]);
// make sure no invalid index is given
if ($newIndex < 0) {
$newIndex = 0;
} else if ($newIndex >= count($tasks) + 1) {
$newIndex = count($tasks) - 1;
}
array_splice($tasks, $newIndex, 0, [$task]);
foreach ($tasks as $index => $item) {
$item->updateAttributes(['sort_order' => $index]);
}
$transaction->commit();
} catch (\Exception $e) {
$transaction->rollBack();
throw $e;
} catch (\Throwable $e) {
$transaction->rollBack();
throw $e;
}
$this->refresh();
}
public function isHideIfCompleted()
{
return $this->addition->hide_if_completed;
}
public function getId()
{
return $this->id;
}
public function getTitle()
{
return $this->name;
}
public function getColor()
{
return $this->color;
}
}