]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Изменил фильтрации
authorvladfo <fvv2011@gmail.com>
Tue, 17 Sep 2024 12:39:34 +0000 (15:39 +0300)
committervladfo <fvv2011@gmail.com>
Tue, 17 Sep 2024 12:39:34 +0000 (15:39 +0300)
erp24/actions/task/FourColumnsAction.php
erp24/controllers/TaskController.php
erp24/views/task/four-columns.php

index aa529e4213b3e3e0ee4b09c2a0af911d89df1a52..686d10c49792244c3885ac221686ba1ee9d4ffd2 100755 (executable)
@@ -12,6 +12,7 @@ use yii_app\records\Admin;
 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;
 
@@ -35,6 +36,7 @@ class FourColumnsAction extends Action
             return 'fail';
         }
 
+
         $filterModel = DynamicModel::validateData([
             'taskFilter' => '0', 'searchText' => null, 'updatedBy' => '0', 'createdBy' => '0',
             'created_at_from' => date("d.m.Y", strtotime("-365 day", time())),
@@ -42,12 +44,14 @@ class FourColumnsAction extends Action
             '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'
             ]
@@ -66,6 +70,11 @@ class FourColumnsAction extends Action
         } 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]);
@@ -75,12 +84,13 @@ class FourColumnsAction extends Action
             $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
@@ -139,6 +149,6 @@ class FourColumnsAction extends Action
         }
 
         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
index 04f6bb4399fcd3d26fd6393c260b374de98f80a5..b286c4f85a891274febb70efbc05e4d72617e23b 100755 (executable)
@@ -4,6 +4,7 @@ declare(strict_types = 1);
 namespace app\controllers;
 
 
+use Yii;
 use yii\helpers\Json;
 use yii_app\actions\task\CreateRequestAction;
 use yii_app\actions\task\CreateSupportAction;
@@ -12,6 +13,7 @@ use yii_app\actions\task\IndexAction;
 use yii_app\actions\task\ProofsAction;
 use yii_app\actions\task\SupportAction;
 use yii_app\records\TaskSearch;
+use yii_app\services\TaskService;
 
 class TaskController extends \yii\web\Controller
 {
@@ -29,15 +31,16 @@ class TaskController extends \yii\web\Controller
         ];
     }
 
-    public function actionGetEntities()
+    public function actionFetchEntities()
     {
-        if (Yii::$app->request->isAjax) {
-            $entityTypeId = Yii::$app->request->post('entity_type');
-            $entities = Entity::find()->where(['entity_type_id' => $entityTypeId])->all();
+        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
+        $alias = Yii::$app->request->post('alias');
 
-            // Вернем JSON ответ с сущностями
-            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
-            return ArrayHelper::map($entities, 'id', 'name');
+        if ($alias) {
+            $entities = TaskService::getEntitiesByAlias($alias);
+            return $entities;
         }
+
+        return [];
     }
 }
\ No newline at end of file
index 749100e2357f5f47c614164705f8fee0fd5da76f..ccea47c58e70cd4d70b78a6e24f5d91cea8a8bbb 100755 (executable)
@@ -14,6 +14,7 @@ use \yii_app\helpers\PrintBlockHelper;
 /** @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]);
@@ -21,12 +22,75 @@ $this->registerJsFile('/js/task/four-columns.js', ['position' => \yii\web\View::
 
 ?>
 
+<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">
         Содержит:
@@ -62,38 +126,50 @@ $this->registerJsFile('/js/task/four-columns.js', ['position' => \yii\web\View::
     </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,
             ]
@@ -234,15 +310,28 @@ $this->registerJsFile('/js/task/four-columns.js', ['position' => \yii\web\View::
     </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> ?>