From f0837e5c94ef3327f0d249e1994dc73a6da1c42b Mon Sep 17 00:00:00 2001 From: Nikita Kiselev Date: Thu, 13 Nov 2025 13:41:35 +0300 Subject: [PATCH] feat: added new products_carousel bock type --- .../src/components/Form/CategoryLabel.vue | 52 +++++ .../src/components/Form/CategorySelect.vue | 50 ++++ .../Blocks/ProductsCarouselBlock.vue | 31 +++ .../MainPageConfigurator/Forms/BaseForm.vue | 2 + .../Forms/ProductsCarouselForm.vue | 220 ++++++++++++++++++ .../MainPageConfigurator/availableBlocks.js | 21 ++ frontend/admin/src/stores/autocomplete.js | 19 ++ frontend/spa/index.html | 4 +- frontend/spa/src/components/Dock.vue | 147 +++++------- .../MainPage/Blocks/CategoriesTopBlock.vue | 2 +- .../MainPage/Blocks/ProductsCarouselBlock.vue | 75 ++++++ .../MainPage/Blocks/ProductsFeedBlock.vue | 2 +- .../MainPage/Blocks/SliderBlock.vue | 2 +- .../spa/src/components/MainPage/MainPage.vue | 8 +- frontend/spa/src/stores/yaMetrikaStore.js | 4 + .../controller/extension/module/tgshop.php | 8 +- .../bastion/Handlers/AutocompleteHandler.php | 86 ++++++- .../bastion/Handlers/DictionariesHandler.php | 58 +++++ .../oc_telegram_shop/bastion/routes.php | 6 + .../src/Handlers/CategoriesHandler.php | 16 +- .../src/Services/BlocksService.php | 40 +++- .../src/Services/ProductsService.php | 2 +- 22 files changed, 747 insertions(+), 108 deletions(-) create mode 100644 frontend/admin/src/components/Form/CategoryLabel.vue create mode 100644 frontend/admin/src/components/Form/CategorySelect.vue create mode 100644 frontend/admin/src/components/MainPageConfigurator/Blocks/ProductsCarouselBlock.vue create mode 100644 frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue create mode 100644 frontend/admin/src/stores/autocomplete.js create mode 100644 frontend/spa/src/components/MainPage/Blocks/ProductsCarouselBlock.vue create mode 100644 module/oc_telegram_shop/upload/oc_telegram_shop/bastion/Handlers/DictionariesHandler.php diff --git a/frontend/admin/src/components/Form/CategoryLabel.vue b/frontend/admin/src/components/Form/CategoryLabel.vue new file mode 100644 index 0000000..6bd0641 --- /dev/null +++ b/frontend/admin/src/components/Form/CategoryLabel.vue @@ -0,0 +1,52 @@ + + + diff --git a/frontend/admin/src/components/Form/CategorySelect.vue b/frontend/admin/src/components/Form/CategorySelect.vue new file mode 100644 index 0000000..df3f022 --- /dev/null +++ b/frontend/admin/src/components/Form/CategorySelect.vue @@ -0,0 +1,50 @@ + + + diff --git a/frontend/admin/src/components/MainPageConfigurator/Blocks/ProductsCarouselBlock.vue b/frontend/admin/src/components/MainPageConfigurator/Blocks/ProductsCarouselBlock.vue new file mode 100644 index 0000000..41da49f --- /dev/null +++ b/frontend/admin/src/components/MainPageConfigurator/Blocks/ProductsCarouselBlock.vue @@ -0,0 +1,31 @@ + + + diff --git a/frontend/admin/src/components/MainPageConfigurator/Forms/BaseForm.vue b/frontend/admin/src/components/MainPageConfigurator/Forms/BaseForm.vue index dc5bd0b..6823434 100644 --- a/frontend/admin/src/components/MainPageConfigurator/Forms/BaseForm.vue +++ b/frontend/admin/src/components/MainPageConfigurator/Forms/BaseForm.vue @@ -3,6 +3,7 @@ Настройки блока Основные настройки + @@ -81,6 +82,7 @@ + diff --git a/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue b/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue new file mode 100644 index 0000000..b72b34d --- /dev/null +++ b/frontend/admin/src/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue @@ -0,0 +1,220 @@ + + + diff --git a/frontend/admin/src/components/MainPageConfigurator/availableBlocks.js b/frontend/admin/src/components/MainPageConfigurator/availableBlocks.js index 0aaa3e1..0adbd98 100644 --- a/frontend/admin/src/components/MainPageConfigurator/availableBlocks.js +++ b/frontend/admin/src/components/MainPageConfigurator/availableBlocks.js @@ -4,17 +4,22 @@ import SliderForm from "@/components/MainPageConfigurator/Forms/SliderForm.vue"; import CategoriesTopForm from "@/components/MainPageConfigurator/Forms/CategoriesTopForm.vue"; import ProductsFeedBlock from "@/components/MainPageConfigurator/Blocks/ProductsFeedBlock.vue"; import ProductsFeedForm from "@/components/MainPageConfigurator/Forms/ProductsFeedForm.vue"; +import ProductsCarouselBlock + from "@/components/MainPageConfigurator/Blocks/ProductsCarouselBlock.vue"; +import ProductsCarouselForm from "@/components/MainPageConfigurator/Forms/ProductsCarouselForm.vue"; export const blockToComponentMap = { slider: SliderBlock, categories_top: CategoriesTopBlock, products_feed: ProductsFeedBlock, + products_carousel: ProductsCarouselBlock, }; export const blockToFormMap = { slider: SliderForm, categories_top: CategoriesTopForm, products_feed: ProductsFeedForm, + products_carousel: ProductsCarouselForm, }; export const blocks = [ @@ -55,4 +60,20 @@ export const blocks = [ max_page_count: 10, }, }, + { + type: 'products_carousel', + title: 'Карусель товаров', + description: 'Отображает товары в одну строку в виде прокручиваемой карусели.', + is_enabled: true, + goal_name: '', + data: { + category_id: null, + all_text: null, + carousel: { + slides_per_view: null, + space_between: null, + autoplay: false, + }, + }, + }, ]; diff --git a/frontend/admin/src/stores/autocomplete.js b/frontend/admin/src/stores/autocomplete.js new file mode 100644 index 0000000..fb0b5f4 --- /dev/null +++ b/frontend/admin/src/stores/autocomplete.js @@ -0,0 +1,19 @@ +import {defineStore} from "pinia"; +import {apiGet} from "@/utils/http.js"; + +export const useAutocompleteStore = defineStore('autocomplete', { + + state: () => ({ + categories: null, + }), + + actions: { + async fetchCategories() { + if (this.categories !== null) return; + const response = await apiGet('getAutocompleteCategories'); + if (response.success) { + this.categories = response.data; + } + }, + } +}); diff --git a/frontend/spa/index.html b/frontend/spa/index.html index c9b2f2b..a4c70e3 100644 --- a/frontend/spa/index.html +++ b/frontend/spa/index.html @@ -3,8 +3,8 @@ - - OpenCart Telegram Mini App + + TeleCart
diff --git a/frontend/spa/src/components/Dock.vue b/frontend/spa/src/components/Dock.vue index c875533..73ac8fa 100644 --- a/frontend/spa/src/components/Dock.vue +++ b/frontend/spa/src/components/Dock.vue @@ -1,70 +1,65 @@ @@ -82,31 +77,3 @@ function onDockItemClick() { haptic.selectionChanged(); } - - \ No newline at end of file diff --git a/frontend/spa/src/components/MainPage/Blocks/CategoriesTopBlock.vue b/frontend/spa/src/components/MainPage/Blocks/CategoriesTopBlock.vue index 18f78ca..03a683a 100644 --- a/frontend/spa/src/components/MainPage/Blocks/CategoriesTopBlock.vue +++ b/frontend/spa/src/components/MainPage/Blocks/CategoriesTopBlock.vue @@ -1,5 +1,5 @@