use yii_app\records\CompanyFunctions;
use yii_app\records\ExportImportTable;
use yii_app\records\Task;
+use yii_app\records\TaskEntity;
use yii_app\records\TaskStatus;
use yii_app\services\TaskService;
return 'fail';
}
+
$filterModel = DynamicModel::validateData([
'taskFilter' => '0', 'searchText' => null, 'updatedBy' => '0', 'createdBy' => '0',
'created_at_from' => date("d.m.Y", strtotime("-365 day", time())),
'deadline_from' => date("d.m.Y", strtotime("-365 day", time())),
'deadline_to' => date("d.m.Y", strtotime("+365 day", time())),
'company_function_id' => '0',
+ 'entity_type' => null, // Добавляем свойство entity_type
+ 'entity_id' => null // Если используется entity_id, добавляем его тоже
], [
[
[
'taskFilter', 'searchText', 'updatedBy', 'createdBy',
'created_at_from', 'created_at_to', 'deadline_from', 'deadline_to',
- 'company_function_id'
+ 'company_function_id', 'entity_type', 'entity_id',
],
'safe'
]
} else {
$tasksQuery = Task::find();
}
+ $entityTypesQuery = clone $tasksQuery;
+ $entityTypes = $entityTypesQuery->select('entity_type')->distinct()->column();
+
+ // Из таблицы TaskEntity получаем сущности только тех типов, которые есть в задачах.
+ $taskEntities = TaskEntity::find()->where(['id' => $entityTypes])->all();
if ((int)$filterModel->updatedBy > 0) {
$tasksQuery = $tasksQuery->andWhere(['like', 'updated_by', $filterModel->updatedBy]);
$tasksQuery = $tasksQuery->andWhere(['like', 'created_by', $filterModel->createdBy]);
}
- if ((int)$filterModel->entity_type > 0) {
- $tasksQuery = $tasksQuery->andWhere(['entity_type_id' => $filterModel->entity_type]);
+ if (!empty($filterModel->entity_type)) {
+ $entityId = TaskEntity::find()->where(['alias' => $filterModel->entity_type])->one();
+ $tasksQuery->andWhere(['entity_type' => $entityId['id']]);
}
- if ((int)$filterModel->entity_id > 0) {
- $tasksQuery = $tasksQuery->andWhere(['entity_id' => $filterModel->entity_id]);
+ if (!empty($filterModel->entity_id)) {
+ $tasksQuery->andWhere(['entity_id' => $filterModel->entity_id]);
}
$tasksQuery = $tasksQuery
}
return $this->controller->render('/task/four-columns',
- compact('tasks', 'taskStatuses', 'admins', 'filterModel', 'adminsWithGroup', 'companyFunctions'));
+ compact('tasks', 'taskStatuses', 'admins', 'filterModel', 'adminsWithGroup', 'companyFunctions', 'taskEntities'));
}
}
\ No newline at end of file
/** @var \yii\base\DynamicModel $filterModel */
/** @var array $adminsWithGroup */
/** @var array $companyFunctions */
+/** @var array $taskEntities */
$this->registerCssFile('/azea/assets/plugins/dragula/dragula.css');
$this->registerJsFile('/azea/assets/plugins/dragula/dragula.js', ['position' => \yii\web\View::POS_END]);
?>
+<div class="row mb-3">
+ <div class="col-4">
+ <h2>Доска задач</h2>
+ </div>
+ <div class="col-4">
+ <!-- Счетчик задач -->
+ <p>Всего задач: <span id="task-count"><?= count($tasks); ?></span></p>
+ </div>
+ <div class="col-4 text-end">
+ <!-- Кнопка для создания задачи -->
+ <?= Html::a('Создать задачу', ['/crud/task/create'], ['class' => 'btn btn-success', 'target' => '_blank', 'data-pjax' => '0']) ?>
+ </div>
+</div>
+
+<!-- Тумблер для фильтрации активных задач -->
+<div class="row mb-3">
+ <div class="col-4">
+ <div class="form-check form-switch">
+ <input class="form-check-input" type="checkbox" id="activeTasksToggle">
+ <label class="form-check-label" for="activeTasksToggle">Активные</label>
+ </div>
+ </div>
+</div>
+
<?php $form = ActiveForm::begin(['id' => 'filter-form']); ?>
-<?php PrintBlockHelper::printBlock('Группы', $form->field($filterModel, 'taskFilter')->radioList(
+<?php /*PrintBlockHelper::printBlock('Группы', $form->field($filterModel, 'taskFilter')->radioList(
+ ['0' => 'Мои', '1' => 'На контроле', '2' => 'Участвую', '3' => 'Просматриваю', '4' => 'Неразобранные'],
+ ['class' => 'form-control', 'onchange' => '$("#filter-form").get(0).submit();'])->label(false)); */?>
+
+
+ <?= $form->field($filterModel, 'taskFilter')->radioList(
['0' => 'Мои', '1' => 'На контроле', '2' => 'Участвую', '3' => 'Просматриваю', '4' => 'Неразобранные'],
- ['class' => 'form-control', 'onchange' => '$("#filter-form").get(0).submit();'])->label(false)); ?>
+ ['item' => function($index, $label, $name, $checked, $value) {
+ // Уникальный ID для каждой кнопки
+ $id = $name . '_' . $index;
+
+ // Определяем, выбрана ли кнопка
+ $checkedAttr = $checked ? 'checked' : '';
+
+ // Возвращаем HTML для одной радио-кнопки с классом btn-check и оберткой
+ return
+ Html::radio($name, $checked, [
+ 'value' => $value,
+ 'id' => $id,
+ 'class' => 'btn-check',
+ 'autocomplete' => 'off'
+ ]) .
+ Html::label($label, $id, ['class' => 'btn btn-secondary']);
+ },
+
+ 'class' => 'd-flex btn-group justify-content-center',
+ 'onchange' => '$("#filter-form").get(0).submit();'])->label(false); ?>
+
+
+
+
+
+<!-- Кнопка "Больше фильтров" -->
+<div class="row">
+ <div class="col-12 text-right">
+ <button type="button" id="toggle-filters" class="btn btn-primary">Больше фильтров</button>
+ </div>
+</div>
+
+
+<!-- Скрытая часть фильтров -->
+<div id="more-filters" style="display: none;">
<div class="row">
<div class="col-1 text-right">
Содержит:
</div>
</div>
<div class="row">
- <div class="col-2">
+ <div class="col-3 text-right">
+ Тип сущности:
+ </div>
+ <div class="col-3">
<?= $form->field($filterModel, 'entity_type')->widget(Select2::class, [
- 'data' => ArrayHelper::map($taskEntityTypes, 'id', 'name'), // Типы сущностей
+ 'data' => ArrayHelper::map($taskEntities, 'alias', 'name'), // 'alias' используется для получения сущностей
'language' => 'ru',
- 'options' => ['placeholder' => 'Тип сущности...'],
+ 'options' => [
+ 'placeholder' => 'Выберите тип сущности...',
+ 'id' => 'entity-type-dropdown'
+ ],
'pluginOptions' => [
'allowClear' => true,
],
'pluginEvents' => [
"change" => "function() {
- var entityType = $(this).val();
+ var alias = $(this).val();
$.ajax({
- method: 'POST',
- url: '/path/to/get-entities', // Указать URL для получения сущностей по типу
- data: { entity_type: entityType },
+ url: '" . \yii\helpers\Url::to(['/task/fetch-entities']) . "', // Экшн для получения сущностей
+ type: 'POST',
+ data: {alias: alias},
success: function(data) {
- var entitiesDropdown = $('#dynamicmodel-entity_id');
- entitiesDropdown.empty(); // Очистить предыдущие значения
- $.each(data, function(index, value) {
- entitiesDropdown.append(new Option(value, index));
+ var entityDropdown = $('#entity-dropdown');
+ entityDropdown.empty();
+ $.each(data, function(id, name) {
+ entityDropdown.append(new Option(name, id));
});
}
});
- }"
+ }",
]
])->label(false) ?>
</div>
- <div class="col-2">
+ <div class="col-3 text-right">
+ Сущность:
+ </div>
+ <div class="col-3">
<?= $form->field($filterModel, 'entity_id')->widget(Select2::class, [
- 'data' => $entities, // Изначально пустой или предзагруженные сущности
+ 'data' => [], // данные заполнятся после выбора типа сущности
'language' => 'ru',
- 'options' => ['placeholder' => 'Сущность...'],
+ 'options' => [
+ 'placeholder' => 'Выберите сущность...',
+ 'id' => 'entity-dropdown'
+ ],
'pluginOptions' => [
'allowClear' => true,
]
</div>
</div>
-
+</div>
<?php ActiveForm::end() ?>
-<div class="row">
- <div class="col-4">
- <?= Html::a('Создать задачу', ['/crud/task/create'], ['class' => 'btn btn-success', 'target' => '_blank', 'data-pjax' => '0']) ?>
- </div>
+ <!-- jQuery для управления показом/скрытием фильтров -->
+ <?php
+ $script = <<< JS
+ $('#toggle-filters').on('click', function() {
+ $('#more-filters').toggle();
+ var buttonText = $('#more-filters').is(':visible') ? 'Скрыть фильтры' : 'Больше фильтров';
+ $(this).text(buttonText);
+ });
+$('input[name="taskFilter"]').on('change', function() {
+ var selectedValue = $(this).val(); // Получаем значение выбранной радио-кнопки
+ console.log('Выбрано значение: ' + selectedValue); // Выводим значение в консоль
+ $('#filter-form').submit(); // Отправляем форму
+ });
+JS;
+ $this->registerJs($script);
+ ?>
+
+
-</div>
<div class="card mt-2">
<div class="row g-0">
<?php if (isset($taskStatuses)): //<div class="col-1 font-weight-bold"></div> ?>