feat: add setting to control category products button visibility

- Add show_category_products_button field to StoreDTO
- Update SettingsSerializerService to support new field
- Add setting in admin panel on 'Store' tab with toggle
- Pass setting to SPA through SettingsHandler
- Button displays only for categories with child categories
- Add default value true to configuration
This commit is contained in:
2025-12-24 01:45:50 +03:00
parent 7b0e5f80e9
commit c3994b2291
9 changed files with 50 additions and 1 deletions

View File

@@ -20,6 +20,30 @@
4. **Тестируй изменения перед коммитом** 4. **Тестируй изменения перед коммитом**
5. **Документируй публичные API** 5. **Документируй публичные API**
### Правила коммитов
1. **Следование Conventional Commits**
- Используй префиксы: `feat:`, `fix:`, `chore:`, `refactor:`, `style:`, `test:`, `docs:`
- Формат: `<type>: <subject>` (первая строка до 72 символов)
- После пустой строки - подробное описание изменений
2. **Язык коммитов**
- Все коммиты на **английском языке**
- Подробное описание изменений в теле коммита
- Перечисляй все измененные файлы и ключевые изменения
3. **Примеры правильных коммитов**
```
feat: add setting to control category products button visibility
- Add show_category_products_button field to StoreDTO
- Update SettingsSerializerService to support new field
- Add setting in admin panel on 'Store' tab with toggle
- Pass setting to SPA through SettingsHandler
- Button displays only for categories with child categories
- Add default value true to configuration
```
### Запрещено ### Запрещено
- Хардкод значений (используй конфиги/настройки) - Хардкод значений (используй конфиги/настройки)

View File

