/* @var $this yii\web\View */
/* @var $filter yii\base\DynamicModel */
/* @var $dataProvider yii\data\ActiveDataProvider */
+/* @var $groups array */
+/* @var $subgroups array */
$this->title = 'Актуализация букетов';
foreach ($months as $k => $v) {
$monthOptions .= "<option value=\"$k\">$v</option>";
}
+
+$subgroupItems = [];
+$subgroupOptionAttrs = [];
+foreach ($subgroups as $sg) {
+ $id = (string)$sg['id'];
+ $subgroupItems[$id] = $sg['name'];
+ $subgroupOptionAttrs[$id] = ['data-parent' => (string)$sg['parent_id']];
+}
?>
-<div class="products1c-nomenclature-actuality-index p-4">
+<div class="matrix-bouquet-actuality-index p-4">
<h1><?= Html::encode($this->title) ?></h1>
<div class="row mb-3">
<div class="col">
<div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'category', ['options' => ['class' => 'w-90']])->dropDownList(
- $categories,
+ <?= $formFilter->field($filter, 'group_id', ['options' => ['class' => 'w-90']])->dropDownList(
+ $groups,
['prompt' => 'Категория', 'id' => 'filter-category']
)->label(false) ?>
</div>
</div>
</div>
- <div class="col">
- <div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'type', ['options' => ['class' => 'w-90']])->dropDownList(
- $types,
- ['prompt' => 'Тип', 'id' => 'filter-type']
- )->label(false) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-type" >
- <i class="fa fa-times"></i>
- </div>
- </div>
- </div>
- <div class="col">
- <div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'color', ['options' => ['class' => 'w-90']])->dropDownList(
- $colors,
- ['prompt' => 'Цвет', 'id' => 'filter-color']
- )->label(false) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-color" >
- <i class="fa fa-times"></i>
- </div>
- </div>
- </div>
</div>
<div class="row mb-3">
<div class="col">
<div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'subcategory', ['options' => ['class' => 'w-90']])->dropDownList(
- $subcategories,
- ['prompt' => 'Подкатегория', 'id' => 'filter-subcategory', 'class' => 'w-100']
+ <?= $formFilter->field($filter, 'subgroup_id', ['options' => ['class' => 'w-90']])
+ ->dropDownList(
+ $subgroupItems,
+ [
+ 'prompt' => 'Подкатегория',
+ 'id' => 'filter-subcategory',
+ 'class' => 'w-100',
+ 'options' => $subgroupOptionAttrs,
+ ]
)->label(false) ?>
<div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-subcategory" >
</div>
</div>
</div>
- <div class="col">
- <div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'sort', ['options' => ['class' => 'w-90']])->dropDownList(
- $sorts,
- ['prompt' => 'Сорт', 'id' => 'filter-sort']
- )->label(false) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-sort" >
- <i class="fa fa-times"></i>
- </div>
- </div>
- </div>
+
<div class="col"></div>
</div>
<div class="row">
- <div class="col">
- <div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'species', ['options' => ['class' => 'w-90']])->dropDownList(
- $species,
- ['prompt' => 'Вид', 'id' => 'filter-species']
- )->label(false) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-species" >
- <i class="fa fa-times"></i>
- </div>
- </div>
- </div>
- <div class="col">
- <div class="d-flex justify-content-between">
- <?= $formFilter->field($filter, 'size', ['options' => ['class' => 'w-90']])->dropDownList(
- $sizes,
- ['prompt' => 'Размер', 'id' => 'filter-size']
- )->label(false) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-size" >
- <i class="fa fa-times"></i>
- </div>
- </div>
- </div>
+
+
<div class="col"></div>
</div>
</div>
<div class="col-2 ps-4" style="border-left: #ccc solid 1px">
<div class="mb-2 fw-bold">Поставщики</div>
<div class="mb-3">
+ <?= $formFilter->field($filter, 'is_archive')->checkbox([
+ 'label' => 'Архивные',
+ 'uncheck' => 0,
+ 'checked' => (bool)$filter->is_archive,
+ 'id' => 'isArchiveCheckbox'
+ ])->label(false) ?>
- <div class="input-group">
- <?= Html::dropDownList('supplier', null,
- ['Астра','Бифлористика'],
- ['class' => 'form-select', 'id' => 'filter-supplier', 'prompt' => 'Поставщик']) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-supplier" >
- <i class="fa fa-times"></i>
- </div>
- </div>
</div>
<div class="mb-4">
- <div class="input-group">
- <?= Html::dropDownList('plantation', null,
- ['Плантация1','Плантация2'],
- ['class' => 'form-select', 'id' => 'filter-plantation', 'prompt' => 'Плантация']) ?>
- <div class="mb-4 ms-1 d-flex justify-content-center align-items-center clear-btn" data-target="filter-plantation" >
- <i class="fa fa-times"></i>
- </div>
- </div>
+
</div>
</div>
'value' => function ($row, $key, $index) {
$product = $row['product'];
$name = Html::encode($product->name . ' (' . $product->id . ')');
- $btn = Html::button('+ Добавить интервал', [
- 'class' => 'btn btn-xs btn-outline-primary ms-2 add-actuality-row',
- 'type' => 'button',
- 'title' => 'Добавить интервал',
- 'data-guid' => $product->id,
- 'data-name' => $product->name,
- ]);
- return '<div class="d-flex justify-content-between">' . $name . $btn . '</div>';
+
+ return '<div class="d-flex justify-content-between">' . $name . '</div>';
}
],
+ [
+ 'attribute' => 'price',
+ 'label' => 'Цена',
+ 'value' => function($row) { return $row['price']; },
+ 'format' => ['decimal', 2],
+ ],
[
'label' => 'Актуальность ассортимента',
'format' => 'raw',
}
],
[
- 'label' => 'Склад NN',
+ 'label' => 'УпÑ\80авление',
'format' => 'raw',
- 'contentOptions' => ['style'=>'width:60px; text-align:center;'],
- 'value' => function ($m, $k, $i) use ($filter){
- return Html::checkbox("actuality[$i][warehouse_nn]", false, [
-
+ 'contentOptions' => ['style'=>'width:160px; text-align:center;'],
+ 'value' => function ($row, $key, $index) {
+ $product = $row['product'];
+ $btnArchOn = Html::button('+ Добавить интервал', [
+ 'class' => 'btn btn-xs btn-outline-primary ms-2 add-actuality-row',
+ 'type' => 'button',
+ 'title' => 'Добавить интервал',
+ 'data-guid' => $product->id,
+ 'data-name' => $product->name,
]);
- }
- ],
- [
- 'label' => 'Склад MSK',
- 'format' => 'raw',
- 'contentOptions' => ['style'=>'width:60px; text-align:center;'],
- 'value' => function ($m, $k, $i) use ($filter){
- return Html::checkbox("actuality[$i][warehouse_msk]", false, [
-
+ $btnArchOff = Html::button('+ Добавить интервал', [
+ 'class' => 'btn btn-xs btn-outline-primary ms-2 add-actuality-row',
+ 'type' => 'button',
+ 'title' => 'Добавить интервал',
+ 'data-guid' => $product->id,
+ 'data-name' => $product->name,
]);
+ return '<div class="d-flex justify-content-between">' . $btnArchOn . $btnArchOff . '</div>';
}
],
- [
- 'label' => 'Поставщик/Плантация',
- 'format' => 'text',
- 'contentOptions' => ['style'=>'min-width:150px;'],
- 'value' => function ($m) {
- return '–';
- }
- ],
+
],
]); ?>
</div>
+<?php
+$js = <<<JS
+(function() {
+ const group = document.getElementById('filter-category');
+ const sub = document.getElementById('filter-subcategory');
+
+ function filterSubgroups() {
+ const gid = group.value;
+ const keepSelected = sub.value;
+ let hasVisibleSelected = false;
+
+
+ for (const opt of sub.options) {
+ if (!opt.value) { opt.hidden = false; continue; }
+ const parentId = opt.getAttribute('data-parent');
+ const visible = !gid || parentId === gid;
+ opt.hidden = !visible;
+ if (visible && opt.value === keepSelected) hasVisibleSelected = true;
+ }
+
+
+ if (!hasVisibleSelected) {
+ sub.value = '';
+ }
+ }
+
+
+ document.querySelectorAll('.clear-btn[data-target]').forEach(btn => {
+ btn.addEventListener('click', () => {
+ const targetId = btn.getAttribute('data-target');
+ const el = document.getElementById(targetId);
+ if (!el) return;
+ el.value = '';
+ el.dispatchEvent(new Event('change'));
+ });
+ });
+
+ // Мьютекс для чекбоксов "Только активные/неактивные" (необязательно, но удобно)
+ const onlyActive = document.getElementById('onlyActiveCheckbox');
+ const onlyInactive = document.getElementById('onlyInactiveCheckbox');
+ if (onlyActive && onlyInactive) {
+ onlyActive.addEventListener('change', () => { if (onlyActive.checked) { onlyInactive.checked = false; } });
+ onlyInactive.addEventListener('change', () => { if (onlyInactive.checked) { onlyActive.checked = false; } });
+ }
+
+ group.addEventListener('change', filterSubgroups);
+
+ // Первый проход (на случай когда значения уже выбраны в GET)
+ filterSubgroups();
+})();
+JS;
+
+$this->registerJs($js);
+?>
+