@@ -39,6 +39,7 @@ export const useSettingsStore = defineStore('settings', {
enable_store: true, enable_store: true,
feature_coupons: true, feature_coupons: true,
feature_vouchers: true, feature_vouchers: true,
show_category_products_button: true,
}, },
orders: { orders: {

View File

@@ -21,6 +21,10 @@
<a :href="`/admin/index.php?route=sale/voucher&user_token=${userToken}`" <a :href="`/admin/index.php?route=sale/voucher&user_token=${userToken}`"
target="_blank">подарочные сертификаты OpenCart</a> при оформлении заказа.</p> target="_blank">подарочные сертификаты OpenCart</a> при оформлении заказа.</p>
</ItemBool> </ItemBool>
<ItemBool label="Показывать кнопку «Показать товары из текущей категории»" v-model="settings.items.store.show_category_products_button">
<p>Включите, чтобы пользователи видели кнопку «Показать товары из "название текущей категории"» на странице категории, если у неё есть дочерние категории. Настройка работает только для страниц категорий с дочерними категориями, при отключении кнопка скрыта.</p>
</ItemBool>
</template> </template>
<script setup> <script setup>

View File

@@ -12,6 +12,7 @@ export const useSettingsStore = defineStore('settings', {
ya_metrika_enabled: false, ya_metrika_enabled: false,
feature_coupons: false, feature_coupons: false,
feature_vouchers: false, feature_vouchers: false,
show_category_products_button: true,
currency_code: null, currency_code: null,
theme: { theme: {
light: 'light', dark: 'dark', variables: { light: 'light', dark: 'dark', variables: {
@@ -43,6 +44,7 @@ export const useSettingsStore = defineStore('settings', {
this.store_enabled = settings.store_enabled; this.store_enabled = settings.store_enabled;
this.feature_coupons = settings.feature_coupons; this.feature_coupons = settings.feature_coupons;
this.feature_vouchers = settings.feature_vouchers; this.feature_vouchers = settings.feature_vouchers;
this.show_category_products_button = settings.show_category_products_button ?? true;
this.currency_code = settings.currency_code; this.currency_code = settings.currency_code;
this.texts = settings.texts; this.texts = settings.texts;
this.mainpage_blocks = settings.mainpage_blocks; this.mainpage_blocks = settings.mainpage_blocks;

View File

@@ -18,7 +18,7 @@
</button> </button>
<button <button
v-if="parentCategory" v-if="parentCategory && parentCategory.children?.length && settings.show_category_products_button"
class="py-2 px-4 flex items-center mb-3 cursor-pointer border-b w-full pb-2 border-base-200" class="py-2 px-4 flex items-center mb-3 cursor-pointer border-b w-full pb-2 border-base-200"
@click.prevent="showProductsInParentCategory" @click.prevent="showProductsInParentCategory"
> >
@@ -59,11 +59,13 @@ import {useCategoriesStore} from "@/stores/CategoriesStore.js";
import {useRoute} from "vue-router"; import {useRoute} from "vue-router";
import CategoryItem from "@/components/CategoriesList/CategoryItem.vue"; import CategoryItem from "@/components/CategoriesList/CategoryItem.vue";
import {useYaMetrikaStore} from "@/stores/yaMetrikaStore.js"; import {useYaMetrikaStore} from "@/stores/yaMetrikaStore.js";
import {useSettingsStore} from "@/stores/SettingsStore.js";
import BaseViewWrapper from "@/views/BaseViewWrapper.vue"; import BaseViewWrapper from "@/views/BaseViewWrapper.vue";
const route = useRoute(); const route = useRoute();
const categoriesStore = useCategoriesStore(); const categoriesStore = useCategoriesStore();
const yaMetrika = useYaMetrikaStore(); const yaMetrika = useYaMetrikaStore();
const settings = useSettingsStore();
const parentId = computed(() => route.params.id ? Number(route.params.id) : null); const parentId = computed(() => route.params.id ? Number(route.params.id) : null);

View File

@@ -55,6 +55,7 @@ HTML,
'enable_store' => true, 'enable_store' => true,
'feature_coupons' => true, 'feature_coupons' => true,
'feature_vouchers' => true, 'feature_vouchers' => true,
'show_category_products_button' => true,
], ],
'texts' => [ 'texts' => [

View File

@@ -7,6 +7,7 @@ final class StoreDTO
private bool $enableStore; private bool $enableStore;
private bool $featureCoupons; private bool $featureCoupons;
private bool $featureVouchers; private bool $featureVouchers;
private bool $showCategoryProductsButton;
private string $ocDefaultCurrency; private string $ocDefaultCurrency;
private bool $ocConfigTax; private bool $ocConfigTax;
private int $ocStoreId; private int $ocStoreId;
@@ -15,6 +16,7 @@ final class StoreDTO
bool $enableStore, bool $enableStore,
bool $featureCoupons, bool $featureCoupons,
bool $featureVouchers, bool $featureVouchers,
bool $showCategoryProductsButton,
string $ocDefaultCurrency, string $ocDefaultCurrency,
bool $ocConfigTax, bool $ocConfigTax,
int $ocStoreId int $ocStoreId
@@ -22,6 +24,7 @@ final class StoreDTO
$this->enableStore = $enableStore; $this->enableStore = $enableStore;
$this->featureCoupons = $featureCoupons; $this->featureCoupons = $featureCoupons;
$this->featureVouchers = $featureVouchers; $this->featureVouchers = $featureVouchers;
$this->showCategoryProductsButton = $showCategoryProductsButton;
$this->ocDefaultCurrency = $ocDefaultCurrency; $this->ocDefaultCurrency = $ocDefaultCurrency;
$this->ocConfigTax = $ocConfigTax; $this->ocConfigTax = $ocConfigTax;
$this->ocStoreId = $ocStoreId; $this->ocStoreId = $ocStoreId;
@@ -42,6 +45,11 @@ final class StoreDTO
return $this->featureVouchers; return $this->featureVouchers;
} }
public function isShowCategoryProductsButton(): bool
{
return $this->showCategoryProductsButton;
}
public function getOcDefaultCurrency(): string public function getOcDefaultCurrency(): string
{ {
return $this->ocDefaultCurrency; return $this->ocDefaultCurrency;
@@ -63,6 +71,7 @@ final class StoreDTO
'enable_store' => $this->enableStore, 'enable_store' => $this->enableStore,
'feature_coupons' => $this->featureCoupons, 'feature_coupons' => $this->featureCoupons,
'feature_vouchers' => $this->featureVouchers, 'feature_vouchers' => $this->featureVouchers,
'show_category_products_button' => $this->showCategoryProductsButton,
'oc_default_currency' => $this->ocDefaultCurrency, 'oc_default_currency' => $this->ocDefaultCurrency,
'oc_config_tax' => $this->ocConfigTax, 'oc_config_tax' => $this->ocConfigTax,
'oc_store_id' => $this->ocStoreId, 'oc_store_id' => $this->ocStoreId,

View File

@@ -48,6 +48,7 @@ class SettingsHandler
'store_enabled' => $this->settings->config()->getStore()->isEnableStore(), 'store_enabled' => $this->settings->config()->getStore()->isEnableStore(),
'feature_coupons' => $this->settings->config()->getStore()->isFeatureCoupons(), 'feature_coupons' => $this->settings->config()->getStore()->isFeatureCoupons(),
'feature_vouchers' => $this->settings->config()->getStore()->isFeatureVouchers(), 'feature_vouchers' => $this->settings->config()->getStore()->isFeatureVouchers(),
'show_category_products_button' => $this->settings->config()->getStore()->isShowCategoryProductsButton(),
'currency_code' => $this->settings->config()->getStore()->getOcDefaultCurrency(), 'currency_code' => $this->settings->config()->getStore()->getOcDefaultCurrency(),
'texts' => $this->settings->config()->getTexts()->toArray(), 'texts' => $this->settings->config()->getTexts()->toArray(),
'mainpage_blocks' => $this->settings->get('mainpage_blocks', []), 'mainpage_blocks' => $this->settings->get('mainpage_blocks', []),

View File

@@ -141,6 +141,7 @@ class SettingsSerializerService
$data['enable_store'] ?? true, $data['enable_store'] ?? true,
$data['feature_coupons'] ?? true, $data['feature_coupons'] ?? true,
$data['feature_vouchers'] ?? true, $data['feature_vouchers'] ?? true,
$data['show_category_products_button'] ?? true,
$data['oc_default_currency'], $data['oc_default_currency'],
$data['oc_config_tax'], $data['oc_config_tax'],
$data['oc_store_id'] $data['oc_store_id']
@@ -281,6 +282,10 @@ class SettingsSerializerService
throw new InvalidArgumentException('store.feature_vouchers must be a boolean'); throw new InvalidArgumentException('store.feature_vouchers must be a boolean');
} }
if (isset($data['show_category_products_button']) && ! is_bool($data['show_category_products_button'])) {
throw new InvalidArgumentException('store.show_category_products_button must be a boolean');
}
if (! isset($data['oc_default_currency'])) { if (! isset($data['oc_default_currency'])) {
throw new InvalidArgumentException('store.oc_default_currency is required'); throw new InvalidArgumentException('store.oc_default_currency is required');
} }